Emacs builtin mode 功能介绍

感觉还是projectile用的更加顺手,比如切换项目的时候自动列出所有打开的项目,输入关键词就可以可以配合ivy进行快速选择。不知道project是否也可以结合ivy 达到这样的效果。

project用的是completing-read,所以支持所有补全框架,我等下补个图好了.

可以试试flyspell-correct-ivy.

多谢指点,之前就是用的这个包中的flyspell-correct-wrapper,方便是方便,就是有点影响Emacs启动时间。所以现在想尽量少装一些包。目前用ispell-word + i 刚好够用了

参考下我的配置,并没有影响启动时间。

(use-package flyspell-correct-ivy
    :after ivy
    :bind (:map flyspell-mode-map
           ([remap flyspell-correct-word-before-point] . flyspell-correct-wrapper))
    :init (setq flyspell-correct-interface #'flyspell-correct-ivy))

C-c . 是类似与终端里M-.的命令

C-c . runs the command comint-insert-previous-argument (found in
shell-mode-map), which is an interactive native compiled Lisp function
in ‘comint.el’.

It is bound to C-c ..

(comint-insert-previous-argument INDEX)

  Probably introduced at or before Emacs version 22.1.

Insert the INDEXth argument from the previous Comint command-line at point.
Spaces are added at beginning and/or end of the inserted string if
necessary to ensure that it’s separated from adjacent arguments.
Interactively, if no prefix argument is given, the last argument is inserted.

尝试了 flyspell-correct-ivy, 但这个功能没有像flyspell-correct-ido 那样的需要加入个人词库的时候直接输入save 就保存。不知道 flyspell-correct-ivy 是怎么保存生词到个人词库的?

试试 M-o

1 个赞

请问阁下是如何做到让 abbrev 支持字母数字之外的字符的。

abbrev-expand是以 WORD 为展开,如果在emacs-lisp-mode下使用;license则会不生 效,因为;license不是 1 个单词。需要间接通过指定 abbrev-table 来完成。define-abbrev-table可以使用:regexp来指 定所提取的内容。于是可以使用;\w来匹配单词前有 ; 的情况,因此可以这样写:

(defun foo ()
  (message "foo"))

;; From https://lists.gnu.org/archive/html/emacs-devel/2021-01/msg00553.html
(define-abbrev-table 'fundamental-mode-abbrev-table
 '(
   (";license" t foo :count 0))
 :regexp "\\(;\\w+\\)")

可以切换到fundamental-mode体验一下。

因为 :regexp 已经在当前 table 里使用了,所以也要求其他的展开项也是要满足这个正则。想要扩展当前的 abbrev-table 可能需要通过 define-abbrev-table:parent 属性来继承其他 table.

1 个赞

Changelog

  • 2021-03-07 新增 repeat-mode 介绍

repeat-mode

如果有订阅 emacs-devel 邮件列表的话会发现曾经有一个投票令 C-x o 调用的是一个 transient-map,后续再切换窗口可以直接用 o 来切换。POLL: make C-x o transient

这样的一个好处是可以减少 Ctrl 按键的使用,降低 RSI 的风险;此外, transient-map 下还有一个 keymap 可以自定义,扩展性就更强了(例如可以在这个 keymap 上再定义 Obackward-other-window 函数)。

在最终的实现里则是新增了一个 repeat-mode, 这个 minor-modepost-command-hook 新增了一个 repeat-post-hook 钩子。这个钩子函数检测如果最后调用的函数有 repeat-map 属性,接下来会对这个 keymap 使用 set-transient-map

Emacs 内部已经提供了一些常用的函数 repeat-map:

  • 切换窗口 other-window, 可以使用 C-x o o o 来切换窗口了
  • 缩小/增大窗口 enlarge-window 系列,可以使用 C-x { { { 来缩小窗口,其他命令类似
  • undoC-x u u u 来进行 3 次 undo
  • next-error, M-g n n n 调用 3 次 next-error

做一个对比,如果没有启用 repeat-map, 那么调用 3 次 next-error 需要 M-g n M-g n M-g n,操作极其不连贯。而在 repeat-map 加持下的 M-g n n n 就显得非常自然。

而它的开启方式也非常简单,打开 repeat-mode 这个 minor-mode 即可。

(use-package repeat
  :ensure nil
  :hook (after-init . repeat-mode)
  :custom
  (repeat-exit-key (kbd "RET")))

注意,因为它是在 post-command-hook 里增加了一个钩子,所以会拖慢一个按键的总体运行时间,当然这点差异非常不明显。

注: repeat-mode Emacs 28 上可用

9 个赞

有点模式编辑器的味道!

感谢楼主,终于学到term/shell的正确姿势了

能否贴上spacemacs的配置文件?

1 个赞

spacemacs 的你要是刚开始用就把上面 :config 后的内容放到 dotspacemacs/user-config 中应该就可以了。

Emacs 里面有个命令叫 repeat 可以用来重复上一个命令。如果用模式编辑的话,这个命令可以给一个单键,这样就可以直接重复上一个按键较长的命令了。

这个配置repeat-mode会让daemon启动卡在最后一步,好奇怪。没空折腾了,有空再试

对于eshell,要启用ctrl-d退出或删除字符的话,还可通过修改eshell-module-list,加入eshell-rebind模块。

当然这会在eshell模式下也rebind其他健,如ctrl-w等和普通shell环境一样的快捷键。

repeat-mode

repeat-mode 新增了一个命令支持查看都有哪些 repeat-map, M-x describe-repeat-maps 即可。

关于 repeat-mode 的完整介绍可以往上翻翻。

dired

RET 后仅保留一个 dired buffer

之前要完成这个功能,需要将 dired-mode 中 RET 绑定的 dired-find-file remap 至 dired-find-alternate-file。但是 Emacs 28 现在直接提供了一个用户选项来开启这个功能。

;; For Emacs 28
(use-package dired
  :ensure nil
  :custom
  (dired-kill-when-opening-new-dired-buffer t))

即可。

;; For Emacs 27
(use-package dired
  :ensure nil
  :bind (:map dired-mode-map
         ([remap dired-find-file] . dired-find-alternate-file))
  :config
  ;; Enable the disabled dired commands
  (put 'dired-find-alternate-file 'disabled nil))

默认 dired-find-alternate-file 是被禁用的,需要将其解禁。

注意: dired-up-directory 还是会创建新的 buffer.

7 个赞

这个变量是什么时候加入的?我4月27日编译的 28.0.50 还没有这个变量。