欢迎光临散文网 会员登陆 & 注册

oeasy教您玩转vim - 73 - # 映射map

2021-12-23 07:36 作者:oeasy  | 我要投稿

映射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 蓝桥云课)


oeasy教您玩转vim - 73 - # 映射map的评论 (共 条)

分享到微博请遵守国家法律