2016-10-29 17 views
3

私はすでにこのエラーを検索しましたが、解決策が見つかりませんでした。Vim:入力を読み取る際にエラーが発生しました

私はLinuxの世界に参加するための基本的なガイドに従っています。.txtファイルを作成しようとしています。そのスクリプトを使ってVimにテキスト行を追加しています。それはうまくいくはずですが、私の場合はそうではありません。

ここに私の簡単なスクリプト(それは重要な情報かもしれない場合、私は、zshを使用しています):Vim: error reading input

#!/bin/sh 

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

は、スクリプトがメッセージで失敗します。

どこが間違っていましたか?

答えて

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のコマンドを実行しているだろう。したがって、^[を2文字で入力しました。それは、

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

を今、あなたは、実際のエスケープ文字を2つの文字に^[を交換し、同じディレクトリからスクリプトを実行している場合:だからあなたの本当の入力はHello^[:xだった(とスクリプトは、Vimを終了していませんでした)

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)。最初の行にHe​​lloを追加する場合は、iiHello^[の後ろにある名前の行を削除します。

^[CTRL-v ESCと入力しましたか?それは1文字でなければなりません。

+0

ありがとうございました!私は2つの文字を使って '^ ['を書きました。私はあまりにも良いVimのコマンドを学ぶ必要があります:) –

+0

あなたは答えを受け入れることができます。私はここでファイルを編集するために構築を使用しましたが、 'sed -i'に切り替えました。インタラクティブな編集のために私はまだvi(m)を使っています。 –

0

あなたは次のように行うことができます:ウォルター・Aが言ったように

#!/bin/sh 

filename=test.txt 

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

は、あなたがcoms変数の内側にそれぞれCtrl-V EscCtrl-V Returnを押すことで^[^Mを交換する必要があります。

man vimおよびVim :h :normalを参照してください。

関連する問題