既然已經學了`execute`和`normal!`,我們就可以深入探討一個Vimscript慣用法。 執行下面的命令:
~~~
:execute "normal! gg/foo\<cr>dd"
~~~
這將移動到文件的開頭,查找`foo`的首次出現的地方,并刪掉那一行。
之前我們嘗試過用`normal!`來執行一個搜索命令卻無法輸入必須的回車來開始進行搜索。 結合`execute`和`normal!`將解決這個問題。
`execute`允許你創建命令,因而你能夠使用Vim普通的轉義字符串來生成你需要的"打不出"的字符。 嘗試下面的命令:
~~~
:execute "normal! mqA;\<esc>`q"
~~~
這個命令做了什么?讓我們掰開來講:
* `:execute "normal! ..."`:執行命令序列,一如它們是在normal模式下輸入的,忽略所有映射, 并替換轉義字符串。
* `mq`:保存當前位置到標記"q"。
* `A`:移動到當前行的末尾并在最后一個字符后進入insert模式。
* `;`:我們現在位于insert模式,所以僅僅是寫入了一個";"。
* `\<esc>`:這是一個表示Esc鍵的轉義字符串序列,把我們帶離insert模式。
* ```q``:回到標記"q"所在的位置。
看上去有點繞,不過它真的很有用:它在當前行的末尾補上一個分號并保持光標不動。 在寫Javascript,C或其他以分號作為語句分隔符的語言時,一旦忘記加上分號,這樣的映射將助你一臂之力。
## 練習
重讀`:help expr-quote`(你之前應該看過)來提醒你怎么用`execute`通過轉義字符串傳遞特殊字符給`normal!`。
在翻開下一章之前,放下本書休息一下。吃一個三明治或喝一杯咖啡(譯注:或者茶!), 喂一下你的寵物——如果你有的話。
- 前言
- 鳴謝
- 預備知識
- 打印信息
- 設置選項
- 基本映射
- 模式映射
- 精確映射
- Leaders
- 編輯你的Vimrc文件
- Abbreviations
- 更多的Mappings
- 鍛煉你的手指
- 本地緩沖區的選項設置和映射
- 自動命令
- 本地緩沖區縮寫
- 自動命令組
- Operator-Pending映射
- 更多Operator-Pending映射
- 狀態條
- 負責任的編碼
- 變量
- 變量作用域
- 條件語句
- 比較
- 函數
- 函數參數
- 數字
- 字符串
- 字符串函數
- Execute命令
- Normal命令
- 執行normal!
- 基本的正則表達式
- 實例研究:Grep 運算符(Operator),第一部分
- 實例研究:Grep運算符(Operator),第二部分
- 實例研究:Grep運算符(Operator),第三部分
- 列表
- 循環
- 字典
- 切換
- 函數式編程
- 路徑
- 創建一個完整的插件
- 舊社會下的插件配置方式
- 新希望:用Pathogen配置插件
- 檢測文件類型
- 基本語法高亮
- 高級語法高亮
- 更高級的語法高亮
- 基本折疊
- 高級折疊
- 段移動原理
- Potion段移動
- 外部命令
- 自動加載
- 文檔
- 發布
- 還剩下什么?