【推荐】后现代风格文本编辑器-Helix

Helix简介

Helix编辑器是类似 Vim操作模式的终端文本编辑器。其具有类似Vim一样的简洁和高效的编辑方式,而且针对命令模式的交互进行了优化,参考了NeoVim和kakoune两款编辑器,注重文本选择与模块集成,能够实现开箱即用。

我之所以会关注到Helix,主要原因是Vim或者Neovim的编辑环境配置非常依赖github的各种仓库,而国内糟糕的网络环境给配置和升级编辑环境带来很多烦恼。在多次搜寻过程中,发现helix是可以满足开箱即用,且有优秀的命令模式交互界面,极大改善用户的使用体验。

image

Helix编辑器最明显的一个问题就是没有插件系统,这对于那些喜欢自己定制编辑器环境的朋友来说,不是那么友好,可玩性不高。官方确实有考虑做一个插件系统,但是优先要做的是Helix默认集成的特性已经足够好了,选择插件扩展目前优先级不是那么高。参见讨论

而那些愿意使用Helix的用户,肯定是希望不折腾的用户,默认内置的优秀功能应对一些开发环境已经足够。而且Helix运行的足够快,喜欢用终端来处理文档的用户基本不会在编辑速度上遇到问题。

本篇主要基于Helix的官方文档,介绍Helix编辑器的基本理念和使用方法,文章内容不会根据官方文档持续更新,希望关注Helix的用户可以跟踪官方网站与Github仓库

! Helix是Rust编写,属于后现代风格编辑器 ^_^

相关链接

Helix 官方网站

Helix 官方文档

Helix Github

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, ChocolateyMSYS2.

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\
主要依赖的工具:

  • Rust工具链
  • Git
  • 一个兼容C++14标准的C++编译器,例如Gcc或者Clang,用以构建tree-sitter

如果你使用musl-libc标准库,务必确保tree-sitter在编译时正确加载。

配置RUST编译参数:

RUSTFLAGS="-C target-feature=-crt-static"
  1. 克隆代码:

    git clone https://github.com/helix-editor/helix
    cd helix
    
  2. 编译构建:

    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平台

  1. 可以利用Windows工具设置HELIX_RUNTIME环境变量
  2. 可以在命令提示符中使用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目录,会按照以下顺序来检索

  1. $CARGO_MANIFEST_DIR 目录下的runtime (这个为了开发调试Helix)
  2. 操作系统中用户配置目录下的runtime/
  3. $HELIX_RUNTIME
  4. 在编译时期设置的HELIX_DEFAULT_RUNTIME环境变量,其中配置了发行版指定路径
  5. 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, tT 并不受限于当前行。

按键 描述 命令
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 进入。

参考[Helix特色操作]中的环绕功能文本对象章节。

按键 描述 命令
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],可以如下操作:

  1. % 来选择整个文件
  2. s 来用检索词分割选择的区域
  3. 输入use 后按下回车
  4. mr([ 利用环绕操作替换

多重符号目前还没有支持,未来有计划实现。

使用文本对象进行文本选择和操作

Helix可以使用文本对象进行选择和操作结构化的文本片段。你可以用这个功能对特定文本结构进行操作,例如一个单词,句子,段落,甚至一个函数或一块代码。

可以增加git图像

  • ma 选择整个块
  • mi 选择块的内部

当执行mami后,可以选择下面操作进行多种文本对象的选择

操作 含义
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:

  1. 当你使用Alt-n时,会选择到arg2;
  2. 当你使用Alt-o时,选择区域会扩张到func的所有参数:func([arg1,arg2,arg3])

以此类推其他操作。

寄存器

用户定义的寄存器

寄存器是存储空间,用来存放文本或者其他数据(例如搜索结果)。寄存器可以用来剪切,复制,粘贴文本,或者通过粘贴板与其他编辑器交流。
Helix允许用户自己定义寄存器的名字,如:

  • "ay 复制当前选择到寄存器a中
  • "op粘贴寄存器o中的内容至当前位置后方

如果寄存器选择时后跟上修改或者删除的指令,所选区域会被存储到寄存器中,并继续执行输入的指令,如:

  • "hc 存储到寄存器h中,并在所选区域开始编辑
  • "md 存储到寄存器m中,并删除所选区域

默认寄存器

helix内置的命令会使用寄存器,例如复制(y),使用默认寄存器不需要指定。

寄存器符号 内容
/ 最后一次的搜索
: 最后执行的命令
" 最后复制的文本
@ 最后使用的宏

特殊寄存器

一些寄存器有一些特殊行为

寄存器符号 当读操作时 当写操作时
_ 没有值可返回 所有值都要丢弃
# 选择的项(第一个选择是1,第二个是2,等等) 这个寄存器不可写
. 当前选择的内容 这个寄存器不可读
% 当前文件名称 这个寄存器不可读
+ 从当前系统粘贴板读取 将内容复制到系统粘贴板
* 从primary 粘贴板获得(鼠标中键) 将内容复制到primary 粘贴板(鼠标中键)

当多重选择复制到粘贴板寄存器中时,换行会一起复制进去。粘贴寄存器会得到最后一次获得的多重选择。此外粘贴板的内容只是单一选择的内容。

参考链接

Health check
Helix 安装文档

Helix的配置

https://www.cnblogs.com/tmacy/p/17934387.html

posted on 2023-12-20 17:41  Tmacy  阅读(1350)  评论(0编辑  收藏  举报

导航