轉:http://www.cnblogs.com/jianyungsun/archive/2011/03/19/1988855.html
這是我的vim配置文件:jeffy-vim-v2.4.tar
添加了ctrl+c和ctrl+v,實現與系統剪貼板的交互,添加了F12在paste和nopaste之間切換。
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
nmap <C-v> "+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代替。
原格式粘貼
好了,了解了選擇緩沖區和剪切板,下面就是實現保留格式粘貼的完美解決方案:
- 方案一:
- 選擇文本內容
- vim普通模式下按 “*p 將選擇緩沖區中內容粘貼進來
- 方案二:
- 復制文件內容
- 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文件間復制粘貼完美方案
-
在~/.vimrc中增加如下一行::
set mouse=v
-
復制內容到選擇緩沖區。
- 帶行號時,使用鼠標選擇內容區域。
- 不要行號,使用 “*yny 復制n行或可視模式下選擇。
-
將選擇緩沖區中內容粘貼到vim文件:普通模式下按 “*p 。
補充:
設置vim中默認使用選擇緩沖區寄存器 “*:
set clipboard = unnamed
則可以直接通過y,p和系統選擇緩沖區進行數據交換。
======================================================================================
這個問題的原因應該是你的vim修改了配置文件,增加了下面這一句
set mouse=a;
vi的三種模式:命令模式,插入模式,可視模式.鼠標可以啟動於各種模式中:
The mouse can be enabled for different modes:
n Normal mode
v Visual mode
i Insert mode
c Command-line mode
h all previous modes when editing a help file
a all previous modes
r for |hit-enter| and |more-prompt| prompt
加了這句后,在vim中就開啟了在所有模式下的鼠標右鍵功能,這樣就屏蔽了鼠標右鍵的復制功能
我在網上看了大部分人的解決辦法都是注釋掉set mouse=a這句或者將其值賦為空,這樣確實可以用右鍵復制了,但是下次vim寫代碼時就沒有鼠標點哪光標到哪的功能了。所以這個方法還不是一個很好的解決方法。
其實在vim里面可以通過其自帶的寄存器(通俗點就是剪切板)功能來實現我們需要的復制功能。
我們可以在vim下面選中一段文字(需退出編輯模式) 然后輸入y,這樣就把當前選中的文字復制到vim的臨時寄存器(*號寄存器)中了,再在我們需要粘貼的地方輸入“*p就可以將臨時寄存器中的內容粘貼進來(也可以直接按鼠標中鍵)。我們可以通過:reg命令查看寄存器中的內容。
補充:
如果輸入”1y 就是將選中的內容復制到1號寄存器,”2y就是將內容復制到2號寄存器,粘貼“寄存器號p,例如:”1p,“2p;其中有兩個寄存器比較特殊,一個是*,另一個是+,*也就是我們上面說的寄存器,在選中文字的情況下,直接按y,默認復制到*寄存器。
下面我們來說這個+寄存器,當我們需要將vim里面的內容復制到別的地方時,假如是word中,就不能通過”1p將寄存器復制到word下面,因為word沒有1號寄存器這種東西,它只是在vim下存在,這時我們就需要用到+寄存器了,因為+寄存器是和系統剪貼板相通的,也就是復制到#號剪貼板的內容也會同時存在與系統剪切板內,這下,我們可以通過“+y現將內容復制到系統剪切板上,然后直接在word里面右鍵粘貼或者ctrl+v就行了。
=======================================================================================
鼠標事件有兩種處理方式,程序處理和 X 處理。
如果 X 負責處理,則是左鍵選擇,中間粘貼。
要讓 vim 中由 X 負責處理,有兩個方法:
1. 按住 shift 鍵,然后選擇,此時由 X 處理該選擇,copy 選項就 enable 了。如果放掉shift鍵,則由 vim 處理該選擇。
2. 在 .vimrc 中設置 set mouse= (就是說清空),此時vim永遠不再干涉鼠標選擇,永遠把處理權交給 X,這個時候鼠標就處於無模式編輯狀態, 當然也能用鼠標來切換vim里面的tab窗口了,vim中的編輯光標也不會跟隨鼠標了。
====================================================================================
shift+v然后選中幾行之后,在當前模式下輸入:"+y ,然后就可以粘貼到其他系統中了。
Note
注意
上面輸入的是:引號 加號 y
不過這不夠快捷,於是想到不如綁定一個快捷鍵,在vim中有以下幾種按鍵綁定的模式:
Note
鍵盤映射模式
- map : 正常模式,可視化模式和運算符模式可用
- nmap :正常模式可用
- vmap :可視化模式可用
- omap :運算符模式可用
- map! :插入模式和命令行模式可用
- imap :插入模式可用
- cmap :命令行模式可用
因此,我只需要用vmap來綁定我要用的快捷鍵,綁定了ctrl+c:
vmap <c-c> "+y
這樣就可以在vim里寫博客,然后復制出來了。