簡體   English   中英

在 shell 腳本中執行 Vim 命令

[英]Executing Vim commands in a shell script

我正在編寫一個運行命令行程序 (Gromacs) 的 Bash 腳本,保存結果,修改輸入文件,然后再次循環執行該過程。

我正在嘗試使用 Vim 來修改輸入文本文件,但是在打開我的輸入文件后,我一直無法找到一種方法來從 .sh 文件中執行內部 Vim 命令,例如:1234、w、x、dd 等在 Vim ("vim conf.gro") 中。

有沒有一種實用的方法可以從 shell 腳本執行 Vim 命令?

我認為vim -w/W and vim -s就是你要找的。

您還可以使用vim -w test.keys input.file記錄“Vim 操作/按鍵序列”。 您也可以編寫test.keys 例如,將其保存在文件中:

ggwxjddZZ

這將:

Move to the first line,
move to the next word,
delete one character,
move to the next line,
delete the line, and
save and quit.

使用此test.keys文件,您可以執行以下操作:

vim -s test.keys myInput.file

您的“myInput.file”將通過上述操作進行處理並保存。 您可以在 shell 腳本中包含該行。

VimGolf正在使用相同的方式來保存用戶的解決方案。

您可以通過-c標志編寫 Vim 腳本。

vim  -c "set ff=dos" -c wq mine.mak

然而,這只能讓你走到這一步。

  • 從您給出的命令來看,您似乎正在嘗試運行一些正常的命令。 您將需要使用:normal 例如:norm dd
  • 在命令行上寫所有這些是自找麻煩。 我建議你制作一個 Vim 文件(例如commands.vim ),然后:source通過-S
  • 您可能想要獲得良好且一致的 Vim 的 ex 命令。 看看:h ex-cmd-index

所以你最終會得到這樣的結果。 在 commands.vim 中使用所有 Vim commands.vim

vim -S commands.vim mine.mak

您可能還想考慮使用sed和/或awk進行文本處理。

備擇方案

除非您真的需要特殊的 Vim 功能,否則最好使用非交互式工具,例如sedawk或 Perl/Python/Ruby/此處您最喜歡的腳本語言

也就是說,您可以非交互式地使用 Vim:

靜默批處理模式

對於非常簡單的文本處理(即使用 Vim 就像增強的 'sed' 或 'awk',也許只是受益於:substitute命令中增強的正則表達式),使用Ex-mode

REM Windows
call vim -N -u NONE -n -es -S "commands.ex" "filespec"

注意:靜默批處理模式 ( :help -s-ex ) 會弄亂 Windows 控制台,因此您可能需要在 Vim 運行后執行cls進行清理。

# Unix
vim -T dumb --noplugin -n -es -S "commands.ex" "filespec"

注意:如果"commands.ex"文件不存在,Vim 將掛起等待輸入; 最好事先檢查它的存在! 或者,Vim 可以從標准輸入讀取命令。 如果使用-參數,您還可以使用從 stdin 讀取的文本填充新緩沖區,並從 stderr 讀取命令。

全自動化

對於涉及多個窗口的更高級處理和 Vim 的真正自動化(您可以與用戶交互或讓 Vim 運行以讓用戶接管),請使用:

vim -N -u NONE -n -c "set nomore" -S "commands.vim" "filespec"

以下是所用參數的摘要:

-T dumb           Avoids errors in case the terminal detection goes wrong.
-N -u NONE        Do not load vimrc and plugins, alternatively:
--noplugin        Do not load plugins.
-n                No swapfile.
-es               Ex mode + silent batch mode -s-ex
                Attention: Must be given in that order!
-S ...            Source script.
-c 'set nomore'   Suppress the more-prompt when the screen is filled
                with messages or output to avoid blocking.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM