从QuickFix窗口应用自动Pep8修复

17

背景:

我在使用一个名叫python-mode的Vim插件,其中包括了pep8语法检查工具。通过执行:PyLint命令,可以运行所有的语法检查,并将错误信息显示在QuickFix窗口中。

问题:

现在假设我只使用pep8语法检查工具,在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"

然而,这种方法破坏了我的撤销历史记录,并且似乎过于复杂。有更好的方法吗?

问题:

是否有自动应用pep8修复(如果可用)到QuickFix窗口中的pep8错误的方法?


1
感谢您提供有关python-mode的提示--看起来很棒--特别是对virtualenv和即时语法错误的支持。(与syntastic/其他一些较新的vim插件相比) - Jeff Tratner
1
值得注意的是,从版本0.6.6开始,Python-mode现在支持使用:PyLintAuto在缓冲区内自动进行autopep8更改。(但是,没有逐个批准/拒绝更改的选项)。 - David Cain
@DavidCain 或 :PymodeLintAuto - drs
2个回答

7

选项

有两种简单的方法可以不清除您的撤销历史记录。

1. 与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的复制差异和其他差异命令快速浏览并接受/不接受更改。此外,所有更改都将存储在撤消历史记录中。

" 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. 使用difftool命令和重新加载文件进行Git差异比较

如果你想要在Git索引中使用Git的difftool进行文件比较,你可以按照以下步骤操作:

  1. 保持gvim打开状态;
  2. 在终端中运行命令,并让程序打开一个新的gvim(或vim)实例来处理比较;
  3. 保存所有更改;
  4. 返回到原始的gvim界面,让vim重新加载文件,(至少根据我的认识)你的撤消历史记录应该保留不变。

优缺点

选项1

优点:

  • 每个更改都将保存在撤消历史记录中;
  • 在vim中阅读图形化差异很容易。

缺点:

  • 不会使用git的difftool
  • 依赖于vim的diff函数。

选项2

优点:

  • 使用git的difftool
  • 更清晰的撤消历史记录(从自动pep8之前和之后仅有一个撤消--非常依赖于你的要求)。

缺点:

  • 似乎更为笨拙;
  • 撤消历史记录不够精细。

非常感谢您提供如此详细的回复。选项1似乎更可取-我只是使用Git的difftool作为我预期目标的可读演示。无论如何,我并不总是在编辑最近提交的文件。 - David Cain
遗憾的是,这仍然是一种变通方法,但它比我之前的方法要好得多。 - David Cain
您是否只想接受所有更改并撤销您不想要的更改? - Jeff Tratner
请不要把我的评论看作是对你解决方案的侮辱 - 它很棒。然而,如果能够自动应用快速修复窗口中的解决方案、接受/拒绝,然后继续进行,我会更喜欢。这似乎是我应该尝试编写的 pep8 linter 的扩展。 - David Cain
不,不,我并没有生气。 (而且我很感激你的赞美!)我只是在想。老实说,最简单的方法可能是扩展autopep8脚本,提示您进行每个更改并让您回答y / n,而不是重复所有工作。 - Jeff Tratner

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接