将“首页”和“结束”重新映射到行的开头和结尾


326

我的大部分计算时间都花在Linux上(偶尔花在Windows上)。在这些平台上,HomeEnd键通常跳到当前行的开头或结尾。

我逐渐习惯了使用一台Apple计算机,但仍感到沮丧,因为这些键似乎已绑定到文档的开头和结尾,并且似乎该行根本没有任何键基于动作。

我的问题:

  1. 在行首和行尾是否缺少我现有的键绑定?(我主要使用终端机,Chrome和LibreOffice)
  2. 有没有办法将这些键的功能重新绑定到我熟悉的功能?我愿意放弃对我来说似乎用处不大的基于文档的版本。

还有两个警告:

  1. 我不是系统上的唯一用户。如果我的用户设置没有破坏其他用户的体验,那就太好了。如果这不可能,我想我可能最喜欢!
  2. 我确实使用多种语言并在键盘布局之间进行切换,因此即使在多个键盘布局之间切换时,也可以使用任何解决方案。

请注意,尽管我最终找到了一个解决方案并回答了自己的问题,但我对更简单或更通用的解决方案持开放态度。同样,发现这一点的过程还不清楚。例如,如果我想重新映射更多键,在哪里可以找到键代码和动作名称?如果您有相关知识,请随时添加答案!
Caleb

Answers:


304

移至(包装的)行的开头或结尾的默认快捷方式是AE移动到展开的行(或段落)的开头或结尾。通过单词向后/向前移动,所有这些都与Shift在相应的移动过程中按住选择兼容。

您可以通过以下方式创建~/Library/KeyBindings/并保存属性列表来重新映射首页并结束DefaultKeyBinding.dict

{
    "\UF729"  = moveToBeginningOfLine:; // home
    "\UF72B"  = moveToEndOfLine:; // end
    "$\UF729" = moveToBeginningOfLineAndModifySelection:; // shift-home
    "$\UF72B" = moveToEndOfLineAndModifySelection:; // shift-end
}

在OS X中用于编辑文本的大多数快捷键都在中定义/System/Library/Frameworks/AppKit.framework/Resources/StandardKeyBinding.dict

应用更改需要重新打开应用程序。一些旧版本的Xcode(适用于最新版本6.3.1),终端和许多跨平台应用程序将忽略DefaultKeyBinding.dict。

有关自定义按键绑定的更多信息,请参见Cocoa Text System我的网站

可以在“首选项”>“设置”>“键盘”中自定义终端的键盘绑定。\033OH移至行首和\033OF行尾。

在Eclipse中,应在“首选项”>“常规”>“键”中修改键绑定。您需要修改命令行开始行结束的默认绑定(用↖替换⌘←,用place替换⌘→)。为了使选择生效,还要修改Select Line StartSelect Line End

PS:您可能需要注销并重新登录才能使~/Library/KeyBindings/DefaultKeyBinding.dict更改生效。


1
有关键映射的有用信息-我已经将它们与(商业)BetterTouchTool一起使用,请参见此答案
RichVel

3
以我的经验,这不适用于大多数应用程序。最好使用Karabina元素。
Timmmm

3
这很棒,因为它可以在Terminal,iTerm2,Chrome,Sublime和Outlook中运行。替代方案(Karabina)不太好,因为它将“ Home”映射到Command + LeftArrow,后者实际上在Terminal中切换窗口。您必须记住在保存.dict文件后重新启动所有应用程序。
谢泼德

1
不适

2
在连接了外部键盘的Mac OS Mojave上,此设置对我有效。
jdhao

106

我目前使用的是Lion 10.7.4,出于某些奇怪的原因,编辑该功能~/Library/KeyBindings/DefaultKeyBinding.dict对我不起作用。

我发现KeyRemap4MacBook System Preferences插件(现在称为Karabiner)工作得很好,您还可以使用它重新映射各种键,而无需编辑任何文本文件。例如,更改上一页/下一页键,使光标也跟随上一页/下一页。

只需下载插件,然后在“系统偏好设置”面板中浏览到该For PC Users部分,然后选中Use PC Style Home /End

请注意,我选择了(Change Home to Command+Left)而不是(Change Home to Control+A),就像我选择了第一个一样,并且如果该行被换行,home会将我带到该换行的开头(上方几行),而不是将我带到当前行的开头。

KeyRemap4MacBook


9
Karabiner很棒而且也是开源的
Jedidja

2
在10.10.5中,其他建议似乎不起作用,但是Karabiner(KeyRemap4MacBook的新名称-适用于所有Mac产品)可以很好地工作,并且不需要重新启动即可使更改生效。对这款Mac新手很有帮助;希望其他人也能受益。
拉尔夫·J

1
到目前为止,“ Karabiner目前无法在macOS Sierra上运行。”
james.garriss

2
@ james.garriss给铁锁,元素一展身手-同一作者虽然从地上爬起来,以支持塞拉利昂重写(它仍然在发展,他们相当多的粗糙边缘) - github.com/tekezo/Karabiner-Elements
jklp

5
@jklp不幸的是,在Karabiner Elements中尚未提供重新映射Apple扩展键盘上的Home和End键所需的功能。我个人似乎在控制台中有Ctrl-a和Ctrl-e的肌肉记忆,但是在Sublime这样的GUI应用程序中工作时,很难记住。对于Sublime(具体而言),有一个解决方案:coderwall.com/p/upolqw/…–
Ville

43

多亏了本文,我终于弄清楚了如何在每个用户的基础上将Homeand和Endkey 重新绑定到基于行的操作,该操作适用于各种键盘布局。

您需要使用要映射的键码和新命令创建一个词典文件,但是首先要打开终端并运行以下命令,以确保将其放置在该文件夹中:

$ mkdir -p ~/Library/KeyBindings

然后在创建或编辑文件~/Library/KeyBindings/DefaultKeyBinding.dict。如果以前不存在,请在下面添加整个部分。如果确实存在,则只需在块内添加四个新行。

{
    "\UF729"  = "moveToBeginningOfLine:";
    "\UF72B"  = "moveToEndOfLine:";
    "$\UF729" = "moveToBeginningOfLineAndModifySelection:";
    "$\UF72B" = "moveToEndOfLineAndModifySelection:";
}

为了激活设置,您将需要注销用户并再次登录。

请注意,这既涵盖了移动光标的常规操作,又涵盖了在光标移动期间选择光标的Shift+ Home/ End组合。


12

我使用的是OS X Sierra,~/Library/KeyBindings/DefaultKeyBinding.dict其他用户建议的解决方案部分起作用:像TextEdit这样的某些应用现在具有所需的行为,而其他应用则没有。Google Chrome和Slack是似乎不尊重该DefaultKeyBinding.dict文件的两个。

为了修复其余的应用程序,我使用BetterTouchTool创建了特定于应用程序的键盘快捷键,Home并将End其绑定到OS X的本机快捷键Ctrl+ACtrl+E。BetterTouchTool不是免费的,但是有45天的试用期。

去做这个:

  1. 安装并启动BetterTouchTool
  2. 转到“手势”>“键盘”标签
  3. 在“选择应用程序”下,单击+并选择要修复的应用程序。
  4. 单击“添加新快捷方式”,Home在“记录快捷方式”字段中分配键,并将“触发其他键盘快捷方式”设置为Ctrl + A。重复End并按Ctrl + E。
  5. 完成后,面板应如下所示:BetterTouchTool面板
  6. 在BetterTouchTool的“高级设置”下,允许其在启动时运行。

注意:请勿退出BetterTouchTool应用程序,否则它将停止拦截按键。只需关闭其窗口,它就可以在后台继续工作。


谢谢-刚刚在El Capitan上使用了它,因为我已经为BetterTouchTool支付了费用,它可以与Chrome,Slack和其他应用正常使用。
RichVel

9

我正在使用具有以下自定义设置的超棒KeyRemap4MacBook

它可以在大多数应用程序中修复Home / End,并且不会破坏iTerm2。

https://gist.github.com/lhotari/6134223181439b9ed0a1

<?xml version="1.0"?>
<!-- ~/Library/Application Support/KeyRemap4MacBook/private.xml -->
<!-- Custom keyboard mappings for MBP using https://pqrs.org/macosx/keyremap4macbook/ -->
<root>
    <item>
        <name>Lari's PC Style Home/End</name>
        <appendix>(Change Home to Command+Left)</appendix>
        <appendix>(Change End to Command+Right)</appendix>
        <appendix></appendix>
        <appendix>{{ PC_STYLE_BINDINGS_IGNORE_APPS_DESCRIPTION }}</appendix>
        <identifier>lari.remap.pclikehomeend</identifier>
        <block>
            <only>DREAMWEAVER</only>
            <autogen>__KeyToKey__ FROMKEYCODE_HOME, KeyCode::HOME, ModifierFlag::SHIFT_L</autogen>
            <autogen>__KeyToKey__ FROMKEYCODE_END,  KeyCode::END,  ModifierFlag::SHIFT_L</autogen>
        </block>
        <block>
            <only>BLUEFISH,WORD,EXCEL,POWERPOINT</only>
            <autogen>__KeyToKey__ FROMKEYCODE_HOME, KeyCode::HOME</autogen>
            <autogen>__KeyToKey__ FROMKEYCODE_END,  KeyCode::END</autogen>
        </block>
        <!--
        <block>
            <only>EMACS, TERMINAL, X11, ECLIPSE</only>
            <autogen>__KeyToKey__ FROMKEYCODE_HOME, KeyCode::A, ModifierFlag::CONTROL_L</autogen>
            <autogen>__KeyToKey__ FROMKEYCODE_END,  KeyCode::E, ModifierFlag::CONTROL_L</autogen>
        </block>
         -->
        <block>
            <not>{{ PC_STYLE_BINDINGS_IGNORE_APPS }}</not>
            <autogen>__KeyToKey__ FROMKEYCODE_HOME, MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_COMMAND, KeyCode::CURSOR_UP,    ModifierFlag::COMMAND_L</autogen>
            <autogen>__KeyToKey__ FROMKEYCODE_HOME, MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_CONTROL, KeyCode::CURSOR_UP,    ModifierFlag::COMMAND_L</autogen>
            <autogen>__KeyToKey__ FROMKEYCODE_END,  MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_COMMAND, KeyCode::CURSOR_DOWN,  ModifierFlag::COMMAND_L</autogen>
            <autogen>__KeyToKey__ FROMKEYCODE_END,  MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_CONTROL, KeyCode::CURSOR_DOWN,  ModifierFlag::COMMAND_L</autogen>
            <autogen>__KeyToKey__ FROMKEYCODE_HOME,             KeyCode::CURSOR_LEFT,  ModifierFlag::COMMAND_L</autogen>
            <autogen>__KeyToKey__ FROMKEYCODE_END,              KeyCode::CURSOR_RIGHT, ModifierFlag::COMMAND_L</autogen>
        </block>
    </item>
</root>

根据上面的链接,尚未更新为可与Sierra一起使用。
james.garriss

该工具已重命名为Karabiner,并且显然可以与OS X El Capitan 10.11,Sierra 10.12和High Sierra 10.13一起使用。
RichVel

7

我发现以下内容对此处有用,iterm2zsh带有引号:

打开iTerm > Preference。转到profiles tab > Keys。然后单击+键列表底部的 按钮,在(选择)下按Home(或Fn+left arrow在苹果无线键盘上),然后键入ActionSend Escape Sequence[1~

重复此End键,以[~4获取转义键序列。

如果您使用的是zsh,请执行以下操作:

1)将以下内容放入您的~/.zshrc文件中

bindkey "^[[1~" beginning-of-line
bindkey "^[[4~" end-of-line

2)source ~/.zshrc在任何开放的端子中运行。


iTerm2还具有包含此行为的“自然文本编辑”键映射预设。
马特M.17年

需要更改为bindkey "^[[~4" end-of-line。注意4.
Ty

@谢谢,但是你能解释为什么吗?原始资源以及github.com/reenhanced/zsh-config/blob/master/lib/…github.com/ThiefMaster/zsh-config/blob/master/zshrc.d/…都使用“ ^ [[4 〜“
RationalDev

我不精通这些转义序列,但对我来说^[[4~回声出来4,同时^[[~4将光标移动到该行的末尾。
Ty。

@Ty有趣。我进行了一些搜索以找出原因,但我只能找到的示例^[[4~。您使用哪种键盘和字符编码,也许有所作为?
RationalDev


5

我使用Karabiner Elements完成了此任务。

您需要~/.config/karabiner/karabiner.json使用以下代码中的JSON数组更新的rules部分。这样做会重新映射主键和结束键,以使其在PC / Windows上工作。

{
  "rules": [
    {
      "description": "change home key to command + left_arrow",
      "manipulators": [
        {
          "from": {
            "key_code": "home"
          },
          "to": [
            {
              "key_code": "left_arrow",
              "modifiers": [
                "left_command"
              ]
            }
          ],
          "type": "basic"
        }
      ]
    },
    {
      "description": "change home key to command + left_arrow while presing shift (selection)",
      "manipulators": [
        {
          "from": {
            "key_code": "home",
            "modifiers": {
              "mandatory": [
                "left_shift"
              ]
            }
          },
          "to": [
            {
              "key_code": "left_arrow",
              "modifiers": [
                "left_command",
                "left_shift"
              ]
            }
          ],
          "type": "basic"
        }
      ]
    },
    {
      "description": "change end key to command + right_arrow",
      "manipulators": [
        {
          "from": {
            "key_code": "end"
          },
          "to": [
            {
              "key_code": "right_arrow",
              "modifiers": [
                "left_command"
              ]
            }
          ],
          "type": "basic"
        }
      ]
    },
    {
      "description": "change end key to command + right_arrow while presing shift (selection)",
      "manipulators": [
        {
          "from": {
            "key_code": "end",
            "modifiers": {
              "mandatory": [
                "left_shift"
              ]
            }
          },
          "to": [
            {
              "key_code": "right_arrow",
              "modifiers": [
                "left_command",
                "left_shift"
              ]
            }
          ],
          "type": "basic"
        }
      ]
    }
  ]
}

另请参见:github gist

在此处输入图片说明


1

@Lri的回答很棒(非常感谢;这让我发疯了),但是我最终对其做了一些修改。

(在此答案中,我将非苹果名称用作键,因此command = super和option = alt。)

超级左和超级右实际上曾经被映射到moveToLeftEndOfLinemoveToRightEndOfLinemoveToBeginningOfLinemoveToEndOfLine@Lri一样,使用和可能会导致行为不一致。

Appley快捷方式与我添加的其他所有人的快捷方式之间还有很多其他差​​异。例如,按ctrl-left和ctrl-right可以在单词之间移动。不是alt-left和alt-right。我不认为这是详尽无遗的,但现在对我来说效果很好。我假设用户已经交换了控制键和超级键来修复剪切,复制和粘贴。

~/Library/KeyBindings/DefaultKeyBinding.dict:
{
    "\UF729"   = moveToLeftEndOfLine:; // home
    "\UF72B"   = moveToRightEndOfLine:; // end
    "$\UF729"  = moveToBeginningOfLineAndModifySelection:; // shift-home
    "$\UF72B"  = moveToEndOfLineAndModifySelection:; // shift-end

    "@\UF700"  = moveUp:;  //super-up
    "@\UF701"  = moveDown:;  //super-down
    "@\UF702"  = moveWordLeft:;  //super-left
    "@\UF703"  = moveWordRight:;  //super-right

    "@$\UF700" = moveUpAndModifySelection:;  // super-shift-up
    "@$\UF701" = moveDownAndModifySelection:;  // super-shift-down
    "@$\UF702" = moveWordLeftAndModifySelection:;  // super-shift-left
    "@$\UF703" = moveWordRightAndModifySelection:;  // super-shift-right

    "@\UF728"  = deleteWordForward:;  // super-delete
    "@\U7F"    = deleteWordBackward:;  // super-backspace
}

-3

您还可以使用免费的BetterTouchTool(可从http://blog.boastr.net/获得)来重新映射键盘键,以及以各种很酷的方式自定义鼠标和触控板。定制输入设备工作的绝佳解决方案!


2
您能否使用有关如何使用指定软件解决原始问题的说明来扩展答案?
grg

从“免费啤酒”或“自由”的意义上说,并非免费。45天试用版,开源,付费软件。
Wyatt8740
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.