vim粘贴模式快捷方式

vim复制粘贴

原文:http://dpinglee.blog.163.com/blog/static/1440977532010579355724/

复制粘贴基本命令

yy 复制游标所在行整行。或大写一个Y。
2yy或y2y 复制两行。请举一反三好不好!:-)
y^ 复制至行首,或y0。不含游标所在处字元。
y$ 复制至行尾。含游标所在处字元。
yw 复制一个word。
y2w 复制两个字(单词)。
yG 复制至档尾。
y1G 复制至档首。
p 小写p代表贴至游标后(下)。
P 大写P代表贴至游标前(上)。

复制到系统剪贴板

VIM具有多个剪切板,":reg"命令查看各剪切板。系统剪切板的编号就是"+

Cygwin支持系统剪贴板

只有vim.gtk或vim.gnome才能使用系统全局粘贴板,默认的vim.basic看不到+号寄存器。安装vim.gnome使用apt-get install vim-gnome,然后vim自动会链接到vim.gnome。

  1. 打开Cygwin,在主目录下创建目录 .vim 、.vim/autoload、.vim/plugin
  2. 下载fakeclip插件,下载地址:http://www.vim.org/scripts/script.php?script_id=2098
  3. 解压,然后将解压出来的目录下的autoload文件夹中的 fakeclip.vim 复制到第一步创建的 .vim/autoload 文件夹下;plugin文件夹下的 fakeclip.vim 复制到 .vim/plugin 文件夹下。 两个文件的名字都叫fakeclip,但是不一样,不要弄混。
  4. 重新启动vim,这时就可以用 "+y 和 "+p 在vim和系统粘贴板之间进行复制了。
  5. 注意:按"+y时,动作要连续,停顿会造成操作无效。

vim寄存器

无论是vim内部抑或外部的复制([y]ank)、删除([d]elete)、粘贴([p]ut),在vim中都是借助registers(寄存器)实现的,vim共有9类寄存器:

名称 标识 说明
无名(unnamed)寄存器 "" 缓存最后一次操作内容;
数字(numbered)寄存器 "0 - "9 缓存最近操作内容,复制与删除有别;
行内删除(small delete)寄存器 "- 缓存行内删除内容;
具名(named)寄存器 "a - "z或"A - "Z 指定时可用;
只读(read-only)寄存器 ":, "., "%, "# 分别缓存最近命令、最近插入文本、当前文件名、当前交替文件名;
表达式(expression)寄存器 "= 只读,用于执行表达式命令;
选择及拖拽(selection and drop)寄存器 "*, "+, "~ 存取GUI选择文本,可用于与外部应用交互,使用前提为系统剪切板(clipboard)可用;
黑洞(black hole)寄存器 "_ 不缓存操作内容(干净删除);
模式寄存器(last search pattern) "/ 缓存最近的搜索模式。

上面的说明为简要概述,并不完全准确,详细说明须参考手册::help copy-move

Ubuntu下使用系统剪贴板

无图形界面的vi或vim下可用的寄存器只包括{a-zA-Z0-9.%#:-"},显然,这里面没有包含上面提到的"*或者"+等选择及拖拽存器。

由此可见,实现vim与外部应用相互复制、粘贴的关键在于系统剪切板对于vim是否可用。查看vim剪切板是否可用的命令为vim --version,

对于非GUI版本的vim,剪切板是不可用的,解决方案很简单,安装一下就是了:

sudo apt-get install gvim

ubuntu 和mint默认安装的vim是不支持系统剪切、粘贴版的,需要执行以下安装:

sudo apt-get install vim-gnome 
# 查看链接到的版本
update-alternatives --display vim

mac的vim无法访问clipboard

-clipboard表示该版本不支持访问剪切板,需要重新编译。

vim --version|grep clipboard
-clipboard       +job             +path_extra      +user_commands
+eval            -mouse_dec       +statusline      -xterm_clipboard

直接用homebrew安装:

brew install vim
# OR
brew install macvim --head --override-system-vim

或者:

" On OSX
vmap <C-c> y:call system("pbcopy", getreg("\""))<CR>
nmap <C-v> :call setreg("\"",system("pbpaste"))<CR>p
" MACOS
if !has('clipboard')
vmap "+y :w !pbcopy<CR><CR>
" vmap y :w !pbcopy<CR><CR>
" nmap yy :.w !pbcopy<CR><CR>
" nmap p :r !pbpaste<CR><CR>
endif

【解说】

这里主要得益于mac下的一套好用的操作系统剪贴板的命令:
pbcopy, pbpaste .
比如说可以这样使用:
cat foo.txt | pbcopy #将foo.txt的内容复制到系统剪贴板
pbpaste > bar.txt #将系统剪贴板的内容写到bar.txt

然后vim的w !和r !(注意中间的空格)可以负责把某一段文字
写入或从某一个命令读出,有点类似linux的管道功能。
这里把vim默认的y和p功能改掉,让y直接复制到系统剪贴板,
让p从系统剪贴板直接粘贴;故实现了多个terminal之间的剪贴板共享。
而且由于操作的是系统剪贴板,同时也实现了terminal的vim与其他
应用程序之间的剪贴板共享。

【问题】

第二行中的nmap,如果是前面有数字,比如说2yy复制两行的功能会失效。
可在V模式下用y命令代替。