温欣爸比

  • 主页
  • Alfred Workflow
  • 《Vim 练级手册》
  • 常用命令
  • 代码笔记
  • 合辑
  • 在线工具
所有文章 友链 关于我

温欣爸比

  • 主页
  • Alfred Workflow
  • 《Vim 练级手册》
  • 常用命令
  • 代码笔记
  • 合辑
  • 在线工具

Vim 高级功能 Mapping 映射

2017-12-01

Vim 的 dd, hjkl 等基础按键操作已经可以很好的完成基本编辑工作,然而它还是会不太方便,尤其是熟悉了成熟 IDE 很多人性化设计的人们,曾经的我也是。所幸 Vim 提供了 Mapping 映射可以更好的进行文本操作,甚至比 IDE 更好方便。



  • 简单映射
  • 可怕的递归
  • Leader
  • 更复杂的映射


mapping

从截图中我做了这么几个事情

  • 先输入一个字符串 wxnacy 但是忘记包双引号,然后利用映射快速完成双引号环绕
  • 然后快速跳到行首输入 String name = ,再快速跳到行尾输入输入 ;
  • 输入输出语句,并在不跳到行尾的情况下,在行尾插入 ;
  • 最后输入一行 = 并快速移动到上一行

简单映射

我们先放一放,从最简单的开始

1
map - dd

你可以在命令行中输入这句,然后在文本的某一行中按下 - ,如果你已经按下了,相信你已经明白他的含义,- 映射了 dd 的功能,当然 dd 的功能并没有消失,这样的意义是什么呢,可以输入少,但做的多,我在其他文章中提到过,懒是第一生产力

Vim 提供了映射的功能,除了少输入字符外,它可以让我们免受一些“别扭”的按键所折磨,在预览中我们提到了,快速跳到行首行尾来编辑,其实 Vim 的基础操作就有提及,I, A 分别可以完成,然后这样的按键让从其他编辑器跳槽过来的人颇为头疼,因为现在几乎所有的编辑器都可以通过 ctrl + a, ctrl + e 来实现这个功能,就算我强迫自己适应了它的设定,在与其他编辑器切换使用时,这样的区别也会让我很恼火,所以我想改了它

1
2
3
4
nmap <c-a> I
nmap <c-e> A
imap <c-a> <esc>I
imap <c-e> <esc>A

按照这样修改你的配置文件,你就可以像其他编辑器一样使用快速跳转行首行尾了,在这里有两个新东西 <c-a> nmap, imap ,我们来看一下。

  • <c-a> 就是 ctrl + a 的组合键,第一个 c 就代表 ctrl
  • Vim 在映射上提供了四个关键词 nmap, imap, vmap, cmap 分别代表了四种使用模式,
    map 默认为 nmap

可怕的递归

1
nmap dd jddk

试着用一下这个映射,结果发现它只是想按了 G 一样,跳到了最后一行,并没有按照预想的一样,先下移一行,删除,再上移一行,问题出在了哪里?

我们在这里遇到了递归映射,在执行 j 以后遇到 dd Vim 以为我们又想映射,所以又从 j 开始执行,如此往复,陷入了递归陷阱。当然你会说,尽量避免这种情况就是了,这样好像可以解决眼前的问题,但是却解决不了以后的问题,随着自定义映射越来越多,这样的情况出现几率会越来越高,因为一共也就这么多按键,总有用完的时候,另外你以后肯定记不住那么的映射都用在哪了。所以我们应该用更好的方式来解决问题。

1
nnoremap dd jddk

再次试用这个映射,现在我们会发现,当按下 dd 的时候已经可以删除下一行了,Vim 提供了非递归映射,同时提供了 inoremap, vnoremap, cnoremap 一共四种模式

不要问什么时候用这种模式,答案很显然,是永远,forver。毕竟我们不能永远惦记着哪些映射可能会触发递归,因为我们的时间和精力应该用在更有意义的事情上。

相关文档 :help unmap

Leader

在解决完递归的问题,我们再来看一种情况,在上个问题中我们使用 dd 来做删除下一行的操作,那删除当前行怎么办,对,我之前提过可以用 - 来映射。但我们不能用这样映射下去,我们需要更好的解决方法。

1
nnoremap ;d jddk

通过这样的配置,我们并没有多输入字符,但是也达到了同样的效果,并且这样的组合几乎不会在其他地方用到,在 Vim 中我们称 ; 这样的“前缀”为 leader

1
let mapleader = ';'

做这样的配置可以设置自己的 leader 键,并用 <leader> 来使用它,这样做的好处是如果你有一天想改变这个键位,只需要修改一个地方即可,不必在到处查找,并且如果哪天你把自己的配置放到网上供他人使用,别人只需修改成自己喜欢的键位,就可以马上使用。

更多的资料可以阅读 :help mapleader :help maplocalleader

更复杂的映射

现在我们来做一些更复杂的事情,分析一下效果预览中一些操作

1
nnoremap <Leader>" viw<esc>bi"<esc>ea"<esc>

这是给单词做环绕括号时的操作,你可以先复制到你的配置中试一下效果,它做了什么呢?首先 viw 可以选中当前光标所在单词,这是 Vim 自带的映射,我们记住即可。然后输入 <esc> 退出选中模式,b 跳到单词开头,i 进入插入模式,输入 " ,再次退出插入模式,e 跳到单词末尾,a 在末尾进入插入模式,输入 " ,最后退出插入模式

如果你把 Vim 当做主编辑器来使用,这样的映射操作会经常发生,所以你需要不断的练习

1
2
3
4
5
6
7
" 在行尾输入分号
nnoremap <Leader>, mzA;<esc>`z
" 在正常模式和插入模式快速跳到行首行尾
nnoremap <C-a> I
nnoremap <C-e> A
inoremap <C-a> <esc>I
inoremap <C-e> <esc>A

剩下两个操作我不在进行解释,你可以自己尝试搞明白原理,你可能会发现我没有提及为什么输入 print 后会快速变成 System.out.println(""),但是如果你看下 Vim 高级应用 Abbreviations 快速输入 就会明白

师傅领进门,修行靠个人。即使知道的再多,不去做也是不行,因为不做就等于不知道,知行合一嘛。不要担心不适应,相信我,你并不孤独,每个人在这个阶段都是这样的。有个方法可以强迫帮你一下,在改过映射后,将原来的按键映射为 <nop> ,这样按键就会失效,当你按完没有反应时,自然会去使用新按键,久而久之就改过来了,好了,快去练习吧

最近更新
Alfred Workflow 命令行帮助工具
最近热读
Go 判断数组中是否包含某个 item
Vim 高级功能 vimgrep 全局搜索文件
办理北京工作居住证的一些细节
Go 语法错误:Non-declaration statement outside function body
Mac 电脑查看字体文件位置
扫码关注公众号,或搜索公众号“温欣爸比” 及时获取我的最新文章
赏

谢谢你请我喝咖啡

支付宝
微信
  • vim
Vim 高级功能 Operator-Pending 映射
如何获取 IP 、经纬度、时区一系列信息
  1. 1. 简单映射
  2. 2. 可怕的递归
  3. 3. Leader
  4. 4. 更复杂的映射
© 2017 - 2022 温欣爸比 京ICP备15062634号 总访问量3428次 访客数3380人次 本文总阅读量4次
Hexo Theme Yilia by Litten
  • 所有文章
  • 友链
  • 关于我

tag:

  • python
  • flask
  • javascript
  • docker
  • 工具
  • openresty
  • 微信
  • java
  • hexo
  • 杂谈
  • vim
  • git
  • mysql
  • http
  • linux
  • mac
  • tmux
  • ssh
  • 算法
  • 开发
  • node
  • 杂文
  • jinja2
  • maven
  • spring
  • 北京
  • 生活
  • springboot
  • react
  • shell
  • graphql
  • iterm
  • expect
  • nginx
  • sqlalchemy
  • html
  • electron
  • vagrant
  • elastic
  • 宝贝
  • ansible
  • css
  • jquery
  • go
  • markdown
  • awk
  • redis
  • leetcode
  • zsh
  • 漫威
  • ssr
  • android
  • ffmpeg
  • chrome
  • vmware
  • youtube
  • windows
  • jupyter
  • excel
  • jq
  • Mac
  • Homebrew
  • mongo
  • py2
  • HomeBrew
  • movie
  • nodejs

    缺失模块。
    1、请确保node版本大于6.2
    2、在博客根目录(注意不是yilia根目录)执行以下命令:
    npm i hexo-generator-json-content --save

    3、在根目录_config.yml里添加配置:

      jsonContent:
        meta: false
        pages: false
        posts:
          title: true
          date: true
          path: true
          text: false
          raw: false
          content: false
          slug: false
          updated: false
          comments: false
          link: false
          permalink: false
          excerpt: false
          categories: false
          tags: true
    

  • Guru99
每天看书
每天背单词
每天一篇
写写代码
听听周杰伦
爱爱老婆