Eclipse LSP4E 配置 CMake 语法支持(代码提示)

1.安装cmake-language-server

使用pip install 安装 cmake-language-server

bash 复制代码
python -m pip install --user cmake-language-server --user

安装目录在~/AppData\Roaming\Python\Python312\Scripts\cmake-language-server.exe

2.在 Eclipse中新增 External Tool launch configuration

  • 名称:CMake Language Server
  • 类型:org.eclipse.ui.externaltools.ProgramLaunchConfigurationType
  • Location:cmake-language-server.exe 的绝对路径
  • Arguments:留空
  • Working directory:${workspace_loc}或留空
  • Console:关闭显示,但保留 stdout/stderr 给 LSP4E 使用

3.新增一个content-type

Preference->General->Content Types

点击Add Root,输入content-type的名字为cmake

File associations处点击Add,输入CMakeLists.txt

Associated editors处点击Add, 选择Generic Code Editor

4.映射content-type和launch configuration

Preference->Language Server

点击Add,

Associate content-type选择cmake,

Language Server Launch Configuration选择Program下面的CMake Language Server

右下角选择run模式

5.问题解决

5.1pygls.exceptions.JsonRpcInvalidParams: Invalid Params

当打开CMakeLists.txt时,控制台输出如下报错

bash 复制代码
File "C:\Users\enjing.guo\AppData\Roaming\Python\Python312\site-packages\pygls\protocol\json_rpc.py", line 344, in _deserialize_message
    raise JsonRpcInvalidParams() from exc
pygls.exceptions.JsonRpcInvalidParams: Invalid Params

问题在于:LSP4E 2026 发给 server 的初始化能力里,documentSymbol.tagSupport.valueSet 包含了 1...26,但 cmake-language-server 用的 lsprotocol 2023 只接受 SymbolTag = 1,所以初始化阶段直接 Invalid Params。

问题解决

  1. 新增cmake_language_server_compat.py
    将该文件放到C:\1\eclipse-cpp-2026-06-R\workspace3\.metadata\.plugins\org.eclipse.lsp4e\目录下
python 复制代码
import argparse
import logging
from typing import Any

from cmake_language_server import __version__
from cmake_language_server.server import CMakeLanguageServer
from lsprotocol.types import SymbolTag
from pygls.protocol.language_server import LanguageServerProtocol
from pygls.server import default_converter

def converter_factory() -> Any:
    converter = default_converter()
    # LSP4E 0.19 sends a broad documentSymbol.tagSupport.valueSet during
    # initialize. lsprotocol 2023 models SymbolTag as only {Deprecated: 1} and
    # rejects the other advertised values before the server can initialize.
    converter.register_structure_hook(SymbolTag, lambda _value, _type: SymbolTag.Deprecated)
    return converter

def main() -> None:
    parser = argparse.ArgumentParser(description="CMake Language Server")
    parser.add_argument(
        "--version", action="version", version=f"%(prog)s {__version__}"
    )
    parser.parse_args()

    logging.basicConfig(level=logging.INFO)
    logging.getLogger("pygls").setLevel(logging.WARNING)
    CMakeLanguageServer(
        "cmake-language-server",
        __version__,
        None,
        LanguageServerProtocol,
        converter_factory,
    ).start_io()


if __name__ == "__main__":
    main()
  1. 修改CMake Language Server这个LaunchConfiguration

    修改Location为C:\Python312\python.exe

    修改Arguments为"C:\1\eclipse-cpp-2026-06-R\workspace3.metadata.plugins\org.eclipse.lsp4e\cmake_language_server_compat.py"

  2. 重新打开eclipse,可以看到CMakeLists.txt编辑器的语法支持已经正常了