键盘映射工具怎么使用(键盘映射怎么设置)

严格意义上来说,快捷键的绑定应该是键盘映射,将某些键映射为另一些键。

在上篇我们介绍了基本的键盘映射操作,知道了如何 :map、:imap、:vmap、:nmap这些命令来映射键盘快捷键。它们很方便,也很简单,但是有一个致命的缺点。他们是递归的,我们先来讨论什么是递归

映射的递归问题

让我们先来执行下面的命令

:nmapjjJ:nmapJj

这里我们原本是想 jj来实现 J的功能,更加快速的实现合并行的功能,但是我们按下之后发现,它只是将光标移动到下一行了。这并不是我们想要的。到底发生什么了呢?

因为这些命令是递归的。如何理解递归呢?我们以函数的思想来考虑,每定义一个快捷键,就相当于定义了一个函数。并且在新定义的函数中调用老函数。依照这个思路我们来分析一下上述两个命令产生的结果:

  1. 首先定义了一个名为 jj的函数,它的函数代码为 J()
  2. 然后我们定义了一个名为 J的函数,它的代码定义为 j()
  3. 我们执行 jj函数的时候,它在函数内部调用 J(),J函数内部调用 j()。因此它表现出来的最终效果就是 jj等效与 j。

这些映射产生的伪代码如下:

voidJ(){ j(); } voidjj(){ J(); }

我们在调用 jj这个函数的时候就相当于在调用 j

有点绕是不是呢。为了讲述这个问题,我们再来看这么一个例子

:nmapddo<esc>kddj

我们来分析一下它的本意:

  • 首先使用 o在光标所在行之下插入一行
  • 退回到普通模式,并且让光标向上移动一行
  • 删除光标所在行
  • 移动到下一行,也就是刚刚的插入行

看起来这个命令的作用是清除本行,但是vim并没有这么做,只有按下 <C-c>才能停下来,而且vim中多出了许多空白行。

键盘映射工具怎么使用(键盘映射怎么设置)

依照上述分析思路,我们可以对这个命令的执行结果写出如下的伪代码

voiddd() { o(); esc(); k(); dd(); j(); }

从上述的代码看出这个映射会陷入无限循环,或者叫死递归。我们只能使用 <Ctrl +c>来终止。

在正式进入下一步之前让我们先删除这个映射。我们可以使用 :nunmpa来删除一条快捷键映射,输入 :nunmap dd来终止上述出错的映射。之前介绍的那些映射命令都有 un系列的命令,例如 map对应 unmap,imap对应 iunmap。

我们从上面的几个例子应该看出来了, 之前介绍的函数好用是好用,但是会形成递归。在上述代码中还算是比较好找,如果我们配置文件大了,不同插件有自己的映射,而我们也会定义一堆自己的映射,这个时候出问题就难查了。

为了解决这个问题,vim提供了一系列的 nore开头的函数。它相比于之前介绍的函数来说,是非递归的。之前每个命令对应的非递归版本如下:

  • nmap 对应 nnoremap
  • imap 对应 inorempap
  • vmap 对应 vnoremap
  • cmap 对应 cnoremap

相信各位应该看出来了,我们在原来命令的基础之上添加了 nore作为非递归版本。我们来做一个试验

:nmapxdd:nnoremap x

我们输入 发现它只删除了一个单词,即使用 :nnoremap只保留了 作为 x操作符的作用,而斩断了之前 x被映射为 dd的操作。

那么我们何时该使用递归版本,何时使用非递归版本呢?答案是在任何时候,永远使用非递归版本,现在就请各位小伙伴忘掉非递归版本吧。现在多敲几个单词将来会省去大量排错时间。

lua 配置

到此为止我们学会了怎么使用 :map系列的命令定义快捷键,同时也知道什么是快捷键之间的递归和非递归。可以说掌握了关于 vimscript定义快捷键的基本方法。那么如何跟 lua对应呢?

neovim 定义了一系列的函数帮助我们定义、获取和删除快捷键

  • vim.api.nvim_set_keymap: 设置快捷键
  • vim.api.nvim_get_keymap: 获取快捷键
  • vim.api.nvim_del_keymap: 删除快捷键

我们可以通过帮助文档查到 vim.api.nvim_set_keymap的定义如下:

nvim_set_keymap({mode}, {lhs}, {rhs}, {*opts})

mode是一个字符串,对应着一个模式,即我们之前说的可视模式、插入模式或者普通模式,下面是各个模式对应的字符串名称 。

字符串

模式

对应的vim 命令

“”

所有模式

:map

“n”

普通模式

:nmap

“v”

可视模式

:vmap

“i”

插入模式

:imap

“s”

选择模式

:smap

“c”

命令模式

:cmap

lhs对应着一个键位,即我们想映射的键位,如果传入空字符串,相当于通过 :map传入 <NOP>。表示将要禁用这个键rhs对应着将要执行的命令,是 :map的第二个参数opts代表映射的其他属性,主要是一个表,你可以暂时理解为一个字典。比如可以使用 noremap表示禁止递归,使用 silent表示执行命令时不回显内容

例如我们在配置文件中定义

vim.api.nvim_set_keymap(“n”, “<space>”, “/nvim<CR>”, {noremap = true, silent = false})

通过这段代码,我们将 空格键映射为在文件中查找 nvim字符。因为 silent设置的是 false因此我们在按下空格键之后在vim的左下角会看到 /nvim的字样

键盘映射工具怎么使用(键盘映射怎么设置)

我们可以通过设置 silent = true来取消这个回显。

vim.api.nvim_set_keymap(“n”, “<space>”, “/nvim<CR>”, {norema=true, silent = true});

键盘映射工具怎么使用(键盘映射怎么设置)

映射leader 键

常见的映射主要出现在普通模式下,普通模式下的很多按键都有其特殊用途,而且还大多挺常用的,想来想去不怎么使用,而且位置好按的也就 <space>、H、L、D这些了,将他们进行映射,映射到常用功能,减轻我们的按键负担是再好不过了。但是我们常用功能又那么多,特别是装了插件之后的。这些键完全不够使用的。

这个时候我们要延续 emacs或者其他软件的思路了,一个键不够就两个键,比如使用下面的映射

:noremap-ddd:noremap-cddO

这意味着我们可以使用一个键作为前缀,后面接其他字符,将他们作为一个整体来映射一个功能。多按一个键而已,比你输入整个命令要轻松多了。

这就引入一个新的思路了,我们可以统一定义一个键作为前缀键,后面添加一些字符来整体进行映射。当然我们可以手工这么做,每次需要多个按键的时候的就手动写上 -或者其他的。但是后期我发现 -并不容易按到,我觉得 <space>或者 ,更容易按到,要进行修改,那么修改的量就太大了。

vim中有一个被称之为 leader键的东西来解决这个问题,我们可以提前定义一个 leader,在映射的时候使用 <leader>来代表对应的前缀键。例如,先设置 leader为 <space>后面再定义 <leader>d作为 dd,后面可以很方便的修改 <space>d这个映射为 ,d,只需要修改 leader键的定义。

可以使用 :let mapleader = <space>来定义 leader键为空格。这里你可以定义成你喜欢的键,我平时喜欢用空格,因为它比较大,平时也在大拇指的位置,方便按。

然后我们可以使用 :noremap <leader>d dd来定义映射

如何在 lua中定义 leader键呢?从上面的 vimscript代码中可以看到 mapleader是用 let关键字来设置的,一般 let是用来设置变量的。lua中自定义变量可以直接定义,但是 mapleader明显是vim自带的变量。跟设置选项类似,neovim提供了两种访问 vim内部变量的方式,一种是使用函数,一种是使用 元访问器。

跟变量有关的函数主要有:

  • vim.api.nvim_set_var():设置全局变量的值
  • vim.api.nvim_get_var():获取全局变量
  • vim.api.nvim_del_var():删除全局变量

当然使用元访问器会更加简便,对应的元访问器为 vim.g。所以这里我们可以使用 vim.g.mapleader = ” “来设置

到此我们已经学会了关于映射的所有初级的内容,现在已经可以完成大部分的配置工作了。至于在定义快捷键的时候是使用 leader键还是使用多个普通键,看具体场景和各位小伙伴的使用习惯了。这里我就不给建议了,一切以方便好按为主。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

(0)
上一篇 2023年4月20日 下午4:09
下一篇 2023年4月20日 下午4:14

相关推荐

  • 洗照片机器多少钱一台(冲洗照片的机器叫什么)

    【前言】 媳妇生完孩子赋闲在家,不能出去逛街玩耍甚是无聊,为了打发无聊的时间,开始把此前旅游的照片整理成电子相册以作纪念,面对特别好看的照片,不打出来着实觉得有些可惜。于是蹿腾本人再买个照片打印机,好在心血来潮时,随时打照片。 为什么是“再”?因为很多年前曾经买过一个喷墨照片打印机,最初新鲜劲过去之后使用率越来越低,造成墨头总是堵,以至于久病成医,专门为它准…

    2022年12月13日
    250
  • 菲亚特悦翔价格及图片(广汽菲亚特所有车型)

    公司里忙不完的项目,每日地铁口的拥堵,没有个人空间怎么办?我要买悦翔,我要买悦翔,我要买悦翔。重要的事情说三遍! 近日,重庆江津利升行宏达4s店 悦翔销售,颜色可选,目前购车部分车型直降9.63%,活动时间截止到11月28日,感兴趣的朋友可以到店咨询购买,店铺地址:重庆市江津区几江鼎山大道蜀果4号楼 促销时间 2022年11月28日 至 2022年11月28…

    2022年11月28日
    260
  • 移动接入点怎么设置网速快(手机接入点承载系统哪个最快)

    此方法本人亲测有效,是通过修改APN来实现手机网速翻倍增长! 修改APN 一、首先找到自己手机APN设置点。 点击设置,找到SIM卡和移动网络,点击SIM卡1.进入后会看到接入点名称(APN),点击进入后点右上角的新建图标 二、联通用户:在新建APN内设置名字(这里随意填写),然后就是APN(这里填小写的“wonet”,一定是小写),填写方法如图 除设置以上…

    2023年2月21日
    370
  • 新郑是哪个省的城市(新郑县简介)

    新郑市位于河南省中部,属郑州市,北靠郑州,南连长葛,东邻中牟、尉氏,西接新密市。面积873平方公里,人口78.6万,辖14个乡(镇),337个行政村。地势西高东低,西部为浅山丘陵区,东部为平原,西北部为丘岗地。双泊河贯

    2022年10月8日
    6770
  • 一斤等于多少克(一斤等于几两等于几克)

    经常有朋友问我,硬币一枚重多少克?而且在收藏过程中,经常也需要掌握硬币的重点,通过称量总重,快速的计算总共有多少枚硬币。 那么今天就详细的和大家分享我国主要流通硬币的重量。 一、分币的重量 一分硬币标准重量是0.67克,一斤一分硬币大概746枚。 二分硬币标准重量是1.08克,一斤二分硬币大概463枚。 五分硬币标准重量是1.6克,一斤五分硬币大概312枚。…

    2022年12月31日
    190
  • 方向余弦怎么算(向量的基础知识)

    向量的知识 向量定义: 向量是一条有方向的线段(有长度和确定方向的线段)。 图形化的向量,表示成一定长度的有向线段。 具有起始点A和结束点B的向量,记为AB。向量也可以用一个小写字母,例如a表示。 向量的长度: 有向线段的长度决定了向量的数值,称为向量AB的长度。 向量AB的长度记为:|AB|。 共线向量: 平行于一条直线或落在一条直线上的向量称为共线向量 …

    2024年6月16日
    50
  • 华为专门玩游戏的手机是哪款(华为哪款玩游戏性能好)

    如今春节假期已经日渐临近,相信有不少朋友已经想好了自己的假期安排。比如除了与家人团聚外,我身边的小伙伴还准备约上许久未见的兄弟姐妹或同学一起游戏开黑,尽情享受放假的快乐。不过经常玩游戏的朋友想必都有这样的感受:手机动辄电量不足、屏幕触控体验不灵敏以及网络信号不稳定,都有可能成为你“五杀”道路上的绊脚石。所以想要游戏玩得尽兴,手机一定不能差。 提到续航强劲、触…

    2023年2月2日
    220
  • 笋壳鱼的做法大全(笋壳鱼六例做法介绍)

    主料笋壳鱼150克 辅料紫苏叶3克 小料葱5克 姜5克 调味料和味烧汁50克 蒸鲜豉油80克 浓缩卤水汁5克. 冰糖80克 水100克 腌制料鸡粉3克 盐2克 料酒10克 白胡椒粉0.1克 烹饪步骤 1. 笋壳鱼宰杀去骨和内脏保留表面鱼鳞,用面粉和盐搓去表面粘液冲洗干净沥干,再用小料和腌料腌制备用; 2. 腌制好的笋壳鱼吸干表面水分,用6成油温油先油淋鱼皮表…

    2024年9月19日
    10
  • 小暑节气的由来及民俗文化活动

    小暑:“斗指辛为小暑,斯时气温已热,并未达淤顶点,故称也。”小暑节气,代表着一年中最高温、高烧、高低温的夏天即将来临。以下是小编为大家整理的小暑节气的由来及民俗文化活动,我希望你能帮助到大家。小暑节气

    2022年10月20日
    360
  • 洗车机只嗡嗡响不出水怎么回事(高压清洗机喷不出水故障原因分析)

    我们在使用高压清洗机的时候,只要它处于高压状态下且其他部件完好,就可以把水喷射出来,起到清洁的作用。但是在有的时候,高压清洗机会有喷不出来水,这样就给操作的进度带来很多不利的影响。高压水枪不出水的原因比较容易解决,这种故障一般是发生在没有用水管将高压清洗机的进水口直接接到水龙头上,而是将水管直接放入到水桶当中时出现的,如果水桶与机器之间的高程差比较大,可能会…

    2022年11月3日
    1530

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信