知行编程网知行编程网  2022-01-17 20:47 知行编程网 隐藏边栏 |   抢沙发  18 
文章评分 0 次,平均分 0.0
算法工程师的效率神器——vim篇

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

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

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

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篇

可爱预警:与CSDN的文风不同,本文不是一个vim命令大集合(其实在文末(//∇//)),基本是想到哪写到哪,所以请大家当做段子看就好。

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

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

优雅的移动

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

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

例如对于如下一个文件

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

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

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

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

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

如果要跨行移动呢?

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

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

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

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

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

上面的命令都只是临时修改文件编码,大家也可以根据自己的经常使用的文件编码,在~/.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模式+yyy复制,然后通过p进行粘贴。这些操作都非常常规了,网上资料很多,就不赘述啦。

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

nnoremap d "_d

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

批量编辑

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

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

是时候祭出这张图了:

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

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

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

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

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

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

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

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

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

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

多文件操作

vimdiff

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

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

分屏

当我们阅读或者开发一个层级比较深的项目代码的时候,分屏打开多个文件可以大大提高效率,减少我们的记忆负担(有什么忘记了看一下右边的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篇

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

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

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

还有一些提高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关掉窗口

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

知行编程网
知行编程网 关注:1    粉丝:1
这个人很懒,什么都没写

发表评论

表情 格式 链接 私密 签到
扫一扫二维码分享