分享篇文章:为什么我会使用 Vim ?

2022-08-27 01:36:11 +08:00
 skywind3000

正文请点击:

18952 次点击
所在节点    Vim
195 条回复
zjsxwc
2022-08-29 09:07:11 +08:00
拓展插件 还是 emacs 自由一点
spesun
2022-08-29 10:07:57 +08:00
个人使用起来感觉 vim 最强的是,在 normal 模式操作时相当于多了很多快捷键,而且很多编辑器、浏览器、文件管理器等都支持按照 vim 的快捷键进行类似操作。学了一次以后,很多地方的基本操作都是通用的。
james122333
2022-08-29 15:00:15 +08:00
赞同楼主想法 vim 除了原本的使用方式有看点 扩展也简单且灵活 至于编辑器本身没有的功能可以透过外部程序 快捷键数量也十分多 组合键 连续键都可以 会觉得按键冲突本身就有原因 很多扩充很喜欢用全域变量与全域键盘映射 但是在 vim 下这些都是有作用域的 你可以不同缓冲区不同页签下使用不同的设定 不同模式下也有不同键盘映射 vscode 下 tasks 不用说了 这是很差的作法 换是我直接在项目目录下放一个.vimrc 然后启动的时候最后读取 可以根据项目自定义需要的设定 个人都是这么做 至于代码 format 说实话的 vim 本身都不一定需要提供和实作 因为 vim 可以调用外部命令修改当前文件内容并反馈至屏幕上 至于其他编辑器或 IDE 写扩充的方式不用说了 有人爱写就去写 反正我是受不了一个简单的事情搞得太复杂 markdown 的情况则是规范都没统一 要解决也不是不可以 只要你命令行功底高这都是可以解决的 差别在于技能的不同
11232as
2022-08-29 17:18:26 +08:00
@LxExExl 那个是 vim 的 regex,```s/<regex>/<replacement string>/g```是用来替换得,```g/<regex>/d```是用来删除得
daveh
2022-08-29 17:43:19 +08:00
@L4Linux #119 你这话 OP 还有那 vim 博主都不敢这样说。

你这是没用过 JB 系甚至 VS Code 吧? JB 系按双 Shift ,VS Code 按 F1 还是啥来着,直接输入你要执行的操作或功能,回车执行,全过程键盘操作。特别 JB 系,基本每个操作都可以分配快捷键,就怕快捷键不够用,想全程脱离鼠标完全没问题。
james122333
2022-08-29 18:20:45 +08:00
@daveh
组合键不高效 F1~12 距离长 而且考虑到一个快捷多种行为会更低效 甚至我连设定都不想用鼠标
daveh
2022-08-29 19:11:31 +08:00
@james122333 不知道你想说什么?
这样吧,你理解 JB 系的双 Shift 、还有双 Ctrl ,以及 VS Code 的 F1 ,就是 vim 的 ESC : 命令行模式好了。
monetto
2022-08-29 19:31:42 +08:00
@daveh 支持。

说实话,我还是不理解,为什么我在 JB 里面,一眼就能看明白的,满足我 90% 使用场景的事,放着不用,我要去 Vim 里面花大把大把的时间去学习配置和学习概念,用大量大时间堆砌一个能满足我 95% 使用场景的工具?我是多跟自己想不开...
james122333
2022-08-29 19:58:47 +08:00
@daveh

我指的是你指定其他动作(如开启档案等一些基本操作)是否也要用组合键 组合键与 F1~F12 本身就不高效 然后绑定一个快捷运行连续行为更是麻烦(这是脚本好处) 然后最后指的连设置都不想用鼠标对应你回应的"全程 keyboard driven"
快速启动与 vim 下的命令行模式差非常多... vim 下命令行模式可以指定变量、键盘映射、呼叫命令函数甚至直接执行 vimscript 逻辑 而且都是内建直接呼叫就好 你 run groovy script 可以实现非常多 但就不是内建而且你总要先经过设置这一关 还是得用鼠标
james122333
2022-08-29 20:01:41 +08:00
当然纯 keyboard driven 可以 但我相信没人想先 alt+x 启动选单一直按 tab 跳转来设定
或者直接写 xml 设定 完全就是悲剧
james122333
2022-08-29 20:03:12 +08:00
如果都没 vim 插件 纯用 run 光 vim 下常规操作都够呛...
XIVN1987
2022-08-29 22:04:35 +08:00
@drackzy

这个视频里作者写配置文件的时候都没有补全提示,,vscode 里面配置文件是有自动补全的。。
daveh
2022-08-29 22:05:53 +08:00
@james122333 你还是打一下标点符号,要不看不大明白,看起来也比较累。
VS Code 我不用不好回答它的 F1 有什么功能。
但 JB 系的双 Shift ,名称虽叫 Search Everywhere ,实际上不仅仅是搜索,其功能也是非常强大的,你的疑问建议有条件自己试试。
前面说过 IDE 的所有操作,基本上可以用这个入口键盘操作完成,包括你说的打开文件,以及各种动作。并不一定需要去绑定快捷键,当然快捷键也是一个很好的方式,你甚至可以通过这个入口去绑定快捷键。
IDE 的设置也可以通过这个入口去完成,并不是你想象的要用鼠标去改设置,常用设置输入名称,选中回车即可,需要查找设置用 / 开头搜索各种设置,改键盘映射什么的都行。
甚至它还带一个简单的计算器,直接输入算式它给你出结果,说明其扩展性也非常强,有什么其他诉求自己写插件就行。我不清楚为什么有人要这样去执行脚本,或者用什么变量、函数,如果有这样诉求但官方不支持,写个插件增加一种 Search 类型去处理脚本不是难事。
james122333
2022-08-29 22:57:14 +08:00
@daveh

测了一下双 ctrl 跟双 shift 是不同东西 但这东西是半残的 稍微方便一点 但离方便自定义快捷还有一堆设定是不行的 我依旧要按个老半天 还要随时从中间打字区换成方向键 搭配 ctrl/shift/alt/f1~f12 键本身就不是很好用 计算机那更不用说了 这 vim 本来就可以做了 还可以做的更多 大家都知道插件可以... 重点是插件怎么来的... 会写 intellij 或 vscode 插件的人本来就不多 相较之下 vim 容易多了 这正是楼主强调的 甚至不需要高深编程经验就可以自定义
daveh
2022-08-29 23:23:50 +08:00
@james122333 呵呵,好吧,算了吧,没看懂你想做什么?你不想方向键你把文字输完整不就行了?你用 vim 难道还不用输入文字?我寻思你用 vim 输入命令也不用方向键吗?不想用 ctrl/shift/alt/f1~f12 就别用快捷键呀,这都是个什么问题?都矫情成这样了。
懂 JVM 类语言的人都可以很快写插件,不懂的人直接下别人做好的插件,需要什么高深的编程经验呢?
倒是 vimscript ,也是一门不太流行的编程语言,想写好又没有很好调测手段,需要的技能非常高。
james122333
2022-08-29 23:49:31 +08:00
@daveh

方向键是选择细项 当然各种操作都会用到 频率太高 输入命令补全就好不用方向键 intellij 预设能让你选择不要用组合键和鼠标吗 这是实话不矫情 写插件都需要该应用的知识不只 jvm. 就是有功能需要才看重简易扩展 已有的本身就不是万灵丹 所以这里一直都有月经帖
难道还要向插件开发大佬跪求插件... vim 本
james122333
2022-08-29 23:56:10 +08:00
vim 本身就不是没门槛。 脚本也确实没那么多人用 但相对于其它语言是易用的 本身文档也充足 还有一些网路文章。正适合楼主和类似我的人
L4Linux
2022-08-30 00:41:10 +08:00
@daveh 我从来没按过方向键以及 home 这一类的键。Fn 只在切 TTY 和 BIOS 里设置好的调整屏幕亮度之类的时候才按。

IDE 和 VS Code 就别来碰全键盘操作这个瓷了,你让 JB 把所有快捷键都绑上啊?小心别和你的图形环境冲突了。
skywind3000
2022-08-30 01:38:57 +08:00
@ColorfulBoar 70 楼,不要出来丢人了。

计算机分支技术那么多,从来没见过哪个领域,像某些 C 艹 er 一样喜欢卖弄的,急着想给人当老师的。看了下你的回答,说你是语言律师都高抬你了,比你有水平十倍的人都不会像你这么爱卖弄。

## 指针

> 居然还指着一个内部 private/protected/public 乱飞还藏着个 virtual destructor 的 class 讨论跨二进制

我好心提醒你 xxx_ptr 跨二进制要挂,你来跟我说我写的 BasicBitmap.cpp 不能跨二进制,合着我哪句话跟你说过,我说了句 “跨二进制” 那么我所有类都要跨二进制了?你脑袋是不是进水了才会理解成这样?

BasicBitmap 本来就不是为了跨二进制实现的,天生就是为了继承设计的,它后面可以继承 GdiBitmap, GdiPlusBitmap, DDrawBitmap ,提供出不同风格的 Bitmap 来,

> 行还是回去复习一下 COM 是怎么搞的吧,Essential COM 第一章就行

COM 里不就是依靠 Release 代替析构保护跨二进制不同堆的析构释放冲突问题么,老衲二十多年前写 COM 时看一眼就明白了,用得你来教?你哪年学会的 COM ?写过多少 COM 相关代码啊?

> 裸指针手动释放配合多个退出路径是件多么可怕的事情,在 goto 和 goto 到的进行集中错误处理的地方中间会发生什么可怕的事情

现代程序,内存分配失败就应该 assert 了,还 goto 多路径释放啊?即便要处理,也只是构造和析构里刻意注意下罢了,这种你都写不来么?

> 它最后(在你不手动塞进去奇怪的 deleter 的时候)生成的代码真的和裸指针有区别吗(当然前提是后者用对了并确实持有所有权)。

生成代码是一致的,但是我也不想到处用,为啥?根本不是性能问题,有些人干什么事情都爱带套,明明就是只有这个类用的资源,构造里产生,析构里删除,你觉得非要套个 unique_ptr 的套套你才舒服,我也没说你不对,但是干什么事情都头上都要顶个套套,更多人会觉得浑身不自在,就像明明没下雨,有个二百五非要穿一件雨衣在操场上跑步一样,凡事有利有弊,到不说说不能跑,只是觉得这么搞有点二,有点书呆子的感觉。

> 再思考一下什么人会在别人指着拿指针传进去的字符串的时候第一个反应不是证明这里不适合用(w)string_view 。

你以为代码只在你一人的机器上编译吗?有些象牙塔里 C 艹 er 就是喜欢对着新标准就高潮,从来没考虑过客户的编译环境,因为他们很少做真实交付的项目,不是说新标准不好,string_vew 的 17 标准里也有我想用的东西,比如 if constexpr ,可以让我的代码编译期做判断提升性能,但是我忍住没用了,改用模板和宏去模拟,为啥?

不是迫不得已非必要不升级,我想尽量维持 14 以下的标准,因为 PyStand 本来就是辅助 Python 部署的一套库,我希望用我项目开发的人至少可以在 xp 下发布他们软件,并且大概率手上的编译器都可以编译。

这些工程领域的侧重和思考,真的不是某些甚至校园都没出过,正儿八经的项目都没做过几个小儿能理解的啊。

再,即便 14 里有 string_view ,我也不想用,string_view 这种东西我看不上眼,正式项目里我用自己仿照 Qt 实现的 QString ,std::string / string_view 这种东西同 if constexpr 不是一回事情,我真看不上,QString 有多强,你可以学习下:

https://www.zhihu.com/question/54664311/answer/140476787

大道至简,这个 PyStand.cpp 很简单,我不想引入太多依赖,这么简单的代码,这么简单的指针用法你都 hold 不住,非要带一个 string_view 的套套,当我没说。

> 另外正常人也别写这种 string 转 wstring 都能搞得一坨 magic number 乱飞的代码,不会转可以塞进 std::filesystem::path 让它自己转

又来,我跟你说了我希望尽量限制标准在 14 及以下,你完全 get 不到我的角度。

有一种虫,春天出生,到了夏天就死掉了,你跟它说冰是怎么一回事情,它是永远不可能明白的,所以叫 “夏虫不可语冰”,我觉得写代码让更广泛的编译器支持我的代码的意义,比只知道无脑飙 C++ 版本更有意义。算了,没做过啥真实交付项目的人,说一百遍他都领会不到。

> C 风格指针恶心人的程度已经是罄竹难书了,这连一半都不到

觉得恶心的话你去跟标委会那帮子鸟人提案,让他们把指针从 C 艹 下个版本里删掉啊,我乐见其成,看看他们听你的不。

有些 C 艹 er ,成天听到的名词不少,可实际深入点的经验全无,拜托你读两个真的工程上大量使用的项目代码再来这瞎 BB ,计算机领域很多,别总在你熟悉的那个领域里打转,真实的世界永远不是象牙塔那么的简单和纯粹。

## inline

> 如果后面的读者不想变得这么搞笑:inline 是让你处理 one-definition rule 的,或者再简化一点,inline 的意思是「你可以就把定义写在这」永远忘了内联优化这回事

所以说你从来只看得到一,看不到二三四。BasicBitmap 里,老衲前面已经给 inline `#define` 成具有 always_inline 属性的宏了,你是眼睛瞎了看不见,还是不知道什么叫做 always inline / force inline 啊?

## 底层

> 自行搜索 abstract machine 找个 talk 听一下 ... 还做着自己真的控制了编译出来的汇编的春秋大梦呢(顺便这种人恐怕一半不知道 CPU 上最后执行的不是一条条的汇编指令),实在不信找份 C++98 的文档(我感觉 C89 都行),搜一下 volatile 是干嘛用的。

计算机分支技术那么多,从来没见过哪个领域,像某些 C 艹 er 一样喜欢卖弄的,喜欢好为人师的,volatile 我二十多年前的代码里就有了,要你教么?

程序员别成天只知道代码,别满脑袋都是技术,走向社会要吃亏的,有空多了解下技术以为的人文知识,荀子曾说:“故不问而告谓之傲,问一而告二谓之囋。傲、非也,囋、非也;君子如向矣。”,看不懂的话我给你翻译一下,荀子他老人家说:“别人没有问就去告诉的,叫做急躁,别人问一个问题而告诉别人两个问题的,就叫做唠叨”。

动不动就 “你看看 A 去”,“你知道 B 吗?”,生怕别人不知道他懂一般,在荀子口中都是君子为人需要避免的东西,计算机领域博大精深,谁都有不知道的东西,动不动就想教别人一下,在你小圈子里没问题,出了圈还这么着,不能教而强教,担心闹笑话。

> 顺便看一眼 strict aliasing rule ,懒得搜可以直接读 https://www.ralfj.de/blog/2018/07/24/pointers-and-bytes.html 这个系列,再看看 C 语言大师们起手-fno-strict-aliasing 然后觉得自己特懂底层。

拉倒吧,就你懂,别人都不懂,得了吧? strict aliasing 鬼东西,我几年前就喷过了:

https://www.zhihu.com/question/19707376/answer/1174526354

上面那个 volatile 是合理的,因为编译器做优化时无从得知是否有另一个线程在访问同一个变量,因此如果计算的结果出于优化目的暂时不落内存而呆在寄存器里,那么另一个线程就无从得到最新值了,这是非常合理的设计。

但是 strict aliasing 这种傻鸟设计的东西不一样,这属于当年标委会那帮子鸟人设计出来的缺陷东西,全部遵守的话,全部遵守的话,让那帮象牙塔里的人来用当年的标准(不用 bit_cast 这些 20 里打补丁做裱糊的东西),他们都很难写出正确的 memcpy ,这不搞笑么?

所以不管 vc, clang 这些广经实践检验的编译器知道对这条要留神处理,gcc 早年版本也还好,只有最近几年的版本不知道是不是眼红 java/clang 的优化牛逼,自己又没本事进一步优化,才会这么丧心病狂的拿着这条标准里的鸡毛蒜皮出来最大化的恶心人。

语言设计要为实践服务,不用反过来,标准也不用跪舔,有缺陷就要承认,手动加 `-fno-strict-aliasing` 就是要帮那群鸟人做一个生理上的结扎,让他们不要出来祸害人间。你这么看不上 `-fno-strict-aliasing` 的话,把你电脑里所有用到这个的项目干掉,你看看你电脑还能不能启动。

## bonus

> 我看到图形引擎四个字终于想起来了……后面的人请打开 。。。跳到 DirectX 那一节,啊 2015 年……彼时 Metal 、DX12 、Vulkan 这一批现代图形 API 都已现世,早就翻来覆去讲清楚了传统状态机式图形 API 是一件多么恶心人的事情,在这个时间点居然能舔得下去 OpenGL……我已经说不出来话了,哪位心理学大师能帮我分析一下为什么一个这么热爱《底层》《精细控制》的人能喜欢上 OpenGL 。

拿着我一篇 2015 年写的旧文说我不懂 2015 年刚出的 Vulkan ,合着你 2015 年就用 Vulkan 写过程序?那我拜服你了,vulkan sdk 1.0 直到 2016 年才发布,你真牛逼。

象牙塔里的人就是这样,听过的名词一大堆,现实的项目没碰过,说起图形能谈论的就是几个 API 名称,除了这些大名字你还能谈论啥呢?

你只有本事把评论区六年前和我抬杆的人的 "状态机" 拷贝下来和我说,任何 API 都有不完美的地方,状态机是 OpenGL 不完美的地方,但是编程里不是没法处理的,事实上游戏和图形里的 render states 一般都比较稳定,同一批次的渲染指令一般都用类似的 states 执行,程序稍微注意下是很容易处理的,不是什么过不去的砍,后面新的渲染技术诸如延迟渲染和 shadow map 这些需要多个 pass 的,会频繁大量的切换渲染状态,2D 界面和 3D 物体的渲染也会大规模状态切换,这时,不管 Dx 还是 OGL 都有对应 API 来一次性保存和恢复 render state ,大部分引擎都会有一个 render context 的封装类,来处理这些大规模状态切换。

至于我不喜欢 DirectX 喜欢 OpenGL 的原因前面我也给出理由来了,D3D8 以前,DX 基本上是被 OpenGL 按在地下吊打的,D3D7 有时甚至做不到精确渲染,但是 OpenGL 没问题,可是微软出于商业目的故意打压限制 Windows 下的 OpenGL 发展,这个事情恶心到我了,尽管后来 DX9 开始做的不错。

## ?

> C++当然不止一种写法,但所有主动写 C with class 的 100%连基本的东西都没弄懂,永远在传播错误的认识。

不要生活在真空世界里了,C++ 比你厉害十倍的人我也经常和他们交流,真的懂 C++ 的根本不会像你这么阳春白雪。

你所想要消除指针的想法很美好,标准更迭那么多年了,年年有人骂指针,又没本事把指针从新标准里删除,所以如果你一定追求,大可以换个语言,不用写 C++。

某个领域的成功经验,换个领域就完全不适应了,而大部分人却只会把自己特地环境里成功的经验总结成万古不变的真理,进而在环境改变后碰到挫折还不能自知。

比如 GUI 领域的著名项目,Qt / wxwidgets ,看看他们是不是指针到处飞?语言领域的 v8 里面是不是到处飞指针?音视频领域的 webrtc/srs 这些是不是到处飞指针?只有局部地方才会有限制的用一下 xxx_ptr ,图形领域的各种 3D/2D 引擎 Ogre3D / Unreal / urho3d 哪个不是飞指针?他们不懂引用计数?他们懂啊,局部用,用也是用自己实现的,看不上你 std::xxx_ptr 。

系统开发领域唯一的 C++ 内核 Fuchsia ,它是用了 std::shared_ptr ,但是用的也是非常节制和有限,大部分地方还不是在飞指针。

为啥?就是你一直在笑话的“精确控制”,你但凡读一两个上面这类各个领域的著名项目,你都不会这么肤浅的尬笑了。你觉得飞指针就代表没有生命期和所有权管理么?非也,给个项目都有明确的所有权和生命周期的管理方法。

实在没时间读上面的代码也没关系,Qt 解释过自己为啥用裸指针,以及他的所有权管理:

https://doc.qt.io/qt-5/objecttrees.html

Rust 程序员给 qt 做 port 的时候都能意识到:

> Qt has its own ownership system that must be respected

连天天把所有权视作生命的 rust 程序员都能 respect ,不明白你个 C 艹 er 在这里一副要秒天秒地秒空气的样子干嘛?

工作上 C 艹 写的比你牛逼的人多的是,我很尊敬他们的,他们有学术素养又有成熟的工程意识,还能平实的和人讨论问题,可他们没有一个像你这样摇里晃荡的摆来摆去,像孔雀开屏一般,生怕别人不知道你有几斤几两。
skywind3000
2022-08-30 01:53:34 +08:00
@felixcode

> 其实楼主的帖子没说 VSCode 或其它 IDE 有什么不好。
> 但很多人一定要通过抨击 vim 的不好,来显示出自已用的 IDE 多么强大,用自己的方案多么合理。

是这么回事情,我向来只见过 vimer 们安安静静的在自己的板块下交流心得,从来没见过哪个 vimer 跑到大 JB 或者其他 IDE 板块下面去劝退,反倒是大 JB 和其他 IDE 的人按耐不住,经常跑了 vim 板块里踢馆,来说 Vim 都是垃圾。

他们的大 JB 和 IDE 那么好,自己用得爽不就行了,经常跑来 vim 板块里气急败坏的闹事和劝退为个啥?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/875730

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX