首页 > 编程语言 >算法工程师的效率神器——vim篇

算法工程师的效率神器——vim篇

时间:2023-03-13 16:32:21浏览次数:37  
标签:文件 模式 vim 神器 算法 跳转 光标 分屏


算法工程师的效率神器——vim篇_分屏

一只小狐狸带你解锁炼丹术&NLP秘籍

算法工程师的效率神器——vim篇_数据集_02

我相信,有很多小伙伴在看到这篇文章时就有了很多问号:

用vim?疯了吧?sublime不香吗?pycharm不香吗?jupyter notebook不香吗?我这可是最新版的windows 100操作系统诶,你要劝我回到Dos/*nix年代??

没错,小鹿要硬着头皮劝了╮( ̄▽ ̄"")╭

其实对于做app开发、web开发等其他IT从业者来说,用vim的意义确实更多是出于情怀了。但是对于算法工程师,尤其是NLPer来说,vim简直堪称效率神器呀(用熟之后)。

想象一下,用熟vim之后,搬过来一个GPU服务器,你就直接ssh上去啪代码了,也不用折腾什么本地端与server端的通信和代码同步问题了。不管是写代码、看代码还是刷log,都可以一条命令搞定!而且最重要的是,vim超级轻量级,只要你手速够快,秒开秒关不再是高端笔记本的专属,再也不用盯IDE启动时的进度条了。(怎么像是在给vim写软文??给点钱叭。。。

遥想小鹿第一次接触vim的时候,看着黝黑的界面上唯一一个闪烁的白色光标,内心OS也是

黑漆漆的什么鬼,太不符合我的审美了叭我要IDE我要鼠标

慢慢熟悉之后,发现


算法工程师的效率神器——vim篇_vim_03


vim的技巧超多,还有一些提高vim日常操作效率的配置技巧,写不动了QAQ直接将自己的配置文件丢出来吧,在公众号「夕小瑶的卖萌屋」回复口令【vim】即可领取噢。

仅仅是“打开看一下”这个动作,vim就有非常非常多的玩法,可以让你非常方便的处理各种狗血的文件!

优雅的移动

很多初学者在光标移动、翻页问题上就被vim劝退了。对于比较保守的小伙伴,可能打开vim的第一件事就是按一个​​i​​进入插入模式,然后就开始上下左右移动光标了╮( ̄▽ ̄"")╭

要完成移动,确实有很多命令,但其实完全没必要都去记住,仅仅留几个常用的就好。

例如对于如下一个文件


算法工程师的效率神器——vim篇_分屏_04

如果想要在行内移动光标,怎么办呢?

初学者可能就按住→这个箭头,慢慢挪了╮( ̄▽ ̄"")╭这种是字符级的移动,速度非常慢。此时完全可以用​​w​​​和​​b​​来前后移动,分别表示向前或向后移动一个单词。词级别的移动就快多啦~

另外,如果你的目标恰好是在这一行的末尾附近,那么你完全可以用​​$​​​(shift+4)来直接跳转到行末。想再次跳回行首,则可以通过​​^​​(shift+6)完成。

注:^代表开始,$代表结束,其实是个非常通用的表示,在正则表达式中也是如此

如果要跨行移动呢?

这时候要分两种情况讨论,一种是不需要翻页(同一个屏幕内),这时候可以一直按着↑或者↓来移动(划掉),还可以 ​​数字+方向键​​​ 来一次性跳多行(例如 ​​5↓​​​就代表往下移动5行);另一种就是不仅要跨行,而且目标没有出现在当前视野范围内,需要翻页,那么就可以用​​ctrl+f​​​和​​ctrl+b​​来往前或往后翻。

跨屏幕移动跟行内移动一样,也会面临移动到头部和尾部的问题。若希望直接移动到文件结尾,则可以用​​G​​​(shift+G)直接跳转到文件最末行,​​gg​​​回到文件第一行。还可以通过​​N + %​​​ 跳转到文件的N%处,比如​​50 + %​​直接跳转到文件中间位置。

此外,还有定向移动,也就是查找啦~

​/text​​​直接查找跳转到text位置,如果text在文件中多次出现,可以用​​n/N​​向下/上跳转。vim的查找模式还支持正则表达式。举个例子,​​/^$​​​可以查找空白行(文首^和文尾$中间为空),​​/^I^I​​(/+Tab+Tab)查找制表符分隔的数据是否存在空值。

奇怪的文件格式与编码

tsv(制表符分隔)文件算是nlper最常遇到的数据集格式了由于vim界面很简单,所以不会有很清晰的分隔,这时候可以用​​:set list​​​显示制表符和行尾,最后​​:set nolist​​取消。


算法工程师的效率神器——vim篇_分屏_05

当我们查看一些中文数据集时,有可能出现乱码的情况。


算法工程师的效率神器——vim篇_分屏_06

这其实是一个GB18030编码的中文文件,​​:set fileencoding​​​查看当前文件编码。如上图红框所示(当vim无法识别文档的编码的时候,会使用latin-1去读取)。这时候可以通过​​:e ++enc=gb18030​​强行使用GB18030编码重新打开文件。


算法工程师的效率神器——vim篇_分屏_07

上面的命令都只是临时修改文件编码,大家也可以根据自己的经常使用的文件编码,在​​~/.vimrc​​文件中修改fileencoding配置。

愉快地编辑

在谈论怎么愉快地编辑之前,先说一下怎么优雅的进入编辑模式。

vim可以通过很多字母进入编辑模式,比如a、A,i、I,o、O等,不同的字母进入插入模式时光标的位置不同。按照小鹿的使用频次排序如下:

  1. ​i​​在光标原有位置进入编辑模式;
  2. ​o​​在光标所在处另起一行进入编辑模式;
  3. ​A​​在光标所在行行末处进入编辑模式;
  4. ​I​​在光标所在行行首处进入编辑模式;
  5. ​a​​在光标右边开始插入(这个一般与光标移动命令搭配使用);
  6. ​O​​在光标所在处往上另起一行进入编辑模式(这个模式一般用于文首插入空白行);

(感到懵逼的小伙伴请找个文件自行体会【手动狗头】

进入编辑模式后,就可以像之前一样随意玩耍了。不过,其实插入模式下也是可以使用一些“命令”的,只不过这些可能是系统级的了。比如​​ctrl+w​​​可以删掉一个单词,​​shift+左右​​可以左右移动一个单词(mac原生的terminal支持较好)。多掌握一些类似的tricks可以大大减少模式切换的频率,提高生产力。

命令模式下的简单编辑

对于一些简单的编辑操作,其实无需进入编辑模式也能完成。例如,在命令模式下,​​x​​​可以完成剪切(当删除来用也没大毛病),​​v​​​模式下选中文本后通过​​d​​​可以删掉这些选中的文本,​​dd​​​删除一行,​​数字+dd​​​删除若干行,​​:n,md​​​删除第n到第m行等等。除了通过​​x​​​进行剪切,也可以通过​​v模式+y​​​或​​yy​​​复制,然后通过​​p​​进行粘贴。这些操作都非常常规了,网上资料很多,就不赘述啦。

这里其实容易面临一个令人头疼的问题,就是无论通过​​d​​​还是​​x​​​,删掉的内容都会默认进入剪贴板,这就会导致边删边贴变得很麻烦。一个解决方案是使用“黑洞”来将​​d​​命令改造成真正的删除。

nnoremap d "_d

这时候如果希望像之前使用​​dd​​​一样剪切整行,就可以通过​​V+x​​(shift+v可以直接选中整行)来完成整行的剪切啦。不过还是需要一两天的适应期的。

批量编辑

“替换”是啪代码的超高频的操作,也可以用来编辑小型数据集文件和日志文件。

Tips: 先高亮查找,大体扫一遍后再执行替换可以大大降低造bug的概率

是时候祭出这张图了:


算法工程师的效率神器——vim篇_分屏_08

命令模式下输入上面????的命令即可在全文范围将所有old替换成new。

对于作用范围,常用的表达有:

%s #全文范围
s #光标所在行
n, ms #从第n行到第m行
., $s #光标所在行到文末,还没忘记$表示最末叭

同search一样,旧模式的匹配也同样支持正则表达式,最后的​​g​​​表示作用到范围中的所有匹配,没有​​g​​表示仅作用到所属范围每一行的首个匹配。

结合​​^/$​​​,可以使用查找替换命令在多行的行首或者行末添加内容。比如,​​8,16s/^/#​​实现对8到16行添加注释:


算法工程师的效率神器——vim篇_vim_09

此外,前面也多次提到的​​v​​模式(可视模式Visual Mode),跟插入模式的组合技也是一个批量编辑的神器。

​v模式+i模式​​​的组合技最常见的操作就是批量注释啦。​​ctrl+v​​​进入垂直v模式,移动光标选中需要注释的行之后,进入插入模式添加注释后,两次​​Esc​​即可完成批量注释。

这个操作不仅可以拿来注释,更是编辑数据集的神器(比如批量添加伪标签列),也是编辑调参bash文件的神器等。相关的进阶玩法下一篇再讲~

多文件操作

vimdiff

在快速开发迭代实验想法的时候,一个代码可能会衍生出n个版本,主干部分可能都差不多,唯一不同的是需要实验验证的一小部分(此处强烈推荐使用git实现版本管理,维护实验环境安全可回溯????)。而​​vimdiff file1 file2​​则可以快速帮助定位两个文件的异同,查看不同版本代码的差异~效果如下:


算法工程师的效率神器——vim篇_数据集_10

分屏

当我们阅读或者开发一个层级比较深的项目代码的时候,分屏打开多个文件可以大大提高效率,减少我们的记忆负担(有什么忘记了看一下右边的window就好????)

虽然vim支持分屏打开多个文件(横屏/竖屏/纵横交错皆可),但是小夕一般喜欢竖屏打开2-3个文件就好。(分屏太多会加剧操作的复杂度,增加失误的可能性)

以竖屏打开两个文件为例,如果事前就确定要打开的文件,可以​​vim -O file1 file2​​​直接打开,显示类似vimdiff的效果。如果是已经用vim打开了file1后,需要分屏打开一个新文件可以​​:vs file2​​(vs指vertical split)。

实现分屏后,之前介绍的所有命令都可以直接作用在光标所在的window。所以对于vim的分屏使用我们只需要再掌握各window之间如何跳转就好~

​ctrl + w + ←(h)/↑(j)/↓(k)/→(l)​​​可以精确控制跳转的方向,但是当分屏数不太多的时候,也可以精简成一个命令​​ctrl + w + w​​跳转到下一个window就好~

看到这里其实就可以使用组合技实现大多数分屏操作了。我们来举个栗子,如何利用分屏实现跨文件的复制粘贴?


算法工程师的效率神器——vim篇_分屏_11

假如分屏是这个样子的,然后需要把右边文件中的2-15行复制到左边的文件中。那么​​ctrl + w + w​​​光标跳转到右边;​​13yy​​​复制多行(出现红框的提示);再​​ctrl + w + w​​​光标跳转到左边;挪动到需要复制的位置,​​p​​复制;即可~

最后的效果如下。如果file2的作用已经完成,那么​​ctrl + w + c​​关掉该窗口就可以功成身退了~


算法工程师的效率神器——vim篇_分屏_12

还有一些提高vim日常操作效率的配置技巧,写不动了QAQ直接将自己的配置文件丢出来吧,在公众号「夕小瑶的卖萌屋」回复口令【vim】即可领取~

总结

本文谨分享了一些小鹿日常常用的vim命令,整理如下~更多命令可以​​:help​​查看官方使用文档

  1. ​ctrl + f​​ 往后(forward)翻一页
  2. ​N + %​​​ 跳转到文件的N%处,比如​​50 + %​​直接跳转到文件中间位置;
  3. ​G(shif + g)​​ 切换到文件最末尾;
  4. ​:set list​​ 标识出制表符和行尾;
  5. ​:set nolist​​ 取消标识
  6. ​/text​​​ 查找text,​​n​​向下跳转,​​N​​向上跳转
  7. ​/^$​​查找空行
  8. ​/^I^I​​(/+Tab+Tab) 查找空值
  9. ​sort​​ 排序
  10. ​u​​撤回最近修改
  11. ​i​​在光标原有位置进入编辑模式;
  12. ​I​​在光标所在行行首处进入编辑模式;
  13. ​A​​在光标所在行行末处进入编辑模式;
  14. ​o​​在光标所在处另起一行进入编辑模式
  15. ​w​​​/​​W​​ 按符号划分word跳转(W步子更大些)
  16. ​%s/old/new/g​​ 全文将old替换成new
  17. ​:n,md​​删除第n到第m行
  18. ​n, m co x​​将第n行到第m行复制到第x行
  19. ​n yy​​​从光标所在行起复制n行,移动光标到需要粘贴的位置​​p​​实现复制
  20. ​:n,ms/^/#​​从第n行到第m行添加注释
  21. ​ctril + v​​​进入可视模式 (Visual-mode),选中要编辑的行,​​i​​切换到编辑模式输入​​#​​然后Esc键从可视模式推出到正常模式,实现批量注释
  22. ​vimdiff file1 file2​​快速帮助定位两个文件的异同
  23. ​vim -O file1 file2​​垂直分屏打开两个文件
  24. ​:vs file2​​垂直分屏打开一个新文件
  25. ​ctrl + w + ←(h)/↑(j)/↓(k)/→(l)​​分屏时,按不同方向跳转window
  26. ​ctrl + w + w​​分屏时,跳转到下一个window
  27. ​ctrl + w + c​​关掉窗口

算法工程师的效率神器——vim篇_vim_13


标签:文件,模式,vim,神器,算法,跳转,光标,分屏
From: https://blog.51cto.com/xixiaoyao/6118164

相关文章