安装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.nvim 和 mason-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前编辑的最后一个文件