技巧
近期我尝试在终端下使用 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 个赞
wsug
2
(我终端用少了) 一直有个疑惑,vim,neovim这些编辑器是内置一个终端(完整功能?),启动时就是终端界面,这种内置终端和编辑器本身能结合的更好,是不是就不需要在找其它各种终端来用了,只有emacs用户才需要
并不是。
neovim 虽然内置终端,但是这个内置的终端其实是和 emacs 里的终端插件如 vterm/eat/term.el 之类的是一样的东西。想要体验到 neovim 的最新的功能,依然推荐使用较为“先进”的终端。
比如如果你使用 kitty 终端来使用 neovim,你能够获得的 features 有:
- kitty image protocol,可以在 neovim 里面显示图片,从而可以做到实时渲染 latex 公式等功能。
- 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 个赞
试试 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))