本文围绕 Helix 官方文档 Commands 展开,完整梳理 Helix 的两类内建命令体系——可在命令模式(按 : 激活)中输入、可带参数的 Typable 命令,以及不接收参数、可直接绑定到按键的 Static 命令。文中不仅完整继承并分类整理了官方生成的全部命令清单(typable-cmd.md 与 static-cmd.md),还结合 helix-term/src/commands.rs 和 helix-term/src/commands/typed.rs 的源码结构,讲清命令注册、补全、参数签名与命令面板的底层实现,帮助你在实际使用中快速定位命令、理解参数语义,并基于源码进行按键重映射。
一、Helix 的两大类命令
Helix 把编辑器命令分为两个互不重叠的类别,Commands 文档也是按此二分法组织的:
从源码看,两类命令最终都被统一进同一个枚举 MappableCommand:
pub enum MappableCommand {
Typable {
name: String,
args: String,
doc: String,
},
Static {
name: &'static str,
fun: fn(cx: &mut Context),
doc: &'static str,
},
Macro {
name: String,
keys: Vec<KeyEvent>,
},
}
这个设计意味着:Typable 命令除了能输之外,同样可以绑定到按键上(键位映射时相当于携带一段固定参数执行);Static 命令则是不带参数的“纯函数式”行为;Macro 变体则用于把按键录制为宏后重放。
二、Typable 命令:命令模式的完整命令清单
Typable 命令从命令模式调用,按 : 即可激活(对应 static 命令 command_mode)。命令支持别名、位置参数、文件补全与标志位。下面按功能域整理 typable-cmd.md 中的全部内建命令。
2.1 文件与退出
| 命令 |
说明 |
:exit, :x, :xit |
若缓冲区有修改则写入磁盘后退出。可带可选路径(:exit some/path.txt)。 |
:exit!, :x!, :xit! |
强制写入磁盘(自动创建所需子目录)后退出。可带可选路径(:exit! some/path.txt)。 |
:quit, :q |
关闭当前视图(view)。 |
:quit!, :q! |
强制关闭当前视图,忽略未保存修改。 |
:open, :o, :edit, :e |
从磁盘打开文件到当前视图。 |
关于退出流程的实现,typed.rs 中 exit 函数展示了典型的参数处理模式:若文档 is_modified(),先调用 write_impl 执行落盘,再执行 quit;! 变体(force_exit)的差异仅在于 WriteOptions.force = true。此外写入类命令还定义了 --no-format / --no-code-actions 之类的标志位(WRITE_NO_FORMAT_FLAG、WRITE_NO_CODE_ACTIONS_FLAG),可以在写入时跳过自动格式化与 LSP code actions。
2.2 缓冲区管理
| 命令 |
说明 |
:new, :n |
创建一个新的 scratch 缓冲区。 |
:buffer-close, :bc, :bclose |
关闭当前缓冲区。 |
:buffer-close!, :bc!, :bclose! |
强制关闭当前缓冲区,忽略未保存修改。 |
:buffer-close-others, :bco, :bcloseother |
关闭除当前聚焦缓冲区外的所有缓冲区。 |
:buffer-close-others!, :bco!, :bcloseother! |
强制关闭除当前聚焦缓冲区外的所有缓冲区。 |
:buffer-close-all, :bca, :bcloseall |
关闭所有缓冲区但不退出编辑器。 |
:buffer-close-all!, :bca!, :bcloseall! |
强制关闭所有缓冲区(忽略未保存修改)但不退出。 |
:buffer-next, :bn, :bnext |
跳转到下一个缓冲区。 |
:buffer-previous, :bp, :bprev |
跳转到上一个缓冲区。 |
2.3 保存与写盘
| 命令 |
说明 |
:write, :w |
写入磁盘。可带可选路径(:write some/path.txt)。 |
:write!, :w! |
强制写入并自动创建所需子目录。可带可选路径。 |
:write-buffer-close, :wbc |
写入磁盘并关闭缓冲区。可带可选路径。 |
:write-buffer-close!, :wbc! |
强制写入(创建子目录)并关闭缓冲区。可带可选路径。 |
:write-quit, :wq |
写入磁盘并关闭当前视图。可带可选路径。 |
:write-quit!, :wq! |
强制写入并关闭当前视图。可带可选路径。 |
:write-all, :wa |
将所有缓冲区的修改写入磁盘。 |
:write-all!, :wa! |
强制写入所有缓冲区,自动创建子目录。 |
:write-quit-all, :wqa, :xa |
写入所有缓冲区并关闭所有视图。 |
:write-quit-all!, :wqa!, :xa! |
强制写入所有缓冲区(创建子目录,忽略未保存修改)并关闭所有视图。 |
:quit-all, :qa |
关闭所有视图。 |
:quit-all!, :qa! |
强制关闭所有视图,忽略未保存修改。 |
:cquit, :cq |
以指定退出码退出(默认 1),可接受整数参数(:cq 2)。 |
:cquit!, :cq! |
强制以指定退出码退出,忽略未保存修改(:cq! 2)。 |
2.4 工作目录操作
| 命令 |
说明 |
:change-current-directory, :cd |
修改当前工作目录。 |
:show-directory-stack |
以 <space> 分隔的字符串形式展示目录栈。 |
:push-directory, :pushd |
先保存当前目录,再切换到新目录。 |
:pop-directory, :popd |
弹出目录栈顶部条目并切换到新的栈顶目录。 |
:show-directory, :pwd |
显示当前工作目录。 |
2.5 文档属性:编码、缩进、语言
| 命令 |
说明 |
:indent-style |
设置编辑时的缩进风格:t 表示 Tab,1–16 表示空格数。 |
:line-ending |
设置文档默认行尾。可选值:crlf、lf。 |
:encoding |
设置编码,遵循 WHATWG Encoding 标准。 |
:set-language, :lang |
设置当前缓冲区的语言(不带参数时显示当前语言)。 |
:character-info, :char |
查看主光标下字符的信息。 |
2.6 重新加载与更新
| 命令 |
说明 |
:reload, :rl |
丢弃当前修改,从源文件重新加载。 |
:reload-all, :rla |
丢弃修改并重新加载所有文档。 |
:update, :u |
仅当文件在磁盘上被修改过时才写入。 |
2.7 主题与语法可视化
| 命令 |
说明 |
:theme |
切换编辑器主题(不带名称时显示当前主题)。 |
:tree-sitter-scopes |
显示 tree-sitter 作用域,主要用于主题开发与调试。 |
:tree-sitter-highlight-name |
显示光标下 tree-sitter 高亮作用域名称。 |
:tree-sitter-layers |
显示光标下 tree-sitter 注入层的语言名称。 |
:tree-sitter-subtree, :ts-subtree |
显示覆盖主选区的 tree-sitter 最小子树,主要用于查询调试。 |
2.8 LSP 与调试
| 命令 |
说明 |
:lsp-workspace-command |
打开 LSP workspace command 选择器。 |
:lsp-restart |
重启指定语言服务器;不带参数时重启当前文件所用的全部服务器。 |
:lsp-stop |
停止指定语言服务器;不带参数时停止当前文件所用的全部服务器。 |
:debug-start, :dbg |
从给定模板与参数启动调试会话。 |
:debug-remote, :dbg-tcp |
通过 TCP 地址连接 debug adapter 并启动调试会话。 |
:debug-eval |
在当前调试上下文求值表达式。 |
2.9 分屏与教程
| 命令 |
说明 |
:vsplit, :vs |
在垂直分屏中打开文件。 |
:vsplit-new, :vnew |
在垂直分屏中打开 scratch 缓冲区。 |
:hsplit, :hs, :sp |
在水平分屏中打开文件。 |
:hsplit-new, :hnew |
在水平分屏中打开 scratch 缓冲区。 |
:tutor |
打开新手教程(即仓库 runtime/tutor 的内容)。 |
2.10 配置运行时开关
| 命令 |
说明 |
:goto, :g |
跳转到指定行号。 |
:set-option, :set |
运行时设置配置项。例如禁用 smart case 搜索::set search.smart-case false。 |
:toggle-option, :toggle |
运行时切换配置项。例如 :toggle search.smart-case。 |
:get-option, :get |
获取配置项当前值。 |
:config-reload |
重新加载用户配置。 |
:config-open |
打开用户 config.toml 文件。 |
:config-open-workspace |
打开工作区 config.toml 文件。 |
:log-open |
打开 Helix 日志文件。 |
:set / :toggle / :get 让配置项无需改文件、无需重启即可在线调整,这是 Helix 相比纯静态配置的重要体验点。
2.11 剪贴板
| 命令 |
说明 |
:yank-join |
将合并后的选区复制到寄存器。可指定分隔符(第一个参数),默认为换行。 |
:clipboard-yank |
将主选区复制到系统剪贴板。 |
:clipboard-yank-join |
将合并后的选区复制到系统剪贴板,可选分隔符,默认换行。 |
:primary-clipboard-yank |
将主选区复制到系统 primary 剪贴板。 |
:primary-clipboard-yank-join |
将合并后的选区复制到 primary 剪贴板,可选分隔符。 |
:clipboard-paste-after |
在各选区之后粘贴系统剪贴板。 |
:clipboard-paste-before |
在各选区之前粘贴系统剪贴板。 |
:clipboard-paste-replace |
用系统剪贴板内容替换选区。 |
:primary-clipboard-paste-after |
在各选区之后粘贴 primary 剪贴板。 |
:primary-clipboard-paste-before |
在各选区之前粘贴 primary 剪贴板。 |
:primary-clipboard-paste-replace |
用 primary 剪贴板内容替换选区。 |
:show-clipboard-provider |
在状态栏显示当前剪贴板提供者名称。 |
2.12 Shell 集成
| 命令 |
说明 |
:insert-output |
运行 shell 命令,将输出插入到每个选区之前。 |
:append-output |
运行 shell 命令,将输出追加到每个选区之后。 |
:pipe, :| |
将每个选区通过管道送入 shell 命令。 |
:pipe-to |
将每个选区送入 shell 命令,忽略其输出。 |
:run-shell-command, :sh, :! |
运行一条 shell 命令。 |
2.13 寄存器、诊断与差异
| 命令 |
说明 |
:clear-register |
清空指定寄存器;不带参数时清空所有寄存器。 |
:set-register |
设置指定寄存器的内容。 |
:yank-diagnostic |
将主光标下的诊断信息复制到寄存器或剪贴板(默认剪贴板)。 |
:reset-diff-change, :diffget, :diffg |
重置光标位置的 diff 变更。 |
2.14 其他工具命令
| 命令 |
说明 |
:format, :fmt |
使用外部格式化器或语言服务器格式化文件。 |
:earlier, :ear |
向编辑历史回退。接受步数或时间跨度。 |
:later, :lat |
向编辑历史前进。接受步数或时间跨度。 |
:sort |
对选区内各行排序。 |
:reflow |
将当前选区的行按指定宽度硬折行。 |
:redraw |
清屏并重绘整个 UI。 |
:move, :mv |
将当前缓冲区及其对应文件移动到新的路径。 |
:move!, :mv! |
同上,且自动创建所需子目录。 |
:read, :r |
把文件内容读入缓冲区。 |
:echo |
将给定参数打印到状态栏。 |
:noop |
什么都不做。 |
:workspace-trust |
允许当前工作区使用语言服务器与本地配置。 |
:workspace-untrust |
撤销当前工作区的信任授权或排除标记。 |
:workspace-exclude |
将当前工作区标记为“永不询问”,不再提示信任。 |
2.15 Typable 命令的源码结构
在 helix-term/src/commands/typed.rs 中,每个 typable 命令由一个 TypableCommand 结构体描述:
pub struct TypableCommand {
pub name: &'static str,
pub aliases: &'static [&'static str],
pub doc: &'static str,
pub fun: fn(&mut compositor::Context, Args, PromptEvent) -> anyhow::Result<()>,
pub completer: CommandCompleter,
pub signature: Signature,
}
name + aliases:解释为什么 :exit 可以用 :x、:xit 简写,:write 可以用 :w 简写;
fun:命令实际执行逻辑,接受 Args(参数迭代器)与 PromptEvent。以 exit 为例(typed.rs),只有在 PromptEvent::Validate 事件时才真正执行写入与退出逻辑,Prompt 事件期间只做校验与补全;
signature:来自 helix-core/src/command_line.rs 的 Signature,声明位置参数的数量范围(positionals: (min, Some(max)))与可用标志位。以 open 为例(typed.rs)其 positionals: (1, None) 表示至少一个路径参数;
completer:CommandCompleter 支持按位置指定不同的补全器,例如 open 用 completers::filename 对每个参数做文件名补全(CommandCompleter::all),而 exit 只对第一个位置参数补全文件名(CommandCompleter::positional)。
全部命令在 TYPABLE_COMMAND_LIST 常量中集中注册,命令模式入口 command_mode 位于 typed.rs。文档表格即由该列表生成,保证与实际注册命令一致。
三、Static 命令:可直接绑键的无参命令
Static 命令不接收参数,可以绑定到任意按键,也可以通过命令面板(<space>?)模糊搜索执行。下面按功能域整理 static-cmd.md 中的全部内建静态命令。
3.1 光标移动(Normal 模式)
| 命令 |
说明 |
默认键位 |
move_char_left |
左移 |
h、<left> |
move_char_right |
右移 |
l、<right> |
move_visual_line_up |
上移一行 |
k、<up> |
move_visual_line_down |
下移一行 |
j、<down> |
move_line_up |
上移一行(按逻辑行) |
gk |
move_line_down |
下移一行(按逻辑行) |
gj |
move_next_word_start |
移到下一单词起始 |
w |
move_prev_word_start |
移到上一单词起始 |
b |
move_next_word_end |
移到下一单词结尾 |
e |
move_prev_word_end |
移到上一单词结尾 |
— |
move_next_long_word_start |
移到下一长词起始 |
W |
move_prev_long_word_start |
移到上一长词起始 |
B |
move_next_long_word_end |
移到下一长词结尾 |
E |
move_prev_long_word_end |
移到上一长词结尾 |
— |
move_next_sub_word_start |
移到下一子词起始 |
— |
move_prev_sub_word_start |
移到上一子词起始 |
— |
move_next_sub_word_end |
移到下一子词结尾 |
— |
move_prev_sub_word_end |
移到上一子词结尾 |
— |
move_parent_node_end |
移到父语法节点末尾 |
<A-e> |
move_parent_node_start |
移到父语法节点开头 |
<A-b> |
find_till_char |
移至下一字符出现处之前 |
t |
find_next_char |
移到下一字符出现处 |
f |
till_prev_char |
移至上一字符出现处之前 |
T |
find_prev_char |
移到上一字符出现处 |
F |
repeat_last_motion |
重复上一次 motion |
<A-.> |
3.2 选区扩展(Select 模式)
| 命令 |
说明 |
默认键位 |
extend_char_left / extend_char_right |
向左 / 向右扩展 |
h、<left> / l、<right> |
extend_visual_line_up / extend_visual_line_down |
向上 / 向下扩展 |
k、<up> / j、<down> |
extend_line_up / extend_line_down |
按逻辑行向上 / 向下扩展 |
gk / gj |
extend_next_word_start / extend_prev_word_start |
按单词扩展 |
w / b |
extend_next_word_end / extend_prev_word_end |
按单词结尾扩展 |
e / — |
extend_next_long_word_start / extend_prev_long_word_start |
按长词扩展 |
W / B |
extend_next_long_word_end / extend_prev_long_word_end |
按长词结尾扩展 |
E / — |
extend_next_sub_word_start / extend_prev_sub_word_start |
按子词扩展 |
— |
extend_next_sub_word_end / extend_prev_sub_word_end |
按子词结尾扩展 |
— |
extend_parent_node_end / extend_parent_node_start |
扩展到父语法节点 |
<A-e> / <A-b> |
extend_till_char / extend_next_char |
扩展到下一字符出现处 |
t / f |
extend_till_prev_char / extend_prev_char |
扩展到上一字符出现处 |
T / F |
copy_selection_on_next_line |
在下一行复制选区 |
C |
copy_selection_on_prev_line |
在上一行复制选区 |
<A-C> |
3.3 翻页与视口定位
| 命令 |
说明 |
默认键位 |
page_up |
上翻一页 |
<C-b>、<pageup>(另有 Z/z 前缀变体) |
page_down |
下翻一页 |
<C-f>、<pagedown>(另有 Z/z 前缀变体) |
half_page_up |
上翻半页 |
— |
half_page_down |
下翻半页 |
— |
page_cursor_up |
翻页并上移光标 |
— |
page_cursor_down |
翻页并下移光标 |
— |
page_cursor_half_up |
翻半页并上移光标 |
<C-u>(另有 Z/z 变体) |
page_cursor_half_down |
翻半页并下移光标 |
<C-d>(另有 Z/z 变体) |
align_view_middle |
视口居中 |
Zm、zm |
align_view_top |
视口对齐顶部 |
Zt、zt |
align_view_center |
视口居中于光标 |
Zc、Zz、zc、zz |
align_view_bottom |
视口对齐底部 |
Zb、zb |
scroll_up / scroll_down |
视口滚动(光标不动) |
Zk、zk、Z<up> / Zj、zj、Z<down> |
goto_window_top |
光标跳到视口顶部 |
gt |
goto_window_center |
光标跳到视口中间 |
gc |
goto_window_bottom |
光标跳到视口底部 |
gb |
3.4 搜索
| 命令 |
说明 |
默认键位 |
search |
正则搜索 |
/(另有 Z/、z/ 变体) |
rsearch |
反向正则搜索 |
?(另有 Z?、z? 变体) |
search_next |
选中下一个匹配 |
n(另有 Zn、zn 变体) |
search_prev |
选中上一个匹配 |
N(另有 ZN、zN 变体) |
extend_search_next |
将下一匹配追加进选区 |
Select 模式 n |
extend_search_prev |
将上一匹配追加进选区 |
Select 模式 N |
select_all |
选中整个文档 |
% |
select_regex |
在选区内选中所有正则匹配 |
s |
search_selection |
将当前选区用作搜索模式 |
<A-*> |
search_selection_detect_word_boundaries |
以选区为模式并自动加 \b 词边界 |
* |
make_search_word_bounded |
给当前搜索加上词边界 |
— |
global_search |
在工作区目录全局搜索 |
<space>/ |
split_selection |
按正则匹配拆分选区 |
S |
3.5 行选择与选区集合操作
| 命令 |
说明 |
默认键位 |
split_selection_on_newline |
按换行符拆分选区 |
<A-s> |
merge_selections |
合并所有选区 |
<A-minus> |
merge_consecutive_selections |
合并相邻选区 |
<A-_> |
extend_line |
选中当前行,已选中则按锚点扩展 |
— |
extend_line_below |
选中当前行,已选中则扩展到下一行 |
x |
extend_line_above |
选中当前行,已选中则扩展到上一行 |
— |
select_line_above |
选中当前行,按锚点扩展或收缩上一行 |
— |
select_line_below |
选中当前行,按锚点扩展或收缩下一行 |
— |
extend_to_line_bounds |
扩展选区到行边界 |
X |
shrink_to_line_bounds |
收缩选区到行边界 |
<A-x> |
delete_selection |
删除选区 |
d |
delete_selection_noyank |
删除选区但不进寄存器 |
<A-d> |
change_selection |
删除选区并进插入模式 |
c |
change_selection_noyank |
同上但不进寄存器 |
<A-c> |
collapse_selection |
将选区收缩为单个光标 |
; |
flip_selections |
翻转选区光标与锚点 |
<A-;> |
ensure_selections_forward |
确保所有选区方向向前 |
<A-:> |
trim_selections |
去除选区首尾空白 |
_ |
keep_selections |
保留匹配正则的选区 |
K |
remove_selections |
删除匹配正则的选区 |
<A-K> |
keep_primary_selection |
仅保留主选区 |
, |
remove_primary_selection |
删除主选区 |
<A-,> |
3.6 模式切换与插入
| 命令 |
说明 |
默认键位 |
insert_mode |
在选区前插入 |
i |
append_mode |
在选区后追加 |
a |
insert_at_line_start |
行首插入 |
I |
insert_at_line_end |
行尾插入 |
A |
open_below |
在选区下方新开行 |
o |
open_above |
在选区上方新开行 |
O |
normal_mode |
进入 Normal 模式 |
<esc>(Select 模式下为 v) |
select_mode |
进入 Select 模式 |
v |
exit_select_mode |
退出 Select 模式 |
Select 模式 <esc> |
command_mode |
进入命令模式 |
: |
add_newline_above |
在上方加一空行 |
[<space> |
add_newline_below |
在下方加一空行 |
]<space> |
smart_tab |
光标左侧全空白时插入 Tab,否则运行独立命令 |
Insert 模式 <tab> |
insert_tab |
插入 Tab 字符 |
Insert 模式 <S-tab> |
insert_newline |
插入换行 |
Insert 模式 <C-j>、<ret> |
insert_char_interactive |
交互地插入一个字符 |
— |
append_char_interactive |
交互地追加一个字符 |
— |
replace |
用新字符替换 |
r |
switch_case |
切换大小写 |
~ |
switch_to_uppercase |
转大写 |
<A->` |
switch_to_lowercase |
转小写 |
` |
delete_char_backward |
删除前一个字符 |
Insert 模式 <C-h>、<backspace> |
delete_char_forward |
删除后一个字符 |
Insert 模式 <C-d>、<del> |
delete_word_backward |
删除前一个单词 |
Insert 模式 <C-w>、<A-backspace> |
delete_word_forward |
删除后一个单词 |
Insert 模式 <A-d>、<A-del> |
kill_to_line_start |
删除到行首 |
Insert 模式 <C-u> |
kill_to_line_end |
删除到行尾 |
Insert 模式 <C-k> |
goto_line_start |
跳到行首 |
gh、<home> |
goto_line_end |
跳到行尾 |
gl、<end> |
goto_line_end_newline |
跳到行尾换行处 |
Insert 模式 <end> |
goto_first_nonwhitespace |
跳到行内首个非空白 |
gs |
extend_to_line_start |
扩展到行首 |
Select 模式 <home> |
extend_to_first_nonwhitespace |
扩展到首个非空白 |
— |
extend_to_line_end |
扩展到行尾 |
Select 模式 <end> |
extend_to_line_end_newline |
扩展到行尾换行处 |
— |
goto_column / extend_to_column |
跳到指定列 / 扩展到指定列 |
g| |
no_op |
什么都不做 |
— |
3.7 导航与跳转
| 命令 |
说明 |
默认键位 |
goto_file_start |
跳到第 <n> 行,否则文件开头 |
gg |
goto_file_end |
跳到文件末尾 |
— |
extend_to_file_start |
扩展到第 <n> 行,否则文件开头 |
Select 模式 gg |
extend_to_file_end |
扩展到文件末尾 |
— |
goto_file |
打开选区中的文件/URL |
gf |
goto_file_hsplit |
在水平分屏打开选区中的文件 |
<C-w>f、<space>wf |
goto_file_vsplit |
在垂直分屏打开选区中的文件 |
<C-w>F、<space>wF |
goto_last_accessed_file |
跳到最近访问的文件 |
ga |
goto_last_modified_file |
跳到最近修改的文件 |
gm |
goto_last_modification |
跳到最近一次修改位置 |
g. |
goto_line |
跳到行号 |
G |
goto_last_line |
跳到最后一行 |
ge |
extend_to_last_line |
扩展到最后一行 |
Select 模式 ge |
goto_next_buffer / goto_previous_buffer |
跳到下一个 / 上一个缓冲区 |
gn / gp |
match_brackets |
跳到匹配括号 |
mm |
goto_word / extend_to_word |
跳转到两字符标签 |
gw |
goto_next_tabstop / goto_prev_tabstop |
跳转到下一个 / 上一个 snippet 占位符 |
— |
LSP 相关跳转:
| 命令 |
说明 |
默认键位 |
goto_definition |
跳转到定义 |
gd |
goto_declaration |
跳转到声明 |
gD |
goto_type_definition |
跳转到类型定义 |
gy |
goto_implementation |
跳转到实现 |
gi |
goto_reference |
跳转到引用 |
gr |
select_references_to_symbol_under_cursor |
选中光标下符号的所有引用 |
<space>h |
诊断与变更定位:
| 命令 |
说明 |
默认键位 |
goto_first_diag |
跳到首个诊断 |
[D |
goto_last_diag |
跳到末尾诊断 |
]D |
goto_next_diag |
跳到下一个诊断 |
]d |
goto_prev_diag |
跳到上一个诊断 |
[d |
goto_next_change |
跳到下一个变更 |
]g |
goto_prev_change |
跳到上一个变更 |
[g |
goto_first_change |
跳到首个变更 |
[G |
goto_last_change |
跳到末尾变更 |
]G |
3.8 语法感知定位(tree-sitter)
| 命令 |
说明 |
默认键位 |
goto_next_function / goto_prev_function |
跳到下一个 / 上一个函数 |
]f / [f |
goto_next_class / goto_prev_class |
跳到下一个 / 上一个类型定义 |
]t / [t |
goto_next_parameter / goto_prev_parameter |
跳到下一个 / 上一个参数 |
]a / [a |
goto_next_comment / goto_prev_comment |
跳到下一个 / 上一个注释 |
]c / [c |
goto_next_test / goto_prev_test |
跳到下一个 / 上一个测试 |
]T / [T |
goto_next_xml_element / goto_prev_xml_element |
跳到下一个 / 上一个 (X)HTML 元素 |
]x / [x |
goto_next_entry / goto_prev_entry |
跳到下一个 / 上一个键值对 |
]e / [e |
goto_next_paragraph / goto_prev_paragraph |
跳到下一个 / 上一个段落 |
]p / [p |
3.9 撤销、重做与历史
| 命令 |
说明 |
默认键位 |
undo |
撤销修改 |
u |
redo |
重做修改 |
U |
earlier |
在历史中向后移动 |
<A-u> |
later |
在历史中向前移动 |
<A-U> |
commit_undo_checkpoint |
将当前修改提交为新的撤销检查点 |
Insert 模式 <C-s> |
3.10 剪切、粘贴与寄存器
| 命令 |
说明 |
默认键位 |
yank |
复制选区 |
y |
yank_to_clipboard |
复制选区到系统剪贴板 |
<space>y |
yank_main_selection_to_clipboard |
复制主选区到系统剪贴板 |
<space>Y |
yank_to_primary_clipboard |
复制到 primary 剪贴板 |
— |
yank_joined |
合并后复制选区 |
— |
yank_joined_to_clipboard |
合并后复制到系统剪贴板 |
— |
yank_joined_to_primary_clipboard |
合并后复制到 primary 剪贴板 |
— |
yank_main_selection_to_primary_clipboard |
复制主选区到 primary 剪贴板 |
— |
replace_with_yanked |
用复制的内容替换 |
R |
replace_selections_with_clipboard |
用系统剪贴板内容替换选区 |
<space>R |
replace_selections_with_primary_clipboard |
用 primary 剪贴板内容替换选区 |
— |
paste_after |
在选区后粘贴 |
p |
paste_before |
在选区前粘贴 |
P |
paste_clipboard_after |
在选区后粘贴系统剪贴板 |
<space>p |
paste_clipboard_before |
在选区前粘贴系统剪贴板 |
<space>P |
paste_primary_clipboard_after |
在选区后粘贴 primary 剪贴板 |
— |
paste_primary_clipboard_before |
在选区前粘贴 primary 剪贴板 |
— |
select_register |
选择寄存器 |
" |
insert_register |
插入寄存器内容 |
Insert 模式 <C-r> |
copy_between_registers |
在两个寄存器之间复制 |
— |
寄存器机制详见官方文档 Registers。
3.11 格式化、缩进与选区对齐
| 命令 |
说明 |
默认键位 |
indent |
缩进选区 |
<gt>(>) |
unindent |
反缩进选区 |
<lt>(<) |
format_selections |
格式化选区 |
= |
join_selections |
合并选区内各行 |
J |
join_selections_space |
合并选区内各行并选中空格 |
<A-J> |
align_selections |
将选区按列对齐 |
& |
increment |
增加光标下的数值/项 |
<C-a> |
decrement |
减少光标下的数值/项 |
<C-x> |
toggle_comments |
切换注释 |
<C-c>、<space>c |
toggle_line_comments |
行注释开关 |
<space><A-c> |
toggle_block_comments |
块注释开关 |
<space>C |
3.12 选区旋转与语法树选择
| 命令 |
说明 |
默认键位 |
rotate_selections_forward |
前向旋转选区 |
) |
rotate_selections_backward |
后向旋转选区 |
( |
rotate_selection_contents_forward |
前向旋转选区内容 |
<A-)> |
rotate_selection_contents_backward |
后向旋转选区内容 |
<A-(> |
reverse_selection_contents |
反转选区内容 |
— |
rotate_selections_first |
将第一个选区设为主选区 |
— |
rotate_selections_last |
将最后一个选区设为主选区 |
— |
expand_selection |
将选区扩展到父语法节点 |
<A-o>、<A-up> |
shrink_selection |
将选区收缩到上一步扩展前的节点 |
<A-i>、<A-down> |
select_next_sibling |
选中语法树中的下一个兄弟节点 |
<A-n>、<A-right> |
select_prev_sibling |
选中语法树中的上一个兄弟节点 |
<A-p>、<A-left> |
select_all_siblings |
选中当前节点的所有兄弟 |
<A-a> |
select_all_children |
选中当前节点的所有子节点 |
<A-I>、<S-A-down> |
3.13 跳转列表与分屏操作
| 命令 |
说明 |
默认键位 |
jump_forward |
在跳转列表中前进 |
<C-i>、<tab> |
jump_backward |
在跳转列表中后退 |
<C-o> |
save_selection |
将当前选区存入跳转列表 |
<C-s> |
jump_view_right / jump_view_left |
跳到右侧 / 左侧分屏 |
<C-w>l 系列 / <C-w>h 系列 |
jump_view_up / jump_view_down |
跳到上方 / 下方分屏 |
<C-w>k 系列 / <C-w>j 系列 |
swap_view_right / swap_view_left |
与右侧 / 左侧分屏交换 |
<C-w>L 系列 / <C-w>H 系列 |
swap_view_up / swap_view_down |
与上方 / 下方分屏交换 |
<C-w>K 系列 / <C-w>J 系列 |
transpose_view |
交换(转置)分屏布局 |
<C-w>t、<space>wt 等 |
rotate_view |
转到下一个窗口 |
<C-w>w、<space>ww 等 |
rotate_view_reverse |
转到上一个窗口 |
— |
hsplit |
水平向下分屏 |
<C-w>s、<space>ws 等 |
hsplit_new |
水平分屏并打开 scratch 缓冲区 |
<C-w>ns 系列 |
vsplit |
垂直向右分屏 |
<C-w>v、<space>wv 等 |
vsplit_new |
垂直分屏并打开 scratch 缓冲区 |
<C-w>nv 系列 |
wclose |
关闭窗口 |
<C-w>q 系列 |
wonly |
只保留当前窗口 |
<C-w>o 系列 |
注意 <C-w> 与 <space>w 两套前缀并存:前者是 Vim 习惯键位,后者是 Helix 默认 <space> 前缀体系下的等价写法,两者可任选一套肌肉记忆。
3.14 文本对象与 Surround
| 命令 |
说明 |
默认键位 |
select_textobject_around |
选择外部文本对象 |
ma |
select_textobject_inner |
选择内部文本对象 |
mi |
surround_add |
添加 surrounding |
ms |
surround_replace |
替换 surrounding |
mr |
surround_delete |
删除 surrounding |
md |
3.15 Pickers 与 LSP 辅助
| 命令 |
说明 |
默认键位 |
file_picker |
打开文件选择器 |
<space>f |
file_picker_in_current_buffer_directory |
在当前缓冲区所在目录打开文件选择器 |
— |
file_picker_in_current_directory |
在当前工作目录打开文件选择器 |
<space>F |
file_explorer |
在工作区根目录打开文件浏览器 |
<space>e |
file_explorer_in_current_buffer_directory |
在当前缓冲区目录打开浏览器 |
<space>. |
file_explorer_in_current_directory |
在当前工作目录打开浏览器 |
— |
buffer_picker |
打开缓冲区选择器 |
<space>b |
jumplist_picker |
打开跳转列表选择器 |
<space>j |
symbol_picker |
打开符号选择器 |
— |
syntax_symbol_picker |
基于语法信息打开符号选择器 |
— |
lsp_or_syntax_symbol_picker |
基于 LSP 或语法信息打开符号选择器 |
<space>s |
workspace_symbol_picker |
打开工作区符号选择器 |
— |
syntax_workspace_symbol_picker |
基于语法信息打开工作区符号选择器 |
— |
lsp_or_syntax_workspace_symbol_picker |
基于 LSP 或语法信息打开工作区符号选择器 |
<space>S |
changed_file_picker |
打开变更文件选择器 |
<space>g |
diagnostics_picker |
打开诊断选择器 |
<space>d |
workspace_diagnostics_picker |
打开工作区诊断选择器 |
<space>D |
last_picker |
重新打开上一次的 picker |
<space>' |
code_action |
执行 LSP code action |
<space>a |
signature_help |
显示签名帮助 |
— |
completion |
唤起补全弹窗 |
Insert 模式 <C-x> |
hover |
显示光标下条目的文档 |
<space>k |
rename_symbol |
重命名符号 |
<space>r |
3.16 DAP 调试
| 命令 |
说明 |
默认键位 |
dap_launch |
启动调试目标 |
<space>Gl |
dap_restart |
重启调试会话 |
<space>Gr |
dap_toggle_breakpoint |
切换断点 |
<space>Gb |
dap_continue |
继续执行 |
<space>Gc |
dap_pause |
暂停执行 |
<space>Gh |
dap_step_in |
单步进入 |
<space>Gi |
dap_step_out |
单步跳出 |
<space>Go |
dap_next |
单步跨过 |
<space>Gn |
dap_variables |
列出变量 |
<space>Gv |
dap_terminate |
结束调试会话 |
<space>Gt |
dap_edit_condition |
编辑当前行断点条件 |
<space>G<C-c> |
dap_edit_log |
编辑当前行断点日志消息 |
<space>G<C-l> |
dap_switch_thread |
切换当前线程 |
<space>Gst |
dap_switch_stack_frame |
切换栈帧 |
<space>Gsf |
dap_enable_exceptions |
启用异常断点 |
<space>Ge |
dap_disable_exceptions |
禁用异常断点 |
<space>GE |
3.17 Shell 集成、宏与其他
| 命令 |
说明 |
默认键位 |
shell_pipe |
将选区通过 shell 命令管道处理 |
| |
shell_pipe_to |
将选区送入 shell 命令并忽略输出 |
<A-|> |
shell_insert_output |
将 shell 命令输出插入选区之前 |
! |
shell_append_output |
将 shell 命令输出追加到选区之后 |
<A-!> |
shell_keep_pipe |
用 shell 谓词过滤选区 |
$ |
suspend |
挂起编辑器返回 shell |
<C-z> |
record_macro |
录制宏 |
Q |
replay_macro |
重放宏 |
q |
command_palette |
打开命令面板 |
<space>? |
四、命令面板 <space>? 的源码实现
Commands 文档提到 Static 命令可以从命令面板(<space>?)执行。其实现位于 command_palette:
- 通过
compositor.find::<ui::EditorView>() 取得当前视图的 keymap,并构建 reverse_map()——一张“命令名 → 键位序列”的反查表;
- 候选列表是
MappableCommand::STATIC_COMMAND_LIST 与 typed::TYPABLE_COMMAND_LIST(每条 typable 命令包装为不带参数的 Typable 变体)的并集,即两类命令都可以在面板中搜索到;
- 面板列包含命令名(typable 命令自动显示为
:name 形式)、由反向键位表填充的“默认键位”列以及文档描述列;
- 选中后以
MappableCommand::execute 执行。对 Static 变体直接调用其函数指针;对 Typable 变体则在 MappableCommand::execute 中查出 TYPABLE_COMMAND_MAP 中的命令,以固定 args 调用 typed::execute_command,错误则通过 cx.editor.set_error 展示。
也就是说,命令面板本质上是“全量命令注册表 + 反向键位索引”的模糊搜索视图,这也是为什么文档表格与面板中看到的命令总是同步的。
五、Static 命令的注册机制
静态命令由宏统一注册。在 helix-term/src/commands.rs 中:
macro_rules! static_commands {
( $($name:ident, $doc:literal,)* ) => {
$(
#[allow(non_upper_case_globals)]
pub const $name: Self = Self::Static {
name: stringify!($name),
fun: $name,
doc: $doc
};
)*
pub const STATIC_COMMAND_LIST: &'static [Self] = &[
$( Self::$name, )*
];
}
}
每个静态命令是一个 fn(&mut Context) 函数指针,名字即 MappableCommand 的 name,因此可以直接在配置文件中按键名引用。按键解析发生在 helix-term/src/keymap.rs:keymap 采用 KeyTrie 树结构,其中 KeyTrie::MappableCommand 节点承载命令,字符串键位(如 "gd"、"<space>wl")可解析为单个命令或命令序列(KeyTrie::Sequence),序列即多个命令的组合执行。
六、将命令绑定到自定义键位
由于两类命令都有稳定且唯一的命令名,重映射只需在用户配置 keys.toml 中按模式名引用命令名即可,例如:
normal = { "g" = { "d" = "goto_definition", "D" = "goto_declaration" } }
select = { "x" = "extend_line_below" }
更多键位语法(序列、计数、标志键等)与完整重映射规则,参见官方文档 Remappings 与 Keymap。命令行交互(参数提示、补全行为)的细节见 Command line。
七、小结