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 小时前
青少年编程与数学 02-019 Rust 编程基础 10课题、函数、闭包和迭代器
开发语言·青少年编程·rust·编程与数学
明月看潮生1 小时前
青少年编程与数学 02-019 Rust 编程基础 09课题、流程控制
开发语言·算法·青少年编程·rust·编程与数学
头疼的程序员2 小时前
linux入门学习(介绍、常用命令、vim、shell)
linux·vim
一丝晨光7 小时前
数值溢出保护?数值溢出应该是多少?Swift如何让整数计算溢出不抛出异常?类型最大值和最小值?
java·javascript·c++·rust·go·c·swift
景天科技苑7 小时前
【Rust泛型】Rust泛型使用详解与应用场景
开发语言·后端·rust·泛型·rust泛型
zhuziheniaoer7 小时前
rust-candle学习笔记11-实现一个简单的自注意力
笔记·学习·自然语言处理·rust
烟雨迷1 天前
Linux环境基础开发工具的使用(yum、vim、gcc、g++、gdb、make/Makefile)
linux·服务器·学习·编辑器·vim
Jogging-Snail1 天前
Linux工作台文件操作命令全流程解析(高级篇之vim和nano精讲)
linux·运维·vim·文件操作·文本编辑·nano
明月看潮生1 天前
青少年编程与数学 02-019 Rust 编程基础 08课题、字面量、运算符和表达式
开发语言·青少年编程·rust·编程与数学
天天打码1 天前
Rspack:字节跳动自研 Web 构建工具-基于 Rust打造高性能前端工具链
开发语言·前端·javascript·rust·开源