neovim中并行运行宏的快捷操作与lua脚本实现
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用起来一定更加如虎添翼.
环境:
- MacOS arm64(M1)
- NeoVim 0.8.0 (with brew) config: ref2
- …
并行执行宏
下面先来看看自定义宏, 假设有下面这些文本:
one
two
three
four
现在要给每一行前面加上一个行序号, 变成下面这样:
1) one
2) two
3) three
4) four
那么应该如何用宏解决这个问题呢?
- 光标跳转到第一行(
gg
) - 进入命令模式设置变量
i=1
(:let i=1
) - 按下
qa
开始录制宏(保存在寄存器a
中) - 按下
I
将光标移到行首进行编辑 - 按下
<C-R>
(Ctrl+R)然后输入=i
并回车(此时会显示出变量i
的值1
) - 输入
)
(右半括号以及空格) - 按下
ESC
(或者<C-[>
), 然后按下q
停止录制宏
上面一套流程之后, 文本变成了下面这样:
1) one
two
three
four
接下来开始执行宏, 即:
- 按下
j
, 光标跳到下一行(第二行) - 按下
V
(shift+V)进入行可视模式 - 按下
G
(shift+G)选中直到最后一行的文本 - 输入
:
, 此时命令提示框会变成:'<,'>
- 后面接着输入
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
dotfiles/vimrc at master · nelstrom/dotfiles (github.com); ↩︎ ↩︎
ayamir/nvimdots: A well configured and structured Neovim. (github.com); ↩︎ ↩︎
neovim中并行运行宏的快捷操作与lua脚本实现相关推荐
- Facebook开源ptr:在Python环境中并行运行单元测试
Facebook开源了一个名为Python Test Runner(ptr)的新项目,允许开发人员运行Python单元测试套件.ptr和现有测试运行器之间的主要区别在于ptr通过爬取存储库查找一定的P ...
- Win2003 运行 命令行 快捷操作
在Win2003的 C:\WINDOWS\ServicePackFiles\i386 文件夹下 有一些.exe文件 我们可以通过在 开始菜单的运行命令窗口 输入上面的相关.exe文件名 进行快捷操作 ...
- linux 并行执行脚本,在bash / linux中并行运行shell脚本
我有一个shell脚本job.sh. 内容如下: #!/bin/bash table=$1 sqoop job --exec ${table} 现在当我做./job.sh table1 该脚本成功执行 ...
- redis原子性读写操作之LUA脚本和watch机制
为什么80%的码农都做不了架构师?>>> 最近在开发电商平台的子系统--储值卡系统,系统核心业务涉及到金额消费以及库存控制,由于redis事务并不能保证操作的原子性,因此为了解 ...
- 3D Touch介绍:电子秤App与快捷操作
随着iPhone6s与6s plus的到来,苹果给我们展现了一种全新的交互方式:重按手势.你可能知道,这个特性已经在Apple Watch和MacBook上推出了,不过那时叫Force Touch,就 ...
- 我的世界java如何快速拿东西_《我的世界》八个基本快捷操作,只会三个的萌新请自觉对号入座!...
大家好,我是大黑.<我的世界>虽然已经多年,但全球高达数亿玩家热度一直居高不下!也因此每时每刻,都会有新来的小伙伴加入mc的大家庭.所以大黑决定写一篇给萌新的基础科普文,介绍JAVA版下M ...
- Java生态/Redis中如何使用Lua脚本
文章目录 一.安装LUA 1)简单使用 二.lua语法简介 1.注释 1)单行注释 2)多行注释 2.关键字 3.变量 1)全局变量 2)局部变量 4.数据类型 1)Lua数组 2)字符串操作 5.i ...
- 在C/C++中调用LUA脚本简介
简介 LUA脚本是一种可以嵌入C/C++模块的解释型语言,解释性语言与C/C++之类的编译型语言比较优点在于它无需重新编译即可生效,在处理得当的情况下甚至不需要停下程序.LUA只内置了一个功能简单的库 ...
- python脚本转lua_从Python运行Lua脚本
假设我有一个包含2个函数的Lua脚本.我想用Python脚本中的一些参数调用这些函数中的每一个. 我已经看过如何使用Lunatic Python在Python中嵌入Lua代码的教程,反之亦然,但是,我 ...
最新文章
- c语言程序设计江宝钏实验六答案,《C语言程序设计》(江宝钏著)实验三答案.doc...
- windows聚焦壁纸不更新_技术编辑示范win10系统锁屏壁纸聚焦不更新的处理教程
- Hadoop3.0基础平台搭建(三节点),以及案例运行并使用python生成词云
- 让人期待的2011年度最佳 jQuery 插件发布啦
- Python random模块sample、randint、shuffle、choice随机函数
- 黑客攻防技术宝典web实战篇:工具web服务器习题
- c语言数据结构实验约瑟夫(Josephu)问题
- 传说中的世界500强面试题-
- 全面解读人工智能、大数据和云计算的关系
- 甘特图:有效的项目管理计划怎么制定?
- airdrop搜不到对方_如何在Mac的Finder中将AirDrop添加到收藏夹侧边栏
- 条件概率公式、全概率公式以及贝叶斯公式
- 三十多岁,如何打理尴尬年龄里的凌乱人生
- un9.9:实现上报及上报状态修改功能。
- java中j=j++和j=++j的理解
- 为什么在校大学生都要考计算机证书?要考几个证?
- error: can‘t create transaction lock on /var/lib/rpm/.rpm.lock (Permission denied)
- DSP2837d双核调试
- 林大OJ--2031 凯撒密码
- 托管与非托管数据转换方法之C#设计笔记(十三)