vim/neovim 配置和使用

Eric 2024年06月02日 803次浏览

安装neovim

The Releases page provides pre-built binaries for Linux systems.

curl -LO https://github.com/neovim/neovim/releases/latest/download/nvim-linux64.tar.gz
sudo rm -rf /opt/nvim
sudo tar -C /opt -xzf nvim-linux64.tar.gz

After this step add this to ~/.bashrc:

export PATH="$PATH:/opt/nvim-linux64/bin"

neovim 配置

配置参考 https://martinlwx.github.io/zh-cn/config-neovim-from-scratch/

Nvim 的配置目录在 ~/.config/nvim 下。在 Linux/Mac 系统上,Nvim 会默认读取 ~/.config/nvim/init.lua 文件

建议目录

nvim
├── init.lua
└── lua
    ├── colorscheme.lua
    ├── config
    │   └── nvim-cmp.lua
    ├── keymaps.lua
    ├── lsp.lua
    ├── options.lua
    └── plugins.lua

解释如下

  • init.lua 为 Nvim 配置的 Entry point,我们主要用来导入其他 *.lua 文件
    • colorscheme.lua 配置主题
    • keymaps.lua 配置按键映射
    • lsp.lua 配置 LSP
    • options.lua 配置选项
    • plugins.lua 配置插件
  • config 用于存放各种插件自身的配置,文件名为插件的名字,这样比较好找。这里的 nvim-cmp.lua 就是 nvim-cmp 插件的配置文件
  • lua 目录。当我们在 Lua 里面调用 require 加载模块(文件)的时候,它会自动在 lua 文件夹里面进行搜索
    • 将路径分隔符从 / 替换为 .,然后去掉 .lua 后缀就得到了 require 的参数格式
    • 比如要导入上面的 nvim-cmp.lua 文件,可以用 require(‘config.nvim-cmp’)

选项配置

主要用到的就是 vim.g、vim.opt、vim.cmd 等,我制造了一个快速参照对比的表格

In Vim In Nvim Note
let g:foo = bar vim.g.foo = bar
set foo = bar vim.opt.foo = bar set foo = vim.opt.foo = true
some_vimscript vim.cmd(some_vimscript)

常用插件和命令

  • 插件管理器 lazy.nvim
    • 命令 :Lazy 查看插件列表
  • 自动补全插件 nvim-cmp
  • 语法高亮nvim-treesitter
    • :TSInstall {语言编码} 安装对应语言的高亮支持
    • :TSInstallInfo 查看支持和已安装的语言
  • LSP插件 mason.nvimmason-lspconfig.nvim
    • 命令 :Mason 查看插件安装情况
    • 每个 LSP 都存在自己可以配置的选项,你可以自己去对应 LSP 的 GitHub 仓库查阅更多信息。如果要用默认配置的话,基本上每一个新的语言都只需要设置 on_attach = on_attach
  • 文件管理插件 nvim-tree.lua
  • go 开发插件 go.nvim
  • fzf-lua 文件搜索插件 fzf-lua

插件依赖

# 插件依赖
sudo apt install -y gcc
# 文件搜索
sudo apt install -y fzf 
# pylsp 需要,其他语言lsp都需要其对应的开发环境, 如 go, nodejs 等
sudo apt install -y python3-venv

nvim-tree/nvim-web-devicons 插件图标字体

nvim-web-devicons 这个插件,依赖 NerdFont 字体扩展。

www.nerdfonts.com 中包含的符号,作为常用字体的补充,可以从 Font Downloads 页面选择合适的字体 (例如 Hack),然后下载并保存到 /usr/share/fonts 或者 ~/.local/share/fonts 目录下,执行如下命令。

# 下载字体
wget -P ~/Downloads/ https://github.com/ryanoasis/nerd-fonts/releases/download/v3.2.1/FiraMono.zip 
unzip ~/Downloads/FiraMono.zip 
# 解压字体
sudo unzip FiraMono.zip  -d /usr/share/fonts/
# 清理缓存并查看
fc-cache -f -v
fc-list | grep "FiraMono"

建议使用 FiraMono 字体,相比来说要跟全面一些。另外,还可以对字体的加载进行优化,这里不做过多介绍。然后,在终端 (如 Gnome Terminal) 中选择对应的字体即可。

在 nvim 中可以通过 :lua print(vim.inspect(require'nvim-web-devicons'.get_icons())) 命令查看当前加载的字体。

vim/neovim 常用快捷操作

参考文档 https://gitlab.com/wsdjeg/Learn-Vim_zh_cn/-/blob/master/directory.md

概念

Buffers 缓冲区

buffer就是内存中的一块空间,您可以在这里写入或编辑文本。当您在Vim中打开一个文件时,文件的数据就与一个buffer绑定。当您在Vim中打开3个文件,您就有3个buffers

遍历所有buffers,有以下几种方法:

  • :bnext 切换至下一个buffer(:bprevious切换至前一个buffer)。
  • :buffer + 文件名。(按下<Tab>键Vim会自动补全文件名)。
  • :buffer + n, n是buffer的编号。比如,输入:buffer 2将使您切换到buffer #2。
  • 按下Ctrl-O将跳转至跳转列表中旧的位置,对应的,按下Ctrl-I将跳转至跳转列表中新的位置。这并不是属于buffer的特有方法,但它可以用来在不同的buffers中跳转。我将在第5章详细讲述关于跳转的知识。
  • 按下Ctrl-^跳转至先前编辑过的buffer。

退出Vim

顺带说一句,如果您已经打开了多个buffers,您可以使用quit -all来关闭所有的buffers:

:qall

如果您想关闭所有buffers但不保存,仅需要在后面加!(叹号)就行了:

:qall!

若要保存所有buffers然后退出,请运行:

:wqall

Window 窗口

一个window就是在buffer上的一个视口。

窗口之间导航,使用这些快捷键:

Ctrl-W H    移动光标到左边的窗口
Ctrl-W J    移动光标到下面的窗口
Ctrl-W K    移动光标到上面的窗口
Ctrl-W L    移动光标到右边的窗口

这里有一些普通模式下关于窗口的命令:

Ctrl-W V    打开一个新的垂直分割的窗口
Ctrl-W S    打开一个新的水平分割的窗口
Ctrl-W C    关闭一个窗口
Ctrl-W O    除了当前窗口,关闭所有其他的窗口

下面的列表列出了一些有用的关于windows的命令行命令

:vsplit filename    垂直分割当前窗口,并在新窗口中打开名为filename的文件。
:split filename     水平分割当前窗口,并在新窗口中打开名为filename的文件。
:new filename       创建一个新窗口并打开名为filename的文件。

花一点时间理解上面的知识。要了解更多信息,可以查看帮助:h window

Tabs 标签页

Tabs就是windows的集合。它就像窗口的布局。

打开file1.js

vim file1.js

若要在新tab中打开file2.js

:tabnew file2.js

有用的关于tab导航的命令:

:tabnew file.txt    在tab中打开一个文件
:tabclose           关闭当前tab
:tabnext            切换至下一个tab
:tabprevious        切换至前一个tab
:tablast            切换至最后一个tab
:tabfirst           切换至第一个tab

可以输入gt切换到下一个标签页(对应的,可以用gT切换到前一个标签页)。也可以传递一个数字作为参数给gt,这个数字是tab的编号。若想切换到第3个tab,输入3gt

不同的tab中使用不同的窗口布局。

若想让Vim启动时就包含多个tabs,您可以在终端中运行如下命令:

vim -p file1.js file2.js file3.js

在文件中移动

字符导航

最基本的移动单元是上下左右移动一个字符。

h   左
j   下
k   上
l   右

计数移动

[计数] + 移动

如果你想向右移动9个字符,你可以使用9l来代替按9次l

单词导航

w		移动到下一个单词的开头
W		移动到下一个词组的开头
e		移动到下一个单词的结尾
E		移动到下一个词组的结尾
b		移动到前一个单词的开头
B		移动到前一个词组的开头
ge	移动到前一个单词的结尾
gE	移动到前一个词组的结尾

当前行导航

0		跳到本行第一个字符
^		跳到本行第一个非空字符
g_      跳到本行最后一个非空字符
$		跳到本行最后一个字符
n|      跳到本行第n列
f   在同一行向后搜索第一个匹配
F   在同一行向前搜索第一个匹配
t   在同一行向后搜索第一个匹配,并停在匹配前
T   在同一行向前搜索第一个匹配,并停在匹配前
;   在同一行重复最近一次搜索
,   在同一行向相反方向重复最近一次搜索

句子和段落导航

(   跳到前一个句子
)   跳到下一个句子
{   跳转到上一个段落
}   跳转到下一个段落

匹配导航

%    Navigate to another match, usually works for (), [], {}

行号导航

gg      跳转到第一行
G       跳转到最后一行
nG      跳转到第n行
n%      跳到文件的n%

窗格导航

H   跳转到屏幕的顶部
M   跳转到屏幕的中间
L   跳转到屏幕的底部
nH  跳转到距离顶部n行的位置
nL  跳转到距离底部n行的位置

滚动

Ctrl-e    向下滚动一行
Ctrl-d    向下滚动半屏
Ctrl-f    向下滚动一屏
Ctrl-y    向上滚动一行
Ctrl-u    向上滚动半屏
Ctrl-b    向上滚动一屏

你也可以相对当前行进行滚动

zt    将当前行置于屏幕顶部附近
zz    将当前行置于屏幕中央
zb    将当前行置于屏幕底部

搜索导航

/   向后搜索一个匹配
?   向前搜素一个匹配
n   重复上一次搜索(和上一次方向相同)
N   重复上一次搜索(和上一次方向相反)
*   向后查找光标所在的完整单词
#   向前查找光标所在的完整单词
g*  向后搜索光标所在的单词
g#  向前搜索光标所在的单词

位置标记

ma    用a标签标记一个位置
`a    精确回到a标签的位置(行和列)
'a    跳转到a标签的行

使用:marks查看所有标签,你也许会注意到除了a-zA-Z以外还有别的标签,其中有一些例如:

''   在当前buffer中跳转回到上一次跳转前的最后一行
``  在当前buffer中跳转回到上一次跳转前的最后一个位置
`[  跳转到上一次修改或拷贝的文本的开头
`]  跳转到上一次修改或拷贝的文本的结尾
`<  跳转到最近一次可视模式下选择的部分的开头
`>  跳转到最近一次可视模式下选择的部分的结尾
`0  跳转到退出Vim前编辑的最后一个文件