Frage

Von den mächtigen PEP 8 :

  

[P] Leasing Grenze alle Linien auf maximal 79 Zeichen. Für lange Textblöcke (Docstrings oder Kommentare) fließt, die Begrenzung der Länge auf 72 Zeichen empfohlen.

Bei der Bearbeitung von Python-Code in Vim, stelle ich meinen textwidth bis 79, und Vim wickelt automatisch lange Zeilen Python-Code für mich, wenn ich die Zeichenbegrenzung getroffen. Aber in den Kommentaren und Docstrings, ich brauche stattdessen Text auf 72 Zeichen wickeln.

Gibt es eine Möglichkeit Vim automatisch Satz textwidth bis 72 zu machen, wenn ich in einem Kommentar oder docstring bin, und legen Sie es zurück, wenn ich fertig bin?

War es hilfreich?

Lösung

Also, ich habe noch nie irgendwelche Vim Scripting getan, aber basierend auf diese Frage über etwas ähnliches in C tun und dieser Tipp zu überprüfen, ob Sie sich gerade in einem sind Kommentar habe ich gehackt zusammen eine Lösung.

Standardmäßig verwenden diese die PEP8-vorgeschlagenen Breite von 79 Zeichen für normale Zeilen und 72 Zeichen für Kommentare, aber man kann sich außer Kraft setzen, indem letting g:python_normal_text_width oder g:python_comment_text_width Variablen ist. (Ich persönlich normale Linien bei 78 Zeichen wickeln.)

Drop dieses Baby in Ihrem .vimrc und Sie sollten gut zu gehen. Ich kann dieses Paket auf, als ein Plugin später.

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

Andere Tipps

Die akzeptierte Antwort ist großartig! Es ist jedoch nicht unterstützt die Gewohnheit, die ich für die Formatierung / Bearbeitung Kommentare habe: ich meine Änderungen vornehmen und dann den gqj Befehl verwenden, die im Wesentlichen „Neuformatierung der aktuellen Zeile mit dem nächsten kombiniert“. Dann traf ich ‚‘ dass für jede Zeile (der Befehl selbst rückt den Cursor auf die nächste Zeile) zu wiederholen. Ich weiß sehr gut nicht die vim Skriptsprache, so jemand in der Lage sein kann, die Unterstützung für diese auf die akzeptierte Antwort hinzuzufügen. In der Zwischenzeit habe, was ich getan ist eine Funktionstaste (F6) ordnen Sie die Textbreite bis 72, formatieren Sie die Linie zu ändern und dann die Textbreite zurück auf 79 ändern.

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

Nun, wenn ich in einem docstring bin, ich habe gerade die Bearbeitung machen, (ESC) und drücken Sie dann F6 wiederholt, bis alle Zeilen richtig formatiert sind.

habe ich meine Karte Befehl und die akzeptierte Antwort Skript auf meine .vim / nach / ftplugin / python.vim.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top