0x01. 也许你该用 NeoVim 写 Rust

NeoVim 是一个 Vim 的 fork 版,更新非常频繁,支持很多新的编辑器特性,譬如内置 LSP(Language Server Protocol) 支持。这趟来把它配成一个 Rust IDE。

安装 NeoVim

先搞定 macOS 下的 NeoVim 安装,这个平台我建议是使用 Homebrew,然后通过

bash 复制代码
brew install neovim

就可以安装 NeoVim。

至于 Linux 下,由于发行版太多,建议查看 NeoVim INSTALL.md,找自己使用得发行版的安装方式。

NeoVim 配置目录

我们知道,NeoVim 是用 Lua 跟 Vimscript 写配置文件的,Vimscript 是原先 Vim 原生支持的 DSL,而 Lua 则是另一个通用脚本语言,对于多数软件开发同行而言,Lua 更易学,所以跳过 Vimscript 直接用 Lua 来配置 NeoVim。

NeoVim 的 Lua 入口是 ~/.config/nvim(macOS/Linux 这方面相同,个人十多年没用纯 wINDOWS 写过代码,我默认 wINDOWS 用户都是用 WSL2 下的 Linux)文件夹下的 init.lua 文件,所以配置的第一桩事就是在上述文件夹下建个 init.lua 文件,然后在 init.lua 同级目录建一个 lua 文件夹,如果要考虑代码风格的话,可以建一个 stylua.toml 的文件,有一些文档说明就加个 README.md 文件。

最后目录结构像下面这样

bash 复制代码
.
├── README.md
├── init.lua
├── lua
└── stylua.toml

这是我当前使用的 stylua.toml 文件内容

toml 复制代码
indent_type = "Spaces"
indent_width = 2
no_call_parentheses = true
column_width = 80

使用前可以通过 Cargo 安装 StyLua

bash 复制代码
cargo install stylua

具体格式化的配置可以参考 StyLua 的 README

公共的基础配置

我们在 init.lua 文件内引入公共的基础配置,现在你了解到 Lua 的 require 语法了

lua 复制代码
require "common.init"

然后在上面提到的 lua 文件夹下建立 common 文件夹,在里面创建一个文件 init.lua,这样最外层的入口就能引入到这个文件了。接着在 common 文件夹内创建 basic.lua 文件,同时 common 内的 init.lua 引入这个 basic 的文件

lua 复制代码
require "common.basic"

现在整体的目录结构是这样的

bash 复制代码
.
├── README.md
├── init.lua
├── lua
│   └── common
│       ├── basic.lua
│       └── init.lua
└── stylua.toml

至于 basic.lua 文件长这样

lua 复制代码
vim.g.encoding = "UTF-8"
vim.o.fileencoding = "utf-8"
vim.o.scrolloff = 8
vim.o.sidescrolloff = 8
vim.wo.number = true
vim.wo.relativenumber = true
vim.wo.cursorline = true
vim.wo.cursorcolumn = true
vim.wo.signcolumn = "yes"
vim.wo.colorcolumn = "80"
vim.o.tabstop = 2
vim.bo.tabstop = 2
vim.o.softtabstop = 2
vim.o.shiftround = true
vim.o.shiftwidth = 2
vim.bo.shiftwidth = 2
vim.o.expandtab = true
vim.bo.expandtab = true
vim.o.autoindent = true
vim.bo.autoindent = true
vim.o.smartindent = true
vim.o.ignorecase = false
vim.o.hlsearch = true
vim.o.incsearch = true
vim.o.showmode = false
vim.o.cmdheight = 2
vim.o.autoread = true
vim.bo.autoread = true
vim.o.wrap = false
vim.wo.wrap = false
vim.o.whichwrap = "b,s,<,>,[,]"
vim.o.hidden = true
vim.o.mouse = ""
vim.o.updatetime = 300
vim.o.timeoutlen = 300
vim.o.splitbelow = true
vim.o.splitright = true
vim.opt.completeopt = "menu,menuone,noselect"
vim.o.termguicolors = true
vim.o.list = true
vim.o.listchars = "space: "
vim.o.wildmenu = true
vim.o.shortmess = vim.o.shortmess .. "c"
vim.o.pumheight = 10
vim.o.showtabline = 2
vim.o.clipboard = "unnamed,unnamedplus"
vim.g.loaded_ruby_provider = 0
vim.g.loaded_perl_provider = 0

vim.g.loaded_netrw = 0
vim.g.loaded_netrwPlugin = 0

local prefix = vim.fn.expand "/tmp"
vim.opt.undodir = { prefix .. "/nvim/.undo//" }
vim.opt.backupdir = { prefix .. "/nvim/.backup//" }
vim.opt.directory = { prefix .. "/nvim/.swp//" }

简单解释下

我来介绍这份配置文件的几个知识点,NeoVim 的 Lua 内置一个 vim 的全局变量,这个一个 table 类型,有点类似其他语言的字典(Dictiondary),或者也可以把它理解成面向对象语言的 object,这个 vim 有一个 o 的属性,看上面的配置也能猜到 o 也是 table 类型的,所以可以给它的成员属性赋一些值。当然除了 o 还有其他的属性,总之就是 vim 全局变量上挂了很多配置相关的属性(跟方法),譬如最后配置 undodir,backupdir 这些文件目录用到的 vim.fn.expand 方法,同时脑子灵的人也已经猜到一个知识点,那就是 Lua 的字符串拼接是通过 .. 完成的。

随便解释几个配置,譬如

lua 复制代码
vim.wo.number = true

表示显示行号,在 Vimscript 里是用 set nu 或者 set number 表示,也就是 Vim 的 Vimscript 的一些 DSL 配置通过 Lua 的形式展现。至于其他含义可以通过 Google 查询一下,篇幅有限,不宜花太多时间在这方面。

目前只是第一篇,后面还有几篇,会慢慢讲如何配出一个适合 Rust 的 IDE,也许你会怀疑它能不能拿来做 Rust 大项目开发,事实上我们公司的 Web 后端开发同事就是用得这套配置。

相关推荐
该用户已不存在1 天前
Mojo vs Python vs Rust: 2025年搞AI,该学哪个?
后端·python·rust
大卫小东(Sheldon)1 天前
写了一个BBP算法的实现库,欢迎讨论
数学·rust
echoarts2 天前
Rayon Rust中的数据并行库入门教程
开发语言·其他·算法·rust
ftpeak2 天前
从零开始使用 axum-server 构建 HTTP/HTTPS 服务
网络·http·https·rust·web·web app
咸甜适中2 天前
rust语言 (1.88) 学习笔记:客户端和服务器端同在一个项目中
笔记·学习·rust
咸甜适中2 天前
rust语言 (1.88) egui (0.32.2) 学习笔记(逐行注释)(二十八)使用图片控件显示图片
笔记·学习·rust·egui
huli33202 天前
pingora_web:首款基于 Cloudflare Pingora 的企业级 Rust Web 框架
rust
Pomelo_刘金2 天前
如何优雅地抽离 Rust 子工程:以 rumqttd 为例
rust
几颗流星2 天前
Rust 常用语法速记 - 错误处理
后端·rust
向上的车轮3 天前
如何用 Rust 重写 SQLite 数据库(二):是否有市场空间?
数据库·rust·sqlite