2012-02-20 162 views
64

是否有無法通過命令行在文件上執行Vim命令?在命令行中在Vim內執行命令

我知道事實正好相反這樣的:

:!python % 

但如果我想:retab一個文件,而無需在Vim中打開它?例如:

> vim myfile.c 
:retab | wq 

這將打開myfile.c,用空格替換選項卡,然後保存並關閉。我想以某種方式將這個序列鏈接到一個單一的命令。

這將是這樣的:

> vim myfile.c retab | wq 

回答

60

這爲我工作:

gvim -c "set et|retab|wq" foo.txt

set et(= set expandtab)確保tab字符獲取正確數量的空格代替(否則,retab將不起作用)。

我通常不使用它,但vim -c ...也適用

+0

這是卓有成效的,謝謝! – syvex 2012-02-20 18:41:33

57

您有幾種選擇:

  • -c "commands":將發揮你在命令行中輸入他們Ex命令。
    在你的例子中:vim myfile -c 'retab | wq'。這就是Firstrock所建議的。

  • -S "vim source file":將源給出的vim腳本
    (如跑步vim -c "source 'vim source file'"):

    如果你有一個文件script.vim包含:

    retab 
    wq 
    

    然後你可以使用vim myfile.c -s script.vim(擴展名並沒有真正問題)

  • -s "scriptin file":將播放fi的內容樂,因爲它包含正常模式命令:如果你有script.txt包含:

    :retab 
    ZZ 
    

    使用由單個^M字符的線的端部(例如,你使用:set fileformat=mac | w保存的腳本),然後就可以運行:vim myfile.c -S script.txtZZ是退出vim並保存當前文件的另一種方式)。
    請注意,如果您碰巧使用gvim(GUI),則可以使用vim my_file -W script.txt來錄製這些腳本,但它可以使用suffers a bug

+0

如果你像我一樣只想執行一些命令,在某些shell中可以使用'vim -S <(echo -e「VundleInstall \ n q \ n q」)''。 – Minix 2016-12-13 10:49:19

2

不是直接回答你的問題,但如果你想空格替換選項卡(或做任何其他的正則表達式查找/替換)的文件列表,你可以使用就地sed的搜索/取代:

sed -i 's/\t/ /g' foo1.txt foo2.txt 

ls *.txt | xargs sed -i 's/\t/ /g' 

(在這個例子中我正在與三個空間代替每個製表符。)


注意:-i標誌表示就地操作。

sed手冊頁:

-i[SUFFIX], --in-place[=SUFFIX] 

      edit files in place (makes backup if extension 
      supplied) 
+0

你是對的 - 人們不應該使用像開罐器一樣的顯微鏡 – oxfn 2016-03-04 23:40:11

+0

根據我的經驗,如果文件很大(MB數量級爲100)並且替換次數有限,那麼sed會非常緩慢。 @benoit建議的'vim -s '選項的工作速度更快 - 秒級。在我的情況下,sed花費了大約3分鐘,而vim腳本選項在大約25秒內完成了200 MB大文件和大約100個替換文件 – Prashant 2017-11-28 06:16:03