tags: Vim Lua

写在前面

最近入坑vim了, 主要是想整一个纯键盘操作的编辑器, 用sublime当然方便, 但是还是需要鼠标点点点, 不知不觉中降低了效率. (但是过渡阶段还是得先用sublime的)

之前一个朋友就推荐过neovim, 并且帮我配置了在Mac的iTerm上的nvim环境, 当时没学过lua感觉配置起来bug很多, 为了稳定还是一直用的sublime, 直到后来我发现sublime的编译以及运行一些代码的时候需要很繁琐的配置, 格式化代码的插件也几乎都是8~9年前的了, 用起来很不方便, 于是还是想转入vim阵营((我是一直追求轻量级的)).

最近也一直在研究lua的一些基本语法, 不得不说lua脚本的语法真的是一股清流, 我以前就以为Python就是相当简洁明了的脚本了, 后来学了lua发现类与面向对象竟然还能这么写(通过Table), 真是大开眼界, 并且由于有了Python基础, 学起来lua配置nvim还是得心应手的, 只是对于一些vim时代留下来的API调用还是不熟悉, 这时候就要靠:h了.

除了lua基本语法的学习, 我还看了一本书, 名为《practical Vim》, 中译版在微信读书中有, 叫做《vim使用技巧》, 如果你熟悉了一些基本的vim技巧, 那么看起这本书肯定是爱不释手.

话不多说, 下面来看一个具体的配置应用, 就是关于上面介绍的书中说的一个技巧(其实书中并未提及相关实现, 但是作者提供的vimrc文件1中有说明), 是关于并行执行自定义宏的, 有了这个快捷操作, 你的vim用起来一定更加如虎添翼.

环境:

  1. MacOS arm64(M1)
  2. NeoVim 0.8.0 (with brew) config: ref2

并行执行宏

下面先来看看自定义宏, 假设有下面这些文本:

one
two
three
four

现在要给每一行前面加上一个行序号, 变成下面这样:

1) one
2) two
3) three
4) four

那么应该如何用宏解决这个问题呢?

  1. 光标跳转到第一行(gg)
  2. 进入命令模式设置变量i=1(:let i=1)
  3. 按下qa开始录制宏(保存在寄存器a中)
  4. 按下I将光标移到行首进行编辑
  5. 按下<C-R>(Ctrl+R)然后输入=i并回车(此时会显示出变量i的值1)
  6. 输入) (右半括号以及空格)
  7. 按下ESC(或者<C-[>), 然后按下q停止录制宏

上面一套流程之后, 文本变成了下面这样:

1) one
two
three
four

接下来开始执行宏, 即:

  1. 按下j, 光标跳到下一行(第二行)
  2. 按下V(shift+V)进入行可视模式
  3. 按下G(shift+G)选中直到最后一行的文本
  4. 输入:, 此时命令提示框会变成:'<,'>
  5. 后面接着输入normal @a, 并回车

这样就用并行模式执行了宏, 可以看到文本变成了如下:

1) one
2) two
3) three
4) four

这就是我们想要的结果~

为便于使用, 下面我录制了一个GIF动画:

快速执行宏操作

下面我参考了1的vimrc配置, 其中有一个快捷操作, 就是说不用输入:'<,'>normal @a, 直接选中指定行之后输入@a即可完成宏的操作. 下面是我为了在nvim上使用vim的函数配置, 加上了vim.cmd.

vim.cmd([[xnoremap @ :<C-u>call ExecuteMacroOverVisualRange()<CR>function! ExecuteMacroOverVisualRange()echo "@".getcmdline()execute ":'<,'>normal @".nr2char(getchar())endfunction
]])

但是这不是一个很lua的写法, 下面我用lua以及nvim提供的API函数重写了上面的快捷配置函数:

function vim.fn.ExecuteMacroOverVisualRange()vim.api.nvim_echo({{"@" .. vim.fn.getcmdline()}},false,{})vim.fn.execute(":'<,'>normal @" .. vim.fn.nr2char(vim.fn.getchar()))
end["x|@"] = map_cu("lua vim.fn.ExecuteMacroOverVisualRange()"),

参考2.

-- 这里我参考了大佬的配置, 直接定义函数即可, 注意这里用的函数原型为
function rhs_options:map_cu(cmd_string)-- <C-u> to eliminate the automatically inserted range in visual modeself.cmd = (":<C-u>%s<CR>"):format(cmd_string)return self
end

可以达到一样的效果.

Ref


  1. dotfiles/vimrc at master · nelstrom/dotfiles (github.com); ↩︎ ↩︎

  2. ayamir/nvimdots: A well configured and structured Neovim. (github.com); ↩︎ ↩︎

neovim中并行运行宏的快捷操作与lua脚本实现相关推荐

  1. Facebook开源ptr:在Python环境中并行运行单元测试

    Facebook开源了一个名为Python Test Runner(ptr)的新项目,允许开发人员运行Python单元测试套件.ptr和现有测试运行器之间的主要区别在于ptr通过爬取存储库查找一定的P ...

  2. Win2003 运行 命令行 快捷操作

    在Win2003的 C:\WINDOWS\ServicePackFiles\i386 文件夹下 有一些.exe文件 我们可以通过在 开始菜单的运行命令窗口 输入上面的相关.exe文件名 进行快捷操作 ...

  3. linux 并行执行脚本,在bash / linux中并行运行shell脚本

    我有一个shell脚本job.sh. 内容如下: #!/bin/bash table=$1 sqoop job --exec ${table} 现在当我做./job.sh table1 该脚本成功执行 ...

  4. redis原子性读写操作之LUA脚本和watch机制

    为什么80%的码农都做不了架构师?>>>    最近在开发电商平台的子系统--储值卡系统,系统核心业务涉及到金额消费以及库存控制,由于redis事务并不能保证操作的原子性,因此为了解 ...

  5. 3D Touch介绍:电子秤App与快捷操作

    随着iPhone6s与6s plus的到来,苹果给我们展现了一种全新的交互方式:重按手势.你可能知道,这个特性已经在Apple Watch和MacBook上推出了,不过那时叫Force Touch,就 ...

  6. 我的世界java如何快速拿东西_《我的世界》八个基本快捷操作,只会三个的萌新请自觉对号入座!...

    大家好,我是大黑.<我的世界>虽然已经多年,但全球高达数亿玩家热度一直居高不下!也因此每时每刻,都会有新来的小伙伴加入mc的大家庭.所以大黑决定写一篇给萌新的基础科普文,介绍JAVA版下M ...

  7. Java生态/Redis中如何使用Lua脚本

    文章目录 一.安装LUA 1)简单使用 二.lua语法简介 1.注释 1)单行注释 2)多行注释 2.关键字 3.变量 1)全局变量 2)局部变量 4.数据类型 1)Lua数组 2)字符串操作 5.i ...

  8. 在C/C++中调用LUA脚本简介

    简介 LUA脚本是一种可以嵌入C/C++模块的解释型语言,解释性语言与C/C++之类的编译型语言比较优点在于它无需重新编译即可生效,在处理得当的情况下甚至不需要停下程序.LUA只内置了一个功能简单的库 ...

  9. python脚本转lua_从Python运行Lua脚本

    假设我有一个包含2个函数的Lua脚本.我想用Python脚本中的一些参数调用这些函数中的每一个. 我已经看过如何使用Lunatic Python在Python中嵌入Lua代码的教程,反之亦然,但是,我 ...

最新文章

  1. c语言程序设计江宝钏实验六答案,《C语言程序设计》(江宝钏著)实验三答案.doc...
  2. windows聚焦壁纸不更新_技术编辑示范win10系统锁屏壁纸聚焦不更新的处理教程
  3. Hadoop3.0基础平台搭建(三节点),以及案例运行并使用python生成词云
  4. 让人期待的2011年度最佳 jQuery 插件发布啦
  5. Python random模块sample、randint、shuffle、choice随机函数
  6. 黑客攻防技术宝典web实战篇:工具web服务器习题
  7. c语言数据结构实验约瑟夫(Josephu)问题
  8. 传说中的世界500强面试题-
  9. 全面解读人工智能、大数据和云计算的关系
  10. 甘特图:有效的项目管理计划怎么制定?
  11. airdrop搜不到对方_如何在Mac的Finder中将AirDrop添加到收藏夹侧边栏
  12. 条件概率公式、全概率公式以及贝叶斯公式
  13. 三十多岁,如何打理尴尬年龄里的凌乱人生
  14. un9.9:实现上报及上报状态修改功能。
  15. java中j=j++和j=++j的理解
  16. 为什么在校大学生都要考计算机证书?要考几个证?
  17. error: can‘t create transaction lock on /var/lib/rpm/.rpm.lock (Permission denied)
  18. DSP2837d双核调试
  19. 林大OJ--2031 凯撒密码
  20. 托管与非托管数据转换方法之C#设计笔记(十三)

热门文章

  1. HashMap-20210602
  2. 浏览器输入www.baidu.com
  3. 什么是智慧建筑(in preparation)
  4. inux定时清除缓存
  5. win10如何快速切换到桌面
  6. jsbridge实现及原理_Android JSBridge的原理与实现
  7. 关于Altium Designer 提示发送错误报告解决方法
  8. 如何在Github上创建可访问的静态网站
  9. oracle集群概念详解
  10. 20201227一周学习总结(CNN)