Pengaturan lebar teks khusus nomor baris

9

Saya menggunakan gvim untuk menulis email dan gunakan tw=72untuk memecah baris panjang. Sekarang saya juga mengedit header surat dasar dalam dokumen yang sama, misalnya saya menambahkan penerima ke surat saya. Sekarang dengan tw=72itu juga istirahat setiap kali setelah 72 karakter.

Bagaimana saya dapat mengatur tw=0pada 4 baris pertama (itu adalah bagian header), dan tw=72untuk sisa dokumen?

Pilihan format saya terlihat seperti ini, jika itu relevan:

set fo+=tcqn
mxmehl
sumber
textwidthditerapkan ke seluruh buffer.
romainl
3
Lihat juga: Mencegah Vim dari memecah tautan tanda tengah dalam penurunan harga . Anda bisa menggunakan solusi yang sama untuk email, baik dengan memeriksa jika line('.') < 5, atau dengan memeriksa jika garis dimulai dengan header email (misalnya From: , To: , dll).
Martin Tournoij
@Carpetsmoker Terima kasih banyak, ini adalah kunci solusinya. Saya menambahkan jawaban lengkap saya dengan modifikasi yang diperlukan.
mxmehl

Jawaban:

6

Berkat komentar @ Carpetsmoker pada pertanyaan saya, saya bisa menyelesaikan ini persis seperti yang saya inginkan.

Dengan fungsi berikut di .vimrc (atau dalam kasus saya di file khusus yang hanya dimuat saat mengedit email saya), tw diatur ke 500 jika nomor baris lebih kecil dari 5, jika tidak 72. Dengan au CursorMovedIini dicentang setiap kali kursor bergerak.

" 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

Jika seseorang berencana untuk mengimplementasikan ini, pertimbangkan mengganti wildcard au CursorMovedI *dengan path tetap atau akhiran file.

mxmehl
sumber
4

Alternatif yang lebih kuat untuk jawaban mxmehl.

Jika Anda menggunakan filetype=mailVim akan menyoroti tajuk untuk Anda:

masukkan deskripsi gambar di sini

Kita dapat menggunakan informasi sintaks untuk menentukan apakah suatu baris adalah sebuah header, dan mengatur bandwidth teks yang sesuai.

Nama sintaks dari header yang mailHeaderKey, mailSubject, mailHeaderEmail, dan mailHeader. Saya menemukan ini dengan melihat /usr/share/vim/vim74/syntax/mail.vim.

Alasan saya lebih suka solusi ini adalah tidak tergantung pada nomor baris yang sewenang-wenang, tetapi itu berfungsi sama benar untuk email dengan satu header dan dua puluh header.

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
Martin Tournoij
sumber
2

Anda dapat mencapai ini menggunakan autocmds. Anda bisa memasukkan mereka dalam vimrc Anda, tetapi biasanya lebih baik untuk memasukkan mereka dalam tipe file, seperti yang dijelaskan di sini .

Maka Anda dapat menggunakan yang berikut ini:

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

Jika Anda lebih suka menggunakannya tanpa plugin tipe file, Anda harus mengganti <buffer>dengan pola file.

Idenya adalah untuk mengubah 'textwidth'kapan Anda memasuki mode memasukkan, dan mengembalikannya ketika Anda meninggalkannya.

Jika Anda biasanya menavigasi dalam teks saat dalam mode sisipkan (misalnya: menggunakan tombol panah), Anda dapat meningkatkannya berdasarkan tautan yang disebutkan oleh @Carpetsmoke: Cegah Vim agar tidak memecah tautan tanda tengah dalam penurunan harga.

mMontu
sumber
0

Saya tidak percaya ini mungkin. Namun, ada beberapa solusi.

  1. Anda bisa menulis tajuk lalu :set tw=72 . Karena twtidak berlaku surut ke teks yang sudah ada di buffer Anda,

  2. Anda bisa mengetikkan semuanya dengan :set tw=0dan kemudian setelah Anda selesai, pindah ke baris 4 :set tw=72,, dan gqG. Atau, jika Anda tidak ingin melakukannya secara manual, Anda bisa membuat makro atau memetakannya. Sebagai contoh, keduanya akan berfungsi:

    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" untuk "memformat ulang")

    Anda bahkan dapat mengatur ini agar terjadi secara otomatis ketika Anda menutup vim, dengan asumsi bahwa Anda ingin memformatnya kembali ketika Anda menutup vim, dan bahwa ada tipe file yang Anda gunakan hanya untuk email. Misalnya, jika semua email Anda memiliki .emailekstensi, Anda dapat melakukan:

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

    Tentu saja, Anda harus mengubah *.emailekstensi file apa pun yang sebenarnya Anda gunakan. Jika Anda menggunakan sesuatu seperti .txt, saya tidak akan merekomendasikan ini, karena ini akan mengacaukan setiap .txt file yang Anda miliki.

James
sumber