vim快捷键高级用法

文本编辑器是所有计算机系统中最常用的一种工具。UNIX下的编辑器有ex,sed和vi等,其中,使用最为广泛的是vi,而vi命令繁多,论坛里好像这方面的总结不多,以下稍做总结,以资共享!渴望更正和补充!  
vim的插入模式的快捷键
       ctrl+n  ——联想补齐一个单词(这个单词在本文件中已经出现过)
       ctrl+x+l  ——行补齐,输入行首字母可以补齐一行
       ctrl+x+k  ——字典功能,输入单词的前几个字母,显示字典里的相关单词
字典需要的.vimrc配置内容:
set dictionary+=~/.vim/dict/simple
set dictionary -=/usr/share/dict/words dictionary +=/usr/share/dict/word
后两个功能的实现需要一些插件。还有象taglist (象目录一下的显示在一旁)、snipmate(用简单的几个字母显示一个小的片段,比如输入fun按下tab后就显示处函数的结构)
怎样得到插件?
git clonegit://github.com/happypeter/peter-vim.git 得到所需的插件
然后把peter-vim改名为.vim(隐藏文件)并移动到自己的HOME即/home/shsf/下

跳转到函数、变量定义处:
[+ctrl+i 跳转到函数、变量和#define
[+ctrl+d 跳转到#define处
ctrl+i 向前跳到前几次光标位置
ctrl+o 向后跳到后几次光标位置

函数体跳转:
[[
]]
[]
][
{}

2009-07-07 17:31 补充

如何选中括号中的内容 进行:
将光标移至括号内,按shift+v进入行选模式,然后

i{ - 选小括号中内容,不包括小括号
a{ - 选小括号中内容,包括小括号
ib - 选中括号中内容,不包括括号
ab - 选中括号中内容,包括括号
i{ - 选大括号中内容,不包括大括号
a{ - 选大括号中内容,包括大括号

:h text-objects

下面还有些相关的tips,未全部验证:
vi{ 选中{}中间的内容,不包括{}
va{ 选中{}中间内容,包括{}
vi( 选中()中间内容
vi< 选中<>中间内容
vi[ 选中[]中间内容
vit 选中中间的内容
vi” 选中”"中间内容
vi’ 选中”中间的内容
vis 选中一个句子
vib 选中一个block
viw选中一个单词
vip 选中一个段落

 

进入vi的命令
vi filename :打开或新建文件,并将光标置于第一行首
vi +n filename :打开文件,并将光标置于第n行首
vi + filename :打开文件,并将光标置于最后一行首
vi +/pattern filename:打开文件,并将光标置于第一个与pattern匹配的串处
vi -r filename :在上次正用vi编辑时发生系统崩溃,恢复filename
vi filename….filename :打开多个文件,依次进行编辑

移动光标类命令
h :光标左移一个字符
l :光标右移一个字符
space:光标右移一个字符
Backspace:光标左移一个字符
k或Ctrl+p:光标上移一行
j或Ctrl+n :光标下移一行
Enter :光标下移一行
w或W :光标右移一个字至字首
b或B :光标左移一个字至字首
e或E :光标右移一个字至字尾
) :光标移至句尾
( :光标移至句首
}:光标移至段落开头
{:光标移至段落结尾
nG:光标移至第n行首
n+:光标下移n行
n-:光标上移n行
n$:光标移至第n行尾
H :光标移至屏幕顶行
M :光标移至屏幕中间行
L :光标移至屏幕最后行
0:(注意是数字零)光标移至当前行首
$:光标移至当前行尾

屏幕翻滚类命令
Ctrl+u:向文件首翻半屏
Ctrl+d:向文件尾翻半屏
Ctrl+f:向文件尾翻一屏
Ctrl+b;向文件首翻一屏
nz:将第n行滚至屏幕顶部,不指定n时将当前行滚至屏幕顶部。

插入文本类命令
i :在光标前
I :在当前行首
a:光标后
A:在当前行尾
o:在当前行之下新开一行
O:在当前行之上新开一行
r:替换当前字符
R:替换当前字符及其后的字符,直至按ESC键
s:从当前光标位置处开始,以输入的文本替代指定数目的字符
S:删除指定数目的行,并以所输入文本代替之
ncw或nCW:修改指定数目的字
nCC:修改指定数目的行

删除命令
ndw或ndW:删除光标处开始及其后的n-1个字
do:删至行首
d$:删至行尾
ndd:删除当前行及其后n-1行
x或X:删除一个字符,x删除光标后的,而X删除光标前的
Ctrl+u:删除输入方式下所输入的文本

搜索及替换命令
/pattern:从光标开始处向文件尾搜索pattern
?pattern:从光标开始处向文件首搜索pattern
n:在同一方向重复上一次搜索命令
N:在反方向上重复上一次搜索命令
:s/p1/p2/g:将当前行中所有p1均用p2替代
:n1,n2s/p1/p2/g:将第n1至n2行中所有p1均用p2替代
:g/p1/s//p2/g:将文件中所有p1均用p2替换

选项设置
all:列出所有选项设置情况
term:设置终端类型
ignorance:在搜索中忽略大小写
list:显示制表位(Ctrl+I)和行尾标志($)
number:显示行号
report:显示由面向行的命令修改过的数目
terse:显示简短的警告信息
warn:在转到别的文件时若没保存当前文件则显示NO write信息
nomagic:允许在搜索模式中,使用前面不带“/”的特殊字符
nowrapscan:禁止vi在搜索到达文件两端时,又从另一端开始
mesg:允许vi显示其他用户用write写到自己终端上的信息

最后行方式命令
:n1,n2 co n3:将n1行到n2行之间的内容拷贝到第n3行下
:n1,n2 m n3:将n1行到n2行之间的内容移至到第n3行下
:n1,n2 d :将n1行到n2行之间的内容删除
:w :保存当前文件
:e filename:打开文件filename进行编辑
:x:保存当前文件并退出
:q:退出vi
:q!:不保存文件并退出vi
:!command:执行shell命令command
:n1,n2 w!command:将文件中n1行至n2行的内容作为command的输入并执行之,若不指定n1,n2,则表示将整个文件内容作为command的输入
:r!command:将命令command的输出结果放到当前行

寄存器操作
“?nyy:将当前行及其下n行的内容保存到寄存器?中,其中?为一个字母,n为一个数字
“?nyw:将当前行及其下n个字保存到寄存器?中,其中?为一个字母,n为一个数字
“?nyl:将当前行及其下n个字符保存到寄存器?中,其中?为一个字母,n为一个数字
“?p:取出寄存器?中的内容并将其放到光标位置处。这里?可以是一个字母,也可以是一个数字
ndd:将当前行及其下共n行文本删除,并将所删内容放到1号删除寄存器中。

 vim自动对齐

只要在 /etc/vimrc中加上这两句就行了
set autoindent
set smartindent
--------------------------------------------------------


详细:

在终端下使用vim进行编辑时,默认情况下,编辑的界面上是没有显示行号、语法高亮度显示、智能缩进

等功能的。为了更好的在vim下进行工作,需要手动设置一个配置文件:.vimrc。
在启动vim时,当前用户根目录下的.vimrc文件会被自动读取,该文件可以包含一些设置甚至脚本,

所以,一般情况下把.vimrc文件创建在当前用户的根目录下比较方便,即创建的命令为:
$vi ~/.vimrc
设置完后
$:x 或者 $wq 
进行保存退出即可。
下面给出一个例子,其中列出了经常用到的设置,详细的设置信息请参照参考资料:
“双引号开始的行为注释行,下同
“去掉讨厌的有关vi一致性模式,避免以前版本的一些bug和局限
set nocompatible
“显示行号
set number
“检测文件的类型
filetype on 
“记录历史的行数
set history=1000 
“背景使用黑色
set background=dark 
“语法高亮度显示
syntax on 
“下面两行在进行编写代码时,在格式对起上很有用;
“第一行,vim使用自动对起,也就是把当前行的对起格式应用到下一行;
“第二行,依据上面的对起格式,智能的选择对起方式,对于类似C语言编
“写上很有用
set autoindent
set smartindent
“第一行设置tab键为4个空格,第二行设置当行之间交错时使用4个空格
set tabstop=4
set shiftwidth=4
“设置匹配模式,类似当输入一个左括号时会匹配相应的那个右括号
set showmatch
“去除vim的GUI版本中的toolbar
set guioptions=T
“当vim进行编辑时,如果命令错误,会发出一个响声,该设置去掉响声
set vb t_vb=
“在编辑过程中,在右下角显示光标位置的状态行
set ruler
“默认情况下,寻找匹配是高亮度显示的,该设置关闭高亮显示
set nohls
“查询时非常方便,如要查找book单词,当输入到/b时,会自动找到第一
“个b开头的单词,当输入到/bo时,会自动找到第一个bo开头的单词,依
“次类推,进行查找时,使用此设置会快速找到答案,当你找要匹配的单词
“时,别忘记回车
set incsearch
“修改一个文件后,自动进行备份,备份的文件名为原文件名加“~“后缀
if has(“vms”) //注意双引号要用半角的引号" "
set nobackup
else
set backup
endif

如果去除注释后,一个完整的.vimrc配置信息如下所示:
set nocompatible
set number
filetype on 
set history=1000 
set background=dark 
syntax on 
set autoindent
set smartindent
set tabstop=4
set shiftwidth=4
set showmatch
set guioptions-=T
set vb t_vb=
set ruler
set nohls
set incsearch
if has("vms")
set nobackup
else
set backup
endif

如何取消vim中的自动对齐

 3.0 - 怎样查找和替换? 
                          有很多方法.  最简单的是: 
                          :s/old/new/g, 但是,这仅对当前行起作用..., 所以,我们用 
                          :%s/old/new/g, 更一般的,我们还可以用 
                          :[范围]s/old/new/[cg],这里,[范围]是任意的行范围,包括行号,$(文件末尾),.(当前行), 
                        %(当前文件),或者两个行号之间加个破折号(或者可以这样: .,+5,这表示下面5行).[cgi]是 
                        c,g,i中间的一个或者什么也没有.c告诉vi每次替换的时候要给提示,g是说对所有一行中出现 
                        的地方都做替换.i则是指在查找时不区分大小写.如果最后一个斜杠(/)后面没有东西的话,那 
                        么vi只替换在行中第一次匹配的地方. 
                          我比较喜欢这样做: 
                          :g/foobar/s/bar/baz/g, 这个命令首先搜寻foobar,然后把它变成foobaz. 它没有改变 
                        jailbars, 而其他的一些命令可能会改变jailbars. 这是我的方法,但是可能比较难记. 
                          当然,你还可以在查找的的时候使用正规式,以及在替换文本的时候使用其他一些命令.如果 
                        你在正规式里用\(和\)来剥离一个序列的话,你会发现你可以做很多好玩的事情. 
                          例如: 
                          :g/\(foo\)\(bar\)/s/\2/\1baz/g 将foobar替换成foobaz 
                          还有一些特殊的序列: 
                          &amp;             所有查找时匹配到的东西 
                          \[1-9]        1到9号用\(和\)括起来的东西 
                          \u            下一个字符将被变成大写. 
                          \U            以后的字符都变成大写,直到遇到\e或\E 
                          \l            下一个字符将被变成小写. 
                          \L            以后的字符都变成大写,直到遇到\e或\E 
                          \[Ee]         更改大小写的选择区域的终点 
  
                        3.1 - 我怎样在vi中运行一个程序? 
                          :!命令 可以在vi中运行程序. :sh会启动一个交互式的外壳(SHELL).在这个外壳 
                        里面, 如果你愿意,你还可以再次运行vi. 当你在编辑Makefiles和配置文件来编译 
                        某个程序的时候,这可能比较有用. 这比:e优越之处在于它无须保存文件,而且如果 
                        你退出外壳的时候,vi还回到原来的地方.(当然,我还是建议你先保存一下文件) 
  
                        3.2 - 啊! 我正在写我的论文, 系统崩溃了! 怎么办? 
                          不要怕! 你会收到一封电子邮件,里面就是你的论文.敲入vi -r <文件名>; 
                        (这个文件名就是系统崩溃时你正在编辑的文件)你就可以恢复出你的论文来.只敲 
                        vi -r将把所有可能恢复的文件都列出来. 
  
                        3.3 - 有没有使vi对程序员更友好的窍门? 
                          :set ai可以让vi自动对齐. 
                          :set sw=#,#是移动的宽度(shiftwidth),或者说TAB键的宽度(tabwidth);你可以 
                        用<<或者>;>;命令来左移或右移某一行. 还有, 你可以使用 <%或>;%来将{,(或[等符号 
                        括起来的文本都左移或右移;这时候,你必须把光标放在这些符号({,(或[)上面. 
                          :set sm会在你敲},]或)显示出对应匹配的{,[或(来. 
                          :set lisp会对lisp编程有些帮助. ()被移到s表达式(s-expressions)外面,如果 
                        原子(atoms)没有停止则{}将被移走. 
  
                        3.4 - 宏 -- 我怎样写宏? 
                          :map <lhs>; <rhs>;, 其中<lhs>;最多10个字符,<rhs>;最多100个字符. 以后,如果 
                        你敲了<lhs>;,vi就会用<rhs>;来取代它.所有的宏都是在命令模式下开始的,但是可以 
                        在你想在的模式下终止. 记住,在你想用的控制字符前面加上^V. 
                          :unmap <lhs>;将删除这个宏. :map!<lhs>; <rhs>; 使得<lhs>;将<rhs>;插入到文档 
                        中去. 
  
                        3.5 - 我怎样将一个功能键定义成一个宏? 
                          如果<lhs>;是#n,n是0-9之间的一个数,那么这个宏就映射成某一个功能键了.(你 
                        可以试一下F1-F10之间的键--译者) 
  
                        3.6 - 有没有办法缩写文本? 
                          当然了. 这可是vi呀,它能做任何事情! 
                          :ab email ellidz@midway.uchicago.edu 可以在你敲完email后,把那个没有缩写 
                        的文本插入到文件中. :una email取消缩写. 
  
                        3.7 - 我怎样在当前文档中做拼写检查? 
                          这儿有一个宏可以做到这一点. 这些应该放在你的.exrc文件中(后面我们将对.exrc 
                        进一步讨论). 它是一个相当简单的宏. 它仅仅是调用ispell来处理当前文件.当然,你 
                        的系统里面一定得有ispell这个程序. 使用它的时候,只需要敲个V键就行了(因为vi并 
                        没有用V,所以V是一个比较合适的键) 
  
                          map V :w^M:!ispell % ^M:e!^M^M 
  
                          第二个^M使你在拼写检查完之后无须敲回车就可以到vi中. 
                          (译注, 在我的系统里,没有ispell,只有spell,我用它替换了ispell,工作的不错;还有, 
                        ^M不是两个字符,而是一个字符,通过^V^M敲进去的;另外,我个人认为第二个^M还是不要 
                        的好,因为直接回到vi后你就无法看到拼写检查的结果了) 
  
                        3.8 - 我手头有一个硬拷贝的终端, 我还能用vi吗? 
                          好了,好了. 我并认为有人会真的问这个问题.这个问题太偏了,我们大可不必理 
                        它.(而且,它回答了一个非常普通的问题) 
                          vi启动的时候处于一种特殊的模式下面,叫做"开放模式"; 在这种状态下,事情或多或少 
                        的有些不同. 删除的字符在你面前显示成一些\',vi会认为你的终端窗口只有一行. ^r 
                        可以把当前行重新输出. z则把当前行周围的窗口重画一遍. 
  
                        3.9 - 好了,是不是处在开放模式下的原因呀?! 但是我现在没有用硬拷贝终端,它还是在开放 
                              模式呀? 
                          这儿的问题就是vi没有认出你用的终端的类型. 于是它假定你有的是个最烂的终端, 
                        所以它决定依然处在开放模式下.这似乎没什么用处.因为没有多少人喜欢开放模式,但是开放 
                        模式还是需要知道你的终端的一些最起码的信息的. 
                          现在,我们来看如何解决这个问题.我们有可能把它分成几种特殊的情形,但是,一般情况下, 
                        这并没有用处. 如果你直到你的终端的类型, 你可以在UNIX提示符下面设置终端类型(在CSH 
                        及其变种下面,使用命令setenv TERM <终端类型>;;在SH及其变种下面,使用命令TERM=<终端类型>;; 
                        export TERM) 
                          最好你能把上面的命令写在.profile文件或者.cshrc文件里面,这样你一登录它就自动地给 
                        你设置好了.(当然,你应该知道如何使用ed,或者你能在UNIX提示符下面设置好终端类型以便能 
                        使用vi, 这样你才有可能去编辑这些文件) 
                          如果你确实不知道你地终端类型,试一试vt100.现在大多数地终端或者终端仿真器都能仿真 
                        vt100. 如果这还不能生效的话,你只好去找个高手来帮你了. 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值