VIM寄存器浅识

VIM寄存器分为9类:

1、匿名寄存器(unnamed register)"": 

      用途:执行删除和复制命令时,删除或者复制的文本会保存到该寄存器中。

      例外:没有例外。这个寄存器是默认寄存器,无论操作有没有指定寄存器,这个寄存器都会生效。如果指定了其它寄存器,如"a,“a和""都会生效。

2、数字寄存器(numbered register):

1)"0

       用途:最近的复制内容。

       例外:如果复制时指定了其它寄存器(如"ayw),"0将失效。

2)“1"9:跨行删除寄存器

       用途:最近9次跨行删除的内容。”1是最近的一次,“9是最后一次。

       例外1:如果复制时指定了其它寄存器。

       例外2:删除的内容不超过一行(删除内容不包含换行符),这时删除内容将保存到”-中。

3、行内删除寄存器(small delete register)"-

       用途:最近删除的内容,且内容不超过一行。

       例外1:如果复制时指定了其它寄存器。

       例如2:如果删除内容超过一行。

4、具名寄存器(named register)"a-"z"A-"Z

       用途:操作时指定这些寄存器,该寄存器的内容才会更新。

                   小写和大写的区别是小写会覆盖上次的内容,大写会把本次内容加到上次内容的后面。

       例外:操作时不指定这些寄存器,不生效。

5、4个只读寄存器(readonly register):

1)".:最近进入insert模式插入的内容。

2)“%:当前文件名。

3)"#:交换文件名(alternate file)。

4)"::最近执行的命令。

6、表达式寄存器(expression register)"=

       用途:保存表达式的值。如在normal模式下,敲"=后,在命令行上会出现,然后敲3+9回车,再敲p,最后自动插入12。

                   更有用的是,在insert模式下,敲ctrl+r,再敲=,也会在命令行上出现=,可以输入某个变量、函数或者表态式,最后敲回车,刚才=后输入的结果立马出现在光标前。

       例外:没有例外。

7、选择和拖拽寄存器(selection and drop register)"* "+ "~:

       背景:X11有两种选择模式(其它有三个,有一种没有用),即选中模式和粘贴板。

       选中模式的用法为:在vim下用visual模式或者鼠标选中内容,不需要复制。然后在其它软件点鼠标中键,即可粘贴。好像WINDOWS和MAC都没有这个功能。

       选中模式对应"*,粘贴板对应"+

1)“*:对应选中模式。用鼠标或者可视模式选中的内容。还有一个用处,这个寄存器也是系统剪贴板(在程序之间共享复制内容)。

2)"+:对应粘贴板。WINDOWS和MAC,"*和"+应该是一样的。

3)"~:是个只读寄存器,且编译时指定+dnd特性时才能用(在:ver命令输出中看是+dnd还是-dnd)。保存拖拽到vim的内容。

8、黑洞寄存器(black hole register)"_

      用途:黑洞,故名思意,有去无回。比如,删除时指定这个寄存器,其它寄存器(如"1-"9)不受影响。

      例外:操作时不指定这些寄存器,不生效。

9、搜索模式寄存器(last search pattern register)"/

       用途:最近搜索的内容,也可以用let命令修改@/

       例外:操作时不指定这些寄存器,不生效。

例子1:“0“-的区别
操作前的寄存器值:

:reg
  1 
  2 
  3 --- Registers ---                                                           
  4 ""   ^J
  5 "0   """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""^J" 拆行^J"""""
  6 "1   ^J
  7 "2   ^J
  8 "3   ^J
  9 "4   ^J
 10 "5   ^J
 11 "6   ^J
 12 "7   ^J
 13 "8   1234^J
 14 "9   ^J
 15 "a   i^[I"<80>kb^[j2
 16 "i   ^[^i"x<80>kb<80>kb^[j
 17 "-   1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890zzzzz
 18 "*   ^J
 19 ".   ^@^@^@^@^@^@

文本如下:
1 1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890zzzzzzz
  zzzzzzzzzzzzz
2 678
3 90


在第二行执行 dw命令后,寄存器的值变化如下, "1- "9没有变, "-"",还有 "*变了
:reg
  1                                                                             
  2 
  3 --- Registers ---
  4 ""   678
  5 "0   """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""^J" 拆行^J"""""
  6 "1   ^J
  7 "2   ^J
  8 "3   ^J
  9 "4   ^J
 10 "5   ^J
 11 "6   ^J
 12 "7   ^J
 13 "8   1234^J
 14 "9   ^J
 15 "a   i^[I"<80>kb^[j2
 16 "i   ^[^i"x<80>kb<80>kb^[j
 17 "-   678
 18 "*   678
 19 ".   ^@^@^@^@^@^@
 20 ":   redir! > registers.txt

在第一行执行 dg$命令后,寄存器的值变化如下, "1- "9没有变, "-"",还有 "*变了
reg:
  1                                                                             
  2 
  3 --- Registers ---
  4 ""   1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890zzzzz
  5 "0   """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""^J" 拆行^J"""""
  6 "1   ^J
  7 "2   ^J
  8 "3   ^J
  9 "4   ^J
 10 "5   ^J
 11 "6   ^J
 12 "7   ^J
 13 "8   1234^J
 14 "9   ^J
 15 "a   i^[I"<80>kb^[j2
 16 "i   ^[^i"x<80>kb<80>kb^[j
 17 "-   1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890zzzzz
 18 "*   1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890zzzzz
 19 ".   ^@^@^@^@^@^@
 20 ":   redir! > registers.txt
 21 "/   test   

在第二行执行 dd命令后,寄存器的值变化如下, "-没有变, "1- "9"",还有 "*变了
reg:
  3 --- Registers ---
  4 ""   678^J
  5 "0   """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""^J" 拆行^J"""""
  6 "1   678^J
  7 "2   ^J
  8 "3   ^J
  9 "4   ^J
 10 "5   ^J
 11 "6   ^J
 12 "7   ^J
 13 "8   ^J
 14 "9   1234^J
 15 "a   i^[I"<80>kb^[j2
 16 "i   ^[^i"x<80>kb<80>kb^[j
 17 "-   1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890zzzzz
 18 "*   678^J
 19 ".   ^@^@^@^@^@^@
 20 ":   redir! > registers.txt
 21 "/   test        
                                                                                                
从这几个例子,可以发现如果删除内容中包含换行,删除内容就保存到”1中,否则就保存到"-中。

例子2:用“1”9实现倒序
有如下几个数,要把它们倒序排序

0x11, 0x12, 0x13, 0x24, 0x29
第一步,先用 %s/, /\r/g把数字分行
0x11
0x12
0x13
0x24
0x29

第二步,把光标移到第一行,然后 dd,再连续四次 .(重复上次操作),把所有数字删掉,寄存器的值如下
  3 --- Registers ---
  4 ""   0x29^J
  5 "0   0x11^J0x12^J0x13^J0x24^J0x29^J
  6 "1   0x29^J
  7 "2   0x24^J
  8 "3   0x13^J
  9 "4   0x12^J
 10 "5   0x11^J
 11 "6   0x11^J
 12 "7   ^J
 13 "8   ^J
 14 "9   reg^J
 15 "a   i^[I"<80>kb^[j2
 16 "i   ^[^i"x<80>kb<80>kb^[j
 17 "-   0x11
 18 "*   0x29^J
 19 "}   法为:在vim下用visual模式或者鼠标选中内容,不需要复制。然后在其它软件点
    鼠标中键,即可粘贴。好像WINDOWS和M
 20 ".   ^@^@
 21 ":   redir! > register.txt
 22 "/   ,  

第三步, "1p,然后再连续四次 .,文本变成:
0x29
0x24
0x13
0x12
0x11
0x11

这个例子最有趣的地方出现了:四次执行 .,不是执行了四次 "1p,而是执行了四个不一样的命令: "2p "3p "4p "5p
只能佩服bram考虑得太周到了。


例子3:共享粘贴板

在vim下用"*y"*p可以实现与其它程序共享粘贴板。

在.vimrc增加下面一句,可以实现用匿名寄存器共享粘贴板:

set clipboard=unnamed

例子4:"=的用法

要把光标所在的字母前插入该字母的大写形式

文本如下:

abcdefg

光标如果在a上,需要在a前面插入A

定义了一个函数,然后映射到`

function Insert_Upper()
1 return toupper(getline('.')[col('.') - 1])
endfunction
inoremap ` <c-r>=Insert_Upper()<cr>
inoremap ` 
 i ` * <C-R>=Insert_Upper()<CR>


还有一个使用更广泛的例子:

nmap <C-_>s :cs find s <C-R>=expand("<cword>")<CR><CR>

上面映射 cscopecs find s命令到 ctrl+_,有趣的是后面一段: <C-R>=expand("<cword>")<CR><CR>

<C-R>=就是“=,也就是说,命令行模式下也可以用这个寄存器。

expand("<cword>")返回光标所在的单词,后面两个<CR>,第一个让expand()函数生效,第二个让cs find s命令生效。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值