vim与gvim技巧6.docx
《vim与gvim技巧6.docx》由会员分享,可在线阅读,更多相关《vim与gvim技巧6.docx(18页珍藏版)》请在冰豆网上搜索。
![vim与gvim技巧6.docx](https://file1.bdocx.com/fileroot1/2023-2/11/2087360f-b520-4bcc-8634-beb91f8c5ee9/2087360f-b520-4bcc-8634-beb91f8c5ee91.gif)
vim与gvim技巧6
vim与gvim技巧]vim&gvim技巧大全(6)
yy复制游标所在行整行。
或大写一个Y。
2yy或y2y复制两行。
ㄟ,请举一反三好不好!
:
-)
y^复制至行首,或y0。
不含游标所在处字元。
y$复制至行尾。
含游标所在处字元。
yw复制一个word。
y2w复制两个字。
yG复制至档尾。
y1G复制至档首。
p小写p代表贴至游标后(下)。
P大写P代表贴至游标前(上)。
整行的复制,按p或P时是插入式的贴在下(上)一行。
非整行的复制则是贴在游标所在处之后(前)。
"ayy将本行文字复制到a缓冲区
a可为26个英文字母中的一个,如果是小写的话,原先的
内容会被清掉,如果是大写的话是append的作用,会把内
容附加到原先内容之后。
"是Enter键隔壁的那一个同上符号(dittomarks)。
"ap将a缓冲区的内容贴上。
缓冲区的术语在vim称为registers,vim扩充了相当多的
功能,有兴趣深入的朋友请:
hregisters。
您用d、c、s、
x、y等指令改变或删除的内容都是放在registers中的。
例如:
您用dd删除的一行,也是可以使用p来贴上的。
只
要是在缓冲区的内容都可以使用p来贴上,不是一定要y起
来的内容才能用p。
因此您认为p是paste也可以,认为是
put可能较正确。
5"ayy复制五行内容至a缓冲区。
5"Ayy再复制五行附在a内容之后,现在a中有十行内容了!
ㄟ!
不要我一直用a您就认为只有a可以用喔。
26个英文
字母都可以的,交叉运用下,您会发觉vi(m)肚量不小。
问题来了!
忘记谁是谁的时候怎么办?
:
reg(冒号命令)就
会列出所有registers的代号及内容。
您现在就试著按看看
咦!
怎么还有数目字、特殊符号的缓冲区,原来您刚刚删除
(复制)的内容就预设放在"这个缓冲区,然后依序是
0,1,2,...9。
也就是说您按p不加什么的话,是取出"缓
冲区的内容的。
%指的是目前编辑的档案,#指的是前一次
编辑的档案。
还有其它的呀!
因为没什么重要,就请
:
hregisters吧!
registers有个"s"结尾,不要搞错了,
而且Tab的补全键vim也支援的,也就是说您键入:
hregi
再按Tab键,vim就会帮您补全,按了Tab后发现不是您要
的,那就继续按,总会出现您要的。
:
-)
Tab补全的功能,elvis也有,但叫出registers列表的命令
则没有,您得自行记忆在您的脑袋瓜子里。
而且elvis的补全
能力并没vim强。
天大的指令
.这是什么?
ㄚ,是英文句点啦!
没错,就是英文句点。
什么意思?
重复前次的编辑动作。
这个指令太高明了,只要是编辑动作(移动游标不算,冒号命令也不算)都可以按英文句点来重复,要重复几次都可以。
例如:
您按了yy,然后按p就会复制、贴上一整行,如果要重复这个动作的话,就可以按.,也可以把游标移到其它地方后再按。
其它dd,dw,r,cw等编辑指令都可以这样来重复。
如果您要重复做某些编辑动作时,千万千万一定要想到有这么一个英文句点重复指令。
ㄚ,拜托啦!
您一定要常用这个指令。
疑难杂症
那mouse中键的剪贴功能还有吗?
当然还有,不管在console或Xterminal中都照用不误。
当然在windows下的话就不能用了,可以用Shift-Insert来代替。
Ctrl-v在vim中另有作用,在windows下就不必去麻烦它了。
ㄟ,我从netscape用mousecopy东东过来的时候,常常都搞得天下大乱耶!
要设成:
setpaste,预设是map至F9键的,您要copy之前先按一下F9,copy完后再按一次F9来回复。
这是vim的扩充功能,elvis没有。
那在elvis怎么办?
只好:
setnoai了。
在GUI的版本应不会有这种情形。
set的功能先不必去理它,往后会有一个单元专门讨论。
朋友!
您睡著了吗?
不要被吓到了,您只要开个档案,亲自操作一下就能心领神会。
那用mouse不是更方便吗?
不见得,yyp来复制贴上一整行比较快,还是用mouse来拉比较快?
您可以试看看。
寻找/替换
搜寻、替换的功能几乎是每个编辑器必备的功能,那在vi(m)中有没有特殊的地方呢?
当然有,您忘了,vi(m)是个性十足的编辑器。
最特殊的地方是和规则表示式(regularexpression,简称regexp)结合在一起。
简单的说她是一种pattern的表示法,在执行动作,如寻找或替换,就会依据这个pattern去找,所有符合pattern的地方就会执行您所下的动作。
在这个单元里不讨论regexp,会另立一个单元来探讨,以免搞得头昏脑胀。
目前就暂不使用regexp,您要找什么就直接键入什么就对了。
寻找
/在c-mode的情形下,按/就会在左下角出现一个/,然后键入您要寻找的字串,按个Enter就会开始找。
?
和/相同,只是/是向前(下)找,?
则是向后(上)找。
n继续寻找。
N继续寻找(反向)。
更方便的寻找操作(vim才有)
*寻找游标所在处之word(要完全符合)。
#同上,但*是向前(下)找,#则是向后(上)找。
g*同*,但部份符合即可。
g#同#,但部份符合即可。
n,N之继续寻找键仍适用。
替换(substitute)
:
[range]s/pattern/string/[c,e,g,i]
range指的是范围,1,7指从第一行至第七行,1,$指从第一行至最后一行,也就是整篇文章,也可以%代表。
还记得吗?
%是目前编辑的文章,#是前一次编辑的文章。
pattern就是要被替换掉的字串,可以用regexp来表示。
string将pattern由string所取代。
cconfirm,每次替换前会询问。
e不显示error。
gglobe,不询问,整行替换。
iignore不分大小写。
g大概都是要加的,否则只会替换每一行的第一个符合字串。
可以合起来用,如cgi,表示不分大小写,整行替换,替换前
要询问是否替换。
[实例]:
%s/Edwin/Edward/g
这样整编文章的Edwin就会替换成Edward。
更进阶的寻找、替换的例子在说明regexp的时候还会再详述。
目前只知道最基本的用法就可以了!
其实光这样就非常好用了。
:
-)
书签功能
这又是vi(m)的一个秘密武器,简单的说,您可以在文章中的某处做个记号(marks),然后跑到其它地方去编辑,在呼叫这个mark时又会回到原处。
妙吧!
mxx代表26个小写英文字母,这样游标所在处就会被mark。
`x回到书签原设定位置。
`是backwardquote,就是Tab键上面那一个。
'x回到书签设定行行首。
'是forwardquote,是Enter键隔壁那一个。
vim对于书签的扩充功能
小写字母只作用于单一档案内。
大写字母可作用于编辑中之各档案间。
数目字可作用于前次编辑的十个档案。
数目字的用法比较特殊,'0是回到前一次编辑档案中离开
前的最后位置,'1则是回到前二次编辑档案的最后位置,
依此类推。
您不必使用m来标示,vim会自动记忆。
很玄吧!
其实这是viminfo的功能,您要认真追究的话,
请:
hviminfo-file-marks。
viminfo关掉,就没这个功能了!
所谓前次指的是前次启动的vim。
:
marks得知目前所有书签的列表。
叫档、存档、紧急回复
ㄟ,是不是在灌水呀!
怎么开个档也成一个单元?
那您就错了,在vi(m)里叫档的花样可多了,而且又可以多档编辑,各编辑中的档案还可以互通讯息,这里面学问可大著呢!
vim就更骚包了,也学人家档案可以加密,虽说是噱头,但也还满好用的。
vim+档名
这样开档后,游标会落在档案最后一行的行尾,在档案屁屁后干什么呢?
方便您可以继续编辑嘛!
vim+n档名
游标会落在第n行的行首。
vim+/string档名
还记得吗?
/就是寻找指令,这样进入档案后游标就会落在第一个找到的string上,还可以按n继续找string喔!
哦,string还可以使用regexp来表示喔。
多档编辑
多档编辑会有两种情形,一种是在进入vim前所用的参数就是多个档(这种情形称为argumentlist)。
另一种情形是进入vim后另外再开其它的档(称为bufferlist)。
不过都可以统称为buffer。
:
n编辑下一个档案。
:
2n编辑下二个档案。
:
N编辑前一个档案。
注意,这种用法只能用于argumentlist的情形。
:
e档名这是在进入vim后,在不离开vim的情形下再开其它档案。
只要您要编辑的档案是在目前目录,Tab补全键还是可以使用。
:
e#或Ctrl-^编辑前一个档案,用于两档互相编辑时相当好用。
这种用法不管是argumentlist或bufferlist档案间皆可使用。
还记得吗?
#代表的是前一次编辑的档案。
:
files或:
buffers或:
ls会列出目前buffer中的所有档案。
在elvis中可使用:
b来叫出buffers。
在buffers中,减号-表示这个buffer并未载入,不过,
不必担心,载入相当快速的。
加号+表示这个buffer
已经修改过了。
:
bnbuffernext。
:
blbufferlast。
以上两个指令elvis不适用。
:
b档名或编号移至该档。
在:
ls中就会出示各档案的编号,这个编号在未离开vim前是不会变的。
这个指令elvis也是可以使用。
当然:
e#编号也是可以的,这样的用法则是所有viclone都通用了。
如果您是使用vim的GUI,那就在功能表上就会有Buffers这个选项,
可以很容易的知道及移动各buffer间。
:
bd(elete)
buffer在未离开vim前是不会移除的,可使用这个指令移除。
其实移除她干什么呢?
vim是您在叫用时才会载入的,因此这些buffers并不是像cache一般要占记忆体的。
:
e!
档名
这样也是会开档,但会放弃目前编辑档案的改变,否则如果档案已有变动,vim预设是不让您随便离开的。
:
e!
后不接什么的话,代表舍弃一切修改,重新载入编辑中档案。
:
f或Ctrl-g
显示目前编辑的档名、是否经过修改及目前游标所在之位置。
:
f档名
改变编辑中的档名。
(file)
:
r档名
在游标所在处插入一个档案内容。
(read)
:
35r档名
将档案插入至35行之后。
gf
这是vim的特殊叫档法,会叫出游标所在处的word为名的档案,当然,这个档案要在目前目录内,否则会开新档案。
哦!
好像有点给他复杂,主要原因是偶文笔不好啦!
不过您何不选个顺手的来用就可以了,选定了,以后就是使用他,这样就不会那么复杂了。
:
-)
离开
:
q如本文有修改而没存档,会警告,且无法离开。
(quit)
:
q!
舍弃所有修改,强迫离开。
:
wq存档后离开。
纵使档案未曾修改也是会再存一次档。
:
x也是存档后离开,但如果档案没有修改,则不会做存档的动作。
ZZ和:
x完全一样,随您高兴用哪一个。
:
w档名另存他档。
不加档名就是写入原档。
(write)
:
q及:
q!
是对目前编辑中的档案作用,如果多档编辑的情形
并不会离开vim,这时可下:
qa或:
qa!
来整个离开vim。
a就是all的意思。
vim的加密功能
vim-x[档名]
这样进入vim后会要求输入密码。
以后加密过的档案由vim开启时会自动要求输入密码。
否则无法开启。
其它的编辑器当然是无法开启的。
进入vim编辑档案中,临时想加密,可用:
X指令。
小心!
vim一开档就会有个.档名.swp这个档,是为了紧急回复用的,
一般是在您所开档案的所在目录,这是个隐藏档,ls要有-a参数才看得到,
您加密的功能并没有作用在这个swp档,因此root还是知道您在
写些什么关于他的坏话的。
:
-)当然啦!
山不转,路转,路不转,人转,
您也是可以把swap的功能关掉的:
setnoswf就行了!
但如果您编辑的是
大档案,则不建议您把swap关掉,这样会很吃记忆体的。
elvis的话,其暂存档是统一集中存放在/var/tmp/*.ses,
权限是档案所有者始能读写。
vim的早期版本,其*.swp
档是依原档案的权限来设定的,最近的版本则从善如流,
已经改成档案所有人始能读写,就是-rw-------啦!
紧急回复
vim-r档名,或进入vim后,下:
recover档名,来回复。
大家来学VIM(三)
各种标示方法及视窗操作
这个单元多了一种模式,那便是visualmode(以下简称v-mode)v-mode下的反白区(反黑区?
^_^)在本文就统一称为标示区,不知各位是否有更好的中文名称?
ㄟㄟㄟ,视窗操作和标示有什么关系?
为什么摆在这里说明?
ㄚ,是因为这两个单元内容都不多,没地方摆,所以就将凑在一起的啦!
乱点鸳鸯谱就请各位见谅。
标示指令
v小写v这是属于字元标示(charactervisual),按下v后您就可以移动游标,游标走过的地方就会标示起来。
再按一次v就会结束v-mode。
您用mouse拉出的标示区也是属于这类的标示。
V大写V这是行标示(linevisual),按下V后会整行标示起来(包括空白的部分),您移动上下键,会标示多行。
mouse连按三次左钮,也是属于此类的标示。
再按一次V就会结束v-mode。
mouse按两次左钮是标示一个word。
Ctrl-v这是方块标示(blockvisual),可纵向标示矩形区域。
再按一次Ctrl-v就会结束v-mode。
结束v-mode的方式亦可使用Esc键,或一使用Ctrl-c。
windows系统下Ctrl-v是复制键,可以使用Ctrl-Q来替代。
d删除标示区内容。
y复制标示区内容。
ㄟ…是要先标示好才按的。
"ay还能不能用呢?
当然可以,
这样就会把标示区内容存于a缓冲区中。
可以用"ap来贴上。
Shift->标示区内容向右移一个Tab。
Shift-
可设成dark或light,这是两种不同的highlight颜色设定,详见$VIMRUNTIME/syntax/synload.vim。
不过您要更动颜色的设定,最好是设在~/.vimrc或~/.gvimrc中,原始档最好不要去动她。
ㄟㄟㄟ,你从没提过$VIMRUNTIME好不好!
其实这是最近版本的vim
为了不至安装新版本时把旧版本的一些设定或macro档干掉,
所以$VIMRUNTIME就是$VIM/vimxx,xx就是版本号码啦!
例如您使用的是vim5.6版,那么就是$VIM/vim56。
backup(bk)
是否要backupfile。
预设不打开。
writebackup(wb)
在写入档案前先备份一份,和backup的作用不尽相同,请:
hbackup-table。
预设是打开的,所以您如果不要backup,那要关掉的是这个项目,而不是backup。
但请先检查一下您编译时是不是有编译进去,请:
ver。
backupdir(bdir)
设定存放backupfile的目录。
预设在所编辑的档案之所在目录。
binary(bin)
设在编辑二进位档状态,这是防止存二进位档时把EOL也写进二进位档,那就会悔不当初,如果是图档将会无法再观看,如果是可执行档就无法执行了!
因此预设是off。
elvis会自动判断是否为二进位档,而且会分成左右两半,左半部会以16进位的方式显示,
右半部则是以ASCII的方式来显示。
browsedir(bsdir)
浏览档案的目录,GUI版本始有。
预设是上一次浏览的目录。
就是GUI版本功能表上的[File]->[Open]会打开的目录。
cindent(cin)
写C时很好用,indent比一般敏感,专为C程序码而设。
预设off。
编辑C/C++code时会自动打开。
cmdheight(ch)
状态列的行数,预设一行,建议设成两行。
compatible(cp)
设为和原始vi相容的状态,vim的扩充功能会被抑制。
预设off。
confirm(cf)
各种确认动作。
预设off。
directory(dir)swap档存放的目录。
前面单元已有说明。
fileformat(ff)
这是写入档案时置放EOL(endofline)的形式
dos是以0D0A来断行。
unix是以0A来断行。
mac是以0D来断行。
预设以各系统平台而定,在Linux当然是unix形式。
fileformats(ffs)
可指定多个,会依载入的档案形式来调整ff。
例如:
setffs=unix,dosff=unix则预设为unix格式,但如读入的是dos格式的档案,会自动调整为dos格式,这样存档时就会以dos格式存档(状态列会显示)。
此时如要改成unix格式,可setff=unix然后存档就会转成unix格式,反之亦然。
注:
如果不这样设,也就是您不管ff或ffs都设成unix,那读入dos格式的档案时在每行尾会出现^M这个字元(就是0D啦!
)这时纵使:
setff=unix也来不及了!
只好:
%s/^M//g来消去这个^M。
ㄟ,还记得怎么替换吗?
就是把^M换成没有啦!
而且^M怎么打出来的还记得吧!
翻一翻前面的单元吧!
Hey,你怎么知道是0D呀!
好吧!
告诉您一个密秘,您把游标移到^M那个位置,然后按ga在状态列就会显示10,16,8进位的值。
其它的字元也是可以如此显示。
a就是ascii的意思。
但这是vim的扩充功能,elvis没有。
elvis纵使载入dos格式的档案,也是会自动把^M隐藏起来。
ignorecase(ic)
寻找时不分大小写,这对中文会造成困扰。
预设off。
incsearch(is)
加强式寻找功能,在键入patern时会立即反应移动至目前键入之patern上。
预设off。
hlsearch(hls)
寻找时,符合字串会反白表示。
预设off。
如果您是使用vim的预设的vimrc档的话,会设在F8键来切换。
textwidth(tw)
是一种wordwrap的功能,从左起算之固定每行的最大字元宽度。
超过此宽度就会自动折行,这可是真的折行,也就是说在折行处会插入EOL。
预设是0,也就是没有wordwrap的功能。
wrapmargin(wm)
和textwidth作用相同,只是是从右视窗边向左算起要几个字元起折行。
预设是0。
textwidth与wrapmargin的功能目前并不适用于中文,打中文还是您自行按Enter吧!
wrap
这也是折行功能,可是只是萤幕效果的折行,实际上并没有插入EOL。
wrapscan(ws)这和折行没有关系,是指寻找时,找至档尾时,是否要从档首继续找。
预设是要。
paste
这是防止在做剪贴时位置会不正确,前面单元已有说明。
ruler(ru)
会在状态列显示游标所在处之行列状态,预设不打开,但建议打开。
最右边之代号的意义如下:
Top档案第一行在萤幕可见范围。
Bot档案最后一行在萤幕可见范围。
All档案首尾皆在一个萤幕范围内。
如非以上三种情形,则会显示相对百分比位置。
statusline(stl)
状态列显示的格式,使用预设就可以了,如果您想骚包一下的话,那就请您:
hstl。
shiftwidth(sw)
指由>>移动整行内容时,一次移动的字元宽度,一般是使用Tab的值,但可由这个设定来改变。
tabstop(ts)
一个Tab键宽度。
预设是8个字元宽度。
最好不要随便改,以免您写的东西由其它编辑器来阅读时造成困扰,为解决这个问题,vim有一种softtabstop的机制,在下一节会详细说明。
showcmd(sc)
在状态列显示目前所执行的指令。
showmode(smd)
在状态列显示目前的模式,例如是Insertmode或是Visualmode。
当然平常的normalmode(commondmode)是不显示的。
viusalbell(vb)