【推荐】后现代风格文本编辑器-Helix
Helix简介
Helix编辑器是类似 Vim操作模式的终端文本编辑器。其具有类似Vim一样的简洁和高效的编辑方式,而且针对命令模式的交互进行了优化,参考了NeoVim和kakoune两款编辑器,注重文本选择与模块集成,能够实现开箱即用。
我之所以会关注到Helix,主要原因是Vim或者Neovim的编辑环境配置非常依赖github的各种仓库,而国内糟糕的网络环境给配置和升级编辑环境带来很多烦恼。在多次搜寻过程中,发现helix是可以满足开箱即用,且有优秀的命令模式交互界面,极大改善用户的使用体验。
Helix编辑器最明显的一个问题就是没有插件系统,这对于那些喜欢自己定制编辑器环境的朋友来说,不是那么友好,可玩性不高。官方确实有考虑做一个插件系统,但是优先要做的是Helix默认集成的特性已经足够好了,选择插件扩展目前优先级不是那么高。参见讨论
而那些愿意使用Helix的用户,肯定是希望不折腾的用户,默认内置的优秀功能应对一些开发环境已经足够。而且Helix运行的足够快,喜欢用终端来处理文档的用户基本不会在编辑速度上遇到问题。
本篇主要基于Helix的官方文档,介绍Helix编辑器的基本理念和使用方法,文章内容不会根据官方文档持续更新,希望关注Helix的用户可以跟踪官方网站与Github仓库
! Helix是Rust编写,属于后现代风格编辑器 ^_^
相关链接
Helix 安装
Linux平台
Linux平台上基本需要依赖每个发行版的维护,目前Helix已经支持主流的各大Linux发行版
Ubuntu
配置Helix的ppa
sudo add-apt-repository ppa:maveonair/helix-editor
sudo apt update
sudo apt install helix
Fedora/RHEL
使用dnf直接安装
sudo dnf install helix
Arch Linux extra
使用pacman 直接安装
sudo pacman -S helix
NixOS
Helix已经在nixpkgs中,非稳定频道通常能获得最新发布版本
Helix也可以在flake中获得,使用nix develop
登录开发者终端。每个提到Master的push会用Cachix缓存。 flake配置为自动使用缓存,假设用户接受最新的第一个设置。
如果你不使用flakes,可以用 cachix 来安装配置Helix cachix use helix
。
Flatpak
Helix 可以在 Flathub获取:
flatpak install flathub com.helix_editor.Helix
flatpak run com.helix_editor.Helix
Snap
Helix 可以在 Snapcraft 获取:
snap install --classic helix
Helix会安装到 /snap/bin/helix
和 /snap/bin/hx
, 请确保 /snap/bin
在你的PATH
中.
AppImage
Helix 可以在Linux中安装 AppImage 的镜像.
下载 Helix AppImage latest releases .
chmod +x helix-*.AppImage # change permission for executable mode
./helix-*.AppImage # run helix
macOS系统
Homebrew Core
brew install helix
MacPorts
port install helix
Windows
由于目前没有GUI工具,Helix在Windows上安装需要用到终端工具, Winget, Scoop, Chocolatey或 MSYS2.
Winget
Windows包管理器winget是 Windows 11 和 Windows 10 的应用安装程序。可以在 微软应用商店获得。
winget install Helix.Helix
Scoop
scoop install helix
Chocolatey
choco install helix
MSYS2
Windows 8.1 64位以上的版本:
pacman -S mingw-w64-ucrt-x86_64-helix
源码编译安装
准备工作:
从HelixGithub仓库克隆代码,本文中假设用户克隆到Linux/MacOs的~/src/
或者Windows的%userprofile%\src\
。
主要依赖的工具:
如果你使用musl-libc
标准库,务必确保tree-sitter在编译时正确加载。
配置RUST编译参数:
RUSTFLAGS="-C target-feature=-crt-static"
-
克隆代码:
git clone https://github.com/helix-editor/helix cd helix
-
编译构建:
cargo install --path helix-term --locked
上述命令执行完成后会得到
hx
可执行文件和在本地runtime
目录中的tree-sitter的语法文件
💡 Tree-sitter 语法库可以在线获取和编译,利用
hx --grammar fetch
可以获得语法库,利用hx --grammar build
可以编译这些语法库
它们会被部署到用户的runtime
目录,runtime
目录的配置可参见下文
配置 Helix的runtime文件
Linux 和 macOS
runtime目录位于Helix源码目录中,可以设置环境变量HELIX_RUNTIME
指向该路径。你可以设置这个环境变量到~/.bashrc
等配置中:
HELIX_RUNTIME=~/src/helix/runtime
或者也可以创建软链接
ln -Ts $PWD/runtime ~/.config/helix/runtime
Windows平台
- 可以利用Windows工具设置
HELIX_RUNTIME
环境变量 - 可以在命令提示符中使用
setx
setx HELIX_RUNTIME "%userprofile%\helix的runtime路径"
💡
%userprofile%
是你的用户目录地址类似与C:\Users\用户名\
。
在%appdata%\helix\
创建指向源码中runtime目录的链接:
方法 | 命令 |
---|---|
PowerShell | New-Item -ItemType Junction -Target "runtime" -Path "$Env:AppData\helix\runtime" |
Cmd | cd %appdata%\helix mklink /D runtime "%userprofile%\src\helix\runtime" |
💡 在Windows中,创建一个符号链接需要获得Adminstrator权限来运行PowerShell或者Cmd
多重runtime目录
当Helix发现有多重runtime目录,会按照以下顺序来检索
$CARGO_MANIFEST_DIR
目录下的runtime
(这个为了开发调试Helix)- 操作系统中用户配置目录下的
runtime/
$HELIX_RUNTIME
- 在编译时期设置的
HELIX_DEFAULT_RUNTIME
环境变量,其中配置了发行版指定路径 - Helix可执行文件路径下的
runtime/
顺序优先级的设定会在多个路径下发现重复名称目录的情况下生效。
安装后的验证
Helix提供了一个健康检查工具,可以在安装后对状态进行检查:
hx --health
Helix 使用
Helix 内置了交互式的教程,可以通过命令
hx --tutor
或者:totur
打开教程。文章后续会基于tutor进行总结介绍
熟练使用vim的用户,可以参考:从Vim迁移到Kakoune
Helix 基本操作
Helix与Vim编辑器类似,具有多种编辑模式。但Helix能够提供命令提示界面,有助于用户便捷使用。对于一些常见操作,Helix还可以进行命令检索,极大的方便了使用者。
下面展开介绍Helix的集中模式
普通模式
普通模式是进入Helix后默认模式,这种模式下的按键输入都是指令。你可以通过 Escape
从其他模式进入普通模式。
下面介绍普通模式下的指令:
移动
注意:与Vim不同,
f
,F
,t
和T
并不受限于当前行。
按键 | 描述 | 命令 |
---|---|---|
h , Left |
向左移动(left:左按键) | move_char_left |
j , Down |
向下移动(Down:下按键) | move_visual_line_down |
k , Up |
向上移动(Up:上按键) | move_visual_line_up |
l , Right |
向右移动(Right:右按键) | move_char_right |
w |
移动到下一个字的开始 | move_next_word_start |
b |
移动到上一个字的开始 | move_prev_word_start |
e |
移动到下一个字的结尾 | move_next_word_end |
W |
移动到下一个词的开始 | move_next_long_word_start |
B |
移动到上一个词的开始 | move_prev_long_word_start |
E |
移动到下一个词的结束 | move_next_long_word_end |
t |
当前位置开始向后直到搜索到字符前 | find_till_char |
f |
当前位置开始向后直到搜索到字符 | find_next_char |
T |
当前位置开始向前直到搜索到字符前 | till_prev_char |
F |
当前位置开始向前直到搜索到字符 | find_prev_char |
G |
跳转到第n行(nG ) |
goto_line |
Alt-. |
重复上一条指令(f , t or 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 |
跳转到jumplist前一项 | jump_forward |
Ctrl-o |
跳转到jumplist后一项 | jump_backward |
Ctrl-s |
保存当前位置到jumplist | 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命令中,用输出结果替换所选区域 | shell_pipe |
"Alt-|" |
利用管道将所选区域导入shell命令中,忽略输出结果 | shell_pipe_to |
"!" |
执行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-minus |
合并所选区域(当进入分割选择时,使用此操作回到单度选择) | merge_selections |
Alt-_ |
合并连续的选择 | merge_consecutive_selections |
& |
选择区域内列对齐 | align_selections |
_ |
选择区域内去除空格 | trim_selections |
; |
取消当前区域选择回到一个光标上继续开始选择 | collapse_selection |
Alt-; |
所选区域的光标前后转换 | flip_selections |
Alt-: |
确保选择区域是前进方向 | ensure_selections_forward |
, |
多个光标选择状态时,只保留主光标 | keep_primary_selection |
Alt-, |
移除一个选择区域Remove the primary selection | 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 |
扩展选择到本行边界(行范围选择) | extend_to_line_bounds |
Alt-x |
缩小选择区域到行边界(行范围选择)Shrink selection to line bounds (line-wise selection) | 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 |
根据语法节点扩展所选区域 | expand_selection |
Alt-i , Alt-down |
根据语法节点缩小所选区域 | shrink_selection |
Alt-p , Alt-left |
根据语法节点选择前一个语法区域 | select_prev_sibling |
Alt-n , Alt-right |
根据语法节点选择前一个语法区域 | select_next_sibling |
搜索
搜索命令都会默认操作寄存器/
. 可以使用"<char>
选择其他寄存器。
按键 | 描述 | 命令 |
---|---|---|
/ |
向后搜索一个正则表达式 | search |
? |
向前搜索一个正则表达式 | rsearch |
n |
选择下一个匹配 | search_next |
N |
选择上一个匹配 | search_prev |
* |
使用当前的选择作为搜索表达式 | search_selection |
轻模式
在普通模式下有一些子模式,可以在普通模式下使用按键进入子模式。
按键 | 描述 | 命令 |
---|---|---|
v |
进入选择模式 | select_mode |
g |
进入跳转模式 | N/A |
m |
进入匹配模式 | N/A |
: |
进入命令模式 | command_mode |
z |
进入视图模式 | N/A |
Z |
进入并保持视图模式 | N/A |
Ctrl-w |
进入窗口模式 | N/A |
Space |
进入空格模式 | N/A |
这些模式(除了命令模式)可以在这里配置:快捷键重映射.
视图模式
在普通模式下通过按键z
进入。
视图模式可以在不改变选择的情况下操作当前视图上下翻页。通过Z
可以一直保持在视图模式中,通过Escape
键退出。
当你只是想翻看前后文本时比较有用。
按键 | 描述 | 命令 |
---|---|---|
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 |
跳转模式
在普通模式下通过按键g
进入。
跳转各种位置
按键 | 描述 | 命令 |
---|---|---|
g |
默认跳转到第一行,或者是第n行:<n>gg |
goto_file_start |
e |
跳转到最后一行 | goto_last_line |
f |
跳转所选择的文件 | 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 |
j |
向下移动文本行(而不是可视行) | move_line_down |
k |
向上移动文本行(而不是可视行) | move_line_up |
匹配模式
在普通模式下通过按键m
进入。
按键 | 描述 | 命令 |
---|---|---|
m |
跳转到配对的符号 | match_brackets |
s <char> |
用一个字符来环绕所选文本 | surround_add |
r <from><to> |
用<to> 字符替换<from> 字符 |
surround_replace |
d <char> |
删除环绕字符 | surround_delete |
a <object> |
选择当前区域的环绕内容,包括环绕字符 | select_textobject_around |
i <object> |
选择当前区域的环绕内容,不包括环绕字符 | select_textobject_inner |
窗口模式
在普通模式下通过按键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 |
交换窗口到左边 | swap_view_left |
J |
交换窗口到下边 | swap_view_down |
K |
交换窗口到上边 | swap_view_up |
L |
交换窗口到右边 | swap_view_right |
空格模式
在普通模式下通过按键Space
进入。
整个模式是一堆映射,大部分是选择器。
按键 | 描述 | 命令 |
---|---|---|
f |
打开一个文件选择器 | file_picker |
F |
在当前目录下打开文件选择器 | file_picker_in_current_directory |
b |
打开缓冲选择器 | buffer_picker |
j |
打开跳转列表选择器 | jumplist_picker |
g |
调试模式(实验阶段) | N/A |
k |
在当前位置利用弹窗显示语法文档 | hover |
s |
打开文档符号选择器(LSP) | symbol_picker |
S |
打开工程符号选择器(LSP) | workspace_symbol_picker |
d |
打开文档诊断信息选择器(LSP) | diagnostics_picker |
D |
打开工程诊断信息选择器(LSP) | workspace_diagnostics_picker |
r |
重命名符号(LSP) | rename_symbol |
a |
应用代码行为(LSP) | code_action |
h |
选择符号引用(LSP) | select_references_to_symbol_under_cursor |
' |
打开一个混合选择器 | last_picker |
w |
进入窗口模式 | N/A |
p |
粘贴粘贴板内容到当前位置到后面 | paste_clipboard_after |
P |
粘贴粘贴板内容到当前位置到前面 | paste_clipboard_before |
y |
将拉取内容复制到粘贴板 | yank_to_clipboard |
Y |
将拉取的主内容复制到粘贴板,在多选时只选择一个 | yank_main_selection_to_clipboard |
R |
用粘贴板到内容替代所选区域 | replace_selections_with_clipboard |
/ |
在工程目录下全局搜索 | global_search |
? |
打开一个命令面板 | command_palette |
💡 全局搜索在一个混合选择器中显示结果,使用
Space + '
可以跳转回搜索结果。
弹窗
在当前光标下显示文档
按键 | 描述 |
---|---|
Ctrl-u |
向上翻页 |
Ctrl-d |
向下翻页 |
插入模式
在普通模式下通过按键i
进入。
插入模式的绑定默认是最少的。Helix是一种模式化编辑器,模式化体现在Helix的用户体验和内在机制中。
文本的修改记录只有在编辑模式进入到普通模式时,才会保存到undo的检查点中。
💡 极力推荐新用户学习模式操作,这会带来丝滑的体验
按键 | 描述 | 命令 |
---|---|---|
Escape |
切换到普通模式 | normal_mode |
Ctrl-s |
提交到undo检查点 | 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 , Shift-Backspace |
向后删除一个字符 | delete_char_backward |
Ctrl-d , Delete |
向前删除一个字符 | delete_char_forward |
Ctrl-j , Enter |
插入一个新行 | insert_newline |
These keys are not recommended, but are included for new users less familiar
with modal editors.
以下快捷键不推荐使用,作为新手熟悉模式化编辑器的过度
按键 | 描述 | 命令 |
---|---|---|
Up |
移动到上一行 | move_line_up |
Down |
移动到下一行 | move_line_down |
Left |
向左边移动 | move_char_left |
Right |
向右边移动 | move_char_right |
PageUp |
向上翻页 | page_up |
PageDown |
向下翻页 | page_down |
Home |
移动到本行开始 | goto_line_start |
End |
移动到本行结束 | goto_line_end_newline |
如果你希望更加适应模式编辑,你可以在配置文件config.toml
中禁用这些按键
[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"
选择模式
在普通模式下通过按键v
进入。
选择模式是普通模式的另一种表现形式,不过大部分操作是去选择,而不是替代。
跳转模式在选择模式下也是一种区域扩展。例如vgl
,是扩展到本行末尾
搜索也被选择模式所影响。默认的, n
and N
会跳转到下一个或上一个搜索项
,搜索过程中进入选择模式,在跳转时这些搜索项就会保持选择状态,后续就可以批量操作。
选择器
以下按键是选择器快捷键,暂时不支持修改
按键 | 描述 |
---|---|
Shift-Tab , Up , Ctrl-p |
前一个选项 |
Tab , Down , Ctrl-n |
下一个选项 |
PageUp , Ctrl-u |
向上翻页 |
PageDown , Ctrl-d |
向下翻页 |
Home |
跳到第一个选项 |
End |
跳到最后一个选项 |
Enter |
打开所选择的 |
Alt-Enter |
在后台打开所选择的,不关闭当前选择器 |
Ctrl-s |
水平分割打开 |
Ctrl-v |
垂直分割打开 |
Ctrl-t |
切换预览 |
Escape , Ctrl-c |
关闭选择器 |
提示
以下案件是提示快捷键,暂时不支持修改
按键 | 描述 |
---|---|
Escape , Ctrl-c |
关闭提示 |
Alt-b , Ctrl-Left |
向后移动一个词 |
Ctrl-b , Left |
向后移动一个字符 |
Alt-f , Ctrl-Right |
向前移动一个字 |
Ctrl-f , Right |
向前移动一个字符 |
Ctrl-e , End |
移动到提示最后 |
Ctrl-a , Home |
移动到提示最前 |
Ctrl-w , Alt-Backspace , Ctrl-Backspace |
删除前面一个词 |
Alt-d , Alt-Delete , Ctrl-Delete |
删除后一个词 |
Ctrl-u |
删除到行开头 |
Ctrl-k |
删除到行结尾 |
Backspace , Ctrl-h , Shift-Backspace |
删除前一个字符 |
Delete , Ctrl-d |
删除后一个字符 |
Ctrl-s |
在文档光标处插入,后续可能修改 |
Ctrl-p , Up |
选择前一个历史记录 |
Ctrl-n , Down |
选择后一个历史记录 |
Ctrl-r |
在插入处插入一个寄存器的内容 |
Tab |
选择下一个提示项 |
BackTab |
选择上一个提示项 |
Enter |
打开选择项 |
Helix特色操作
Helix区别Vim的一个使用的特点是先选择后操作,例如可以通过w
选择一个单词,然后再用d
删除这个单词。对于Vim的操作,可能就需要dw
来实现。
Helix内置了几个比较实用的功能,这些功能在Vim中需要安装插件实现。
环绕功能
这个功能类似与vim-surround,快捷键参考了vim-sandwich。
按键序列 (在选择文本之后使用) | 行为 |
---|---|
ms<char> |
对于所选择的文本添加环绕字符 |
mr<char_to_replace><new_char> |
替换最内层的环绕字符 |
md<char_to_delete> |
删除最内层的环绕字符 |
你可以用计数来选择外层符号对。例如:[[[abc]]]
,可以将光标移动到abc中任一个字符上,按下2mr[(
,实现将第二层的[]替换为():[([abc])]
。
环绕操作可以用在多重选择,例如想要将每个(use)
替换成[use]
,可以如下操作:
%
来选择整个文件s
来用检索词分割选择的区域- 输入
use
后按下回车 mr([
利用环绕操作替换
多重符号目前还没有支持,未来有计划实现。
使用文本对象进行文本选择和操作
Helix可以使用文本对象进行选择和操作结构化的文本片段。你可以用这个功能对特定文本结构进行操作,例如一个单词,句子,段落,甚至一个函数或一块代码。
可以增加git图像
ma
选择整个块mi
选择块的内部
当执行ma
或mi
后,可以选择下面操作进行多种文本对象的选择
操作 | 含义 |
---|---|
w |
字(按照单个字进行跳转) |
W |
词(按照用空格分割的词进行跳转,eg.tree-sitter) |
p |
段落(按照空行来分割的文本段) |
( , [ , ' , etc. |
字符(指定的环绕字符) |
m |
最内层的字符(也可用数字来指定最内的n层,参考上文例子) |
f |
函数 |
t |
类型定义或类定义 |
a |
参数或变量 |
c |
注释 |
T |
测试 |
💡
f
,t
等需要基于tree-sitter语法分析当前文件才能正常工作。目前已经支持的语言参见支持语言。
欢迎社区积极贡献
在tree-sitter的文本对象之间跳转
想要在不同的函数,类,参数以及其他元素之间跳转,需要依赖tree-sitter的文本对象。可以使用]f
跳转到下一个函数块,使用[t
跳转到下一个类型,等等。
Unimpaired
所有的跳转类型汇总,参考vim-unimpaired
按键 | 描述 | 命令 |
---|---|---|
]d |
下一个报错位置 (LSP) | goto_next_diag |
[d |
上一个报错位置 (LSP) | goto_prev_diag |
]D |
最后一个报错位置(LSP) | goto_last_diag |
[D |
第一个报错位置 (LSP) | goto_first_diag |
]f |
下一个函数(TS) | goto_next_function |
[f |
前一个函数 (TS) | goto_prev_function |
]t |
下一个类型定义(TS) | goto_next_class |
[t |
前一个类型定义 (TS) | goto_prev_class |
]a |
下一个参数/变量(TS) | goto_next_parameter |
[a |
前一个参数/变量(TS) | goto_prev_parameter |
]c |
下一个注释(TS) | goto_next_comment |
[c |
前一个注释(TS) | goto_prev_comment |
]T |
下一个测试(TS) | goto_next_test |
[T |
前一个测试 (TS) | goto_prev_test |
]p |
下一个段落 | goto_next_paragraph |
[p |
前一个段落 | goto_prev_paragraph |
]g |
下一个变更 | goto_next_change |
[g |
前一个变更 | goto_prev_change |
]G |
最后一个变更 | goto_last_change |
[G |
第一个变更 | goto_first_change |
]Space |
在下面增加一行 | add_newline_below |
[Space |
在上面增加一行 | add_newline_above |
语法感知动作的移动
以下操作可根据语法感知选择的移动,利用解析后的语法树进行选择。
按键 | 操作含义 |
---|---|
Alt-o /Alt-↑ |
扩展语法区域 |
Alt-i /Alt-↓ |
缩小语法区域 |
Alt-n /Alt-→ |
选择下一个语法区域 |
Alt-p /Alt-← |
选择前一个语法区域 |
通过:tree-sitter-subtree
命令,可以显示解析后的语法树
func(arg1, arg2, arg3)
会解析为类似:
(call
function: (identifier) ; func
arguments:
(arguments ; (arg1, arg2, arg3)
(identifier) ; arg1
(identifier) ; arg2
(identifier))) ; arg3
如果当前选择了arg1:
- 当你使用
Alt-n
时,会选择到arg2; - 当你使用
Alt-o
时,选择区域会扩张到func的所有参数:func([arg1,arg2,arg3])
以此类推其他操作。
寄存器
用户定义的寄存器
寄存器是存储空间,用来存放文本或者其他数据(例如搜索结果)。寄存器可以用来剪切,复制,粘贴文本,或者通过粘贴板与其他编辑器交流。
Helix允许用户自己定义寄存器的名字,如:
"ay
复制当前选择到寄存器a中"op
粘贴寄存器o中的内容至当前位置后方
如果寄存器选择时后跟上修改或者删除的指令,所选区域会被存储到寄存器中,并继续执行输入的指令,如:
"hc
存储到寄存器h中,并在所选区域开始编辑"md
存储到寄存器m中,并删除所选区域
默认寄存器
helix内置的命令会使用寄存器,例如复制(y
),使用默认寄存器不需要指定。
寄存器符号 | 内容 |
---|---|
/ |
最后一次的搜索 |
: |
最后执行的命令 |
" |
最后复制的文本 |
@ |
最后使用的宏 |
特殊寄存器
一些寄存器有一些特殊行为
寄存器符号 | 当读操作时 | 当写操作时 |
---|---|---|
_ |
没有值可返回 | 所有值都要丢弃 |
# |
选择的项(第一个选择是1,第二个是2,等等) | 这个寄存器不可写 |
. |
当前选择的内容 | 这个寄存器不可读 |
% |
当前文件名称 | 这个寄存器不可读 |
+ |
从当前系统粘贴板读取 | 将内容复制到系统粘贴板 |
* |
从primary 粘贴板获得(鼠标中键) | 将内容复制到primary 粘贴板(鼠标中键) |
当多重选择复制到粘贴板寄存器中时,换行会一起复制进去。粘贴寄存器会得到最后一次获得的多重选择。此外粘贴板的内容只是单一选择的内容。