引言

       刚安装完Vim的时候,为了让Vim使用起来更加舒适便捷,往往需要对其进行一点配置,高玩还会给Vim安装各种插件。
       有时候想要在Vim里复制某些内容到其它的文件,或者软件中,但会发现Vim的剪切板别的软件无法访问,而且Vim的剪切板限制了50行的最大粘贴量,当然我们也可以改变这个最值,但最好的解决方案就是和系统的剪切板进行共享。如此一来就完美解决了跨应用复制与复制行数限制问题。


Vim的常用环境变量配置

       Vim的环境变量有两个:一个是全局的环境变量:/etc/vim/vimrc.local 。另一个就是当前用户的环境变量:~/.vimrc 。读者可以根据需求自行选择配置哪个文件,以下为常用的一些环境变量的设置,可自行选择开启。
如果想要对Vim进行高度的定制可以参考此博文:如何用Vim搭建IDE?

"打开语法高亮。自动识别代码,使用多种颜色显示。"
if has("syntax")
  syntax on
endif
 
"显示行号"
set number
 
"显示当前是处于命令模式还是插入模式"
set showmode
 
"显示当前输入的命令"
set showcmd
 
"开启文件类型检查,并且载入与该类型对应的缩进规则,比如当前是.cpp文件,就加载cpp文件对应的缩进规则"
filetype indent on
 
"按下回车键后,下一行的缩进会自动跟上一行的缩进保持一致。"
set autoindent
 
"按下Tab键时对应的空格数"
set tabstop=4
 
"设置Tab自动转换为空格"
set expandtab

"每个Tab转换的时候对应几个空格"
set softtabstop=4

"光标遇到圆括号、方括号、大括号时,自动高亮对应的另一个圆括号、方括号和大括号。"
set showmatch
 
"搜索时高亮显示匹配结果"
set hlsearch
 
"输入搜索模式时,每输入一个字符,就自动跳到第一个匹配的结果。"
set incsearch
 
"vim需要记住1000次历史操作"
set history=1000
 
"打开文件监视。如果在编辑过程中文件发生外部改变(比如被别的编辑器编辑了),就会发出提示。"
set autoread
 
"光标所在行高亮"
set cursorline

"如果行尾有多余的空格(包括 Tab 键),该配置将让这些空格显示成可见的小方块。"
set listchars=tab:»■,trail:■
set list
 
"命令模式下,底部操作指令按下 Tab 键自动补全。第一次按下 Tab,会显示所有匹配的操作指令的清单;第二次按下 Tab,会依次选择各个指令。"
set wildmenu
set wildmode=longest:list,full

关于Vim寄存器的知识

       Vim 提供了以下 10 类共 48 个寄存器,提供无与伦比的寄存功能。可以让你的编码工作效率得到大幅度的提升。可在 Vim 中通过 :help registers 查看帮助。

寄存器的使用

       要将 vim 的内容复制到某个寄存器,需要先退出编辑模式,再进入命令模式后,选择要复制的内容,然后按 "Nnyy(注意带引号)完成复制,其中 N 为寄存器编号,n为复制行数(注意是按下 双引号 + 寄存器编号+ 复制行数 + yy),如:要把当前行以下10行的内容复制到寄存器 a,按 "a10yy 就可以了。

寄存器分类

  1. 匿名寄存器 ""
  2. 编号寄存器 "0"9
  3. 小删除寄存器 "-
  4. 26 个命名寄存器 "a"z
  5. 3 个只读寄存器 ":, "., "%
  6. Buffer 交替文件寄存器 "#
  7. 表达式寄存器 "=
  8. 选区和拖放寄存器 "*, "+, "~
  9. 黑洞寄存器 "_
  10. 搜索模式寄存器 "/
 
1.匿名(unnamed)寄存器

       使用 d, c, s, x 等会删除字符的命令时,被删除字符会进入匿名寄存器 ""。 你可以认为 "" 寄存器是一个指针,指向刚才被存到的寄存器。使用 y 命令未指定寄存器会存到 "0 寄存器中,同时 "" 会与该寄存器保有同样的值。 这意味着你使用 p"p 总会得到同样的结果。

 
2.编号(numbered)寄存器

       编号寄存器从 "0"9 共 10 个,其中 "0 保存着拷贝来的字符串,"1"9 保存着删除掉的字符串。 删除操作符包括 s, c, d, x。 删除掉的字符串会被存到 "1 中,上次删除的则会被存到 "2 中。以此类推,Vim 会保存你最近的 9 次删除。

  • 只有整行整行的删除,和通过段落级别的移动指令(包括 %,(,),/,?,n,N,{,},) 的删除才会被放到"1` 中。
  • 当用户指定拷贝操作的寄存器时(如 "ap),"0 不会被写入;但删除操作一定会被写入到 "1 中。

"0 寄存器很有用,比如我们 copy 了一段文本然后用它替换另一段文本。 这时默认寄存器 "" 中的值就变成了被替换文本,如果还需要用 copy 的文本继续替换的话就需要 "0p 了。

 
3.行内删除(small delete)寄存器

       不足一行的小删除则会被放到小删除寄存器中("-),起作用的删除操作符也包括 s, c, d, x。 例如:

dw    # 删除一个词
d9l   # 删除9个字符
cb    # 向前更改一个词

"0 寄存器类似,当用户指定寄存器并进行删除时,"- 不会被写入。

 
4.命名(named)寄存器

       命名寄存器有 "a"z 共 26 个,这些寄存器只有当我们指定时才会被使用。 其实我们在录制宏时,所有键盘操作会以字符串的形式存到寄存器中。 例如录制一个宏存到 "a 寄存器中,内容为更改当前行 cc,改为 foo 字符串:

qaccfoo

然后执行 :reg 来查看寄存器,可以发现 a 寄存器的值是 ccfoo

小技巧:当使用小写字母进行操作时会覆盖当前寄存器内容,当使用大写字母进行操作时,会追加当前寄存器内容。

       
5.只读(read-only)寄存器

       只读寄存器共 3 个,它们的值是由 Vim 提供的,不允许改变:

  • ".:上次 insert 模式中插入的字符串。还记得吗?. 命令可以重复上次操作,而 ". 存储了上次插入。
  • "%:当前文件名,不是全路径,也不是纯文件名,而是从当前 Vim 的工作目录到该文件的路径。例如此时 Harttle 的 Vim 中,"%p 的结果为 _drafts/vim-registers.md
  • "::上次命令模式下键入的命令。正如 @a 可以执行 "a 寄存器中的宏一样,@: 可以执行上次命令。
       
6.交替文件(alternate file)寄存器

       交替文件寄存器 "# 存储着当前 Vim 窗口(Window)的交替文件。交替文件(alternate file)是指 Buffer 中的上一个文件,可通过 Ctrl+^ 来切换交替文件与当前文件。

Window 和 Buffer 有什么区别?参见 Vim 多文件编辑:窗口一文。

       

7.表达式(expression)寄存器

       表达式寄存器 "= 主要用于计算 Vim 脚本的返回值,并插入到文本中。 当我们键入 "= 后光标会移动到命令行,此时我们可以输入任何 Vim 脚本的表达式。 例如 3+2,按下回车并且 p 则会得到 5。这在我们调试 Vim 脚本时非常有用,比如调用一个函数看它是否有正确的返回值。

       
8.选择及拖拽(selection and drop)寄存器

       选择和拖放寄存器包括 "*, "+, 和 "~,这三个寄存器的行为是和 GUI 相关的。因此需要安装vim-gtk。执行以下命令进行安装:

sudo apt-get install vim-gtk

"*"+ 在 Mac 和 Windows 中,都是指系统剪切板(clipboard),例如 "*yy 即可复制当前行到剪切板。 以供其他程序中粘贴。其他程序中复制的内容也会被存储到这两个寄存器中。 在 X11 系统中(绝大多数带有桌面环境的 Linux 发行版),二者是有区别的:

  • "* 指 X11 中的 PRIMARY 选区,即鼠标选中区域。在桌面系统中可按鼠标中键粘贴。
  • "+ 指 X11 中的 CLIPBOARD 选区,即系统剪切板。在桌面系统中可按 Ctrl+V 粘贴。

上文所述的 Mac 下 set clipboard=unnamed 会使得系统剪切板寄存器 "* 和 Vim 默认的匿名寄存器 "" 始终保有同样的值,即 Vim 和系统共用剪切板。

有文本拖拽到 Vim 时,被拖拽的文本被存储在 "~ 中。Vim 默认的行为是将 "~ 中内容插入到光标所在位置。 当然你可以给 `` 做键盘映射。

       
9.黑洞(black hole)寄存器

       黑洞寄存器 "_,所有删除或拷贝到黑洞寄存器的文本将会消失。 这是为了在删除文本的同时不影响任何寄存器的值,"_ 通常用于 Vim 脚本中。

       
10.模式(last search pattern)寄存器

       搜索寄存器 "/ 用于存储上一次搜索的关键词。Vim 中如何进行搜索呢? 在 normal 模式下按下 / 即进入 search 模式,输入关键字并按下回车即可。

该寄存器是可写的,例如 :let @/ = "harttle" 将会把 "harttle" 写入该寄存器。 下次搜索时不输入搜索词直接回车便会搜索 "harttle"


总结

        当需要复制大于50行的内容或跨软件复制时,可以先复制到系统剪切板即"+寄存器中,然后再粘贴到其它文件中。

Logo

更多推荐