Emacs 完美体验优化 解决各种问题

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 image

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着色 代码折叠什么的可以看我之前发的帖子 后面有空更新

10 个赞

挺不错,尤其是那个debug工具条,效果不错

那肯定的

学到了 eol-mnemonic-* 的设置,感谢 OP。