先搭建完整的vim使用环境:
https://blog.csdn.net/m0_46208463/article/details/106855734
vim 快捷键大全:
一、光标移动
h,j,k,l 上,下,左,右
w 光标移到下一个字首,按标点或单词分割
W 光标移到下一个字首,长跳,如end-of-line被认为是一个字
e 光标移到下一个字尾
E 光标移到下一个字尾,长跳
b 光标移到上一个字
B 光标移到上一个字,长跳
0 光标移至行首,不管有无缩进,就是跳到第0个字符
^ 光标移至行首的第一个字符
$ 光标移至行尾
gg 光标移至文首
G 光标移至文尾
5gg/5G 光标移至第5行
gd 光标移至当前光标所在的变量的声明处
z 重画屏幕,当前光标变成屏幕的第一行 (redraw current line at top of window)
Ctrl-e 移动页面
Ctrl-d 下翻半页
Ctrl-u 上翻半页
Ctrl-b 上翻一页
Ctrl-f 下翻一页
二、插入模式
a 在光表后插入 (append after cursor)
A 在一行的结尾插入 (append at end of the line)
i 在光标前插入 (insert before cursor)
I 在第一个非空白字符前插入 (insert before first non-blank)
o 光标下面插入一个新行 (open line below)
O 光标上面插入一个新行 (open line above)
Esc 退出插入模式
三、复制粘贴指令
- 基本操作:
y 复制 (yank line)
yy 复制当前行 (yank current line)
y5y 复制5行
yw 复制一个字
yY 复制到行末
P 粘贴粘贴板的内容到当前行的下面
p 粘贴粘贴板的内容到当前行的上面
- 高级操作:
“{a-z或A-Z}y 把信息复制到某个寄存{a-z或A-Z}中(yank the link into register {a-z or A-Z})
例如我用 “ayy 复制一行到寄在a,然后我再用“byw复制一个单词在寄存b。粘贴的时候,我们就可以选择贴a里面的东西还是b里面的,这个就好像是多个复制版一样
“{a-z或A-Z}p 将某个寄存{a-z或A-Z}的内容贴出来 (paste from register)
例如“ap那么就在当前光标下贴出我们之前在寄存a中的内容,“bP就在当前光标上贴出我之前寄存b的内容
reg 显示所有寄存中的内容 (list all registers)
“*y 这个是把信息复制进系统的复制版(可以在其他程序中贴出来)(yank to OS buffer)
“*p 从系统的剪贴板中读取信息贴入vim (paste from OS buffer to vim)
四、删除指令
x 删除当前字符
X 删除前一个字符
d 删除 (delete)
dw 删除一个单词(word)
5dw 删除5个词
dd 删除光标所在行
5dd 删除5行
d/D 删除到行末
c 跟d键一样,但是删除后进入输入模式 (same as “d” but after delete, in insert mode)
S 删除一行(好像dd一样)但是删除后进入输入模式 (same as “dd” but after delete, in insert mode)
s 删除字符,跟(d)一样,但是删除后进入输入模式 (same as “d” but after delete, in insert mode)
s4s 会删除4个字符,进入输入模式 (delete 4 char and put in insert mode)
五、搜索替换指令
1.基本操作
- 搜索:
fx 在当前行中找x字符,找到了就跳转至
; 重复上一个f命令,而不用重复的输入fx
* 查找光标所在处的单词,向下查找
# 查找光标所在处的单词,向上查找
n 下一个匹配(如果是/搜索,则是向下的下一个,?搜索则是向上的下一个)
N 上一个匹配(同上)
/pattern 向后搜索字符串pattern
?pattern 向前搜索字符串pattern
"\c" 忽略大小写
"\C" 大小写敏感
:%s/old/new/g 搜索整个文件,将所有的old替换为new
:%s/old/new/gc 搜索整个文件,将所有的old替换为new,每次都要你确认是否替换
- 替换:
r 替换单个字符 (replace characters)
R 替换多个字符 (replace mode – continue replace)
gr 不影响格局布置的替换 (replace without affecting layout)
2.高级操作
- 搜索 (search) vim超级强大的一个功能就是搜索跟替换了。要是熟悉正表达(regular expressions)这个搜索跟后面的替换将会是无敌利器(支持RE的编辑器不多吧)
% 查找下一个结束,例如在”(“下查找下一个”)”,可以找”()”, “[]” 还有shell中常用的 if, else这些 (find next brace, bracket, comment or #if/#else/#endif)
下面直接用几个例子说话
/a* 这个会搜到 a aa aaa
/\(ab\)* 这个会搜到 ab abab ababab
/ab\+ 这个会搜到 ab abb abbb
/folers\= 这个会搜到 folder folders
/ab\{3,5} 这个会搜到 abbb abbbb abbbbb
/ab\{-1,3} 这个会在abbb中搜到ab (will match ab in abbb)
/a.\{-}b 这个会在axbxb中搜到axb (match ‘axb’ in ‘axbxb’)
/a.*b 会搜索到任何a开头后面有b的 (match a*b any)
/foo\|bar 搜索foo或者bar,就是同时搜索2个词 (match ‘foo’ or ‘bar’)
/one\|two\|three 搜索3个词 (match ‘one’, ‘two’ or ‘three’)
/\(foo\|bar\)\+ 搜索foo, foobar, foofoo, barfoobar等等 (match ‘foo’, ‘foobar’, ‘foofoo’, ‘barfoobar’ … )
/end\(if\|while\|for\) 搜索endif, endwhile endfor (match ‘endif’, ‘endwhile’, ‘endfor’)
/forever\&… 这个会在forever中搜索到”for”但是不会在fortuin中搜索到”for” 因为我们这里给了&…的限制 (match ‘for’ in ‘forever’ will not match ‘fortuin’)
特殊字符前面加^就可以 (for special character, user “^” at the start of range)
/”[^"]*”
这里解释一下
” 双引号先引起来 (double quote)
[^"] 任何不是双引号的东西(any character that is not a double quote)
* 所有的其他 (as many as possible)
” 结束最前面的引号 (double quote close)
上面那个会搜到“foo” “3!x”这样的包括引号 (match “foo” -and “3!x” include double quote)
更多例子,例如搜索车牌规则,假设车牌是 “1MGU103” 也就是说,第一个是数字,3个大写字母,3个数字的格式。那么我们可以直接搜索所有符合这个规则的字符
(A sample license plate number is “1MGU103″. It has one digit, three upper case
letters and three digits. Directly putting this into a search pattern)
这个应该很好懂,我们搜索
\数字\大写字母\大写字母\大写字母\数字\数字\数字
/\d\u\u\u\d\d\d
另外一个方法,是直接定义几位数字(不然要是30位,难道打30个\u去?)
(specify there are three digits and letters with a count)
/\d\u\{3}\d\{3}
也可以用范围来搜索 (Using [] ranges)
/[0-9][A-Z]\{3}[0-9]\{3}
用到范围搜索,列出一些范围(range)
这个没什么好说了,看一下就都明白了,要全部记住。。。用的多了就记住了,用的少了就忘记了。每次看帮助,呵呵
/[a-z]
/[0123456789abcdef] = /[0-9a-f]
\e
\t
\r
\b
简写 (item matches equivalent)
\d digit [0-9]
\D non-digit [^0-9]
\x hex digit [0-9a-fA-F]
\X non-hex digit [^0-9a-fA-F]
\s white space [ ] ( and )
\S non-white characters [^ ] (not and )
\l lowercase alpha [a-z]
\L non-lowercase alpha [^a-z]
\u uppercase alpha [A-Z]
\U non-uppercase alpha [^A-Z]
:help /[] 特殊的定义的,可以在vim中用用help来看 (everything about special)
:help /\s 普通的也可以直接看一下 (everything about normal)
- 替换 (string substitute) – RX
替换其实跟搜索是一样的。只不过替换是2个值,一个是你搜索的东西,一个是搜索到之后要替换的 string substitute (userx)
%s/abc/def/ 替换abc到def (substitute abc to def)
例如,%s/four/4/g,将全部的four替换成4
%s/abc/def/c 替换abc到def,会每次都问你确定(substitute on all text with confirmation (y,n,a,q,l))
1,5s/abc/def/g 只替换第一行到第15行之间的abc到def (substitute abc to def only between line 1 to 5)
54s/abc/def/ 只替换第54行的abc到def (only substitute abc to def on line 54)
结合上面的搜索正表达式,这个替换功能。。。就十分只强大。linux中很多地方都是用正表达来做事请的,所以学会了受益无穷。
全局 (global)
global具体自行方法是 g/pattern/command
:g/abc/p 查找并显示出只有abc的行 (only print line with “abc” )
:g/abc/d 删除所有有abc的行 (delete all line with “abc”)
:v/abc/d 这个会把凡是不是行里没有abc的都删掉 (delete all line without “abc”)
六、信息过滤 (filter)
vim又一强大功能
! 用!就是告诉vim,执行过滤流程 (tell vim to performing a filter operation)
!5G 从光标下向下5行执行过滤程序 (tell vim to start filter under cursor and go down 5 lines)
正式指令开始,这里用sort来做例子:
!5Gsort 从光标下开始执行sort,一共执行5行,就是说我只要sort5行而已 (this will sort the text from cursor line down to 5 lines)
!Gsort -k3 可以直接代sort的参数,我要sort文字中的第三段 (sort to the end of file by column 3)
!! 只过滤当前的这行 (filter the current line)
如果觉得!这样的方法,5G这样的方法用起来别扭(我是这么觉得),可以用标准的命令模式来做
!其实就是个:.,而已(to type the command)
:.,start,end!sort 这里定义:.,起始行,结束行!运行指令
:.,$!sort 从当前这行一直执行至文件结束 (sort from current line to end)
:.0,$!sort 从文件的开始第一个行一直执行到文件结束 (sort from start of file to end)
:.10,15!sort 只在文件的第10行到第15行之间执行 (sort between line 10 to 15)
七、编辑
mm 光标所在单词高亮显示/取消
J 将下一行和当前行连接为一行
cc 删除当前行并进入编辑模式
cw 删除当前字,并进入编辑模式
c$ 擦除从当前位置至行末的内容,并进入编辑模式
s 删除当前字符并进入编辑模式
S 删除光标所在行并进入编辑模式
xp 交换当前字符和下一个字符
u undo,撤销和文本恢复
Ctrl+r 重做
~ 更改大小写,当前字符,大变小,小变大 (change case upper-lower or lower-upper)
gu 变成小写 (change to lower case),例如 guG 会把光标当前到文件结尾全部变成小写 (change lower case all the way to the end)
gU 变成大写 (change to upper case),例如 gUG 会把光标当前到文件结尾全部变成大写 (change upper case all the way to the end)
Ctrl-n 代码编辑模式,自动补全选项,下一个
Ctrl-p 代码编辑模式,自动补全选项,上一个
>> 将当前行右移一个单位(一个tab符)
<< 将当前行左移一个单位
八、多文件编辑
vim file1.. 同时打开多个文件
-o[n] 以水平分屏的方式打开多个文件
-O[n] 以垂直分屏的方式打开多个文件
:args 显示当前编辑文件
:next 切换到下个文件
:prev 切换到前个文件
:next! 不保存当前编辑文件并切换到下个文件
:prev! 不保存当前编辑文件并切换到上个文件
:wnext 保存当前编辑文件并切换到下个文件
:wprev 保存当前编辑文件并切换到上个文件
:first 定位首文件
:last 定位尾文件
Ctrl+^ 快速在最近打开的两个文件间切换
:split[sp] 把当前文件水平分割
:split file 把当前窗口水平分割, file
:vsplit[vsp] file 把当前窗口垂直分割, file
:new file 同split file
:close 关闭当前窗口
:only 只显示当前窗口, 关闭所有其他的窗口
:all 打开所有的窗口
:vertical all 打开所有的窗口, 垂直打开
:qall 对所有窗口执行:q操作
:qall! 对所有窗口执行:q!操作
:wall 对所有窗口执行:w操作
:wqall 对所有窗口执行:wq操作
:split 分割窗口
Ctrl+w 切换
Ctrl-w h 跳转到左边的窗口
Ctrl-w j 跳转到下面的窗口
Ctrl-w k 跳转到上面的窗口
Ctrl-w l 跳转到右边的窗口
Ctrl-w t 跳转到最顶上的窗口
Ctrl-w b 跳转到最底下的窗口
九、多标签编辑
:tabedit file 在新标签中打开文件file
:tab split file 在新标签中打开文件file
:tabp 切换到前一个标签
:tabn 切换到后一个标签
:tabc 关闭当前标签
:tabo 关闭其他标签
gt 到下一个tab
gT 到上一个tab
0gt 跳到第一个tab
5gt 跳到第五个tab
十、代码跳转
Ctrl,f 跳转到代码树目录所在路径
Ctrl\e 搜索字符
跳跃指令(jumps):跳跃指令类似于游览器中的<前进<后退按钮
Ctrl-] 跳转到定义 -跟着link/tag转入 (follow link/tag)
Ctrl-o 跳回到上一次的jump (go back)
Ctrl-t 跳回到上一个
Ctrl-i 跳到下一个 (go forward)
:ju 显示所有的可以跳跃的地方 (print jump list)
Ctrl-n 下一个
Ctrl-p 上一个
十一、文本保存,退出编辑:
:w 保存文件 (write file)
:w! 强制保存 (force write)
:x 保存修改并退出
:q 退出文件,如果对缓冲区进行过修改,则会提示 (exit file without save)
:q! 强制退出,放弃修改 (force quite without save)
:wq 保存修改并退出
:e filename 打开一个文件名为filename的文件 (open file to edit)
:e! filename 强制打开一个文件,所有未保存的东西会丢失 (force open, drop dirty buffer)
:saveas filename 另存为 filename (save file as filename)
十二、NERD_tree常用快捷键:
切换工作台和目录
ctr+w+h 光标focus左侧树形目录,
Ctrl+w+l 光标focus右侧文件显示窗口。
Ctrl+w+w 光标自动在左右侧窗口切换
Ctrl+w+r 移动当前窗口的布局位置
o 在已有窗口中打开文件、目录或书签,并跳到该窗口 .....|NERDTree-o|
go 在已有窗口 中打开文件、目录或书签,但不跳到该窗口 .....|NERDTree-go|
t 在新Tab中打开选中文件/书签,并跳到新Tab .....|NERDTree-t|
T 在新Tab中打开选中文件/书签,但不跳到新Tab .....|NERDTree-T|
i split 一个新窗口打开选中文件,并跳到该窗口 .....|NERDTree-i|
gi split一个新窗口打开选中文件,但不跳到该窗口 .....|NERDTree-gi|
s vsp一个新窗口打开选中文件,并跳到该窗口 .....|NERDTree-s|
gs vsp一个新 窗口打开选中文件,但不跳到该窗口 .....|NERDTree-gs|
! 执行当前文件 .....|NERDTree-!|
O 递归打开选中 结点下的所有目录 .....|NERDTree-O|
x 合拢选中结点的父目录 .....|NERDTree-x|
X 递归 合拢选中结点下的所有目录 .....|NERDTree-X|
e Edit the current dif .....|NERDTree-e|
双击 相当于NERDTree-o
中键 对文件相当于NERDTree-i,对目录相当于NERDTree-e
D 删除当前书签
P 跳到根结点
p 跳到父结点
K 跳到当前目录下同级的第一个结点
J 跳到当前目录下同级的最后一个结点
k 跳到当前目录下同级的前一个结点
j 跳到当前目录下同级的后一个结点
C 将选中目录或选中文件的父目录设为根结点
u 将当前根结点的父目录设为根目录,并变成合拢原根结点
U 将当前根结点的父目录设为根目录,但保持展开原根结点
r 递归刷新选中目录
R 递归刷新根结点
m 显示文件系统菜单
cd 将CWD设为选中目录
I 切换是否显示隐藏文件
f 切换是否使用文件过滤器
F 切换是否显示文件
B 切换是否显示书签
q 关闭NerdTree窗口
? 切换是否显示Quick Help
NerdTree 在 .vimrc 中的常用配置
" 在 vim 启动的时候默认开启 NERDTree(autocmd 可以缩写为 au)
autocmd VimEnter * NERDTree
" 按下 F2 调出/隐藏 NERDTree
map :silent! NERDTreeToggle
" 将 NERDTree 的窗口设置在 vim 窗口的右侧(默认为左侧)
let NERDTreeWinPos="right"
" 当打开 NERDTree 窗口时,自动显示 Bookmarks
let NERDTreeShowBookmarks=1
十三、cscop快捷键
1. Ctrl+] 将跳到光标所在变量或函数的定义处 Ctrl+T返回
2. :cs find s ---- 查找C语言符号,即查找函数名、宏、枚举值等出现的地方
:cs find g ---- 查找函数、宏、枚举等定义的位置,类似ctags所提供的功能
:cs find d ---- 查找本函数调用的函数
:cs find c ---- 查找调用本函数的函数
:cs find t: ---- 查找指定的字符串
:cs find e ---- 查找egrep模式,相当于egrep功能,但查找速度快多了
:cs find f ---- 查找并打开文件,类似vim的find功能
:cs find i ---- 查找包含本文件的文
3. 2的所以命令也可以按键来实现:
1. Ctrl+\ 再按 s 表示:cs find s命令
2. 同理实现cs find + g,d,c,t,e,f,i命令
自动补全命令:
关键字补全(Generic keyword completion)
使用Ctrl-N或Ctrl-P键,将按照'complete'选项指定的范围来搜索匹配的关键字。其默认值为:
:set complete=.,w,b,u,t,i
也就是说,默认将在以下来源中查找关键字:
在当前缓冲区中进行查找;
在其他窗口中进行查找;
在其他已载入的缓冲区中进行查找;
在没有载入缓冲区的文件中进行查找;
在当前的标签(tags)列表进行查找;
在由当前文件(如#include)包含进来的头文件中进行查找。
^X模式(Ctrl-X Mode)
在插入模式下,输入Ctrl-X将进入^X模式(插入和替换模式的一个子模式)。屏幕底部将显示以下提示信息:
-- ^X mode (^]^D^E^F^I^K^L^N^O^Ps^U^V^Y)
您可以选择以下自动补全方式:
Ctrl-] ,标签(tags)补全
Ctrl-D ,定义补全
Ctrl-E ,向上滚动文本
Ctrl-F ,文件名补全
Ctrl-I ,当前文件以及包含进来的文件补全
Ctrl-K ,字典补全
Ctrl-L ,整行补全
Ctrl-N ,当前文件内的关键字补全,向下选择匹配项
Ctrl-O ,全能补全
Ctrl-P ,当前文件内的关键字补全,向上选择匹配项
Ctrl-S ,拼写建议补全
Ctrl-U ,用户自定义补全
Ctrl-V ,Vim命令补全
Ctrl-Y ,向下滚动文本
假设在编辑main.c文件时,想要查找一个宏定义,那么首先按下Ctrl-X键进入^X模式,然后再按下Ctrl-D键,这时就会在弹出菜单中显示匹配项。
补全弹出菜单(popupmenu-completion)
随着弹出菜单的显示,将会自动应用第一个匹配项。
使用以下快捷键,可以在弹出菜单中移动和选择匹配项:
使用Ctrl-N和Ctrl-P上下移动时,输入的文本也会随之变化。
使用<Up和<Down上下移动时,输入的文字并不会变化。
使用<PageUp和<PageDown键,可以在菜单中翻页。
使用Ctrl-Y或Enter回车键,将使用当前匹配项完成补全。
使用Ctrl-E键,将关闭菜单并退回到文字输入的原始状态。
使用Esc键,将关闭弹出菜单,但会保留之前应用的匹配项。
请注意,如果您不希望应用任何匹配项完成补全时,应该使用Ctrl-E键,而不是使用Esc键来取消操作。
十四、undo指令
vim的undo是树结构的,你可以回到这个结构中的任何地方
:undo 2 undo到结构的2层 (undo to tree 2)
:undolist 显示所有的undo列表 (show undo list)
:earlier 10s undo到10秒前的编辑 (undo to 10 seconds ago)
:earlier 10h undo到10小时前的编辑 (back to 10 hours ago)
:earlier 1m undo到1分钟前 (back to 1 minutes ago)
十五、视觉模式 (visual)
v 进入视觉模式
在视觉模式内可以作block的编辑
Ctrl-v -visual block
十六、打印 (print)
:hardcopy 打印vim中的内容 (print text)
混合视觉模式 (visual) 可以选择打印的区域
没试过是否可以直接给值打印(应该可以)例如 :1,15hardcopy 打印前15行
将文件写成网页格式 (html)
:source $VIMRUNTIME/syntax/2html.vim -change current open file to html
十七、格式 (format)
dos/windows跟unix/linux对于文件的结束是不一样的。vim可以直接设定/更改格式
用纸令:set fileformats=unix,dos 可以改变文件的格式 (change format)
:set ff=unix -设定文件成unix格式 (set file in unix format)
:set ff=dos -设定文件成dos格式 (set file in dos format)
:set ff? -检查当前文件格式 (check the format of current file)
如果改变格式,直接:w存档就会存成新的格式了。
十八、加密 (encryption)
vim可以给文件加密码
vim -x 文件名 (filename) -输入2次密码,保存后文件每次都会要密码才能进入 (encrypt the file with password)
vim 处理加密文件的时候,并不会作密码验证,也就是说,当你打开文件的时候,vim不管你输入的密码是否正确,直接用密码对本文进行解密。如果密码错误,你看 到的就会是乱码,而不会提醒你密码错误(这样增加了安全性,没有地方可以得知密码是否正确)当然了,如果用一个够快的机器作穷举破解,vim还是可以揭开 的
十九、vim 语法显示 (syntax)
:syntax enable -打开语法的颜色显示 (turn on syntax color)
:syntax clear -关闭语法颜色 (remove syntax color)
:syntax off -完全关闭全部语法功能 (turn off syntax)
:syntax manual -手动设定语法 (set the syntax manual, when need syntax use :set syntax=ON)
输入特殊字符 (special character)
Ctrl-v 编码就可以了
例如 Ctrl-v 273 -ÿ 得到 ÿ
二十、二进 制文件 (binary file)
vim可以显示,编辑2进位文件
vim -b datafile
:set display=uhex -这样会以uhex显示。用来显示一些无法显示的字符(控制字符之类)(display in uhex play non-display char)
:%!xxd -更改当前文件显示为2进位 (change display to binary)
:%!xxd -r -更改二进位为text格式 (convert back to text)
二十一、自动完成 (auto-completion)
vim本身有自动完成功能(这里不是说ctag,而是vim内建的)
Ctrl-p -向后搜索自动完成 (search backward)
Ctrl-n -向前搜索自动完成 (search forward)
Ctrl-x+Ctrl-o -代码自动补全 (code completion)
二十二、自动备份 (backup)
vim可以帮你自动备份文件(储存的时候,之前的文件备份出来)
:set backup -开启备份,内建设定备份文件的名字是 源文件名加一个 ‘~’ (enable backup default filename+~)
:set backupext=.bak -设定备份文件名为源文件名.bak (change backup as filename.bak)
自动备份有个问题就是,如果你多次储存一个文件,那么这个你的备份文件会被不断覆盖,你只能有最后一次存文件之前的那个备份。没关系,vim还提 供了patchmode,这个会把你第一次的原始文件备份下来,不会改动
:set patchmode=.orig -保存原始文件为 文件名.orig (keep orignal file as filename.orig)
二十三、书签 (Mark)
书签是vim中非常强大的一个功能,书签分为文件书签跟全局书签。文件书签是你标记文件中的不同位置,然后可以在文件内快速跳转到你想要的位置。 而全局书签是标记不同文件中的位置。也就是说你可以在不同的文件中快速跳转
m{a-zA-Z} -保存书签,小写的是文件书签,可以用(a-z)中的任何字母标记。大写的是全局 书签,用大写的(A-Z)中任意字母标记。(mark position as bookmark. when lower, only stay in file. when upper, stay in global)
‘{a-zA-Z} -跳转到某个书签。如果是全局书签,则会开启被书签标记的文件跳转至标记的行 (go to mark. in file {a-z} or global {A-Z}. in global, it will open the file)
’0 -跳转入现在编辑的文件中上次退出的位置 (go to last exit in file)
” -跳转如最后一次跳转的位置 (go to last jump -go back to last jump)
‘” -跳转至最后一次编辑的位置 (go to last edit)
g’{mark} -跳转到书签 (jump to {mark})
:delm{marks} -删除一个书签 (delete a mark) 例如:delma那么就删除了书签a
:delm! -删除全部书签 (delete all marks)
:marks -显示系统全部书签 (show all bookmarks)
二十四、标志 (tag)
:ta -跳转入标志 (jump to tag)
:ts -显示匹配标志,并且跳转入某个标志 (list matching tags and select one to jump)
:tags -显示所有标志 (print tag list)
运行外部命令 (using an external program)
:! -直接运行shell中的一个外部命令 (call any external program)
:!make -就直接在当前目录下运行make指令了 (run make on current path)
:r !ls -读取外部运行的命令的输入,写入当然vim中。这里读取ls的输出 (read the output of ls and append the result to file)
:3r !date -u -将外部命令date -u的结果输入在vim的第三行中 (read the date -u, and append result to 3rd line of file)
:w !wc -将vim的内容交给外部指令来处理。这里让wc来处理vim的内容 (send vim’s file to external command. this will send the current file to wc command)
vim对于常用指令有一些内建,例如wc (算字数)(vim has some buildin functions, such like wc)
g Ctrl-G -计算当前编译的文件的字数等信息 (word count on current buffer)
!!date -插入当前时间 (insert current date)
二十五、多个文件的编辑 (edit multifiles)
vim可以编辑多个文件,例如
vim a.txt b.txt c.txt 就打开了3个文件
:next -编辑下一个文件 (next file in buffer)
:next! -强制编辑下个文件,这里指如果更改了第一个文件 (force to next file in buffer if current buffer changed)
:wnext -保存文件,编辑下一个 (save the file and goto next)
:args -查找目前正在编辑的文件名 (find out which buffer is editing now)
:previous -编辑上个文件 (previous buffer)
:previous! -强制编辑上个文件,同 :next! (force to previous buffer, same as :next!)
:last -编辑最后一个文件 (last buffer)
:first -编辑最前面的文件 (first buffer)
:set autowrite -设定自动保存,当你编辑下一个文件的时候,目前正在编辑的文件如果改动,将会自动保存 (automatic write the buffer when you switch to next buffer)
:set noautowrite -关闭自动保存 (turn autowrite off)
:hide e abc.txt -隐藏当前文件,打开一个新文件 abc.txt进行编辑 (hide the current buffer and edit abc.txt)
:buffers -显示所有vim中的文件 (display all buffers)
:buffer2 -编辑文件中的第二个 (edit buffer 2)
vim中很多东西可以用简称来写,就不用打字那么麻烦了,例如 :edit=:e, :next=:n 这样.
二十六、分屏 (split)
vim提供了分屏功能(跟screen里面的split一样)
:split -将屏幕分成2个 (split screen)
:split abc.txt -将屏幕分成两个,第二个新的屏幕中显示abc.txt的内容 (split the windows, on new window, display abc.txt)
:vsplit -竖着分屏 (split vertically)
:{d}split -设定分屏的行数,例如我要一个屏幕只有20行,就可以下:20split (split the windows with {d} line. 20split: open new windows with 3 lines)
:new -分屏并且在新屏中建立一个空白文件 (split windows with a new blank file)
Ctrl-w+j/k/h/l -利用Ctrl加w加上j/k/h/l在不同的屏内切换 (switch, move between split screens)
Ctrl-w+ -/+ -增减分屏的大小 (change split size)
Ctrl-w+t -移动到最顶端的那个屏 (move to the top windows)
Ctrl-w+b -移动到最下面的屏 (move to bottom window)
:close -关闭一个分出来的屏 (close splited screen)
: only -只显示光标当前屏 ,其他将会关闭(only display current active screen, close all others )
:qall -退出所有屏 (quite all windows)
:wall -保存所有屏 (write to all windows)
:wqall -保存并退出所有屏 (write and quite all windows)
:qall! -退出所有屏,不保存任何变动 (quite all windows without save)
开启文件的时候,利用 -o选项,就可以直接开启多个文件在分屏中 (with -o option from command line, it will open files and display in split mode)
vim -o a.txt b.txt
今天有人说不会看diff,其实vim也可以用来看diff,这个也是属于分屏的部分,这里也写一下。
vimdiff a.txt b.txt 如果直接给 -d选项是一样的 vim -d a.txt b.txt
:diffsplit abc.txt 如果你现在已经开启了一个文件,想vim帮你区分你的文件跟abc.txt有什么区别,可以在vim中用diffsplit的方式打开第二个文件,这个时 候vim会用split的方式开启第二个文件,并且通过颜色,fold来显示两个文件的区别
这样vim就会用颜色帮你区分开2个文件的区别。如果文件比较大(源码)重复的部分会帮你折叠起来(折叠后面会说)
现在来说patch
:diffpatch filename 通过:diffpatch 你的patch的文件名,就可以以当前文件加上你的patch来显示。vim会split一个新的屏,显示patch后的信息并且用颜色标明区别。
如果不喜欢上下对比,喜欢左右(比较符合视觉)可以在前面加vert,例如:
:vert diffsplit abc.txt
:vert diffpatch abc.txt
看完diff,用: only回到原本编辑的文件,觉 得diff的讨厌颜色还是在哪里,只要用:diffoff关闭就好了。
还有个常用的diff中的就是 :diffu 这个是 :diffupdate 的简写,更新用
二十七、VIM的tab切换,切换标签页
除了split之外, vim还可以用 tab
:tab split filename -这个就用tab的方式来显示多个文件 (use tab to display buffers)
标准模式下:gt , gT 可以直接在tab之间切换
gt -到下一个tab (go to next tab)
gT -到上一个tab (go to previous tab)
vim大多数东西都是可一给数字来执行的,tab也是一样
0gt -跳到第一个tab (switch to 1st tab)
5gt -跳到第五个tab (switch to 5th tab)
:tabnew [++opt选项] [+cmd] 文件 建立对指定文件新的tab
:tabc 关闭当前的 tab
:tabo 关闭所有其他的 tab
:tabs 查看所有打开的 tab
:tabp 前一个 tab
:tabn 后一个 tab
MacVim 还可以借助快捷键来完成 tab 的关闭、切换
cmd+w 关闭当前的 tab
cmd+{ 前一个 tab
cmd+} 后一个 tab
关闭所有的tab可以使用qall的指令。另外让vim在启动的时候就自动用tabnew的方式来开启多个文件,可以用alias
linux: 添加 alias vim=’vim -p’ 到 ~/.bashrc
windows: 自己写个vim.bat的文件,然后放在path中,文件内容:
@echo off
vim -p %*
当需要更改多个tab中的文件的时候,可以用 :tabdo 这个指令 这个就相当于 loop 到你的所有的 tab 中然后运行指令。
例如有5个文件都在tab里面,需要更改一个变量名称:abc 到 def, 就可以用 :tabdo %s/abc/def/g 这样所有的5个tab里面的abc就都变成def了
二十八、折叠 (folding)
vim的文本折叠功能在阅读代码时非常便捷。
zfap -按照段落折叠 (fold by paragraph)
zo -打开一个折叠 (open fold)
zc -关闭一个折叠 (close fold)
zf -创建折叠 (create fold) 这个可以用v视觉模式,可以直接给行数等等
zr -打开一定数量的折叠,例如3rz (reduce the folding by number like 3zr)
zm -折叠一定数量(之前你定义好的折叠) (fold by number)
zR -打开所有的折叠 (open all fold)
zM -关闭所有的摺叠 (close all fold)
zn -关闭折叠功能 (disable fold)
zN -开启折叠功能 (enable fold)
zO -将光标下所有折叠打开 (open all folds at the cursor line)
zC -将光标下所有折叠关闭 (close all fold at cursor line)
zd -将光标下的折叠删除,这里不是删除内容,只是删除折叠标记 (delete fold at cursor line)
zD -将光标下所有折叠删除 (delete all folds at the cursor line)
按照tab来折叠,python最好用的 (ford by indent, very useful for python)
:set foldmethod=indent -设定后用zm 跟 zr 就可以的开关关闭了 (use zm zr)
二十九、保存视图 (save view)
对于vim来说,如果你设定了折叠,但是退出文件,不管是否保持文件,折叠部分会自动消失的。这样来说非常不方便。所以vim给你方法去保存折叠,标签,书签等记录。最厉害的是,vim对于每个文件可以保存最多10个view,也就是说你可以对同一个文件有10种不同的标记方法,根据你的需要,这些东西都会保存下来。
:mkview -保存记录 (save setting)
:loadview -读取记录 (load setting)
:mkview 2 -保存记录在寄存2 (save view to register 2)
:loadview 3 -从寄存3中读取记录 (load view from register 3)
常用指令 (commands)
:set ic -设定为搜索时不区分大小 写 (search case insensitive)
:set noic -搜索时区分大小写。 vim内定是这个(case sensitive )
& -重复上次的”:s” (repeat previous “:s”)
. -重复上次的指令 (repeat last command)
K -在man中搜索当前光标下的词 (search man page under cursor)
{0-9}K -查找当前光标下man中的章节,例如5K就是同等于man 5 (search section of man. 5K search for man 5)
:history -查看命令历史记录 (see command line history)
q: -打开vim指令窗口 (open vim command windows)
:e -打开一个文件,vim可以开启http/ftp/scp的文件 (open file. also works with http/ftp/scp)
:e http://www.google.com/index.html -这里就在vim中打开google的index.html (open google’s index.html)
:cd -更换vim中的目录 (change current directory in vim)
:pwd -显示vim当前目录 (display pwd in vim)
gf -打开文件。例如你在vim中有一行写了#include 那么在abc.h上面按gf,vim就会把abc.h这个文件打开 (look for file. if you have a file with #include , then the cursor is on abc.h press gf, it will open the file abc.h in vim )
三十、记录指令 (record)
q{a-z} -在某个寄存中记录指令 (record typed char into register)
q{A-Z} -将指令插入之前的寄存器 (append typed char into register{a-z})
q -结束记录 (stop recording)
@{a-z} -执行寄存中的指令 (execute recording)
@@ -重复上次的指令 (repeat previours :@{a-z})
还是给个例子来说明比较容易明白
我现在在一个文件中下qa指令,然后输入itest然后ESC然后q
这里qa就是说把我的指令记录进a寄存,itest实际是分2步,i 是插入 (insert) 写入的文字是 text 然后用ESC退回指令模式q结束记录。这样我就把itest记录再一个寄存了。
下面我执行@a那么就会自动插入test这个词。@@就重复前一个动作,所以还是等于@a
三十一、执行shell命令
1、在命令模式下输入":sh",可以运行相当于在字符模式下,到输入结束想回到VIM编辑器中用exit,Ctrl+D返回VIM编辑器
2、可以"!command",运行结束后自动回到VIM编辑器中
3、用“Ctrl+Z“回到shell,用fg返回编辑
4、:!make -直接在当前目录下运行make指令
三十二、自动排版和对齐
在粘贴了一些代码之后,vim变得比较乱,只要执行gg=G就能搞定
== 自动缩进当前行
排版与对齐命令:
方法一:
命令模式下:=:1,$
方法二:
gg(把关标定位到最上面),V(进入VISUAL模式),shift+g(选中整篇文本),然后=。
方法三:
命令模式下依次输入
gg=G
方法四:
step1:Ctrl + v (选中块)
step2:Ctrl + f (向前) 或 Ctrl +v (向后)
step3:按"=", 把选中的代码对齐
方法五:
=
或
==
三十三、如何在vim中编译程序
在vim中可以完成make,而且可以将编译的结果也显示在vim里,先执行 :copen 命令,将结果输出的窗口打开,然后执行 :make
编译后的结果就显示在了copen打开的小窗口里了,而且用鼠标双击错误信息,就会跳转到发生错误的行。
三十四、buffer操作
buffer状态
- (非活动的缓冲区)
a (当前被激活缓冲区)
h (隐藏的缓冲区)
% (当前的缓冲区)
# (交换缓冲区)
= (只读缓冲区)
+ (已经更改的缓冲区)
三十五、 VIM 操作目录
vim. 打开vim
,, 打开/关闭Quickfix
Ctrl-c 关闭Quickfix
Ctrl-z 关闭vim
fg 打开vim
```bash
1.打开目录
vim .
vim a-path/
2.以下操作在操作目录时生效
p,P,t,u,U,x,v,o,r,s
c 使当前打开的目录成为当前目录
d 创建目录
% 创建文件
D 删除文件/目录
- 转到上层目录
gb 转到上一个 bookmarked directory
i 改变目录文件列表方式
^l 刷新当前打开的目录
mf - 标记文件
mu - unmark all marked files
mz - Compress/decompress marked files
gh 显示/不显示隐藏文件( dot-files)
^h 编辑隐藏文件列表
a 转换显示模式, all - hide - unhide
qf diplay infomation about file
qb list the bookmarked directories and directory traversal history
gi Display information on file
mb
mc
md - 将标记的文件(mf标记文件)使用 diff 模式
me - 编辑标记的文件,只显示一个,其余放入 buffer 中
mh
mm - move marked files to marked-file target directory
mc - copy
mp
mr
mt
vim 中复制,移动文件
1, mt - 移动到的目录
2, mf - 标记要移动的文件
3, mc - 移动/复制
R 移动文件
打开当前编辑文件的目录
:Explore
:Hexplore
:Nexplore
:Pexplore
:Sexplore
:Texplore
:Vexplore