2008-11-01 35 views
9

在使用Vim(在家中和在工作中)時,我經常發現自己在重複做類似的事情。例如,我可能會將一堆CSV文本轉換爲一系列SQL插入。我一直在使用Vim多年,但直到最近我纔想到認真考慮如何在使用Vim時提高生產力。編寫Vim中的常見任務腳本

我的問題是..有沒有一種好的方法(或正確的方法)來存儲常用的命令或命令序列?那麼執行它們的最好方法是什麼?能夠在實時會話中使用相同的腳本以及在命令行上針對某個文件使用該腳本將會很好。

我希望我可以將它們存儲在.vim文件中,以便我可以將它們交給同事(對vim不熟練),供他們使用。

回答

13

您可以將您的共同任務宏在vim的文件,如this例如,然後你可以使用命令加載它們:所以file.vim

Here你可以找到一堆有用的宏,我也建議你好好學習有用qmacro recording命令,這是很好很強大...

q命令創建的宏存儲在寄存器中,QQ專賣店宏在q寄存器,所以當你結束時他記錄你可以簡單地粘貼宏,與「qp並保存它,稍後,您可以加載它只需將宏放入一個寄存器即:」qY,宏只是文本,並記住您可以使用任何寄存器而不是q。有一個Vim腳本,用於存儲q宏:

marvim : Macro Persistent Storage and Shareable Repository for VIM

也看看到Vim Scripting Language

+0

這可能會在您的一個鏈接中回答,但可以記錄一次qq宏嗎?我一直使用它們,但我不知道它們是否可以在會話中持續存在。 – 2008-11-01 08:02:00

+0

使用q命令創建的宏存儲在寄存器中,qq將宏存儲在q寄存器中,因此當您結束錄製時,您可以簡單地將宏粘貼到「qp並保存」,稍後可以通過簡單撇開宏觀文本,通過「qY記住你可以使用任何寄存器,而不是q ... – CMS 2008-11-01 08:06:40

2

您可以將命令序列存儲在您的.vimrc中,併爲其分配與:map命令的鍵綁定。例如:

echo >>~/.vimrc ":map ,c :%s/,/','/g<CR>:%s/^/('/g<CR>:%s/$/'),/g<CR>" 

當按下「,c」,在實時會話,這將轉換成CSV文件的INSERT語句的一部分。

就在那同一塊編輯可以通過被應用到一個文件中(這將覆蓋,一定要備份第一)命令行:

vim file.txt -c ':normal ,c | :x' 

有可能是一個更好的辦法,但這個工程。

1

個人而言,也許部分原因是因爲我早在vim存在之前就使用了Unix(哎呀,我用的第一版Unix也沒有「vi」 - 但那是另一回事),我通常會使用' shell腳本「(或更可能是Perl腳本)來執行轉換。爲了將CSV數據轉換爲INSERT,處理引號/非引號和嵌入逗號是非常麻煩的 - 我可能會嘗試使用帶有Text :: CSV_XS的Perl腳本來保證正確的解析。然後我會在需要轉換的文本範圍上運行該腳本。

這樣做的一個優勢是專注的工具方法 - 一個工具可以做一件正確的工作。我的私人bin目錄中有300個或更多的腳本和程序; RCS目錄中有超過500個腳本。

這並不是說vim中的腳本編寫不好。我使用(或多或少)複雜的地圖命令來編寫複雜的操作,通常當我要對整套文件進行相同的更改時,以及當我認爲不值得創建用於工作。但是,如果我認爲我可能需要更改多次,那麼我會編寫腳本。例如,GCC開始獲得uppity(大約在2005年)關於不在對象文件中嵌入未使用的靜態字符串 - 這意味着我的版本控制信息不可見。因此,在一段時間內,當我編輯源文件時,我已經從靜態(固定)名稱轉換爲公開名稱 - 不情願,但必須AFAIAC。我有一個爲我編輯的腳本,所以當我需要在文件中進行更改時,我會運行該腳本來執行此操作。我有另一個更新版權信息的腳本;每次我第一次修改給定年份的文件時,我都需要這樣做。是的,我可以把它當作vim中的東西 - 我長大後認爲單獨的腳本更好,尤其是因爲如果我切換到任何其他編輯器,我仍然可以使用腳本。

3

我用q/@很頻繁地記錄/重放一個宏。

下一步是嘗試寫入類似3或更少的ex命令。

如果某件事情如此複雜以至於無論是宏還是短序列都不夠用,我傾向於將它寫成Perl腳本。爲了我的口味,vim腳本語言有點太有限,無法嘗試做大事。 (儘管vim 7在這方面已經取得了很大的進步,通過借用Python的一堆東西)。

請注意,@做一些非常簡單的事情:它需要一個寄存器的內容,並重播它們,就像你鍵入它們一樣在正常模式下。同樣,q只是將您輸入的序列記錄到您的名稱中。這些是自己同樣的寄存器,用於放置/放置 - 這意味着您可以直接將錄製的序列粘貼到文件中(.vimrc任何人?)或從文件中抽出一系列命令並重播它(這樣可以保留他們中的一羣在~/my-vim-macros.txt或其他)。