macOS 默认在文本编辑中使用 pnbf 来进行上下左右,还有一些其他键位,但我习惯使用 Vim 的 hjkl 来移动。
我已经在 Vim 中设置好了,但希望这个键位应用到全局。
通过修改 DefaultKeyBinding.dict
来完成。
但只能适配一般输入框的快捷键,很多编辑器都还是老样子,无法覆盖。
比如 Firefox 的输入框、Alfred 的输入框是可以的,但是很多网页编辑框、终端、代码编辑器、Typora 等等还是老键位。
因为这个方法的不一致性,我已经改用 Karabiner 了。
通过 Karabiner 修改,则会真·强制·全局。
不过还是记录一下这种方法。
下一篇博文:macOS 利用 Karabiner 修改 Emacs 键位为 Vim 键位。
macOS 默认的 Emacs-like 键位
官方支持文档:Mac 键盘快捷键
Control-A:移至行或段落的开头。
Control-E:移至行或段落的末尾。
Control-F:向前移动一个字符。
Control-B:向后移动一个字符。
Control-L:将光标或所选内容置于可见区域中央。
Control-P:上移一行。
Control-N:下移一行。
Control-O:在插入点后新插入一行。
Control-T:将插入点后面的字符与插入点前面的字符交换。
Control-H:删除插入点左边的字符。也可以使用 Delete 键。
Control-D:删除插入点右边的字符。也可以使用 Fn-Delete。
Control-K:删除插入点与行或段落末尾处之间的文本。
键位映射文件
默认的键位设置在:
/System/Library/Frameworks/AppKit.framework/Resources/StandardKeyBinding.dict
可以自己增加一个来覆盖默认的:(默认没有 KeyBindings
目录,可以自己创建)
~/Library/KeyBindings/DefaultKeyBinding.dict
查看 StandardKeyBinding.dict
的方法:
可以用 Xcode 打开,选择文件类型为 Property List Binary。
或者可以用 plutil
转换为 XML:
plutil -convert xml1 -o StandardKeyBinding.xml /System/Library/Frameworks/AppKit.framework/Resources/StandardKeyBinding.dict
转换完成后,可以得到类似下面这样的代码:
<key>^a</key>
<string>moveToBeginningOfParagraph:</string>
<key>^b</key>
<string>moveBackward:</string>
<key>^d</key>
<string>deleteForward:</string>
<key>^e</key>
<string>moveToEndOfParagraph:</string>
<key>^f</key>
<string>moveForward:</string>
<key>^h</key>
<string>deleteBackward:</string>
<key>^k</key>
<string>deleteToEndOfParagraph:</string>
<key>^l</key>
<string>centerSelectionInVisibleArea:</string>
<key>^n</key>
<string>moveDown:</string>
字符 | 按键 |
---|---|
"@" |
Command |
"^" |
Control |
"~" |
Option |
^A
这样的代表 Control + Shift + a。
修改示例
我自己的习惯,除了 hjkl 移动还改了一点别的。
创建并编辑 ~/Library/KeyBindings/DefaultKeyBinding.dict
:
{
"^a" = "moveToBeginningOfParagraph:"; // 移动到行首
"^e" = "moveToEndOfParagraph:"; // 移动到行尾
"^h" = "moveBackward:"; // 左
"^l" = "moveForward:"; // 右
"^k" = "moveUp:"; // 上
"^j" = "moveDown:"; // 下
"^o" = "insertNewline:"; // 插入一行
"^s" = "deleteBackward:"; // 往左删除一个
"^d" = "deleteForward:"; // 往右删除一个
"^w" = "deleteWordBackward:"; // 往左删除单词
"^u" = "deleteToBeginningOfLine:"; // 往左删除到行首
"^i" = "deleteToEndOfParagraph:"; // 往右删除到行尾
// 有 Shift 的(产生选区)
"^A" = "moveToBeginningOfParagraphAndModifySelection:";
"^E" = "moveToEndOfParagraphAndModifySelection:";
"^H" = "moveBackwardAndModifySelection:";
"^L" = "moveForwardAndModifySelection:";
"^K" = "moveUpAndModifySelection:";
"^J" = "moveDownAndModifySelection:";
}
保存后需要重启 App 来查看效果。
参考:
NSStandardKeyBindingResponding
Customizing the Cocoa Text System
What are the control keys available when working in a text field?