【又开新坑】RSVim: Vim written in Rust with TypeScript
本帖最后由 obiy 于 2024-9-23 17:35 编辑省流:重新造轮子,项目刚开半年。脚本抛弃了Vim和NeoVim用的,选择TypeScript(嵌入Deno),作者的观点是作为脚本语言够快,特性也够先进。
说实话(前端以外的)程序员群体对于JavaScript(及其衍生)普遍是敌视态度,不太看好。
GitHub
作者写的项目动机(英文),以下为翻译:
Vim 和 Neovim 编辑器在世界各地广受开发人员和文字编辑者的欢迎和喜爱,我也一样。
历史
在由 Bram Moolenaar 领导 Vim 开发的过程中,一直存在一种趋势,即用户希望通过提供各种插件的方式将 Vim 变成一个 IDE:文件资源管理器、UI 组件和图标、代码补全、诊断、代码格式化等等。Vim 使用了 vimscript 作为其一等公民来进行支持,但这其实是非常小众的,并且阻碍了人们创建自己的插件、或给 Vim 项目本身提交代码(当然也和 vimscript 自己的文档和语法设计有关)。Vim 的可扩展性和用户需求之间的冲突一直在增加。
随后 Neovim 于 2014 年问世。为了提供更丰富友好的功能,以及更接近 IDE 的编辑体验,它引入了 lua 作为脚本语言, LuaJIT 作为运行时解析器。这在一开始引起了很大争议,因为 lua 既带来了不兼容 vimscript 的破坏性更新( vimscript 作为专门为 Vim 设计的脚本语言,确实更能融入编辑器中),又不像 python 或 javascript/typescript 那么受开发者欢迎。在 Neovim 和 lua 出现之前,Vim 社区通常利用这些外部语言来实现复杂的插件,例如自动补全、文件资源管理器等。但是,编辑器本身和语言解释器/运行时之间的 IPC 开销无法消除,额外增加一个语言也无法开箱即用。
事实证明 Neovim 的选择是成功的,luajit **提高了性能,而 lua 提供了更好的语法(与 vimscript 相比)来处理用户自己的逻辑。这鼓励了更多用户创建自己的插件(包括我自己),以及给 Neovim 项目提交代码。与此同时,Vim 带来了 vimscript9 作为替换原 vimscript 的更好的脚本语言,但这仍需要付出很多努力,包括开发/维护以及时间和用户反馈。显然,嵌入一个现成的脚本语言要容易得多,也快得多。
脚本
脚本在 (Neo)Vim 编辑器中扮演着一个最为重要的角色:它驱动着编辑器的外观和行为、调度着后台任务、负责与远程进程通信、等等。与此同时,它也将编辑器变成一个语言解释器/运行时/虚拟机。当我们将 (Neo)Vim 编辑器看作一个语言解释器时,我们会开始思考更多的方面:
现代的编程语言特性:函数式( Functional Programming )编程:迭代、闭包、无副作用、等等特性,内置的异步( Async/Await ),静态类型( Static Type ),以及很多其他特性。
包的管理、升级和分发。比如:lua 的 luarocks,js/ts 的 npm,python 的 pip。
选择 lua 的劣势逐渐显现出来,毕竟它受限于自己糟糕的语法设计,也缺乏庞大的社区支持,远远落后于上述这些真正流行的脚本语言。
这就是为什么在审视( Neo ) Vim 编辑器时,突然会冒出用 Rust+Javascript 重写(重新发明)它的想法。与 c/c++相比,rust 提供了如此多强大而高效的语言特性,更别提它的工具链和活跃的社区。至于脚本,我们希望有一个包含以下特点的脚本语言:
包括上述这些脚本语言的现代化功能、包管理系统。
流行且广受欢迎和使用,拥有活跃的开发社区。
性能出色,不会让编辑器卡顿。
其实我们没有太多选择:
Python 太慢了
其他脚本语言如 lua/vimscript/lisp 并不那么流行,一些新的脚本语言仍然太年轻,尚未被广泛使用。
Javascript 满足了大部分的要求,谷歌在 V8 引擎上花费了数百万美元和不计其数的开发时间,社区也出现了 QuickJS,两者都是非常好的内置入编辑器的解决方案。但是等等,js 的语法糟糕且混乱,它的成功实际上属于浏览器和网络行业,并非 js 本身。所以最终的目标是用 typescript 编写脚本,js 则可以扮演一个中间层的角色。ts 弥补了 js 的一些缺点:
更优雅和漂亮的语法设计
静态类型
完全兼容 js 和社区
TUI
另一个强劲趋势是:越来越多的 (Neo)Vim 插件通过定制 floating window 和 buffers 来提供复杂的 UI 部件。甚至还出现了一些 TUI 库/框架,它们将 (Neo)Vim 视作一个包含着 UI 部件的屏幕。这个想法引导我们看向一些现代的 GUI 框架甚至 Web UI 组件,例如 Qt、Tk/Tkinter、Material UI、Iced。
大多数 GUI 框架都支持以下功能:
坐标系统:管理 UI 在二维坐标系上的形状、位置和大小,以及在三维坐标系上的碰撞和叠加(通过引入第三个维度的坐标,即 Z-index )。
事件处理:根据位置和形状,可以定位用户发出的键盘/鼠标事件,将其分派到绑定在 UI 部件上的相应处理函数(回调函数),从而简化用户逻辑的处理。
布局:UI 的形状可以是固定尺寸的或灵活可变的,甚至是可以由 css flexbox 这类机制进行管理,如按行排布、按列排布和按网格排布。
特制化的 UI 部件:按钮、弹出窗口、对话框、内容预览器、文本编辑窗口等。
通过引入具有此类概念的 TUI 引擎,可以改善视觉效果、标准化小部件行为并减少插件开发工作量。
我用Emacs,感觉几个分支要么合并进来要么就没啥声量 vimscript够用了,想不出有啥用js的必要
真要在vim里用js写个os吗 rust+js的确是最显而易见的选择,不过如果不支持vimscript的话那也很难说是vim了,否则evil也是vim。 虽然但是,确实对 deno 有偏见,吹得震天响,结果落地的项目都 g 掉了,这个也算是开新坑了,实在不看好。 UI那段纯搞笑,谁不知道Qt好啊,但是Neovim的UI别扭是因为它100%兼容终端啊,SSH上去都可以用。
你要跑到GUI/Web UI的赛道上,那我凭什么用你而不用VS Code/Zed? 归蝶 发表于 2024-9-23 21:57
UI那段纯搞笑,谁不知道Qt好啊,但是Neovim的UI别扭是因为它100%兼容终端啊,SSH上去都可以用。
你要跑到G ...
说的是TUI,那当然是兼容终端的。只是在说要拿GUI框架的思路做TUI。 Nanachi 发表于 2024-9-23 21:12
我用Emacs,感觉几个分支要么合并进来要么就没啥声量
+1,remacs和之前用guile重写的Emacs都没啥声音了
不过Emacs该怎么说,基本上属于只要你能清真地写出来就敢合 前几年有个yew,rust框架下的react
本来准备研究一番,结果来了个前端项目大整特整ts去了
现在看这个技术选型,应该也是没啥动静了吧
—— 来自 Xiaomi 22041211AC, Android 14上的 S1Next-鹅版 v3.0.0.81-alpha 麻仓月轩 发表于 2024-9-23 22:32
前几年有个yew,rust框架下的react
本来准备研究一番,结果来了个前端项目大整特整ts去了
现在看这个技术选 ...
原生UI有iced 一直用来在做cosmic, 互相进化吧
那个生态明显比yew这种要符合实际一些 不是,这何必管自己叫 vim 呢?一没从 vim fork,二也没打算兼容 vim,我寻思半天,这顶天算是又一个支持 vim 键位的新编辑器,天底下支持 vim 键位的编辑器何其多,话里话外整得跟下一代 vim 一样,对js的偏见不谈,对R的偏见倒更深了,R门! posthoc 发表于 2024-9-23 22:03
说的是TUI,那当然是兼容终端的。只是在说要拿GUI框架的思路做TUI。
好吧,刚起床没仔细看就口胡了。下午摸鱼看了看他现有的文档,只能说是想法有些东西的,但是一个人的项目开头就铺这么大就感觉很不可靠。且不说抛开VIM生态另起炉灶的问题,他说的那些NVIM的不足本身也没有什么是根本性的局限。比如插件包管理,成熟的方案有一堆了,本身就是个单用户的应用软件,没必要照搬互联网大型项目那一套。LUA也不是什么小众语言,非要换成JS Runtime的意义何在?怎么看这都只是一个自娱自乐的项目
rust写的类vim不是已经有个helix了吗 可能这就是编程界O神的威力吧 不明觉厉,rust现在一般哪里用?
—— 来自 鹅球 v3.2.91 UNICORN00 发表于 2024-9-24 13:45
不明觉厉,rust现在一般哪里用?
—— 来自 鹅球 v3.2.91
体感是重新造各种更高效的轮子,我自己在用而且比较好用的rust开发的工具:eza, nu-shell, starship, zellij, ouch dangoron 发表于 2024-9-24 15:14
体感是重新造各种更高效的轮子,我自己在用而且比较好用的rust开发的工具:eza, nu-shell, starship, zel ...
厉害了
—— 来自 鹅球 v3.2.91 物理化学之类的仿真器有必要用rust重写一遍吗? 八佾舞于潭 发表于 2024-10-7 14:34
物理化学之类的仿真器有必要用rust重写一遍吗?
现在还不到谈这个的时候,目前 rust 现在写的都是小工程,基本还处在一个漫长的验证阶段。虽然用 rust 写的东西越来越多,但是积累的经验还不够。
页:
[1]