首页
/ Helix 命令系统全解:Typable 命令、Static 命令与命令面板

Helix 命令系统全解:Typable 命令、Static 命令与命令面板

2026-09-05 18:20:46作者:宣聪麟

本文围绕 Helix 官方文档 Commands 展开,完整梳理 Helix 的两类内建命令体系——可在命令模式(按 : 激活)中输入、可带参数的 Typable 命令,以及不接收参数、可直接绑定到按键的 Static 命令。文中不仅完整继承并分类整理了官方生成的全部命令清单(typable-cmd.mdstatic-cmd.md),还结合 helix-term/src/commands.rshelix-term/src/commands/typed.rs 的源码结构,讲清命令注册、补全、参数签名与命令面板的底层实现,帮助你在实际使用中快速定位命令、理解参数语义,并基于源码进行按键重映射。

一、Helix 的两大类命令

Helix 把编辑器命令分为两个互不重叠的类别,Commands 文档也是按此二分法组织的:

维度 Typable 命令 Static 命令
调用方式 命令模式(按 : 输入) 直接绑定按键,或命令面板(<space>?
是否接收参数 是(位置参数、别名、标志位) 否(固定行为)
源码注册位置 TYPABLE_COMMAND_LIST STATIC_COMMAND_LIST
对应生成文档 book/src/generated/typable-cmd.md book/src/generated/static-cmd.md

从源码看,两类命令最终都被统一进同一个枚举 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.rsexit 函数展示了典型的参数处理模式:若文档 is_modified(),先调用 write_impl 执行落盘,再执行 quit! 变体(force_exit)的差异仅在于 WriteOptions.force = true。此外写入类命令还定义了 --no-format / --no-code-actions 之类的标志位(WRITE_NO_FORMAT_FLAGWRITE_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 设置文档默认行尾。可选值:crlflf
: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,
    // params, flags, helper, completer
    pub fun: fn(&mut compositor::Context, Args, PromptEvent) -> anyhow::Result<()>,
    /// What completion methods, if any, does this command have?
    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.rsSignature,声明位置参数的数量范围(positionals: (min, Some(max)))与可用标志位。以 open 为例(typed.rs)其 positionals: (1, None) 表示至少一个路径参数;
  • completerCommandCompleter 支持按位置指定不同的补全器,例如 opencompleters::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 视口居中 Zmzm
align_view_top 视口对齐顶部 Ztzt
align_view_center 视口居中于光标 ZcZzzczz
align_view_bottom 视口对齐底部 Zbzb
scroll_up / scroll_down 视口滚动(光标不动) ZkzkZ<up> / ZjzjZ<down>
goto_window_top 光标跳到视口顶部 gt
goto_window_center 光标跳到视口中间 gc
goto_window_bottom 光标跳到视口底部 gb

3.4 搜索

命令 说明 默认键位
search 正则搜索 /(另有 Z/z/ 变体)
rsearch 反向正则搜索 ?(另有 Z?z? 变体)
search_next 选中下一个匹配 n(另有 Znzn 变体)
search_prev 选中上一个匹配 N(另有 ZNzN 变体)
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

  1. 通过 compositor.find::<ui::EditorView>() 取得当前视图的 keymap,并构建 reverse_map()——一张“命令名 → 键位序列”的反查表;
  2. 候选列表是 MappableCommand::STATIC_COMMAND_LISTtyped::TYPABLE_COMMAND_LIST(每条 typable 命令包装为不带参数的 Typable 变体)的并集,即两类命令都可以在面板中搜索到;
  3. 面板列包含命令名(typable 命令自动显示为 :name 形式)、由反向键位表填充的“默认键位”列以及文档描述列;
  4. 选中后以 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) 函数指针,名字即 MappableCommandname,因此可以直接在配置文件中按键名引用。按键解析发生在 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" }

更多键位语法(序列、计数、标志键等)与完整重映射规则,参见官方文档 RemappingsKeymap。命令行交互(参数提示、补全行为)的细节见 Command line

七、小结

  • Helix 的命令体系二分法清晰:Typable 命令面向命令模式,带参数、带别名、带补全与标志位,注册在 TYPABLE_COMMAND_LISTStatic 命令无参、可直接绑键,由 static_commands! 宏注册进 STATIC_COMMAND_LISTcommands.rs)。
  • 两类命令统一进 MappableCommand 枚举后,既能按键执行、也能在命令面板 <space>?command_palette)中搜索执行,面板还反向索引出每个命令的默认键位。
  • 官方文档 Commands 中的两张命令表由源码注册列表生成(typable-cmd.mdstatic-cmd.md),与实现严格一致,是查询命令能力的最可靠依据。
  • 掌握这套命名体系后,日常编辑(移动/选区/搜索/粘贴)、LSP 工作流(gd/gr/<space>s)、调试(<space>G*)与 shell 集成(\|!$)都可以只靠命令名完成个性化键位定制。
登录后查看全文
热门项目推荐
相关项目推荐