vim与gvim技巧5.docx
《vim与gvim技巧5.docx》由会员分享,可在线阅读,更多相关《vim与gvim技巧5.docx(15页珍藏版)》请在冰豆网上搜索。
vim与gvim技巧5
[vim与gvim技巧]vim&gvim技巧大全(5)
Here'ssomethingverycurious:
:
%s/foo/bar/gc
isofcourseasubstitutioneffectivefortheentirefile
withconfirmoneachoccurrenceof"foo"
withtheoptionofquittingatanypoint.
However,usingsomethingsimilar,
:
g/foo/s//bar/gc
usingtheglobalgtoeffecttheentirefile--
doesNOTallowquittingatanypoint
(evenwiththeuseof).
Iftherearehundredsof"foo"--it'sanimportantfinepoint...
Invitefurthercomments...
ArunEasi,April23,200223:
33
g/foo/s//bar/gc=>runthecommands//bar/gcforeachoftheline
matchingfoo.Itislikerunningmultiple"s//"commands(Hence
youhavetopressqforeachoftheinvocation).The
gin"s///gc"doesnotimplyentirefile,itjustimpliesalloccurence
onaline(orelse,itwouldhavesubstitutedonlythefirst)
dyang@,May30,20029:
04
Hereisonethatdeleteseveryotherline(adjustingdoublespacedfiles):
:
g/.*/normjdd
pagaltzis()gmx_de,August6,200215:
12
Thiscanbedonemuchsimpler:
:
%normjdd
mra@frogne.dk,February10,20034:
49
Anothercoolgfeatureistocountthenumberoflinesmatching/regexp/
letx=0|g/regexp/letx=x+1
echox
Great,ifyouareeditingdatafiles.
Regards
Mike
setanta5@,March27,20032:
14
Reverseallthelinesinafile:
:
g/^/m0
Ihavefoundthatuseful...honest!
PK
kkgahlot@,September3,20035:
06
CanIdosomethinglikethisusing":
g"(oranythingelse)
Ihaveafilewhichcontainsfollowingkindoflines
abc123=1,2,3
bcd123=100,200,300
abcb123=1,3,4
Iwanttoconvertthistofollowing
abc123=1,abc,2,abc,3,abc
bcd123=100,bcd,200,bcd,300,bcd
abcb123=1,abcb,3,abcb,4,abcb
BasicallyIwanttoreplaceeachcommainalinewithfirstfewletters,whicharecomingbefore123,ofthatlinesurroundedby2commas.
Anonymous,September3,200312:
45
Toanswer kkgahlot'squestion:
global//execute"s/\\([=,][^,]*\\)/\\1,".matchstr(getline("."),"^.\\{-}\\(123\\)\\@=")."/g"
Tomakethewholethingalittlemoretransparentsomeexplanations(fromtheinsideout):
Wewanttoexecuteoneachlineacommandlike
s/\([=,][^,]*\)/\1,abc/g
foreachline,butabcgetschangedoneachline.
Thefunction
matchstr(getline("."),"^.\\{-}\\(123\\)\\@=")
returnsthestringthatmatchesthepattern/^.\{-}\(123)\@=/onthecurrentline.Inthegivenexamplesthisisthetextpreceding123=atthebeginningoftheline.Dependingontheactualrequierements,asimplerexpressionlike/^[a-z]*/couldworktoo.
Thecommand
execute"s/\\([=,][^,]*\\)/\\1,".matchstr(getline("."),"^.\\{-}\\(123\\)\\@=")."/g"
assemblesthedesiredsubstitutecommandforthecurrentlinebyjoiningsomestatictextwiththereturnvalueofthematchstrfunctionandthenexecutesit.
Asexecuteworksonlyonthecurrentline,thecommand
global//execute...
appliesittoallline.Ifonlycertainlinesshouldbeproecessedreplace//withsomeotherpattern.
utzb@gmx.de,November21,200310:
39
Revertinglinesinafilecanalsobedonevia
:
%!
tac
insteadoftac,youcanalsousesort,xxd,xxd-r,cut,your-own-filter
Anonymous,March29,20047:
18
toobad:
gdoesnothavea/cparameterforconfirmedexecutionofexcommands.Somethinglikethe/cusedin:
s///cforreplacingonlyconfirmedpatternlocations.
ordoesit?
?
jdimpson@,April14,200410:
06
Ijustwanttoaddthatthe:
gcommandinvi/edisthebasisforthenamefortheUnixgrepcommand,i.e.GlobalRegularExpressionPrint. The"Print"partdescribedthedefaultbehaviourof:
gwhennocommandwasgiven. Obviouslythisbehaviourwasmoreusefulwhenusinged.
bsjawle@,August16,200423:
55
Thankyouforthetip
发信人:
smartiger(天才虎),信区:
Linux
标 题:
解释一下vi的一个高级用法
发信站:
BBS水木清华站(TueJan1412:
14:
542003),转信
:
v/./$s/$/./|'';/./-1j|$d
Replacesmultipleblanklineswithjustoneblankline.
请问如何解释,特别是|和;
--
RedHat 8.0 Slackware 8.0
Mandrake9.0 Debian 2.2r6
Xteam 4.0 RedFlag 3.0
SmarTiger
※来源:
·BBS水木清华站·[FROM:
210.138.200.6]
发信人:
sk8er(TRUESK8ER),信区:
Linux
标 题:
Re:
解释一下vi的一个高级用法
发信站:
BBS水木清华站(TueJan1416:
32:
332003),转信
我试了一下,这个好像不像你所说的那样工作。
:
v/./$把整个文档都选中了,然后用s替换……怎么搞的……看不懂。
还不如用
:
%s/\(\n\s*\)\{2,}/\r\r/g
来删除多余的空行。
【在smartiger(天才虎)的大作中提到:
】
:
Replacesmultipleblanklineswithjustoneblankline.
:
请问如何解释,特别是|和;
--
Peoplewillbuyanythingthat'sonetoacustomer.
※修改:
·sk8er于Jan1416:
33:
55修改本文·[FROM:
166.111.140.66]
※来源:
·BBS水木清华站·[FROM:
166.111.140.66]
发信人:
yeshao(叶少·HP加满了!
),信区:
Linux
标 题:
Re:
解释一下vi的一个高级用法
发信站:
BBS水木清华站(TueJan1416:
34:
072003),转信
:
g/^[[:
blank:
]]*$/d
【在sk8er(TRUESK8ER)的大作中提到:
】
:
我试了一下,这个好像不像你所说的那样工作。
:
还不如用
:
来删除多余的空行。
--
痛苦和骄傲,这一生都要拥有
※来源:
·BBS水木清华站·[FROM:
202.112.55.84]
发信人:
sk8er(TRUESK8ER),信区:
Linux
标 题:
Re:
解释一下vi的一个高级用法
发信站:
BBS水木清华站(TueJan1416:
36:
102003),转信
你把空行全删掉了
他还想为多个留一个空行
【在yeshao(叶少·HP加满了!
)的大作中提到:
】
:
:
g/^[[:
blank:
]]*$/d
--
NewYorknowleadstheworld'sgreatcitiesinthenumberofpeoplearound
whomyoushouldn'tmakeasuddenmove.
--DavidLetterman
※来源:
·BBS水木清华站·[FROM:
166.111.140.66]
发信人:
scaner(沉默),信区:
Linux
标 题:
Re:
解释一下vi的一个高级用法
发信站:
BBS水木清华站(ThuJan2316:
29:
022003),转信
:
v/./$s/$/./|'';/./-1j|$d
|是两个命令风格符号
:
v/./$s/$/enter./
'';/./-1j
$d
?
?
记得大概是这样.
我也看不动.
自己看help把.
大概意思是吧
所有的空行,变成
.
变成
........-->nline->ndot
然后
d掉最后一行
v那个是区域选择命令
具体的我也不清楚了.
【在smartiger(天才虎)的大作中提到:
】
:
Replacesmultipleblanklineswithjustoneblankline.
:
请问如何解释,特别是|和;
--
沉默是痛苦的女儿
※来源:
·BBS水木清华站·[FROM:
166.111.168.15]
发信人:
allanj(木瓜),信区:
Linux
标 题:
Re:
解释一下vi的一个高级用法
发信站:
BBS水木清华站(ThuJan2318:
26:
012003),转信
好像在那里见过
你在最后一行加个. 然后执行下面的命令
:
v/./;/./-1j
那个.就是为了防止原来最后一行为空,
不能再匹配/./了
大意:
/./是非空行
v是g!
的简写,而g!
就是取g的反
所以v/./就是标记出所有空行
然后对标记出的每一行 操作
;连接2个行号
/./-1就是从标记那个行号开始找非空行,
然后(行号-1)
j就是连接2行
所以();()j就是把连续的几个空行join
(如果标记的行不存在,g方式就继续下一个存在的,
所以连接也不会出问题)
原来的:
v/./$s/$/^M./|'';/./-1j|$d
在vim下没试成,设了compatible也没效果.
他是不是也想在最后加个.然后连接,再去掉?
大致这样分
v/./
$s/$/^M./ |
'';/./-1j |
$d
v/./ 对所有的空行执行后面3个命令
$s/$/^M./ 对第$行,执行后面的替换
'';/./-1j 从''行开始,到第一个非空行,执行j命令
$d 删除第$行
【在smartiger(天才虎)的大作中提到:
】
:
Replacesmultipleblanklineswithjustoneblankline.
:
请问如何解释,特别是|和;
--
※修改:
·allanj于Jan2318:
26:
56修改本文·[FROM:
166.111.215.54]
※修改:
·allanj于Jan2318:
27:
26修改本文·[FROM:
166.111.215.54]
※来源:
·BBS水木清华站·[FROM:
166.111.215.54]
发信人:
sk8(destroyingTsinghua),信区:
Linux
标 题:
Re:
解释一下vi的一个高级用法
发信站:
BBS水木清华站(ThuJan2319:
50:
402003),转信
不就是合并空行吗?
何必搞得这么复杂
这不是解决这个问题的好办法
用
:
%s/\(\n\s*\)\{2,}/\r\r/g
不就行了
【在allanj(木瓜)的大作中提到:
】
:
好像在那里见过
:
你在最后一行加个. 然后执行下面的命令
:
:
v/./;/./-1j
:
那个.就是为了防止原来最后一行为空,
:
不能再匹配/./了
:
大意:
:
/./是非空行
:
v是g!
的简写,而g!
就是取g的反
:
所以v/./就是标记出所有空行
:
然后对标记出的每一行 操作
:
;连接2个行号
:
...................
--
※修改:
·sk8于Jan2319:
56:
07修改本文·[FROM:
218.88.205.178]
※来源:
·BBS水木清华站·[FROM:
218.88.205.178]
vim使用技巧
(1)
本文参考了vim官方网站的文档http:
//www.vim.org/tips/index.php。
为了查找方便起见,文中的技巧编号沿用原文档中的编号。
1.使用*键可以向后搜索光标所在位置的单词。
反之,使用#键可以向前搜索光标所在位置的单词。
第一次使用*或者#进行搜索之后,则可以使用N或Shift-N继续进行搜索。
另外,如果设置了hlsearch选项(:
sethlsearch)的话,那么使用*Shift-N则可以标记当前的单词为高亮显示。
2.经常会遇到这样的情况,就是在命令行上输入含有一个长长的路径的命令vi/home/username/linux/src/dir1/dir2/dir3/srcfile.c,编辑结束之后发现需要编辑同一目录下的另一个文件,这时不得不在vi中重新输入长长的路径。
而将下面的脚本放在vimrc文件(Unix下为~/.vimrc,Windows下为_vimrc)中即可快速输入路径:
" Editanotherfileinthesamedirectoryasthecurrentfile
" usesexpressiontoextractpathfromcurrentfile'spath
" (thanksDouglasPotts)
ifhas("unix")
map,e:
e[C-R]=expand("%:
p:
h")."/"[CR]
else
map,e:
e[C-R]=expand("%:
p:
h")."\"[CR]
endif
这样编辑完第一个文件之后,在vi中输入,e,然后就可以利用Tab键进行自动补齐了。
注意上面代码中的[]符号,实际输入的时候需要换成小于号和大于号(由于blog自身原因,小于号和大于号不能直接输入)
4.单词自动补齐:
输入一个单词(例如函数、变量名等)的开头几个字母,然后按Ctrl-N或者Ctrl+P键,vim会在当前文档中查找匹配的单词并自动将输入补齐。
6.使用%键可以查找匹配的括号。
7.使用[{和]}命令可以跳转到光标所在程序块的开头和结尾。
8.如果当前光标处的单词是一个局部变量,则使用gd来跳转到该变量的定义处;如果当前光标处的单词是全局变量,则使用gD来跳转到该变量的定义处。
9.[i命令可以快速察看光标所在位置的变量的定义,[d命令可以快速察看光标所在位置的宏的定义。
10.流行的文本编辑器通常都有前进和后退功能,可以在文件中曾经浏览过的位置之间来回移动。
在vim中使用Ctrl-O执行后退,使用Ctrl-I执行前进。
相关帮助:
:
helpCTRL-O :
helpCTRL-I :
helpjump-motions
12.如果想在源程序中不使用TAB键并保证缩进为四字符,那么在vimrc中加入下列设置:
settabstop=4
setshiftwidth=4
setexpandtab
13.使用setincsearch之后可以在键入搜索关键字时即时显示匹配的位置。
14.使用sethlsearch可以将匹配进行高亮显示。
进行一次搜索之后,执行:
nohlsearch或:
noh可以暂时关闭本次搜索结果的高亮显示。
而使用:
setnohlsearch则可以永久关闭搜索高亮显示。
可以将:
noh命令映射到一个键上,例如:
nmap:
silentnoh,这样就可以使用Ctrl-N来关闭高亮显示。
postedon2004年10月05日5:
19PM
1.已经在编辑状态(insertmode)了,如何快速执行normalmode的命令?
在编辑文本时,需要快速定位到某个位置,如下一个d的位置,难道要
、fd、i这般繁琐吗?
其实,使用Ctrl-O就可以临时切换到normalmode,执行一个命令后自动返回insertmode。
于是上述命令序列可以改为:
Ctrl-O、fd即可。
Ctrl-O要按两个键呢,很麻烦,于是来个keymap
"make`functionsininsertmode
inoremap`
nnoremap`i`
在normalmode下按`(左上角那个),会正常插入`,
而在insertmode下则相当于按Ctrl-O,
于是上述命令序列又可简化为
`fd即可。
在insertmode想粘贴剪贴板内容时,可以输入`P,爽吧?
这样就可以在insertmode下天马行空,不用再按和a切来切去了。
2.vim的剪贴板怎么怪怪的?
用y命令拷贝的文本怎么不能在X/Windows的其它应用中使用呢?
事实上,vim有多个所谓寄存器来寄存剪切的内容。
平时是不是只用y和p命令呢?
其实这时使用的是unamed寄存器(对应寄存器*,不知对否?
),即没有给定名称的,
而给定名称的,可以加前缀"r使用。
例如,将当前行放到寄存器a中,输入:
"aY
将另一行(先移到其它行)放到寄存器b中,输入:
"bY
粘