Chinaunix首页 | 论坛 | 博客
  • 博客访问: 430170
  • 博文数量: 114
  • 博客积分: 3361
  • 博客等级: 中校
  • 技术积分: 1060
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-18 13:14
文章分类

全部博文(114)

文章存档

2012年(1)

2011年(84)

2010年(29)

分类: LINUX

2010-05-19 13:59:35

在這個系列的開始沒多久,我們就先談了 vim 有一個選擇模式,可以透過 大小寫的 V 或是 來作選擇,因應這三種方式的不同而有不同的行為。

選擇反白區域可以 vim 使用游標移動的方法

在談時,我們提到可以選擇要刪除的區域。如果你使用的是小寫「v」,那配合,你可以作更複雜的選取方式。甚至你可以進入選取模式後使用「 / 」和「n」的組合更快速選到你想到的區域去。

從之前對,你大概依稀還記得這三個的差異,不過你可能會問:我選了這塊區域能做什麼?

剪剪貼貼?

但是除此之外,我也可以把這些反白的區域存起來。一種存法是像在 windows 一樣,放在系統的「剪貼簿」上,另外一種就是透過 vim 的暫存器。舉例來說,如果我想要搬移一段程式碼,像下圖這段程式碼(程式碼是引 Spam Karma 2):

vim visual select with % sign example

我可以用小寫「v」先進入選擇模式把 function 選擇起來之後,把游標移動到「 { 」這個符號上:

vim visual select with % sign initial

按一下「%」就會發現我們所要的這整個 function都已經反白了:

vim visual select with % sign select ok

這時候就可以再按「 “ax 」 把整段程式碼剪下並貼到到暫存區 a 去。

在 visual mode 一般的選取模式下, x 代表的就是刪除。而前面加上 “a 就是告訴 vim 刪除下來的東西要放一份到 a 這個暫存器裡面(以「”」就表示現在是要對暫存器做動作)。不過事實上,只要你是刪除的動作,都預設會放到 “0,也就是數字鍵 0 這個暫存器裡面。所以透過上述的動作我們的暫存器 0 和 a 就會被放入一模一樣的資料。但是如果你要用的複製的話,就是「 “ay 」,y 代表 yank 的意思,就是把反白的部分,「拖拉」進「 “a 」(指暫存器 a )的意思。

那當你要用的暫存器裡面的內容時,以使用暫存器 a 裡面的資料來說,在非編輯模式下可以用「 “ap 」(put),代表放出來的意思。比方說你可以把游標移到你想要貼上的位置,按下「”ap」就會把暫存器 a 裡面的內容貼到游標位置所在之後的位置上去。如果是要貼到游標位置之前的話,就得用大寫「 “aP」。

多行併成一行

上面這兩種功能可以說是一般編輯器都會具備的東西。不過對於 vim 這個選取模式我除了用來做刪除、複製貼上之外,最常用的功能大概就是拿來把中文分成好幾行的部分合成一行。因為有時候中文的純文字文件為了閱讀方便,會訂出一個邊界,或是根據標點來斷行,超過邊界/碰到標點符號就會按< Enter>把該行斷開。就像下圖:

vim visual selection cascade

但是如果你想要把這個東西丟進 HTML 或是像裡面來編輯的話,可能最後展現出來的樣子就會發現它斷得莫名其妙。這時候以前你會做的方式可能會是一行一行接起來。不過我們既然用的是 vim,你有理由省下更多的力氣。

我們可以把我們想要合併的區域先選取起來,然後按「gJ」,就會合成下面這個樣子:

vim visual selection cascade

其實本來是可以用 J 就可以了,但是中文的連接上你會希望字與字之間不要放空白,所以就要用 「gJ」告訴 vim 不要放空白。如果你用的是英文文件,英文 word 和 word 之間需要空白分開的話,就可以用 J 來加入空白。

附帶提一下,如果你的文件之間的段落只是用連續的 分開,而你想要把所有的這些段落都合在一起,不想要用 visual mode 一段一段選的話,可以用這個命令:

:g/^.\{1,}$/,/^$/join!

這樣就會把每個段落都合成一行了。最後面的 「join!」就是告訴 vim,在/^.\{1,}$/ 和 /^$/ 之間的段落,通通都要合在一起(join),後面再補一個「!」就表示合併的時候不要使用空白。至於/^.\{1,}$/是「^」一行的開頭跟上「 . 」任意的字元「\{1,}」有一個以上並「$」結束的意思,而 /^$/ 表示開頭和結尾之間沒有任何字元。

又如果你想要的是整份文件全部合成一行,那更簡單,在命令模式下打:

ggVGgJ (中文模式)

ggVGJ (英文模式)

gg 是回到第一行(現在在命令模式), V 是以行的方式來選取(轉換到選取模式),G 跑到最後一行(選取模式的游標移動方式),gJ 把選取的地方合併起來(以選取的範圍來執行命令)。

程式縮排

但是如果你從外面剪了一段程式進來,結果不合你原來排版內縮的方式,一個方法是你可以一行一行改,另外一個方式就是用 vim 的選取模式幫你。

比方說我們去外面剪了一段 code 進來,貼上之後程式變成這樣,後面的部分都凸出來了:

vim visual mode shift width

不過,這一點都沒關係,我們用的可是 vim 呢!我們可以把凸出來的部分選起來之後,然後按「>」把它縮進去。你可以同樣的動作多作幾次,或是直接指定縮進去幾個 shiftwidth(這部分有興趣請先自行 :h shiftwidth)。像我把 shiftwidth 設定為 2 ,而這程式碼凸出來六個位置,那我就可以選取之後用「3>」把它縮到原來的排版上,同時 vim 也會顯示像這樣的訊息:12 行 > 過 3 次。同理,要凸出來的話,就是用「< 」,很直覺吧?

選取模式的奇技淫巧

關於這個選取模式,DK長輩倒跟我講了件事情,雖然我沒用過,但是DK長輩推薦,我也在這邊介紹一下。

比方說如果你想要在一段文字的某地方加入固定的文字,比方說文字長成這樣:

vim visual block example

我想要在每行的中間加上「I LOVE VIM」的話怎麼作?

我可以把游標移到第一行的第一個字,然後使用 進入到 visual block 模式並選取到想要插入的位置:

vim visual block insert

然後按大寫「A」(append),如果你是想在每行的行首加入則用大寫「I」。再來就輸入剛剛說的字串「I LOVE VIM」,打好之後按 ,就會變成這個樣子:

vim visual block insert OK

你如果覺得 vim 怎麼會連這個都做,會不會太神奇了一點?那也許你可以參考一下廖董的文章< vim 走迷宮 >,誠如廖董說的「自從我知道 vim 可以走迷宮還有玩俄羅斯方塊以後,再也沒有什麼可以嚇倒我了 !!」

關於 visual mode 相關指令的詳細資料可以參考:

:h visual-index

阅读(3243) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~