[英]Redirect ex command to STDOUT in vim
我正在嘗試制作一個命令,將vim的突出顯示信息轉儲給STDOUT。 我可以成功寫入這樣的文件:
vim +'redir >outfile' +'hi' +'redir END' +'q'
在此之后, outfile
包含我想要的內容。 但我寧願輸出到STDOUT來管道轉換為突出顯示信息的命令。
此方法嘗試將命令重定向到寄存器,寫入當前緩沖區,然后將該輸出發送到tee
。
vim -E +'redir @a' +'silent! hi' +'redir END' +'put a' +'w !tee' +'q!' > outfile
這非常接近,但輸出一個主要的分頁消息(另外255行...)和一些ANSI轉義廢話。 設置nomore
並沒有為我壓制消息。 我希望將第一個命令中發送到outfile
的確切輸出發送到STDOUT。
Vim支持輸出到stderr,我們可以將其重定向到stdout以解決您的問題。 但是要小心,此功能僅用於調試目的,因此它有一些優勢。 這是一個如何做到這一點的簡短草圖。
首先,我們將以靜默或批處理模式運行Vim,它使用-e
-s
標志( :h -s-ex
)啟用。 我們禁用交換文件-n
因為如果我們需要在它被卡住時殺死Vim它們會很麻煩。
我們不是將Ex命令作為命令行參數傳遞,而是使用-S
來源腳本文件。 使用以下內容創建hi.vim
文件:
verbose highlight
:verbose
是必要的,使Vim輸出:highlight
消息給stderr。 讓我們看看到目前為止我們有什么:
$ vim -n -e -s -S hi.vim
不要跑這個,否則你會陷入無頭Vim的黑暗中!
添加:quit
命令並將stderr重定向到stdout:
$ vim -n -e -s -S hi.vim +quit 2>&1
瞧! 現在根據你的心願把這個爛攤子送到任何文件或工具中。
有一篇關於這個主題的非常全面的wiki文章,“ Vim作為vimscript的系統解釋器 ”。
更精細的要點:由於Vim如何與終端環境交互,它無法在批處理模式輸出中寫入正確的unix LF行結尾。 相反,它會寫出看起來像CRLF行結尾的行結尾。
考慮添加一個過濾器來擺脫這些:
$ vim -n -e -s -S hi.vim +quit 2>&1 | tr -d '\r' | my-css-util
這回答了如何“將命令重定向到vim中的STDOUT”的一般問題,但它不一定適用於你的:hi
問題,因為-e -s
標志引起的這種約束:
不使用'term'和$ TERM。
我在運行你的第一個命令時遇到了這個問題。 我第二次跑它,它去了stdout。 我想這是因為該文件已經存在。 所以你可以嘗試(發送到已經存在的東西):
vim +'redir >/dev/null' +'hi' +'redir END' +'q'
如果您正在使用Unix兼容環境,則可以始終使用特殊文件,例如:
ex +"redir>>/dev/stdout | hi | redir END" -scq!
這會將任何Vi / Ex命令打印到標准輸出中,您可以進一步解析。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.