Scripting

如何使用 vim 自動寫入日誌文件?

  • August 27, 2021

我在 Fedora 34 工作站上使用 Vim 作為我的主要文本編輯器。我需要為我的一門課程創建和維護一個日誌文件,以便跟踪時間和完成的工作。它應該看起來像這樣:

John Doe
Log for XYZ 1101, Fall 2021

***** IN:  Thu Aug 26 08:13:11 PM EDT 2021

Enter my log notes here

***** OUT: Thu Aug 26 09:22:13 PM EDT 2021

注意: IN: 後兩個空格,OUT 後一個空格:


我很想自動化這個過程,這樣每次我打開這個文件(如果不可能,然後在給定的命令上)***** IN: date都會列印出來,並且游標會放在下面第二行的開頭。此外,每次我關閉文件(或在給定命令上)***** OUT: date(以及之後的空行)時,都應該在我最後一個文本條目下方列印兩行。這將確保在兩個給定條目之間以及我的筆記和條目日期之間總是有一個空行。

誰能幫我做到這一點,或者至少指導我完成它?我從來沒有編寫過任何腳本,也沒有弄亂過高級 vim 設置。


**編輯:**使用來自@muru 的評論並在查找瞭如何使用之後autocmd,我能夠想出以下內容。

autocmd VimEnter ~/test.log $pu=strftime('***** IN:  %c')
autocmd ExitPre  ~/test.log $pu=strftime('***** OUT: %c')

它有效,但並不完美。問題是:

  1. 它不會在文本之間留下額外的空行。我希望能夠添加 2 個換行符。如何使用 Vims put 命令來做到這一點?或者還有其他方法嗎?
  2. ExitPre命令是唯一對我有用的。但是,每次我這樣做:w:q(或:xOUT日期都會被寫入並且程序不會退出。相反,我必須再次保存它並強制退出:q!。我真的不考慮這個優雅的選擇。我希望這發生在後台,以便我只能退出一次,然後在下次打開文件時查看*OUT日期。*其他命令VimLeave(在退出 Vim 之前,在編寫 viminfo 文件之後)根本不起作用。

任何幫助,將不勝感激!

目前的問題可以記錄下來:

autocmd VimEnter ~/test.log $pu=strftime(\"***** IN:  %c\n\n\n\")
autocmd ExitPre  ~/test.log $pu=strftime('***** OUT: %c') | w
  • \n以雙引號展開,但使用時需要轉義引號=。或者你可以使用call append("$", [strftime("***** IN: %c"), "", ""]). 或者只是添加一個| norm G2o
  • |w將編寫您剛剛使用的修改$pu。退出最初失敗是因為$pu進行了未保存的修改。

引用自:https://unix.stackexchange.com/questions/666445