29の安定版リリース (12の主要リリース)

新しい 17.1.2 2024年8月17日
17.1.1 2024年6月27日
17.0.1 2024年4月6日
16.0.0 2024年2月20日
5.10.0 2018年11月19日

#30 in テキストエディタ

594 スター & 20 ウオッチ

Unlicense/MIT

610KB
14K SLoC

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

Kakoune 言語サーバープロトコルクライアント

これは Language Server Protocol クライアントで、Kakoune エディタ用です。

速報スタート

  1. インストール
  2. 望む言語用の言語サーバーをインストールします
  3. Kakouneを設定してLSPを有効にします
  4. マッピングを設定します

インストール

プリビルドバイナリ

MacOS
Homebrew

[ソース、sh]

brew install kakoune-lsp/kakoune-lsp/kakoune-lsp
マニュアル

[ソース、sh]

curl -O -L https://github.com/kakoune-lsp/kakoune-lsp/releases/download/v17.1.1/kakoune-lsp-v17.1.1-x86_64-apple-darwin.tar.gz
tar xzvf kakoune-lsp-v17.1.1-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-lsp または AUR/kak-lsp-git
  • Fedora Copr: sudo dnf copr enable atim/kakoune -y && sudo dnf install kakoune-lsp
  • Void Linux: xbps-install -S kak-lsp

[ソース、sh]

wget https://github.com/kakoune-lsp/kakoune-lsp/releases/download/v17.1.1/kakoune-lsp-v17.1.1-x86_64-unknown-linux-musl.tar.gz
tar xzvf kak-lsp-v17.1.1-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/

ソースから

一般的に、kakoune-lspをビルドするには最新の安定版のRustが必要です。

[ソース、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に追加してください

[ソース、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 install 替换为 cargo build --release && ln -sf $PWD/target/release/kak-lsp ~/.local/bin/,其中 ~/.local/bin/ 可以替换为您 $PATH 中的任何路径。

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

望む言語用の言語サーバーをインストールします

kakoune-lsp 不负责语言服务器的安装,请自行安装您打算与 kakoune-lsp 一起使用的语言服务器。请参阅 如何安装服务器 Wiki 页面以快速安装 kakoune-lsp 支持的默认语言服务器。

Kakouneを設定してLSPを有効にします

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

[ソース、kak]

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

更复杂但推荐的方法是仅通过 lsp-enable-window 启用特定文件类型的 LSP,例如:

[ソース、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 有三个默认映射: gd(《lsp-definition》), gy(《lsp-type-definition》)和 gr(《lsp-references》)。在插件加载后,您可以在 kakrc 中覆盖它们。

以下是其他推荐映射。下面将说明每个命令的含义。

[ソース、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 钩子一起使用

[ソース、kak]

hook global WinSetOption filetype=rust %{
    hook window BufWritePre .* lsp-formatting-sync
}
  • 使用 lsp-object 命令在 object mode 中选择相邻或周围的语法树节点
  • lsp-diagnostic-object 做类似的事情,但用于内联诊断
  • 使用 lsp-next-symbollsp-previous-symbol 命令跳转到缓冲区的下一个和当前/上一个符号
  • 使用 lsp-hover-next-symbollsp-hover-previous-symbol 显示缓冲区的下一个和当前/上一个符号的悬停
  • 使用 lsp-rename lsp-rename-prompt 命令重命名主光标下的符号
  • 在状态行中的面包屑指示主光标周围的符号,例如 (somemodule > someclass > somefunction)。
  • 为了实现这一点,kakoune-lsp 在加载时将 %opt{{lsp_modeline} 添加到您的全局 modelinefmt 之前。
  • 当语言服务器指示正在忙碌时,状态行中显示沙漏字符(⌛)。
  • 要自定义此行为,重写 lsp-handle-progress
  • 如果 lsp_auto_show_code_actionstrue,则在主光标位置有代码动作时,状态行中显示灯泡(💡)
  • 要自定义灯泡,您可以重写 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- 开头的命令,提供服务器特定功能。

注意:默认情况下,如果 30 分钟内没有从 Kakoune 接收到任何请求,即使 Kakoune 会话仍在运行,kak-lsp 也会退出。通过在 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 参数是一个文件通配符列表。每当您的编辑会话想要发送 LSP 请求时,与任何当前缓冲区父目录中的文件匹配的第一个通配符将导致 kakoune-lsp 将项目根设置为该父目录。

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

环境变量 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] 配置选项,下面是一个示例。

多个语言服务器

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

[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(字符串):当使用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中同名静态配置一样工作,请参阅有关特定服务器配置的部分。这将覆盖给定语言服务器的静态配置。

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

[ソース、kak]

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

内联提示

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

[ソース、kak]

lsp-inlay-hints-enable global

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

语义标记

kakoune-lsp支持语义标记功能进行语义突出显示。如果语言服务器支持它,您可以使用以下方式启用它

[ソース、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"] |=== | Token | Modifiers | Face | 注释

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

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

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

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

| function | | | 没有匹配条目,没有应用面。

|===

内联诊断

kakoune-lsp 支持在其相应行后显示诊断,但此行为可能有些问题,必须明确启用。

[ソース、kak]

lsp-inlay-diagnostics-enable global

信息框中的Markdown渲染

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

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

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

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

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

| InfoBlock | 用于代码块的 face。不支持代码块的语言特定语法高亮显示。

| InfoBlockQuote | 用于块引用的 face。Markdown的 > 语法仍然会渲染。

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

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

| InfoLink | 用于突出显示链接标题的 face。也许可以为这个链接使用一些经典的 blue+u

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

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

| InfoMono | 用于行内代码段的字体(反引号字符串)。

| InfoRule | 用于水平线(规则)的字体。

| InfoDiagnosticError | 用于悬停信息中的诊断错误消息。默认为Kakoune内建的Error字体。

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

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

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

|===

为了方便,这里有一个片段可以粘贴到你的主题/配置中

[ソース、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

此功能的当前限制包括

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

代码片段

代码片段是带有占位符(“tabstop”)的补全,这些占位符位于你可能想要插入文本的位置(例如函数调用参数)。占位符用两个字体SnippetsNextPlaceholdersSnippetsOtherPlaceholders突出显示。

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

[ソース、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。

[ソース、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(此处为 foobar)运行 kakoune-lsp

kak-lsp -s foobar

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

kak -s foobar

版本控制

kakoune-lsp 遵循 SemVer,但与常规实践有一个显著区别:我们不使用 0 主要版本来表示产品尚未达到稳定性。即使是未稳定和未完整功能的版本,用户也应清楚地了解破坏性更改。因此,我们从主要版本 1 开始,并在需要用户注意的升级时递增它。

依赖项

~16–29MB
~453K SLoC