oeasy教您玩轉(zhuǎn)vim - 73 - # 映射map
映射map
回憶上次縮寫(xiě)的細(xì)節(jié)
這次了解到了
:abbrivate
縮寫(xiě)可以定義縮寫(xiě)
:ab o1z oeasy
這里面還可以包括方向鍵、回車(chē)鍵之類(lèi)的東西
可以定義到指定的模式
iab
cab
查看縮寫(xiě)
:ab
- 所有的:ab o1z
- o1z自動(dòng)補(bǔ)全
ctrlp
ctrln
這些縮寫(xiě)都可以保存在視圖里
保存的選項(xiàng)在
viewoption
中可以保存的除了
縮寫(xiě)abbreviate
還有個(gè)映射map
映射map
什么意思呢???
關(guān)于映射
映射就是
map
比如按下什么什么就相當(dāng)于按下什么什么之類(lèi)的
系統(tǒng)里面有

比如mac系統(tǒng)中修飾鍵設(shè)置的第一條
把CapsLock映射到Esc
這樣大寫(xiě)鎖定就失效了
但是小拇指左移一下就可以按下Esc
超級(jí)方便
再也不用ctrl+c了
做實(shí)驗(yàn)的時(shí)候也好使
只要是按下CapsLock
就相當(dāng)于按下Esc
這就是 映射
map
建立映射 - ?mapping
快速進(jìn)入命令模式
:map ; :
把
;
映射成:
這樣我們就可以不用摁下shift
直接通過(guò)小拇指就可以進(jìn)入命令模式了
還是很方便的

map 映射
我們可以使用
:map Y y$
定一個(gè)映射map
是命令的名字Y
是被映射的鍵y$
是映射到的鍵從此按下
Y
,就相當(dāng)于y$
我們來(lái)試一下
在行的中間位置,按下Y
:reg
觀察默認(rèn)寄存器現(xiàn)在復(fù)制的是從光標(biāo)到結(jié)尾
我想要的是一整行,怎么辦呢?
重新映射
:map! Y 0y$
定一個(gè)映射map
是命令的名字Y
是被映射的鍵0y$
是映射到的鍵可是我現(xiàn)在命令模式下只要Y就自動(dòng)變成
0y$
但是其實(shí)我們主要需要映射正常模式下的;
能否強(qiáng)調(diào)這一個(gè)點(diǎn)呢?
不同模式
不同模式有不同的映射map命令
:map
所有模式:vmap
可視化模式 visual:nmap
正常模式 normal:omap
operartor-pending 被定義的鍵可以作為一個(gè)motion來(lái)使用:map!
插入和命令行模式:imap
插入模式 insert:cmap
命令行模式 command這樣我們可以知道
:nmap ; :
在正常模式下把;換成:
這樣也就快速進(jìn)入了命令模式
不過(guò)這樣在normal模式下;就不好用了
;在normal模式下做什么用的呢?
原始定義
:h ;

原來(lái)是重復(fù)行內(nèi)查找的
直接這樣的話,原來(lái)的功能就不能用了
我想要取消映射map
應(yīng)該怎么辦呢?
我想先看看都有哪些映射
查看所有映射map

我們可以找到這個(gè)map映射關(guān)系
然后想要取消映射
去哪里找呢?
解鈴換需系鈴人
取消映射map

就和
:ab
、:una
一樣:map
也有自己的:unmap
:unmap ;
這樣就恢復(fù)了原來(lái)的行內(nèi)替換
從
;
到:
的映射消失了

我們?cè)僭囋嘫
定義Y并驗(yàn)證
:nmap Y y$
:reg "
重新定義Y
:nmap Y 0y$
:reg "

觀察映射
:map
可以觀察所有已經(jīng)存在的映射

第一列是模式
第二列是映射觸發(fā)鍵
第三列是映射對(duì)應(yīng)處理方式
如果我們想查看插入模式下;對(duì)應(yīng)什么操作
:imap ;
:nmap Y
Q進(jìn)入Ex命令模式

映射為空
還記得我們?nèi)∠较蜴I的操作嗎?
:map <LEFT> <nop>
:map <UP> <nop>
:map <RIGHT> <nop>
:map <DOWN> <nop>
<nop>就是什么都不做
對(duì)應(yīng)No Operation Performed
這原來(lái)是一條匯編指令,指令著讓cpu空輪一個(gè)周期
但是我們現(xiàn)在想想
我們?yōu)槭裁匆舴较蜴I?
是為了讓手放在核心區(qū)不動(dòng)
但是這指的是Normal模式
如果是命令模式,我們?cè)趺崔k?
我們需要方向鍵控制光標(biāo)左右運(yùn)動(dòng)
也需要shift或ctrl配合方向鍵控制光標(biāo)快速移動(dòng)
也就是說(shuō)Normal模式方向鍵不做任何事,Command模式下還可以用
所以
:nmap <LEFT> <nop>
:nmap <UP> <nop>
:nmap <RIGHT> <nop>
:nmap <DOWN> <nop>
但是如果我們這樣的話
縮寫(xiě)sysout是否就不能順利完成了呢?
驗(yàn)證
:map <left> <nop>:set nopaste :ab sysout System.out.println("");<left><left><left>
然后在插入模式下輸入sysout空格
還是可以自動(dòng)變成復(fù)雜的格式的System.out.println("");
奇怪的腦洞
如果我
:map j k :map k j
會(huì)發(fā)生什么?

那么這個(gè)東西如何處理呢?
取消重復(fù)映射
:noremap j k :noremap k j
這樣就把j、k真的對(duì)調(diào)了

取消重復(fù)縮寫(xiě)
試了一下
并沒(méi)有發(fā)現(xiàn)重復(fù)縮寫(xiě)的可能性
不過(guò)ab的替換結(jié)果可能會(huì)觸發(fā)map
:set nopaste:ab @a ad:imap ad adder
然后在插入模式下@a
通過(guò)ad就變成了adder
所以有的時(shí)候ab也需要noreab

歧義
我們定義了兩個(gè)映射
:map aa oeasy
:map aaa o2z
這個(gè)時(shí)候我們輸入aa會(huì)如何?
試一下
輸入aa之后他會(huì)等待
如果下一個(gè)是Space或者CR
那么對(duì)應(yīng)
oeasy
如果下一個(gè)是a
那么對(duì)應(yīng)
o2z
這種map映射和縮寫(xiě)abbreviate很像啊
縮寫(xiě)就很像是插入模式下的一種特殊的映射
不過(guò)兩者還是有不同的
兩者有什么不同呢?
比較映射和縮寫(xiě)
不同點(diǎn)
縮寫(xiě)就是把縮寫(xiě)形式補(bǔ)全成完整形式,原縮寫(xiě)形式消失
映射可以做更多的操作,比如復(fù)制粘貼之類(lèi)的編輯操作
縮寫(xiě)在插入模式下按回車(chē)或者空格或tab就可以觸發(fā)
映射要自己定義對(duì)應(yīng)的按鍵
縮寫(xiě)abbreviate側(cè)重于輸入(對(duì)應(yīng)插入和命令行模式)
映射map可以存在于更多模式
側(cè)重模式不同
觸發(fā)條件不同
效果不同
相同點(diǎn)
noremap
noreabbrev
首先他們都是為了快速輸入和操作而存在的
他們都可以取消重復(fù)
總結(jié)
這次了解到了
:map
映射可以定義映射
:map ; :
查詢(xún)映射
:map
:map ;
還可以取消映射
:unmap
可以映射到指定的模式
:map
所有模式:vmap
可視化模式 visual:nmap
正常模式 normal:omap
operartor-pending 被定義的鍵可以作為一個(gè)motion來(lái)使用:map!
插入和命令行模式:imap
插入模式 insert:cmap
命令行模式 command可以映射到什么也不做
:nmap h <nop>
還可以避免再次映射
:noreabbrev o1z oeasy
最后我們比較了縮寫(xiě)和映射的異同
這
縮寫(xiě)
和映射
都是可以:mkview
保存的也可以寫(xiě)到
~/.vimrc
作為基礎(chǔ)映射還可以寫(xiě)到具體的
filetype
中做一些專(zhuān)門(mén)的操作但是其實(shí)101鍵盤(pán)上面很多功能鍵
f1-f12
我們還沒(méi)有用上
可以給他們映射上么???
下次再說(shuō)!
[Github地址] (https://github.com/overmind1980/oeasyvim)
[Gitee地址] (overmind1980/oeasyvim)
[藍(lán)橋?qū)嶒?yàn)樓 邀請(qǐng)碼FJWYIMGB] (oeasy 教您零基礎(chǔ)玩轉(zhuǎn)編輯神器 Vim_Linux 藍(lán)橋云課)