Dikey olarak nasıl yazılır?


22

Aşağıdaki metni belgemde üretmek istediğimi söyleyelim:

%
%            Not Important
%    O ------------------------->
%    |
%  S |
%  o |
%  m |
%  e |
%    |
%  M |
%  s |
%  g |
%    |
%    V

Her bir karakteri her satıra manuel olarak eklemek zorunda kalmadan "Bazı Mesajları" yukarıdaki gibi dikey olarak yazmanın kolay bir yolu var mı?


5
Metninizi normal olarak yazabilir ve sonra ve yeni satırları :s/./% \0\r/eklemek için yapabilirsiniz %... Yine de harika bir çözüm değil ...
Martin Tournoij

Güzel bir çözüm, işe yarıyor. Şimdilik onu kullanacak, teşekkür ederim.
Allan Hasegawa,

Yanıtlar:


16

Gerçekten iyi bir çözüm muhtemelen biraz daha fazla çalışma gerektirecektir, ancak “fena değil” başarması çok zor değil.

Fikir

Tek ihtiyacımız olan her karakterden sonra bir satır aşağı hareket etmektir, öyleyse bunu sadece InsertCharPreauto-command ile yapalım !

kod

İçine koy .vimrcaltında bazı dosyaya daha iyisi veya plugin/dizine.

" enters insert mode to write vertically
function! VertStart()
    augroup Vert
        autocmd!
        " handles each entered character and moves cursor down
        autocmd InsertCharPre * call feedkeys("\<left>\<down>", 'n')
        autocmd InsertLeave * call VertEnd()
    augroup END

    inoremap <BS> <Up><Del>
    startinsert
endfunction

" cleans up on leaving insert mode
function! VertEnd()
    iunmap <BS>
    augroup Vert
        autocmd!
    augroup END
endfunction

" command to start writing vertically
command! Vert call VertStart()

kullanım

:VertDikey olarak yazmaya başlamak için komutu girin . Ekleme modundan çıkmak bu "modu" otomatik olarak devre dışı bırakır. Elbette, bu komutu sık sık kullanmanız gerekiyorsa, onu bir kısayolla eşleyebilirsiniz.

Bilinen Sorunlar

  1. Ekleme modunu aracılığıyla bırakırsanız dikey yazı devre dışı bırakılmaz Ctrl-C(bu, olayın Ctrl-Cbaşlatılmadığı InsertLeaveolayla ilgili olarak biraz garip bir şekilde yapılmasının bir sonucudur ; bu nedenle, anahtarın kullanılması dikkatli olmalıdır).

1
Bilinen Sayı # 1'e bir cevap: Ekleme modunu ile bırakmamalısınız <C-C>.
49'da tommcdo

@tommcdo, Yapmam, ama eğer oradaysa, birisi kullanır. Kısaltma genişlemesinden kaçınmak gerçekten faydalıdır, neden InsertLeavebu anahtar için tetiklenmediğini merak ediyorum .
xaizek

1
Sanırım, <C-C>Ekleme modundan çıkmanın iyi bir yolu olarak reddetme eğilimini teşvik etmek istiyorum . Bahsettiğiniz yöntem, bunun bazen iyi bir yöntem olduğu anlamına gelebilir. Bir tür "Caveat: Microsoft Word'ü bilgisayarınızı çıkararak kapatırsanız belgeniz kaydedilmeyecek." Demeye benziyor.
Mart’ta

@tommcdo Kulağa böyle geleceğini düşünmedim. <C-C>Sorunun nedeni olma konusunda bir not eklendi . Kısaltma genişlemesini baskılayarak ekleme modundan çıkmanın başka bir yöntemden haberi <C-C>yok, eğer değilse, en azından bir haritalamanın bir parçası olarak kullanışlıdır inoremap <silent> <c-c> <c-c>:doautocmd InsertLeave<cr>.
xaizek

Kısaltmaları dikkate almamıştım, bu iyi bir nokta. Hatta <C-C>kısaltmaları genişletmeden Insert modundan çıkmayı tanımlayan bazı yerler bile buldum ve InsertLeaveolayları nasıl tetiklemediğine dair hiçbir söz yok . Bunu yapmak için yerleşik bir yöntem olup olmadığını şimdi merak ediyorum, ancak şimdilik haritanız harika bir fikir.
tommcdo

4

Her zamanki gibi yazabilir ve ardından Vim'deki yerine koymayı kullanarak şu anki yatay metni dikey duruma dönüştürebilirsiniz (geçerli satır için geçerlidir):

:s/\(.\)/\1\r/g

Yöntemi hatırlamak ya da çok daha kolay, aşağıdaki komutlardan birini uygulamaktır (tüm satırlar için):

:%!fold -w1
:%!grep -o .

Yalnızca geçerli satır veya daha fazla satır için uygulamak için, öncesinde V, gerekirse alanı daha fazla satır için genişletin ve yukarıda (ancak olmadan %) uygulayın.

Windows'ta PowerShell için, katlama değişimini kontrol edin .

Basit anahtar eşlemeyi (örn. F2) Tanımlamak için aşağıdakileri deneyin:

:nnoremap <F2> V:!fold -w1<CR>

Sonra bir şey yazın ve F2metni dikey, basit hale getirmek için basın .


Diğer bir alternatif, otomatik sözcük kaydırma, örneğin

:set tw=1 " textwidth
:set formatoptions+=t

Bu, metni otomatik olarak beyaz boşluğun izin verdiği kadar 1 karaktere kadar saracaktır. Dezavantajı ise her harfin boşlukla takip edilmesi gerektiğidir (bu yüzden neredeyse bastığınız gibiEnter


1
Daha ziyade :s/\(.\)/\1\r/g, sadece :s/./\0\r/gişlevsel olarak aynı olan kullanabilirsiniz .
Wildcard,

1

Makroların, mavi bir ayda bir kereden fazla yapmakla ilgilenmediğiniz takdirde sıra dışı şeyler yapmanın harika bir yolu olduğunu biliyorum. Diyelim ki aşağıdaki tabloya sahipsin:

%
%            Not Important
%    O ------------------------->
%    | Stuff in side the table
%  S |
%  o | So you can't just write your
%  m |
%  e | text and transform it into
%    |
%  M | the shape that you want
%  s |
%  g | Macros help here
%    |
%    V

Ve en Değiştirmek istediğiniz diyelim Some Msgile Other Message. İlk önce, fazladan karakter için tabloyu genişletelim (sondan önceki satır yy5p:

%
%            Not Important
%    O ------------------------->
%    | Stuff in side the table
%  S |
%  o | So you can't just write your
%  m |
%  e | text and transform it into
%    |
%  M | the shape that you want
%  s |
%  g | Macros help here
%    |
%    |
%    |
%    |
%    |
%    |
%    V

Buraya geleceğim makro, eski metni değiştirirken metni yataydan dikey hale getirmeye özen gösterecek. Metni ilk konuma yazarak başlayın (imleç sonundadır Other Message):

%
%            Not Important
%    O ------------------------->
%    | Stuff in side the table
%  SOther Message |
%  o | So you can't just write your
%  m |
%  e | text and transform it into
%    |
%  M | the shape that you want
%  s |
%  g | Macros help here
%    |
%    |
%    |
%    |
%    |
%    |
%    V

Aşağıdaki makroyu kaydedin:

  • qq: adlı makroyu kaydetmeye başla q
  • ^: satırın başına git
  • 3l: metnin yerleştirileceği sütuna gitme
  • x: eski karakteri sil
  • l: eski karakter yerine mesajdan bir karakter bırakarak sağa hareket et:
  • v: görsel moda geç
  • f|: atlamak |
  • 2h: iki karakter geriye gitme
  • d: seçimi kes
  • j: aşağı inmek
  • P: imleçten önce yapıştır
  • q: Makro kaydını sonlandır

Bu noktada sahip olduğunuz:

%
%            Not Important
%    O ------------------------->
%    | Stuff in side the table
%  O |
%  other Message | So you can't just write your
%  m |
%  e | text and transform it into
%    |
%  M | the shape that you want
%  s |
%  g | Macros help here
%    |
%    |
%    |
%    |
%    |
%    |
%    V

Makroyu yeterli sayıda tekrarlayın (yani, karakter sayısı, ancak önceden bilmeniz gerekmez. Sadece hafife alın ve tahmininizin ne kadar yakın olduğunu görünce devam edin). Öyleyse gidelim 10@q. Sen al:

%
%            Not Important
%    O ------------------------->
%    | Stuff in side the table
%  O |
%  t | So you can't just write your
%  h |
%  e | text and transform it into
%  r |
%    | the shape that you want
%  M |
%  e | Macros help here
%  s |
%  s |
%  a |
%   ge |
%    |
%    |
%    V

Tamam, bir tane daha ( @q):

%
%            Not Important
%    O ------------------------->
%    | Stuff in side the table
%  O |
%  t | So you can't just write your
%  h |
%  e | text and transform it into
%  r |
%    | the shape that you want
%  M |
%  e | Macros help here
%  s |
%  s |
%  a |
%  g |
%   e |
%    |
%    V

İmleciniz artık en sonda e. Makro son harfle iyi çalışmaz (tatmin edici sonuçlar için deneyebilir @qve sonra u(geri alabilir)). Basitçe kendiniz ayarlayın ( Xgeri almak için).


Çok hoş. Makrolar vim girmenin yoludur. Çabuk çabam, aslında sizinkiyle aynıydı; qq03lxldt|i ^[jPxq@q
Wildcard,

@Wildcard, haz kadar oy kullanabilir miyim?
Shahbaz

1
Ha! Aklımdan çıkmış; Bende olduğunu düşünüyordum. :)
Wildcard
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.