一文搞懂vim複製粘貼

轉載自本人獨立博客https://liushiming.cn/2020/01/18/copy-and-paste-in-vim/html

概述

複製粘貼是文本編輯最經常使用的功能,可是在vim中複製粘貼仍是有點麻煩的,有一點學習成本。本文總結了使用vim複製粘貼的典型場景和使用方法,但願對讀者有幫助。linux

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個粘貼板,分別是012...9a。若是開啓了系統剪貼板,則會另外多出兩個:+*。使用:reg命令,能夠查看各個粘貼板裏的內容。vim

:reg

在vim中簡單用y只是複製到(雙引號)粘貼板裏,一樣用p粘貼的也是這個粘貼板裏的內容。windows

複製和粘貼到指定剪貼板

要將vim的內容複製到某個粘貼板,須要退出編輯模式,進入正常模式後,選擇要複製的內容,而後按"Ny完成複製,其中N爲粘貼板號(注意是按一下雙引號而後按粘貼板號最後按y),例如要把內容複製到粘貼板a,選中內容後按"ay就能夠了。緩存

要將vim某個粘貼板裏的內容粘貼進來,須要退出編輯模式,在正常模式按"Np,其中N爲粘貼板號。好比,能夠按"5p將5號粘貼板裏的內容粘貼進來,也能夠按"+p將系統全局粘貼板裏的內容粘貼進來。bash

系統剪貼板

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或者在編譯的時候開啓系統剪貼板選項。dom

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
  • "+p
  • Shift+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處理,一行一行地處理粘貼的文本。ssh

設置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間是兩個反斜槓//並非敲錯了。

參考連接

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個粘貼板,分別是012...9a。若是開啓了系統剪貼板,則會另外多出兩個:+*。使用: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
  • "+p
  • Shift+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間是兩個反斜槓//並非敲錯了。

參考連接

相關文章
相關標籤/搜索