本文主要是介绍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和“-的区别
操作前的寄存器值:
:reg1 2 3 --- Registers --- 4 "" ^J5 "0 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""^J" 拆行^J"""""6 "1 ^J7 "2 ^J8 "3 ^J9 "4 ^J10 "5 ^J11 "6 ^J12 "7 ^J13 "8 1234^J14 "9 ^J15 "a i^[I"<80>kb^[j216 "i ^[^i"x<80>kb<80>kb^[j17 "- 1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890zzzzz18 "* ^J19 ". ^@^@^@^@^@^@
文本如下:
1 1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890zzzzzzzzzzzzzzzzzzzz
2 678
3 90
在第二行执行 dw命令后,寄存器的值变化如下, "1- "9没有变, "-和 "",还有 "*变了
:reg1 2 3 --- Registers ---4 "" 6785 "0 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""^J" 拆行^J"""""6 "1 ^J7 "2 ^J8 "3 ^J9 "4 ^J10 "5 ^J11 "6 ^J12 "7 ^J13 "8 1234^J14 "9 ^J15 "a i^[I"<80>kb^[j216 "i ^[^i"x<80>kb<80>kb^[j17 "- 67818 "* 67819 ". ^@^@^@^@^@^@20 ": redir! > registers.txt
在第一行执行 dg$命令后,寄存器的值变化如下, "1- "9没有变, "-和 "",还有 "*变了
reg:1 2 3 --- Registers ---4 "" 1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890zzzzz5 "0 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""^J" 拆行^J"""""6 "1 ^J7 "2 ^J8 "3 ^J9 "4 ^J10 "5 ^J11 "6 ^J12 "7 ^J13 "8 1234^J14 "9 ^J15 "a i^[I"<80>kb^[j216 "i ^[^i"x<80>kb<80>kb^[j17 "- 1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890zzzzz18 "* 1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890zzzzz19 ". ^@^@^@^@^@^@20 ": redir! > registers.txt21 "/ test
在第二行执行 dd命令后,寄存器的值变化如下, "-没有变, "1- "9和 "",还有 "*变了
reg:3 --- Registers ---4 "" 678^J5 "0 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""^J" 拆行^J"""""6 "1 678^J7 "2 ^J8 "3 ^J9 "4 ^J10 "5 ^J11 "6 ^J12 "7 ^J13 "8 ^J14 "9 1234^J15 "a i^[I"<80>kb^[j216 "i ^[^i"x<80>kb<80>kb^[j17 "- 1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890zzzzz18 "* 678^J19 ". ^@^@^@^@^@^@20 ": redir! > registers.txt21 "/ test
从这几个例子,可以发现如果删除内容中包含换行,删除内容就保存到”1中,否则就保存到"-中。
例子2:用“1-”9实现倒序
有如下几个数,要把它们倒序排序
0x11, 0x12, 0x13, 0x24, 0x29
第一步,先用
%s/, /\r/g把数字分行
0x11
0x12
0x13
0x24
0x29
第二步,把光标移到第一行,然后 dd,再连续四次 .(重复上次操作),把所有数字删掉,寄存器的值如下
3 --- Registers ---4 "" 0x29^J5 "0 0x11^J0x12^J0x13^J0x24^J0x29^J6 "1 0x29^J7 "2 0x24^J8 "3 0x13^J9 "4 0x12^J10 "5 0x11^J11 "6 0x11^J12 "7 ^J13 "8 ^J14 "9 reg^J15 "a i^[I"<80>kb^[j216 "i ^[^i"x<80>kb<80>kb^[j17 "- 0x1118 "* 0x29^J19 "} 法为:在vim下用visual模式或者鼠标选中内容,不需要复制。然后在其它软件点鼠标中键,即可粘贴。好像WINDOWS和M20 ". ^@^@21 ": redir! > register.txt22 "/ ,
第三步, "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>
上面映射 cscope的 cs find s命令到 ctrl+_,有趣的是后面一段: <C-R>=expand("<cword>")<CR><CR>
<C-R>=就是“=,也就是说,命令行模式下也可以用这个寄存器。
expand("<cword>")返回光标所在的单词,后面两个<CR>,第一个让expand()函数生效,第二个让cs find s命令生效。
这篇关于VIM寄存器浅识的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!