emacs的体验优化涉及到方方面面 比如 调式 补全 frinage 快速切换buffer dired的文件夹着色 Windows上的输入法问题 经过我的折腾 体验优化非常好
1. mode-line的显示和缩放优化
emacs里面打开一些buffer窗口的时候 emacs 会自动添加 mode-line 比如打开magitmagit底部就会有 mode-line 还有会觉得 mode-line 太大了 要缩放 因为缩放以后能放的东西更多 我个人的配置是这样的
(setq eol-mnemonic-unix "LF"
eol-mnemonic-dos "CRLF"
eol-mnemonic-mac "CR"
eol-mnemonic-undecided "?"
mode-line-modes '())
(setq-default mode-line-format nil)
(dolist (hook '(prog-mode-hook text-mode-hook dired-mode-hook))
(add-hook hook (lambda ()
(setq nn-mode-line--vc-cache nil
nn-mode-line--eglot-cache nil
nn-mode-line--flymake-cache nil)
(setq-local mode-line-format nn-mode-line-format))))
(add-hook
'after-make-frame-functions
(lambda (_)
(set-face-attribute 'mode-line nil :height 130)
(set-face-attribute 'mode-line-active nil :height 130)
(set-face-attribute 'mode-line-inactive nil :height 130)))
最后这是我的mode-line
![]()
2. frinage 缩放优化
emacs里面的frinage通常都是8px 上限最大是16px 有三方包能解决 我也移植到了我的配置里 GitHub - blahgeek/emacs-fringe-scale · GitHub
3. emacs的ctrl + 方向键 删除键 精细度优化
emacs 默认的这些快捷键的精细程度是比较粗糙的 不会在一些字符上停下来 然后会有跳过头删过头的情况 这是我的配置
(defconst my-word-separators
'(?/ ?\\ ?\( ?\) ?\" ?\' ?- ?. ?, ?: ?\; ?< ?> ?~
?! ?@ ?# ?$ ?% ?^ ?& ?* ?_ ?| ?+ ?= ?\[ ?\] ?{ ?} ?│))
(defun my-char-type (char)
(cond
((null char) 'newline)
((= char ?\n) 'newline)
((memq char '(?\ ?\t)) 'space)
((memq char my-word-separators) 'sep)
((eq (char-syntax char) ?w) 'word)
(t 'sep)))
(defun my-forward-word ()
(interactive "^")
(let ((start (point))
(type (my-char-type (char-after))))
(while (and (not (eobp))
(eq (my-char-type (char-after)) type))
(forward-char))
(while (and (not (eobp))
(eq (my-char-type (char-after)) 'space))
(forward-char))
(when (= (point) start)
(forward-char))))
(defun my-backward-word ()
(interactive "^")
(let ((start (point)))
(while (and (not (bobp))
(eq (my-char-type (char-before)) 'space))
(backward-char))
(when (= (point) start)
(let ((type (my-char-type (char-before))))
(while (and (not (bobp))
(eq (my-char-type (char-before)) type))
(backward-char))))))
(defun my-delete-word-forward ()
(interactive)
(delete-region (point) (save-excursion (my-forward-word) (point))))
(defun my-delete-word-backward ()
(interactive)
(delete-region (point) (save-excursion (my-backward-word) (point))))
(keymap-global-set "M-f" #'my-forward-word)
(keymap-global-set "M-b" #'my-backward-word)
(keymap-global-set "C-<right>" #'my-forward-word)
(keymap-global-set "C-<left>" #'my-backward-word)
(keymap-global-set "C-<delete>" #'my-delete-word-forward)
(keymap-global-set "C-<backspace>" #'my-delete-word-backward)
4. buffer的快速跳转
emacs里面的 speedbar 不仅可以显示文件 还可以显示 buffer 打开speedbar以后 按快捷键b就能显示buffer名 我平时使用speedbar的程度和dired是一样的 加上我处理好了speedbar的细节 我觉得它完全有能力充当dired的补充
5. corfu给minbuffer的补全
把corfu的补全窗口移动到底部窗口 忘记copy的哪个配置了
(defun my-corfu-move-to-minibuffer ()
(pcase completion-in-region--data
(`(,beg ,end ,table ,pred ,extras)
(let ((completion-extra-properties extras)
completion-cycle-threshold completion-cycling)
(consult-completion-in-region beg end table pred)))))
(add-to-list 'corfu-continue-commands #'my-corfu-move-to-minibuffer)
效果如下
6. 保持overlay里面的空格 不会被 whitespace 给替换
具体效果如下 这是优化之前
这是优化之后 仓库地址7. emacs 编写 c++20 模块的补全 支持import std
具体看我的配置文件 直接抄 不过需要先编译好编译器的compile_commands.json文件
8. dape的可拖拽悬浮窗支持
效果如下 添加了一个可拖拽的悬浮窗窗口 可以更轻松的使用
仓库地址9.Windows 中文输入法 拼音候选框缩放优化
这个在elisp层面是无解的 elisp拿不到系统输入法的数据 通过动态模块是可以的 具体看我这篇帖子 我通过拦截Windows窗口消息拿到输入法的数据以后 通过命名管道发给emacs 然后emacs用overlay渲染 我感觉这是最佳方案了
就先到这里吧 其它的dired根据git着色 代码折叠什么的可以看我之前发的帖子 后面有空更新




