一个提供了自定义代码片段 snippets 和 Code Action 的 lsp 工具。
功能
- Completion: snippets
- 自定义片段
- 全局片段
- CodeAction: actions
- 实现 run code
- 通过参数实现各种脚本运行
安装
git clone https://github.com/erasin/hx-lsp.git
cd hx-lsp
cargo install --path .
在 https://github.com/erasin/helix-config/ 中有示例代码,另外我自己使用的分支已经合并了 helix#9081 Add a snippet system。
使用
修改 helix 的语言配置文件 languages.toml
, 修改下面文件任何一个即可
$XDG_CONFIG_HOME/helix/languages.toml
helix 配置文件WORKSPACE_ROOT/.helix/languages.toml
项目下配置文件
比如为 markdown 追加支持。
[language-server.hx-lsp]
command = "hx-lsp"
[[language]]
name = "markdown"
language-servers = [ "marksman", "markdown-oxide", "hx-lsp" ]
关于
language id
建议参考 helix/languages.toml 文件和 helix wiki language server configurations。
配置文件
配置文件支持 jsonc
格式,即支持注释内容,但不支持多余的 ,
。
注释样式支持
// ...
,/* ... */
,# ...
。
Snippets 文件加载路径
$XDG_CONFIG_HOME/helix/snippets/
WORKSPACE_ROOT/.helix/snippets/
Actions 配置加载路径
$XDG_CONFIG_HOME/helix/actions/
WORKSPACE_ROOT/.helix/actions/
配置在 textDocument/didOpen
时候加载 language id
同名 lang_id.json
文件。
暂不支持配置文件的动态加载,修改配置文件后,可以使用
:lsp-restart
重启来重新加载文件。
Completion: snippets
Code snippets
兼容 vscode snippets 格式。同样文件后缀支持 全局后缀.code-snippets
和 语言包后缀.json
。
为了更好的使用 snippet 建议 heliix 合并 helix#9081 Add a snippet system 以支持 smart-tab。
.
└── snippets
├── global.code-snippets
├── html.json
└── markdown.json
snippet 格式:
- name:
String
唯一内容,用于索引 - prefix:
String
或Vec<String>
提供给 helix 编辑器的补全列表使用 - body:
String
或Vec<String>
- description:
Option<String>
提示内容
{
"markdown a": { // name
"prefix": "mda", // string
"body": "mda in .helix: ${1:abc} : ${2:cde}", // string
"description": "test a info content in .helix"
},
"markdown b": {
"prefix": [ // array
"mdb"
],
"body": "mdb: ${1:abc} : ${2:cde}", // string
"description": "test b info content"
},
"markdown c": {
"prefix": [ // array
"mdc",
"mdd"
],
"body": [ // array
"mda: ${1:abc} : ${2:cde}",
"test"
],
"description": "test c,d info content"
}
}
CodeAction: actions
.
└── actions
├── html.json
└── markdown.json
snippet 格式:
- title:
String
helix 显示条目内容 - catch:
String
捕捉内容,regex 适配内容的时候,显示 code action - shell:
String
或Vec<String>
执行的 shell 脚本 - description:
Option<String>
提示内容
/* actions/go.json */
{
"run main": {
"title": "go run main",
"catch": "func main",
"shell": [
"alacritty --hold --working-directory ${TM_DIRECTORY} -e go run ${TM_FILENAME}"
],
"description": "go run main"
}
}
/* test */
{
"tmux split window helix": {
"title": "tmux split window in project",
"catch": "fn",
"shell": [
"tmux split-window -h",
"tmux send \"cd ${WORKSPACE_FOLDER}\n\""
],
"description": "tmux split and open helix in project"
}
}
catch:
- 捕捉行
- 选择内容
- 匹配内容
Variables 字段
计划为 snippet body 和 action shell 支持替换字段处理。
支持 $UUID
和 ${UUID}
写法。
path
-
TM_SELECTED_TEXT
-
TM_CURRENT_LINE
-
TM_CURRENT_WORD
-
TM_LINE_INDEX
-
TM_LINE_NUMBER
-
TM_FILENAME
-
TM_FILENAME_BASE
-
TM_DIRECTORY
-
TM_FILEPATH
-
RELATIVE_FILEPATH
-
CLIPBOARD
-
WORKSPACE_NAME
-
WORKSPACE_FOLDER
time
-
CURRENT_YEAR
-
CURRENT_YEAR_SHORT
-
CURRENT_MONTH
-
CURRENT_MONTH_NAME
-
CURRENT_MONTH_NAME_SHORT
-
CURRENT_DATE
-
CURRENT_DAY_NAME
-
CURRENT_DAY_NAME_SHORT
-
CURRENT_HOUR
-
CURRENT_MINUTE
-
CURRENT_SECOND
-
CURRENT_SECONDS_UNIX
-
CURRENT_TIMEZONE_OFFSET
other
-
RANDOM
-
RANDOM_HEX
-
UUID
action catch
-
CATCH1..9