2010-10-02 51 views
4

我現在使用的是,如何使用pythontidy在vim

autocmd BufWritePost *.py !python PythonTidy.py % % 

這真的叫整潔PROGRAME和更改文件,但Vim不會重新加載新的文件。

我不想爲它安裝另一個插件。

======================= 注意:我發現這個功能很危險,如果命令faild,PythonTidy會輸出一個空文件,這意味着如果你有語法錯誤,除非按下「u」才能得到它,否則將會丟失文件,但在解決語法錯誤之前無法保存。

現在我調用:!PythonTidy%%在pylint完成後手動完成。

回答

1

基於:求助: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} 

所以你需要使用:外部更新文件後,即但是:!不讓你使用|正常(見:幫助:!),所以你需要把它包起來:

 
autocmd BufWritePost *.py execute "!python PythonTidy.py % %" | e 

(:自動命令不解釋|正常或者,這就是爲什麼你不需要再次轉義)

+0

得到一個錯誤,/斌/慶典:E:找不到命令 – 2010-10-02 05:35:59

+0

!打電話給 – 2010-10-02 05:36:59

+0

@guilin:這個編輯怎麼樣? – 2010-10-02 05:56:48

2

使用BufWritePre而不是BufWritePost,並將Python範圍過濾和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 FileType python autocmd BufWritePre <buffer>使這一點上比在glob模式匹配更加精確的:它意味着「被檢測Python文件的任何時候,安裝此自動命令爲該緩衝區」 - 因此它獨立工作文件的名稱)。

不幸的是,如果撤消過濾,則無法保留光標位置。 (你正在過濾整個文件的範圍;當撤消過濾操作時,光標跳到範圍的第一行;所以你最終在文件的頂部)。我希望找到一種方法來創建一個不是在之前的撤消狀態下,您可以兩次打到並返回到正確的位置,但我無法完成此項工作。也許別人知道如何。

+0

au filetype python au ...真的很好snip – 2010-10-02 12:26:09

+0

請注意,您也可以全局匹配文件類型,例如。您可以編寫'autocmd FileType {xml,xslt,xhtml}'來使自動命令適用於檢測到的任何包含XML,XSLT或XHTML的文件。這對於可以通過內容而不是文件名檢測到的文件類型特別有用。 – 2010-10-03 13:29:42

+0

你甚至不需要大括號,就可以在那裏使用另一個逗號應用程序。 (:help file-pattern) – 2010-10-03 20:57:50

1

喜下列固定光標現在的位置問題

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

autocmd! bufwritepost *.py call PythonTidySaver()