目前為止我們已經介紹了幾個最為常用的Vimscript命令,但都跟日常中在normal模式下處理文本的方式無關。 有沒有一種辦法能把我們的腳本跟日常的文本編輯命令結合起來呢?
答案顯然是肯定的。之前我們已經見過`normal`命令,是時候更詳細地介紹它了。 執行下面的命令:
~~~
:normal G
~~~
Vim將把你的光標移到當前文件的最后一行,就像是在normal模式里按下`G`。現在執行下面命令:
~~~
:normal ggdd
~~~
Vim將移動到文件的第一行(`gg`)并刪除它(`dd`)。
`normal`命令簡單地接受一串鍵值并當作是在normal模式下輸入的。就是那么簡單!
## 避免映射
執行下面的命令來映射`G`鍵到別的東西:
~~~
:nnoremap G dd
~~~
現在在normal模式按下`G`將刪除一整行。試試這個命令:
~~~
:normal G
~~~
Vim將刪除當前行。`normal`命令將顧及當前的所有映射。
這意味著我們需要給`normal`提供類似于`nnoremap`之于`nmap`的版本, 否則我們沒法使用它——考慮到我們猜測不了用戶的映射方式。
幸好Vim真的有這樣的命令叫`normal!`。執行這個命令:
~~~
:normal! G
~~~
這次Vim將移動光標到文件底部,即使`G`已經被映射了。
在寫Vim腳本時,你應該_總是_使用`normal!`,_永不_使用`normal`。不要信任用戶在`~/.vimrc`中的映射。
## 特殊字符
如果你使用`normal!`一段時間了,就很可能注意到一個問題。試試下面的命令:
~~~
:normal! /foo<cr>
~~~
第一眼看上去它應該會開始搜索`foo`,但你將看到它不會正常工作。 問題在于`normal!`不會解析像`<cr>`那樣的特殊字符序列。
于是,Vim認為你想要搜索字符串序列"foo",沒有意識到你甚至按下了回車來進行搜索! (譯注:原文為you even pressed return to perform the search! 按后文的意思應該是沒有按下return,待問作者) 我們將在下一章討論如何應對這個問題。
## 練習
閱讀`:help normal`。在最后部分,你將獲得關于下一章主題的提示。
## 附加題
如果你還沒準備好面對挑戰,跳過這一節。如果你夠膽,祝你好運!
重溫`:help normal`關于undo的部分。嘗試設計一個刪除兩行卻能單獨撤銷每次刪除的映射。 建議從`nnoremap <leader>d dddd`開始吧。
這次你并不真的需要`normal!`(`nnoremap`就夠了), 但是它揭示了一點:有時閱讀一個Vim命令的文檔可以激發關于別的內容的奇思妙想。
如果你未嘗使用過`helpgrep`命令,那就是時候用上它了。閱讀`:help helpgrep`。 留心關于怎樣在匹配內容中瀏覽的部分。
暫時先別糾結模式(patterns),我們很快就要談到它們。 現在只需了解你可以用類似`foo.*bar`來查找文檔中包括該正則模式的行。
不幸的是,`helpgrep`會不時給你帶來挫折感,因為為了找到某些詞,你需要懂得去搜索某些詞。 我會幫你省下些無用功,這次你得查找到一種手工修改Vim的撤銷序列的方法, 這樣你映射的兩個刪除才能獨立地撤銷。
在以后你要靈活變通(pragmatic)。有時在你迷惘徘徊的時候,Google一下,你就知道。
- 前言
- 鳴謝
- 預備知識
- 打印信息
- 設置選項
- 基本映射
- 模式映射
- 精確映射
- Leaders
- 編輯你的Vimrc文件
- Abbreviations
- 更多的Mappings
- 鍛煉你的手指
- 本地緩沖區的選項設置和映射
- 自動命令
- 本地緩沖區縮寫
- 自動命令組
- Operator-Pending映射
- 更多Operator-Pending映射
- 狀態條
- 負責任的編碼
- 變量
- 變量作用域
- 條件語句
- 比較
- 函數
- 函數參數
- 數字
- 字符串
- 字符串函數
- Execute命令
- Normal命令
- 執行normal!
- 基本的正則表達式
- 實例研究:Grep 運算符(Operator),第一部分
- 實例研究:Grep運算符(Operator),第二部分
- 實例研究:Grep運算符(Operator),第三部分
- 列表
- 循環
- 字典
- 切換
- 函數式編程
- 路徑
- 創建一個完整的插件
- 舊社會下的插件配置方式
- 新希望:用Pathogen配置插件
- 檢測文件類型
- 基本語法高亮
- 高級語法高亮
- 更高級的語法高亮
- 基本折疊
- 高級折疊
- 段移動原理
- Potion段移動
- 外部命令
- 自動加載
- 文檔
- 發布
- 還剩下什么?