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

Применить автоматические исправления pep8 из окна QuickFix

Справочная информация:

Я использую (фантастический) плагин Vim python-mode, который включает в себя pep8 linter. Команда :PyLint запускает все литеры и открывает ошибки в окне QuickFix.

Проблема:

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

Мой текущий подход заключается в том, чтобы запустить autopep8 в моем файле Python, разбить результаты, а затем исправить любые плохие изменения:

$ autopep8 --in-place spam.py
$ git difftool spam.py  # check edits in gVim, write to file
$ git commit spam.py -m "Fix bad PEP8 formatting"

Однако этот подход разрушает мою историю отмены и кажется излишне сложным. Есть ли лучший способ?

Вопрос:

Есть ли способ автоматически применить исправления pep8 (когда они доступны) к ошибкам pep8 в окне QuickFix?

4b9b3361

Ответ 1

Функции

Есть два простых ответа, которые не уничтожат историю отмены.

1. Diff с сохраненным файлом в Vim

Я нашел эту функцию DiffWithSaved в сети довольно давно, и это было очень полезно. В этом случае вы можете просто запустить autopep8 в терминале, а когда Gvim попросит перезагрузить файл, выберите no, а затем запустите эту функцию, которая выведет буфер нуля с вашим новым файлом и позволит вам изменить ситуацию вокруг.

" copy this to your vimrc or source it

" tells vim not to automatically reload changed files
set noautoread 

function! DiffWithSaved()
  let filetype=&ft
  diffthis
  vnew | r # | normal! 1Gdd
  diffthis
  exe "setlocal bt=nofile bh=wipe nobl noswf ro ft=" . filetype
endfunction

" sets up mappings to function

com! DiffSaved call DiffWithSaved()
map <Leader>ds :DiffSaved<CR>

Как только вы запустите это, вы можете использовать команды vim copy-diff и другие команды diff, чтобы быстро пройти и принять/не принимать изменения. Кроме того, все будут сохранены в истории отмены.

" run these commands after sourcing the above function

" % expands to filename (also %:h to head, %:t to tail)
" if it throws an error, just do :cd %:h first

:!autopep8 --in-place %
:DiffSaved

2. Diff с git difftool и перезагрузите файл

Если вы хотите разделить файл с индексом git (и используя git diffftool), вы можете сделать следующее:

  • оставить gvim открытым,
  • запустите свои команды в терминале и дайте программе открыть новый экземпляр gvim (или vim), чтобы обрабатывать разные.
  • Сохраните все.
  • Вернитесь к исходному gvim, пусть vim перезагрузит файл и (по крайней мере, насколько мне известно) ваша история отмены останется.

Преимущества/Недостатки

Вариант 1

Преимущества:

  • каждое изменение будет сохранено в вашей истории отмены
  • графические различия в vim легко читаются

Недостатки:

  • Не будет использовать git difftool
  • полагается на функции vim diff.

Вариант 2

Преимущества:

  • использует git difftool
  • история отмены отмены (однократное отключение от pre и post autopep8 - очень зависит от того, что вы хотите)

Недостатки:

  • кажется более неудобным
  • менее гранулированная история отмены

Ответ 2

Вы также можете использовать отличный vim-autopep8