Helix 按键映射（转）

译者注：选自我翻译的 Helix Book，全文档 在此处。

标记为 LSP 的映射需要该文件类型的语言服务器。

标记为 TS 的映射需要该文件类型的 tree-sitter 语法支持。

Normal mode

光标移动

注意：与 Vim 不同的是，f、F、t、T 并不局限于当前行。

按键 | 描述 | 命令
h, Left | 左移 | move_char_left
j, Down | 下移 | move_line_down
k, Up | 上移 | move_line_up
l, Right | 右移 | move_char_right
w | 移动到下一个 word 开头 | move_next_word_start
b | 移动到上一个 word 开头 | move_prev_word_start
e | 移动到下一个 word 结尾 | move_next_word_end
W | 移动到下一个 WORD 开头 | move_next_long_word_start
B | 移动到上一个 WORD 结尾 | move_prev_long_word_start
E | 移动到下一个 WORD 结尾 | move_next_long_word_end
t | 找到下个字符之前 | find_till_char
f | 找到下个字符 | find_next_char
T | 找到上个字符之后 | till_prev_char
F | 找到上个字符 | find_prev_char
G | nG 表示去第 n 行， n 为数字 | goto_line
Alt-. | 重复上次光标移动 （f、t、m 等） | repeat_last_motion
Home | 移动到当前行开头 | goto_line_start
End | 移动到当前行结尾 | goto_line_end
Ctrl-b, PageUp | 往上翻页 | page_up
Ctrl-f, PageDown | 往下翻页 | page_down
Ctrl-u | 往上翻半页 | half_page_up
Ctrl-d | 往下翻半页 | half_page_down
Ctrl-i | 移动到跳转列表上的下一项 | jump_forward
Ctrl-o | 移动到跳转列表上的上一项 | jump_backward
Ctrl-s | 保存当前选区到跳转列表 | save_selection

文本修改

按键 | 描述 | 命令
r | 替换为一个字符 | replace
R | 替换为复制的文本 | replace_with_yanked
~ | 切换所选文本的大小写 | switch_case
` | 将所选文本设置为小写 | switch_to_lowercase
Alt-` | 将所选文本设置为大写 | switch_to_uppercase
i | 在所选内容之前插入 | insert_mode
a | 在所选内容之后插入（追加） | append_mode
I | 在当前行开头插入 | insert_at_line_start
A | 在当前行结尾插入 | insert_at_line_end
o | 在所选内容下方开始新的一行 | open_below
O | 在所选内容上方开始新的一行 | open_above
. | 重复上次插入 | N/A
u | 撤销修改 | undo
U | 恢复修改 | redo
Alt-u | 回到上一次历史 | earlier
Alt-U | 回到下一次历史 | later
y | 复制选择的内容 | yank
p | 在所选内容后方粘贴 | paste_after
P | 在所选内容前方粘贴 | paste_before
" <reg> | 选择一个寄存器把文本复制到那里或者从那粘贴 | select_register
> | 缩进所选内容 | indent
< | 取消缩进所选内容 | unindent
= | 对所选内容格式化（目前无此功能 / 禁用） (LSP) | format_selections
d | 删除所选内容 | delete_selection
Alt-d | 删除所选内容，但不复制被删除的内容 | delete_selection_noyank
c | 修改所选内容（删除并进入插入模式） | change_selection
Alt-c | 修改所选内容（删除并进入插入模式），但不复制被删除的内容 | change_selection_noyank
Ctrl-a | 对光标下的数字自增 | increment
Ctrl-x | 对光标下的数字自减 | decrement
Q | 开始 / 结束录制到所选寄存器的宏（实验功能） | record_macro
q | 从所选寄存器回放录制的宏（实验功能） | replay_macro

对选区执行 Shell 命令

按键 | 描述 | 命令
` | ` | 把每个选定内容放入管道，并将 shell 命令的输出替换掉这些内容
`Alt- | ` | 把每个选定内容放入管道，并忽略掉 shell 命令的输出
! | 运行 shell 命令，将其结果插入到每个选定内容之前 | shell_insert_output
Alt-! | 运行 shell 命令，将其结果插入到每个选定内容之后 | shell_append_output
$ | 将每个选区通过管道传输到 shell 命令中，保留命令返回为 0 的选区 | shell_keep_pipe

选择文本

按键 | 描述 | 命令
s | 在选区范围内的选择所有正则表达式匹配的内容 | select_regex
S | 在选区范围内的选择正则表达式匹配之外的内容 | split_selection
Alt-s | 在多行选区中对每个非空行结尾放置一个光标 | split_selection_on_newline
& | 按列对齐选区（先使用 Alt-s） | align_selections
_ | 从选区中移除首尾空格来缩小选取 | trim_selections
; | 把选区收缩到光标（多光标选区折叠到选区各自的光标上） | collapse_selection
Alt-; | 反转选区光标和锚点（对应于 Vim 的 o） | flip_selections
Alt-: | 确保选区往正文本方向（即把所有选区光标放置于选区结尾） | ensure_selections_forward
, | 只保留主选区（多光标时收缩到主光标） | keep_primary_selection
Alt-, | 移除主选区（多光标时移除主光标） | remove_primary_selection
C | 对下一行复制选区（多光标时往下增加一个相同位置的光标） | copy_selection_on_next_line
Alt-C | 对上一行复制选区（多光标时往上增加一个相同位置的光标） | copy_selection_on_prev_line
( | 把上一个选区作为主选区（主选区后移） | rotate_selections_backward
) | 把下一个选区作为主选区（主选区前移） | rotate_selections_forward
Alt-( | 把每个选区内容换成其下一个选区的内容（选区内容后移） | rotate_selection_contents_backward
Alt-) | 把每个选区内容换成其上一个选区的内容（选区内容前移） | rotate_selection_contents_forward
% | 选择整个文件 | select_all
x | 选择当前行；如果已选择，延伸到下一行 | extend_line_below
X | 将选区扩展到行边界且 line-wise1 | extend_to_line_bounds
Alt-x | 将选区扩展到行边界且 line-wise | shrink_to_line_bounds
J | 在选取内用空格拼接行 | join_selections
Alt-J | 在选取内拼接行，但连接处使用多光标 | join_selections_space
K | 多选区内只保留匹配正则的选区 | keep_selections
Alt-K | 多选区内移除匹配正则的选区 | remove_selections
Ctrl-c | 注释 / 取消注释所选内容 | toggle_comments
Alt-o, Alt-up | 将所选内容拓展到上一级父语法节点 (TS) | expand_selection
Alt-i, Alt-down | 将所选内容收缩语法节点 (TS) | shrink_selection
Alt-p, Alt-left | 选择语法树中的上一个同级节点 (TS) | select_prev_sibling
Alt-n, Alt-right | 选择语法树中的下一个同级节点 (TS) | select_next_sibling

Copy
╭─────╮ ╭─────╮ ╭─────╮
│text1│ &lt;── backward ──│text0│── forward ──&gt; │text1│
╰─────╯ ╰─────╯ ╰─────╯

╭─────╮
│text1│
╰─────╯
↑
backward：选区往上/往后/反向
|
╭─────╮
│text0│
╰─────╯
|
forward：选区往下/往前/正向
↓
╭─────╮
│text1│
╰─────╯


搜索文本

默认情况下，搜索命令都在 / 寄存器上操作。使用 "<char> 来操作不同的寄存器。

按键 | 描述 | 命令
/ | 文本正方向正则搜索 | search
? | 文本反方向正则搜索 | rsearch
n | 选择下一个匹配到的搜索内容（选区会增加） | search_next
N | 选择下一个匹配到的搜索内容（选区会增加） | search_prev
* | 使用当前选中的文本作为搜索模式 | search_selection

Minor modes

这些子模式可从正常模式访问，通常在命令结束后切换回正常模式。

按键 | 描述 | 命令
v | 进入 select (extend) mode | select_mode
g | 进入 goto mode | N/A
m | 进入 match mode | N/A
: | 进入 command mode | command_mode
z | 进入 view mode | N/A
Z | 进入 sticky view mode | N/A
Ctrl-w | 进入 window mode | N/A
Space | 进入 space mode | N/A

View mode

view 模式用于在不更改选区的情况下滚动和操作视图。

这种模式的 sticky （按 Z）方式是持久的：需使用 Esc 键返回到正常模式。当你只是浏览文本而不是主动编辑它时，这一方式很有用。

Key | Description | Command
z, c | 垂直居中当前行 | align_view_center
t | 将当前行与屏幕顶部对齐 | align_view_top
b | 将当前行与屏幕底部对齐 | align_view_bottom
m | 将当前行与屏幕中间水平对齐 | align_view_middle
j, down | 向下滚动视图 | scroll_down
k, up | 向上滚动视图 | scroll_up
Ctrl-f, PageDown | 向下翻页 | page_down
Ctrl-b, PageUp | 向上翻页 | page_up
Ctrl-d | 向下翻半页 | half_page_down
Ctrl-u | 向上翻半页 | half_page_up

Goto mode

按 g 进入此模式，来跳跃到不同的位置。

按键 | 描述 | 命令
g | 输入 gng 跳转到第 n 行2；不输入数字跳转到第 1 行 | goto_file_start
e | 到最后一行 | goto_last_line
f | 到所选文件3 | goto_file
h | 到当前行开头 | goto_line_start
l | 到当前行结尾 | goto_line_end
s | 到当前行第一个非空格字符 | goto_first_nonwhitespace
t | 到屏幕顶部那行 | goto_window_top
c | 到屏幕中间那行 | goto_window_center
b | 到屏幕底部那行 | goto_window_bottom
d | 跳转到定义 (LSP) | goto_definition
y | 跳转到类型定义 (LSP) | goto_type_definition
r | 跳转到引用 (LSP) | goto_reference
i | 跳转到实现 (LSP) | goto_implementation
a | 到上次访问的 / 备选文件 | goto_last_accessed_file
m | 到上次修改的 / 备选文件 | goto_last_modified_file
n | 到下个缓冲区 | goto_next_buffer
p | 到上个缓冲区 | goto_previous_buffer
. | 到当前文件中的最后一次修改处 | goto_last_modification

Match mode

在 normal 模式按 m 进入该模式。有关 环绕 和 文本对象 的解释，请参阅 使用 的相关部分。

按键 | 描述 | 命令
m | 到匹配的括号 (TS) | match_brackets
s <char> | 用将当前选定内容用 <char> 包围起来 | surround_add
r <from><to> | 把环绕的 <from> 字符替换成 <to> | surround_replace
d <char> | 删除环绕的 <char> | surround_delete
a | 删除 textobject 文本 | select_textobject_around
i | 删除 textobject 内部的文本 | select_textobject_inner

TODO：选择语法节点的映射（[ 的超集）。

Window mode

这部分类似于 Vim 键绑定，因为 Kakoune 不支持窗口。按 <space>w 或者 <Ctrl-w> 进入此模式。

按键 | 描述 | 命令
w, Ctrl-w | 切换到下一个窗口 | rotate_view
v, Ctrl-v | 垂直向右拆分 | vsplit
s, Ctrl-s | 水平底部拆分 | hsplit
f | 以水平拆分方式转到所选内容中的文件 | goto_file
F | 以垂直拆分方式转到所选内容中的文件 | goto_file
h, Ctrl-h, Left | 移动光标到左侧拆分窗口 | jump_view_left
j, Ctrl-j, Down | 移动光标到下侧拆分窗口 | jump_view_down
k, Ctrl-k, Up | 移动光标到上侧拆分窗口 | jump_view_up
l, Ctrl-l, Right | 移动光标到右侧拆分窗口 | jump_view_right
q, Ctrl-q | 关闭当前窗口 | wclose
o, Ctrl-o | 仅保留当前窗口，关闭所有其他窗口 | wonly
H | 交换当前窗口到左侧4 | swap_view_left
J | 交换当前窗口到下侧 | swap_view_down
K | 交换当前窗口到上侧 | swap_view_up
L | 交换当前窗口到右侧 | swap_view_right

Space mode

该部分是一个杂乱无章的映射，主要是 picker。按 <space> 进入此模式。

按键 | 描述 | 命令
f | 打开文件选取器 | file_picker
F | 打开当前项目目录的文件选取器 | file_picker_in_current_directory
b | 打开缓冲区选取器 | buffer_picker
j | 打开跳转列表选取器 | jumplist_picker
k | 在 popup 框中显示光标下条目的文档 (LSP) | hover
s | 打开当前文档符号选取器 (LSP) | symbol_picker
S | 打开工作区符号选取器 (LSP) | workspace_symbol_picker
g | 打开当前文档代码诊断选取器 (LSP) | diagnostics_picker
G | 打开工作区代码诊断选取器 (LSP) | workspace_diagnostics_picker
r | 重命名符号 (LSP) | rename_symbol
a | 执行代码操作 (LSP) | code_action
' | 打开上次的模糊选取器 | last_picker
w | 进入 window mode | N/A
p | 在选区后方粘贴系统剪贴板的内容 | paste_clipboard_after
P | 在选区前方粘贴系统剪贴板的内容 | paste_clipboard_before
y | 复制所选文本到粘贴板 | yank_joined_to_clipboard
Y | （多选区时）复制主选区到粘贴板 | yank_main_selection_to_clipboard
R | 将所选文本替换成系统粘贴板的文本 | replace_selections_with_clipboard
/ | 在工作区文件夹下全局搜索文本 | global_search
? | 打开命令选项板 | command_palette

提示：全局搜索虽然使用命令行输入，但在模糊选取器中显示结果，所以你可以在打开文件后使用 <space>' 将上次搜索的结果其带回。

Popup

显示光标下条目的文档。

按键 | 描述
Ctrl-u | 向上滚动
Ctrl-d | 向下滚动

Unimpaired

使用 vim-unimpaired 风格的映射来代码导航。

按键 | 描述 | 命令
[d | 到上一个诊断 (LSP) | goto_prev_diag
]d | 到下一个诊断 (LSP) | goto_next_diag
[D | 到本文件的第一个诊断 (LSP) | goto_first_diag
]D | 到本文件的最后一个诊断 (LSP) | goto_last_diag
]f | 到下一个函数 (TS) | goto_next_function
[f | 到上一个函数 (TS) | goto_prev_function
]c | 到下一个类 (TS) | goto_next_class
[c | 到上一个类 (TS) | goto_prev_class
]a | 到下一个参数 (TS) | goto_next_parameter
[a | 到上一个参数 (TS) | goto_prev_parameter
]o | 到下一个注释 (TS) | goto_next_comment
[o | 到上一个注释 (TS) | goto_prev_comment
]t | 到下一个测试 (TS) | goto_next_test
]t | 到上一个测试 (TS) | goto_prev_test
]p | 到下一个段落 | goto_next_paragraph
[p | 到上一个段落 | goto_prev_paragraph
[Space | 在上面添加新的一行 | add_newline_above
]Space | 在下面添加新的一行 | add_newline_below

Insert mode

默认情况下，insert mode 绑定的按键在某种程度上是最少的。 Helix 被设计成一个模式编辑器，这反映在用户体验和内部机制上。

例如，只有在从 insert mode 退出到 normal mode 时，才会保存对文本所做的更改以供撤消。出于这个原因，强烈鼓励新用户学习模式编辑范例，以获得最流畅的体验。

按键 | 描述 | 命令
Escape | 切换到正常模式 | normal_mode
Ctrl-s | 提交撤消检查点 | commit_undo_checkpoint
Ctrl-x | 自动补全 | completion
Ctrl-r | 插入寄存器的内容 | insert_register
Ctrl-w, Alt-Backspace | 删除上一个单词 | delete_word_backward
Alt-d, Alt-Delete | 删除下一个单词 | delete_word_forward
Ctrl-u | 删除到行首 | kill_to_line_start
Ctrl-k | 删除到行尾 | kill_to_line_end
Ctrl-h, Backspace | 删除上一个字符 | delete_char_backward
Ctrl-d, Delete | 删除下一个字符 | delete_char_forward
Ctrl-j, Enter | 插入新行 | insert_newline

不推荐使用这些快捷键，只是为不太熟悉模式编辑器的新用户提供这些。

如果你希望在更习惯使用模式编辑时在 insert mode 下禁用它们，则在 config.toml 中使用以下命令：

Copy
[keys.insert]
up = "no_op"
down = "no_op"
left = "no_op"
right = "no_op"
pageup = "no_op"
pagedown = "no_op"
home = "no_op"
end = "no_op"


Select / extend mode

按 v 进入和退出此模式，此模式类似于 normal mode，但会更改任意移动以扩展选区，而不是替换这些选区。goto 移动也被更改为扩展，例如，vgl 将所选内容扩展到行尾。

搜索也受到了影响。默认情况下，n 和 N 会移除当前选区，并选择搜索词的下一个实例。

在按 n 或 N 之前切换此模式可以保持当前选区。在迭代式搜索时打开和关闭这个模式，可让你有选择地将搜索项添加到选区中。5

Picker

在选取器中使用的按键。当前不支持重新映射这些按键。

按键 | 描述
Shift-Tab, Up, Ctrl-p | 前一条
Tab, Down, Ctrl-n | 后一条
PageUp, Ctrl-u | 往上翻页
PageDown, Ctrl-d | 往下翻页
Home | 到第一条
End | 到最后一条
Enter | 打开所选项
Ctrl-s | 垂直拆分窗口再打开
Ctrl-v | 水平拆分窗口再打开
Ctrl-t | 切换预览
Escape, Ctrl-c | 关闭选取器

Prompt

在提示框（比如按 s 在命令行弹出待输入的那个位置）内使用的按键，当前不支持重新映射。

按键 | 描述
Escape, Ctrl-c | 关闭提示框
Alt-b, Ctrl-Left | 到上一个 word （nomal mode 下的 b）
Ctrl-b, Left | 到上一个 char （nomal mode 下的 h）
Alt-f, Ctrl-Right | 到下一个 word
Ctrl-f, Right | 到下一个 char
Ctrl-e, End | 到行结尾
Ctrl-a, Home | 到行开头
Ctrl-w, Alt-Backspace, Ctrl-Backspace | 删除前一个 word
Alt-d, Alt-Delete, Ctrl-Delete | 删除下一个 word
Ctrl-u | 删除到行开头
Ctrl-k | 删除到行结尾
Backspace, Ctrl-h | 删除前一个 char
Delete, Ctrl-d | 删除下一个 char
Ctrl-s | 载光标下插入一个，可能以后会改成 Ctrl-r Ctrl-w
Ctrl-p, Up | 选择上一个历史
Ctrl-n, Down | 选择下一个历史
Ctrl-r | 插入所选寄存器的内容
Tab | 选择下一个补全项
BackTab | 选择上一个补全项
Enter | 打开选定项

译者注：X 与 x 的区别在于，跨行拓展时，x 总是把光标放于末尾，而 X 会感知选区的方向，这被称为
line-wise：如果光标在选区往下的方向，那么选区拓展后的光标位于末尾；如果光标在选区往上的方向，那么选区拓展后的光标位于末尾。
关于选区的方向，你可以参考我的理解： ↩︎

gng 等价于 ngg 和 nG，都用于跳转到第 n 行。 ↩︎

gf 会将所选内容视为文件路径（可以是相对路径也可以是绝对路径）；当该路径不存在，打开那个路径的缓冲区，写入即创建该文件（不写入不创建）。 ↩︎