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

相关推荐
fqbqrr16 小时前
2510rs,rust清单1
rust
熊猫钓鱼>_>16 小时前
Rust语言特性深度解析:所有权、生命周期与模式匹配之我见
算法·rust·软件开发·函数·模式匹配·异步编程·质量工具
fqbqrr16 小时前
2510rs,rust清单2
rust
Source.Liu16 小时前
【pulldown-cmark】 初学者指南
rust·markdown·pulldown-cmark
呼啦啦嘎嘎17 小时前
《100 Exercises To Learn Rust》练习笔记
rust
Amos_Web18 小时前
Rust实战课程--网络资源监控器(初版)
前端·后端·rust
WujieLi1 天前
初识 Vite+:一文了解 Rust 驱动的新一代前端工具链
javascript·rust·vite
std860211 天前
Rust 与 Python – 这是未来的语言吗?
开发语言·python·rust
std78792 天前
Rust 与 Go – 比较以及每个如何满足您的需求
开发语言·golang·rust
添砖java‘’2 天前
vim高效编辑:从入门到精通
linux·编辑器·操作系统·vim