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 后端开发同事就是用得这套配置。

相关推荐
大卫小东(Sheldon)12 小时前
大模型智能体 (agent)简易流程介绍
ai·rust
小杍随笔13 小时前
【Rust 语言编程知识与应用:同步机制详解】
开发语言·算法·rust
Rust研习社18 小时前
Rust 错误处理:thiserror 和 anyhow 的使用
rust
RE-190118 小时前
Polars:告别 Pandas 性能瓶颈,用 Rust 驱动的 DataFrame 库处理亿级数据
开发语言·rust·pandas·polars·ai生成
好家伙VCC18 小时前
# 发散创新:用 Rust 实现高性能事件驱动架构的实践与优化 在现代软件系统中,**事件驱动编程模型**已经成为构
java·开发语言·python·架构·rust
Ivanqhz19 小时前
寄存器分配的核心函数 allocate
java·开发语言·后端·python·rust
浪客川20 小时前
godot-rust入门案例
rust·游戏引擎·godot
淮北4941 天前
vim学习进阶
学习·编辑器·vim
wenlonglanying1 天前
Windows安装Rust环境(详细教程)
开发语言·windows·rust
Rust研习社1 天前
Rust + WebAssembly 新手完全入门指南
rust