轉載自本人獨立博客https://liushiming.cn/2020/01/18/copy-and-paste-in-vim/
概述
復制粘貼是文本編輯最常用的功能,但是在vim中復制粘貼還是有點麻煩的,有一點學習成本。本文總結了使用vim復制粘貼的典型場景和使用方法,希望對讀者有幫助。
vim內部復制、粘貼、剪切
選擇文本
- v+光標移動 (按字符選擇)高亮選中所要的文本,然后進行各種操作(比如,d表示刪除)。
- V (按行選擇)
- v+選中的內容+c 更改選中的文字
復制:y(ank)
- y 用v命令選中文本后,用y進行復制
- yy 復制當前行,然后用p進行粘貼
- 5yy 復制從當前行開始的5行
- y_ 等同於yy
- Y 等同於yy
- yw 復制當前單詞
- y$ 從當前位置復制到行尾
- y0 從當前位置復制到行首
- y^ 從當前位置復制到第一個非空白字符
- yG 從當前行復制到文件結束
- y20G 從當前行復制到第20行
- y?bar 復制至上一個出現bar的位置
粘貼:p(aste)
- p(小寫) 在光標位置之后粘貼
- P(大寫) 在光標位置之前粘貼
剪切
- v + 方向鍵(hjkl)選中內容 + d 剪切 + p粘貼
剪貼板
默認剪貼板
vim提供12個剪貼板,它們的名字分別為vim有11個粘貼板,分別是0、1、2、...、9、a、“。如果開啟了系統剪貼板,則會另外多出兩個:+和*。使用:reg命令,可以查看各個粘貼板里的內容。
:reg
在vim中簡單用y只是復制到“(雙引號)粘貼板里,同樣用p粘貼的也是這個粘貼板里的內容。
復制和粘貼到指定剪貼板
要將vim的內容復制到某個粘貼板,需要退出編輯模式,進入正常模式后,選擇要復制的內容,然后按"Ny完成復制,其中N為粘貼板號(注意是按一下雙引號然后按粘貼板號最后按y),例如要把內容復制到粘貼板a,選中內容后按"ay就可以了。
要將vim某個粘貼板里的內容粘貼進來,需要退出編輯模式,在正常模式按"Np,其中N為粘貼板號。比如,可以按"5p將5號粘貼板里的內容粘貼進來,也可以按"+p將系統全局粘貼板里的內容粘貼進來。
系統剪貼板
Vim支持系統剪貼板,需要打開clipboard功能。使用下面的命令,檢查當前版本的Vim,是否支持clipboard。
$ vim --version | grep "clipboard"
-clipboard +insert_expand +path_extra +user_commands
+emacs_tags -mouseshape +startuptime -xterm_clipboard
root@sz ➜ ~ vim --version
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Jun 07 2019 15:35:43)
-clipboard代表不支持+clipboard代表支持。
如果不支持的話,需要安裝gvim或者在編譯的時候開啟系統剪貼板選項。
vim復制到系統剪貼板
"*y"+y"+2yy– 復制兩行{Visual}"+y- copy the selected text into the system clipboard"+y{motion}- copy the text specified by {motion} into the system clipboard:[range]yank +- copy the text specified by[range]into the system clipboard
vim剪切到系統剪貼板
"+dd– 剪切一行
從系統剪貼板粘貼到vim
"*p"+pShift+Insert:put +- Ex command puts contents of system clipboard on a new line<C-r>+ - From insert mode (or commandline mode)
"+p比 Ctrl-v 命令更好,它可以更快更可靠地處理大塊文本的粘貼,也能夠避免粘貼大量文本時,發生每行行首的自動縮進累積,因為Ctrl-v是通過系統緩存的stream處理,一行一行地處理粘貼的文本。
設置vim默認使用系統剪貼板
確定vim支持+clipboard后,如果想y/p直接和系統剪貼板打通,可以在~/.vimrc中加上以下配置):
set clipboard^=unnamed,unnamedplus
其中unnamed代表*寄存器,unnamedplus代表+寄存器。在mac系統中,兩者都一樣;一般在linux系統中+和*是不同的,+對應ctrl + c,ctrl + v的桌面系統剪貼板,*對應x桌面系統的剪貼板(用鼠標選擇復制,用鼠標中鍵粘貼)。
服務器vim復制到本地剪貼板
通過ssh連接到linux服務器時,vim是跑在遠程服務器的,不能使用y復制到本地的剪貼板。這時有幾個方法:
cmd + c
用鼠標選中文字cmd + c復制(windows下ctrl + c復制),cmd + v粘貼到本地。這個方法是最自然的,但是想要用這個方法有幾個前提:
- vim配置中開啟鼠標支持,
.vimrc文件中加上
set mouse=a
- terminal客戶端關閉
mouse reporting選項,否則鼠標點擊vim界面會進入visual模式。參見我這篇文章解決iterm2中vim選中文字不能復制的問題 - 如果使用tmux,tmux需要配置支持鼠標滾輪,否則最多只能復制當前頁面的內容
本地vim通過scp編輯遠程文件
使用本地vim通過scp直接編輯遠程文件。這樣就可以使用本地寄存器"+y"復制了。這種方法對遠程vim配置沒有要求。
vim scp://remoteuser@server.com//absolute/path/to/file
注意com和absolute間是兩個反斜杠//並不是敲錯了。
參考鏈接
- Accessing the system clipboard
- Editing remote files via scp in vim
- Vim 配置入門
//title:(一文搞懂vim復制粘貼)
//englishTitle:(copy-and-paste-in-vim)
//category:(vim,problem,problem-solved)
//tags:(vim)
//createTime:(20200118)
//lastUpdateTime:(20200118)
轉載自本人獨立博客https://liushiming.cn/2020/01/18/copy-and-paste-in-vim/
概述
復制粘貼是文本編輯最常用的功能,但是在vim中復制粘貼還是有點麻煩的,有一點學習成本。本文總結了使用vim復制粘貼的典型場景和使用方法,希望對讀者有幫助。
vim內部復制、粘貼、剪切
選擇文本
- v+光標移動 (按字符選擇)高亮選中所要的文本,然后進行各種操作(比如,d表示刪除)。
- V (按行選擇)
- v+選中的內容+c 更改選中的文字
復制:y(ank)
- y 用v命令選中文本后,用y進行復制
- yy 復制當前行,然后用p進行粘貼
- 5yy 復制從當前行開始的5行
- y_ 等同於yy
- Y 等同於yy
- yw 復制當前單詞
- y$ 從當前位置復制到行尾
- y0 從當前位置復制到行首
- y^ 從當前位置復制到第一個非空白字符
- yG 從當前行復制到文件結束
- y20G 從當前行復制到第20行
- y?bar 復制至上一個出現bar的位置
粘貼:p(aste)
- p(小寫) 在光標位置之后粘貼
- P(大寫) 在光標位置之前粘貼
剪切
- v + 方向鍵(hjkl)選中內容 + d 剪切 + p粘貼
剪貼板
默認剪貼板
vim提供12個剪貼板,它們的名字分別為vim有11個粘貼板,分別是0、1、2、...、9、a、“。如果開啟了系統剪貼板,則會另外多出兩個:+和*。使用:reg命令,可以查看各個粘貼板里的內容。
:reg
在vim中簡單用y只是復制到“(雙引號)粘貼板里,同樣用p粘貼的也是這個粘貼板里的內容。
復制和粘貼到指定剪貼板
要將vim的內容復制到某個粘貼板,需要退出編輯模式,進入正常模式后,選擇要復制的內容,然后按"Ny完成復制,其中N為粘貼板號(注意是按一下雙引號然后按粘貼板號最后按y),例如要把內容復制到粘貼板a,選中內容后按"ay就可以了。
要將vim某個粘貼板里的內容粘貼進來,需要退出編輯模式,在正常模式按"Np,其中N為粘貼板號。比如,可以按"5p將5號粘貼板里的內容粘貼進來,也可以按"+p將系統全局粘貼板里的內容粘貼進來。
系統剪貼板
Vim支持系統剪貼板,需要打開clipboard功能。使用下面的命令,檢查當前版本的Vim,是否支持clipboard。
$ vim --version | grep "clipboard"
-clipboard +insert_expand +path_extra +user_commands
+emacs_tags -mouseshape +startuptime -xterm_clipboard
root@sz ➜ ~ vim --version
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Jun 07 2019 15:35:43)
-clipboard代表不支持+clipboard代表支持。
如果不支持的話,需要安裝gvim或者在編譯的時候開啟系統剪貼板選項。
vim復制到系統剪貼板
"*y"+y"+2yy– 復制兩行{Visual}"+y- copy the selected text into the system clipboard"+y{motion}- copy the text specified by {motion} into the system clipboard:[range]yank +- copy the text specified by[range]into the system clipboard
vim剪切到系統剪貼板
"+dd– 剪切一行
從系統剪貼板粘貼到vim
"*p"+pShift+Insert:put +- Ex command puts contents of system clipboard on a new line<C-r>+ - From insert mode (or commandline mode)
"+p比 Ctrl-v 命令更好,它可以更快更可靠地處理大塊文本的粘貼,也能夠避免粘貼大量文本時,發生每行行首的自動縮進累積,因為Ctrl-v是通過系統緩存的stream處理,一行一行地處理粘貼的文本。
設置vim默認使用系統剪貼板
確定vim支持+clipboard后,如果想y/p直接和系統剪貼板打通,可以在~/.vimrc中加上以下配置):
set clipboard^=unnamed,unnamedplus
其中unnamed代表*寄存器,unnamedplus代表+寄存器。在mac系統中,兩者都一樣;一般在linux系統中+和*是不同的,+對應ctrl + c,ctrl + v的桌面系統剪貼板,*對應x桌面系統的剪貼板(用鼠標選擇復制,用鼠標中鍵粘貼)。
服務器vim復制到本地剪貼板
通過ssh連接到linux服務器時,vim是跑在遠程服務器的,不能使用y復制到本地的剪貼板。這時有幾個方法:
cmd + c
用鼠標選中文字cmd + c復制(windows下ctrl + c復制),cmd + v粘貼到本地。這個方法是最自然的,但是想要用這個方法有幾個前提:
- vim配置中開啟鼠標支持,
.vimrc文件中加上
set mouse=a
- terminal客戶端關閉
mouse reporting選項,否則鼠標點擊vim界面會進入visual模式。參見我這篇文章解決iterm2中vim選中文字不能復制的問題 - 如果使用tmux,tmux需要配置支持鼠標滾輪,否則最多只能復制當前頁面的內容
本地vim通過scp編輯遠程文件
使用本地vim通過scp直接編輯遠程文件。這樣就可以使用本地寄存器"+y"復制了。這種方法對遠程vim配置沒有要求。
vim scp://remoteuser@server.com//absolute/path/to/file
注意com和absolute間是兩個反斜杠//並不是敲錯了。
