首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  Apple

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

  •  
  •   yangg · 69 天前 · 1101 次点击
    这是一个创建于 69 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    Customize the behavior of Cocoa ’ s text system

    苹果关于 Cocoa 的文档

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

    • 更多 emacs 里移动和删除单词的
    • 选中单词的
    • Vscode 里很喜欢的上下移动行及往上下复制行的快捷键(使用了 vim 里的上下 j, k )
    // 在 ~/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/

    5 回复  |  直到 2019-08-07 09:05:24 +08:00
        2
    tsohgdivil   69 天前
    我一直都是用 Karabiner-Elements 的,没想到还能这样,谢谢分享
        3
    lululau   69 天前 via iPhone
    这个文件用 JSON 格式,你试试点击任意应用程序的 Help 菜单,程序会不会崩溃,之前遇到过这个问题,改回 binary 格式就好了
        4
    lululau   69 天前
    JSON 格式 => 文本格式
        5
    yangg   69 天前
    @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 编辑的
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   4289 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 23ms · UTC 06:00 · PVG 14:00 · LAX 23:00 · JFK 02:00
    ♥ Do have faith in what you're doing.