8个稳定版本 (3个主要版本)

17.1.2 2024年8月17日
17.1.1 2024年6月27日
17.0.1 2024年4月6日
16.0.0 2024年2月20日
14.2.0快照版2023年2月12日

#11文本编辑器

Download history 8/week @ 2024-05-20 7/week @ 2024-06-17 190/week @ 2024-06-24 15/week @ 2024-07-01 2/week @ 2024-07-22 200/week @ 2024-08-12

每月下载量:202

Unlicense/MIT

615KB
14K SLoC

Rust 11K SLoC // 0.0% comments Kakoune script 2.5K SLoC // 0.0% comments Python 548 SLoC // 0.2% comments Shell 434 SLoC // 0.2% comments

Kakoune语言服务器协议客户端

这是为Kakoune编辑器设计的语言服务器协议客户端。

快速入门

  1. 安装
  2. 安装您所需语言的语言服务器
  3. 配置Kakoune以启用LSP
  4. 配置映射

安装

预构建的二进制文件

MacOS
Homebrew

[source,sh]

brew install kakoune-lsp/kakoune-lsp/kakoune-lsp
手册

[source,sh]

curl -O -L https://github.com/kakoune-lsp/kakoune-lsp/releases/download/v17.1.2/kakoune-lsp-v17.1.2-x86_64-apple-darwin.tar.gz
tar xzvf kakoune-lsp-v17.1.2-x86_64-apple-darwin.tar.gz

# replace `~/.local/bin/` with something on your `$PATH`
mv kak-lsp ~/.local/bin/

# optional: if you want to use specific language servers
mkdir -p ~/.config/kak-lsp
mv kak-lsp.toml ~/.config/kak-lsp/
Linux
包管理器
  • Arch Linux: pacman -S kakoune-lspAUR/kak-lsp-git
  • Fedora Copr: sudo dnf copr enable atim/kakoune -y && sudo dnf install kakoune-lsp
  • Void Linux: xbps-install -S kak-lsp
其他

[source,sh]

wget https://github.com/kakoune-lsp/kakoune-lsp/releases/download/v17.1.2/kakoune-lsp-v17.1.2-x86_64-unknown-linux-musl.tar.gz
tar xzvf kak-lsp-v17.1.2-x86_64-unknown-linux-musl.tar.gz

# replace `~/.local/bin/` with something on your `$PATH`
mv kak-lsp ~/.local/bin/

# optional: if you want to use specific language servers
mkdir -p ~/.config/kak-lsp
mv kak-lsp.toml ~/.config/kak-lsp/

从源代码编译

通常,您需要最新的稳定版Rust来构建kakoune-lsp。

[source,sh]

git clone https://github.com/kakoune-lsp/kakoune-lsp
cd kakoune-lsp

# this installs the kak-lsp binary to ~/.cargo/bin, which must be in your `$PATH`
cargo install --locked --force --path .

# optional: if you want to use specific language servers
mkdir -p ~/.config/kak-lsp
cp kak-lsp.toml ~/.config/kak-lsp/

使用plug.kak

如果您不介意使用插件管理器,您可以通过plug.kak安装kakoune-lsp。将以下代码添加到您的kakrc

[source,kak]

plug "kakoune-lsp/kakoune-lsp" do %{
    cargo install --locked --force --path .
    # optional: if you want to use specific language servers
    mkdir -p ~/.config/kak-lsp
    cp -n kak-lsp.toml ~/.config/kak-lsp/
}

cargo install 将会将 kak-lsp 二进制文件安装到 ~/.cargo/bin,该路径必须在您的 $PATH 中。或者,您可以用 cargo build --release && ln -sf $PWD/target/release/kak-lsp ~/.local/bin/ 替换 cargo install,其中 ~/.local/bin/ 可以替换为您 $PATH 中的某个路径。

有关使用 plug.kak 的配置示例,请参阅 Wiki

安装您所需语言的语言服务器

kakoune-lsp 不管理语言服务器的安装,请自行安装您计划与 kakoune-lsp 一起使用的语言服务器。有关快速安装 kakoune-lsp 支持的语言服务器的详细信息,请参阅 如何安装服务器 Wiki 页面。

配置Kakoune以启用LSP

要启用配置语言的 LSP 支持(见 配置),只需将以下命令添加到您的 kakrc

[source,kak]

eval %sh{kak-lsp --kakoune -s $kak_session}  # Not needed if you load it with plug.kak.
lsp-enable

更推荐的方式是通过 lsp-enable-window 仅对您需要的特定文件类型启用 LSP,例如:

[source,kak]

eval %sh{kak-lsp --kakoune -s $kak_session}  # Not needed if you load it with plug.kak.
hook global WinSetOption filetype=(rust|python|go|javascript|typescript|c|cpp) %{
    lsp-enable-window
}

配置映射

goto-mode 中有三个默认映射:gdlsp-definition),gylsp-type-definition)和 grlsp-references)。在加载此插件后,您可以在 kakrc 中覆盖它们。

以下是一些额外的推荐映射。有关每个命令的含义,请参阅下文。

[source,kak]

map global user l %{:enter-user-mode lsp<ret>} -docstring "LSP mode"
map global insert <tab> '<a-;>:try lsp-snippets-select-next-placeholders catch %{ execute-keys -with-hooks <lt>tab> }<ret>' -docstring 'Select next snippet placeholder'
map global object a '<a-semicolon>lsp-object<ret>' -docstring 'LSP any symbol'
map global object <a-a> '<a-semicolon>lsp-object<ret>' -docstring 'LSP any symbol'
map global object f '<a-semicolon>lsp-object Function Method<ret>' -docstring 'LSP function or method'
map global object t '<a-semicolon>lsp-object Class Interface Struct<ret>' -docstring 'LSP class interface or struct'
map global object d '<a-semicolon>lsp-diagnostic-object --include-warnings<ret>' -docstring 'LSP errors and warnings'
map global object D '<a-semicolon>lsp-diagnostic-object<ret>' -docstring 'LSP errors'

用法

注意:以下内容对应于 master 分支 HEAD,可能与从预构建的二进制文件安装的版本略有不同。最常见的情况是新命令处于预发布测试阶段。请参阅使用您所使用的版本的 README.asciidoc 标签或发布存档中的 README.asciidoc。

如果您已按照上述步骤操作,您将获得以下内容

  • 自动完成
  • lsp-definition 命令用于跳转到定义,默认映射为 gd
  • lsp-hover 命令用于在信息框中显示悬停信息(包括相关诊断信息,如有)。
  • lsp-hover-buffer 命令用于在临时缓冲区中显示相同内容。
  • 要自动显示悬停信息,请使用 lsp-auto-hover-enablelsp-auto-hover-buffer-enable
  • 要显示锚定于悬停位置的悬停信息,请使用 set global lsp_hover_anchor true
  • 要排除诊断信息,请使用 set-option global lsp_show_hover_format 'printf %s "${lsp_info}"'
  • lsp-declaration 命令用于跳转到主光标下符号的声明
  • lsp-definition 命令用于跳转到主光标下符号的定义
  • lsp-type-definition 命令用于跳转到主光标下符号的类型定义,默认映射到 gy
  • lsp-implementation 命令用于查找主光标下符号的实现
  • lsp-references 命令用于查找主光标下符号的引用,默认映射到 gr
  • 对于上述前五个命令,goto 缓冲区的文件类型为 lsp-goto,因此您可以在行上按 <ret> 或使用 jump 命令
  • lsp-find-error 命令用于跳转到当前文件中的下一个或上一个错误
  • lsp-selection-range 命令用于快速选择围绕选择有趣的范围。
    • lsp-selection-range-select 用于导航由 lsp-selection-range 获取的范围。
  • 对 Kakoune 的 jump-* 命令的 polyfill,用于跳转到具有 lsp-goto 文件类型的缓冲区中列出的下一个或上一个位置。这些也适用于 *grep*lint*make 缓冲区
  • lsp-highlight-references 命令用于选择(除非在钩子上下文中运行)当前缓冲区中主光标下符号的所有引用,并使用 Reference 面板(默认等于 MatchingChar 面板)突出显示它们
  • lsp-document-symbol 命令用于在类型为 lsp-document-symbol 的缓冲区中列出当前缓冲区的符号
  • lsp-goto-document-symbol 命令用于跳转到当前缓冲区中的一个符号
  • lsp-workspace-symbol 命令用于列出与查询匹配的项目范围内的符号
  • lsp-workspace-symbol-incr 命令用于增量列出与查询匹配的项目范围内的符号
  • *symbols 缓冲区的文件类型为 lsp-goto,因此您可以在行上按 <ret> 或使用 jump 命令
  • lsp-diagnostics 命令用于列出项目范围内的诊断(当前缓冲区确定收集诊断的项目和语言)
  • *diagnostics 缓冲区的文件类型为 lsp-diagnostics,因此您可以在行上按 <ret> 或使用 jump 命令
  • lsp-incoming-callslsp-outgoing-calls 命令用于列出光标所在函数的调用者和被调用者。
  • *callers*callees 缓冲区的文件类型为 lsp-goto,因此您可以在行上按 <ret> 或使用 jump 命令
  • lsp-signature-help 命令用于显示主光标下函数的签名信息
  • 要在插入模式下自动显示签名信息,请使用 lsp-auto-signature-help-enable
  • 使用 DiagnosticErrorDiagnosticHintDiagnosticInfoDiagnosticWarning 面板进行内联诊断高亮显示;可以通过 lsp-inline-diagnostics-disable 命令禁用
  • 在出现错误或其他诊断的行左侧的标志;可以通过 lsp-diagnostic-lines-disable 命令禁用
    • 对于带有代码镜头的行,一个 > 标志,可以通过 lsp_code_lens_sign 选项自定义
    • 使用 lsp-code-lens 命令从当前选择执行代码镜头
    • 使用 lsp-inlay-code-lenses-enablelsp-inlay-code-lenses-disable 命令切换代码镜头的渲染
      • 您可以使用 set-face global InlayCodeLens <face> 修改代码镜头的面板
  • 使用 lsp-formatting 命令根据 tabstoplsp_insert_spaces 选项格式化当前缓冲区
  • 使用 lsp-formatting-sync 命令同步格式化当前缓冲区,适用于与 BufWritePre 钩子一起使用

[source,kak]

hook global WinSetOption filetype=rust %{
    hook window BufWritePre .* lsp-formatting-sync
}
  • 使用 lsp-object 命令在 对象模式 中选择相邻或周围的语法树节点
  • lsp-diagnostic-object 做类似的事情,但用于内联诊断
  • 使用 lsp-next-symbollsp-previous-symbol 命令转到缓冲区的下一个和当前/上一个符号
  • 使用 lsp-hover-next-symbollsp-hover-previous-symbol 显示缓冲区的下一个和当前/上一个符号的悬停
  • 使用 lsp-rename <new_name>lsp-rename-prompt 命令重命名主光标下的符号
  • 在状态行中显示符号路径,例如(somemodule > someclass > somefunction)。
  • 为了实现这一点,kakoune-lsp 在加载时将 %opt{lsp_modeline} 添加到全局 modelinefmt 的前面。
  • 当语言服务器指示忙碌时,在状态行中显示沙漏字符(⌛)。
  • 要自定义此行为,重写 lsp-handle-progress
  • 如果 lsp_auto_show_code_actions 设置为 true,则主光标位置上有代码操作可用时,状态行中显示灯泡(💡)
  • 要自定义灯泡,可以重写 lsp-show-code-actionslsp-hide-code-actions
  • 使用 lsp-code-actions 打开菜单以选择要运行的代码操作
  • 要自定义菜单,可以重写 lsp-perform-code-action
  • 使用 lsp-code-action 运行与给定模式匹配的代码操作
  • 使用 lsp-code-action-sync 同步运行该代码操作,适用于在 BufWritePre 钩子中使用
  • lsp_diagnostic_error_countlsp_diagnostic_hint_countlsp_diagnostic_info_countlsp_diagnostic_warning_count 选项,它们包含当前缓冲区相应级别的诊断数量。例如,您可以将它们放入您的状态行中,以快速查看当前文件中是否有错误
  • 当Kakoune会话开始时启动新的kak-lsp会话,并在Kakoune会话结束时停止它。
  • 使用lsp-execute-command命令来执行服务器特定的命令(由lsp-capabilities列出)。
  • 以下命令以ccls-clangd-ejdtls-texlab-rust-analyzer-开头,提供服务器特定的功能。

注意:默认情况下,kak-lsp在30分钟内没有收到Kakoune的任何请求时退出,即使Kakoune会话仍在运行。通过在kak-lsp.toml中更改server.timeout来调整此持续时间,或将它设置为0以禁用此行为。在任何情况下,如果服务器已关闭,则新的请求将启动一个新的服务器。

  • lsp用户模式,默认映射如下

|=== | 绑定 | 命令

| a | lsp-code-actions | c | lsp-capabilities | d | lsp-definition | e | lsp-diagnostics | f | lsp-formatting | h | lsp-hover | i | lsp-implementation | j | lsp-outgoing-calls | k | lsp-incoming-calls | l | lsp-code-lens | r | lsp-references | R | lsp-rename-prompt | s | lsp-goto-document-symbol | S | lsp-document-symbol | o | lsp-workspace-symbol-incr | n | lsp-find-error | p | lsp-find-error --previous | v | lsp-selection-range | y | lsp-type-definition | 9 | lsp-hover-previous-function | 0 | lsp-hover-next-function | & | lsp-highlight-references | ( | lsp-previous-function | ) | lsp-next-function | [ | lsp-hover-previous-symbol | ] | lsp-hover-next-symbol | { | lsp-previous-symbol | } | lsp-next-symbol |===

要了解当前缓冲区的文件类型语言服务器支持的LSP命令子集,请使用lsp-capabilities命令。

配置

kakoune-lsp本身具有配置,但它还添加了影响Kakoune集成的配置选项。

配置kakoune-lsp

kakoune-lsp通过一个位于TOML格式的配置文件进行配置。默认情况下,它尝试读取$XDG_CONFIG_HOME/kak-lsp/kak-lsp.toml(默认为~/.config/kak-lsp/kak-lsp.toml),但您可以使用命令行选项--config来覆盖它。查看默认链接:kak-lsp.tomlkak-lsp.toml,它应该是相当直观的。如果您不需要更改配置,则无需将其复制到任何地方,因为默认配置已嵌入到kak-lsp二进制文件中。

重要:配置文件不会扩展默认配置,而是覆盖它。这意味着如果您想自定义任何配置,则必须复制完整的默认配置然后进行编辑。

kak-lsp.toml的“语言”部分中,roots参数是一个文件glob列表。每当您的编辑器会话想要发送一个LSP请求时,第一个匹配任何当前缓冲区父目录中文件的glob将导致kakoune-lsp将项目根设置为该父目录。

您可以定义一个环境变量,例如KAK_LSP_PROJECT_ROOT_RUST=/my/project,以始终将/my/project用作/my/project内Rust文件的根。用另一个大写语言ID替换RUST,以对其他文件类型执行相同的操作。

环境变量 KAK_LSP_FORCE_PROJECT_ROOT=/my/project 将使 kakoune-lsp 总是使用 /my/project 作为项目根目录,即使对于该目录外的文件也是如此。这避免了为 /my/project 外的文件启动单独的语言服务器,并确保即使导航库代码时,你的语言服务器也了解你的项目的构建配置。

如果你通过 cli 设置任何服务器选项,不要忘记将它们附加到你的 kakrc 中的 %sh{kak-lsp --kakoune ...}。如果你在 ~/.config/kak-lsp/kak-lsp.toml 中更改选项,则不需要这样做。

请告诉我们你关于如何使默认配置更合理的任何想法。

服务器特定配置

许多服务器接受不是 LSP 规范一部分的配置选项。TOML 表 [language_server.<server_name>.settings] 存储这些配置选项。它具有与 VSCode 的 settings.json 中相应的片段相同的结构。例如

[source,toml]

[language_server.gopls]
...
settings_section = "gopls" # Optional, defaults to server name.
[language_server.gopls.settings.gopls]
"formatting.gofumpt" = true

在服务器初始化期间,kakoune-lsp 会发送由 settings_section 指定的部分,或者与服务器同名的部分;在这种情况下 {"formatting.gofumpt":true}。每次你更改 Kakoune 选项 lsp_config 时,都会通过 workspace/didChangeConfiguration 发送相同的部分。此外,kakoune-lsp 还会发送服务器在 workspace/configuration 中请求的任意部分。

语言 ID ("languageId")

默认情况下,Kakoune 文件类型作为 LSP 语言 ID 发送到服务器。为了为给定的文件类型发送不同的标识符,请使用 [language_ids] 配置选项,以下是一个示例。

多个语言服务器

可以将多个语言服务器映射到文件类型。例如,如果你想设置 TSServer 和 TailwindCSS 用于 React 项目

[source,toml]

[language_ids]
javascript = "javascriptreact"
typescript = "typescriptreact"

[language_server.tsserver]
filetypes = ["javascript", "typescript"]
roots = ["package.json", "tsconfig.json", "jsconfig.json", ".git", ".hg"]
command = "typescript-language-server"
args = ["--stdio"]

[language_server.tailwindcss]
filetypes = ["javascript", "typescript"]
roots = ["tailwind.config.ts", "tailwind.config.js"]
command = "tailwindcss-language-server"
args = ["--stdio"]
[language_server.tailwindcss.settings.tailwindcss]
editor = {}

配置 Kakoune

kakoune-lsp 声明了以下 Kakoune 选项

  • lsp_completion_trigger (str):此选项设置为 Kakoune 命令,每当用户在插入模式下暂停时都会执行该命令。如果命令成功,kakoune-lsp 将向语言服务器发送补全请求。
  • lsp_diagnostic_line_error_signlsp_diagnostic_line_hint_signlsp_diagnostic_line_info_signlsp_diagnostic_line_warning_sign (str):当使用 lsp-diagnostic-lines-enable 且语言服务器检测到错误或其他诊断时,kakoune-lsp 将使用此字符串和一个相应的面孔 LineFlagErrorLineFlagHintLineFlagInfoLineFlagWarning 向窗口的最左侧列添加标志。
  • lsp_hover_anchor (布尔值): 当使用 lsp-hoverlsp-auto-hover-enable 时,如果此选项设置为 true,则悬停信息将显示在活动选择旁边。否则,信息将在右下角的一个框中显示。
  • lsp_hover_max_info_lines (整数): 如果大于 0,则将悬停框中的信息限制为给定的行数。默认为 20。
  • lsp_hover_max_diagnostic_lines (整数): 如果大于 0,则将悬停框中的诊断信息限制为给定的行数。默认为 20。
  • lsp_hover_insert_mode_trigger (字符串): 此选项设置为 Kakoune 命令。当使用 lsp-auto-hover-insert-mode-enable 时,每次用户在插入模式中暂停时都会执行此命令。如果命令成功,kakoune-lsp 将为命令所选文本发送悬停信息请求。
  • lsp_insert_spaces (布尔值): 当使用 lsp-formatting 时,如果此选项设置为 true,kakoune-lsp 将请求语言服务器使用空格而不是制表符缩进。
  • lsp_auto_highlight_references (布尔值): 如果此选项设置为 true,则在用户在普通模式中暂停时执行 lsp-highlight-references
  • lsp_auto_show_code_actions (布尔值): 如果此选项设置为 true,则在用户在普通模式中暂停时执行 lsp-code-actions
  • lsp_config (字符串): 这是一个与 kak-lsp.toml 格式相同的 TOML 字符串,但当前它仅支持一种配置值
  • [language_server.<server_name>.settings]: 这与 kak-lsp.toml 中同名静态配置的工作方式相同,请参阅有关服务器特定配置的部分。这将覆盖给定语言服务器的静态配置。

例如,您可以使用以下命令动态切换选项

[source,kak]

set-option global lsp_config %{
    [language_server.gopls.settings.gopls]
    "formatting.gofumpt" = true
}

内联提示

内联提示是针对 LSP 3.17 提出的一项功能,用于在代码中显示推断类型、函数调用中的参数名称和链式调用的类型。要启用对其的支持,请将以下内容添加到您的 kakrc

[source,kak]

lsp-inlay-hints-enable global

您可以使用 set-face global InlayHint <face> 改变提示的样式。

语义标记

kakoune-lsp 支持语义高亮的语义标记功能。如果语言服务器支持它,您可以使用以下命令启用它

[source,kak]

hook global WinSetOption filetype=<language> %{
  hook window -group semantic-tokens BufReload .* lsp-semantic-tokens
  hook window -group semantic-tokens NormalIdle .* lsp-semantic-tokens
  hook window -group semantic-tokens InsertIdle .* lsp-semantic-tokens
  hook -once -always window WinSetOption filetype=.* %{
    remove-hooks window semantic-tokens
  }
}

用于语义标记和修饰符的样式可以在 kak-lsp.toml 中修改,使用 semantic_tokens.faces 数组,例如

[source,toml]

[semantic_tokens]
faces = [
    {face="const_variable_declaration", token="variable", modifiers=["constant", "declaration"]},
]

其中 face 是将在 Kakoune 中应用的样式(您需要在您的主题/配置中定义这些),token 是语言服务器报告的标记的名称(参见 lsp-capabilities),modifiers 是修饰符名称的数组(也由语言服务器报告)。modifiers 可省略,但 tokenface 是必需的。

您可以创建任意数量的定义,这些定义可以在服务器报告的标记名称和修饰符之间进行排列组合。要使条目匹配标记,条目的所有修饰符都必须存在于标记上。但是,标记可能具有配置条目中未分配的附加修饰符。+ kakoune-lsp 将找到最具体的匹配配置来应用,其中特定性定义为匹配修饰符的数量。如果有多个匹配的条目具有相同数量的修饰符,则配置中定义最后的那一个获胜。

示例

假设以下配置

[source,toml]

[semantic_tokens]
faces = [
    {face="const_variable_declaration", token="variable", modifiers=["constant","declaration"]},
    {face="const_variable", token="variable", modifiers=["constant"]},
    {face="variable", token="variable"},
]

kakoune-lsp 将执行以下映射

[cols="1,1,2,5"] |=== | 标记 | 修饰符 | 表面 | 评论

| variable | constant, declaration | const_variable_declaration | 第一个条目与2个修饰符匹配。

| variable | constant | const_variable | 第一个和第二个条目与1个修饰符匹配,第二个获胜。

| variable | declaration | variable | 只有第三个条目匹配。第一个条目不匹配,因为没有 constant

| variable | | variable | 第三个条目匹配。

| function | | | 没有匹配项,不应用任何表面。

|===

内联诊断

kakoune-lsp 支持在各自的行之后显示诊断信息,但这种行为可能有些问题,并且必须明确启用。

[source,kak]

lsp-inlay-diagnostics-enable global

信息框中的Markdown渲染

kakoune-lsp 在信息框中显示语言服务器提供的附加信息。这些信息包括光标下的标记的文档(lsp-hover)和完成候选的文档。在两种情况下,语言服务器协议都允许使用纯文本和Markdown,并且大多数服务器都实现了Markdown。

为了使用Markdown,kakoune-lsp 将其转换为Kakoune的标记语言,利用各种表面进行样式化。这些表面都默认为 Information 表面,以确保信息框中的文本与任何颜色方案一起工作。

要启用Markdown高亮显示,请在您的主题或 kakrc 中定义以下表面之一

[cols="1a,3a"] |=== | 表面 | 用法

| InfoDefault | 默认文本颜色。您可能希望保留默认的 Information

| InfoBlock | 用于代码块的表面。不支持代码块的语言特定语法高亮。

| InfoBlockQuote | 用于块引用的表面。Markdown中的 > 语法仍然会被渲染。

| InfoBullet | 用于突出显示有序和无序列表中的列表符号的表面。对于列表项的文本,使用 InfoDefault

| InfoHeader | 用于标题的表面。目前没有不同标题级别的区别。

| InfoLink | 用于突出显示链接标题的表面。也许为这个定义一些经典的 blue+u 吧?

| InfoLinkMono | 此表面分配给链接标题中的内联代码跨度,例如以下Markdown片段中。在这里,单词 format 将接收 InfoLinkMono 表面。

[the `format` function](https://example.com)

| InfoMono | 用于内联代码跨度(反引号字符串)的表面。

| InfoRule | 用于水平线(规则)的表面。

| InfoDiagnosticError | 用于悬停信息中的诊断错误消息。默认为Kakoune的内置 Error 表面。

| InfoDiagnosticHint | 用于在悬停信息中的诊断中的提示。

| InfoDiagnosticInformation | 用于在悬停信息中的诊断中的信息消息。

| InfoDiagnosticWarning | 用于在悬停信息中的诊断中的警告。

|===

为了方便,以下是一个可以粘贴到您的主题/配置中的片段。

[source,kak]

face global InfoDefault               Information
face global InfoBlock                 Information
face global InfoBlockQuote            Information
face global InfoBullet                Information
face global InfoHeader                Information
face global InfoLink                  Information
face global InfoLinkMono              Information
face global InfoMono                  Information
face global InfoRule                  Information
face global InfoDiagnosticError       Information
face global InfoDiagnosticHint        Information
face global InfoDiagnosticInformation Information
face global InfoDiagnosticWarning     Information

此功能的当前限制包括:

  • 不支持代码块的语言特定语法高亮。
  • 对于超链接,仅显示它们的标题(漂亮的名字)。
  • 保留了标题的原始语法以可视化其级别。

代码片段

代码片段是带有占位符("tabstops")的完成,占位符位于您可能想要插入文本的位置(例如函数调用参数)。占位符用两个面 SnippetsNextPlaceholdersSnippetsOtherPlaceholders 突出显示。

lsp-snippets-select-next-placeholders 命令允许跳转到下一个tabstop(如函数调用参数)。建议的映射使用 <tab>(见 配置映射)。以下是将其绑定到 <c-n> 的方法(可能需要使用Kakoune的 <c-o> 命令隐藏完成菜单)

[source,kak]

map global insert <c-n> '<a-;>:lsp-snippets-select-next-placeholders<ret>' -docstring 'Select next snippet placeholder'
hook global InsertCompletionShow .* %{
  unmap global insert <c-n> '<a-;>:lsp-snippets-select-next-placeholders<ret>'
}
hook global InsertCompletionHide .* %{
  map global insert <c-n> '<a-;>:lsp-snippets-select-next-placeholders<ret>' -docstring 'Select next snippet placeholder'
}

可以通过在配置的最高级别设置 snippet_support = false 来禁用代码片段支持。

限制

workspace/didChangeWatchedFiles 默认禁用;使用 watch_file_support = true 来启用。

编码

kakoune-lsp 与 UTF-8 文档配合使用最佳。

Position.character 解释

LSP 规范表示列偏移量(Position.character)应解释为 UTF-16 代码单元。许多服务器违反了规范。请参阅 https://github.com/Microsoft/language-server-protocol/issues/376 了解一些背景信息。

kakoune-lsp 遵守规范,但将优先使用 UTF-8 偏移量,如果服务器通过客户端功能 general.positionEncodingsclangd 协议扩展 宣传对 UTF-8 偏移量的支持。

故障排除

如果 kakoune-lsp 失败,请尝试在调用 kak-lsp --kakoune 之后将此行放入您的 kakrc 中:[source,kak]

set global lsp_cmd "kak-lsp -s %val{session} -vvv --log /tmp/kak-lsp.log"

以启用调试日志。

如果它没有提供足够的信息来修复问题,或者问题是 kakoune-lsp 本身的错误,请毫不犹豫地提出问题。

默认配置

请尝试使用最小配置重现问题。有时问题仅在您的 ~/.config/kak-lsp/kak-lsp.toml 和/或 ~/.config/kak/ 中的特定设置时发生。使用此命令以启用 kakoune-lsp 启动 Kakoune,同时具有原始设置。

[source,sh]

env -u XDG_CONFIG_HOME HOME=$(mktemp -d) kak -e '
    eval %sh{kak-lsp --kakoune -s $kak_session}
    set global lsp_cmd "kak-lsp -s %val{session} -vvvv --log /tmp/kak-lsp.log"
    lsp-enable'

注意:一些 Kakoune 插件可能会干扰 kakoune-lsp,尤其是完成提供者。例如,racer.kak 与 Rust 文件的自动完成竞争。

崩溃

为了解决崩溃问题,您可能希望在Kakoune之外运行kakoune-lsp。

要这样做

在启动Kakoune之前,使用任意会话ID运行kakoune-lsp(这里为foobar

kak-lsp -s foobar

。 在第二个终端中,使用相同的会话ID运行Kakoune

kak -s foobar

版本控制

kakoune-lsp遵循SemVer,与常见做法的一个显著不同之处在于:我们不使用0主版本来表示产品尚未达到稳定性。即使是非稳定版和不完整的特性产品,用户也应当清楚地了解破坏性更改。因此,我们从主版本1开始,每次升级需要用户注意时,就增加主版本号。

依赖项

~16–31MB
~457K SLoC