2016-10-29 132 views
3

我已經搜索了這個錯誤,但是我找不到解決方案。Vim:錯誤閱讀輸入

我正在遵循一個加入Linux世界的基本指南,我正在嘗試創建一個.txt文件,在Vim中使用該腳本添加一些文本行。它應該工作,但不是在我的情況。

這裏我簡單的腳本(我使用的是zsh,如果它可能是一個重要的信息):

#!/bin/sh 

filename= test.txt 
vim $filename << COMMAND 
i 
Hello 
^[ 
:x 
COMMAND 

腳本失敗消息:Vim: error reading input

我哪裏錯了?

回答

2

filename變量中有一個錯字(額外空格):filename= test.txt。該表達式被解釋爲調用test.txt命令,filename環境變量設置爲空字符串。所以你應該刪除=之後的空格。

關於錯誤讀取輸入消息時,讀出的Vim文檔::help E208

Vim: Error reading input, exiting... 

這發生時,同時需要輸入的Vim不能讀取輸入的字符。 Vim卡住了,唯一能做的就是退出。當stdin和stderr被重定向並執行一個不會退出Vim的腳本時,可能會發生這種情況。

所以Vim認爲它讀了一個沒有退出Vim的腳本。您的腳本進入插入模式,輸入Hello,然後輸入Esc,最後調用:x命令。一切都很好,當然,:x命令退出Vim,如果輸入命令行區域。如果你已經進入^[作爲控制 - VEsc鍵,該腳本將已經退出插入模式和成功執行:x命令。因此,您輸入^[作爲兩個字符。所以,你的實際輸入爲Hello^[:x(和腳本沒有退出VIM):如果你的實際轉義字符替換兩個字符^[,並從同一目錄執行腳本

Vim: Warning: Input is not from a terminal 
Vim: Error reading input, exiting... 
Vim: preserving files... 
Vim: Finished. 

現在,將失敗,因爲一個交換文件:

Vim: Warning: Input is not from a terminal 
Vim: Error reading input, exiting... 

Vim: Finished. 

(你可以閱讀通過運行vim test.txt長描述)。您可以使用-n選項忽略交換文件:vim -n "$filename"。現在輸出將是:

Vim: Warning: Input is not from a terminal 

它是有道理的。你實際上不需要Vim的交互式版本。所以你應該使用ex模式-e選項),或者更確切地說改進的ex模式-E選項):vim -n -E "$filename"

如果內容不應該被解釋,那麼將值包裝在單引號中也是一個好主意,如果字符串包含外殼變量,則在雙引號中包含值:filename='test.txt'

固定的版本:

filename='test.txt' 
vim -n -E "$filename" << COMMAND 
i 
Hello 
^[ 
:x 
COMMAND 

^[使用控制 Vim中輸入 - vEsc鍵)。

+0

非常感謝你,我會把這一切都放在我的腦海裏:D –

0

您應該刪除filename= test.txt中的空格,並檢查在COMMAND的最後一行後沒有空格。當您希望在第一行顯示「Hello」時,請在iiHello^[之後刪除名稱行。

Did you enter ^[ with CTRL-v ESC?它必須是一個字符。

+0

謝謝你!我寫了'^ ['使用了2個字符。我必須學習更好的Vim命令:) –

+0

比你可以接受的答案。我已經使用了這裏的結構來編輯文件,但是我切換到了'sed -i'。對於交互式編輯,我仍然使用vi(m)。 –

0

你可以這樣做:

#!/bin/sh 

filename=test.txt 

coms="iHello world^[:x ${filename}^M" 
vim -c "normal $coms" 

沃爾特甲說,你必須分別擊中Ctrl-V EscCtrl-V Returncoms變量中,以取代^[^M

請參閱man vim,並在Vim :h :normal獲得更多幫助。