vim与gvim技巧5.docx

上传人:b****8 文档编号:30559814 上传时间:2023-08-16 格式:DOCX 页数:15 大小:28.48KB
下载 相关 举报
vim与gvim技巧5.docx_第1页
第1页 / 共15页
vim与gvim技巧5.docx_第2页
第2页 / 共15页
vim与gvim技巧5.docx_第3页
第3页 / 共15页
vim与gvim技巧5.docx_第4页
第4页 / 共15页
vim与gvim技巧5.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

vim与gvim技巧5.docx

《vim与gvim技巧5.docx》由会员分享,可在线阅读,更多相关《vim与gvim技巧5.docx(15页珍藏版)》请在冰豆网上搜索。

vim与gvim技巧5.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1