从QuickFix窗口应用自动pep8修复

Dav*_*ain 14 python vim pep8 python-mode

背景:

我正在使用(梦幻般的)Vim插件python-mode,其中包括pep8 linter.该:PyLint命令运行所有链接并在QuickFix窗口中打开错误.

问题:

现在,让我们假设我只使用pep8 linter,并且我有一个充满错误的QuickFix窗口.我想逐步解决这些错误并应用自动修复(类似于autopep8).autopep8工具很棒,但它会出错.理想情况下,我希望能够监督Vim中的每个修复(应用修复,检查,转到下一个修复).

我目前的方法是在我的Python文件上运行autopep8,对结果进行差异,然后修复任何不良更改:

$ 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"
Run Code Online (Sandbox Code Playgroud)

然而,这种方法破坏了我的撤消历史,似乎不必要地复杂.有没有更好的办法?

题:

有没有办法自动将pep8修复程序(如果可用)应用于QuickFix窗口中的pep8错误?

Jef*_*ner 7

选项

有两个简单的答案不会消除您的撤消历史记录.

1.使用Vim中保存的文件进行Diff

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>
Run Code Online (Sandbox Code Playgroud)

运行后,您可以使用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
Run Code Online (Sandbox Code Playgroud)

2.使用git进行Diff difftool并重新加载文件

如果你想在git索引中使用文件进行区分(并使用git的difftool),你可以执行以下操作:

  1. 让gvim打开,
  2. 在终端中运行你的命令,让程序打开一个新的gvim(或vim)实例来处理diffing.
  3. 保存一切.
  4. 回到原来的gvim,让vim重新加载文件,并且(至少据我所知)你的撤销历史应该保留.

优点缺点

选项1

好处:

  • 每个更改都将保存在撤消历史记录中
  • vim中的图形差异易于阅读

缺点:

  • 不会使用git的difftool
  • 依赖于vim的diff功能.

选项2

好处:

  • 使用git的difftool
  • 更清晰的撤消历史记录(从autopep8前后单一撤消 - 非常依赖于你想要的)

缺点:

  • 似乎更尴尬
  • 细粒度的撤消历史