28

強力なPEP 8から:

[お願い]すべての行を最大 79 文字に制限してください。テキストの長いブロック (docstring またはコメント) を流す場合は、長さを 72 文字に制限することをお勧めします。

Vim で Python コードを編集するとき、mytextwidthを 79 に設定すると、文字制限に達すると、Vim が Python コードの長い行を自動的にラップします。しかし、コメントとドキュメントストリングでは、テキストを 72 文字で折り返す必要があります。

textwidthコメントまたはドキュメント文字列にいるときにVim を自動的に 72 に設定し、終了したら元に戻す方法はありますか?

4

2 に答える 2

16

そのため、私は以前に Vim スクリプトを作成したことがありませんが、Cで同様のことを行うことに関するこの質問と、現在コメントにいるかどうかを確認するためのヒントに基づいて、解決策をまとめました。

デフォルトでは、これは PEP8 が推奨する通常の行に 79 文字、コメントに 72 文字の幅を使用しますが、それぞれlettingg:python_normal_text_widthまたはg: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
于 2010-10-26T22:04:01.217 に答える
6

受け入れられた答えは素晴らしいです!ただし、コメントの書式設定/編集に関する私の習慣はサポートされていません。編集を行ってから gqj コマンドを使用します。これは、基本的に「現在の行を次の行と組み合わせて再フォーマットする」ものです。次に、「。」を押します。行ごとにそれを繰り返します(コマンド自体がカーソルを次の行に進めます)。私はvimスクリプト言語をよく知らないので、誰かがこれに対するサポートを受け入れられた回答に追加できるかもしれません. それまでの間、私が行ったことは、ファンクション キー (F6) をマップしてテキスト幅を 72 に変更し、行をフォーマットしてから、テキスト幅を 79 に戻すことです。

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

さて、docstring にいるときは、編集 (ESC) を行い、すべての行が適切にフォーマットされるまで F6 を繰り返し押します。

map コマンドと受け入れられた応答スクリプトを .vim/after/ftplugin/python.vim に追加しました。

于 2015-02-12T17:56:51.577 に答える