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 来查看效果。

参考:

Cocoa Event Handling Guide

NSStandardKeyBindingResponding

Customizing the Cocoa Text System

What are the control keys available when working in a text field?