NeoVim ALE 插件安装并配置 Rust Analyzer

更新日期: 2024-05-05 阅读次数: 388 字数: 849 分类: Vim

在 NeoVim 中浏览 Rust Loco 项目代码时,想查看默认的 route 配置有哪些。

例如,src/app.rs 中,定义了:

fn routes(_ctx: &AppContext) -> AppRoutes {
    AppRoutes::with_default_routes()
        .add_route(controllers::notes::routes())
        .add_route(controllers::auth::routes())
        .add_route(controllers::user::routes())
}

但是,我想通过 gd (go to defination) 快捷键快速跳转到 AppRoutes::with_default_routes() 函数的定义处。

可是按下了 gd 并没有任何反应,说明 ALEInfo 插件默认没有启用 rust 相关的功能。

查看当前 ALE 插件的配置

用 NeoVim 打开一个 rust 文件,然后输入:

:ALEInfo

会看到当前 rust 相关的配置

Current Filetype: rust
Available Linters: ['analyzer', 'cargo', 'cspell', 'rls', 'rustc']
Enabled Linters: ['cargo', 'rls']
Ignored Linters: []
Suggested Fixers:
'remove_trailing_lines' - Remove all blank lines at the end of a file.
'rustfmt' - Fix Rust files with Rustfmt.
'trim_whitespace' - Remove all trailing whitespace characters at the end of every line.

rust analyzer 是何物

rust-analyzer is an implementation of Language Server Protocol for the Rust programming language. It provides features like completion and goto definition for many code editors, including VS Code, Emacs and Vim.

设置 ALE 插件

可以忽略其中的非 rust 语言的配置:

" ALE plugin
let g:ale_fixers = {
\   '*': ['remove_trailing_lines', 'trim_whitespace'],
\   'go': ['gofmt', 'goimports'],
\   'rust': ['rustfmt'],
\}

let g:ale_linters = {
\   'go': ['gofmt', 'gopls', 'govet'],
\   'rust': ['analyzer'],
\}

" Remap gd to use ALEGoToDefinition and open in a new tab
map gd :ALEGoToDefinition -tab<CR>

安装 rust analyzer

仅仅启用了 ALE 的配置是不够的,还需要实际安装一下 rust analyzer。

rustup component add rust-analyzer

验证安装成功:

> cargo --version
cargo 1.77.2 (e52e36006 2024-03-26)

> rust-analyzer --version
rust-analyzer 1.77.2 (25ef9e3 2024-04-09)

> which rust-analyzer
/home/zhongwei/.cargo/bin/rust-analyzer

会看到 rust 版本跟 rust-analyzer 版本是一致的。

测试

可以用 cargo new 一个新的小项目,例如打印当前文件所在目录:

use std::env;

fn main() {
    println!("Hello, world!");
    if let Ok(current_dir) = env::current_dir() {
        println!("Current directory is: {:?}", current_dir);
    } else {
        println!("Failed to get current directory");
    }
}

这时在 current_dir 上按下 gd, 需要等一会才能自动跳到函数定义处。

应该是 rust-analyzer 在解析代码吧,而对于 rust loco 这种大项目, 包含无数依赖的情况,第一次跳转要等到半个小时以上,不知道是在下载源码,还是分析过程就是这么慢。

至此,配置就完成了 !

电池杀手

最近一直在沙发上躺着用笔记本写代码,但是发现安装了 rust analyzer 之后,CPU 狂飙,电池续航大打折扣。 所以,如果喜欢移动办公,这个功能还是谨慎开启,或者临时关闭也好。

VIM 中没有响应

如果使用了 rustup 安装 rust-analyzer, 请忽略下面的内容。

虽然安装了 rust-analyzer, 并且配置了 VIM ALE 插件,但是输入 gd 依然没有反应。 于是尝试在终端下执行:

rust-analyzer

报错:

error: Unknown binary 'rust-analyzer' in official toolchain 'stable-x86_64-unknown-linux-gnu'

原因是我之前安装 rust-analyzer 不是通过 rustup 工具安装的,而是手动下载安装的,这种安装方式就会出现上面的报错。 因为 rust-analyzer 需要分析 rust 内置的库代码,所以需要保持跟 rust 版本一致。而自己安装很难保证。

请忽略下面的步骤:

首先去 github 上下载最新的安装包:

https://github.com/rust-lang/rust-analyzer/releases

下载完成之后,解压, 然后移动到 /usr/bin 目录下 (或者任何系统环境变量 $PATH 包含的目录下)

gzip -d rust-analyzer-x86_64-unknown-linux-gnu.gz
sudo mv rust-analyzer-x86_64-unknown-linux-gnu /usr/bin/rust-analyzer

参考

关于作者 🌱

我是来自山东烟台的一名开发者,有敢兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式