上一章中我們談論了如何在Vim中映射按鍵。我們使用的命令`map`在normal模式下工作。 如果閱讀本章之前你自己已經折騰了,可能會注意到這個映射在visual模式一樣工作。
你可以使用`nmap`、`vmap`和`imap`命令分別指定映射僅在normal、visual、insert模式有效。
執行如下命令:
~~~
:nmap \ dd
~~~
在normal模式下,按下`\`。Vim會刪除當前行。
現在進入Visual模式,再次按下`\`。什么都不會發生,因為我們告訴了Vim這個映射僅在normal 模式下工作(同時`\`的默認行為是什么都不做)。
運行如下命令:
~~~
:vmap \ U
~~~
進入visual模式并選中一些文字,按下`\`。Vim將把選中文本轉換成大寫格式。
分別在normal模式和visual模式測試`\`按鍵,注意不同模式下的效應。
## 增強記憶
起初,將同樣的按鍵根據當前模式的不同映射到不同的功能聽起來很可怕。為什么每次按下 那個鍵之前都要停下想想我們現在是在什么模式?那樣是不是更浪費時間?
實踐中我們發現那真不是個問題。一旦你經常使用Vim,你就不會在意你按下的鍵了。 你會想“刪除一行”,而不是“按`dd·”。你的手指和大腦都會記住你的映射,潛意識中你就會 按下那些映射按鍵。
## insert模式
現在我們已經知道如何在normal模式和visual模式下映射按鍵。現在我們談談insert模式下的 映射方法。運行如下命令:
~~~
:imap <c-d> dd
~~~
你可能猜想這個命令的作用是在insert模式下通過按鍵`Ctrl+d`刪除整行。這個映射很實用, 因為你不必每次都要為了刪除某些行而切回到normal模式。
好的我們試一下。它并不如我們想象那般工作,而僅僅是在文件中添加了兩個`d`字符! 它壓根就沒用。
問題就在于Vim只按我們說的做。這個例子中,我們說:“當我按下`<c-d>`時,相當于我 按了兩次`d`”。而當你在insert模式下,按下兩次`d`的作用就是輸入兩個字符`d`。
要想讓這個映射按我們的期望執行,我們需要更加明確的指令。修改映射并運行如下命令:
~~~
:imap <c-d> <esc>dd
~~~
`<esc>`告訴Vim按下ESC按鍵,即退出insert模式。
現在再試試這個映射。它能夠正常工作,但是注意你是如何回到normal模式的。這是因為我們 告訴Vim`<c-d>`要退出insert模式并刪除一行,但是我們沒有告訴它再回到insert模式。
運行如下命令,修復映射問題:
~~~
:imap <c-d> <esc>ddi
~~~
結尾的`i`告訴Vim進入insert模式,至此我們的映射才最終完成。
## 練習
設置一個映射,當你在insert模式時,可以通過按下`<c-u>`將當前光標所在的單詞轉換成 大寫格式。每次我寫一個類似`MAX_CONNECTIONS_ALLOWED`這樣很長的常量時都能感覺到這個 映射的實用性。因為這樣我就可以以小寫的格式敲寫常量,然后用這個映射將其轉成大寫, 不必一直需要按著shift鍵。
將那個映射添加上到你的`~/.vimrc`文件中。
設置一個映射,當你在?_normal_?模式時,可以通過按下`<c-u>`將當前光標所在的單詞轉換成 大寫格式。這個映射和上面那個有點區別,因為你必須要進入normal模式,也不需要結束時 切到insert模式。
將那個映射添加上到你的`~/.vimrc`文件中。
- 前言
- 鳴謝
- 預備知識
- 打印信息
- 設置選項
- 基本映射
- 模式映射
- 精確映射
- Leaders
- 編輯你的Vimrc文件
- Abbreviations
- 更多的Mappings
- 鍛煉你的手指
- 本地緩沖區的選項設置和映射
- 自動命令
- 本地緩沖區縮寫
- 自動命令組
- Operator-Pending映射
- 更多Operator-Pending映射
- 狀態條
- 負責任的編碼
- 變量
- 變量作用域
- 條件語句
- 比較
- 函數
- 函數參數
- 數字
- 字符串
- 字符串函數
- Execute命令
- Normal命令
- 執行normal!
- 基本的正則表達式
- 實例研究:Grep 運算符(Operator),第一部分
- 實例研究:Grep運算符(Operator),第二部分
- 實例研究:Grep運算符(Operator),第三部分
- 列表
- 循環
- 字典
- 切換
- 函數式編程
- 路徑
- 創建一個完整的插件
- 舊社會下的插件配置方式
- 新希望:用Pathogen配置插件
- 檢測文件類型
- 基本語法高亮
- 高級語法高亮
- 更高級的語法高亮
- 基本折疊
- 高級折疊
- 段移動原理
- Potion段移動
- 外部命令
- 自動加載
- 文檔
- 發布
- 還剩下什么?