Vim'i satır başına bir cümleyle çalışacak şekilde nasıl kurarım?


17

Şu anda çok sayıda düz metin yazıyorum (ve paragraflarda en az biçimlendirmeyle LaTeX) ve her cümleyi tutmak için vim kurabilseydim (basitlik için, '.', 'İle sonlandırılmış metin) iyi olurdu. veya '?'; bu, noktalama noktalarının ardından ondalık sayıları kırmamak için boşluk bırakmasıdır) VCS farkları daha kullanışlı olacaktır.

En azından, gqmetni şu şekilde biçimlendirmek istiyorum :

He lay flat on the brown, pine-needled floor of the forest, his chin on his
folded arms, and high overhead the wind blew in the tops of the pine trees.
The mountainside sloped gently where he lay; but below it was steep and he
could see the dark of the oiled road winding through the pass. There was a
stream alongside the road and far down the pass he saw a mill beside the
stream and the falling water of the dam, white in the summer sunlight. 

Kime:

He lay flat on the brown, pine-needled floor of the forest, his chin on his folded arms, and high overhead the wind blew in the tops of the pine trees.
The mountainside sloped gently where he lay; but below it was steep and he could see the dark of the oiled road winding through the pass.
There was a stream alongside the road and far down the pass he saw a mill beside the stream and the falling water of the dam, white in the summer sunlight.

Ama vim bu biçimlendirmeyi yazarken de yapardı (metin genişliği yeniden akışıyla olduğu gibi) iyi olurdu. Mümkün mü?

Şu anki çözümüm bir paragrafa katılmak J, daha sonra :'<,'>s/\. /.\r/gbirkaç ünlem ve soru işareti olduğu için oldukça iyi, ancak gq'yi biraz daha akıllı hale getirebilmem daha iyi olurdu.

Yanıtlar:


23

'formatexpr'seçenek

Bunu 'formatexpr'seçeneği kullanarak başarabilirsiniz . Yardımdan:

Gq operatörü veya otomatik biçimlendirme için bir satır aralığını biçimlendirmek için değerlendirilen ifade (bkz. 'Formatoptions'). Bu seçenek boş olduğunda 'formatprg' kullanılır.

Senin Ayar 'formatexpr'doğru kullanıldığında hem çalışacak gqve metin ekleme yaparken.

Basit bir örnek

İşte basit bir VimScript işlevi ve 'formatexpr'işi yapması gereken karşılık gelen değer. Tüm uç durumlarda test etmedim, ancak basit testlerim için güzel çalıştı.

function! MyFormatExpr(start, end)
    silent execute a:start.','.a:end.'s/[.!?]\zs /\r/g'
endfunction

set formatexpr=MyFormatExpr(v:lnum,v:lnum+v:count-1)

açıklama

İfade, MyFormatExpr()biçimlendirmenin uygulanacağı başlangıç ​​ve bitiş satırlarından geçen işleve yapılan bir çağrıdır . Bu satırlar, otomatik olarak doldurulmuş değişkenler v:lnum(biçimlendirilecek ilk satır) ve v:count(biçimlendirilecek satır sayısı ) kullanılarak hesaplanır .

MyFormatExpr()Fonksiyon oluşturur :substitutearalığında geçirilen ile komutu ve (bir sonu cümlenin noktalama işaretinden sonraki bir boşluk değiştirir ., !ya da ?bir satır ile) ( \r).

Uyarılar

  • MyFormatExpr()Fonksiyon girinti lider korumaz. Bunu düzeltmek için biraz daha sofistike bir mantık gerekecektir.
  • Bunun parçalandığı başka durumlar da olabilir. Bir test sürüşü verin ve gerekirse ayarlayın!

Oh, evet bu tamamen yol, cevabımı görmezden gel .
Sukima

Bu harika! Ne dilek ben gibi, is işlevi bir makro çalıştırmak yapabileceğini "sonraki cümleye ileriye taşımak )ve bir yeni satır eklemek; tekrarı sen aralığının sonuna kadar elde edene kadar." O zaman muhtemelen herhangi bir girinti kuralı uygulardı. Ama Vim-fu'm bunun için çok zayıf. :)
Nathan Long

Bu, örneğin ayrılır e.g. blahve Blah et al. 2018bu biraz can sıkıcıdır. Bunun gibi kalıpları benzer bir şeyle eşleştirebilirsiniz 's/\(e\.g\|\<al\)\@<![.!?]\zs /\r/g'. Bölmek istemediğiniz diğer şeylerden kaçınmak için ilk gruba daha fazla desen ekleyin. Aksi takdirde, bu süper yararlı, teşekkürler. Daha önce hiç karşılaşmamıştım gqve gqiportak yazarın metin editörlerinin karıştırdığı metni biçimlendirmek için çok kullanışlıdır.
naught101

Bu davranışı varsayılan davranışa eklemenin bir yolu var mı? Belirli bir metin genişliğinde sarmak yanı sıra, cümle sonunda bölmek istiyorum ..
naught101

1

Bazı haritalar ve otomatik komutlar ayarlayabilirsiniz:

function! AddSentenceMaps()
  imap .<Space> .<CR>
  imap !<Space> !<CR>
  imap ?<Space> ?<CR>
  exec "nmap gq vipJ:s/\\([.!?]\\)\\s\\+/\\1\\r/g<CR>"
endfunction

autocmd Filetype customtxt call AddSentenceMaps()

Ardından dosya türünü customtxt olarak ayarlayın veya AddSentenceMapsişlevi manuel olarak çağırın .


0

Bu konuyla ilgili düşüncelerimi eklemek istiyorum. Genellikle insanlar bu tür bir özellik ister, çünkü Vim'in varsayılan davranışı olan kod jve kkomutlarla gezinirken sarılmış çizgiler üzerinden atlarlar. Sarılmış çizgiler arasında gezinme için gj- aşağı ve gk- yukarı kullanıyorum. Ayrıca , g ön ekli muadillerde olasılık remap standardı jve kkomutu var, ancak IMHO aşırıya kaçacaktı.


ya o remaping yapmak için bir anahtara sahip jve kiçin gjve gk;-) sen istediğinde
Anthony

0

Yeniden biçimlendirme ile ilgili sorunuza cevap vermez, ancak 'set linebreak' ile birlikte 'set wrap' uzun satırları düzenlemeyi çok daha keyifli hale getirebilir. Sarılmış çizgiler içinde gezinmek için bunu gj ve gk ile birleştirin. Yukarı ve aşağı okları sırasıyla gj ve gk ile eşleştiriyorum, böylece gerçek çizgileri veya görsel çizgileri yukarı ve aşağı hareket ettirme arasında seçim yapabiliyorum. Gibi / G0 / g $ için akıllıca gibi.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.