从零开始匹配vim(2)——快捷键绑定
如果说 vim有什么最吸引人,我想vim允许你自由的定义各种快捷键算是一个原因吧。你可以通过绑定各种快捷键来使经常使用的功能更加便利。通俗的讲,快捷键映射就是我按下某个键,我想让vim将它当成另一个键,例如我按下 k
,我想让vim把它当做 c
来使用(当然这么映射会把人逼疯)
快捷键映射
我们使用 :map
命令来进行快捷键的映射,例如我们输入如下内容
:map - dd
通过这个命令,我们将 -
映射为 dd
,也就是说现在我们按下 -
就可以删除光标所在行了。
针对功能键,例如 Ctrl
、空格
、Tab键
等,在 vim
中使用 <keyname>
的形式,其中 keyname
是按键名称,下面列举出一些常用的控制键的表示方式:
Ctrl
键对应<c>
空格
键对应<space>
alt
键对应<a>
esc
键对应<esc>
- 退格键对应
<bs>
- 回车键对应
<cr>
shift
键对应<shift>
f1
到f12
对应<f1>
到<f12>
这些功能键与普通字母做配合时,将字母键放入到 <>
中,并以 -
和 功能键做分割,比如 :map <c-d> dd
来将 <Ctrl +d>
映射为 dd
当然有时候为了可读性,我们可以将这些功能键以大写字母来表示,例如 <C-d>
就表示 <Ctrl +d>
快捷键映射就是这么简单,接下来要做的就是思考如何进行映射能提升我们的效率,即提取常用的操作将他们映射为快捷键。我们来通过几个小例子来给小伙伴们提供一些思路。
定义 -为将当前行往下移动移动
我们知道,在普通模式下要将当前行往下移动,可以首先执行 dd
删除一行,然后执行 p
来拷贝到下一行,因此我们可以这样定义快捷键
:map - ddp
定义 _
为将当前行往上移动移动
在这个例子中,第一步仍然是执行删除,但是与上一个例子不同的是,我们要将删除部分往上一行粘贴。如果往上一行粘贴呢,在之前介绍的时候我们并没有提到如何执行这么一个操作。如果你的第一反应是要去翻用户手册或者去查其他的资料,那么我建议你仔细去阅读一下我之前写的内容。体会一下vim的一些思想和技巧。
仔细回想一下 o
(小写)和 O
(大写) 的区别,而且我们曾经提到过,普通模式下,大写字母和小写字母功能类似。说到这我想你应该知道答案了。我们使用 P来粘贴到上一行。因此这里的映射可以写成
:map _ ddP
如果你觉得这两个映射对你有用,你可以将它放入你的 vimrc
中,或者先记下来,等我们介绍完使用 lua
配置之后,再写到 init.lua
中。
其他模式下的映射
map
可以定义映射,但是各位小伙伴可以做一下试验,map
命令定义的快捷键在 visual
模式下仍然有效。这样就会带来一个问题,如果我想在多个模式下都对 -
这个键进行了定义,而且定义成了不同的快捷键,这该怎么处理呢?
其实 vim
针对不同的模式有不同的快捷键定义命令,例如 :nmap
负责在普通模式下定义快捷键, :vmap
负责在 visual
模式下定义快捷键。这个时候你肯定已经猜到了,:imap
可以在插入模式下定义快捷键,或者使用 :cmap
定义命令行模式下的快捷键。
这些命令的格式与 :map
一样。下面还是以例子为主吧
例1: 重新在普通模式下定义 -
例如我们使用 :nmap
重新定义 -
为 ddp
,这个时候我们发现它只在普通模式下有用,而在选择模式下无效。
例2: 定义 为复制粘贴
不知道有没有小伙伴在初学vim的时候希望也能像在Windows中那样,使用 <Ctrl+c>
和 <Ctrl+v>
来进行复制粘贴。学到现在我们终于有能力自己动手实现这个需求了。
虽然不推荐这么干,但是还是满足各位折腾的欲望吧。
仔细回想一下,<Ctrl+c>
实际上是拷贝选中的文本,而<Ctrl+v>
是在输入的时候直接粘贴的。因此我们知道映射 <Ctrl+c>
应该是在 可视模式下。而<Ctrl+v>
应该是在插入模式下。
另外在插入模式下是不支持使用 p
来进行粘贴的。还记得我们在插入模式下介绍的那些技巧吗?其中有一个快速从寄存器中粘贴的技巧。正好可以在这里用到。而复制操作会将复制的文本拷贝到寄存器中(也就是 0
寄存器)。结合这两个知识点,我们可以很方便的映射出这两个快捷键
:vmap <C-c> y
:imap <C-v> <C-r>0
虽然它仍有一些不完美,但是已经够用了。最后还是不推荐这么干,毕竟使用 y
等操作就能搞定的事情没必要弄的这么麻烦。而且在linux平台,特别是在终端上,这些键都另有用途。例如 <C-c>
在vim中可以退回到普通模式。
例3: 定义 <c-d>
为在插入模式下删除一行
我们再举一个例子,我想在插入模式下使用 <C-d>
来删除光标所在行。vim
在插入模式下并没有提供快捷键来删除一行,需要使用退格键一个个的删除,想要快速删除可以回到普通模式使用dd
。那么我们可以使用 :imap <c-d> <esc>dd
。
我们会发现按下 <c-d>
之后它成功删除了一行,但是它自己退回到普通模式去了,我们想要的是它能在删除一行后仍然处于插入模式,这样我们就可以直接输入了,因此我们可以在后面新加一个再次进入插入模式的步骤,即 :imap <c-d> <esc>ddi
。
再次尝试,我们发现它已经满足我们的需求了。
例4: 在插入模式下定义快捷键快速转换单词为全大写
我们定义一个在插入模式下能快速将光标所在单词改为全大写字母。例如 C/C++
语言的编程规范中都会讲到宏或者常量最好以大写字母命名。例如 #define MAX_CONNECTIONS_QUEUE 100
这样长的宏定义,我们在输入的时候要一直按着 shift
键是很痛苦的事情。我们需要有这么一个快捷键我们可以先输入小写字母然后使用快捷键将它改为全大写。
首先我们思考一下,不使用快捷键该是如何操作呢?首先我们将光标移动到单词所在位置并退回到普通模式,接着使用 viw选中,然后使用 U来改为大写。
根据这一串操作命令,我们可以就知道了该如何定义快捷键了,:imap <c-u> <esc>viwU
。根据上面的一个例子我们知道,这样它最终会停留在普通模式下面,我们还是希望能够回到插入模式,考虑到我的使用场景是,我在写完整个单词之后会立马将它转化为大写,然后再编辑后面的其他部分,因此我将光标移动到被大写的单词的尾部,并且进入插入模式。现在命令就变成了 :imap <c-u> <esc>viwUwa
。
这里你可以根据需要灵活的进行调整,例如可以改为 :imap <c-u> <esc>viwUA
,在行尾进入插入模式。
最后做一个总结。本篇提到的比较重要的定义快捷键的命令有:
- map: 定义所有模式下的通用快捷键
- imap: 定义插入模式下的快捷键 (insert)
- nmpa: 定义普通模式下的快捷键 (normal)
- vmap: 定义选择模式下的快捷键 (visual)
从零开始匹配vim(2)——快捷键绑定的更多相关文章
- Vim魔法堂:认识快捷键绑定
Brief 习惯在VS上按<F5>来编译运行程序,刚用上VIM上就觉得无比的麻烦,而随着对VIM的学习我们分阶段的简化这一操作 1. 退出VIM,在shell下编译&&运行 ...
- vim 快捷键绑定
1. 退出VIM,在shell下编译&&运行程序 :wq [root@fsjohnhuang ~]# gcc main.c -o main [root@fsjohnhuang ~]# ...
- vim使用快捷键
vim使用快捷键 索引 1. 关于Vim 1.1 Vim的几种模式 2. 启动Vim 3. 文档操作 4. 光标的移动 4.1 基本移动 4.2 翻屏 4.3 标记 5. 插入文本 5.1 基本插入 ...
- VIM常用快捷键(转载)
移动光标 h,j,k,l 上,下,左,右 ctrl-e 移动页面 ctrl-f 上翻一页 ctrl-b 下翻一页 ctrl-u 上翻半页 ctrl-d 下翻半页 w 跳到下一个字首,按标点或单词分割 ...
- [转贴] VIM 常用快捷键 --一直记不住
vim 常用快捷键 原帖地址: https://www.cnblogs.com/tianyajuanke/archive/2012/04/25/2470002.html 1.vim ~/.vimrc ...
- [转帖]VIM常用快捷键
VIM常用快捷键 https://www.cnblogs.com/markleaf/p/7808817.html 快捷键能够显著的提高工作效率 一.移动光标 h,j,k,l 上,下,左,右ctrl-e ...
- Vim命令快捷键(网摘)
Vim命令快捷键(网摘) 原文出处:[?---->home]
- 一些常用的vim编辑器快捷键:
一些常用的vim编辑器快捷键: h」.「j」.「k」.「l」,分别控制光标左.下.上.右移一格. 按「ctrl」+「b」:屏幕往“后”移动一页. 按「ctrl」+「f」:屏幕往“前”移动一页. 按「c ...
- vim常用快捷键整理
搜索快捷键 / 关键字n 向下匹配N 向上匹配 移动光标快捷键 gg 命令将光标移动到文档开头,等同于 1GG 命令将光标移动到文档末尾0 或功能键[Home] 这是数字『 0 』:移动到这一行的最 ...
- Mac下Vim编辑快捷键小结(移动光标)
Mac下Vim编辑快捷键小结(移动光标) 1.移动到行尾"$",移动到行首"0"(数字),移动到行首第一个字符处"^" 2.移动到段首&qu ...
随机推荐
- Oracle 删除唯一约束
1.查出有哪些约束 SELECT CONSTRAINT_NAME,CONSTRAINT_TYPE,STATUS FROM USER_CONSTRAINTS WHERE TABLE_NAME ='D_D ...
- OpenShift 与 OpenStack:让云变得更简单
OpenShift 与 OpenStack 都是在 2010.2011 年左右创建的,用于构建可扩展云平台的开源技术,两者都用于在混合云环境中构建可扩展系统.从历史来看,OpenStack 的存在时间 ...
- 经典Python案例实现
入门_30个常用python实现 .pdf 一. 二. 三. 四. 五.函数篇 5.1 计算圆的面积 from math import pi as PI def CircleArea(r): if i ...
- Problem B - Card Constructions (构造)
题意: 你可以用图示的方法建造金字塔,但是每一次都要建最大的金字塔,问最后能建几个金字塔. 思路: 我们可以发现对于每一个金字塔都是两边增加了两天边,然后中间行数− 1 -1−1个三角形,所以就可以求 ...
- Android 原生 SQLite 数据库的一次封装实践
本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/CL4MsQEsrWS8n7lhXCOQ_g作者:Li Bingyan 本文主要讲述原生SQLi ...
- Asp .Net Core 系列:集成 Ocelot+Nacos+Swagger+Cors实现网关、服务注册、服务发现
目录 简介 什么是 Ocelot ? 什么是 Nacos ? 什么是 Swagger ? 什么是 Cors ? Asp .Net Core 集成 Ocelot 网关集成 Nacos 下游配置 Naco ...
- svg组件封装
svg图标优点 文件体积小,能够被大量的压缩 图片可无限放大而不失真(矢量图的基本特征) 在视网膜显示屏上效果极佳 能够实现互动和滤镜效果 svg图标使用 1.安装相应的npm包: yarn add ...
- C#排序算法4:希尔排序
希尔排序是插入排序的一种又称"缩小增量排序"(Diminishing Increment Sort),它是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序:随着增量逐渐减 ...
- 图片与Base64编码相互转换、优势分析和技术实现
在Web开发中,图片与Base64编码的相互转换是一个非常实用的技能.图片 Base64编码是将图片文件转换为字符串格式,以便于在网络上传输和存储.本文将详细介绍图片与Base64编码的转换方法,以及 ...
- java进阶(25)--泛型
一.泛型基本概念 JDK5.0后新特性:Generic 1.不使用泛型举例