
Nushell 如何启动 LSP 服务器为编辑器提供 .nu 代码支持【免费下载链接】nushellA new type of shell项目地址: https://gitcode.com/GitHub_Trending/nu/nushell如果你的编辑器打开.nu脚本时只有纯文本编辑没有补全、悬停提示或诊断可以让 Nushell 自己充当语言服务器运行nu --lsp进程通过标准输入/输出按 Language Server ProtocolLSP与编辑器通信为 Nushell 脚本提供完成当前场景所需的语言支持。本文说明如何启动这个服务器、它会向客户端声明哪些能力以及不接编辑器时如何验证相关功能确实可用。前提确认你的 nu 带有 lsp 功能--lsp标志由 Rust 的lspfeature 控制。查看仓库根目录 Cargo.toml 可以看到lsp [dep:nu-lsp] default [ lsp, ... ]也就是说lsp属于默认 feature标准构建包括fullfeature 集都会编译出 nu-lsp 这个 crate。如果你是从源码构建且使用了非默认的 feature 裁剪确认保留lsp否则nu --help里不会出现--lsp。服务器本体是内部 crate nu-lsp其 README 说明它是 Nushell 语言服务器的实现并指向 LSP 规范同时明确它是内部 crate不面向插件作者直接支持。启动nu --lsp在终端执行nu --lsp该标志在 src/command.rs 中定义为 Ide 分类的 switch 标志描述是 start nus language server protocol官方示例就是nu --lsp。执行后注意两个行为它们来自 src/run.rs 中run_lsp的实现默认会先加载配置未传--no-config-file时run_lsp会调用config_files::setup_config加载 env/config 文件再进入 LSP 主循环。如果你希望服务器在干净的配置环境下启动可传--no-config-file即-n此时不读取任何插件、env 或 config 文件。stdout 被协议占用启动后进程调用LanguageServer::initialize_stdio_connection(...)?.serve_requests()阻塞在 stdio 连接上等待客户端消息。此时不要把它当成 REPL 使用——print.rs 中有注释说明在协议模式LSP、MCP下 stdout 专门用于协议消息。因此终端里看不到 Nushell 的正常输出是预期行为进程持续挂起等待initialize请求本身就是服务已在监听的迹象。编辑器侧只需配置任意支持 stdio 启动方式的 LSP 客户端用nu --lsp作为启动命令即可仓库内没有附带特定编辑器的配置文件。服务器向客户端声明的能力serve_requests在 crates/nu-lsp/src/lib.rs 中通过initialize响应声明了以下 ServerCapabilities接上编辑器后.nu文档即可使用这些功能completion补全completion_providerdefinition跳转定义definition_providerhover悬停信息hover_providerdocument highlight / document symbol / workspace symbol文档内高亮、文档符号、工作区符号references / rename查找引用、重命名rename 带prepare_providerinlay hints / signature help嵌入式提示与参数签名帮助semantic tokens语义着色token_types目前只有FUNCTION一种代码注释说明 only internal command names with space supported for now目前仅支持含空格的内建命令名text document syncINCREMENTAL增量同步workspace folders支持工作区文件夹及其变更通知文档打开或内容变更DidOpenTextDocument/DidChangeTextDocument通知时服务器会重新解析并推送PublishDiagnostics——见 diagnostics.rs 和 notification.rs。测试代码里打开文档时使用的language_id是nu编辑器侧配置文件类型识别时可对照这个值。不接编辑器时如何验证仓库在 src/command.rs 中同时提供了一组--ide-*标志它们复用同一套 IDE 能力可直接在命令行验证无需完整 LSP 客户端。参数是光标位置示例值来自文档本身# 运行诊断检查限制返回的错误数量示例限制为 100 个 nu --ide-check 100 script.nu # 列出给定光标位置示例为 4的补全 nu --ide-complete 4 script.nu # 查看光标位置示例为 0处的悬停信息 nu --ide-hover 0 script.nu # 跳转到光标位置示例为 0处条目的定义 nu --ide-goto-def 0 script.nu以--ide-complete为例把4替换成script.nu中某个字符偏移后运行能打印出该位置的候选项说明解析与补全链路工作正常--ide-check的输出则对应 LSP 模式下编辑器里会收到的诊断。限制与边界nu-lsp是内部 crateREADME 明确它不设计为直接向插件作者或其他用户提供支持仓库也未提供面向具体编辑器的现成配置。语义着色目前只暴露FUNCTION一种 token 类型且按代码注释仅覆盖含空格的内建命令名其余类型的语法高亮要依赖编辑器自身。在 LSP 模式下 stdout 属于协议通道脚本中直接打印到 stdout 的内容会污染通信脚本输出应通过编辑器侧的正常文件保存与运行流程处理。完成上述步骤后的判断标准nu --lsp能持续挂起等待 stdio 输入服务已启动或nu --ide-complete/nu --ide-check对示例.nu文件有实际输出接上支持 stdio 的 LSP 客户端后打开.nu文件即可收到诊断并在补全、悬停、跳转定义等操作上看到对应响应。【免费下载链接】nushellA new type of shell项目地址: https://gitcode.com/GitHub_Trending/nu/nushell创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考