2012-02-05 47 views
8

在Vim中,讀取shell命令輸出的最佳方式(便攜式和快速)是什麼?這個輸出可能是二進制的,因此包含空值和(不)具有重要的尾隨換行符。我看到的當前解決方案:讀取shell命令輸出的最佳方法

  1. 使用system()。問題:不適用於NULL。
  2. 使用:read !。問題:不會保存結尾的換行符,嘗試智能檢測輸出格式(dos/unix/mac)。
  3. 使用!重定向到臨時文件,然後readfile(, "b")來讀取它。問題:fs的兩次調用,shellredir選項默認情況下也會重定向stderr,它應該不太容易(這裏提到的'shellredir'是因爲它可能被設置爲有效值)。
  4. 使用system()並通過xxd過濾輸出。問題:非常緩慢,最不便攜(管道沒有相當於'shellredir')。

還有其他想法嗎?

回答

4

您正在使用文本編輯器。如果您關心NUL,尾隨EOL和(可能)衝突的編碼,您仍需要使用十六進制編輯器?

如果我需要我的操作控制這個量,我使用XXD路線的確,與

:se binary 

一個不錯的選擇,你似乎懷念的是插入模式表達寄存器插入:

=system('ls -l')輸入

這對於字符編碼業務來說可能是也可能不是更聰明/更少侵入,但是如果它足夠重要,您可以嘗試一下。

或者你可以使用Perl或Python的支持,以有效地利用popen

粗略的想法:

:perl open(F, "ls /tmp/ |"); my @lines = (<F>); $curbuf->Append(0, @lines) 
+0

你可以試試' =系統( 'printf的 '' \ x00的' '')'。它不會輸出任何東西,而':%!printf'\ x00''會將單個NULL看作'^ @'在緩衝區中(大問題:':%!printf'\ x00 \ r \ n''會一樣)。 – ZyX 2012-02-08 04:01:12

+0

這裏的問題是,我不想有兩個功能:「將命令讀入緩衝區」,通常可以通過「%!」和「將命令輸出到文件中」來實現,我不能說我永遠不會需要更多。類似於'readfile()'是這種情況下最靈活的解決方案。 – ZyX 2012-02-08 04:09:03

+0

剛想到使用perl/python支持;請參閱初學者的答案 – sehe 2012-02-08 08:22:07