Vim 的粘貼複製功能

來源:互聯網
上載者:User

標籤:blog   http   io   os   ar   使用   for   sp   檔案   

Vim作為最好用的文字編輯器之一,使用vim來編文檔,寫代碼實在是很愜意的事情。每當學會了vim的一個新功能,就會很大地提高工作效率。有人使用vim幾十年,還沒有完全掌握vim的功能,這也說明了vim的強大。而這樣何嘗不是一件好事呢,只要有的學習,就有的提高。

最近使用Vim來寫部落格,發現在Vim中粘貼Python代碼後,縮排就全亂了。仔細研究了以下,原來是自動縮排的緣故,於是做如下設定: 

:set noai nosi

取消了自動縮排和智慧縮排,這樣粘貼就不會錯行了。但在有的vim中不行,還是排版錯亂。

後來發現了更好用的設定:

:set paste

進入paste模式以後,可以在插入模式下粘貼內容,不會有任何變形。這個真是灰常好用,情不自禁看了一下協助,發現它做了這麼多事:

  • textwidth設定為0
  • wrapmargin設定為0
  • set noai
  • set nosi
  • softtabstop設定為0
  • revins重設
  • ruler重設
  • showmatch重設
  • formatoptions使用空值

下面的選項值不變,但卻被禁用:

  • lisp
  • indentexpr
  • cindent

怪不得之前只設定noai和nosi不行,原來與這麼多因素有關!

但這樣還是比較麻煩的,每次要粘貼的話,先set paste,然後粘貼,然後再set nopaste。有沒有更方便的呢?你可能想到了,使用鍵盤對應呀,對。我們可以這樣設定::

:map <F10> :set paste<CR>:map <F11> :set nopaste<CR>

這樣在粘貼前按F10鍵啟動paste模式,粘貼後按F11取消paste模式即可。其實,paste有一個切換paste開關的選項,這就是pastetoggle。通過它可以綁定快速鍵來啟用/取消 paste模式。比如::

:set pastetoggle=<F11>

這樣減少了一個快速鍵的佔用,使用起來也更方便一些。

但,這是最方便的嗎?Vimer們對高效的追求永無止境。還有其他更好地方法嗎?

你可能想到了,vim寄存器。對,使用vim寄存器 “+p 粘貼即可。根本不用考慮是否自動縮排,是否paste模式,直接原文傳遞!:

"+p

要說vim寄存器,就要從vim檔案間的複製粘貼說起。

Vim中,若要複製當前行,普通模式下按 yy 即可,在要粘貼的地方按 p 。這是vim將複製內容儲存到了自己的寄存器中的緣故。如果在其他地方執行yy,新的內容將覆蓋掉原寄存器中內容。如果想儲存原寄存器中內容而同時增加新的內容呢?這時就要在yy前增加標籤了。標籤以雙引號開始,跟著的是標籤名稱,可以是數字0-9,也可以是26個字母,然後就是複製操作,這樣就把複製內容儲存到該標籤寄存器裡。通過下面命令顯示所有寄存器內容::

:reg

其中注意兩個特殊的寄存器:”* 和 “+。這兩個寄存器是和系統相通的,前者關聯絡統選擇緩衝區,後者關聯絡統剪下板。通過它們可以和其他程式進行資料交換。

備忘:

若寄存器列表裡無”* 或 “+ 寄存器,則可能是由於沒有安裝vim的圖形介面所致。Debian/Ubuntu下可以通過安裝vim-gnome解決。

$ sudo apt-get install vim-gnome

選擇緩衝區和系統剪下板啥子區別?讓我們繼續研究。

選擇緩衝區和剪下板

不同於Windows,Linux系統裡存在兩個剪下板:一個叫做選擇緩衝區(X11 selection buffer),另一個才是剪下板(clipboard)。

選擇緩衝區是即時的,當使用滑鼠或鍵盤選擇內容時,內容已經存在於選擇緩衝區了,這或許就是選擇緩衝區的由來吧。

使用下面的命令查看選擇緩衝區的內容::

$ xclip -out

如果沒有xclip命令,Debian/Ubuntu下可以通過如下命令安裝::

$ sudo apt-get install xclip

可以使用滑鼠中鍵或鍵入Shift+Insert來粘貼選擇緩衝區的內容。但對於有些GUI程式,比如gedit,只能通過滑鼠中鍵調用選擇緩衝區的內容,使用Shift+Insert的話,調用的是剪下板的內容。

剪下板和Windows的剪下板類似,在選擇文字內容後,執行Ctrl + c或在菜單裡選擇‘複製’的話,這時內容才存放到剪下板裡。

使用下面的命令查看剪下板的內容::

$ xclip -out -sel clipboard

而使用剪下板的內容,則是Ctrl+v。 但在有些情況下,比如gnome-terminal,不能直接使用Ctrl+c,Ctrl+v,這時就要用Shift+Ctrl+c,Shift+Ctrl+v代替。

原格式粘貼

好了,瞭解了選擇緩衝區和剪下板,下面就是實現保留格式粘貼的完美解決方案:

  • 方案一:
  1. 選擇常值內容
  2. vim普通模式下按 “*p 將選擇緩衝區中內容粘貼進來
  • 方案二:
  1. 複製檔案內容
  2. vim普通模式下按 “+ p 將剪下板內容粘貼進來

這時,如果要複製的內容也是vim編輯器中的內容,那麼如何複製才更方便呢?

vim中的複製

vim有一個可視模式(Visual Mode),在此模式下可以選擇地區。可以在普通模式下鍵入v進入可視模式,也可以個人化一點,鍵入V進入行可視模式,或者鍵入Ctrl+v進入列可視模式。這時移動游標就可以選擇內容了。注意這時被選內容已經即時儲存於選擇緩衝區了,當然你也可以鍵入”+y將此內容也儲存到剪下板裡,或者”ay將內容儲存到標籤為a的寄存器中。但要知道,只有前兩個中的內容可以在其他程式中使用,而a寄存器中的內容只能在該vim編輯器內使用。

也可以通過滑鼠來複製。這裡首先要開啟滑鼠模式。:

:set mouse=a

這樣在普通模式下可以直接使用滑鼠選擇地區複製到選擇緩衝區。但這種情況下不能複製到剪下板。

若要使用滑鼠複製內容到剪下板,則需要做如下設定::

:set mouse=v

這種情況下,除了可以像上面一樣直接使用滑鼠選擇地區複製到選擇緩衝區以外,還可以在右鍵菜單中選擇“複製”來儲存到剪下板裡。但新問題又出來了。若顯示行號,也會將行號一併選擇。你會想到,這好辦呀,如果不需要行號的話,在複製前,先執行set nonu來取消行號顯示唄。

其實沒必要這樣,如果不需要複製行號的話,用在可視模式下用鍵盤來選擇不就可以嗎?

並且,從上面的討論,我們不難得出,使用選擇緩衝區比使用剪下板要方便的多,可以節省很多步驟。

所以,最終我們得到了vim檔案間複製粘貼的完美方案,檔案傳輸的中轉使用選擇緩衝區。

vim檔案間複製粘貼完美方案
  1. 在~/.vimrc中增加如下一行::

    set mouse=v
  2. 複製內容到選擇緩衝區。

    • 帶行號時,使用滑鼠選擇內容地區。
    • 不要行號,使用 “*yny 複製n行或可視模式下選擇。
  3. 將選擇緩衝區中內容粘貼到vim檔案:普通模式下按 “*p 。

補充:

設定vim中預設使用選擇緩衝區寄存器 “*:

set clipboard = unnamed

則可以直接通過y,p和系統選擇緩衝區進行資料交換。

(原文地址: http://blog.ossxp.com/2010/12/2190/)

Vim 的粘貼複製功能

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.