Подтвердить что ты не робот

Буфер трубы Vim для стандартного вывода

Я хочу использовать Vim в середине трубы. Этот существующий пост похож на то, что я хотел бы сделать, за исключением того, что я надеялся сделать это без помощи Python - только с bash. [Это помогает, среда - оболочка bash в приложении IDE терминала на Android.]

Пожалуйста, я знаю, как проложить буфер через команду изнутри Vim. Это здорово, но не то, что я хочу здесь. Я хочу выйти из Vim и передать активный буфер в стандартный вывод.

FWIW, я также знаю, как передать другую команду в Vim как входной. Опять же, это не то, что я пытаюсь получить здесь.

4b9b3361

Ответ 1

Взгляните на vipe, который является частью moreutils. Он позволяет использовать любой редактор как часть канала.

 ls -al | vipe | less

Чтобы использовать его с vim, просто установите его как свой редактор по умолчанию в bashrc или cshrc или любую другую оболочку, которую вы используете.

 EDITOR=vim

UPDATE: если вы хотите использовать только bash, вы можете использовать script, как этот

 #!/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}

Ответ 2

Вы не можете просто поместить vim внутри трубы, потому что тогда Vim не может отображать свой интерфейс.

ls | vim - | more # Does not work

Один из способов решения этой проблемы - использовать gvim -f - внутри канала, поскольку он открывается в отдельном окне. Вам нужно записать файл через :w >> /dev/stdout, а затем :quit!.

Альтернативно (и единственный способ в неграфической среде только для консоли) вы можете написать свой собственный script/function 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 "[email protected]"

    rm "$TMPFILE"
}

И измените трубку на это:

ls | vimAndMore | more

Ответ 3

> ls -1 fred*.c | vim -

приведет к тому, что Vim откроет неназванный файл, содержащий список файлов fred*

Возможно, я неправильно понял ваш вопрос, хотя...

Альтернативная интерпретация:

Смотрите страница, которая описывает технику

Без сохранения текущего буфера вы хотите отправить его содержимое интерпретатору (python, schem, whatever), и вы хотите, чтобы этот интерпретатор запускался в только что порожденном xterm. Новое окно xterm полезно, поскольку запуск оболочки внутри Vim не позволяет одновременно проверять вывод программы и буфер кода, а оболочка Vim слаба в нескольких отношениях.

Ответ 4

Из моего очень ограниченного опыта, невозможно сделать Vim для записи stdout. Я не думаю, что вы можете легко поместить Вима в трубку.

Вы можете попробовать команду vipe из этого .

Ответ 5

Чтобы напечатать буфер для стандартного вывода оболочки, vim нужно запустить в режиме Ex, иначе он откроет "обычный" способ со своим окном и очистит любые выходные буферы при выходе.

Вот простейший рабочий пример:

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

Для предотвращения дополнительных раздражающих сообщений необходимо указать специальный дескриптор файла для стандартного ввода (/dev/stdin).

И вот несколько примеров с синтаксическими строками:

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

по теме: