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

相关推荐
fqbqrr12 小时前
2510rs,rust,1.88
rust
fqbqrr12 小时前
2510rs,rust,1.90
rust
Brianna Home17 小时前
Rust内存安全:所有权与生命周期的精妙设计
大数据·rust
ZJU_统一阿萨姆18 小时前
Windows系统VSCode配置Rust开发环境(超详细保姆级教程)
windows·vscode·rust
zzywxc78718 小时前
解锁 Rust 开发新可能:从系统内核到 Web 前端的全栈革命
开发语言·前端·python·单片机·嵌入式硬件·rust·scikit-learn
大雨淅淅18 小时前
【编程语言】Rust 入门
开发语言·后端·rust
桃花键神18 小时前
【送书福利-第四十四期】《 深入Rust标准库》
开发语言·后端·rust
像风一样自由202018 小时前
使用Rust构建高性能文件搜索工具
开发语言·后端·rust
蒙娜丽宁19 小时前
Rust 所有权与借用机制深度剖析:原理、常见陷阱与实战优化
rust
蒙娜丽宁21 小时前
Rust 性能优化指南:内存管理、并发调优与基准测试案例
开发语言·性能优化·rust