內容目录
- vim入门技巧
- 一开始的时候需要知道的东东
- 查找的技巧
- 有关使用 搜索 和 C_] 进行查找时单词的区分设定
- 寄存器的使用
- 标记缓冲区
- 搜索时忽略大小写
- vim中cscope的使用
- 有关显示行号的技巧
- vim的操作命令
- vim的folder操作
- vim的自动补全
- vim中输入xml的相关快捷键
- 使用vim编辑一个加密文件
- 有关vim文件的编码设定
vim入门技巧¶
一开始的时候需要知道的东东¶
-
vim命令行参数说明
vim -C cmd file 打开文件前执行指定的命令
vim -r file 恢复文件
vim -R file 只读方式打开,但可以强制保存
vim -M file 只读方式打开,不可以强制保存
vim + file 打开文件定位到文件末尾
vim +num file 打开指定的行
vim +/string file 打开文件,跳转到指定的字符
-
命令模式下的常用命令
:w 保存文件
;wq 保存并退出, 在normal模式下使用 ZZ 也可以
:o file 打开文件
:n1,n2w file 保存从n1到n2的行为另一个新文件
:x 保存退出 在normal模式下使用ZZ也可以
:q 退出,使用 :q! 强制退出
:saveas file 另存为一个新文件
:e 重新载人文件
:e! 重新载入文件,并丢弃已经做的修改
:f 显示文件的编辑状态
:vs 竖直分割
:sp 水平分割
:pwd 显示vim的工作目录
:cd path 改变vim的工作目录,可以使用tab进行补全,方便的切换目录
:set autochdir 让vim根据打开的文件自动切换工作目录,一般写到配置文件里
-
normal模式下的常用命令
[n]G 跳转到第[n]行
H / M / L 跳转光标到当前屏幕(屏幕的内容是不动)的 开头/中间/结尾
K man 光标所在的单词,比如一个函数
gd 跳转到局部变量定义的地方
gD 跳转到全局变量的定义的地方
g; 跳转到上一次修改的地方
g, 跳转到下一个修改过的地方
% 匹配() {} [] 进行跳转
ctrl + f 下向滚动一屏
ctrl + b 向上滚动一屏
ctrl + d 向下滚动半屏
ctrl + u 向上滚动半屏
ctrl + e 向下滚动一行
ctrl + y 向上滚动一行
ctrl + g 显示文件的编辑状态
ctrl + w 进入分割窗口控制功能, 在这个前提下,可以使用如下
命令组合
w 切换下一个窗口
- 当前窗口增高一行
- 当前窗口减少一行
[n] _ 当前窗口尽可能的大,也可以使用n指定行数, 也可以使用 :reesize n 指定当前窗口的行高
= 所有的窗口使用同样的高度
n ctrl+w _ 指定当前窗口使用n行
< 当前窗口减少一列 ,
n ctrl+w < 或者 ctrl+w [n] < 可以一次移动n列.
| 当前窗口尽可能的宽,
n ctrl+w | 或者 ctrl+w [n] | 可以设定当前窗口使用n列
ctrl + 0 显示字体的大小设置为初始大小
n% 移动到n%的位置,注意没有:
zz 或者 z + . 把光标所在的行移动的屏幕中间
zt 或者 z + enter 把光标所在的行移动到屏幕开始
zb 或者 z + - 把光标所在的行移动到屏幕末尾
-
替换<esc>
使用vim的时候<ESC>这个键用于从任何模式,回到normal模式,有人曾经开玩笑说我要去买一个<ESC>脚踏板,可见 <ESC>这个键在vim中使用频率是多麽的高,而且,还那麽远,非常不方便,你没有想过,设计vim的人是不是脑子有坑呢,反正我想过^-^,直到看到一本叫 <<The Hard Way to Learn VimScript>> 的书才发现,是我脑子有坑.早点看这书就好了.也许凡人们 都喜欢犯的错误就是这样,没有深刻的认识一个事物的时候,就慌忙下结论.怨天尤人,可神会一直对我们微笑.直到我们让阳光 照进心里,才抬头看到神灿烂的微笑.
-
使用命令
:inoremap {多个任意字母} <esc>
执行后, 快速输入 {多个任意字母} 就会退出到normal模式, 快速的意思是在一个光标闪烁之内,这也太简单了,如果 就着吗简单,那为啥不早点让我发现写到配置文件里啊,其实这是最麻烦的
-
不使用<ESC>退出到normal模式的方式(默认)
Ctrl + c
Ctrl + [
-
有关退出到normal模式的高级技巧
使用ALT + {命令组合} , 这个执行以后,相当于在normal模式下使用了命令组合,执行后的状态取决于命令是什麽,比如
在插入模式下输入了 ALT + j 那麽效果就是, 往下移动了一行,并进入了normal模式,
在插入模式下输入了 ALT + O 哪买就是,在当前行上一行插入一行,并由于O的原始作用是插入进入insert模式,所以 执行后,效果就是在上一行插入了一行,并且停留在插入模式
-
-
快速选择
想复制的东西,既不是一行,也不是一个单词,复制单词可以使用 yw ,就得手动选择了,使用v ,按hjkl进行移动,然后y,类似命令如下:
v 普通选择
shift + v 按行选择
ctrl + v 块选择
gv 重新选中上次的选择,可以作为标记用.
-
在shift +v 进入选择一行后的快捷键
首先声明这些都是用来选择的,要求就是先把光标移动的想要选择的行,然后按下shift+v然后在按下下面的快捷键才起效
iw 选择光标所在的单词,别的不在选择了,对应需要复制函数名称的时候
i( 或者 i) 选择在一行之内的()内的内容, 不包括() 必须在一行以内要不找不到,光标必须在()内部
a( 或者 a) 选择在一行之内的()内的内容, 包括() 必须在一行以内要不找不到,光标必须在()内部
i{ 或者 i} 选择在{}内的内容, 不包括{} 只选择最近匹配的 { } 执行一会一下选择了多行
a{ 或者 a} 选择在{}内的内容, 包括{} 只选择最近匹配的 { } 执行以后一下选择了多行
i< 或者 i> 选择<>之间的内容,不包括<>
a< 或者 a> 选择<>之间的内容,包括<>
类似的还有 i[ ( i] ) 和 a[ ( a] )
is 光标在一个函数的声明出,按下后会选择这个函数声明体和函数上方的相邻注释,如果在函数定义的地方, 则选择函数开头的部分.
ib 和 i( 差不多,只是可查选择多行之间匹配的()之内的内容, 不包括 (),适用于参数写在多行的情况
ab 和 i( 差不多,只是可查选择多行之间匹配的()之内的内容, 包括 (),适用于参数写在多行的情况
tips 利用这些方便的选择技巧,就可以方便的进行函数头和函数复制了,不必再来来回回去找匹配了.
-
查看变量或者函数的声明和定义
[i 需要把光标移动到将要查看的函数或者变量的位置,只是查看声明,并不进行光标的跳转,这个非常有用,你也想在写函数的时候能看到声明的函数参数类型的吧.声明会在下方显示
[ ctrl+i 这个就会跳转到函数的定义地方了,和 ctrl + ] 差不多了
[ ctrl+d 这个会调整到对应的宏定义处
-
不使用ctags,cscope的时候,默认的跳转命令
- 文件跳转
把光标移动到对应文件的字符上面,然后按 gf 即可,在新 的窗口打开可以使用 ctrl+w f ,在新的tab中打开使用 ctrl+w gf
使用 set suffixesadd+={.hpp} 可以设定在include的时候不加扩展名的情况,suffixesadd表示默认加上的扩展名
使用 set path 查看搜索头文件的目录有哪些 , 分割的,使用 set path+={目录} 进行增加
- 函数跳转
[[ 上一个函数的开头(需要首行的{), 说这个和语言扩展有关,
如果把{写到了末尾就直接到文件头了,以后在研究如何改吧).
]] 下一个函数的开始,说明同上
{{ 上一个块(空行隔开的)
}} 下一个块(空行隔开的)
[] 上一个函数的结尾
][ 下一个函数的结尾
[( 当前区块的 ( 处
]) 当前区块的 ) 处
同理 [{ ]} 用于{} 嵌套的情况,比如n层的if . [/ ]/ 用于调整到注释的/* */ [# ]# 用于#if和#else #endif 之间的跳转
整理一下如下:
第一个键表示方向,第二个键表示功能,
[ 表示向前跳转, ] 表示向后跳转
第二个是功能
查找的技巧¶
- / 从当前位置向下查找
- ? 从当前位置向上查找
-
- 选中当期光标所在的 单词 然后向 下 查找
- # 选中当前光标所在的 单词 然后向 上 查找
- g* 选中光标所在的 单词 然后部分匹配向 下 查找
- g# 选中光标所在的 单词 然后部分匹配向 上 查找
- 部分匹配的意思是不区分大小写的匹配
- set nowrapscan 和 set wrapscan 设置搜索的时候是不是可以在到最后的下一个从文件头开始查找
有关使用 搜索 和 C_] 进行查找时单词的区分设定¶
在.vimrc 文件中设定 iskeyword 比如,比较烦人的一个地方是c语言的 Struct.Member 如果使用 w * # ] 功能时,无法区分 单词Member,按照Struct.Member是一个单词进行搜索,在.vimrc文件中添加:
set iskeyword += ,$,@,%,#,.,-
一行,这样,就可以了,使用逗号分割每一个字符,结尾不能有, .
寄存器的使用¶
vim中a到Z是复制缓冲区,可以吧文本占时复制到缓冲区中,使用“ayy 把内容复制到a中,使用”ap 把a缓冲区中的内容取出来,要点就是使用”加在缓冲区名字的前面
主要是寄存器操作,简直神器,
首先,说用寄存器的命令要知道,C-R (ctrl+r)
比如说用a寄存器,就要说按Ctrl+r a 这样子.
0-9 a-z (只有小写) 都是vim的寄存器,
其中,1-9 是删除寄存器,分别记录上n次删除的内容,比如,我要复制上5次删除的内容使用 “5p 就可以了,
0 上一次复制的内容,yy自动存入,
/ 是上次搜索寄存器
- 是系统粘贴板寄存器,比如”+yy是把当前行存入系统粘贴板,
a-z是具名寄存器,比如yy想存入a中,就是用 “ayy 这样子.
这些寄存器是可以混用的
比如 / 和 ? 我想搜上4次删除的内容,就可以用
/<CTRL+R>4 回车,
这样子哦,
输入/”4 只能搜”4这样的字符,这个和vim的配置相关.
标记缓冲区¶
缓冲区的范围也是a-Z,使用m[a-Z]进行标记,标记的是光标所在的位置,使用’[a-Z]会跳转到相应的位置,要点就是,使用m标记,使用’进行跳转。
使用 :marks 显示所有标记
搜索时忽略大小写¶
使用 :set ic开启忽略大小写,
使用 :set noic 关闭
ic 即 : ignore case 的简写
vim中cscope的使用¶
-
cscope是用于多种语言的(其实主要还是c了)的符号查找程序.这个很厉害啊,只是使用起来比ctags稍微麻烦一点.
-
在源码目录使用cscope -cb 会生成一个cscope.out文件,如果只有指定目录,就把需要的所有文件写到cscope.files文件里, 一行一个文件就行了,
-
vimrc中也许有像set tag = xxx之类的设置,笨一点的方法就是使用cs add进行加入对应文件
-
使用 :cs f g XXX 找cscope.out中的XXX定义.
f表示查找 g 表示找定义,可以使用 :cs help 进行查看,很方便.
-
对上一条中 f的展开
:cs help 会有说明
add {file|dir} [prefix dir] 添加一个cscope.out文件,可以指定文件或者目录加入cscope.out文件 ,cscope默认使用vim开启的目录开始查找,如果改了目录,使用 prefix dir重新指定一个就好了,要不然就会报某某某文件找不到.
find 查找,在加入的cscope.out文件中,按指定方式找对应的符号,g就是找定义,其他的看下一条.
kill # 从加入的cscope.out文件中除去一个.# 是序号,也可以使用文件指定,使用需要方便啊.
show 显示已经加入的scope.out文件.前面就是kill需要的序号了.
reset 初始化所有的加入的cscope.out文件.
-
有关:cs f g XXX中g的扩展
0或s 查找这个符号.
1或g 查找这个定义.
2或d 查找这个函数调用的函数们.
3或c 查找调用这个函数的函数们.
4或t 查找这个字符串.
6或e 查找这个egrep匹配模式.
7或f 查找这个文件.
8或i 查找include这个文件的文件们.
-
使用技巧.
使用手工输入函数符号的是不是很麻烦呢,可以这样,使用 yw 复制一个单词,然后使用C_r 0 从复制复制寄存器中拿出上一个复制的内容.
有关显示行号的技巧¶
-
vim显示行号,很简单,开始显示,
set number 简写 set nu .
取消显示
set nonumber 简写 set nonu
显示相对行号 //对于查看结构体特别有用
set relativenumber
取消相对行号显示
set norelativenumber
-
有关line函数的使用
这个函数是得到行数,使用 :help line 可以查看许多内容.
line(‘.’) 当前行.
line(“‘t”) t标记所在的行,没有的话,返回0
作用:
-
给文件添加统一的前面 行号,是内容的序号,不是显示的.:
:%s/^/\=line('.').' '
解释:
- %s 是全局搜索.
- ^ 表示每一行的开头
- \= 表示 使用后面的表达式结果进行替换,如果想使用\= ,哪买整个替换后的字符都要是 表达式的结果,就是说,\=只能写在最前面,不能从中间使用.
- line(‘.’) 表示但前行的行号,这个号码是根据匹配游标移动改变的.
- . 表示字符串连接,连接后面的’ ‘(空格) 你总不希望行号后面没有空格吧?
-
计算但前行到指定行的行差
这个比较麻烦,分一下几步:
- 在基准的行做一个标记,比如 ms 做一个s标记.
- 使用 / 或者其他什麽手段,移动到所在的行.
- 执行 :echo line(‘.’)-line(“‘s”) 就会在命令输入行打出一个数字,就是行差了,
虽然比较麻烦,可是使用q 定义好宏以后,使用@执行就好多了.
-
vim的操作命令¶
-
概述
这里的vim操作命令指的是按下 : 之后可以输入的命令
-
去掉所有空行
:g/^s*$/d
说明:
g : 全局命令
/ : 分割符
^\s*$: 所有匹配开头和结尾只有 空格 的行.
/d : 删除该行
vim的folder操作¶
-
配置
set foldenable “设置允许折叠
set foldmethod=[manual|indent|] “设置折叠方式,manul手动 indent按缩进折叠
set foldlevel=3 “设置折叠的层级大小
-
操作
在normal模式下进行fold操作
z + c 折叠光标所在的区域(一次折叠一层)
z + C 折叠光标所在的区域(一次把光标所在的区域折叠到最小)
z + R 打开所有的折叠(一次打开到没有折叠的样子)
z + r 打开所有的折叠(一次打开一层折叠,再桉一次这打开下一层)
z + o 打开光标所在的折叠,或者 在光标所在的地方 按 l 也可以
z + M 折叠所有可以折叠的代码(以最大深度进行折叠)
z + m 折叠所有可以折叠的代码(以一层的深度递增折叠,再桉一次则折叠第二层)
vim的自动补全¶
-
配置
这里使用的是Omni的自动补全插件,其他的后有一些不同的地方
set completeopt=menu,menuone “关掉补全的预览窗口
let OmniCpp_MayCompleteDot = 1 “配置’.’以后给出补全信息
let OmniCpp_MayCompleteArrow = 1 “配置’->’以后给出补全信息
let OmniCpp_MayCompleteScope = 1 “配置’::’以后给出补全信息
let OmniCpp_ShowPrototypeInAbbr = 0 “配置补全时是否显示函数原型,默认是不显示,1是显示
还有一些其他配置,需要的话网上查
-
操作
补全的操作都是在insert模式下进行的,所有的操作都是使用Ctrl作为修饰符的,这样才能区分是不是需要输入
<C-i> 在任何时刻想要提示一下
<C-g> 取消补全,隐藏补全的选择列表
<C-n> 选择下一补全选项
<C-p> 选择上一个补全选项
<C-I> 根据头文件进行补全
<C-f> 列出有关文件的补全
vim中输入xml的相关快捷键¶
<C-o> | <C-k> 把输入的字符变为xml的一个节点 div ==> <div> </div>
使用vim编辑一个加密文件¶
-
新建一个加密文件
vim -x file 首次建立会让你输入密码
-
打开一个加密文件
直接vim file就可了,如果是加密文件,vim会提示输入密码的.
-
给一个明文文件加密,或者改密码
:set key= 清除密码
:set key={密码} 设置密码为{密码}
记得保存后才起效哦
有关vim文件的编码设定¶
-
以指定的编码打开文件
:e ++enc={编码} {文件} 使用指定编码打开文件 编码的可选范围: utf8 ucs-bom gbk,cp936,gb2312,gb18030
-
查看文件的当前编码
:set fenc 显示文件的编码
:set enc 显示vim新建文件的时候的默认编码
-
以指定编码写入文件(不管文件的当前编码)
:w ++enc={编码} [文件]
来源:oschina
链接:https://my.oschina.net/u/2265334/blog/1618918