2010-10-26 53 views
26

短文本寬度從強大PEP 8Vim的:使用在註釋和文檔字符串

[P]租用期限所有線路爲最多79個字符。爲了流動長文本塊(文檔或註釋),建議將長度限制爲72個字符。

當編輯在Vim的Python代碼,我把我的textwidth到79,而當我打的字符數限制的Vim自動換行的Python代碼排長對我來說。

但是在評論和文檔字符串中,我需要將文本換成72個字符。有什麼辦法讓Vim自動將textwidth設置爲72,當我處於評論或文檔字符串中時,並在完成後將其設置回來?

+3

非常類似的問題:http://stackoverflow.com/questions/3475072/vim-different-textwidth-for-multiline-c-comments – adw 2010-10-26 20:29:43

回答

14

所以,我從來沒有做過任何Vim腳本編寫,但基於this question about doing something similar in Cthis tip for checking if you're currently in a comment,我已經在一起解決了一個問題。

默認情況下,使用的79個字符正常線路和72個字符徵求意見的PEP8,建議寬度,但是你可以通過letg:python_normal_text_widthg:python_comment_text_width變量,分別覆蓋它們。 (我個人用78個字符換行)

把這個寶貝放在你的.vimrc你應該很好走。我可能會在稍後將其封裝爲插件。

function! GetPythonTextWidth() 
    if !exists('g:python_normal_text_width') 
     let normal_text_width = 79 
    else 
     let normal_text_width = g:python_normal_text_width 
    endif 

    if !exists('g:python_comment_text_width') 
     let comment_text_width = 72 
    else 
     let comment_text_width = g:python_comment_text_width 
    endif 

    let cur_syntax = synIDattr(synIDtrans(synID(line("."), col("."), 0)), "name") 
    if cur_syntax == "Comment" 
     return comment_text_width 
    elseif cur_syntax == "String" 
     " Check to see if we're in a docstring 
     let lnum = line(".") 
     while lnum >= 1 && (synIDattr(synIDtrans(synID(lnum, col([lnum, "$"]) - 1, 0)), "name") == "String" || match(getline(lnum), '\v^\s*$') > -1) 
      if match(getline(lnum), "\\('''\\|\"\"\"\\)") > -1 
       " Assume that any longstring is a docstring 
       return comment_text_width 
      endif 
      let lnum -= 1 
     endwhile 
    endif 

    return normal_text_width 
endfunction 

augroup pep8 
    au! 
    autocmd CursorMoved,CursorMovedI * :if &ft == 'python' | :exe 'setlocal textwidth='.GetPythonTextWidth() | :endif 
augroup END 
+3

使用CursorMoved *組對性能有任何明顯的影響嗎?我使用類似的方法,但選擇使用'InsertEnter'au組而不是CursorMoved *。 CursorMoved肯定是更細粒度的,但'InsertEnter'對我來說足夠精細,而且被調用的次數要少得多。只是想提及它作爲一個選項,並且還要檢查您是否注意到「CursorMoved」的任何性能問題。 – 2010-10-27 03:51:34

+0

@Herbert Sitz我沒有注意到使用CursorMoved的任何性能問題。它使得這個腳本更加自然(例如)重新格式化現有的文檔字符串,或者像我一樣,你是Vim的新手,並且在插入模式下仍然移動很多。但是使用InsertEnter肯定會捕獲常見用途,並使用更少的資源。 – 2010-10-27 19:04:03

+1

這太棒了;謝謝你把它放在一起。我注意到,在我的vim設置中,當我在字符串文字中時,synIDattr調用的結果是「常量」,而不是「字符串」。我必須將其作爲我vimrc中的一個選項進行比較。 – adrian 2011-09-15 22:25:37

4

接受的答案很好!但是,它並不支持我對格式化/編輯註釋的習慣:我編輯並使用gqj命令,本質上是「重新組合下一行的當前行」。然後我打了'。'爲每一行重複該操作(命令本身將光標移至下一行)。我不太瞭解vim腳本語言,因此有人可能會將此支持添加到接受的答案中。在此期間,我所做的是圖個功能鍵(F6)的文本寬度更改爲72,格式化線,然後更改文本寬度回79

nmap <F6> :set textwidth=72<CR>gqj:set textwidth=79<CR> 

現在,當我在我docstring,我只需進行編輯(ESC),然後重複按F6,直到所有行都格式正確。

我將我的地圖命令和接受的答案腳本添加到了我的.vim/after/ftplugin/python.vim。