一个提供了自定义代码片段 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: StringVec<String> 提供给 helix 编辑器的补全列表使用
  • body: StringVec<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: StringVec<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