算法工程师的效率神器——vim篇
文章來源于夕小瑤的賣萌屋,作者小鹿鹿lulu
我相信,有很多小伙伴在看到這篇文章時就有了很多問號:
用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我要鼠標
慢慢熟悉之后,發現
可愛預警:與CSDN的文風不同,本文不是一個vim命令大集合(其實在文末(//?//)\),基本是想到哪寫到哪,所以請大家當做段子看就好。
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命令改造成真正的刪除。
nnoremap d "_d這時候如果希望像之前使用dd一樣剪切整行,就可以通過V+x(shift+v可以直接選中整行)來完成整行的剪切啦。不過還是需要一兩天的適應期的。
批量編輯
“替換”是啪代碼的超高頻的操作,也可以用來編輯小型數據集文件和日志文件。
Tips: 先高亮查找,大體掃一遍后再執行替換可以大大降低造bug的概率
是時候祭出這張圖了:
命令模式下輸入上面????的命令即可在全文范圍將所有old替換成new。
對于作用范圍,常用的表達有:
%s #全文范圍 s #光標所在行 n, ms #從第n行到第m行 ., $s #光標所在行到文末,還沒忘記$表示最末叭同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關掉窗口
總結
以上是生活随笔為你收集整理的算法工程师的效率神器——vim篇的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【机器学习基础】一文详尽之支持向量机(S
- 下一篇: 【白话机器学习】算法理论+实战之Xgbo