Путаница с использованием каналов оболочки из командного режима vim - PullRequest
0 голосов
/ 28 февраля 2020

У меня есть функция (написано ниже; источник: TeX SX ), которая использует каналы в оболочке, которые я хотел бы использовать в командном режиме vim. Он работает, как и предполагалось из оболочки, но возвращает E34: Ошибка предыдущей команды , если он введен в режиме команд vim. Полный кредит идет к jirislav в этом сообщении на TeX SX.

: | pdflatex -halt-on-error sr c .tex | grep '^!. *' -A200 --color = всегда

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

Я попробовал следующее в командном режиме vim:

:! : | pdflatex -halt-on-error sr c .tex | grep '^!. *' -A200 --color = всегда

возвращает ошибку E34. Нет труб скрывает всю компиляцию; однако, это также не выводит ошибки. Удаление 1 из 2 каналов также возвращает ошибки E34 для меня.

Я попытался продолжить поиск неисправностей, но безуспешно, и вот некоторые результаты этого. Помощь для:! говорит

труба '|' в {cmd} передается в оболочку, вы не можете использовать его для добавления команды vim. Смотрите: bar

и: bar говорит (что-то, что называется выходом из него, я думаю)

'|' может использоваться для разделения команд, поэтому вы можете задать несколько команд в одной строке. Если вы хотите использовать '|' в аргументе предваряйте его символом '\'.

Я пытался делать то, что предлагает: bar, то есть

:! : \ | pdflatex -halt-on-error sr c .tex \ | grep '^!. *' -A200 --color = всегда

В результате он скрывает все, включая ошибки компиляции, которые я хочу видеть. Таким образом, я пришел к выводу, что я понятия не имею, как правильно использовать shell-каналы в командном режиме vim.

Если вы не являетесь пользователем LaTeX, все, что предназначается для этой функции, это следующее , pdflatex компилирует то, что происходит в vim, в файл pdf. Принятие: pdflatex% из командного режима vim выводит целую серию обработанных текстов и прерывает рабочий процесс; grep в функции вытягивает ошибки компиляции, если они существуют. Функция предназначена для того, чтобы скрыть весь вывод из pdflatex , если только не произошла ошибка компиляции, в этом случае она выводит только ошибку и выводит ее красным.

Если кто-то захочет объяснить ошибку E34 и почему она не работает, это также будет оценено.

Редактировать 1: Теперь это решено благодаря filbranden , Ниже приведена пара картинок, прикрепленных к минимальному примеру, если кто-нибудь столкнется с этим позже.

vim file перед вводом , output

Edit 2 : Если вы хотите вставить это в ваш файл .vimr c, вам нужно выйти из канала перед grep, иначе файл vimr c по умолчанию будет думать, что канал является разделителем.

1 Ответ

1 голос
/ 01 марта 2020

E34: Нет предыдущей команды

Таким образом, ответ на ваш вопрос скрывался в поле зрения под :help E34, что перенаправляет на команду :!.

(Vim pro-tip: всякий раз, когда вы получаете сообщение от Vim, попросите :help в коде ошибки, чтобы получить больше информации об этом.)

Раздел :! включает в себя этот отрывок:

Любой ! в {cmd} заменяется предыдущей внешней командой . Но не тогда, когда перед '!' Стоит обратная косая черта sh, тогда эта обратная коса sh удаляется.

У вас действительно есть ! в вашей команде , как часть регулярного выражения grep, ^!.*, так что это вызывало поведение «истории», пытаясь заменить ранее выполненную команду. Но так как ни одна команда не была выполнена в тот момент, команда завершилась неудачно с ошибкой.

Вы можете решить ее, выбрав ! с обратным слэ sh, который Vim удалит перед передачей команды shell:

:! pdflatex -halt-on-error src.tex | grep '^<b>\!</b>.*' -A200 --color=always

Но учтите, что есть более эффективные способы решения этой проблемы! Позвольте мне рассказать о некоторых из них.

Использование systemlist ()

Одним из отличных способов запуска внешних команд в Vim является использование функции systemlist(), которая запускает Команда на оболочке, захватывает ее выходные данные, разбивает его на строки и возвращает список с результирующими выходными строками.

Таким образом, вы можете начать с:

let latex_output = systemlist('pdflatex -halt-on-error src.tex')

И затем использовать команды Vimscript для проверьте строки, начинающиеся с !, для отчета пользователю.

Обратите внимание, что в отличие от :!, вывод systemlist() никогда не отображается для пользователя (что означает, что вы не переключаетесь обратно чтобы увидеть терминал, возможно, пустой, и после выполнения у вас нет запроса «Hit enter». Это здорово!

Но это означает, что вам нужно представить эту информацию пользователю, когда Есть ошибки. Отличный способ сделать это - использовать окно быстрого исправления !

Вы можете использовать функцию setqflist() для установки содержимого быстрого исправления окно.

(Для достижения наилучших результатов следует t 'errorformat' соответственно, подробнее об этом позже.)

Использование vim-dispatch

Если вам не нравится часть выполнения внешней команды (через :! или * 1068) *) у него есть блок Vim до завершения выполнения команды, затем рассмотрите возможность установки плагина vim-dispatch .

Он может выполнить команду за вас в фоновом режиме или в отдельном терминале, так что вы не заблокированы от редактирования. Он также интегрируется с командой :make и окном быстрого исправления.

Конфигурация компилятора в vim-latex

Наконец, плагин vim-latex (также известный как как latex-suite) имеет конфигурации, которые помогут вам запустить pdflatex и сообщить об ошибках.

Включает конфигурацию Vim :compiler, которая будет запускать pdflatex для вас как :make программа. Также установит 'errorformat' для распознавания строки ! LaTeX Error и распознавания номера строки ошибок, поэтому вы можете перейти к ним прямо из списка быстрых исправлений.

Обратите внимание, что vim -latex также имеет много других функций, которые помогут вам писать документы LaTeX в Vim (помимо управления генерацией вывода через поддержку компилятора.) Возможно, вы захотите проверить и эти другие функции.

(Поскольку плагин имеет довольно много функций, я рекомендую прочитать всю документацию, чтобы начать с него работать.)

Также обратите внимание, что этот плагин совместим с vim-dispatch (поскольку vim-latex предоставляет интерфейс компилятора и vim- отправка потребляет его), так что вы можете использовать оба вместе, если вам нравятся оба!

...