22

パイプの真ん中でVimを使いたいのですが。この既存の投稿は、Pythonの助けを借りずに、bashを使用してのみ実行したいと思っていたことを除けば、私がやりたいことのように見えます。[それは役に立ちます、環境はAndroidのターミナルIDEアプリのbashシェルです。]

どうか、 Vimからコマンドを介してバッファをパイプする方法を知っています。それは素晴らしいことですが、私がここで望んでいることではありません。Vimを終了し、アクティブなバッファーをstdoutに渡したい。

FWIW、私は別のコマンドを入力としてVimに渡す方法も知っています。繰り返しますが、それは私がここに到達しようとしていることではありません。

4

5 に答える 5

28

vipeの一部であるものを見てくださいmoreutils。パイプの一部として任意のエディターを使用できます。

 ls -al | vipe | less

で使用するには、またはまたは使用するシェルvimでデフォルトのエディタとして設定してください。bashrccshrc

 EDITOR=vim

更新:bash唯一の解決策が必要な場合は、次のようなスクリプトを使用できます

 #!/bin/bash
 # create temporary file
 TMPFILE=`mktemp /tmp/vipe.bashXXXXXXXX`
 cat > ${TMPFILE}
 vim ${TMPFILE} < /dev/tty > /dev/tty
 cat ${TMPFILE}
 rm ${TMPFILE}

よりポータブルなバージョンについては、交換してください

 vim ${TMPFILE}

 ${EDITOR} ${TMPFILE}
于 2012-05-21T14:08:05.977 に答える
6

バッファをシェル標準出力に出力vimするには、Exモードで開始する必要があります。そうしないと、独自のウィンドウで「通常の」方法で開き、終了時に出力バッファをクリアします。

最も簡単な実例は次のとおりです。

$ echo foo | vim +%p -escq /dev/stdin
foo

これは次と同等です:

$ echo foo | vim -es '+%print' '+:q!' /dev/stdin
foo

/dev/stdin余分な迷惑なメッセージを防ぐために、標準入力に対する特別なファイル記述子を指定する必要があります( )。

そして、文字列を解析するいくつかの例を次に示します。

$ echo This is example. | vim '+s/example/test/g' '+%p' -escq! /dev/stdin
This is test.
$ echo This is example. | vim - '+s/example/test/g' '+%p' -escq!
Vim: Reading from stdin...
This is test.

関連している:

于 2015-02-17T14:19:12.307 に答える
5

VimはUIを表示できないため、単純にvimをパイプ内に配置することはできません。

ls | vim - | more # Does not work

これを解決する1つの方法はgvim -f -、パイプが別のウィンドウで開くため、パイプの内側で使用することです。を介してファイルを書き込む必要があり:w >> /dev/stdoutます:quit!

あるいは(そしてコンソールのみの非グラフィカル環境での唯一の方法)、vimAndMoreパイプ内のvimに続くコマンドを引数として取る独自のスクリプト/関数を記述して、次のようにすることができます。

vimAndMore()
{
    TMPFILE=/tmp/pipecontents

    # Slurp stdin into the temp file.
    cat - > "$TMPFILE" || exit $?

    # Reconnect stdin to the terminal, so that Vim doesn't complain with "Warning:
    # Input is not from a terminal", and the terminal is kept intact.
    exec 0</dev/tty

    # Launch the editor.
    "${EDITOR:-vim}" "$TMPFILE" || exit $?

    # Carry on with the pipe.
    cat "$TMPFILE" | exec "$@"

    rm "$TMPFILE"
}

そして、パイプを次のように変更します。

ls | vimAndMore | more
于 2012-05-21T14:11:24.940 に答える
2

私の非常に限られた経験から、Vimに書き込みをさせることはできませんstdout。Vimを簡単にパイプに入れることはできないと思います。

vipeこのパッケージからコマンドを試すことができます。

于 2012-05-21T14:07:03.270 に答える
1
> ls -1 fred*.c | vim -

Vimがファイルのリストを含む名前のないファイルを開く結果になりますfred*

たぶん私はあなたの質問を誤解しました...

代替解釈:

のテクニックを説明しているこのページを参照してください

現在のバッファーを保存せずに、その内容をインタープリター(python、schemeなど)に送信し、そのインタープリターを新しく生成されたxtermで実行する必要があります。新しいxtermウィンドウは、Vim内でシェルを実行すると、プログラム出力とコードバッファーを同時に検査できないため、便利です。また、Vimのシェルはいくつかの点で脆弱です。

于 2012-05-21T13:50:55.410 に答える