映射map
回憶上次縮寫的細節
- 這次瞭解到了
:abbrivate
縮寫 -
可以定義縮寫
:ab o1z oeasy
- 這裏面還可以包括方向鍵、回車鍵之類的東西
-
可以定義到指定的模式
iab
cab
-
查看縮寫
:ab
- 所有的:ab o1z
- o1z
-
自動補全
- ctrlp
- ctrln
-
這些縮寫都可以保存在視圖裏
- 保存的選項在
viewoption
中
- 保存的選項在
- 可以保存的除了
縮寫abbreviate
還有個映射map
映射map
什麼意思呢?🤔
關於映射
- 映射就是
map
- 比如按下什麼什麼就相當於按下什麼什麼之類的
- 系統裏面有
- 比如mac系統中修飾鍵設置的第一條
- 把 CapsLock 映射到 Esc
- 這樣大寫鎖定就失效了
- 但是小拇指左移一下就可以按下Esc
- 超級方便
- 再也不用 ctrl+c 了
- 做實驗的時候也好使
- 只要是按下CapsLock
- 就相當於按下Esc
- 這就是 映射
map
建立映射 - mapping
-
快速進入命令模式
:map ; :
- 把
;
映射成:
- 這樣我們就可以不用摁下shift
- 直接通過小拇指就可以進入命令模式了
- 還是很方便的
map 映射
- 我們可以使用
-
:map Y y$
定一個映射map
是命令的名字Y
是被映射的鍵y$
是映射到的鍵
- 從此按下
Y
,就相當於y$
-
我們來試一下
- 在行的中間位置,按下Y
:reg
觀察默認寄存器
- 現在複製的是從光標到結尾
- 我想要的是一整行,怎麼辦呢?
重新映射
-
:map! Y 0y$
定一個映射map
是命令的名字Y
是被映射的鍵0y$
是映射到的鍵
- 可是我現在命令模式下只要Y就自動變成
0y$
- 但是其實我們主要需要映射正常模式下的;
- 能否強調這一個點呢?
不同模式
-
不同模式有不同的映射map命令
:map
所有模式:vmap
可視化模式 visual:nmap
正常模式 normal:omap
operartor-pending 被定義的鍵可以作爲一個motion來使用:map!
插入和命令行模式:imap
插入模式 insert:cmap
命令行模式 command
- 這樣我們可以知道
-
:nmap ; :
- 在正常模式下把;換成:
- 這樣也就快速進入了命令模式
- 不過這樣在normal模式下;就不好用了
- ;在normal模式下做什麼用的呢?
原始定義
:h ;
- 原來是重複行內查找的
- 直接這樣的話,原來的功能就不能用了
- 我想要取消映射map
- 應該怎麼辦呢?
- 我想先看看都有哪些映射
查看所有映射map
- 我們可以找到這個map映射關係
- 然後想要取消映射
- 去哪裏找呢?
- 解鈴換需繫鈴人
取消映射map
- 就和
:ab
、:una
一樣 -
:map
也有自己的:unmap
:unmap ;
- 這樣就恢復了原來的行內替換
- 從
;
到:
的映射消失了
我們再試試Y
-
定義Y並驗證
:nmap Y y$
:reg "
-
重新定義Y
:nmap Y 0y$
:reg "
觀察映射
:map
可以觀察所有已經存在的映射
- 第一列是模式
- 第二列是映射觸發鍵
- 第三列是映射對應處理方式
-
如果我們想查看插入模式下;對應什麼操作
:imap ;
:nmap Y
- Q進入Ex命令模式
映射爲空
-
還記得我們取消方向鍵的操作嗎?
:map <LEFT> <nop>
:map <UP> <nop>
:map <RIGHT> <nop>
:map <DOWN> <nop>
-
<nop>就是什麼都不做
- 對應No Operation Performed
- 這原來是一條彙編指令,指令着讓cpu空輪一個週期
-
但是我們現在想想
- 我們爲什麼要禁掉方向鍵?
- 是爲了讓手放在覈心區不動
- 但是這指的是Normal模式
- 如果是命令模式,我們怎麼辦?
- 我們需要方向鍵控制光標左右運動
- 也需要shift或ctrl配合方向鍵控制光標快速移動
- 也就是說Normal模式方向鍵不做任何事,Command模式下還可以用
-
所以
:nmap <LEFT> <nop>
:nmap <UP> <nop>
:nmap <RIGHT> <nop>
:nmap <DOWN> <nop>
- 但是如果我們這樣的話
- 縮寫sysout是否就不能順利完成了呢?
驗證
:map <left> <nop> :set nopaste :ab sysout System.out.println("");<left><left><left>
- 然後在插入模式下輸入sysout空格
- 還是可以自動變成複雜的格式的System.out.println("");
奇怪的腦洞
- 如果我
:map j k :map k j
- 會發生什麼?
- 那麼這個東西如何處理呢?
取消重複映射
:noremap j k :noremap k j
- 這樣就把j、k真的對調了
取消重複縮寫
- 試了一下
- 並沒有發現重複縮寫的可能性
- 不過ab的替換結果可能會觸發map
:set nopaste :ab @a ad :imap ad adder
- 然後在插入模式下@a
- 通過ad就變成了adder
- 所以有的時候ab也需要noreab
歧義
-
我們定義了兩個映射
:map aa oeasy
:map aaa o2z
- 這個時候我們輸入aa會如何?
- 試一下
- 輸入aa之後他會等待
-
如果下一個是Space或者CR
- 那麼對應
oeasy
- 那麼對應
-
如果下一個是a
- 那麼對應
o2z
- 那麼對應
- 這種map映射和縮寫abbreviate很像啊
- 縮寫就很像是插入模式下的一種特殊的映射
- 不過兩者還是有不同的
- 兩者有什麼不同呢?
比較映射和縮寫
-
不同點
-
側重模式不同
- 縮寫abbreviate側重於輸入(對應插入和命令行模式)
- 映射map可以存在於更多模式
-
觸發條件不同
- 縮寫在插入模式下按回車或者空格或tab就可以觸發
- 映射要自己定義對應的按鍵
-
效果不同
- 縮寫就是把縮寫形式補全成完整形式,原縮寫形式消失
- 映射可以做更多的操作,比如複製粘貼之類的編輯操作
-
-
相同點
- 首先他們都是爲了快速輸入和操作而存在的
-
他們都可以取消重複
noremap
noreabbrev
總結
- 這次瞭解到了
:map
映射 -
可以定義映射
:map ; :
-
查詢映射
:map
:map ;
-
還可以取消映射
:unmap
-
可以映射到指定的模式
:map
所有模式:vmap
可視化模式 visual:nmap
正常模式 normal:omap
operartor-pending 被定義的鍵可以作爲一個motion來使用:map!
插入和命令行模式:imap
插入模式 insert:cmap
命令行模式 command
-
可以映射到什麼也不做
:nmap h <nop>
-
還可以避免再次映射
:noreabbrev o1z oeasy
-
最後我們比較了縮寫和映射的異同
- 這
縮寫
和映射
都是可以:mkview
保存的 - 也可以寫到
~/.vimrc
作爲基礎映射 - 還可以寫到具體的
filetype
中做一些專門的操作
- 這
-
但是其實101鍵盤上面很多功能鍵
- f1-f12
- 我們還沒有用上
- 可以給他們映射上麼?🤔
- 下次再說!
[Github地址] (https://github.com/overmind1980/oeasyvim)
[Gitee地址] (overmind1980/oeasyvim)
[藍橋實驗樓 邀請碼FJWYIMGB] (oeasy 教您零基礎玩轉編輯神器 Vim_Linux 藍橋雲課)