Перенаправить команду ex на STDOUT в vim

Я пытаюсь создать команду для вывода информации о выделении vim в STDOUT. Я могу успешно записать в такой файл:

vim +'redir >outfile' +'hi' +'redir END' +'q'

После этого outfile содержит именно то, что я хочу. Но я бы предпочел вывести в STDOUT команду, которая преобразует эту информацию о выделении в CSS.

Этот подход пытается перенаправить команду в регистр, записать в текущий буфер, а затем отправить этот вывод в tee.

vim -E +'redir @a' +'silent! hi' +'redir END' +'put a' +'w !tee' +'q!' > outfile

Это довольно близко, но выводит начальное пейджинговое сообщение (еще 255 строк...) и какую-то ерунду ANSI escape в конце. Установка nomore не подавила сообщение для меня. Я хочу отправить точный вывод, отправленный outfile в первой команде, в STDOUT.


person Triptych    schedule 24.05.2013    source источник
comment
Я не уверен, что это может быть вариантом для вас: vim +'redir! >outfile' +'silent! hi' +'redir END' +'q'&&cat outfile   -  person Kent    schedule 24.05.2013
comment
Почему бы вам не использовать встроенный :TOhtml?   -  person romainl    schedule 24.05.2013
comment
@romainl по какой-то причине TOhtml не выводит правильные цвета для меня.   -  person Triptych    schedule 25.05.2013


Ответы (3)


Vim поддерживает вывод в stderr, который мы можем перенаправить на stdout для решения вашей проблемы. Однако будьте осторожны, эта функция предназначена только для целей отладки, поэтому у нее есть несколько преимуществ. Вот краткий набросок того, как вы можете это сделать.

Во-первых, мы будем запускать Vim в автоматическом или пакетном режиме, который включается с помощью флагов -e -s (:h -s-ex). Мы отключаем файлы подкачки -n, потому что они будут мешать, если нам нужно убить Vim, когда он зависнет.

Вместо того, чтобы передавать команды Ex в качестве аргументов командной строки, мы используем файл сценария с -S. Создайте файл hi.vim со следующим содержимым:

verbose highlight

:verbose необходим для того, чтобы Vim вывел сообщение :highlight в stderr. Давайте посмотрим, что у нас есть на данный момент:

$ vim -n -e -s -S hi.vim

Пока не запускайте это, иначе вы застрянете во тьме безголового Вима!

Добавьте команду :quit и перенаправьте stderr на stdout:

$ vim -n -e -s -S hi.vim +quit 2>&1

Вуаля! Теперь направьте этот беспорядок в любой файл или утилиту по вашему желанию.

На эту тему есть очень подробная вики-статья "Vim как системный интерпретатор для vimscript".


Тонкости: из-за того, как Vim взаимодействует с терминальной средой, он не может записывать правильные окончания строк LF в unix в пакетном режиме вывода. Вместо этого он записывает окончания строк, которые выглядят как окончания строк CRLF.

Рассмотрите возможность добавления фильтра, чтобы избавиться от них:

$ vim -n -e -s -S hi.vim +quit 2>&1 | tr -d '\r' | my-css-util

Это отвечает на общий вопрос о том, как «перенаправить команду ex на STDOUT в vim», но это не обязательно работает для вашей проблемы :hi из-за этого ограничения, вызванного флагами -e -s:

'term' и $TERM не используются.

person glts    schedule 25.05.2013
comment
Отличный общий ответ! Для конкретной проблемы я бы предпочел выяснить, почему :TOhtml не работает. Его сопровождающий находится на vim_dev и очень полезен. - person Ingo Karkat; 26.05.2013
comment
Потрясающий ответ. Настоящий мастер темных искусств. :) - person Darshan Sawardekar; 05.08.2013

Я столкнулся с этим по ошибке при выполнении вашей первой команды. Во второй раз, когда я запустил его, он перешел в стандартный вывод. Я думаю, это потому, что файл уже существовал. Итак, вы можете попробовать (отправив что-то, что уже существует):

vim +'redir >/dev/null' +'hi' +'redir END' +'q'
person cforbish    schedule 28.05.2013

Если вы работаете с Unix-совместимой средой, вы всегда можете использовать специальный файл, например:

ex +"redir>>/dev/stdout | hi | redir END" -scq!

Это напечатает любую команду Vi/Ex в стандартный вывод, который вы сможете проанализировать дальше.

person kenorb    schedule 17.10.2015