Domanda

Dalla possente PEP 8 :

  

[P] limite locazione tutte le linee ad un massimo di 79 caratteri. Per scorrere lunghi blocchi di testo (docstrings o commenti), limitando la durata a 72 caratteri è raccomandato.

Quando si modifica il codice Python in Vim, ho impostato la mia textwidth a 79, e Vim avvolge automaticamente lunghe linee di codice Python per me quando ho colpito il limite di caratteri. Ma nei commenti e docstring, ho bisogno di disporre il testo a 72 caratteri invece.

C'è un modo per rendere Vim impostato automaticamente textwidth a 72 quando mi trovo in un commento o docstring, e impostare indietro quando ho finito?

È stato utile?

Soluzione

Quindi, non ho mai fatto alcun script Vim prima, ma sulla base questa domanda di fare qualcosa di simile in C e questo suggerimento per verificare se si è attualmente in un commento , ho messo insieme una soluzione.

Per impostazione predefinita, utilizza le larghezze PEP8-suggerito di 79 caratteri per linee normali e 72 caratteri per i commenti, ma li si può ignorare da letting variabili g:python_normal_text_width o g:python_comment_text_width, rispettivamente. (Personalmente, mi avvolgo linee normali a 78 caratteri.)

Goccia questo bambino nel vostro .vimrc e si dovrebbe essere a posto. Posso confezionare questo come un plugin più tardi.

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

Altri suggerimenti

La risposta accettata è grande! Essa non significa, tuttavia, supporta l'abitudine che ho per la formattazione / modifica dei commenti: io faccio le mie modifiche e quindi utilizzare il comando gqj, che è essenzialmente, "riformattare la riga corrente in combinazione con il prossimo". Poi mi ha colpito '' ripetere che per ogni linea (il comando stesso avanza il cursore alla riga successiva). Non conosco il linguaggio di scripting vim molto bene, quindi qualcuno potrebbe essere in grado di aggiungere il supporto per questo la risposta accettata. Nel frattempo, quello che ho fatto è la mappa un tasto funzione (F6) per cambiare il textwidth a 72, formattare la linea e quindi modificare la parte posteriore textwidth a 79.

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

Ora, quando mi trovo in una docstring, ho solo fare la modifica, (ESC) e poi ha colpito F6 più volte fino a quando tutte le linee sono correttamente formattati.

ho aggiunto il mio comando map e lo script risposta accettata alla mia .vim / dopo / ftplugin / python.vim.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top