19

「locate 50local.policy | xargs vim」を実行すると、「Vim: Warnung: Die Eingabe kommt nicht von einem Terminal」というエラーが表示されます (翻訳: Vim: 警告: 入力が端末から来ていません)。

vim で正常に編集できますが、閉じると端末の動作がおかしくなりました (文字を入力できず、Enter キーを押すとシェル プロンプトが繰り返されるだけです。「xargs gedit」を使用すると、これらの問題は発生しません。

Gnome 3 および Gnome-Terminal 3.0.1 で Ubuntu 11.10 を使用しています。

4

3 に答える 3

32

Vim は実際の端末に接続されていることを想定し、それに適したコードを送信します。

ターミナルをリセットします

reset

最も簡単な回避策:

locate 50local.policy | xargs gvim

根拠gui vim は端末を必要としません

さもないと:

vim $(locate 50local.policy)

根拠vim は、端末に直接接続されて開始されます(子プロセスとしてではxargsなく、端末の代わりにパイプに接続された stdin/stdout を使用してサブシェルで実行されます)。と言うようなものです

vim /usr/some/dir/50local.policy /usr/local/some/dir/50local.policy

あるいは

引数を指定して vim を起動するのではなく、vim から引数を追加することで、この問題を回避できます。実際、シェルがvimを実行するよりも、Vimはシェルを実行する方がはるかに優れています。

vimで:

:args `locate 50local.policy`
:rewind

これにより、目盛りの間にシェルコマンドから返されたファイルに引数リストが設定されます。:rewind は、そのリストの最初のファイルに移動します。複数の一致を編集していた場合は、これを試してください。

:w|next

この一連のコマンド (| で区切られている) は、現在のバッファーをファイルに書き込み、args リスト内の次のファイルに移動します。

于 2011-11-22T15:00:05.587 に答える
6

もう 1 つの方法はxargs-oオプションを使用して実行することです。マニュアルページから:

-o      Reopen stdin as /dev/tty in the child process before executing
        the command.  This is useful if you want xargs to run an interac-
        tive application.

注、-oxargs の BSD 拡張です。

同じ効果を達成するためのより移植性の高い手段は次のとおりです。

xargs sh -c 'vim "$@" < /dev/tty' vim
于 2012-11-13T12:08:53.547 に答える