教你打造个性化vim编辑器
Tofloor
poster avatar
14******70@qq.com
deepin
2018-10-15 08:55
Author
本帖最后由 lolimay 于 2018-10-15 01:04 编辑


首先声明一下,我是个伪 vimer。vim 设计初衷是整个文本编辑工作都用键盘而非鼠标完成。而我这篇文章更多是教你怎么调教 vim 使之能够更加符合你在 VS Code 等现代编辑器的操作习惯,教你如何使用鼠标+键盘的方式在 vim 中编辑文本、如何实现 Ctrl+S 保存、Ctrl+Z 撤销、Ctrl+Y 反撤销等快捷键映射以及教你如何安装插件让你的 vim 变得更加强大。


预备知识
尽管通过配置 .vimrc 配置文件我们可以获得接近在 VS Code 等编辑器中的操作体验,但在此之前我们仍需要对 vim 的原生操作有一点基础的了解,下面我将介绍下 vim 一个很重要的概念——模式。
模式
与大多数编辑器不同,vim 是一种多模式编辑器,共有普通模式(Normal Mode)、插入模式(Insert Mode)、命令模式(Command-line Mode)、可视模式(Visual Mode)、选择模式(Select Mode)和执行模式(Ex Mode)等 6 种模式。我们使用 vim 打开文本文件时默认进入的是普通模式,这时我们不能直接编辑文本但可以按一些快捷键。在普通模式下我常用的操作是:
  • g g 将光标移动至第一行
  • G 将光标移动至最后一行
  • d 3 3 3 3 Enter 清空文件(光标必须在第一行)
  • 2 2 up 将光标向上移动 22 行
  • 2 2 down 光标向下移动 22 行
  • 5 0 g g 将光标移动到第 50 行
  • / word 向下搜索 word
  • u 撤销上一步操作
  • Ctrl r 恢复上一步操作
在普通模式中按下 : 会切换到命令模式,在命令模式下我们可以执行一些 vim 内置的或插件提供的命令,在此模式下我常用的命令是:
  • : wq Enter 保存文件
  • : q Enter 直接退出
  • : q! Enter 强制退出
  • : %y+ Enter 全选并复制到剪贴板(需要配置和 vim 支持)
  • : so ~/.vimrc Enter 重载 vim 配置文件
  • : verbose nmap Enter 查看 Backspace 在普通模式按键映射
在命令模式中加上 ! 前缀会进入执行模式即在 vim 中执行 shell 命令。如我们可以直接在 vim 中直接执行 echo 命令。
: ! echo "Hello World" Enter 在 vim 中执行 shell 命令
在命令模式中删除所有字符或回车执行完一个命令后会自动回到普通模式,在普通模式中我们按下 i 会进入插入模式。插入模式就是我们熟悉的文本编辑模式。在插入模式下我们可以按下 Esc 回到普通模式。在普通模式下按下 v 会进入可视模式,使用鼠标选中文本会进入选择模式,这两个模式我主要用来复制选中文本。
在介绍完这些基础知识后,我们就要接触 vim 的配置文件了,vim 的灵活性在于它的可配置选项丰富(其实也是缺点)。下面我们主要通过修改 vim 的用户配置文件和安装插件等方式实现 vim 的个性化。vim 的数据文件夹是 ~/.vim,这个文件夹是用于存放 vim 的主题配置文件、插件和其它配置。vim 的用户配置文件是 ~/.vimrc,下面的所有配置都需要写入这个文件。
基础配置篇
vim 的默认配置很简洁,但是缺少了很多重要的功能。如 vim 默认不支持使用退格键(Backspace)删除字符、不支持系统剪贴板、不支持鼠标等。但我们可以通过一定的配置去开启 vim 的这些内置功能。你可以参照配置后面的注释选择是否添加该项配置到你的 .vimrc 文件中。
" [Common Configration] 公共配置
" [ui beautification] 界面美化
syntax on " 开启代码高亮
set nu    " 开启行号
set ruler " 开启标尺
set cursorline " 开启高亮光标所在行
set hlsearch " 开启搜索结果高亮显示
set incsearch " 开启搜索逐字符高亮
" [improve performance] 提示性能
set viminfo= " 关闭 viminfo (用于加快 vim 启动速度)
" [polyfill] 功能填补
set clipboard=unnamedplus " 开启系统剪贴板支持(需要手动编译最新版 vim 使其 +clipboard)
set backspace=indent,eol,start " 开启 Backspace 键支持(否则 Backspace 无法删除字符)
" [mouse support] 鼠标支持
set mouse=a " 开启鼠标支持
set selection=inclusive " 指定在选择文本时光标所在位置也属于被选中的范围
set selectmode=mouse,key " 使鼠标和键盘都可以控制光标选择文本
" [tab] tab键
set ts=4 " 指定制表符(tab)等于的空格数
set softtabstop=4 " 开启软制表(如果这4个空格是用tab键打出来的删除会一起删除)
set shiftwidth=4 " 指定自动缩进时缩进4个空格
"
缩进
set smartindent " 开启智能缩进
set autoindent " 开启自动缩进
set cindent " 开启C缩进(对C、C++语言文件有效)
" [other] 其它配置
set backupcopy=yes " 开启备份时行为为覆盖
set cmdheight=1 " 设置命令行的高度为1
主题配置篇
vim 的主题是一个 .vim 文件,里面定义了各种颜色信息。我们只要把喜欢的主题文件下载下来放在 ~/.vim/colors (没有自己新建一个)。然后在 .vimrc 文件中指定下主题下次启动 vim 时就会生效。我个人比较喜欢的主题是 molokai,我们可以在 github 上 获取该主题 。把 molokai.vim 文件复制到 ~/.vim/colors 文件夹后我们在还需要在 .vimrc 文件中指定配置:
" [theme] 主题
colorscheme molokai " 设置主题为 molokai

按键映射篇
vim 默认的很多操作对于 WPS 和 VS Code 使用过多的人我来说还是很不习惯的。比如如果在插入模式下编辑文本时,突然发现需要撤销,这时我们必须要按下 Esc 切换到普通模式下然后按下 u 才能撤销上一步操作、按下 Ctrl+r 才能恢复上一步操作;保存文件必须要按下 Esc 切换到普通模式下后按下 : wq Enter 才能保存文件…这些操作对于只用键盘敲代码的极客来说可能是没有问题的,但是对于我这种习惯用鼠标加键盘的操作的菜鸡来说还是不是很友好的。我更倾向于直接按下 Ctrl+s 保存文件、Ctrl+Z 撤销上一步操作以及 Ctrl+Y 恢复上一步操作。下面是我的按键映射配置,供各位参考:
" [Key Mappings]
" Ctrl+S to save file in Normal Mode and Insert Mode
" Be notice that you should add `stty -ixon` to .bashrc
nnoremap :w " 在普通模式下按下 Ctrl+S 保存文本
inoremap :w " 在插入模式下按下 Ctrl+S 保存文本
nnoremap :u " 在普通模式下按下 Ctrl+Z 撤销上一步操作
inoremap :u " 在插入模式下按下 Ctrl+Z 撤销上一步操作
nnoremap :redo " 在普通模式下按下 Ctrl+Y 恢复上一步操作
inoremap :redo " Ctrl+W exit vim and  Ctrl+Q force to exit vim
nnoremap :q " 在普通模式下按下 Ctrl+W 退出 vim
inoremap :q nnoremap :q! " 在普通模式下按下 Ctrl+Q 强制退出 vim (不保存任何修改)
inoremap :q! " Ctrl+A switch to normal mode and Ctrl+X switch to insert mode
inoremap " 在插入模式下按下 Ctrl+A 切换到普通模式
nnoremap :u " F5 to compile and run c/cpp file (optional)
inoremap :!clear && gcc -o temp % && ./temp " F5 编译执行 C++ 文件
nnoremap :!clear && gcc -o somename % && ./somename " F5 编译执行 C++ 文件
注意,在 Linux 终端中 Ctrl+s 默认是锁定屏幕的快捷键。重映射 Ctrl+s 不仅需要在 ~/.vimrc 文件中设置按键映射,还需要在 ~/.bashrc 文件末尾添加一行 stty -ixon 以禁止 Ctrl+s 的默认行为。
还有一个必须需要注意的问题就是我们后面即将介绍的 vim 插件可能会覆盖我们之前定义的按键映射导致按键映射失效。当我们发现按键映射失效的时候可以利用下面命令查看对应的快捷键的映射情况:
:verbose nmap " 查看 Ctrl+Z 快捷键在普通模式的映射情况
:verbose imap " 查看 Ctrl+Y 快捷键在插入模式的映射情况
插件篇
关于 vim 的插件管理,我个人推荐 vundle。可以通过下面的步骤安装 vundle:
git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim

tee -a ~/.vimrc <<'EOT'
filetype off
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
Plugin 'VundleVim/Vundle.vim'
call vundle#end()
filetype plugin indent on
EOT #将 vundle 的配置添加到 .vimrc 文件中

vim +BundleInstall +qall # vundle 初始化
完成上面的步骤后,我们安装或卸载 vim 插件的一般步骤是:
  • 修改 .vimrc 文件,添加或移除相应的 vim 插件
  • 执行 luginInstall 或 luginClean 调用 vundle 安装或移除插件
下面我以 vim-airline 的安装和卸载为例,vundle 安装的插件的格式一般是 github用户名/仓库名,而 vim-airline 仓库对应的用户名也是 vim-airline,因此我们需要把以下配置添加到 .vimrc 文件中:
...
filetype off
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
Plugin 'VundleVim/Vundle.vim'
Plugin 'vim-airline/vim-airline' " 安装插件 air-line
call vundle#end()
filetype plugin indent on
...
接下来我们需要退出 vim 再打开 vim(或者直接在命令模式输入 :so ~/.vimrc 重载配置文件)进入命令模式输入 luginIntsall 就会自动进入 vundle 并安装 vim-airline。
卸载 vim-airline 的步骤相似,先移除 .vimrc 文件中的 Plugin 'vim-airline/vim-airline' 退出 vim 后重新进入 vim 进入命令模式输入 luginClean 清理不再使用的 vim-airline 插件。
最后分享一下我个人自用的插件:
关于 vim 插件的安装,我只能说需要耐心。特别是需要你具有搜索 github issues、使用 google 的搜索问题的能力。很多插件的安装需要仔细阅读官方文档(一般是 github 的 README.md 文件),还有一些插件本身就有坑需要自己去 stack overflow、github issues 查看相关讨论才能找到答案。
编译篇
大多数情况下,系统自带的 vim 是不支持一些高级功能的。我们可以通过 vim --version 查看当前的 vim 是否支持某个特性。deepin 15.7 自带的 vim 默认是 -clipboard、-pythoon、-python3、-lua 的。如果我们需要额外的特性,则需要自己下载官方最新的源码手动编译安装了。这里以使 vim 支持 +python/+python3 特性为例给出大致的编译步骤:
sudo apt install python-dev python3-dev #安装 python 开发工具
sudo apt purge vim -y #卸载系统自带 vim
rm ~/.vimrc ~/.viminfo ~/.vim -rf #清理相关配置文件
cd ~/Downloads #进入临时文件夹
wget https://github.com/vim/vim/archive/v8.1.0451.tar.gz #下载最新发布版本
tar -zxvf v8.1.0451.tar.gz #解压
cd vim-8.1.0451 && make distclean #进入源代码目录并清理文件

# 指定编译配置
./configure --prefix=/usr --with-features=huge \
--enable-rubyinterp --enable-pythoninterp --enable-python3interp \
--with-python-config-dir=/usr/lib/python2.7/config-x86_64-linux-gnu \
--with-python3-config-dir=/usr/lib/python3.6/config-3.6m-x86_64-linux-gnu

cd src
sudo make VIMRUNTIMEDIR=/usr/share/vim/vim81 -j8 #编译
sudo make install -j8 #编译安装
总结
其实,对于像我这样一个 VS Code 已经使用习惯的人,对vim 再怎么进行个性化配置最终也只是让它尽可能地接近 VS Code 的操作体验,最后主力的代码编辑器仍然是 VS Code;而对于一个纯 vimer、一个键盘极客来说,仅仅只是默认的 vim 配置他也可能够高效地处理文本和编写代码。对于我个人来说,我的 vim 使用场景主要是 ssh 连接远程服务器,这时我只能在终端上用 vim 编辑文本。因此,仅对我个人而言,配置一个更好用、更加符合个人操作习惯的 vim 其实是有意义的。
毕竟,我还年轻,还有折腾的资本。 (逃

Reply Favorite View the author
All Replies
avatar
绿竹
deepin
2018-10-15 16:17
#1
赞一个!  
Reply View the author
avatar
aida
deepin
2018-10-16 23:44
#2
支持原创!!
Reply View the author
avatar
rekols
deepin
2018-10-17 00:03
#3
写一个打造个性化 emacs 吧。
Reply View the author
avatar
prozhou_new
deepin
2018-10-17 00:30
#4

Reply View the author
avatar
要讲武德
deepin
2018-10-17 00:39
#5
老王看了想打人
Reply View the author
avatar
187******69
deepin
2018-10-17 03:10
#6
赞一个,说实话我学vim主要也是有时候需要ssh终端中编辑些文件。。。
Reply View the author
avatar
摇摆哥
deepin
2018-10-17 03:33
#7
其实没有必要搞这么多插件, vim 本身的功能已经相当丰富了。
Reply View the author
avatar
热心市民江先生
deepin
2018-10-17 04:00
#8
支持
Reply View the author
avatar
liubin_5288
deepin
2018-10-18 18:39
#9
顶上去
Reply View the author
avatar
159******26
deepin
2018-11-02 04:53
#10
大佬您好~请问怎么让vim在终端下透明呢qwq(我使用solarized-dark)
Reply View the author
avatar
风吹过的绿洲
deepin
2018-11-02 05:26
#11
用spacevim就行了


Reply View the author
avatar
‌量子巡游者
Moderator
2018-11-02 08:47
#12
支持原创!
Reply View the author
avatar
136******29
deepin
2018-11-02 16:44
#13
搞的太花哨了,实用的功能就行
Reply View the author
avatar
seven123
deepin
2018-11-17 19:37
#14
您好,请问,DOCK栏可以看网速怎么整的?谢谢
Reply View the author
avatar
itux
deepin
2018-11-17 23:57
#15
浪费的时间足够升级一台电脑、买下商业IDE授权码了。
Reply View the author
avatar
14******70@qq.com
deepin
2018-11-18 21:10
#16
本帖最后由 lolimay 于 2018-11-18 13:26 编辑
https://bbs.deepin.org/post/169825
浪费的时间足够升级一台电脑、买下商业IDE授权码了。

在我个人的很多使用场景下是只有终端没有图形界面的。
如在我的阿里云的centos开X服务很卡,连mosh和ssh都卡,这时候用一个调教好的 vim 来编辑文件可能是个不错的选择;还有我的OpenWrt 路由器和个人 NAS 都是 ARM  架构的linux,配置较低无法使用图形界面,vim是必备工具; 包括我们实验室的服务器集群,我作为管理员用终端中的vim、htop等工具去维护显然比开个图形界面再打开个VSCode效率要高。因此,vim在无图形化界面、机器配置较低或网络环境不好的远程操作等情形下仍然是有用武之地的

如果你只是在自己的电脑上本地开发,使用先进的 IDE 或代码编辑器肯定是必须的呀。
【插播广告】VS Code 最新版已经支持自定义标题栏啦,现在的UI超级好看!如果你主力的编程语言* 和 Python ,强烈推荐下载下来试试 (逃

最后,附上我的 VS Code 使用截图,主题是 One Monokai 真的超级好看!



Reply View the author
avatar
tmacy
deepin
2018-11-18 22:26
#17
vs code也可以用vim模式,而且用着还凑合。

另外vim8以后默认自带插件管理工具,建议试试看。

远程登录到服务器,其实就是修改一些临时参数或者调试脚本,开发基本还是本地机器,用vscode能解决很多问题,所以配置很多vim插件也没太大意义。
vim可能更能解决一些高级玩家的需求痛点吧。
Reply View the author
avatar
cy844757727
deepin
2018-11-21 06:14
#18
差不多都是自己配置的 。。。。

Reply View the author
avatar
jianguo922
deepin
2018-11-21 06:21
#19
楼主6666666
Reply View the author
avatar
springhan
deepin
2019-12-28 18:26
#20

你这是哪个主题?挺好看的
Reply View the author