簡體   English   中英

將ex命令重定向到vim中的STDOUT

[英]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.

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