本文介绍的均为非常实用的vim使用技巧和配置技巧
内容from日常使用经验和网络
1. 索引工具ctags使用
参考:vim插件ctags的安装和使用_G_BrightBoy的专栏-CSDN博客
1.1 配置.vimrc
参考:强大的vim配置文件,让编程更随意 - ma6174 - 博客园
在启动vim时,当前用户根目录下的.vimrc文件会被自动读取
注意服务器的vimrc存放在etc/vim/vimrc目录,但不要试图修改它(没有权限)
在用户目录下添加.vimrc文件即可覆盖跟目录下的.vimrc配置
$vim ~/.vimrc
"tags=tags 会递归向上寻找到第一个tags
set tags=tags;
set tags+=~/data/work/wifi/wpa_supplicant-2.6/src/tags;
set tags+=~/data/work/wifi/wpa_supplicant-2.6/wpa_supplicant;
set tags+=~/data/work/linux-3.10/tags;
1.2 生成ctags
服务器需要安装了ctags,这一点可以通过在某一目录下执行ctags命令验证
进入目录,执行ctags -R,会生成当前目录及所有子目录文件的索引tags文件
指定所选中的目录生成tags
ctags * -R kernel/kernel_sdk/ modules/
1.3 定义跳转
跳转至变量和函数的定义处
ctrl + ]
返回跳转前位置
ctrl + o/t
1.4 显示历史跳转路径
在分析代码路径时很有用
:tags
1.5 代码补全功能
命令 | 功能 |
ctrl-p | 上一个补全 |
ctrl-n | 下一个补全 |
ctrl-e | 停止补全并回到原来录入的文字 |
2. 头文件引用路径
2.1 默认头文件路径
默认查找库文件路径为: /usr/include/
//默认路径为 /usr/include/
#include <stdio.h> //C标准库,用户空间调用
#include <linux/fs.h> //内核编程可以引用的库
-
C标准库(用户空间编程)直接存放在该路径下
-
驱动编程(内核空间编程)时引用的系统头文件库在默认路径下的linux文件夹中
-
/usr目录存放用户目录、用户库等
2.2 头文件跳转
修改用户目录.vimrc
"默认路径 /usr/include
set path+=/usr/src/linux-headers-3.5.0-23/include/linux;
-
vim中光标指向头文件名,然后按g + f就可以了
-
如# include <fcntl.h>,则光标定位到f处,按g + f就跳到fcntl.h中了
3. 开始使用vim
基本命令操作网址:Linux vi/vim | 菜鸟教程
3.1 在vim中纵向选择内容
-
按住alt键,然后按下鼠标左键
-
可以纵向选中内容,非常有用的小技巧,很多其他的编辑器也支持这一操作
-
3.2 复制 &粘贴 &撤销
yy #复制整行
p #粘贴
:reg #查看剪贴板中的内容,vim是将复制的内容暂存到寄存器中
u #撤销上一步的操作
Ctrl+r #恢复上一步被撤销的操作
3.3 查找 &统计 &替换
:%s/from/to/g #替换所有行的from字段为to字段
:%s/yes//gn #查找当前文件yes出现的数量
3.4 显示当前文件路径
-
在vim的底部显示当前打开文件的绝对路径
1 //先按1
Ctrl + G //然后同时按下Ctrl G
3.5 批量缩退、缩进
-
命令模式下,输入“行号1,行号2>”,为统一缩进一个tab键;<为缩退
-
“行号1,行号2»”缩进两个tab键;但是是以4个空格代表一个tab键的
:1,9>> //1到9行缩进两个tab键
3.6 选中连续的整个单词
-
shift + 8
"语法高亮
:set hlsearch
3.7 Taglist使用
-
可以在.vimrc中设置自动打开Tlist,也可以在vim窗口手动执行Tlist命令
:Tlist
-
enter键(Tlist):跳转标签对应的代码定义位置(光标跳转到代码窗格)
-
p(Tlist):跳转标签对应的代码定义位置(光标仍停留在Tlist窗格)
-
o(Tlist):新建一个代码窗口,同时跳转标签到代码定义位置(光标移动到新窗格)
3.8 dos文件格式转unix
-
vim打开文件末尾出现^M的情况
-
是由于win-linux-mac对于行末的回车符处理不一致导致的,需要将文件格式从dos转换到unix
-
方法一:命令行
dos2unix filename
-
方法二:vim打开文件
:set ff #查看当前文件格式
:set ff=unix #修改为unix文件格式
3.9 快速移动光标
-
光标快速移动到每个空格的下一个连续字符串开头,在阅读代码时很好用
ctrl + 左右按键
-
快速切换代码位置
ctrl+o #后退
ctrl+i #前进
3.10 转换空格到tab键
-
将4个空格转换成一个tab按键
-
用vim打开待转换的文件
-
依次输入下方的命令
:set ts=4 //设置把4个空格转换成1个tab按键
:set noexpandtab
:%retab!
3.11 重载vim已经打开的文件
-
如果文件同时被多个编辑器打开,在不关闭vim重新打开文件的前提下重载文件
:e #to reload the file
3.12 vimdiff
vimdiff FILE_LEFT FILE_RIGHT
dp #(diff "put")
#如果希望把一个差异点中当前文件的内容复制到另一个文件里,可以使用命令
do #(diff "get",之所以不用dg,是因为dg已经被另一个命令占用了)
#如果希望把另一个文件的内容复制到当前行中,可以使用命令
zo #(folding open,之所以用z这个字母,是因为它看上去比较像折叠着的纸)
#临时展开被折叠的相同的文本行
zc #(folding close)
#重新折叠
IBM Developer 正在整合其语言站点组合。 – IBM Developer
4. 多vim同时工作
-
我们经常需要使用vim在不同目录下的code间切换
-
将vim置于后台,切换回shell,进一步通过快捷键在多个vim窗格中切换
4.1 将vim置于后台
ctrl + z
-
将当前的vim置于后台
-
然后可以去别的目录再打开一个
-
通过jobs命令可以查看哪些vim在后台
-
最后打fg序号,将需要的vim置于前台
4.2 vim同时显示和切换多个文件
- 如果在终端中还没有打开窗口
$ vim -o file1 file2 //上下两个窗口
$ vim -O file1 file2 //左右两个窗口
-
如果vim已经打开了一个文件,再打开其他窗口
:sp file //上下分割窗口
:vs file //左右分割窗口
:open file //打开新的文件,可以通过ctrl+6 或 bn\bp等跳转
- 在split打开的多个窗格之间切换
[ctrl_w] + 方向键 //切换到其他的窗格
[ctrl_w_w] //依次向后切换到下一个窗格中
[ctrl_w_t] //t:top直接跳转到左上角窗口
[ctrl_w_b] //b:bottom直接跳转到右下角窗口
:q //关闭光标所在窗口
:qa //关闭所有窗口
- 同一个窗口的交替文件切换
ctrl + 6 //下一个文件
:bn //下一个文件
:bp //上一个文件
- 显示vim已打开文件列表
:tabs #查看所有打开的标签页
- 显示vim缓冲区中的文件列表
:ls #列出缓冲区的全部文件 +表示已经修改 #表示前一次编辑的文档 %编辑中的文档
:bX #切换到X文档
:bwX #完全关闭某个文件缓存
4.3 调整vim分割窗口大小
-
通过加大数字调节光标所在窗格的大小。
:vertical res 20 //左右窗口调节宽度 20标识全部窗口长度的20%
:res 20 //上下窗口调节宽度
[ctrl_w] + '=' //恢复均等
4.4 显示当前文件夹下的目录树
-
打开新窗口,并显示当前文件夹下的目录树
:Ve
-
如果想指定键盘触发该功能,则在.vimrc中加入
map <F3> :Ve .<CR>
5. vim配置问题Q&A
5.1 方向键上方的功能键无法正常使用
-
Session→Terminal→Emulation 中的风格选择Linux即可
6. 我的.vimrc配置
"vim更改注释颜色为天蓝色
hi comment ctermfg=6
set tags=tags;
"语法高亮
set hlsearch
"显示行数
set nu
"每一个tab键为8个空格长
set tabstop=8
"保持换行时自动缩进1个tab
"与tabstop保持数值一致,在换行时自动缩进一个tab,否则是对应数量的空格
set shiftwidth=8
"默认打开Taglist
let Tlist_Auto_Open=1
"在右侧窗口中显示taglist窗口
let Tlist_Use_Right_Window = 0
"列出当前目录文件
map <F2> :Ve .<CR>
map <F3> :vertical res 150<CR>
map <F4> :vertical res 80<CR>
"搜索忽略大小写
set ignorecase
" 在被分割的窗口间显示空白,便于阅读
set fillchars=vert:\ ,stl:\ ,stlnc:\
"只同时显示1个文件的tag
let Tlist_Show_One_File=1
"自动补全
:inoremap ( ()<ESC>i
:inoremap ) <c-r>=ClosePair(')')<CR>
:inoremap { {<CR>}<ESC>O
:inoremap } <c-r>=ClosePair('}')<CR>
:inoremap [ []<ESC>i
:inoremap ] <c-r>=ClosePair(']')<CR>
:inoremap " ""<ESC>i
:inoremap ' ''<ESC>i
function! ClosePair(char)
if getline('.')[col('.') - 1] == a:char
return "\<Right>"
else
return a:char
endif
endfunction
filetype plugin indent on
"打开文件类型检测, 加了这句才可以用智能补全
set completeopt=longest,menu