oeasy教您玩转vim - 73 - # 映射map
映射map
回忆上次缩写的细节
这次了解到了
:abbrivate缩写可以定义缩写
:ab o1z oeasy这里面还可以包括方向键、回车键之类的东西
可以定义到指定的模式
iabcab查看缩写
: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:omapoperartor-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 YQ进入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可以存在于更多模式
侧重模式不同
触发条件不同
效果不同
相同点
noremapnoreabbrev首先他们都是为了快速输入和操作而存在的
他们都可以取消重复
总结
这次了解到了
:map映射可以定义映射
:map ; :查询映射
:map:map ;还可以取消映射
:unmap可以映射到指定的模式
:map所有模式:vmap可视化模式 visual:nmap正常模式 normal:omapoperartor-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 蓝桥云课)

