admin 管理员组

文章数量: 887021

目录

 

前言

VIM模式

常用操作

文本编辑

多文件操作--Buffer

多窗口操作--TAB标签页

常用配置

常用插件

如何追踪代码

强大的终端工具--Tmux

结尾

参考文献

附录

常用配置


前言

工欲善其事,必先利其器。在Linux下开发,熟悉掌握VIM操作,可以很好地提高编辑与开发效率。初入门的同学,一般只懂得几个常用的VIM操作,打开文件,插入编辑,保存退出,只会这几个操作,那就真是小看了这款神通广大的编辑器了,如果用来敲代码,甚至编辑效率都不如用IDE来得便捷。

适合阅读人群:接触过VIM常用模式及其配置文件的同学,想要全面且系统掌握VIM以提高编辑开发效率。

本文不会细述基本概念以及操作过程,撇弃不常用的操作。

VIM模式

常用模式有三种:普通模式、插入模式和命令行模式。

以下几个常用命令可以进入插入模式。

命令说明
i在当前光标处进行编辑
I在行首插入
A在行末插入
a在光标后插入编辑

退出插入模式返回普通模式,可以采用Esc,也可以通过将Esc映射到jj,通过直接输入jj切换到普通模式,再也用不着畸形地伸出尾指操作了。

在.vimrc中配置:

inoremap jj <Esc>

 

常用操作

开启文件

命令说明
vim first_file second_file同时打开文件1与文件2
:e file在VIM内打开当前目录下的文件,会同时关闭当前文件

 

保存与退出文件

命令说明
:w保存文件
:wq保存并退出
:x保存并退出
:q退出
:q!强制退出,不保存 v
:q[all]退出当前所有窗口

如果你想退出当前文档,但后续还要打开,你可以通过Ctrl+z把当前VIM程序挂在后台,在shell下通过jobs命令查看当前后台程序以及对应的序号,想打开时,通过fg+序号指令即可快速恢复。

分屏

将VIM分屏,我们可以同时阅读多个文档,通过<Ctrl+w>+w命令在不同的文档间切换,滚动阅读与编辑

分屏效果如下图所示:

【分屏效果图】

命令说明
:vs左右分屏
:sp上下分屏
<Ctrl+w>+w屏间切换
<Ctrl+w>+h/j/k/l切换到左边/下边/上边/右边窗口

文本编辑

移动

新手只会利用上下左右键进行光标移动,用Backspace或者Delete作字符删除,效率比IDE+鼠标还低。掌握以下移动大法,可以让你的移动速度快速提升。

命令说明
0行首
$行尾
ctrl+b(backward)上一页
ctrl+f(forward)下一页
ctrl+u(upward)往上翻半页
ctrl+d(downward)往下翻半页
ctrl+e往下滚一行
ctrl+y往上滚一行
gg文档开头
G文档末尾
e/w光标往后移动一个单词
b光标往前移动一个单词
gi返回上一编辑处并插入模式

如果能熟练使用h/j/k/l就更好了,用不着移动到小键盘的方向键了。不习惯就算了。翻页太多指令,可以只记住翻半页的两个指令。

编辑

针对单词,句子与段落的删除,编辑与复制,指令格式为:[number]<command>[text object]

数据表示操作的文本对象数据 ,2dw表示删除两个单词,而对于行来说,dd表示删除一行,d3d表示删除三行。

命令说明
dw删除一个单词
cw删除当前单词并进入插入模式
yw复制当前单词(包括后面的空格)
P/p将内容粘贴到当前光标前面/后面
yiw复制当前单词(不包括后面的空格,i表示inner)
ct"/ct"删除“”中的内容并进入插入模式
ci(删除()中的内容并进入插入模式
dd删除一行
d3d删除三行
x删除字符(我们再也不用跳到老远按Backspace啦)

在shell终端,删除操作有以下指令:

命令说明
ctrl+w删除上一单词
ctrl+u删除当前一行
ctrl+h删除上一字符

 

撤消及重复

命令说明
.重复操作
u撤消操作
ctrl+r回做

 

替换

命令说明
:%s/oldstring/newstring/g(lobal)全局将oldstring替换为newstring
r{char}直接替换一个字符,譬如fw就是将当前字符替换为w
:%s/oldstring/newstring在当前行将oldstring替换为newstring

 

搜索

命令说明
/string全文搜索string,N查找上一处,n查找下一处
ss采用easy-motion插件,并映射搜索指令为ss,推荐使用

 

缩进缩出

命令说明
n<<光标以下的n行会缩出
n>>光标以下的n行会缩进

 

寄存器--复制粘贴

这个操作保存你随时随地可以粘贴之前复制的内容,譬如一句打印,要知道,有时候我们复制了一句Log,粘着粘着就不见了,又得回头找,耗时费力。

命令说明
“ayy复制当前行并保存到寄存器a
”ap粘贴寄存器a中的内容
:reg a b查看寄存器a,b中的内容

 

多文件操作--Buffer

当你打开一个文件时,就打开了一个buffer,当你通过":e filename",":open ."或者Nerdtree等方式打开另一个文件时,就打开了另一个buffer。你可以查看所有打开的buffer,切换到不同的buffer也就是文件,相当于在Source Insight的window菜单中查看已打开的文件与切换到其他文件。来吧,我们来看一下有哪些操作指令可以用。

命令说明
:e filename打开当前路径的文件
:open .打开当前路径的目录树以便打开目标文件,常用于打开其他目录的文件
:ls查看当前vim所有的buffer
:b[n][n]为序号,打开序号为n的buffer
:bp切换到前一个buffer
:bn切换到后一个buffer
ctrl+^在最近两个BUFFER间切换,即ctrl+shift+^

当你使用屏的时候,也是在打开多个buffer。只不过你通过<Ctrl+w>+w等方式在不同的窗口间切换。而上述表格中的切换buffer指令则是在当前窗口直接打开新的文件。

如果你觉得这些指令太麻烦,可以参考BufExplorer插件,它可以提供更为方便的映射键来操作buffer,犹如在Source Insight中一般方便。

多窗口操作--TAB标签页

vim从vim7开始加入了多标签切换的功能,相当于多窗口。 如果你不喜欢buffer操作,可以尝试多窗口操作,类似于浏览器的多个标签页。

命令说明
:tabnew打开一个新的空标签页
gt (标准模式下)在tab之间切换
:tabc关闭当前的tab
:tabs查看所有打开的tab
:tabp前一个
:tabn后一个

如果标签页超过2个,用gt,gT来一个个切换标签页确实不方便, 用:tabnext {count}, 按键太多。你可以通过在vimrc配置中加入映射键配置,用 alt+n来切换,解决切换标签这个麻烦问题。

常用配置

假如你在使用一个裸VIM,那么最好记住一些非常常用的配置,譬如显示行号,搜索高亮,语法高亮等,更多的可以见附录-常用配置。

命令说明
set syntax=on语法高亮
set tabstop=4Tab键的宽度
set number显示行号
set hlsearch搜索高亮
set backgound=drak设置背景颜色

了解如何配置键盘命令,让一些反人类的键盘操作(譬如:wq保存退出文件)与插件的快捷键更符合你的使用习惯。

常用插件

把VIM打造成一个强大的IDE,依赖于各种功能的插件,这些插件都放在.vim文件夹中,配置在.vimrc中。你可以直接用现成的vim包,将你的.vim与.vimrc替换即可,通过阅读.vimrc中对各种插件快捷键的配置,来掌握各种插件的使用,譬如,F2往往用来打开Taglist,F10用来打开NERDtree,ss用来快速搜索,gcc用来注释,ctrl+p用来模糊搜索文件。你也可以自己打造属于自己的VIM,只配置你所需要的插件,配置你个人专属的快捷键。

首先,你要了解一个插件是怎么安装在VIM中的。其次,你可以安装一个用于安装其他插件的插件,由此可以方便的在线安装各种插件。然后,通过阅读插件的github说明或者google等方式,了解每一个功能插件最常用的操作指令与映射配置,实践熟悉。

根据经验与需求,我们可以总结出一些常用必要的插件。

插件功能常用指令说明
vim-plug/Vundle安装管理其他插件详情见github
Nerdtree目录树:NERDTreeToggle切换目录树
ctrlp模糊搜索当前目录下的文件ctrl+p打开搜索窗口
taglist/tagbar查看源代码文件结构:Tlist/:TagbarToggle 打开代码结构窗口
vim-commentary快速注释gcc注释与去注释,gcgc去注释,先选多行再gc实现多行注释
YouCompleteMe代码补全这个安装好像有点麻烦
vim-airline状态栏可以显示行数,文件名等状态信息
identline代码缩进线条对于C语言开发还是很有用的
vim-hybrid配色配置好看的主题才能舒服的看代码与敲代码

还有其他插件可供选择,包括模糊搜索与替换的Ag.vim与fzf.vim,代码格式化的vim-autoformat,静态检查的ale,Git与Vim结合的vim-gitgutter。

如何追踪代码

追踪代码包括两个方面,一,查看对象与函数的定义,二,在特定目录搜索对象与函数。

对于第一点,在源码目录下通过执行shell指令ctags -R以生成tags文件,该这个tags文件就是你目录下所有源码内容的索引 ,包括所有语法元素。打开某个源码文件,将光标定位在要搜索定义的word下,执行快捷键Ctrl+]并进行跳转,执行 快捷键Ctrl+T跳转到前一次的tag处。相当于jump to definition/jump to declare。

对于第二点,可以在shell下执行grep搜索某个关键字出现的地方,相当于search in files。

强大的终端工具--Tmux

你有没有这样的烦恼。每次下班后关机,第二天开机登录服务器,又得重新进入工程,配置环境变量,打开你昨天编辑的源码,继续工作。又或者,一个shell终端下,打开很多个工程,每个工程一个shell标签,如果这个时候网络断线,完了,你得一个一个重新打开。又或者,突然电脑断电,或者终端被关闭,又得再来一遍。

你有没有遇到这样的麻烦,一个shell终端用于编辑浏览代码,另一个shell终端用于编译工程,又或者,在同一终端下,无法同时编译与编辑浏览。又或者,在同一终端下,无法同时编译多个工程,只能新开一个终端编译一个工程。

解决这些问题的利器就是Tmux。Tmux(terminal multiplexer)是Linux上的终端复用神器,可从一个屏幕上管理多个终端(准确说是伪终端)。使用该工具,用户可以连接或断开会话,而保持终端在后台运行。

如何理解与使用TMUX,见阮一峰的网络教程[2]。

在这里,我们记住几个最重要的命令,就可以满足日常所需。

命令说明
$tmux new -s <session-name>新建会话,名字为<session-name>
$tmux ls查看当前所有的 Tmux 会话
tmux att -t <session-name>接入某个已存在的会话<session-name>
Ctrl+b d分离当前会话
Ctrl+b x杀死当前会话
窗格操作快捷键 
Ctrl+b %划分左右两个窗格
Ctrl+b "划分上下两个窗格
Ctrl+b <arrow key>光标切换到其他窗格
Ctrl+b o光标切换到下一个窗格

Tmux麻烦的一点是,你在浏览终端的内容时,上下翻页无法通过鼠标直接滚动,需要先按Ctrl+b,然后通过Page Up与Page Down上下翻页。

不要嫌Tmux用起来麻烦,绝对是Linux开发必备利器。

结尾

掌握这些VIM技术,可以满足日常开发的需要,一个终端就可以进行工作,不再需要打开Source Insight导入新工程新文件,各种鼠标操作,特别是在使用其他人的电脑与访问远程服务器时,非常便捷,缺点也很明显,学习曲线太陡峭,快捷键多得难以记住,插件安装与配置都需要学习,入门时间长。用IDE也好,VIM也好,只要顺手方便,都可以用来浏览与编辑代码,各有优劣。

参考文献

[1]玩转Vim 从放弃到爱不释手 https://www.imooc/learn/1129

[2]Tmux 使用教程 http://www.ruanyifeng/blog/2019/10/tmux.html

附录

常用配置

功能配置
显示颜色set t_Co=256
允许插件filetype plugin on
设置当文件被改动时自动载入set autoread
共享剪贴板set clipboard=unnamed
自动保存set autowrite
打开状态栏标尺set ruler
突出显示当前行set cursorline
在处理未保存或只读文件的时候,弹出确认set confirm
自动缩进set autoindent<br>set cindent
Tab键的宽度set tabstop=4
统一缩进为4set softtabstop=4<br>set shiftwidth=4
历史记录数set history=1000
搜索忽略大小写set ignorecase
搜索逐字符高亮set hlsearch<br>set incsearch
命令行(在状态行下)的高度,默认为1,这里是2set cmdheight=2
使用鼠标set mouse=a<br>set selection=exclusive<br>set selectmode=mouse,key
高亮显示匹配的括号set showmatch
匹配括号高亮的时间(单位是十分之一秒)set matchtime=1
为C程序提供自动缩进set smartindent
光标移动到buffer的顶部和底部时保持3行距离set scrolloff=3

 

 

本文标签: 进阶 vim