Post

Vim 使用

Vim 使用

介绍

文本编辑器。


参考资料


使用

1
vimtutor    # 查看 Vim 教程

快捷键

vim 中 j 和 gj 快捷键之间的区别:jgj 都用于向下移动光标,但 gj 在处理折行文本时表现不同(前者不考虑,后者考虑),更视觉友好。

  • 三种模式:命令模式(Command mode)、输入模式(Insert mode)、底线命令模式(Last line mode)
  • 启动时进入的是命令模式; i/a/o 进入输入模式;esc 键退出输入模式,切换到命令模式;: 切换到底线命令模式,以在最底行输入命令

进入输入模式快捷键

1
2
3
i          # 从光标所在处输入
a          # 从光标所在的下一个字符处输入
o          # 在光标所在的下一行处输入新的一行

底线命令模式快捷键

1
2
3
4
5
6
7
8
9
10
:q         # 退出(需文件没有改动)
:q!        # 强制退出(不保存文件改动)
:wq        # 保存后退出 
ZZ         # :q :wq 两个命令的结合
:w file    # 保存成另一个文件

:set nu    # 显示行号
:set nonu  # 显示行号

:term      # 在 vim 中打开终端

可视化模式

1
2
3
v          # 字符可视化模式
V          # 行可视化模式
Ctrl + v   # 块可视化模式

命令模式快捷键

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# 光标移动
j/k/h/l     # 向下/上/左/右移动一个字符
0 / [Home]  # 移动到该行行首;数字 0
$ / [End]   # 移动到该行行尾
gg          # 移动到第一行
G           # 移动到最后一行
nG          # 移动到第 n 行;n 为数字
n<Enter>    # 向下移动 n 行;<Enter> 为 Enter 键
H           # 移动到屏幕的最上方
M           # 移动到屏幕的中央
L           # 移动到屏幕的最下方
e           # 移动到下一个单词尾部
ge          # 移动到前一个单词尾部
w           # 移动到下一个单词头部
b           # 移动到前一个单词头部

# 搜索
/word       # 向光标之下寻找 word 字符串
?word       # 向光标之上寻找 word 字符串
n           # 向下搜寻
N           # 向上搜寻

# 替换
:s/word1/word2/g   # 在该行将 word1 替换为 word2;gc 替换前询问
:n1,n2s...         # n1-n2 行
:1,$s...           # 第一行至最后一行
:%s...             # 同上

# 复制
yy          # 复制光标所在行
nyy         # n 为数字;复制光标所在向下 n 行
yG          # 复制光标所在行到最后一行
y1G         # 复制光标所在行到第一行
y$          # 复制光标所在处至该行行尾
y0          # 数字 0;复制光标所在处至该行行首
byw         # 复制光标所在的一个单词
nyl         # 复制光标向后的 n 个字符

# 粘贴
p            # 粘贴至光标下一行
P            # 粘贴至光标上一行
J            # 将光标所在行与下一行的内容结合成同一行

# 删除
dd           # 删除光标所在行
ndd          # 删除光标所在的向下 n 行
dG           # 删除光标所在行到最后一行
d1G          # 删除光标所在处至该行行尾
d$ / D       # 删除光标所在至行尾
d0           # 删除光标所在至行首
nd + ↑       # 删除光标所在行向上 n 行
nd + ↓       # 删除光标所在行向下 n 行(同 ndd)
x            # 删除光标处字符
X            # 删除光标处前一个字符
bdw          # 删除光标所在的一个单词(同 daw)

# 撤回/重复
u           # 恢复前一个动作
Ctrl + r    # 重做上一个动作
.           # 重复前一个动作(普通模式,替换操作无法重复)
&           # 重复前一个替换操作

# 分屏
:split      # 上下分屏
:vsplit     # 左右分屏
Ctrl + ww   # 切换屏幕
Ctrl +w + h/j/k/l  # 切换左/下/右/上窗口

# 大小写转换
shift + ~    # 光标所在位置字符转大小写
guw / gue    # 光标所在位置的单词转小写
gUw / gUe    # 光标所在位置的单词转大写
gu3w / gu3e  # 光标后面的3个单词转小写
gU3w / gU3e  # 光标后面的3个单词转大写
guu          # 光标所在行转小写
gUU          # 光标所在行转大写

其他快捷键

1
2
3
4
5
:5m3        # 将第 5 行剪切并粘贴到第 3 行下方
> + Enter   # 该行首右移一个 Tab 距离
>4 + Enter  # 4 行行首右移一个 Tab 距离



配置

1
2
3
4
5
6
# 按键映射


# 命令
<silent>   # 不在命令行中显示执行(映射/命令)信息
<bar>      # 管道符

插件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# plug 相关命令
:PlugInstall                  # 安装插件
:PlugClean                    # 卸载插件
:PlugUpdate                   # 更新插件


# 推荐插件
lifepillar/vim-solarized8     # theme 美化
vim-airline/vim-airline       # 状态栏美化
vim-airline/vim-airline-themes
ryanoasis/vim-devicons        # 图标

iamcco/markdown-preview.nvim  # 预览 md 文档
dkarter/bullets.vim           # md 列表
dhruvasagar/vim-table-mode    # 格式化 md 表格
mzlogin/vim-markdown-toc      # 生成 md 目录(对 GitHub 有用)

vim-autoformat/vim-autoformat # 代码格式化
preservim/nerdcommenter       # 代码注释

preservim/nerdtree            # 目录树
tpope/vim-surround            # 括号匹配
easymotion/vim-easymotion     # 快速移动
neoclide/coc.nvim             # 提供代码自动补全、语法检查和语言服务器支持
SirVer/ultisnips              # 代码片段
dense-analysis/ale            # 异步代码检查和修复
junegunn/fzf.vim              # 模糊搜索

tommason14/lammps.vim         # LAMMPS 输入参数高亮
Lattay/vasp.vim               # VASP 输入文件参数高亮


# nerdcommenter 相关命令
[count]<leader>cc             # 注释当前行
[count]<leader>cu             # 取消注释当前行

其他

vim缓冲区buffer_哔哩哔哩_bilibili

缓冲区 buffer

1
2
3
4
5
6
7
8
9
10
11
:e file      # 打开文件并创建一个新的 buffer
:ls          # 列出所有 buffer(状态及 buffer ID)
:bn          # 切换到下一个 buffer :bnext
:bp          # 切换到上一个 buffer :bprev
:bID         # 根据 buffer ID 切换
:bdID        # 根据 buffer ID 删除 buffer
:hide        # 隐藏 buffer,但不会关闭文件,只是不再显示


# 在 .vimrc 中设置
set hidden   # 默认 buffer 未保存切换会警告;关闭该选项

寄存器

1
2
"ay       # 复制
"ap       # 粘贴

折叠

手动折叠:进入可视化模式,选中要折叠的行,zf 创建折叠

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
:set foldenable  # 开启折叠功能
:set fdm=...     # 设置折叠方法;manual、syntax、marker、indent 等
:mkview          # 保存文件的折叠状态
:loadview        # 加载折叠信息

# 快捷键
zo               # 打开折叠
zc               # 关闭折叠
za               # 切换折叠状态
zj               # 移动至下一折叠
zk               # 移动至上一折叠
zr               # 打开所有折叠
zR               # 打开所有折叠及其嵌套折叠
zm               # 关闭所有折叠
zM               # 关闭所有折叠及其嵌套折叠
zE               # 删除所有折叠

Neovim 使用

安装

1
2
3
4
5
brew install neovim   # macOS

# 源码编译安装
make CMAKE_EXTRA_FLAGS="-DCMAKE_INSTALL_PREFIX=$HOME/src/neovim"
make install

配置

GitHub - bryant-video/neovim-tutorial


LazyVim

轻松上手LazyVim:最强大功能的NeoVim编辑器!_哔哩哔哩_bilibili

  • LazyVim:一键配置 Neovim(思源一号超算无法使用)

  • 目录结构

1
2
3
4
5
6
7
8
9
10
11
12
~/.config/nvim
├── lua
│   ├── config
│   │   ├── autocmds.lua
│   │   ├── keymaps.lua
│   │   ├── lazy.lua
│   │   └── options.lua
│   └── plugins           # 自定义插件设置
│       ├── spec1.lua
│       ├── **
│       └── spec2.lua
└── init.lua
  • 默认 <leader> 键是 <space> 空格键;<localleader> 键默认是 \ 键(与特定文件类型或插件相关)
  • 点击 <space> 键,会弹出包含以 <space> 开头的所有可能的键盘映射的窗口

  • LazyVim 预装插件/工具
    • 安装的插件路径:~/.local/share/nvim/lazy
1
2
3
4
5
6
7
8
9
williamboman/mason.nvim         # 编程语言 LSP 管理器
folke/flash.nvim                # 代码导航(字符、单词跳转)
nvim-neo-tree/neo-tree.nvim     # 文件系统管理(树状视图显示文件和目录结构)
nvim-telescope/telescope.nvim   # 模糊查找(提供交互式界面)
jesseduffield/lazygit           # git UI,非插件

# 推荐插件
abecodes/tabout.nvim            # 使用 Tab 键跳出括号
lervag/vimtex                   # LaTeX 写作
  • 相关命令
1
2
3
4
5
6
7
8
9
:                 # 打开命令窗口
:LazyExtras       # 选择是否开启选定额外功能(以编程语言分类进行插件推荐;开启会安装对应的插件)

# tree-sitter 插件命令
:TSInstall        # 安装编程语言 parser
:TSUpate          # 更新

# mason 插件命令
:Mason            # 打开 Mason 插件的界面
  • 键位映射
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# 通用
<C-h>             # 跳转左侧窗口
<C-l>             # 跳转右侧窗口
<C-j>             # 跳转下方窗口
<C-k>             # 跳转上方窗口
<C-s>             # 保存文件
<leader>-         # 向下拆分窗口
<leader>|         # 向右拆分窗口
<leader>wd        # 删除窗口
<leader>bd        # 删除 buffer;b 指 buffer
<leader>bb        # 切换到其他 buffer
<leader>`         # 切换到其他 buffer
[w                # 上一个 Warning
]w                # 下一个 Warning
<leader>us        # 切换拼写;u 指 UI 界面
<leader>ul        # 切换行号
<leader>uL        # 切换相对行号
<leader>ub        # 切换背景
<leader>uw        # 切换自动换行
<leader>gg        # 打开 lazygit 窗口(根目录);g 指 git
<leader>gG        # 打开 lazygit 窗口(当前工作路径)
<leader>ft        # 打开 Terminal
<C-/>             # 隐藏 Terminal
<leader>qq        # 退出所有(窗口、文件等)


# telescope 插件
<leader><space>   # 查找文件
<leader>,         # 切换 buffer
<leader>/         # Grep
<leader>sg        # Grep
<leader>:         # 命令历史
<leader>fr        # 显示最近文件 
<leader>gc        # 显示 git commit
<leader>gs        # 显示 git status
<leader>sc        # 命令历史

# neo-tree 插件
<leader>be        # 打开 buffer 目录树
<leader>e         # 打开文件目录树


# LSP
gd                # 转到定义
K                 # 悬停

# flash 插件
s                 # 字符查找

  • mason lsp 指定 python 解释器
    • mason 安装的编程语言服务器路径:~/.local/share/nvim/mason
1
2
3
4
5
6
7
8
-- ~/.config/nvim/init.lua
require('lspconfig').pyright.setup{
    settings = {
        python = {
            pythonPath = "/path/python",  -- 替换 Python 解释器路径
        }
    }
}

1
2
3
4
5
6
7
8
# vimtex 命令
\ll         # 编译
\lk         # 停止编译;或 第二次 \ll
\lv         # 打开 PDF 查看器
\lc         # 清除编译过程中生成的临时文件/辅助文件

:help vimtex-tex-program  # 查看 vimtex 文档
:help vimtex_view_method  # 查看具体设置
  • vimtex 插件在 LazyVim 中的设置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
-- ~/.config/nvim/lua/plugin/vimtex.lua
return {
    {
      "lervag/vimtex",
      lazy = false,
      init = function()
        -- 设置 pdf 阅读器;macOS 可设置为 skim
        vim.g.vimtex_view_method = "skim"
        vim.g.vimtex_view_general_options = '-r @line @pdf @tex'
        -- 编译报错时不自动弹出错误窗口 :copen 手动打开
        vim.g.vimtex_quickfix_mode = 0
        -- 编译出现警告时,Quickfix 窗口在非焦点状态下打开,但不会自动切换到该窗口
        vim.g.vimtex_quickfix_open_on_warning = 2
        -- 指定 LaTeX 风格
        vim.g.tex_flavor = "latex"
        -- 使用 latexmk 进行编译
        vim.g.vimtex_compiler_method = "latexmk"
        -- latex 编译参数
        vim.g.vimtex_compiler_latexmk = {  
            options = {
              '-xelatex',
              '-pdf',
              '-shell-escape',
              '-verbose',
              '-file-line-error',
              '-synctex=1',
              '-interaction=nonstopmode',
            }
        }
      end,
      -- 仅在编辑 tex/latex 文件时加载
      ft = { "tex", "latex" },
    },
}  -- 最后一行不能有空行
This post is licensed under CC BY 4.0 by the author.