一只小狐狸带你解锁炼丹术&NLP秘籍
我相信,有很多小伙伴在看到这篇文章时就有了很多问号:
用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日常操作效率的配置技巧,写不动了QAQ直接将自己的配置文件丢出来吧,在公众号「夕小瑶的卖萌屋」回复口令【vim】即可领取噢。
看
仅仅是“打开看一下”这个动作,vim就有非常非常多的玩法,可以让你非常方便的处理各种狗血的文件!
优雅的移动
很多初学者在光标移动、翻页问题上就被vim劝退了。对于比较保守的小伙伴,可能打开vim的第一件事就是按一个i
进入插入模式,然后就开始上下左右移动光标了╮( ̄▽ ̄"")╭
要完成移动,确实有很多命令,但其实完全没必要都去记住,仅仅留几个常用的就好。
例如对于如下一个文件
如果想要在行内移动光标,怎么办呢?
初学者可能就按住→这个箭头,慢慢挪了╮( ̄▽ ̄"")╭这种是字符级的移动,速度非常慢。此时完全可以用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
取消。
当我们查看一些中文数据集时,有可能出现乱码的情况。
这其实是一个GB18030编码的中文文件,:set fileencoding
查看当前文件编码。如上图红框所示(当vim无法识别文档的编码的时候,会使用latin-1去读取)。这时候可以通过:e ++enc=gb18030
强行使用GB18030编码重新打开文件。
上面的命令都只是临时修改文件编码,大家也可以根据自己的经常使用的文件编码,在~/.vimrc
文件中修改fileencoding配置。
愉快地编辑
在谈论怎么愉快地编辑之前,先说一下怎么优雅的进入编辑模式。
vim可以通过很多字母进入编辑模式,比如a、A,i、I,o、O等,不同的字母进入插入模式时光标的位置不同。按照小鹿的使用频次排序如下:
-
i
在光标原有位置进入编辑模式; -
o
在光标所在处另起一行进入编辑模式; -
A
在光标所在行行末处进入编辑模式; -
I
在光标所在行行首处进入编辑模式; -
a
在光标右边开始插入(这个一般与光标移动命令搭配使用); -
O
在光标所在处往上另起一行进入编辑模式(这个模式一般用于文首插入空白行);
(感到懵逼的小伙伴请找个文件自行体会【手动狗头】
进入编辑模式后,就可以像之前一样随意玩耍了。不过,其实插入模式下也是可以使用一些“命令”的,只不过这些可能是系统级的了。比如ctrl+w
可以删掉一个单词,shift+左右
可以左右移动一个单词(mac原生的terminal支持较好)。多掌握一些类似的tricks可以大大减少模式切换的频率,提高生产力。
命令模式下的简单编辑
对于一些简单的编辑操作,其实无需进入编辑模式也能完成。例如,在命令模式下,x
可以完成剪切(当删除来用也没大毛病),v
模式下选中文本后通过d
可以删掉这些选中的文本,dd
删除一行,数字+dd
删除若干行,:n,md
删除第n到第m行等等。除了通过x
进行剪切,也可以通过v模式+y
或yy
复制,然后通过p
进行粘贴。这些操作都非常常规了,网上资料很多,就不赘述啦。
这里其实容易面临一个令人头疼的问题,就是无论通过d
还是x
,删掉的内容都会默认进入剪贴板,这就会导致边删边贴变得很麻烦。一个解决方案是使用“黑洞”来将d
命令改造成真正的删除。
这时候如果希望像之前使用dd
一样剪切整行,就可以通过V+x
(shift+v可以直接选中整行)来完成整行的剪切啦。不过还是需要一两天的适应期的。
批量编辑
“替换”是啪代码的超高频的操作,也可以用来编辑小型数据集文件和日志文件。
Tips: 先高亮查找,大体扫一遍后再执行替换可以大大降低造bug的概率
是时候祭出这张图了:
命令模式下输入上面????的命令即可在全文范围将所有old替换成new。
对于作用范围,常用的表达有:
同search一样,旧模式的匹配也同样支持正则表达式,最后的g
表示作用到范围中的所有匹配,没有g
表示仅作用到所属范围每一行的首个匹配。
结合^/$
,可以使用查找替换命令在多行的行首或者行末添加内容。比如,8,16s/^/#
实现对8到16行添加注释:
此外,前面也多次提到的v
模式(可视模式Visual Mode),跟插入模式的组合技也是一个批量编辑的神器。
v模式+i模式
的组合技最常见的操作就是批量注释啦。ctrl+v
进入垂直v模式,移动光标选中需要注释的行之后,进入插入模式添加注释后,两次Esc
即可完成批量注释。
这个操作不仅可以拿来注释,更是编辑数据集的神器(比如批量添加伪标签列),也是编辑调参bash文件的神器等。相关的进阶玩法下一篇再讲~
多文件操作
vimdiff
在快速开发迭代实验想法的时候,一个代码可能会衍生出n个版本,主*分可能都差不多,唯一不同的是需要实验验证的一小部分(此处强烈推荐使用git实现版本管理,维护实验环境安全可回溯????)。而vimdiff file1 file2
则可以快速帮助定位两个文件的异同,查看不同版本代码的差异~效果如下:
分屏
当我们阅读或者开发一个层级比较深的项目代码的时候,分屏打开多个文件可以大大提高效率,减少我们的记忆负担(有什么忘记了看一下右边的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就好~
看到这里其实就可以使用组合技实现大多数分屏操作了。我们来举个栗子,如何利用分屏实现跨文件的复制粘贴?
假如分屏是这个样子的,然后需要把右边文件中的2-15行复制到左边的文件中。那么ctrl + w + w
光标跳转到右边;13yy
复制多行(出现红框的提示);再ctrl + w + w
光标跳转到左边;挪动到需要复制的位置,p
复制;即可~
最后的效果如下。如果file2的作用已经完成,那么ctrl + w + c
关掉该窗口就可以功成身退了~
还有一些提高vim日常操作效率的配置技巧,写不动了QAQ直接将自己的配置文件丢出来吧,在公众号「夕小瑶的卖萌屋」回复口令【vim】即可领取~
总结
本文谨分享了一些小鹿日常常用的vim命令,整理如下~更多命令可以:help
查看官方使用文档
-
ctrl + f
往后(forward)翻一页 -
N + %
跳转到文件的N%处,比如50 + %
直接跳转到文件中间位置; -
G(shif + g)
切换到文件最末尾; -
:set list
标识出制表符和行尾; -
:set nolist
取消标识 -
/text
查找text,n
向下跳转,N
向上跳转 -
/^$
查找空行 -
/^I^I
(/+Tab+Tab) 查找空值 -
sort
排序 -
u
撤回最近修改 -
i
在光标原有位置进入编辑模式; -
I
在光标所在行行首处进入编辑模式; -
A
在光标所在行行末处进入编辑模式; -
o
在光标所在处另起一行进入编辑模式 -
w
/W
按符号划分word跳转(W步子更大些) -
%s/old/new/g
全文将old替换成new -
:n,md
删除第n到第m行 -
n, m co x
将第n行到第m行复制到第x行 -
n yy
从光标所在行起复制n行,移动光标到需要粘贴的位置p
实现复制 -
:n,ms/^/#
从第n行到第m行添加注释 -
ctril + v
进入可视模式 (Visual-mode),选中要编辑的行,i
切换到编辑模式输入#
然后Esc键从可视模式推出到正常模式,实现批量注释 -
vimdiff file1 file2
快速帮助定位两个文件的异同 -
vim -O file1 file2
垂直分屏打开两个文件 -
:vs file2
垂直分屏打开一个新文件 -
ctrl + w + ←(h)/↑(j)/↓(k)/→(l)
分屏时,按不同方向跳转window -
ctrl + w + w
分屏时,跳转到下一个window -
ctrl + w + c
关掉窗口