【问题标题】:Apply automatic pep8 fixes from QuickFix window从 QuickFix 窗口应用自动 pep8 修复
【发布时间】:2012-06-12 05:25:42
【问题描述】:

背景:

我正在使用(很棒的)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 错误?

【问题讨论】:

  • 感谢有关 python-mode 的提示——看起来很棒——尤其是对 virtualenv 和动态语法错误的支持。 (相对于 syntastic/其他一些较新的 vim 插件)
  • 值得注意的是,从0.6.6 版本开始,Python 模式现在支持使用:PyLintAuto 在缓冲区内自动更改autopep8。 (但是,无法一一批准/拒绝更改)。
  • @DavidCain 或 :PymodeLintAuto

标签: python vim pep8 python-mode


【解决方案1】:

你也可以使用优秀的vim-autopep8

【讨论】:

    【解决方案2】:

    选项

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

    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 copy-diff and other diff commands 快速完成并接受/不接受更改。此外,所有内容都将存储在撤消历史记录中。

    " 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 索引中的文件进行比较(并使用 git 的 difftool),你可以执行以下操作:

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

    优点/缺点

    选项 1

    优点:

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

    缺点:

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

    选项 2

    优点:

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

    缺点:

    • 似乎更尴尬
    • 较少粒度的撤消历史记录

    【讨论】:

    • 感谢您提供如此详细的回复。选项 1 似乎更可取——我只是使用 Git 的 difftool 作为我预期目标的可读演示。无论如何,我不会一直在编辑最近提交的文件。
    • 遗憾的是,这仍然是一种解决方法,但比我以前的方法要好得多。
    • 您是否只想接受所有更改而只撤消您不想要的更改?
    • 请不要将我的 cmets 视为对您解决方案的侮辱 - 这太棒了。但是,如果能够从 QuickFix 窗口自动应用解决方案,接受/拒绝,然后继续前进,我会更喜欢。似乎是我应该尝试编写的 pep8 linter 的扩展。
    • 不,不,我没有被冒犯。 (我很欣赏你的好话!)我真的只是想知道。老实说,最简单的方法可能是扩展 autopep8 脚本以在每次更改时提示您并让您说是/否,而不是重复所有工作。
    猜你喜欢
    • 2011-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-05
    • 1970-01-01
    • 2018-10-21
    • 2018-05-23
    • 1970-01-01
    相关资源
    最近更新 更多