行番号固有のテキスト幅設定


9

私はメールの作成にgvimを使用tw=72し、長い行を改行するために使用しています。次に、同じドキュメントの基本的なメールヘッダーも編集します。たとえば、メールに受信者を追加します。今ではtw=72、72文字の後も毎回壊れます。

tw=0最初の4行(ヘッダー部分)とtw=72残りのドキュメントをどのように設定できますか?

関連する場合、私のformatoptionsは次のようになります。

set fo+=tcqn

textwidthバッファ全体に適用されます。
romainl 2016

3
マークダウンのタグの途中でVimがリンクを分割しないようにするもご覧ください。かどうline('.') < 5かをチェックするか、行が電子メールヘッダー(たとえばFrom: To: )で始まるかどうかをチェックすることにより、電子メールに同様のソリューションを使用できます。
Martin Tournoij

@Carpetsmokerどうもありがとう、これがソリューションの鍵でした。必要な修正を加えた完全な回答を追加しました。
mxmehl

回答:


6

私の質問に対する@Carpetsmokerのコメントのおかげで、私が望んでいたとおりにこれを解決することができました。

.vimrcの次の関数(または私の場合は、電子メールの編集時にのみ読み込まれる特別なファイル)では、行番号が5より小さい場合、twは500に設定されます。それ以外の場合は、72です。au CursorMovedIこれは、カーソルが移動します。

" Set tw to 500 if in the first 4 lines, else 500
au CursorMovedI * call ModifyTextWidth()   " execute when cursor has moved, use for all files
function! ModifyTextWidth()
    if line('.') < 5               " if line number smaller than 5
        setlocal textwidth=500     " use high tw setting
    else
        setlocal textwidth=72      " Otherwise use normal textwidth
    endif
endfunction

誰かがこれを実装する予定の場合は、ワイルドカードをau CursorMovedI *固定パスまたはファイルサフィックスに置き換えることを検討してください。


4

mxmehlの答えのより堅牢な代替手段。

filetype=mailVim を使用すると、ヘッダーが強調表示されます。

ここに画像の説明を入力してください

構文情報を使用して、行がヘッダーかどうかを判別し、それに応じてテキスト幅を設定できます。

ヘッダの構文名はmailHeaderKeymailSubjectmailHeaderEmail、とmailHeader。私はを見てこれを見つけました/usr/share/vim/vim74/syntax/mail.vim

私がこのソリューションを好む理由は、任意の行番号に依存しないことですが、1つのヘッダーと20のヘッダーを持つ電子メールに対しても同じように正しく機能します。

augroup filetypes
    autocmd!

    autocmd FileType mail call s:mail()
augroup end

" Set up ft=mail
fun! s:mail()
    augroup ft_mail
        autocmd!
        autocmd CursorMoved,CursorMovedI *
            \  if index(["mailHeaderKey", "mailSubject", "mailHeaderEmail", "mailHeader"], synIDattr(synID(line('.'), col('.'), 1), 'name')) >= 0
            \|     setlocal textwidth=500
            \| else
            \|     setlocal textwidth=72
            \| endif
    augroup end
endfun

2

これはautocmdsを使用して実現できます。それらをvimrcに含めることもできますが、ここで説明するように、通常はファイルタイプに含めることをお勧めします

次に、以下を使用できます。

augroup headerTw
   au!
   autocmd InsertEnter <buffer>
            \ if line('.') < 5 |
            \    setl tw=0 |
            \ endif
   autocmd InsertLeave <buffer>
            \ if line('.') < 5 |
            \    setl tw=72 |
            \ endif
augroup END

ファイルタイププラグインなしで使用する場合は<buffer>、ファイルパターンに置き換える必要があります。

'textwidth'挿入モードに入ったときにを変更し、離れたときに元に戻すという考え方です。

挿入モードのときに通常はテキスト内を移動する場合(例:矢印キーを使用)、@ Carpetsmokeで言及されているリンクに基づいてテキストを強化できます


0

これが可能だとは思いません。ただし、いくつかの回避策があります。

  1. あなたのヘッダーを書いて、可能性があり、その後 :set tw=72twはすでにバッファにあるテキストにさかのぼって適用されないので、

  2. あなたが全体のことを入力することができ:set tw=0、その後、あなたが終了したら、4行目に移動し、:set tw=72、とgqG。または、手動で実行したくない場合は、マクロ化するか、マッピングすることができます。たとえば、次の両方が機能します。

    let @r=":set tw=72<cr>4GgqG:set tw=0<cr>"
    nnoremap <silent> <leader>r :set tw=72<cr>4GgqG:set tw=0<cr>
    

    (「再フォーマット」の「r」)

    これは、vimを閉じるときに自動的に再フォーマットするように設定し、電子メールだけに使用するファイルタイプがあると想定して、vimを閉じるときに自動的に実行されるように設定することもできます。たとえば、すべてのメールに.email拡張子が付いている場合、次のようにできます。

    autocommand VimLeavePre *.email set tw=72 | exe "normal! 4GgqG" | w
    

    もちろん、*.email実際に使用するファイル拡張子に変更する必要があります。あなたのようなものを使用している場合は.txt、私は考えていない、それはと混乱するので、これをお勧めしますすべての .txtあなたが持っているファイル。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.