16

背景:

我正在使用(很棒的)Vim 插件python-mode,其中包括 pep8 linter。该:PyLint命令运行所有 linter 并在 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"

但是,这种方法破坏了我的撤消历史,并且看起来不必要地复杂。有没有更好的办法?

问题:

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

4

2 回答 2

7

选项

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

1. 与 Vim 中保存的文件进行比较

DiffWithSaved很久以前在网上发现了这个功能,非常好用。在这种情况下,您只需在终端中运行 autopep8,当Gvim要求重新加载文件时,选择否,然后运行此功能,它将弹出一个包含新文件的暂存缓冲区并允许您进行更改。

" 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. 与 git 比较difftool并重新加载文件

如果你想与 git index 中的文件进行比较(并使用 git 的 difftool),你可以执行以下操作:

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

优点缺点

选项1

好处:

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

缺点:

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

选项 2

好处:

  • 使用 git 的 difftool
  • 更清晰的撤消历史记录(来自 autopep8 前后的单个撤消 - 非常取决于您想要的内容)

缺点:

  • 似乎更尴尬
  • 粒度较小的撤消历史记录
于 2012-06-11T23:50:18.203 回答
0

您还可以使用出色的vim-autopep8

于 2016-11-14T16:01:37.380 回答