[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 键隔壁的那一个同上符号(ditto marks)。

"ap 将 a 缓冲区的内容贴上。
     缓冲区的术语在 vim 称为 registers,vim 扩充了相当多的
    功能,有兴趣深入的朋友请 :h registers。您用 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 不加什么的话,是取出 " 缓
    冲区的内容的。% 指的是目前编辑的档案,# 指的是前一次
    编辑的档案。还有其它的呀!因为没什么重要,就请
    :h registers 吧!registers 有个 "s" 结尾,不要搞错了,

  而且 Tab 的补全键 vim 也支援的,也就是说您键入 :h regi
    再按 Tab 键,vim 就会帮您补全,按了 Tab 后发现不是您要
    的,那就继续按,总会出现您要的。:-)

Tab 补全的功能,elvis 也有,但叫出 registers 列表的命令
    则没有,您得自行记忆在您的脑袋瓜子里。而且 elvis 的补全
    能力并没 vim 强。

天大的指令
    . 这是什么?ㄚ,是英文句点啦!没错,就是英文句点。什么意思?重复前次的编辑动作。这个指令太高明了,只要是编辑动作(移动游标不算,冒号命令也不算)都可以按英文句点来重复,要重复几次都可以。

例如:您按了 yy,然后按 p 就会复制、贴上一整行,如果要重复这个动作的话,就可以按 . ,也可以把游标移到其它地方后再按。其它 dd,dw,r,cw 等编辑指令都可以这样来重复。如果您要重复做某些编辑动作时,千万千万一定要想到有这么一个英文句点重复指令。ㄚ,拜托啦!您一定要常用这个指令。

疑难杂症

    那 mouse 中键的剪贴功能还有吗?当然还有,不管在 console 或 X terminal 中都照用不误。当然在 windows 下的话就不能用了,可以用 Shift-Insert 来代替。Ctrl-v 在 vim 中另有作用,在 windows 下就不必去麻烦它了。
    ㄟ,我从 netscape 用 mouse copy 东东过来的时候,常常都搞得天下大乱耶!要设成 :set paste,预设是 map 至 F9 键的,您要 copy 之前先按一下 F9,copy 完后再按一次 F9 来回复。这是 vim 的扩充功能,elvis 没有。那在 elvis 怎么办?只好 :set noai 了。在 GUI 的版本应不会有这种情形。
     set 的功能先不必去理它,往后会有一个单元专门讨论。

朋友!您睡著了吗?不要被吓到了,您只要开个档案,亲自操作一下就能心领神会。那用 mouse 不是更方便吗?不见得,yyp 来复制贴上一整行比较快,还是用 mouse 来拉比较快?您可以试看看。

    寻找/替换
    搜寻、替换的功能几乎是每个编辑器必备的功能,那在 vi(m) 中有没有特殊的地方呢?当然有,您忘了,vi(m) 是个性十足的编辑器。最特殊的地方是和规则表示式(regular expression,简称 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 所取代。

c confirm,每次替换前会询问。

e 不显示 error。

g globe,不询问,整行替换。

i ignore 不分大小写。
     g 大概都是要加的,否则只会替换每一行的第一个符合字串。
    可以合起来用,如 cgi,表示不分大小写,整行替换,替换前
    要询问是否替换。

    [实例] :%s/Edwin/Edward/g
    这样整编文章的 Edwin 就会替换成 Edward。

更进阶的寻找、替换的例子在说明 regexp 的时候还会再详述。目前只知道最基本的用法就可以了!其实光这样就非常好用了。:-)

书签功能
    这又是 vi(m) 的一个秘密武器,简单的说,您可以在文章中的某处做个记号(marks),然后跑到其它地方去编辑,在呼叫这个 mark 时又会回到原处。妙吧!

mx x 代表 26 个小写英文字母,这样游标所在处就会被 mark。
    `x 回到书签原设定位置。
     ` 是 backward quote,就是 Tab 键上面那一个。

'x 回到书签设定行行首。
     ' 是 forward quote,是 Enter 键隔壁那一个。

vim 对于书签的扩充功能

    小写字母 只作用于单一档案内。
    大写字母 可作用于编辑中之各档案间。
    数目字 可作用于前次编辑的十个档案。
     数目字的用法比较特殊,'0 是回到前一次编辑档案中离开
    前的最后位置,'1 则是回到前二次编辑档案的最后位置,
    依此类推。您不必使用 m 来标示,vim 会自动记忆。
    很玄吧!其实这是 viminfo 的功能,您要认真追究的话,
    请 :h viminfo-file-marks。viminfo 关掉,就没这个功能了!

所谓前次指的是前次启动的 vim。

:marks 得知目前所有书签的列表。

叫档、存档、紧急回复
    ㄟ,是不是在灌水呀!怎么开个档也成一个单元?那您就错了,在 vi(m) 里叫档的花样可多了,而且又可以多档编辑,各编辑中的档案还可以互通讯息,这里面学问可大著呢!vim 就更骚包了,也学人家档案可以加密,虽说是噱头,但也还满好用的。

     vim + 档名
    这样开档后,游标会落在档案最后一行的行尾,在档案屁屁后干什么呢?方便您可以继续编辑嘛!
    vim +n 档名
    游标会落在第 n 行的行首。
    vim +/string 档名
    还记得吗? / 就是寻找指令,这样进入档案后游标就会落在第一个找到的 string 上,还可以按 n 继续找 string 喔!哦,string 还可以使用 regexp 来表示喔。
    多档编辑
    多档编辑会有两种情形,一种是在进入 vim 前所用的参数就是多个档(这种情形称为 argument list)。另一种情形是进入 vim 后另外再开其它的档(称为 buffer list)。不过都可以统称为 buffer。

:n 编辑下一个档案。
    :2n 编辑下二个档案。
    :N 编辑前一个档案。
     注意,这种用法只能用于 argument list 的情形。

:e 档名 这是在进入 vim 后,在不离开 vim 的情形下再开其它档案。只要您要编辑的档案是在目前目录,Tab 补全键还是可以使用。
    :e# 或 Ctrl-^ 编辑前一个档案,用于两档互相编辑时相当好用。
     这种用法不管是 argument list 或 buffer list 档案间皆可使用。

还记得吗? # 代表的是前一次编辑的档案。

:files 或 :buffers 或 :ls 会列出目前 buffer 中的所有档案。
     在 elvis 中可使用 :b 来叫出 buffers。

在 buffers 中,减号 - 表示这个 buffer 并未载入,不过,
    不必担心,载入相当快速的。加号 + 表示这个 buffer
    已经修改过了。

:bn buffer next。
    :bl buffer last。
     以上两个指令 elvis 不适用。

:b档名或编号 移至该档。
     在 :ls 中就会出示各档案的编号,这个编号在未离开 vim 前是不会变的。
    这个指令 elvis 也是可以使用。

当然 :e#编号 也是可以的,这样的用法则是所有 vi clone 都通用了。

如果您是使用 vim 的 GUI,那就在功能表上就会有 Buffers 这个选项,
    可以很容易的知道及移动各 buffer 间。

:bd(elete)
    buffer 在未离开 vim 前是不会移除的,可使用这个指令移除。其实移除她干什么呢?vim 是您在叫用时才会载入的,因此这些 buffers 并不是像 cache 一般要占记忆体的。
    :e! 档名
    这样也是会开档,但会放弃目前编辑档案的改变,否则如果档案已有变动,vim 预设是不让您随便离开的。:e! 后不接什么的话,代表舍弃一切修改,重新载入编辑中档案。
    :f 或 Ctrl-g
    显示目前编辑的档名、是否经过修改及目前游标所在之位置。
    :f 档名
    改变编辑中的档名。(file)
    :r 档名
    在游标所在处插入一个档案内容。(read)
    :35 r 档名
    将档案插入至 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 的功能关掉的 :set noswf 就行了!但如果您编辑的是
    大档案,则不建议您把 swap 关掉,这样会很吃记忆体的。

elvis 的话,其暂存档是统一集中存放在 /var/tmp/*.ses,
    权限是档案所有者始能读写。vim 的早期版本,其 *.swp
    档是依原档案的权限来设定的,最近的版本则从善如流,
    已经改成档案所有人始能读写,就是 -rw------- 啦!

    紧急回复
    vim -r 档名,或进入 vim 后,下 :recover 档名,来回复。

大家来学 VIM (三)
    各种标示方法及视窗操作
    这个单元多了一种模式,那便是 visual mode(以下简称 v-mode)v-mode下的反白区(反黑区?^_^)在本文就统一称为标示区,不知各位是否有更好的中文名称?ㄟㄟㄟ,视窗操作和标示有什么关系?为 什么摆在这里说明?ㄚ,是因为这两个单元内容都不多,没地方摆,所以就将凑在一起的啦!乱点鸳鸯谱就请各位见谅。

标示指令

    v 小写 v 这是属于字元标示(character visual),按下 v 后您就可以移动游标,游标走过的地方就会标示起来。再按一次 v 就会结束 v-mode。您用 mouse 拉出的标示区也是属于这类的标示。
    V 大写 V 这是行标示(line visual),按下 V 后会整行标示起来(包括空白的部分),您移动上下键,会标示多行。mouse 连按三次左钮,也是属于此类的标示。再按一次 V 就会结束 v-mode。
     mouse 按两次左钮是标示一个 word。

Ctrl-v 这是方块标示(block visual),可纵向标示矩形区域。再按一次 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 就是版本号码啦!
    例如您使用的是 vim 5.6 版,那么就是 $VIM/vim56。

backup(bk)
    是否要 backup file。预设不打开。
    writebackup(wb)
    在写入档案前先备份一份,和 backup 的作用不尽相同,请:h backup-table。预设是打开的,所以您如果不要 backup,那要关掉的是这个项目,而不是 backup。但请先检查一下您编译时是不是有编译进去,请 :ver。
    backupdir(bdir)
    设定存放 backup file 的目录。预设在所编辑的档案之所在目录。
    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(end of line) 的形式
    dos 是以 0D 0A 来断行。
    unix 是以 0A 来断行。
    mac 是以 0D 来断行。
    预设以各系统平台而定,在 Linux 当然是 unix 形式。
    fileformats(ffs)
    可指定多个,会依载入的档案形式来调整 ff。例如 :set ffs=unix,dos ff=unix 则预设为 unix 格式,但如读入的是 dos 格式的档案,会自动调整为 dos 格式,这样存档时就会以 dos 格式存档(状态列会显示)。此时如要改成 unix 格式,可 set ff=unix 然后存档就会转成 unix 格式,反之亦然。
    注:

如果不这样设,也就是您不管 ff 或 ffs 都设成 unix,那读入dos 格式的档案时在每行尾会出现 ^M 这个字元(就是 0D 啦!)这时纵使 :set ff=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)
    是一种 word wrap 的功能,从左起算之固定每行的最大字元宽度。超过此宽度就会自动折行,这可是真的折行,也就是说在折行处会插入 EOL。预设是 0,也就是没有 word wrap 的功能。
    wrapmargin(wm)
    和 textwidth 作用相同,只是是从右视窗边向左算起要几个字元起折行。预设是 0。textwidth 与 wrapmargin 的功能目前并不适用于中文,打中文还是您自行按 Enter 吧!
    wrap
    这也是折行功能,可是只是萤幕效果的折行,实际上并没有插入 EOL。
    wrapscan(ws)这和折行没有关系,是指寻找时,找至档尾时,是否要从档首继续找。预设是要。
    paste
    这是防止在做剪贴时位置会不正确,前面单元已有说明。
    ruler(ru)
    会在状态列显示游标所在处之行列状态,预设不打开,但建议打开。最右边之代号的意义如下:
    Top 档案第一行在萤幕可见范围。
    Bot 档案最后一行在萤幕可见范围。
    All 档案首尾皆在一个萤幕范围内。
    如非以上三种情形,则会显示相对百分比位置。
    statusline(stl)
    状态列显示的格式,使用预设就可以了,如果您想骚包一下的话,那就请您 :h stl。
    shiftwidth(sw)
    指由 >> 移动整行内容时,一次移动的字元宽度,一般是使用 Tab 的值,但可由这个设定来改变。
    tabstop(ts)
    一个 Tab 键宽度。预设是 8 个字元宽度。最好不要随便改,以免您写的东西由其它编辑器来阅读时造成困扰,为解决这个问题,vim 有一种 softtabstop 的机制,在下一节会详细说明。
    showcmd(sc)
    在状态列显示目前所执行的指令。
    showmode(smd)
    在状态列显示目前的模式,例如是 Insert mode 或是 Visual mode。当然平常的 normal mode(commond mode)是不显示的。
    viusalbell(vb)
    以萤幕闪动代替 beep 声。
    number(nu)
    显示行号。注意,冒号命令也有 :nu 这是显示游标所在行的行号,您嫌多打一个字的话,:# 也行。不过如果 ruler 打开的话,在状态列本就会显示门前游标所在处的行列值。
    list
    这也可以算是一种模式,list mode。就是 Tab 的地方会以 ^I 显示,而行尾之 EOL 会显示成 $。可以让您清楚的知道 Tab 在哪里,折行是不是真的。
    swapfile(swf)
    是否需 swap 至磁碟。如果设为 noswf 的话,那将不会有 swapfile产生,通通会载入在记忆体中。预设是要 swapfile。
    fileencoding(fe)
    首先先鼓掌一下,啪啪啪…,因为有支援 taiwan,也支援 XIM,也就是说可以使用 xcin-2.5x 来作输入,当然您用 xcin-2.3x 配合XA 也是可以啦!目前支援简繁中文、日文、韩文,unicode 尚未植入。但前提是您要把 multi_byte 编译进去,这在一开始就讲过了。预设是使用 ansi。set guifont 及 set guifontset 已在一开始讲过,在此就不重复了。
    history(hi)
    记录冒号命令的历史纪录档,就是可以用上下方向键叫出来的那锅。预设是 20 笔。
    关于 softtabstop(sts)
    几乎所有的 OS 及软件都设定 Tab 就是 8 个字元长,这已经是个公认值,您硬要去改变它的话恐怕带来许多不便,但实际上关于程序风格,许多人又认为 8 个字元太长了,几个巢状回圈下来就需折行,反而不方便。因此 vim 体贴您,内建了 softtabstop 的功能,就是由 vim 来代您制造出一个假的Tab,实际上是空白字元组成的 Tab。

 举个例子来说明比较清楚。
     set softtabstop=4
    set shiftwidth=4

    这样会由 4 个空白字元取代一个 Tab,您按 Tab 键 vim 就跳 4 格,需注意的是,如果您按了三次 Tab 键,那就是一个实际的 Tab 加上四个空白字元,可不是 12 个空白字元喔!是混合 Tab 及 space 的。

问题来了!那我要按真正的 8 字元的 Tab 时怎么办?简单,还记得怎么按特殊字元吗? Ctrl-v Tab 或 Ctrl-v I 就可以了,那就是如假包换的 8 字元长之 Tab。当然,您按两次 Tab 不就得了!:-)

关于折行
    前面已说过 set wrap 就可以造成萤幕折行,可是却会把一个英文单字折成两半,实在很不雅观。好了,vim 再体贴您一次,set linebreak(lbr) 就会避免这种问题发生,会在空白或标点符号的地方来折行,但也仍属萤幕折行,并不会插入 EOL。这个功能目前在中文判断上还是会出槌!:-(

规则表示式的运用
    在本系列文章一开始就说明了学 vi(m) 可以顺便学规则表示式(regular expression,以下简称 regexp),那为什么到现在才来讲呢?因为 regexp 说简单也算不很难,但您要深入去使用的话,有时会马上看不出一个复杂的 regexp 在说些什么的,就曾有人形容 regexp 为「有字天书」!而且在 vi(m) 整体都还没一个概念就加入 regexp 的话,那后面的单元恐怕就没人看了!而 regexp 各家有各家的 extensions,这也是大家视为畏途的原因之一,不过总是大同小异,只需注意一下就可以了。目前先不必管别家怎么说,就让 vim 暂时先成为我们的「标准」,以后碰到其它程序的 regexp 应该就可以触类旁通。以下我们尽量由实例去了解。当然,小小的一篇文章是没有办法详尽介绍,只能捡重点来说明了。如有疑问,可 :h pattern 或在Un*x 系统中可 man 7 regex,甚至 man ed,man sed,man grep,man awk,man perlre 里面也是会说些 regexp,但要注意和 vim 差异的地方!其中 perl 的 regexp 应该是最完整的了,如果您的系统没有 perl 那应该是「稀有动物」了!:-) ㄟㄟㄟ!vim 只是一个编辑器,可不是独立的程序语言!

基本的匹配

    * 指前所绑住的字元或字元集合,出现 0 次或 0 次以上。
    + 和 * 作用相同,但不包括出现 0 次。
    = 指前所绑住的字元恰好出现 0 或 1 次。
    | 这是多选,就是 or 的意思,被 | 隔开的 pattern,任一个符合的话就算符合。注:
    +, =, | 会加上一个 ,是因原字元在 vi(m) 就具有特殊意义,在一般的 regexp 中是 +,?,| 就可以了,只是提醒您一下,以免搞混了!
    在 elvis 及 ed 中是使用 ? 来匹配出现 0 或 1 次,而不是 =,这里要非常小心!
    [实例]
     dg*

    指 * 前所绑住的字元 g 出现 0 次或 0 次以上。也就是说 d(出现 0 次),dg,dgggg,dgggggggg 都是符合这个 pattern。如果您下寻找指令 /dg*,那符合这个 pattern 的字串都会被找出来。如果用在代换就要非常小心了,像 extended 中的 d 也是会被置换掉的。例如您下 :%s/dg*/test/g 的话,那 extended 这个字会换成 extentestetest。注 : shell 中使用的通用字元为 pattern matching notation 和 regexp 不同的。dg* 在 shell 中是解为以 dg 开头的任意字串,这就不包括 d 在内了,也就是说在 shell 中,* 是代表任一字元或字串。

[实例]
     dg+

    dg, dgg, dgggggg 皆符合,但 d 则不符合。如果是 dg= 的话,就只有 d、dg 这两个符合了。

[实例]
     :%s/The|All/test/g

    全文中只要是 The 或 All 都会被替换成 test。注意,如果文中有 There 也是会被替换成 testre!要如何避免这种情形呢?下面会另述及限定使用法。

[实例]
     /123-=4567

    这样会找出,123-4567 及 1234567。当然 123-456789 也是会被找出来。

[...] 字元集合,表示中括号中所有字元中的其中一个。
    [^..] 这是上述 [...] 的补集,表非中括号内字元的其中一个。
    . 除换行字元外的任一单一字元。指本身,非指前所绑之字元。就好像 shell 中的 ? 一样。如果要指定真正的英文句点,要用 来 escape,就是说 . 这时的 . 是代表真正句点,而不是 regexp 中的特殊意义。其他如 * 亦同。
    [实例]
     [Aa]

    A 或 a 其中的一个。

     [12345]

    12345 其中的一个数目字。可用 [1-5] 来表示。连续性的数目字或字元可用 - 来隔开,写出头尾来代表就可以了。[0-9] 就表 0 到 9 的数目字,[a-d] 就代表 abcd 四个英文字母。

[实例]
     W[0-9]*.cc

    这个例子是说以 W 开头,后接 0-9 其中一个或多个数目字或不接什么,然后是一个句点,最后是 cc。所以 W.cc,W1.cc,W2.cc,W345.cc,W8976543287.cc 皆符合。如果要表示 W 及 .cc 间夹一个以上的数目字,要写成 W[0-9][0-9]*.cc。

[实例]
     .*

    这代表任意字元或字串,或什么都没有,脑筋急转弯,对照前面的定义想 一下。

[实例]
     [^M]

    表除 M 以外的任意字元。
     [^Tt]

    表 T 及 t 以外的任意字元。
     [^0-9]

    表非数目字之字元。
     [^a-zA-Z]

    表非英文字母之字元。

注:

注意,^ 要在中括号内,且在最开头的地方,否则另有含意。^ 匹配行首,指其后绑住的字串,出现在行首才符合。$ 匹配行尾,指其前绑住的字串,出现在行尾才符合。含换行字元。
    不是在行首的 ^ 指的是 ^ 这个字元。不是在行尾的 $ 是指 $ 本身这个字元。
    [实例]
     /^What

    这样只有在行首的 What 才会被找出来。注意! Whatever, What's 也是会被找出来。如果是 /What$ 则是在行尾的 What 才会被找出来。

[实例]
     ^$

    这是什么东东?行首也是行尾的行。ㄚ,就是空白行嘛!当然也不能说这个行是没有什么东东啦!空白行至少也是会有个换行字元。在后面会详述如何消除全文的空白行。

(...) 记忆 pattern,可由 1, 2...9 来叫出。
    [实例]
     :%s/([a-z])1/test/g

    这样 aa, bb, cc, dd, ..., zz 都会被 test 替换掉。这和 :%s/[a-z][a-z]/test/g 是不一样的意思,后者会把 aa, ab, ac... ba, bb, bc...zz 都换成 test。也就是说 (...) 由 1 叫出时会有对称性的配对出现。

[实例]
     :%s/(.)(.)r21/test/g

    会将中间为 r,前有二个任一字元,后有两个具对称性的字元所组成的字串替换成 test。例如:12r21,cfrfc,7grg7 等都会被替换成 test。

匹配字尾。这就是前所提及的限定用法,被 括住的 pattern 就会被限制住,使 regexp 不能再向右(左)扩充解释。
    注: ed 及 perl 中可以 来表示这两个符号,但 perl 中只支援 ,ed 则 及 皆支援。在 vim 中 是表示 即 backspace 键。功能上而言,这是和 ^ $ 一样的定位样式(anchor pattern)指所绑住的字串必须是单字边界(word boundary),前或后或前后除了空白字元及标点符号外不可再有其它字元。

[实例]
     :%s//test/g

    这样只有 abbbc 才会被替换成 test。如果没有这样限定, :%s/abbbc/test/g,那 deabbbcly 中的 "abbbc" 亦会被替换成 test。所以前面 :%s/The|All/test/g 可换成 :%s/|/test/g 这样一来,There 就不会被替换成 testre 了!

[实例]
     :%s/]*$/d

    在 vim 或 elvis 里您可以如此照打,也就是 代表空白字元, 代表按 Tab 键的结果。在原始 vi 则不行,得自行按出特殊字元出来,就是 Ctrl-v Space 及 Ctrl-v Tab。或采更简单的打法:
     :g/^s*$/d

    还记得中介中元吗?好用吧!少打了不少字。:-) 意思就是删除含 0 或 1 个以上空白字元的行。注: 有些书中写成 :%s/^$//g 可以删除空白行,这是错误的,因为 :s 这个指令只更动一行里的内容物,但不会做删除一行的动作。

& 替代变数
    代表置换时合于 patern 的字元或字串。

[实例]
     :%s/uddddddddd>/ID:&/g

    这样全文中的身份证字号前就会加上 ID: 字样,也就是说 T123456789 会被换成 ID:T123456789。还记得吗? d 就是 [0-9],u 代表大写的英文字母。加个 > 是防止 T12345678999 也被换掉。当然前面再加个

    就是删去行首的二个空白啦!

[实例] 将全文的 Edward 这个单字,前后加上中括号
     :%s//[&]/g

    [实例] 将全文的 Edward 这个单字,改成大写的。
     :%s//U&/g

    注: ㄟ!U 不是代表非大写字母吗?喔!您搞错位置了。U 在 pattern 的位置的时候是指非大写字母的样式,即 [^A-Z],但如果是在置换字串位置的时候是指将其后的字串通通改成大写。与其相对的是 L,会将其后的字串改为小写。详细请 :h sub-replace-special。

[实例] 将全文每行最后加上
    这个 HTML tag。
     :%s/.*/&/g

    怎么样,是否已感觉到 regexp 威力无穷了呢?还是您已经快睡著了呢?:-) 不过也请您想想,如果是在没有 regexp 功能的编辑器里,范例中的一些动作您会怎么做呢?一个一个去改?

greedy 陷阱
    regexp 会有贪心的倾向,什么意思呢?就是说在同一行内,如果有多个符合 pattern 的情形,会找最长的那一个。

注: 注意!greedy 的特性是针对会反覆比对的 regexp 而言,例如:*, =, +, {} 等。前面所举的 .* 的例子,由于 greedy 的关系,在整篇文章中做替换时,会被当成是每一行整行,因为 regexp 会去找每一行最长符合的那一个。

[实例] This is a test. Test for regexp. 如果您下
     :%s/[Tt].*t/program/g

    原意是想把所有的 Test 或 test换成 program 的,结果由于 regexp 的贪心,整个 "This is a test. Test" 会换成 program。结果原文就变成了program for regexp. 因此在全文替换时要非常小心,避免使用弹性太大的 regexp。像此例,只要下
     :%s//program/g

    就可以了!

最后提醒您,这可不是 regexp 的全部,碍于篇幅及在下功力的问题,当然是没办法全面详尽的向各位做介绍,在下只是将各位领进门,修行就得看各位了!如果还想更深入的研究 regexp,可参考: Mastering Regular Expressions(O'Reilly & Associates) 一书。

__________________ 每临大事有静气 不信今时无古贤

This is very, very simple:

:noremap <F1> #*

I find this helpful when editing multiple files and I want to search for the word under the cursor in *another* file.
I then type F1, C-^, n.
Using Insert mode to insert a single character feels clumsy (you need
3 keypresses for one character), so here's a slightly easier way:

:nmap <space> i_<esc>r

Now, when in Normal mode, just press space followed by what
it is you want to insert.

BUG: Repeating the insertion with . doesn't work.

  rate this tip  Life Changing Helpful Unfulfilling

<<Syntax highlighting is "out of sync", seems to correct itself with refresh ?? | easy (un)commenting out of source code >>

Additional Notes
 manfred.strubegger@irm.at, July 23, 2002 2:59
Very good tip, but I prefer <C-I> as a {lhs}.  It is unused and fits better to the insert logic of VIM, although it saves less key strokes.
reiss_david AT yahoo DOT com, July 29, 2002 10:30
I use
:map gt i$<esc>r
:map gb a$<esc>r
These macros were derived from one I found in a Vi FAQ.
Anonymous, May 20, 2003 10:44
yeah, both comments get to the point, but the author was looking for a way to save a keystroke. both solutions are 3 keystrokes long.
You can use the :redir command to redirect the output of an ex command to
a register and then paste the contents of the register into a Vim buffer.
For example:

:redir @a
:set all
:redir END

Now, register 'a' will have the output of the "set all" ex command.  You
can paste this into a Vim buffer.  You can also write a Vim function
to do the above.

For more information, read :help redir
I love using the visual block feature to move columns around (<ctrl-v>, blockwise-visual).
However, this does not work conveniently on the last column
when  lines are not of equal length. <ctrl-v> marks then a block which
is equal in width to the shortest line.

In order to pad all lines to a given width with trailing blanks
you can use the following functions:

" truncate line 'line' to no more than 'limit' width
function! Truncate( line, limit )
    call cursor(a:line,a:limit)
    norm d$
endfunc

" Pad all lines with trailing blanks to 'limit' length.
function! AtOnce( limit )
    norm mm
    g/^/norm 100A
    g/^/call Truncate( getline('.'), a:limit )
    let @/=""
    norm 'm
endfunc

You may alternatively use the oneliner:
:g/^/exe "norm! 100A" | call cursor(getline('.'), 79) | norm d$

I even saw someone use a standard vi (non vim) oneliner to achieve the
same, but I forgot how. Any ideas?
【 在 neman (行胜于言) 的大作中提到: 】
: 标  题: Re: win Gvim不显示菜单和工具条
: 发信站: BBS 水木清华站 (Tue Jun  8 20:47:50 2004), 站内
:
:
: 【 在 qnx (OS) 的大作中提到: 】
: set guioptions=
: map <F2> :call SwitchShowMenus()<CR>
: function! SwitchShowMenus()
:     if &guioptions=="gmrLtT"
:         set guioptions=
:     elseif &guioptions==""
:         set guioptions=gm
:     else
:         set guioptions=gmrLtT
:     endif
: endfunction
:
: "gmrLtT可以显示工具条和菜单,gm仅仅显示菜单
:
:
: 你的这个功能我的那个也是能实现的,
: 本来是介绍一个经验的,结果没有说明白,:)
:
: 我的问题是:
:     1、我不想要title条, set notitle 它只是把title的文字去掉了。
:     2、窗口最大化后最下边的无用空白条太大了,看起来不美观
      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~这个白边确实没有什么用, 不知道哪位niu能弄掉?
: 有办法解决没有? 谢谢 :)
精华区文章阅读
发信人: vale (浅谷·等待溪流), 信区: VIM
标  题: VIM中不易发现的强劲功能
发信站: BBS 水木清华站 (Mon May 31 10:54:41 2004), 站内

在我最初使用Vim时,有些功能并不知道,等发现后真后悔自己干了那么久的体力活。

1. * (super star)
向下查找光标下(或附近)的<word>。向上找用#。g*查找则不限制whole word。

2. C-R (magic insert)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值