Как вызвать редактор vim и вывод канала в bash

Иногда мне нужно написать текст, а затем передать этот текст в другую команду. Мой обычный рабочий процесс выглядит примерно так:

vim
# I edit and save my file as file.txt
cat file.txt | pandoc -o file.pdf # pandoc is an example 
rm file.txt

Я нахожу это громоздким и стремящимся изучить скрипты bash. Я хотел бы сделать процесс намного проще, написав команду, открывающую редактор, и когда редактор закрывает канал выходом редактора в stdout. Тогда я смогу запустить команду как quickedit | pandoc -o file.pdf.

Я не уверен, как это сработает. Я уже написал функцию для автоматизации этого, выполнив точный рабочий процесс и добавив некоторые дополнения. Он генерирует случайную строку для работы в качестве имени файла и передает ее в vim при вызове функции. Когда пользователь выходит из vim, сохраняя файл, функция распечатывает файл на консоли, а затем удаляет файл.

function quickedit {
    filename="$(cat /dev/urandom | env LC_CTYPE=C tr -cd 'a-f0-9' | head -c 32)"
    vim $filename
    cat $filename
    rm $filename
}
# The problem:
# => Vim: Warning: Output is not to a terminal

Проблема, с которой я вскоре столкнулась, заключается в том, что когда я делаю что-то вроде quickedit | command, сам vim нельзя использовать в качестве редактора, потому что весь вывод ограничивается трубой.

Мне интересно, есть ли какие-либо обходные пути для этого, так что я мог бы передать вывод моей функции quickedit. Субоптимальная альтернатива заключается в том, чтобы запустить отдельный редактор, например, возвышенный текст, но я действительно хочу остаться в терминале.

25 голосов | спросил theideasmith 11 Mayam16 2016, 00:29:51

2 ответа


34

vipe - это программа для редактирования конвейеров:

command1 | vipe | command2

Вы получаете редактор с полным выходом command1, а когда вы выходите, содержимое передается на command2 через трубу.

В этом случае нет command1. Итак, вы можете сделать:

: | vipe | pandoc -o foo.pdf

Или:

vipe <&- | pandoc -o foo.pdf

vipe выбирает код EDITOR и VISUAL, поэтому вы можете использовать их, чтобы открыть Vim.

Если вы не установили его, vipe доступен в moreutils; sudo apt-get install moreutils, или независимо от эквивалента вашего аромата.

ответил muru 11 Mayam16 2016, 02:00:31
20

Вы можете сделать это из Vim:

:w !pandoc -o file.pdf

Или даже напишите буфер в сложный конвейер:

:w !grep pattern | somecommand > file.txt

И затем вы можете выйти из Vim без сохранения:

:q!

Однако, учитывая ваш конкретный вариант использования, возможно, лучшее решение, используя vi в качестве редактора командной строки. Предполагая, что вы используете bash:

set -o vi

Это приводит к привязке клавиш к vi. Таким образом, вы можете редактировать свои команды прямо в командной строке с помощью основных клавиш vi, нажав <Esc>, а затем введите команды vi, такие как x, cw и т. д. (Вы можете вернуться в режим вставки, нажав i)

Еще лучше и более актуально для этого вопроса вы можете открыть Vim, чтобы напрямую создавать содержимое своей командной строки. Просто введите <Esc>v, и вы получите пустой буфер Vim. Когда вы сохраняете и завершаете, выполняет команду в командной строке и сразу же запускается. Это намного более гибко, чем редактирование в командной строке, так как вы можете написать весь мини-скрипт, если хотите.


Итак, например, если вы хотите написать какой-то сложный текст и сразу же перенести его в pandoc, вы можете просто ввести:

<Esc>v

Затем отредактируйте буфер Vim, пока не появится что-то вроде:

cat <<EOF | pandoc -o file.pdf
stuff for pandoc
more stuff for pandoc
EOF

Затем сохраните и выйдите (с помощью :x), и все это будет запущено как команда оболочки.

Он также будет доступен в истории команд вашей оболочки.

ответил Wildcard 11 Mayam16 2016, 01:49:54

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132