zhiyinjixu总结:
vim的一些常用命令:
Esc键 回到命令模式
:w 保存
:q! 退出不保存
ZZ(Shift+zz) 保存并退出
a 在光标后插入
命令模式下:
[[或gg是跳到文件的第一行
]]或G是跳到文件的最后一行
行模式下:
:/word 搜索一个单词,word可以是任意字符串
:%s/word1/word2/g 将所有的word1替换为word2 (不区分替换)
其他大杂烩:
vim查转与替换
2010-08-31 11:27:13
VIM中常用的替换模式总结。
1,简单替换表达式
替换命令可以在全文中用一个单词替换另一个单词:
:%s/four/4/g
“%” 范围前缀表示在所有行中执行替换。最后的 “g” 标记表示替换行中的所有匹配点。如果仅仅对当前行进行操作,那么只要去掉%即可
如果你有一个象 “thirtyfour” 这样的单词,上面的命令会出错。这种情况下,这个单词会被替换成”thirty4″。要解决这个问题,用 “\<” 来指定匹配单词开头:
:%s/\<four/4/g
显然,这样在处理 “fourty” 的时候还是会出错。用 “\>” 来解决这个问题:
:%s/\<four\>/4/g
如果你在编码,你可能只想替换注释中的 “four”,而保留代码中的。由于这很难指定,可以在替换命令中加一个 “c” 标记,这样,Vim 会在每次替换前提示你:
:%s/\<four\>/4/gc
2,删除多余的空格
要删除这些每行后面多余的空格,可以执行如下命令:
:%s/\s\+$//
命令前面指明范围是 “%”,所以这会作用于整个文件。”substitute” 命令的匹配模式是
“\s\+$”。这表示行末($)前的一个或者多个(\+)空格(\s)。替换命令的 “to” 部分是空的:”//”。这样就会删除那些匹配的空白字符。
3,匹配重复性模式
星号项 “*” 规定在它前面的项可以重复任意次。因此:
/a*
匹配 “a”,”aa”,”aaa”,等等。但也匹配 “” (空字串),因为零次也包含在内。星号 “*” 仅仅应用于那个紧邻在它前面的项。因此 “ab*” 匹配 “a”,”ab”,”abb”,”abbb”,等等。如要多次重复整个字符串,那么该字符串必须被组成一个项。组成一项的方法就是在它前面加 “\(“,后面加 “\)”。因此这个命令:
/\(ab\)*
匹配: “ab”,”abab”,”ababab”,等等。而且也匹配 “”。
要避免匹配空字串,使用 “\+”。这表示前面一项可以被匹配一次或多次。
/ab\+
匹配 “ab”,”abb”,”abbb”,等等。它不匹配 后面没有跟随 “b” 的 “a”。
要匹配一个可选项,用 “\=”。 例如:
/folders\=
匹配 “folder” 和 “folders”。
4,指定重复次数
要匹配某一项的特定次数重复,使用 “\{n,m}” 这样的形式。其中 “n” 和 “m” 都是数字。在它前面的那个项将被重复 “n” 到 “m” 次 (|inclusive| 包含 “n” 和 “m”)。例如:
/ab\{3,5}
匹配 “abbb”,”abbbb” 以及 “abbbbb”。
当 “n” 省略时,被默认为零。当 “m” 省略时,被默认为无限大。当 “,m” 省略时,就表示重复正好 “n” 次。例如:
模式 匹配次数
\{,4} 0,1,2,3 或 4
\{3,} 3,4,5,等等
\{0,1} 0 或 1,同 \=
\{0,} 0 或 更多,同 *
\{1,} 1 或 更多,同 \+
\{3} 3
5,多选一匹配
在一个查找模式中,”或” 运算符是 “\|”。例如:
/foo\|bar
这个命令匹配了 “foo” 或 “bar”。更多的抉择可以连在后面:
/one\|two\|three
匹配 “one”,”two” 或 “three”。
如要匹配其多次重复,那么整个抉择结构须置于 “\(” 和 “\)” 之间:
/\(foo\|bar\)\+
这个命令匹配 “foo”,”foobar”,”foofoo”,”barfoobar”,等等。
再举个例子:
/end\(if\|while\|for\)
这个命令匹配 “endif”,”endwhile” 和 “endfor”。
--工欲善其事,必先利其器
vim就是vi improved。vi是原本是类Unix系统上的一款优秀的文本编辑器。现在最好用的我觉是gvim,已经可能在各种平台上使用。
vim的官网是:http://www.vim.org 里面的有gvim的程序免费下载,还有各种插件供选择使用,也有少量关于vim的免费书籍供下载。
vim不同于记事本(notepad)、写字板(write)和MS office word,如果你习惯了它们,那么你再使用vim会是一件非常痛苦的事情。它是一款纯文本编译器,是现在公认的最好的文本编译器之一。
vim之所以强大就是它可以让你按照你自己的使用习惯来设置。可以这么说,你使用的越久就会越喜欢,了解的越多就会有越多的惊喜。我自己深深受益,好东西应该与大家分享,因此向大家推荐学习使用,在此向大家介绍一些非常基础的vim知识供大家学习参考。
vim有三种工作模式:插入模式 (Insert mode)、命令模式(Command mode) 、行模式 (EX Commands mode)。插入模式就像我们平时使用记事本时一样,可以随意的输入文本,基本没有什么可说的。主要是其它两个模式,下面细说。
首先是三个模式的相互转换。打开一个vim,它的默认模式是命令模式,输入a或i等字符后可以转为插入模式;插入模式在输入Esc后可以返回命令模式;命令模式输入:可以转为行模式;行模式也是在输入Esc后可以返回命令模式。注意:行模式和插入模式是不能直接相互转换的,必须能过命令模式转换。(下面的命令如果是以冒号开头的就是默认是行模式命令,否则是命令模式命令)
hjkl四个键相当于←↓↑→,可以在命令模式下使用它们来上下左右移动光标。(特别注意不要再使用小键盘的上下左右来移动光标了,不然就失去使用vim的主要原因之一了,这是刚使用vim时最不容易改变的习惯)
w是跳到下一个单词的开头
:w是保存文件
:wq是保存并退出文件
b是跳到单词的开头
e是跳到单词的结尾
[[或gg是跳到文件的第一行
]]或G是跳到文件的最后一行
nG是跳到文件的第n行,其中n是一个数字
n|是跳到本行的第n个字符,其中n是一个数字
a是向光标后插入字符
A是向本行最后插入字符
i是向光标前插入字符
I是向本行开关后插入字符
s是修改光标处字符(删除当前字符再进入插入模式)
S是修改本行的字符(删除当前行再进入插入模式)
c是与别的命令结合使用的,如cw是改变从光标后的一个单词,cb是改变光标前的一个单词,依次类推:ch是必变光标前的一个字符,cj是改变光标后的一行等等。如果前面再加上一个数字,如ncw(n是一个数字)是改变光标后的n个单词,其它命令也是这样类推的,这是vim的精华所在。就像太极生两仪,两仪生四象,四象生八卦一样奇妙。而且大部的命令都可以这样组合,可以自己发现。它们有一个普遍的规律:num+order+where,如4cw(修改4个单词),4是num,c是order,w是where;再如4yj(复制了5行)也是同理
C是修改当前行当前光标字符后的内容
d与c用法完全相似,只是d是删除不是修改,所以不进入插入模式
D是删除当前行当前光标字符后的内容
r是改变当前字符为另一字符,如ra是把当前字符变为a,它不进入插入模式
R是改变光标后的字符一直到按Esc为止,它也不进入插入模式
v是选择字符命令,按v后下下左右移动光标可以先择多个字符
V是选择行,按V后上下移动光标可以先择多行
ctrl+q或ctrl+v是打开可视块进行选择,Windows下只能用ctrl+q,因为ctrl+v被系统占用
x是删除光标处的字符
X是删除光标前的字符
y是复制当前光标处的字符,如果选择多个字符后再按y是复制选择的字符
Y或yy是复制当前行的内容,如果选择多行后再Y是复制选择的行的内容
p是把剪切板中的内容粘贴的当前行的下一行
P是把剪切板中的内容粘贴的当前行的上一行
o是在当前行的下一行插入一新行
O是在当前行的上一行插入一新行
zf是在选择多行后把内容折叠起来
zo是打开当前的折叠
zc是关闭光标处打开的折叠
zn是打开所有的折叠
zm是关闭所有打开的折叠
:sp 文件名 是打开一个新的文件在水平的窗口
:vsp 文件名 是打开一个新的文件在垂直的窗口
ctrl+w按两次是在打开的窗口中顺序进行切换
ctrl+w+(hjkl中的一个)是在光标称动方向上切换窗口
ctrl+w+r和ctrl+w+R都是把当前窗口和其它窗口换位置,不同的是它们的顺序正好相反
ctrl+w+(HJKL)是把当前窗口和光标移动方向上窗口换位置(如果有的话)
0是把光标移动到行的第一个字符处
^是把光标移动到行的第一个非空白字符开始处
$是把光标移动到行的结尾处
.是重复上一个命令
fw是在本行光标后找一个字符,其中w可以是任意字符,逗号可以重复此次的搜索
Fw是在本行光标前找一个字符,其中w可以是任意字符,逗号可以重复此次的搜索
zz是把当前行放到窗口中间
zt是把当前行放到窗口第一行
zb是把当前行放到窗口最先一行
ma是把光标处标志为a,其中a可以是任意一个字母
`a是把光标移动到标志a处,其中a可以是任意一个字母
'a是把光标移动到标志a所在的那一行,其中a可以是任意一个字母
>>是把当前行向后缩进
<<是把当前行向前缩进
>是在选中多行后把这些行向后缩进
<是在选中多行后把这些行向前缩进
/word是搜索一个单词,word可以是任意字符串
?word是搜索一个单词,word可以是任意字符串,与/不同的是?的搜索方向正好与它相反
n或N是在/或?搜索的结果中进行切换,n与N不同的是方向正好相反
*或#是搜索光标处的单词,不同的是*与#的搜索方向正好相反
:bn或bp是在打开多了buffer时在buffer之间进切换换的
:args是在一行中查看打开的多个buffer
:ls是在多行中查看打开的多个buffer
:set nu是在窗口中显示行号
:set nonu是不在窗口中显示行号
:set backup是备份一个编辑的文件
:set nobackup是不备份一个编辑的文件,可以看出set设置是成对出现的有一个set a就不一个set noa与之对应。
:set tabstop=4是把一个tab键显示为4个空格,也有许多别的设置与其形式相似。
:set all可以查看所有的set设置
:%s/life/Life/g是把文件中所有的life改变为Life,其中life和Life可以是任意字符串,life还可以是一个正则表达式
:1,10s/Life/life/g与上面命令相似,只不过本命令不改变文件的全部,只改变1到10行
:pwd是显示当前vim的工作路径
:cd与操作系统下的命令相似是改变vim的工作路径
:lcd %:p:h是把本窗口的vim的工作路径改变为打开的文件的路径,不影响其它窗口的工作路径
:!ls是显示调用操作系统的命令,ls可以是任意可以执行的系统命令。也可以把vim中的一些变量传给操作系统的命令,如在Windows中可以用::!explorer %:p:h打开窗口打开的文件所在的目录
:Ex可以在vim中水平的窗口中打开的文件所在的文件夹
:Vex可以在vim中垂直的窗口中打开的文件所在的文件夹
:set mouse=a selection=exclusive selectmode=mouse,key这条命令可以让vim像notepad一样用鼠标来点哪里光标到哪里
:hi normal guibg=black guifg=white这条命令可以让你的vim界面变的比较好看些。
:map Y y$是让Y不要去复制一行,而是让它像y$一样去复制光标到行尾的内容
:map \cd :lcd %:p:h是给命令模式的\cd命令添加像行命令:lcd %:p:h的作用,把当前窗口的工作路径变为当前窗口打开的文件所在的路径。许多的自已用的快捷键都可以能过此方法定义,复杂一些的也可以定义函数来处理,需要的话查阅文档进行学习即可。
:tabnew可以打开一个新的tab
gt或gT可以在tab之间进行切换,它们的方向下好相反
:e 文件名 可以打开一个新的buffer
gf 如果方件有另外一个文件的路径这个命令在光标们于路径上时可以进入那个文件。
ctrl+o可以返回上一个打开的文件
掌握了以上的内容就可以正常的使用vim了,其它一些有用的命令大家可以自己查阅文档或书籍学习使用,但是它的作用远不止于此,还有许多的非常方便的插件,比如TagList,bufferexplorer,nerd_tree等等,大家可以自己学习使用,它们极大地方便了vim文本处理的能力。当然最强大的是vim可以配合shell或批处理或其它一些脚本进行工作了,这样vim的功能就是被无穷的放大了,这需要我们的努力去发现。
另外由于我的水平有限,加之行文匆忙,文中很可能错误不断,希望大家不要见怪,多批评指正。
二、VI/VIM基础知识
很多人应该都知道VI是个有模式的编辑器:编辑模式和命令模式,按ESC回到命令模式,用i或者a进入编辑模式,由于区分了模式,导致VI的命令非常简洁,而无模式编辑器比如Emacs,所有的命令都需要加上控制键Ctrl或Alt,所以有个笑话说Emacser们最希望计算机备一个脚踏板,这样就可以用脚踩Ctrl和Alt键了(编辑器圣战——在VI和Emacs之间有很多口水战,自然也引出非常多的幽默),这里罗嗦一句VI vs. Emacs: VI继承了ed的理念,另外也有历史原因,VI追求的是快捷——启动程序迅速,编辑文本高效,功能专注,而Emacs追求的是功能的丰富强大以及集成带来的方便,在Emacs里头可以发邮件,上新闻组,听mp3,浏览网页,玩游戏,几乎可以login->emacs->logout了:-),VI和Emacs都是程序员的编辑器,相比而言,Emacs更是提供了一种程序员的生活氛围。
闲话少说,这篇文档也不是一份VI/VIM教程,所以这一节只会简单的提及VI/VIM的基础知识。VIM引入了更多的模式,在VIM里头:help mode可以看到VIM的所有模式,主要有如下几种:
Normal mode 即通常所谓的命令模式,在此模式使用a、i、A、I、o、O等进入Insert mode
Insert mode 即通常所谓的编辑模式,在此模式使用ESC进入Normal mode或者Ctrl-o临时进入Normal mode。
Command-line mode 命令行模式,在Normal mode下按冒号进入,按ESC取消执行命令或者回车执行命令,然后回到Normal mode。(Visual Studio.Net也添加了命令行脚本功能,幸甚)
Visual mode 即选择模式(注意跟用鼠标选择不同),用v,V,C-v或C-q进入
Select mode 鼠标选择
Replace mode 在Normal mode下按R进入,按ESC返回Normal mode,相当于Windows下命令行中按Insert键进入的覆盖模式
从VI/VIM中退出: 按ESC确认返回到Normal mode,然后
:wq 保存并退出
:q! 不保存并退出
:x 退出,如果文件更改则保存
ZZ 退出,如果文件更改则保存(按住Shift,再按两次z)
VI的命令是非常具有美感的,下面是几个例子:
i 在光标前插入 I 在行首插入
a 在光标后插入 A 在行末插入
o 在下一行插入 O 在上一行插入
x 删除当前字符 X 删除前一个字符
类似的还有b,B,ge,gE,w,W,e,E,f,F,t,T,这些命令都可以用:help cmdname查到帮助。
dd 删除一行 yy 拷贝一行
h j k l 左下上右移动光标
Ctrl-w h,Ctrl-w j,Ctrl-w k,Ctrl-w l 切换到左下上右窗口
类似ed,VI/VIM的命令大多都可以带一个数字前缀或者一个数字范围,比如:
5dd 从当前行开始删除5行
5yy 从当前行开始拷贝5行
1,3d 删除1至3行
1,3y 拷贝1至3行 (.代表当前行,$代表最后一行)
d<motion>,y<motion>,c<motion>,v<motion>分别代表删除/拷贝/修改/选择<motion>
命令指定的范围,比如
int main(void)
{
......;
}
将光标放在{处,然后输入v%就可以把大括号中内容选定,然后按=就可以按照C语言格式缩排(:help =可以看到=命令的描述),%命令的作用是跳到匹配处,比如括号之间,C的宏指令#if #else #endif之间。
int some_ugly_modifier and some_ugly_name (void)
如果光标放在第一个s上,想删除到“(”为止,则输入dt(就可以了,t(的作用是跳到下一个
"("前。
dG可以从当前位置一直删除到文件末尾,因为G的作用是跳到文件最后一行。
VIM的命令可以非常快捷的做到一些复杂的编辑操作,下面是几个示例:
(a)
将“(1), ...., (2), ....,(100)”替换成“(2), ...., (3), ...., (101)”。
在文本中一处处找到并修改是很累的,在VIM下一条命令就可以搞定:
:%s/(\(\d+\))/\="(".(submatch(1)+1).")"/g
命令解释如下:
% 全文(“%”是“1,$”范围的缩写)
s 替换
/ 搜索字符串开始
( 左括号
\) 开始记录匹配
\d+ 一个或多个数字
\) 结束记录匹配
) 右括号
/ 搜索字符串结束
\= 把后面的表达式计算出来作为替换字符串
"(" 左括号
. 字符串连接运算符
(submatch(1) + 1) 把第一个匹配的结果加一作为一个整体返回
.")" 添上右括号
/g 替换字符串结束,g表示替换每一行的所有匹配结果。
(b)
这个问题是笔者曾经碰到的,有一个log系统对于输出行长度有限制,因此在输出很长的log时需要断行,在断行时以单行的“-$-”标记,现在的需求是把这些行连起来,在VIM中也可以很方便的做到(edyfox at newsmth指点):
:%s/\n-\$-\n//g
命令的含义就是把“换行-$-换行”替换成空,另一个办法是:
:g/-\$-/norm ddkJx
命令g/-\$-/的含义就是找到所有的断行标记,然后norm表示在找到的每一个行上执行后面的命令,dd删除这个断行标记,k移动到上一行,J合并当前行和下一行,由于J合并后会留一个空格(只对于英文情况下),所以x来删除这个空格。
(c)在Fortran代码
integer, dimension(:, :), allocatable :: &
short_var, &
A_very_long_name_var, &
other
中,想把每行的&符号定位到固定的一列,比如第78列,手动对齐也是很麻烦的,这个问题可以用VIM的Align插件(http://www.vim.org/scripts/script.php?script_id=294)解决,另外利用宏也可以:
:set ve=all 使得光标可以定位到屏幕任何位置(缺省下VIM的光标只能放在行内的字符上)
gg 到文件第一行
/\s\+&\s*$ 找以&结尾的行,&前至少一个空白字符,后0或多个空白字符
qa 记录宏到寄存器a
D 删除到行尾
78| 定位到第78列
i&<ESC> 插入&并返回到命令模式
n 查找下一个&
q 停止记录宏
10000@a 执行一万遍寄存器a中保存的命令
:set ve="" 恢复ve缺省值
(d)连续插入72个等号
按ESC进入Normal mode,输入72i=再按ESC即可。
(e)在多行开始插入//
移动光标到需要注释掉的第一行开头,然后按Ctrl-v(如果使用了VIM的mswin.vim,则Ctrl-v表示粘贴,这时需要用Ctrl-q代替)进入Visual blockwise模式,这个模式是Visual mode的一种,相当于UltraEdit中的块选择。 然后按j选择上所有需要注释行的行首(看起来效果是选择了第一列),输入I//再按ESC就可以在每一行开头插入//了。
Reference:
http://newsmth.org VIM board
http://edyfox.codecarver.org/html/index.html edyfox的个人主页
这些例子也许初看起来有点吓人,可是在很多时候VIM这些强大的命令能省不少力,VIM不愧是为“编辑”这个功能费尽心思。
浙公网安备 33010602011771号