如何给 shell 自定义快捷键

如何给 shell 自定义快捷键

💡 原文中文,约2300字,阅读约需6分钟。
📝

内容提要

文章介绍如何自定义 zsh 快捷键以提升开发效率:通过终端模拟器将快捷键转为字符序列传给 shell,再用 bindkey 绑定,实现用 shift+enter 直接接受并执行 zsh-autosuggestions 的提示,并给出在 iTerm2 和 VSCode 集成终端中配置字符序列 ^[SE 的具体方法。

🔎

延伸解读

理解终端与 shell 的分工

文章指出,shell 本身不监听系统快捷键,快捷键由终端模拟器捕获并转换为字符序列后传给 shell。因此,自定义快捷键需要两端配合:终端负责映射按键到特定序列,shell 通过 bindkey 绑定该序列到具体操作。这种分工意味着不同终端模拟器的配置方式可能不同,但核心原理一致。

字符序列的查看与自定义

在 zsh 中,可以通过先按 ctrl+v 再按目标快捷键来查看终端转换出的字符序列。例如 ctrl+→ 对应 ^[[1;5C。自定义时,序列通常以控制字符开头(如 ^[),后续字符可自行定义,只要不与现有快捷键冲突。文章用 ^[SE 表示 shift+enter,其中 SE 仅为便于记忆。

跨终端配置的差异

文章给出了 iTerm2 和 VSCode 集成终端的具体配置方法。iTerm2 在 Key Mappings 中添加动作并输入文本 ^[SE;VSCode 则在 keybindings.json 中配置 sendSequence 命令,文本为 \u001bSE。两者都需确保终端将 shift+enter 映射为相同序列,以便 zsh 统一处理。

适用性与注意事项

作者仅在 zsh 上测试了该方法,并推测其他 shell 可能类似但需自行摸索。配置时需注意终端预设的切换可能影响原有快捷键,建议保留。此外,自定义序列应避免与现有绑定冲突,否则可能导致意外行为。

❓

Q&A

为什么 shell 不能直接监听系统快捷键?

因为 shell 本质上只处理输入输出,不监听系统快捷键。监听快捷键是终端模拟器的责任,终端模拟器会将快捷键转换成字符序列传给 shell。

如何查看某个快捷键在 zsh 中被转换成了什么字符序列?

在 zsh 中,先按 ctrl + v,再按你的快捷键,就会显示对应的字符序列。例如 ctrl + -> 会显示 ^[[1;5C。

zsh 中 bindkey 命令的作用是什么?

bindkey 命令用于定义快捷键,即当 zsh 接收到某个字符序列时执行指定的操作。

如何用 shift+enter 直接执行 zsh-autosuggestions 的提示?

在 zsh 配置中添加 bindkey '^[SE' autosuggest-execute,然后在终端模拟器中将 shift+enter 映射为字符序列 ^[SE。

在 iTerm2 中如何配置 shift+enter 发送字符序列 ^[SE?

打开 iTerm2 的 Preferences -> Profiles -> Keys -> Key Mappings,切换预设为 Natural Text Editing(保留原有快捷键),点击 + 添加新快捷键,Action 选择“输入文本”,文本内容填写 ^[SE。

在 VSCode 集成终端中如何将 shift+enter 映射为字符序列 ^[SE?

打开 VSCode 快捷键配置文件(keybindings.json),添加配置:{"key": "shift+enter", "command": "workbench.action.terminal.sendSequence", "when": "terminalFocus", "args": {"text": "\u001bSE"}}。其中 \u001b 对应 ^[。

🏷️

标签

➡️

继续阅读