如何使用Lua写一个NeoVim插件
之前学习了如何写 Lua 程序,又因为 NeoVim 的插件可以用 Lua 写,所以想学习一下插件开发。 插件目录结构 我们的插件应当有至少两个目录:plugin用于放main代码文件,lua放其余的所有代码。当然,如果我们真的想把所有代码放在同一个文件里面,这也是可以的。但是请不要这样。因此,使用plugin/whid.vim和lua/whid.lua这两个文件就可以了。 ...
之前学习了如何写 Lua 程序,又因为 NeoVim 的插件可以用 Lua 写,所以想学习一下插件开发。 插件目录结构 我们的插件应当有至少两个目录:plugin用于放main代码文件,lua放其余的所有代码。当然,如果我们真的想把所有代码放在同一个文件里面,这也是可以的。但是请不要这样。因此,使用plugin/whid.vim和lua/whid.lua这两个文件就可以了。 ...
最近何同学和稚晖君都发视频了,巧合的是他们做的项目都是关于键盘的魔改,不过人比人还是气死人嗷。 何同学本质上走的还是网红甚至说是饭圈路线,并没有很硬的实力,也就导致了大部分理工科的“直男”都会看不起甚至讨厌他。 ...
最近看到了一些关于侵入式和非侵入式链表的讨论,决定研究一下它们两个。 侵入式和非侵入式链表的区别 这里的侵入是相对于链表的指针域来说,所以最主要的区别就是非侵入式的链表容器中保存了一份用户传入的值。 ...
继续学习 OpenMP 的使用,尤其是一些较新版本。 OpenMP 4.0 Controlling OpenMP thread Affinity 因为很多硬件如今是 NUMA 结构,分配线程的位置可以很大程度上影响性能。 与核绑定有关的 OpenMP 结构 proc_bind (master | close | spread) ...
写 OpenMP 的时候总是感觉怪怪的,不知道什么时候该用什么,所以最近系统化地看一遍 OpenMP 的使用,主体为 OpenMP 2.0 和 3.0。 What is OpenMP? OpenMP Model 每个线程都有可以访问全局的共享内存。 数据可以是共享的也可以是私有的。 共享的数据可以被所有线程访问。 私有数据只能被拥有它的线程访问。 数据的传递对于编程者是透明的。 同步会发生,但是它大部分时候是隐式的。 ...
突然发现自己从高二以来基本没有读过“闲书”,意识到这可能正是现在诸多烦恼的原因之一吧…… 其实从初中以来,我所阅读书籍的文学性都是在下降的,我看过的大部分文学名著都是在初中及之前看的,在之后就是科幻和一些功能性的书了,再就是各种评论性的文章,抑或是看不懂也要看的哲学或者诗歌。 ...
Lua 的一大特色就是协程的使用,在解释型语言中,如果不考虑嵌入到较为低级的语言(如 C 语言)中,就只需要操作调用栈并保存好上下文状态即可。但是 Lua 并不是一门纯粹依靠字节码的解释型语言,它常常与 C 语言反复嵌套,甚至出现 C 中调用 Lua ,Lua 中再调用 C 代码,,,的情况。一旦 Lua 调用的 C 库企图中断线程,再想恢复,就会是一个难题。好在 Lua 巧妙地解决了这些问题。 ...
之前学习 Lua 的时候就对它的 Table 很感兴趣,最近在看 Lua 解释器的源码,因此就想研究一下具体是怎么实现这个 Lua 之中最为重要的数据结构的。 Lua Table 简介 在 Lua 语言之中,数组是 table ,字典是 table ,就连对象、模块、包也是通过 table 实现的: ...
C 语言没有原生支持异常处理,但是可以使用setjmp和longjmp函数实现类似try ... except的功能。 本文主要参考: C Interfaces and Implementation Implementing exceptions in C setjmp.h setjmp.h是 C 标准函数库中提供“非本地跳转”的头文件:控制流偏离了通常的子程序调用与返回序列。互补的两个函数setjmp与longjmp提供了这种功能。 ...
Rust 支持函数式编程,因此高阶函数、闭包等特性都不可或缺。 本文主要参考了 Rust Course 和 Rust 标准库文档。 什么是闭包 闭包是在支持头等函数的编程语言中实现词法绑定的一种技术,与函数不同的是,它可以捕捉自由变量,这意味着即使脱离了闭包创建时的上下文也能正常运行。 ...