閱讀706 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Vim技能修煉教程(5) - 操作符實務

操作符實務

操作符複習

上次我們講了操作符與文本對象的組合這樣一個vim的強大功能。但是上節的知識點過於密集,可讀性可能差了一點。不過沒關係,重要的知識點在後麵用到的時候我們可以先複習一下。

我們還是先複習操作符。上節說過了,vi的方式是{操作符}{次數}{移動命令},代表例子就是d2w,刪除兩個單詞。
vim將其擴展成了文本對象,有aw, iw, as, is, ap, ip, a], a[, i[, i]等一係列。

我們舉幾個小例子說明文本對象的用法:
比如有這樣一段代碼:

void main(int argc,char* agrv[])

光標在括號內,我們輸入"yi(",得到的是"int argc,char* agrv[]", 如果是"ya(",複製的將是"(int argc,char* agrv[])"
"i("與"a("的區別是,"a("會包含括號本身,而"i("不含括號內容。

再舉個例子,我們用下搜索來定位:

    return 0;

我們要複製不帶分號的"return 0",可以這麼寫『^yt;』

定製操作符

既然操作符這麼有用,我們可以嚐試來定製它。這個定製功能,叫做Operator-pending mapping.

首先我們可以定製文本對象,也就是移動的命令。

我們看一個簡單的例子,比如用p來代表剛才我們用的"i(",因為"i("是兩個字符,而且括號還是個組合鍵。

:onoremap p i(

使用onoremap而不是omap的原因,是為了防止map產生遞歸定義。

我們看一下官方文檔中的例子:

onoremap <silent> F :<C-U>normal! 0f(hviw<CR>

F是按鍵。我們可以將其換成 F或者直接是"ah("之類的。
我們照抄就好,是為了防止Vim自動給我們自動添加些私貨。
normal!後麵我們還會學習,它是用於執行正常模式下的命令。

前麵的都是例行公事,後麵才是真正需要我們開發的命令組合:0f(hviw
0是移動到行首,還記得吧,如果要是移到行首非空字符是^。
"f("是向後搜索到第一個左括號,h是左移一個字符,viw是在visual模式下選中一個單詞,會退出visual模式

綜上,上麵的命令就是選中一個左括號左邊的一個完整單詞。

但是,還有一個問題,normal!命令沒法處理轉義字符和特殊字符。如果遇到這種情況,我們需要用execute命令再把normal包裝一下。
最簡單的情況就是對於的處理。在搜索中,是經常需要的輸入。但是,在normal命令中是不會處理為回車的,而是當成四個字符。
我們隻好再加點料,把特殊字符字符串先傳給execute命令:

onoremap <silent> F :<C-U>execute "normal! 0f(hviw<CR>"

execute命令是會處理特殊字符和轉義的,當它執行 normal!的時候,後麵的已經正確轉義了。normal!就可以正確運行了。

最後更新:2017-07-10 11:32:08

  上一篇:go  CentOS6.7配置軟raid5(模擬故障增加硬盤)
  下一篇:go  阿裏雲“盤古”是如何打造的? — 盤古底層架構及塊存儲技術解析