重新映射“Home”和“End”键为行首和行尾

大部分的计算时间都是在Linux上度过的(偶尔也会用Windows)。在这些平台上,HomeEnd键通常会跳到当前行的开头或结尾。
我正在逐渐习惯使用我生活中唯一的一台苹果电脑,但仍然很沮丧的是,这些键似乎被绑定到文档的开头和结尾,而没有任何键可以执行基于行的操作。
我的问题是:
  1. 是否存在我所不知道的用于跳转到行首和行尾的快捷键?(我主要使用终端、Chrome和LibreOffice)
  2. 是否有办法将这些键的功能重新绑定到我熟悉的功能上?我愿意放弃对文档的操作,因为它们对我来说几乎没有用处。
还有两个注意事项:
  1. 我不是系统上唯一的用户。如果我的用户设置会影响其他人的使用体验,那就最好不要破坏他们的体验。如果不可能的话,我认为我可能有最强烈的偏好!
  2. 我使用多种语言并切换键盘布局,所以任何解决方案都应该能够在多个键盘布局之间切换时正常工作。

2请注意,虽然我最终找到了解决方案并回答了自己的问题,但我对更简单或更多功能的解决方案持开放态度。此外,发现这个解决方案的过程并不清楚。例如,如果我想重新映射更多按键,我应该在哪里找到密钥代码和动作名称?如果您有相关知识,请随时添加答案! - Caleb
6因为这个原因,我讨厌我的Mac。除了Mac以外,每个系统都使用Home和End键。 - barrypicker
2自从使用Mac以来,这一直是我最大的痛苦。 - Eman
13个回答

默认的快捷键用于移动到(换行)行的开头或结尾是AE将光标移动到未换行的行(或段落)的开头或结尾。按单词向后/向前移动,所有这些操作都支持在相应移动期间按住Shift进行选择。
您可以通过创建~/Library/KeyBindings/并保存一个类似以下内容的属性列表文件DefaultKeyBinding.dict来重新映射Home和End键。
{
    "\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)、Terminal和许多跨平台应用程序将忽略DefaultKeyBinding.dict。
有关可自定义键绑定的更多信息,请参阅Cocoa Text System
Terminal的键绑定可以在“偏好设置”>“配置文件”>“设置”>“键盘”中进行自定义。`\033OH`将光标移到行首,`\033OF`将光标移到行尾。
在Eclipse中,应该在“偏好设置”>“常规”>“键盘”中修改键绑定。您需要为命令“Line Start”和“Line End”修改默认绑定(将⌘←替换为↖,将⌘→替换为↘)。为了使选择工作,还需修改“Select Line Start”和“Select Line End”。

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


3关于按键映射的有用信息 - 我使用过这些与(商业)BetterTouchTool一起,详见此答案 - RichVel
5根据我的经验,这在大多数应用程序中都不起作用。最好使用Karabina-Elements。 - Timmmm
8这太棒了,因为它能在终端、iTerm2、Chrome、Sublime和Outlook中使用。而另一种选择(Karabina)不那么好,因为它将"Home"键映射为Command+LeftArrow,在终端中实际上是切换窗口功能。保存.dict文件后,记得重新启动所有应用程序。 - Will Sheppard
1这在vim中不起作用。 - MohitC
/StandardKeyBinding.dict 是二进制文件,无法读取。 - Green
1您的网站链接已损坏。 - Green
@Green 用于二进制plist编辑,请参考https://apple.stackexchange.com/questions/101719/trouble-opening-plist-files-in-text-editor/101720#101720 - mmmmmm
7这个设置在我连接外部键盘的Mac OS Mojave上运行良好。 - jdhao
非常感谢你所付出的巨大努力!谢谢你。 - gia
非常感谢!报告:Outlook、Word、Terminal和Slack Snippet立即生效。MacOS Notes和Chrome在应用程序重新启动后也能正常工作。但是,Slack Add Message并不遵守这一规则。Webstorm始终正常工作。 - Turbo
太感谢了,非常非常感谢!评论虽然很吵闹,但还是要谢谢。作为一个使用键盘快捷键的开发者,我刚接触苹果Mac三个月,每天都在不同时间对着屏幕大喊大叫。现在终于恢复了正常生活! - James
2这在Catalina中已经不再适用于Safari(以及许多其他程序)。 - Adam Lindberg
10很不幸,我的Slack中的Home和End键仍然无法正常工作,这让我感到非常烦恼。但总体来说,这个提示还是有帮助的。许多其他文章(包括https://damieng.com/blog/2015/04/24/make-home-end-keys-behave-like-windows-on-mac-os-x)提到了`ctrl-shift-home`和`ctrl-shift-end`,但无论在哪个应用程序中,我从未见过它们起作用。 - Ryan
无法在页面中工作 - ina
在BigSur上为Chrome工作。 - Mark
终端的按键绑定在 Monterey 系统中似乎无法正常工作。 - Teejay
1@Ryan你找到解决Slack问题的方法了吗?这个问题也让我抓狂。 - Alex Friedman
1@AlexFriedman 不,我已经和Slack的支持团队沟通过了,他们并不在意。 - Ryan
非常感谢!我终于可以在Ventura中使用Xcode了,不再抓狂了。只需要在创建文件后退出并重新登录即可。我发现在终端中运行这些命令更容易,这样我就可以将文本粘贴到TextEdit中:sudo mkdir ~/Library/KeyBindings sudo chown $(whoami):staff ~/Library/KeyBindings touch ~/Library/KeyBindings/DefaultKeyBinding.dict open -a TextEdit ~/Library/KeyBindings/DefaultKeyBinding.dict - theSparky

我目前使用的是Lion 10.7.4版本,但出于某种奇怪的原因,编辑~/Library/KeyBindings/DefaultKeyBinding.dict对我没有起作用。
我发现KeyRemap4MacBook系统偏好设置插件(现在称为Karabiner-Elements)非常好用,你还可以使用它重新映射各种按键,而无需编辑任何文本文件。例如,将页面上/下键更改为使光标也随之移动。
只需下载该插件,在系统偏好设置面板中浏览到“对于PC用户”部分,并勾选“使用PC风格的Home/End”。
请注意,我选择了(将Home键更改为Command+Left)而不是(将Home键更改为Control+A),因为如果我选择了第一个选项,并且行被换行了,Home键会将我带到上方几行的包裹行的开头,而不是当前行的开头。

KeyRemap4MacBook


13Karabiner很棒,而且还是开源的。点击此处查看详情。 - Jedidja
2在10.10.5版本中,其他建议似乎不起作用,但Karabiner(KeyRemap4MacBook的新名称,适用于所有Mac产品)运行良好,并且更改生效无需重新启动。对于这个Mac新手来说非常有帮助;希望其他人也能从中受益。 - Ralph J
Karabiner只映射已连接的设备,所以如果你正在使用VNC、Splashtop等软件,这个方法将不起作用。然而,KeyBindings答案对于Splashtop(我目前正在使用)是有效的,我认为它们也适用于VNC。 - Bezewy
1只需下载这个插件,在系统偏好设置面板中,我没有在系统偏好设置中找到它。我在启动台中找到了它。Mac 版本:El Capitan 10.11.3 - arun
1截至今天,“Karabiner目前在macOS Sierra上无法使用。” - james.garriss
2@james.garriss 试试Karabiner-Elements吧,虽然是同一位作者,但是它已经从头开始重写以支持Sierra(它仍在开发中,所以还有一些不完善的地方)- https://github.com/tekezo/Karabiner-Elements - jklp
7很遗憾,Karabiner Elements目前还没有提供重新映射苹果扩展键盘上Home和End键所需的功能。个人而言,在控制台工作时,我似乎已经养成了使用Ctrl-a和Ctrl-e的肌肉记忆,但在像Sublime这样的图形界面应用程序中工作时,很难记住。然而,对于Sublime(具体来说),有一个解决方案:https://coderwall.com/p/upolqw/fix-sublime-text-home-and-end-key-usage-on-mac-osx - Ville
27如果你在2020年,并且和我一样不知道如何设置Karabiner,那么请前往“复杂修改”选项卡 > 添加规则 > 从互联网导入更多规则,然后搜索“home”,你将会找到一些可供导入的规则。 - Rodrigo Saling
7如果你在2021年,并且想要获取有关PC规则的信息,请前往复杂修改选项卡 > 添加规则 > 从互联网导入更多规则,然后搜索"PC",你将找到一些可供导入的规则。(感谢@RodrigoSaling)提供的初始提示。 - JJS
1无论是开源还是闭源,我都不会考虑使用这样一个需要监控所有键盘输入的工具,即使它并不是活动应用程序。 - connexo
2021年7月,我使用了“个人PC风格的快捷键(@Bave Lee)”,并导入了将“Home键移到行首(Ctrl + a)”和“End键移到行尾(Ctrl + e)”。 - Player1
刚刚在12.3版本上对我有效。不需要重新启动或注销。按住Option键点击Finder并重新启动,它在FF、Safari和默认的macOS应用程序中都正常工作。但在Terminal或iTerm中无效。在阅读了@Player1的评论后,我有点想将其重新映射为Ctrl+aCtrl+e,但这可能会导致其他不兼容性。 - joshfindit

感谢这篇文章,我找到了如何在每个用户基础上重新绑定HomeEnd键以进行基于行的操作,而且可以适用于各种键盘布局。
你需要创建一个字典文件,其中包含键码和要映射到的新命令,但首先确保打开终端并运行以下命令,以确保放置该文件的文件夹存在:
$ mkdir -p ~/Library/KeyBindings

然后在~/Library/KeyBindings/DefaultKeyBinding.dict创建或编辑文件。如果之前不存在,添加整个部分。如果已存在,则在该块内添加四行新的内容。
{
    "\UF729"  = "moveToBeginningOfLine:";
    "\UF72B"  = "moveToEndOfLine:";
    "$\UF729" = "moveToBeginningOfLineAndModifySelection:";
    "$\UF72B" = "moveToEndOfLineAndModifySelection:";
}

为了激活设置,您需要退出用户并重新登录。
请注意,这包括正常移动光标的操作以及使用Shift+Home/End组合键在光标移动期间进行选择。

我正在使用OS X Sierra,并且其他用户建议的~/Library/KeyBindings/DefaultKeyBinding.dict解决方案部分起作用:一些应用程序(如TextEdit)现在具有所需的行为,但其他应用程序则没有。Google Chrome和Slack是两个似乎不遵守DefaultKeyBinding.dict文件的应用程序。
为了修复剩下的应用程序,我使用BetterTouchTool (legacy) / BetterTouchTool (current)创建了特定于应用程序的键盘快捷键绑定,将HomeEnd绑定到OS X的本机快捷键Ctrl+ACtrl+E。BetterTouchTool并非免费,但有一个45天的试用期。
要做到这一点:
安装并启动BetterTouchTool 转到手势>键盘选项卡 在“选择应用程序”下,点击+并选择您想要修复的应用程序。 点击“添加新快捷键”,在“记录快捷键”字段中分配Home键,并将“触发其他键盘快捷键”设置为Ctrl+A。对于End和Ctrl+E,请重复此操作。 完成后,面板应如下所示:BetterTouchTool panel 在BetterTouchTool的高级设置中,允许其在启动时运行。 注意:不要退出BetterTouchTool应用程序,否则它将停止拦截按键。只需关闭其窗口,它应该继续在后台工作。

谢谢 - 我刚在El Capitan上使用了这个,因为我已经付费购买了BetterTouchTool,并且它与Chrome、Slack和其他应用程序完美配合。 - RichVel
要在跳躍中進行選擇(例如在 Word 文檔或 OneNote 中),您還需要將 Shift + Home 映射到 Shift + Command + 左箭頭(注意箭頭,不是 Ctrl + A),並類似地處理 End 鍵。從這裡獲取了相關信息:https://community.folivora.ai/t/make-your-home-and-end-keys-work-like-windows/5046 - Rhubarb
终于!我找到了这个缺失映射的解决方案。感谢你的提示。 - jerik
我已经开始使用Karabiner Elements,正如Jason Waters的回答所解释的那样。它更容易设置。 - mamacdon
1这个解决方案非常好用!唯一的区别是2022年的用户界面看起来有点不同,我不得不将分配的操作设置为⌘ <-和⌘ ->。 - pir

我使用Karabiner Elements完成了这个。
你需要更新~/.config/karabiner/karabiner.json文件中的规则部分,将下面代码中的JSON数组添加进去。这样做可以重新映射Home和End键,使它们的工作方式与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

enter image description here


你可以通过使用"modifiers": { "optional": [ "any"] }来简化这个规则,避免为选择重复编写规则(这个注释的格式很糟糕,复制粘贴到编辑器中以正确阅读我猜)。{ "description": "Home is Beginning of line", "type": "basic", "from": { "key_code": "home", "modifiers": { "optional": [ "any"] } }, "to": [{ "key_code": "left_arrow", "modifiers": [ "left_command" ] }] } - n-smits
2要实现这一点的规则也可以从存储库中导入,方法是进入“复杂修改”部分,然后点击“从互联网导入更多规则”,这将在https://ke-complex-modifications.pqrs.org/上打开一个浏览器,搜索“Home”并从结果中获取“Home and End”。已在Big Sur上进行了测试。 - Giovanni Toraldo

我正在使用超棒的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
1该工具已更名为Karabiner,据说它可以与OS X El Capitan 10.11、Sierra 10.12和High Sierra 10.13一起使用。 - RichVel

@Lri的回答太棒了(非常感谢;这真的让我疯了),但是我最终还是稍微修改了一下。
(在这个回答中,我使用非苹果的按键名称,所以Command = SuperOption = AltSuperLeftSuperRight实际上曾经映射到moveToLeftEndOfLinemoveToRightEndOfLine。像@Lri那样使用moveToBeginningOfLinemoveToEndOfLine可能会导致不一致的行为。
苹果的快捷键和其他人的快捷键之间还有许多其他差异,我已经添加了。例如,ControlLeftControlRight应该用来在单词之间移动;而不是AltLeftAltRight。我认为这还不是详尽无遗的,但目前对我来说运行得很好。我假设用户已经交换了ControlSuper键以修复剪切、复制和粘贴问题。
~/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
}

我发现以下内容对于使用iterm2和zsh很有用,其中引用了此处的链接:
在iTerm的首选项中打开"profiles"标签,然后单击键列表底部的“+”按钮,在“Action”下选择“发送逃逸序列”,然后输入“[1~”来设置“Home”键(或苹果无线键盘上的“Fn+左箭头”),
对于“End”键,重复以上步骤并使用“[~4”来设置逃逸序列。

If you're using zsh, also do this:

1) Place the following in your ~/.zshrc file

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

2) Run source ~/.zshrc in any open terminals.


iTerm2还提供了一个“自然文本编辑”键映射预设,其中包括这种行为。 - Matt M.
需要更改为bindkey "^[[~4" end-of-line。请注意数字4的位置。 - Ty.
我对这些转义序列不太熟悉,但对我来说,^[[4~会输出4,而^[[~4会将光标移动到行尾。 - Ty.
@Ty 有趣。我做了一些搜索来弄清楚原因,但我只能找到^[[4~的例子。你使用什么样的键盘和字符编码,也许这会有所不同? - RationalDev likes GoFundMonica
对我来说,对于iTerm2有效的是这个答案:https://apple.stackexchange.com/a/389587,其中建议发送十六进制码0x01表示home(起始位置),以及0x05表示end(结束位置)。 - Tobias


打开这个文件
/Library/KeyBindings/DefaultKeyBinding.dict (apply to all users)

或者

~/Library/KeyBindings/DefaultKeyBinding.dict (apply to yourself)

添加以下内容:
{
  "\UF729"  = moveToBeginningOfParagraph:; // home
  "\UF72B"  = moveToEndOfParagraph:; // end
  "$\UF729" = moveToBeginningOfParagraphAndModifySelection:; // shift-home
  "$\UF72B" = moveToEndOfParagraphAndModifySelection:; // shift-end
  "^\UF729" = moveToBeginningOfDocument:; // ctrl-home
  "^\UF72B" = moveToEndOfDocument:; // ctrl-end
  "^$\UF729" = moveToBeginningOfDocumentAndModifySelection:; // ctrl-shift-home
  "^$\UF72B" = moveToEndOfDocumentAndModifySelection:; // ctrl-shift-end
}

1这个回答似乎只是在重复其他答案已经解释过的内容,只是用你喜欢的一组键来替代,没有太多解释。也许你可以通过解释这个解决方案与其他解决方案的区别来增加一些价值。 - Caleb
3@Caleb:他添加了moveToBeginningOfDocument和moveToEndOfDocument这两个我认为非常重要的功能。 - Jeff Wright
https://damieng.com/blog/2015/04/24/make-home-end-keys-behave-like-windows-on-mac-os-x/ - felickz