vim 是 vi imporoved 的缩写,翻译过来是 vi 编辑器升级版。本文主要从如下方面介绍 vim:
- 安装 vim
- 基本用法 -> 用 vim 做最基本的编辑(在 vim 中活下来)
- 第三方插件
本文介绍 vim,更多在具体细节,希望帮助大家快速记住一些东西,然后经过反复实践形成肌肉记忆,提升效率。本文目标不是研究 vim 的技术细节,研究诸如写 vimscript 的奇技淫巧。
1. 安装 vim
通过包管理器安装,快捷方便;但是如果要新增某些功能,则需要从源码编译安装。
1.1 使用包管理器
CentOS/Rocky Linux/Red Hat
sudo dnf install vim
Ubuntu/Debian
sudo apt install vim
1.2 源码安装
git clone https://github.com/vim/vim.git
cd vim
./configure --with-features=huge --enable-python3interp=yes --prefix=/usr/local --with-python3-config-dir=/usr/lib64/python3.9/config-3.9-x86_64-linux-gnu
make -j8
sudo make install
如果中间有任何修改,需要清理掉中间结果后重新编译:
make clean distclean
make clean
安装好后,执行 vim --version
vim --version 输出
vim --version
VIM - Vi IMproved 9.0 (2022 Jun 28, compiled Nov 28 2022 00:00:00)
Included patches: 1-963
Modified by <[email protected]m>
Compiled by <[email protected]m>
Huge version without GUI. Features included (+) or not (-):
+acl +file_in_path +mouse_urxvt -tag_any_white
+arabic +find_in_path +mouse_xterm -tcl
+autocmd +float +multi_byte +termguicolors
+autochdir +folding +multi_lang +terminal
-autoservername -footer -mzscheme +terminfo
-balloon_eval +fork() +netbeans_intg +termresponse
+balloon_eval_term +gettext +num64 +textobjects
-browse -hangul_input +packages +textprop
++builtin_terms +iconv +path_extra +timers
+byte_offset +insert_expand +perl/dyn +title
+channel +ipv6 +persistent_undo -toolbar
+cindent +job +popupwin +user_commands
-clientserver +jumplist +postscript +vartabs
-clipboard +keymap +printer +vertsplit
+cmdline_compl +lambda +profile +vim9script
+cmdline_hist +langmap -python +viminfo
+cmdline_info +libcall +python3/dyn +virtualedit
+comments +linebreak +quickfix +visual
+conceal +lispindent +reltime +visualextra
+cryptv +listcmds +rightleft +vreplace
+cscope +localmap +ruby/dyn +wildignore
+cursorbind +lua/dyn +scrollbind +wildmenu
+cursorshape +menu +signs +windows
+dialog_con +mksession +smartindent +writebackup
+diff +modify_fname +sodium -X11
+digraphs +mouse -sound -xfontset
-dnd -mouseshape +spell -xim
-ebcdic +mouse_dec +startuptime -xpm
+emacs_tags +mouse_gpm +statusline -xsmp
+eval -mouse_jsbterm -sun_workshop -xterm_clipboard
+ex_extra +mouse_netterm +syntax -xterm_save
+extra_search +mouse_sgr +tag_binary
-farsi -mouse_sysmouse -tag_old_static
system vimrc file: "/etc/vimrc"
user vimrc file: "$HOME/.vimrc"
2nd user vimrc file: "~/.vim/vimrc"
user exrc file: "$HOME/.exrc"
defaults file: "$VIMRUNTIME/defaults.vim"
fall-back for $VIM: "/usr/share/vim"
Compilation: gcc -c -I. -Iproto -DHAVE_CONFIG_H -O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -DSYS_VIMRC_FILE=/etc/vimrc -D_REENTRANT -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1
Linking: gcc -Wl,--enable-new-dtags -Wl,-z,relro -Wl,--as-needed -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,--build-id=sha1 -Wl,-z,relro -Wl,--as-needed -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,--build-id=sha1 -specs=/usr/lib/rpm/redhat/redhat-package-notes -L/usr/local/lib -o vim -lm -lselinux -lncurses -lsodium -lacl -lattr -lgpm -Wl,--enable-new-dtags -Wl,-z,relro -Wl,--as-needed -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,--build-id=sha1 -Wl,-z,relro -Wl,--as-needed -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,--build-id=sha1 -fstack-protector-strong -L/usr/local/lib -L/usr/lib64/perl5/CORE -lperl -lpthread -lresolv -ldl -lm -lcrypt -lutil -lc
可以详细查看 vim 编译的详情。
2. 基本使用 -> 在 vim 中活下来
在 linux 服务器上,有时候不得不面对漆黑的命令行。在 vim 没有额外配置下,开始使用 vim 就成了必备技能。
有一个关于 vim 的笑话是,Stack Overflow 上点击率最高的问题是,如何从 vim 中退出。
2.1 在 vim 中活下来
直观思考,一个编辑器最重要的功能就是:
- 打开/关闭文件
- 新增/删除/修改字符
- 保存或者放弃修改
vim path
这个 path 是文件或者文件夹,则有不同结果:
- 文件 -> vim 普通界面
- 文件夹 -> 通过上下箭头(++”↑”++ ++”↓”++)选择文件,通过 ++“Enter”++ 确认要编辑的文件
按键盘上的 ++“i”++ 键,进入 INSERT mode(插入模式),此时 vim 就是一个普通的编辑器。
- 用键盘的上(++”↑”++)下(++”↓”++)左(++”←”++)右(++”→”++)或者 ++“h”++ ++“k”++ ++“l”++ ++“j”++ 键来移动光标
- 用翻页键 ++“PageUp”++ 和 ++“PageDown”++ 在不同行之间移动
- 用删除键 ++“BackSpace”++ 来删除前面一行的内容
所有编辑完成之后,按 ++“ESC”++ 退出插入模式,按 ++”:”++ ++“w”++ ++“q”++ 保存并关闭文件(++“w”++ for write and ++“q”++ for quit)。
到现在你已经学会了 vim,愉快地用 vim 来提升你的工作效率吧。
3. 更好地使用 vim
活下来肯定不是最终的目标,因为一些其他编辑器司空见惯的功能都还没有涉及到。而且 vim 不可能没有这些功能:
- 选择
- 复制
- 粘贴
- 替换
- 选中多个对象
如果只使用 vim 的基本功能,就像只用一只手来操作键盘。为了更好地使用 vim,这里需要对 vim 进行一些深入了解:
- 基本操作语法
- vim 的三种模式
- 光标移动
- visual 模式
3.1 基本语法
vim 有多种模式,如:
- Normal mode 普通模式
- Insert mode 插入模式
- Visual mode 可视模式
- Command mode 命令行模式
为啥一个编辑器有这么多种模式?还不是为了更好地编辑。
普通模式
普通模式就是把 vim 当成一个只读的阅读器,用于浏览整个文件。用 vim 打开一个文件,默认就是这个模式。这个模式下不牵涉到对内容的修改,所以可有更多的快捷键。
插入模式
插入模式,就涉及到对文件的编辑了。在普通模式下,按住 ++“i”++ 就可以切换到插入模式了。此时再按快捷键,则只是修改编辑的文件。
可视模式
可视模式用于选中一段文本再对其进行操作,在普通模式下按 ++“v”++(逐字符选择)、++“V”++(逐行选择)或 ++ctrl++ + ++“v”++(按矩形块选择)即可进入。选中范围之后,可以配合 ++“d”++、++“y”++、++“c”++ 等命令对选中内容进行删除、复制或修改。
命令行模式
在 vim 处于普通模式时,输入 ++”:”++ 即可进入命令行模式,用于执行相关命令操作,也可以在 vim 中执行 shell 命令。
3.2 光标移动
通过键盘按键(而不是移动鼠标)来移动 vim 光标,这是 vim 高效的一个原因。
单字符移动
键盘的上(++”↑”++)下(++”↓”++)左(++”←”++)右(++”→”++)或者 ++“h”++ ++“k”++ ++“l”++ ++“j”++ 键可实现光标的字符移动。
++“h”++ ++“k”++ ++“l”++ ++“j”++ 是什么鬼?就是键盘上右手最熟悉的地方,并不是所有键盘都有显式的方向键,如果要使用方向键,则可能需要额外按住一些键,如 ++“shift”++。所以就选择了右手最熟悉的 ++“h”++ ++“k”++ ++“l”++ ++“j”++ 来实现。
单词移动
- ++“w”++ 向右移动一个单词,word
- ++“b”++ 向左移动一个单词,back
翻页
- ++“PageUp”++ -> 往上翻一页
- ++ctrl++ + ++“f”++ -> 往前翻一页 forward
- ++“PageDown”++ -> 往下翻一页
- ++ctrl++ + ++“b”++ -> 往后翻一页 back
行滚动
- ++ctrl++ + ++“e”++ -> 整体往上滚动一行
- ++ctrl++ + ++“y”++ -> 整体往下滚动一行
行位置调整
- ++“z”++ ++“t”++ 光标位于顶部 t -> top
- ++“z”++ ++“z”++ 光标位于中间 z -> 可能就是方便
- ++“z”++ ++“b”++ 光标位于底部 b -> bottom
3.3 删除行
- ++“d”++ ++“d”++:剪切掉当前行
- ++“p”++:粘贴到光标下一行
4. vim 配置
主要目标是提升熟练程度。和一般的工具一样,vim 支持两种配置方式:
- 使用配置命令进行配置
- 使用配置文件进行配置
查看 vim --version 就可以看到配置文件的位置,如文件展示 ~/.vimrc 拥有最高权限。当然,它的权限还是低于配置命令。这个也符合通常使用习惯,有什么临时修改就用命令来实现,而通过配置文件的方式,则可以实现永久修改。我的 ~/.vimrc 配置如下:
set encoding=utf-8
set number # turn off via: set nonumber
syntax on
set autoindent
set tabstop=4
set expandtab
set wrap
set linebreak
set showmatch
set ruler
set background=dark
colorscheme iceberg
set list
set listchars=tab:>-
上面的每一条命令都可以用 ++”:”++ + 命令来实现,如 : set number 则开启行号,: set nonumber 则关闭行号。
5. vim 第三方插件
5.1 原生包管理器
vim 的强大之处在于它拥有丰富的插件。在 vim8 之前,vim 第三方插件方式没有一个正式的官方实现。从 vim8 开始,vim 自己就带有一个插件管理器。从这里获取更多的信息。
原生包管理的方式就是将整个包文件夹放到某个固定文件夹中:
~/.vim/pack/xxx/start/yyy~/.vim/pack/xxx/opt/yyy
其中放到 start 文件夹中的包会被自动加载,但是放到 opt 中的包需要通过 packadd yyy 的方式加载。而且放到 start 文件夹中的包没有办法撤销加载。
5.2 常用插件
YouCompleteMe
这是一个自动补全的插件
mkdir -p ~/.vim/pack/plugins/start
cd ~/.vim/pack/plugins/start
git clone https://github.com/ycm-core/YouCompleteMe.git
cd YouCompleteMe
git submodule update --recursive --init
python3 ./install.py --all --verbose
nerdtree
这个用于 vim 的文件管理。
6. 小结
本文介绍了 vim 的使用。包括 vim 的安装,vim 的最基本使用,以及一些常用快捷键的记忆方式。