emacs, 在终端下使用的技巧和问题

技巧

近期我尝试在终端下使用 emacs (及其 daemon),这是我学到的:

  • 使用合适的终端,最好支持 kkp, 例如 kitty。配合 emacs 插件 kkp.el, 可以识别大多数在图形界面下才能工作的组合键
  • 终端字体,我自己使用 sarasa term sc, 无补丁原版,因为 kitty 自带 nerd 字体,所以 nerd-icon-* 包可以正常工作
  • 其他的就是微调下各种 mode,见下:
(defun fun-my--enable-terminal-support ()
  (diff-hl-margin-mode 1)
  (xclip-mode 1)
  (global-kkp-mode 1)
  (corfu-terminal-mode 1)
  (nyan-mode -1)
  (fun-my--indent-bars-style-in-terminal)
  (remove-hook 'eglot-managed-mode-hook #'eldoc-box-hover-mode nil)
  (setq var-my-terminal-support t)
  (fun-my--set-keybinding-in-terminal-or-graphic)
  )
(defun fun-my--disable-terminal-support ()
  (diff-hl-margin-mode -1)
  (xclip-mode -1)
  (global-kkp-mode -1)
  (corfu-terminal-mode -1)
  (nyan-mode 1)
  (fun-my--indent-bars-style-in-graphic)
  (add-hook 'eglot-managed-mode-hook #'eldoc-box-hover-mode t)
  (setq var-my-terminal-support nil)
  (fun-my--set-keybinding-in-terminal-or-graphic)
  )

问题

  • 启用 kkp.el 后, 破坏 vterm 的 C-c C- 组合键。解决:改用 eat
  • 少数按键仍旧不能工作,例如:
    • dired-mode 中的 TAB 按键
    • rime 中的 C-g 按键
  • kitty 下如果一行有很多个 emoji 字符(我有 20 个左右),可能导致显示有点异常,行错位,未知原因
1 个赞

(我终端用少了) 一直有个疑惑,vim,neovim这些编辑器是内置一个终端(完整功能?),启动时就是终端界面,这种内置终端和编辑器本身能结合的更好,是不是就不需要在找其它各种终端来用了,只有emacs用户才需要

并不是。

neovim 虽然内置终端,但是这个内置的终端其实是和 emacs 里的终端插件如 vterm/eat/term.el 之类的是一样的东西。想要体验到 neovim 的最新的功能,依然推荐使用较为“先进”的终端。

比如如果你使用 kitty 终端来使用 neovim,你能够获得的 features 有:

  1. kitty image protocol,可以在 neovim 里面显示图片,从而可以做到实时渲染 latex 公式等功能。
  2. kitty keyboard protocol,从而可以绑定一些常规终端无法绑定的键位,比如 Control + Shift + xxx 之类的键位。
2 个赞
(setq xterm-extra-capabilities '(setSelection))

可以启用 OSC 52 支持,不需要 xclip 了。

(add-hook 'tty-setup-hook #'xterm-mouse-mode)

可以启用启用鼠标支持。

(use-package posframe)

Emacs 31 支持 tty-child-frames 功能,不需要 corfu-terminal-mode 了。

5 个赞

试了下,似乎加了也不能复制

vim 似乎不是内置终端

试试 clipetty 这个包

;; 远程ssh中emacs copy的内容放到系统剪切板
;; mac下不需要tmux配合其他配置
;; https://github.com/spudlyo/clipetty
(use-package clipetty
  :ensure
  :hook (after-init . global-clipetty-mode)
  )

;; 解决问题:macos在本地tmux中的emacs,copy的内容无法放到系统剪切板
;; 需要支持: brew install reattach-to-user-namespace
(when (eq system-type 'darwin) 
  (defun copy-from-osx ()
    "Use OSX clipboard to paste."
    (shell-command-to-string "reattach-to-user-namespace pbpaste"))

  (defun paste-to-osx (text &optional push)
    "Add kill ring entries (TEXT) to OSX clipboard.  PUSH."
    (let ((process-connection-type nil))
      (let ((proc (start-process "pbcopy" "*Messages*" "reattach-to-user-namespace" "pbcopy")))
	(process-send-string proc text)
	(process-send-eof proc))))

  (setq interprogram-cut-function 'paste-to-osx)
  (setq interprogram-paste-function 'copy-from-osx))