Mac 里我最喜欢的功能 - Emacs 快捷键

2019-08-06 22:02:14 +08:00
 yangg

刚接触 Mac 时,最喜欢的就是 Mac 所有输入框都有类似 Emacs 的快捷键(因为有过 vim 和 Emacs 经验),日常也经常使用这些快捷键。 一直不知道原来这些快捷键还可以自定义,今天因为 iTerm2 里无法使用 Option + . 快捷键的问题,搜索到一个回答提到了怎么自定义这些快捷键。

Customize the behavior of Cocoa ’ s text system

苹果关于 Cocoa 的文档

下面是我的配置(在 MWeb 和 TextMate 里测试通过):

// 在 ~/Library/KeyBindings/ 目录下添加 DefaultKeyBinding.dict 文件,这个目录默认不存在,先创建
// targetDir=~/Library/KeyBindings; [ -d $targetDir ] || mkdir $targetDir; ln -sf ~/Dropbox/conf/DefaultKeyBinding.dict $targetDir
// 此文件更改后,完全退出某个 app,重新打开即可使用
{
    /* Additional Emacs bindings */
    "~f" = "moveWordForward:";
    "~b" = "moveWordBackward:";
    "~d" = "deleteWordForward:";
    "~h" = "deleteWordBackward:";
    "~<" = "moveToBeginningOfDocument:";
    "~>" = "moveToEndOfDocument:";
    "~v" = "pageUp:"; /* ^v pageDown */
    // selections
    "~F" = "moveWordForwardAndModifySelection:";
    "~B" = "moveWordBackwardAndModifySelection:";
    "^," = "moveToBeginningOfDocumentAndModifySelection:"; /* select to beginning */
    "^." = "moveToEndOfDocumentAndModifySelection:"; /* select to ending */
    "~l" = "selectLine:";
    // compounds
    // "~t" = "moveToBeginningOfLine:"; // this two line is for debugging
    // "~y" = "deleteToEndOfLine:";
    "^K" = ("moveToBeginningOfLine:", "deleteToEndOfLine:", "deleteForward:");
    "~j" = ("moveToBeginningOfLine:", "deleteToEndOfLine:", "deleteForward:", "moveDown:", "yank:", "insertNewlineIgnoringFieldEditor:", "moveBackward:");
    "~k" = ("moveToBeginningOfLine:", "deleteToEndOfLine:", "deleteBackward:", "moveUp:", "moveToEndOfLine:", "insertNewlineIgnoringFieldEditor:", "yank:");
    "~J" = ("moveToBeginningOfLine:", "deleteToEndOfLine:", "yank:", "insertNewlineIgnoringFieldEditor:", "yank:");
    "~K" = ("moveToBeginningOfLine:", "deleteToEndOfLine:", "yank:", "insertNewlineIgnoringFieldEditor:", "yank:", "moveUp:");
    // "~K" = ("moveToBeginningOfLine:", "deleteToEndOfLine:", "yank:", "moveToBeginningOfLine:", "yank:", "insertNewlineIgnoringFieldEditor:", "moveBackward:");
}

Cocoa 默认快捷键定义在(可以看看哪些不知道的): /System/Library/Frameworks/AppKit.framework/Resources/StandardKeyBinding.dict

iTerm2 里无法使用 Option + . 问题

Preferences - Profiles - Keys 将下面的 Left ⌥ Key 改为 Esc+ 就可以了

参考

Cocoa 常用命令

原文地址: https://uedsky.com/2019-08/mac-custom-cocoa-text-system/

2607 次点击
所在节点    Apple
5 条回复
yangg
2019-08-06 22:04:16 +08:00
tsohgdivil
2019-08-06 22:31:13 +08:00
我一直都是用 Karabiner-Elements 的,没想到还能这样,谢谢分享
lululau
2019-08-06 22:52:27 +08:00
这个文件用 JSON 格式,你试试点击任意应用程序的 Help 菜单,程序会不会崩溃,之前遇到过这个问题,改回 binary 格式就好了
lululau
2019-08-06 22:55:52 +08:00
JSON 格式 => 文本格式
yangg
2019-08-07 09:05:24 +08:00
@lululau 文本没问题哦,
原文说
Specified in an dictionary file that must have an extension of .dict; the format of this file should be an XML property list, but the text system can also understand old-style (NeXT era) property lists.

To customize bindings, you create a file named DefaultKeyBinding.dict in ~/Library/KeyBindings/ and specify bindings to augment or replace the standard bindings. You may use the standard bindings file as a template. It is recommended that you use the Property List Editor application to edit a bindings dictionary. You may use another application such as TextEdit or Xcode, but if you do you must ensure the encoding of the saved file is UTF8.

就是一个字典文件,用 utf8 就行了,我直接用 textmate 编辑的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/589639

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX