#helix #language-server #snippets #lsp

bin+lib hx-lsp

支持 Helix 编辑器的片段和操作的 LSP 服务器

3 个版本

0.1.2 2024 年 7 月 10 日
0.1.1 2024 年 7 月 7 日
0.1.0 2024 年 5 月 17 日

97文本编辑器

MIT 许可证

73KB
1.5K SLoC

hx-lsp

中文文档 中文文档

Helix 编辑器 提供 custom 代码片段和 Code Actions 的 LSP 工具。

功能

  • 完成:片段
  • CodeAction:操作

安装

从 crate

cargo install --force hx-lsp

从源

git clone https://github.com/erasin/hx-lsp.git
cd hx-lsp
cargo install --path .

使用

修改 Helix 编辑器的语言配置文件 languages.toml

  • $XDG_CONFIG_HOME/helix/languages.toml:Helix 配置文件。
  • WORKSPACE_ROOT/.helix/languages.toml:项目工作空间根目录下的配置文件。

关于 'WORKSPACE_ROOT',它会读取 Helix 提供的 'initialize' 中的 'rootPath',当存在多个级别的 'rootPath'(languages.toml 的 languages 的 roots)时,它会读取最近的 root '.helix'。

例如,添加对 markdown 的支持。

[language-server.hx-lsp]
command = "hx-lsp"

[[language]]
name = "markdown"
language-servers = [ "marksman", "markdown-oxide", "hx-lsp" ]

关于 language id,请参阅 helix/languages.tomlhelix 维基语言服务器配置

配置

配置文件支持 jsonc 格式。

注释风格:// .../* ... */# ...

片段文件加载路径

  • $XDG_CONFIG_HOME/helix/snippets/
  • WORKSPACE_ROOT/.helix/snippets/

操作文件加载路径

  • $XDG_CONFIG_HOME/helix/actions/
  • WORKSPACE_ROOT/.helix/actions/

在 LSP textDocument/didOpen 请求中,将加载具有名称为 language_id.json 的配置文件。

不支持动态加载配置。如果您修改配置文件,请使用 :lsp-restart 来重新启动 lsp 并重新加载文件。

完成:片段

代码片段支持 vscode snippets 格式。相同的文件后缀支持全局后缀,如 . code-snippets,以及语言包后缀,如 . json

为了更好地使用片段补全,使用 helix master 并合并 helix#9081 添加片段系统 以支持智能制表符。

.
└── snippets
    ├── global.code-snippets
    ├── html.json
    └── markdown.json

片段格式:

  • name: String,索引
  • prefix: StringVec<String>,编辑器补全项
  • 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
    ├── html.json
    └── markdown.json

片段格式化器:

  • title: String helix 编辑器显示代码操作项
  • catch: String 捕获行内容,正则表达式,代码操作
  • 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"
  },
  "run main in tmux": {
    "title": "tmux: go run main",
    "catch": "func main",
    "shell": [
      "tmux split-window -h -c ${WORKSPACE_FOLDER};",
      "tmux send 'go build' Enter"
    ],
    "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

  • 正则表达式行
  • 选定的内容
  • 正则表达式匹配

变量

支持在片段内容和操作 shell 中使用变量。

支持如 $UUID${UUID}

路径

  • 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

时间

  • 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

其他

  • RANDOM
  • RANDOM_HEX
  • UUID

操作捕获

  • CATCH1..9

依赖项

~13–25MB
~403K SLoC