Skip to content

Instantly share code, notes, and snippets.

@DogLooksGood
Last active October 17, 2019 22:17
Show Gist options
  • Save DogLooksGood/743deb6dee24015ad16dd232091e7ada to your computer and use it in GitHub Desktop.
Save DogLooksGood/743deb6dee24015ad16dd232091e7ada to your computer and use it in GitHub Desktop.
A Modal Edit Design

模式编辑设计

最初的想法

  1. 减少RSI!避免control,也避免metashift.
  2. 尽量接近原始Emacs的按键绑定,减少学习的成本。
  3. 使用和位置无关的按键,这样在所有的键盘布局下都可以使用。
  4. 可以不需要hack就能方便的使用各个package。
  5. 可以高效的编辑文字。
  6. 指令序列尽量保持简短。
  7. Terminal中可用。

进一步的想法

按键优先级

a > a b > M-aA > a b c >> 其它

只使用两个模式

NormalInsert,并且只在与编辑相关的模式中使用模式编辑。非编辑相关的模式中一般都自有完整的快捷键方案,不需要改变。

解决类似evil中使用j/k而magic中使用n/p,部分的package例如neotree可以适配j/k,但并非所有的package都可以。

大部分Emacs的快捷键映射到指令

比如C-f/b/n/pf/b/n/p,有部分在Normal下没有意义的按键留出来做特殊的功能。 例如C-i没有意义,所以i可以被用来做切换到Insert。 这部分的按键包括:

  • o, 对应C-oopen-line
  • i, 对应C-i在Terminal中不可用
  • m, 对应C-m在terminal和GUI中均为RET
  • ,,.等符号, 对应control快捷键在terminal中不可用
  • C-q使用率相对低,可以考虑
  • C-h可以考虑帮助放在其它的位置, 几乎所有键盘布局中h都有相当不错的位置
  • ESC
  • RET

根据规则整合不同package的不同按键风格

大多数package的快捷键自身有一定的规律,例如:

  • 使用C-c开头
  • 使用两个control之后用单键
  • 使用control+meta

但是不同的package之间风格不一致,考虑使用不同的 映射的函数 完成不同风格快捷键的映射(需要使用者自行指定)。

找到合适的快捷键完成buffer和window切换等功能

有一些操作是多个模式下都需要的功能,例如切换window,切换buffer,找合适的单键或组合完成这些功能。 比如使用ESC来切换文件,是个不错的选择。 这些功能包括:

  1. Universal Argument
  2. 切换到其它的buffer,或切换到上一个。
  3. window水平分割,或垂直分割。
  4. 切换window,或交换,或关闭。
  5. 打开project或workspace?

总而言之,这些功能需要全局的快捷键,而不是只出现在Normal中。

应该始终绑定与模式编辑的快捷键

比如要使用a b c,应设置类似C-a C-b cC-a b cC-a M-b c等快捷键,再映射到模式编辑下。 这样可以让整体保持整齐和一致。

SPC做Leader

使用SPC做Leader Key但是序列不应该过长。

假想的使用方式

(use-package paredit
  :init
  (xxx-define-key
   paredit-mode-map
    (("C-M-" "o "))))

(use-package cider
  :init
  (xxx-define-key
   cider-mode-map
   (("C-c C-" . "c ")
    ("C-c M-" . "m "))))
  • o fC-M-f
  • o bC-M-b
  • c cC-c C-c
  • c eC-c C-e
  • c t tC-c C-t t
  • m n nC-c M-n n
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment