Vim专题

本文最后更新于 2023年11月18日 凌晨

这是一篇长期更新博客,搜集到的各种关于 Vim 的内容均会汇总更新至此。

键位参考与速查表

Vim键位参考

程序员Vim速查表(英文)

Linux 下的编译安装

虽然 Ubuntu 等发行版可以直接通过 apt 等工具下载安装 Vim,但这些版本往往不是最新的。可以从 GitHub 下载并在本地编译安装。

克隆仓库

如果是第一次安装,则先将远程仓库克隆到本地:

1
git clone https://github.com/vim/vim.git

如果之前已经在本地有了仓库,且没有做任何修改,则可以直接通过 git pull 命令更新本地仓库。如果对本地仓库进行了一些变更,则可能需要分支合并等 git 操作,在此不展开讨论。

编译安装

1
2
3
4
5
6
7
cd ./vim/src  # 进入刚刚克隆下来的仓库中的 src 目录

make dist # 如果是首次构建,使用本行
# make distclean # 如果之前已经构建过了 Vim 则使用这一行

make
sudo make install

检查一下是否安装成功

1
vim --version

如果显示了详细的 Vim 版本信息,则成功。

更改默认使用的 Vim

在我的机器上,之前已经通过 apt 安装过了 Vim 8.1,直接在命令行输入 vim 命令则会使用该版本,而不是刚才编译安装的 Vim 8.2(默认位于 /usr/local/bin)。为解决该问题,还需要修改一下可执行文件的软链接:

1
2
3
4
5
6
7
$ which vim # 查看 vim 命令对应的可执行文件的位置
/usr/bin/vim
$ sudo mv /usr/bin/vim /usr/bin/vim.backup # 保险起见,并不删除原文件,而是重命名为 vim.backup
$ sudo ln -s /usr/local/bin/vim /usr/bin # 建立新的符号链接
$ which vim
/usr/local/bin/vim
$ vim --version # 可以看到已经是使用编译安装的 8.2 版本了

基本使用

  • 正常模式(Normal-mode)
  • 插入模式(Insert-mode)
  • 命令模式(Command-mode)
  • 可视模式(Visual-mode)

进入 Vim 后,使用 :help 查看文档

进入插入模式

键盘字符 作用
i 在光标所在的字符之前插入需要录入的文本
I 在光标所在行的行首插入需要录入的文本
a 在光标所在的字符之后插入需要录入的文本
A 在光标所在行的行尾插入需要录入的文本
o 光标所在行的下一行行首插入需要录入的文本
O 光标所在行的上一行行首插入需要录入的文本
s 删除光标所在处的字符然后插入需要录入的文本
S 删除光标所在行,在当前行的行首开始插入需要录入的文本

Vim 的退出

命令 作用
:w 保存当前对文件袋修改,但是不退出文件
:w! 强制保存但是不退出文件
:w file 保存当前的文件修改到 file 文件当中
:q! 退出文件,不保存对文件的修改
:qa! 退出所有文件,不保存对所有文件的修改
:wq 退出文件并保存对文件的修改
:x 退出文件并保存对文件的修改
:e file 打开另一个文件
:e! 放弃对文件的所有修改,恢复文件到上次保存对位置
:saveas file 另存为 file

编辑功能与技巧

查找替换

1
:{作用范围}s/{目标}/{替换}/{替换的标志}

多文件与多窗口

缓冲区 Buffer

Vim 打开文件时会创建缓冲区,打开几个文件就创建几个缓冲区,默认加载第一个缓冲区,即显示第一个文件袋内容

命令 作用
:ls 列出缓冲区状态
:files 列出缓冲区状态
:buffers 列出缓冲区状态
:bn 切换下一个缓冲区,显示下一个文件的内容
:bp 切换上一个缓冲区,显示上一个文件的内容
:b number number 为缓冲区的数字编号
:b fileName fileName为文件名称,可以是正则表达式,也可以是文件名中的个别字母

窗口 Window

使用 Vim 打开文件呈现在眼前的就是窗口。窗口用来查看缓冲区内容。可以使用多个窗口查看一个缓冲区,也可以使用多个窗口查看不同的缓冲区

1
vim -o file1 file2 file3

上下分屏

命令 作用 快捷键
:new 新建水平窗口并开式编辑新文件 Ctrl + W n
:vnew 新建垂直窗口并开始编辑新文件
:split 新建水平窗口并显示当前文件 Ctrl + W s
:vsplit 新建垂直窗口并显示当前文件 Ctrl + W v
sview 新建窗口并只读打开文件

标签 Tab

类似浏览器标签页

vimrc 配置

1
vim ~/.vimrc

使用 :version 可以看到Linux下Vim配置文件读取顺序

1
2
3
4
5
6
    系统 vimrc 文件: "$VIM/vimrc"
用户 vimrc 文件: "$HOME/.vimrc"
第二用户 vimrc 文件: "~/.vim/vimrc"
用户 exrc 文件: "$HOME/.exrc"
defaults file: "$VIMRUNTIME/defaults.vim"
$VIM 预设值: "/usr/share/vim"

一个最精简的 vimrc 配置

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
"
" 一个(不是那么)精简的 vimrc
"

set nocompatible " 设置不与vi兼容

filetype plugin indent on " 根据检测到的文件类型加载插件
syntax on " 打开语法高亮

set number " 显示行号

set autoindent " 根据前一行进行缩进
set expandtab " 使用空格替换tabs
set softtabstop =4 " Tab键替换为4个空格
set shiftwidth =4 " >> indents by 4 spaces.
set shiftround " >> indents to next multiple of 'shiftwidth'.

set backspace =indent,eol,start " 使 backspace 按您预期的方式工作
set hidden " 无需保存文件即可在 buffers 缓冲区之间切换
set laststatus =2 " 总是显示状态行
set display =lastline " 尽可能多的显示最后一行

set showmode " 在命令行显示当前模式
set showcmd " 在等待按下更多键之前,显示已经按下的键

set incsearch " 当使用 / 或 ? 搜索时高亮
set hlsearch " 保持匹配项高亮

set ttyfast " 快速刷新屏幕显示
set lazyredraw " 只在必要时刷新显示

set splitbelow " 在当前窗口下打开新窗口
set splitright " 在当前窗口右侧打开新窗口

set cursorline " 快速找到当前行
set wrapscan " Searches wrap around end-of-file.
set report =0 " 始终报告更改的行
set synmaxcol =300 " 只高亮前300行

set list " 显示不可打印的字符
if has('multi_byte') && &encoding ==# 'utf-8'
let &listchars = 'tab:▸ ,extends:❯,precedes:❮,nbsp:±'
else
let &listchars = 'tab:> ,extends:>,precedes:<,nbsp:.'
endif

set encoding=utf-8 " Vim内部使用的编码
set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5
" 使用这些字符集逐一探测即将打开的文件编码

" 将所有临时文件放在同一目录下
" https://github.com/mhinz/vim-galore#handling-backup-swap-undo-and-viminfo-files
set backup
set backupdir =$HOME/.vim/files/backup/
set backupext =-vimbackup
set backupskip =
set directory =$HOME/.vim/files/swap//
set updatecount =100
set undofile
set undodir =$HOME/.vim/files/undo/
set viminfo ='100,n$HOME/.vim/files/info/viminfo
set directory =.,$TEMP

注意此时还需要到对应路径创建文件夹、文件,sh 脚本如下:

1
2
mkdir -p ~/.vim/files/backup ~/.vim/files/swap ~/.vim/files/undo ~/.vim/files/info
mv ~/.viminfo ~/.vim/files/info/viminfo

检查创建好的目录:

1
2
3
4
5
6
7
8
9
10
$ tree ~/.vim
/home/muzing/.vim
└── files
├── backup
├── info
│   └── viminfo
├── swap
└── undo

5 directories, 1 file

字符与编码

https://edyfox.codecarver.org/html/vim_fileencodings_detection.html

插件

插件管理器 vim-plug

nerdtree

目录树

nerdtree效果图

GitHub主页

美化

一些巨好看的界面

https://github.com/fgheng/vime

vime

vime

https://github.com/spf13/spf13-vim

spf13-vim

致谢与念念碎

致谢

学习Vim的过程看了许多大佬的优质博客、帖子、视频教程等,部分链接摘录如下,表示感谢

Vim-China/hello-vim

zempty - 精通 VIM ,此文就够了

保姆级教程!将 Vim 打造一个 IDE (Python 篇) - 王炳明

念念碎

2021-08-29

最早接触 Vim 的时间已经记不清了,可以追溯到接触 Linux(没错,我的Linux文件编辑不是从 nano 而是从 Vim 开始的)命令行和尝试折腾自己的 Linux 服务器的时代。20年的夏天也肯定有过系统性学习Vim基本操作的经历。然而因为缺乏笔记和常用实战,时至今日,不用查表就能下意识使用的Vim操作也仅限于 dd :wq 等了。

最近终于把一年前就已经开始学的 LaTeX 开始运用到了实际,写出了我的第一个 .tex 文件。加之《机械设计》知识点整理仍在编写阶段,对大量快速的文字输入需求大大增加。有需求就有学习的动力,就又回来学习 Vim 了。也许在不久的将来,我也终于可以敲击如飞,快如闪电了。


Vim专题
https://muzing.top/posts/4c5c0de/
作者
Muzing
发布于
2021年8月29日
更新于
2023年11月18日
许可协议