Vim进阶2 map映射

Vim进阶2 map映射

简介

map是一个 vim 中的一些列映射命令,将常用的很长的命令映射到一个新的功能键上。map是Vim强大的一个重要原因,可以自定义各种快捷键,用起来自然得心应手。

map系列命令格式

格式

以 map 命令为例,它的命令格式是这样的:

:map {lhs} {rhs}

其含义是,在 :map 作用的模式中把键系列 {lhs} 映射为 {rhs}{rhs} 可进行映射扫描,也就是可递归映射。

举例

 :map td :tabnew .<cr>

含义:在其作用模式(普通、可视、操作符)下,输入 td 等价于输入 :tabnew . <cr>。而普通模式下输入:tabnew . <cr> 就是打开当前目录。

而如果再映射一次

:map ts td

就是指在其作用模式下输入 ts 等价于 td,也就是打开当前目录。不过如果没有特殊需要,一般不建议递归映射。

映射命令

不同模式下的映射命令

使用下表中不同形式的map命令,可以针对特定的模式设置键盘映射,实际上,不同的 map 命令前缀是可以相互组合的,

  • nore 表示非递归。 递归的映射。其实很好理解,也就是如果键a被映射成了b,c又被映射成了a,如果映射是递归的,那么c就被映射成了b,这个会在后面再介绍。

  • n 表示在普通模式下生效

  • v 表示在可视模式下生效

  • i 表示在插入模式下生效

  • c 表示在命令行模式下生效

常见的映射命令的有效模式如下:

Command 命令Normal 常规模式Visual 可视化模式Operator Pending 运算符模式Insert Only 插入模式Command Line 命令行模式
:mapyyy
:nmapy
:vmapy
:omapy
:map!yy
:imapy
:cmapy

noremap

看它的名字其实也很好理解它的含义:no re map,即不要 重新 映射,就是说不要进行递归映射。

具体来说,:noremap:map命令相对,作用模式和命令格式都相同,只不过不允许再对 {rhs} 进行映射扫描,也就是 {lhs} 定义后的映射就是 {rhs} 的键序列,不会再对 {rhs} 键序列重新解释扫描。它一般用于重定义一个命令,当然如果 :map 不需要递归映射的话,建议使用 :noremap

比如:

:noremap ts td

它的意思是在其作用模式下,输入 ts 就是输入td,但是和 :map 不同的是,此时 td 再不会做进一步扫描解释。虽然之前已经定义了 td,但是不会对 td 再做扫描。

取消映射

unmap

:unmap 是对应取消 :map 绑定的 {lhs},作用模式相同,命令格式 :unmap {lhs}

例如:

:unmap td

就是取消在其作用模式中 td 的绑定,比如之前 td 被绑定为 :tabnew .<cr>,此时此绑定消失。

注意 unmap 必须要有一个参数,即被取消的 {lhs} ,否则会报错。

mapclear

:mapclear 是对应取消所有 :map 绑定的,慎用!

常用map映射参考

下面介绍几个笔者在用的 vim 映射,大家如果觉得好用的话可以加到自己的 vimrc 里面。主要还是鼓励大家在自己的日常使用中根据自己输入的痛点,灵活地设计自己的map,毕竟做不同的工作,写不同的语言,输入的痛点都是不同的,这也正是 Vim 灵活好玩的地方之一。

推荐的原则是:将自己最常用的键设置在自己最容易按到的地方

1. 禁用方向键

为了强迫帮助新手尽快适应 hjkl 来移动光标,而非用方向键,我们可以将方向键禁用掉,包括常规模式和插入模式,这也是 MIT 建议的 vimrc 中的设置 (该链接会直接下载MIT的vimrc)。

" 常规模式禁用方向键
nnoremap <Left>  :echoe "Use h"<CR>
nnoremap <Right> :echoe "Use l"<CR>
nnoremap <Up>    :echoe "Use k"<CR>
nnoremap <Down>  :echoe "Use j"<CR>

" 插入模式禁用方向键
inoremap <Left>  <ESC>:echoe "Use h"<CR>
inoremap <Right> <ESC>:echoe "Use l"<CR>
inoremap <Up>    <ESC>:echoe "Use k"<CR>
inoremap <Down>  <ESC>:echoe "Use j"<CR>
2. 缩进

我们在 VS Code 等编辑器中都是 TabShift+Tab 来进行缩进和反缩进,在 Vim 中,缩进和反缩进稍显复杂,我们可以用下面的映射来使得它和我们在其他编辑器中一样。

" 常规模式
nmap <tab> V>
nmap <s-tab> V<

" 可视模式
vmap <tab> >gv
vmap <s-tab> <gv
3. 移动窗口

在 Vim 分屏中,我们使用 spvsp 来同时打开多个窗口,并通过 Ctrl+w+hjkl 来在各个窗口之间进行切换,但这也很麻烦,笔者实在是没想通加那个 w 干嘛,换掉!

map <C-h> <C-w>h
map <C-j> <C-w>j
map <C-k> <C-w>k
map <C-l> <C-w>l
4. 移动到行首行位

在 Vim 常规模式下,移动到行首行位分别是 0^$,但是笔者也感觉直接格键巨难按,刚好 HL 在平时不怎么用到,还是处在键盘的黄金位置,所以可以用来替换:

noremap H ^
noremap L $
5. 功能按键

在键盘的黄金区域,Vim 留给我们可以自己设置的键位并不多,但是功能键( F2 等)还是有很多可以用的,要注意的是,功能键离我们的手也很远,所以最好不要设置一些频繁用到的操作,而是应该让 “键如其名”,设置一些 “功能键” 在功能键上。比如开关行数显示,有时很有用,但是有时又看着很烦或者在复制文本时很碍事,以此为例,我们将开关行数设置在 F2 上:

nnoremap <F2> :set nu! nu?<CR>

其他的功能键大家可以结合自己日常输入中常用的功能来进行设置。推荐在功能键设置一些 set 的功能命令。可参考 vimrc配置文件

笔者在这里抛砖引玉,就介绍怎么多,其他的高效映射,大家自己在日常工作中再去探索吧。

Ref:

http://www.pythonclub.org/linux/vim/map

https://www.jianshu.com/p/8ae25a680ed7

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值