Vim 组合键映射map详解

回忆功能键映射的细节

上手就干

  • :echo "oeasy"
    • 显示oeasy
  • :map <C-o> echo "oeasy"
    • ctrl+o
    • 映射到:echo "oeasy"

功能键映射

  • 我们来试试我想给markdown的一部分文本加粗
    • 语法是 **加粗**
    • 我想用 ctrl+b
    • ctrl+bvim 里面表示为<C-b>
  • 我们先看看ctrl+b的帮助手册
    • :h Ctrl-b
    • 这个已经有了
    • 如果强制映射就把原来翻篇儿的那个给抹了
    • 除非是再 :unmap <C-b>
  • 找个没有的快捷键
    • :h Ctrl-s 没有
    • 我们换成
  • :map <C-s> i**<Esc>ea**<Esc>

代码分析

  • :map <C-s> i**<Esc>ea**<Esc>
    • 当光标在单词的开头时
    • i 进入插入模式
    • 在单词前面插入两个*
    • esc退到正常模式
    • e到单词的 end
    • a在后面进行 append
    • 再插两个*
    • esc 退出
  • 试验成功
  • 但是这个东西是基于 markdown 这种 filetype
    • 我们需要在 ~/.vim/ftplugin/md.vim 完成相关映射的定义
    • 而且模式特指是正常模式
    • 需要 nmap
    • 如果我要映射的内容也有 ctrl 组合键之类的东西呢?

窗口切换

  • 我们把原来窗口切换的快捷键简化一下
    • map <C-j> <C-W>j
    • map <C-k> <C-W>k
    • map <C-h> <C-W>h
    • map <C-l> <C-W>l
  • 这样就摁下两个键就可以切换窗口了
  • 很方便
  • 其实可以再把:only:split之类的
  • 也重映射一下

选项卡切换

  • :tabnew新建几个
  • 我们控制一下ctrl+⬅️ctrl+➡️️
    • map <C-LEFT> :tabn
    • map <C-RIGHT> :tabp
    • 但是失败了
    • 修改一下
    • map <c-left> :tabn<cr>
    • map <c-right> :tabp<cr>
  • 这样就可以通过ctrl+⬅️ctrl+➡️️控制选项卡tab了
  • 但是如果有很多选项卡的话呢?能否直接切过去?
    • 其实默认的gtgT切换也还挺方便的
    • 1gt
    • 2gt
    • 3gt
    • 9gt

Shift

  • 组合键除了ctrl之外,还有
    • shift
    • alt
  • :map <S-t> ioeasy 等价于
  • :map T ioeasy
  • :map <S-t>:map T
    • 结果一样
    • 可以看到这两个都可以定义
    • shift+t就是T

更多按键

图片描述

  • 理论上是这样的
  • 不过实际上并不如ctrl好用

批量替换

  • 我们打开一系列文件
    • :vim oeasy.java oeasy.html oeasy.css
  • 建立映射关系
    • map <c-s> :s/5.1/5.2/<cr>:wnext<cr>
      • ctrl+s映射到
      • :s/5.1/5.2/<cr>替换当前行
      • :wnext<cr> 保存并切换到下一个buffer缓存
  • 有流水线那意思,一个完了就弄下一个
    • 这样就可以批量替换一堆打开的文件了
    • ctrl+c可以终止
  • 但是如果ctrl+c被映射为空会如何?

胡思乱想

  • noremap <C-c> :echo "oeasy"
    • 好像真的可以
    • 这样就没法打断了吗?
  • 但是如果你再插入模式的话
    • 还是可以通过ctrl+c切换到正常模式的
    • 感觉上是失败了。。。😫

关于注释的细节

  • 我们定义的映射一般都有注释
  • 注释有一点点小细节
  • :map <F4> gg=G |"F4 for indent
    • |把后面屏蔽
    • "意味着不执行的注释
  • 其实G后面的空格是有可能出问题的
    • 因为F4映射的是gg=G包括后面跟的4个空格
    • 最好改为:map <F4> gg=G|" F4 for indent
    • 在取消映射的时候也有同样的问题
  • 比如
    • :unmap a |"unmap a
    • 其实 unmap 的不是 a
    • 而是a空格
  • 这些细节都需要注意

总结

  • 这次我们定义了一系列的复合键
    • 主要是和ctrl键一起
  • 快速跳转window窗口
    • map <c-j> <c-w>j
    • map <c-k> <c-w>k
    • map <c-h> <c-w>h
    • map <c-l> <c-w>l
  • 快速跳转tab选项卡
    • map <c-left> :tabn
    • map <c-right> :tabp
  • 还可以流水作业
    • map <c-s> :s/5.1/5.2/<cR>:wnext<cr>
  • 最后要注意注释说明的小细节
    • :unmap a|" unmap a
  • 组合键和功能键Fn一样
    • 都可以做各种映射map
    • 映射map和缩写abbreviate和折叠、本地options一样
    • 都可以通过:mkview:loadview来保存读取
    • 但是如果我的环境里面有tab选项卡
    • tab选项卡里面还有各种切分好的各个窗口
    • 一觉醒来还得重新切分
    • 还得重新:tabnew
  • 我想把这个多选项卡tabs多窗口windows的状态整个存储起来
  • 可能么?🤔
  • 下次再说!

教程来源于Github,感谢overmind1980大佬的无私奉献,致敬!

技术教程推荐

微服务架构实战160讲 -〔杨波〕

软件测试52讲 -〔茹炳晟〕

如何设计一个秒杀系统 -〔许令波〕

TensorFlow快速入门与实战 -〔彭靖田〕

软件工程之美 -〔宝玉〕

现代C++编程实战 -〔吴咏炜〕

视觉笔记入门课 -〔高伟〕

Spring Cloud 微服务项目实战 -〔姚秋辰(姚半仙)〕

互联网人的数字化企业生存指南 -〔沈欣〕