oeasy教您玩转vim - 73 - # 映射map
映射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很像啊
缩写就很像是插入模式下的一种特殊的映射
不过两者还是有不同的
两者有什么不同呢?
比较映射和缩写
不同点
缩写就是把缩写形式补全成完整形式,原缩写形式消失
映射可以做更多的操作,比如复制粘贴之类的编辑操作
缩写在插入模式下按回车或者空格或tab就可以触发
映射要自己定义对应的按键
缩写abbreviate侧重于输入(对应插入和命令行模式)
映射map可以存在于更多模式
侧重模式不同
触发条件不同
效果不同
相同点
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 蓝桥云课)