secara otomatis menulis ulang garis ketika menulis penurunan harga di VIM


10

Sangat sering, saya menulis penurunan harga di VIM, dan akan ada paragraf di penurunan harga itu. Untuk membantu pengeditan saya, saya mengatur Vim saya untuk membungkus garis pada 80 karakter. Ini berfungsi baik jika saya terus mengetik, tetapi masalahnya adalah jika saya perlu melakukan beberapa koreksi, itu menjadi sangat menjengkelkan.

demo (diambil dari logika urutan pertama wikipedia):

The adjective "first-order" distinguishes first-order logic from higher-order logic 
in which there are predicates having predicates or functions as arguments. In first-order 
theories, predicates are often associated with sets. In interpreted higher-order 
theories, predicates may be interpreted as sets of sets.

Sejauh ini bagus. Tetapi ketika saya merevisi artikel itu, saya mungkin memutuskan untuk menambahkan sesuatu di tengah, katakan:

The adjective "first-order" distinguishes first-order logic from higher-order logic 
in which there are predicates having predicates or functions as arguments,
or in which one or both of predicate quantifiers or function quantifiers are permitted.
In first-order theories, predicates are often associated with sets. In interpreted higher-order
theories, predicates may be interpreted as sets of sets.

perhatikan baris 3 adalah yang ingin saya bungkus. Jika saya melakukannya di VIM, saya harus secara manual bergabung dengan garis dan menulis ulang seluruh paragraf.

Adakah yang tahu cara membuat VIM melakukannya secara otomatis?

Jawaban:


6

Lebih sederhana: abendera untuk 'formatoptions'memungkinkan pemformatan paragraf otomatis setiap kali teks dimasukkan atau dihapus. Lihat :help fo-tableuntuk detail pada 'formatoptions'bendera dan :help autoformat.

:set formatoptions+=a

gqdan gwakan memformat garis-garis yang digerakkan oleh gerakan berikut.

Formatting is done with one of three methods:
                1. If 'formatexpr' is not empty the expression is
                   evaluated.  This can differ for each buffer.
                2. If 'formatprg' is not empty an external program
                   is used.
                3. Otherwise formatting is done internally.

                In the third case the 'textwidth' option controls the
                length of each formatted line

Perbedaan antara keduanya, adalah bahwa gqakan meninggalkan kursor pada baris pertama kosong yang tidak diformat. gwakan mengembalikan kursor ke tempat asalnya.

Anda dapat dengan mudah menulis ulang paragraf dengan kursor Anda saat ini gwap, atau seluruh dokumen dengan gggwG, meskipun itu akan memindahkan kursor Anda berkat terkemuka gg.

Dengan perintah otomatis, pemformatan dapat terjadi secara otomatis. Berikut adalah contoh yang memformat paragraf saat ini ketika meninggalkan mode penyisipan:

augroup myformatting
    autocmd!
    autocmd InsertLeave * normal gwap<CR>
augroup END

Ada pemicu perintah otomatis lain yang mungkin Anda temukan lebih baik untuk Anda. Anda dapat menjelajahi opsi di bawah :help autocmd-events. Yang paling relevan mungkin berada di bawah subjudul "berbagai".


satu kata: brilian!
Jason Hu

1

Saya akan melihat :help 'textwidth'. Secara otomatis akan memecah garis saat Anda mengetik. Namun ini tidak berfungsi jika Anda mengedit tengah baris.

Saya pribadi lebih suka textwidthberhenti jadi saya membuat fungsi yang akan otomatis bergabung dan membagi paragraf. (Pada dasarnya format otomatis menjadi 80 karakter) Sepertinya ini:

function! ParagraphToEightyChars()
   while (len(getline(".")) > 80)
      normal! 0
      " Find the first white-space character before the 81st character.
      call search('\(\%81v.*\)\@<!\s\(.*\s.\{-}\%81v\)\@!', 'c', line('.'))
      " Replace it with a new line.
      exe "normal! r\<CR>"
      " If the next line has words, join it to avoid weird paragraph breaks.
      if (getline(line('.')+1) =~ '\w')
         normal! J
      endif
   endwhile
   " Trim any accidental trailing whitespace
   :s/\s\+$//e
endfunction

Saya kemudian memiliki pemetaan untuk menyebutnya kapan pun saya membutuhkannya:

nnoremap <silent><A-J> :call ParagraphToEightyChars()<CR>

Fungsi ini berfungsi dengan baik formatoptions+=jruntuk memformat komentar dalam kode juga! Cukup letakkan kursor Anda di baris pertama yang lebih panjang dari 80 karakter dan panggil fungsi tersebut.

(Catatan: Saya belum membuat fungsi ini umum untuk melakukan selain dari 80, tapi saya pikir Anda hanya perlu mengubah 80 dan 81 jika Anda ingin membuatnya menjadi sesuatu yang lain)

Lihat :help 'textwidth'dan :help 'formatoptions'untuk info lebih lanjut.


Terima kasih atas berbagi Anda. Ketika saya memeriksa pengaturan Anda, itu tidak secara otomatis memformat saat saya mengetik, benar? Jika demikian, maka itu masih merupakan solusi suboptimal, bukan?
Jason Hu

textwidthakan secara otomatis memformat saat Anda mengetik. Fungsi saya tidak akan. Saya lebih suka mengontrol ketika vim membungkus sesuatu, jadi itu berfungsi untuk saya. Tetapi jika Anda secara khusus mencari formatter as-you-type, ya; itu tidak sesuai dengan alur kerja Anda.
Tumbler41

1

Demi kelengkapan, saya ingin menyebutkan opsi berbasis plugin.

Jika Anda menggunakan sesuatu seperti ALE yang mendukung menjalankan buffer Anda melalui beautifier di save, Anda bisa membiarkan Prettier menangani penulisan ulang kode Anda.

Saya mencapai itu dengan memasukkan ini ke dalam ~/.vim/ftplugin/markdown.vim:

let b:ale_fixers = ['prettier', 'remove_trailing_lines', 'trim_whitespace']
let b:ale_javascript_prettier_options = '--prose-wrap always'

... dan memasukkan ini ke dalam ~/.vimrc:

let g:ale_fix_on_save = 1
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.