开发者

how to use pythontidy in vim

开发者 https://www.devze.com 2023-01-18 06:01 出处:网络
what I am using now is , autocmd BufWritePost *.py !python PythonTidy.py % % It really call the tidy programe and change the file, but the vim does not reload the new file.

what I am using now is ,

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

It really call the tidy programe and change the file, but the vim does not reload the new file.

And I do not want to install another plugin for it.

======================= note: I found it's dangerous about this feature, PythonTidy will will output a empty file if the command faild, it means if you have syntax error, you will lose your f开发者_运维知识库ile unless press "u" to get it,but you can't save before you fix syntax error.

I call :!PythonTidy % % manually after pylint complete now.


Use BufWritePre instead of BufWritePost and combine Vim range filtering with PythonTidy’s stdin/stdout mode.

autocmd FileType python autocmd BufWritePre <buffer> let s:saveview = winsaveview() | exe '%!python PythonTidy.py' | call winrestview(s:saveview) | unlet s:saveview

(The use of autocmd FileType python autocmd BufWritePre <buffer> makes this a bit more accurate than matching on a glob pattern: it means “any time a Python file is detected, install this autocmd for that buffer” – so it works independently of file name.)

Unfortunately this cannot preserve your cursor position if you undo the filtering. (You are filtering a whole-file range; when undoing a filter operation, the cursor jumps to the first line in the range; so you end up at the top of the file.) I was hoping to find a way to create a no-op undo state, before, so you could hit u twice and get back to the right place, but I can’t make that work as yet. Maybe someone else knows how.


hi the following fixed the cursor postion problem

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

autocmd! bufwritepost *.py call PythonTidySaver()


Based on :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}

So you'd need to use :e after updating the file externally. However, :! doesn't let you use | normally (see :help :!), so you need to wrap it:

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

(:autocmd doesn't interpret | normally either, which is why you don't need to escape it yet again.)

0

精彩评论

暂无评论...
验证码 换一张
取 消