Vim: Использование внешней команды и обработка ошибок - PullRequest
6 голосов
/ 27 февраля 2012

Я пытаюсь использовать внешнюю команду для обработки некоторого форматирования в диапазоне строк в Vim, но не могу найти способ справиться с ошибками из внешней команды.

Эти ошибки обычно возникают, когда оболочка возвращает что-то отличное от 0 и предлагает Vim отобразить что-то вроде:

shell returned 1

Помимо этого, он заменяет строки, которые я хотел отформатировать, фактическим сообщением об ошибке. Это также случается, если я делаю:

:set equalprg=myformatter\ --format-flag\

Как можно безопасно перехватить ошибку для внешней команды и отобразить сообщение об ошибке?

Примечание: это , а не вопрос о том, как использовать внешнюю команду для форматирования некоторого текста в Vim, а, скорее, о том, как перехватить ошибку и отобразить сообщение обратно.

1 Ответ

4 голосов
/ 03 октября 2012

Возможно, есть лучший способ сделать это, но я набросал этот черновик (см. Далее по адресу equalprg).В основном он переопределяет gq, перезаписывая его, чтобы распечатать ошибку, а затем отменить ее.

set formatprg=~/test.sh

nnoremap gq :setl opfunc=FormatPrg<cr>g@
fun! FormatPrg(...)
   silent exe "'[,']!".&formatprg
   if v:shell_error == 1
      let format_error = join(getline(line("'["), line("']")), "\n")
      undo
      echo format_error
   end
endfun

Это то, что в ~/test.sh:

echo "error!!
alskdjf alskdf
alskdj flaskdjf" 1>&2
exit 1

Редактировать:

Я только что понял, что вообще не ответил на твой вопрос, ха-ха.Мое решение для equalprg еще менее изящно, но оно может удовлетворить ваши потребности.Чтобы использовать это , вы должны установить equalprg .Либо закомментируйте строку nnoremap, либо set indentexpr=EqualPrg(), если хотите переключаться между внешним инструментом и внутренним форматером отступов.

set equalprg=~/test.sh    

nnoremap = :setl opfunc=EqualPrg<cr>g@
fun! EqualPrg(...)
   if &equalprg != ""
      silent exe "'[,']!".&equalprg
   else
      set indentexpr=
      exe "norm! `[=`]"
      set indentexpr=EqualPrg()
   endif
   if v:shell_error == 1
      let format_error = join(getline(line("'["), line("']")), "\n")
      undo
      echo format_error
   endif
endfun
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...