如何在vim中使用pythontidy

如何在vim中使用pythontidy,vim,Vim,我现在用的是, autocmd BufWritePost *.py !python PythonTidy.py % % 它确实调用tidy程序并更改文件,但vim不会重新加载新文件 我不想为它安装其他插件 ======================= 注意:我发现这项功能很危险,如果命令失败,PythonTidy将输出一个空文件,这意味着如果您有语法错误,您将丢失文件,除非按“u”获取它,但在修复语法错误之前无法保存 我叫:!Pyrint现在完成后手动完成PythonTidy%%。基于:he

我现在用的是,

autocmd BufWritePost *.py !python PythonTidy.py % %
它确实调用tidy程序并更改文件,但vim不会重新加载新文件

我不想为它安装其他插件

======================= 注意:我发现这项功能很危险,如果命令失败,PythonTidy将输出一个空文件,这意味着如果您有语法错误,您将丢失文件,除非按“u”获取它,但在修复语法错误之前无法保存

我叫:!Pyrint现在完成后手动完成PythonTidy%%。

基于:help:e:

*:e* *:edit* :e[dit] [++opt] [+cmd] Edit the current file. This is useful to re-edit the current file, when it has been changed outside of Vim. This fails when changes have been made to the current buffer and 'autowriteall' isn't set or the file can't be written. Also see |++opt| and |+cmd|. {Vi: no ++opt} *:e**:编辑* :e[dit][++opt][+cmd]编辑当前文件。这对于重新编辑 在Vim之外更改当前文件时。 当对当前数据进行更改时,此操作失败 缓冲区和“autowriteall”未设置或文件无法 写下来。 另请参见|++opt |和|+cmd |。 {Vi:no++opt} 因此,您需要在外部更新文件后使用:e。然而,:!不允许您正常使用|(请参阅:帮助:!),因此您需要包装它:

autocmd BufWritePost *.py execute "!python PythonTidy.py % %" | e autocmd BufWritePost*.py执行“!python PythonTidy.py%%”| e
(:autocmd通常也不会解释|这就是为什么您不需要再次逃避它。)

使用
BufWritePre
而不是
BufWritePost
,并将Vim范围过滤与PythonTidy的stdin/stdout模式相结合

autocmd FileType python autocmd BufWritePre <buffer> let s:saveview = winsaveview() | exe '%!python PythonTidy.py' | call winrestview(s:saveview) | unlet s:saveview
autocmd文件类型python autocmd BufWritePre让s:saveview=winsaveview()| exe“!PythonTidy.py'|调用winrestview(s:saveview)|取消设置s:saveview
(使用
autocmd文件类型python autocmd BufWritePre
比在glob模式上进行匹配更精确:这意味着“在检测到python文件时,为该缓冲区安装此autocmd”—因此它独立于文件名工作。)


不幸的是,如果撤消筛选,则无法保留光标位置。(您正在过滤整个文件范围;当撤消筛选操作时,光标会跳到范围中的第一行;因此您将位于文件的顶部。)之前,我希望找到一种方法来创建一个不可操作的撤消状态,以便您可以按两次u并返回到正确的位置,但我目前还无法实现这一点。也许其他人知道怎么做。

您好,下面修复了光标位置问题

function! PythonTidySaver()
    let oldpos=getpos('.')
    %!PythonTidy    
    call setpos('.',oldpos)
endfunction

autocmd! bufwritepost *.py call PythonTidySaver()

autocmd BufWritePost*.py!python PythonTidy.py%%autocmd BufWritePost*.py e,我将其拆分为两行,它重新加载文件,但它丢失了文件语法。@guilin,“e”之后的“syntax on”将重新加载,但我开始认为最初的方法是错误的。对不起,我没有更多有用的建议。不管怎样,它都很管用。谢谢。重新加载文件时的autocmd BufWritePost*.py e |语法将丢失所有撤消树。这不是一个好的解决方案。@亚里士多德:这不取决于undoreload的设置吗?请注意,您也可以全局匹配文件类型,例如,您可以编写
autocmd FileType{xml,xslt,xhtml}
,使自动命令应用于检测到包含xml,xslt或xhtml的任何文件。这对于可以通过内容而不是文件名检测到的文件类型特别有用。您甚至不需要大括号,就可以使用逗号的另一个应用程序。(:帮助文件模式)