Bagaimana cara menulis secara vertikal?

22

Katakanlah saya ingin menghasilkan teks berikut dalam dokumen saya:

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

Apakah ada cara mudah untuk menulis "Some Msg" secara vertikal seperti di atas tanpa harus secara manual memasukkan setiap karakter di setiap baris?

Allan Hasegawa
sumber
5
Anda dapat menulis teks seperti biasa, dan kemudian :s/./% \0\r/menambahkan %dan baris baru ... Bukan solusi yang bagus , ...
Martin Tournoij
Solusi yang bagus, ini agak berhasil. Akan menggunakannya untuk saat ini, terima kasih.
Allan Hasegawa

Jawaban:

16

Solusi yang benar-benar baik mungkin akan membutuhkan lebih banyak pekerjaan, tetapi "tidak buruk" tidak terlalu sulit untuk dicapai.

Ide

Yang kita butuhkan adalah memindahkan satu baris ke bawah setelah setiap karakter, jadi mari kita lakukan itu hanya melalui InsertCharPreperintah otomatis!

Kode

Masukkan .vimrcatau lebih baik lagi ke beberapa file di bawah plugin/direktori.

" 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()

Pemakaian

Masukkan :Vertperintah untuk mulai menulis secara vertikal. Meninggalkan mode penyisipan secara otomatis menonaktifkan "mode" ini. Tentu saja, Anda dapat memetakannya ke jalan pintas jika Anda perlu sering menggunakan perintah ini.

Masalah Dikenal

  1. Penulisan vertikal tidak akan dinonaktifkan jika Anda meninggalkan mode penyisipan melalui Ctrl-C(ini adalah hasil dari Ctrl-Cpenerapan dalam cara yang agak aneh sehubungan dengan InsertLeaveacara, yang tidak dipecat, sehingga menggunakan kunci mengharuskan seseorang untuk berhati-hati).
xaizek
sumber
1
Sanggahan terhadap Masalah yang Diketahui # 1: Anda seharusnya tidak meninggalkan mode Sisipkan <C-C>.
tommcdo
@ talkcdo, saya tidak, tetapi jika ada, seseorang menggunakannya. Ini sebenarnya berguna untuk menghindari ekspansi singkatan, saya bertanya-tanya mengapa InsertLeavetidak dipicu untuk kunci ini.
xaizek
1
Saya kira saya bermaksud mempromosikan tren penolakan <C-C>sebagai cara yang baik untuk keluar dari mode Sisipkan. Cara Anda menyebutkannya bisa berarti kadang-kadang metode yang bagus. Ini seperti mengatakan "Peringatan: dokumen Anda tidak akan disimpan jika Anda menutup Microsoft Word dengan mencabut komputer Anda."
tommcdo
@tommcdo Tidak berpikir itu mungkin terdengar seperti ini. Menambahkan catatan tentang <C-C>menjadi alasan masalah ini. Saya tidak mengetahui metode lain untuk meninggalkan mode penyisipan menekan ekspansi singkatan seperti <C-C>halnya, jika tidak ada, ini berguna setidaknya sebagai bagian dari pemetaan seperti inoremap <silent> <c-c> <c-c>:doautocmd InsertLeave<cr>.
xaizek
Saya belum mempertimbangkan singkatan, itu poin yang bagus. Saya bahkan menemukan beberapa tempat dalam bantuan yang menggambarkan <C-C>sebagai meninggalkan mode Sisipkan tanpa memperluas singkatan, dan tidak disebutkan bagaimana itu tidak memicu InsertLeaveperistiwa. Saya sekarang ingin tahu apakah ada cara bawaan untuk melakukan itu, tetapi untuk sekarang pemetaan Anda adalah ide yang bagus.
tommcdo
4

Anda dapat mengetik seperti biasa dan kemudian mengubah teks horizontal saat ini menjadi vertikal dengan menggunakan substitusi di Vim sebagai berikut (berlaku untuk baris saat ini):

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

Atau metode yang lebih mudah diingat adalah dengan mengeksekusi salah satu dari perintah berikut (untuk semua baris):

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

Untuk menerapkan hanya untuk baris saat ini atau lebih banyak baris, awali dengan V, perluas area untuk lebih banyak baris jika perlu, dan jalankan di atas (tetapi tanpa %).

Untuk PowerShell di Windows, periksa penggantian lipatan .

Untuk menetapkan pemetaan kunci sederhana (mis. F2), Coba yang berikut ini:

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

Kemudian ketik sesuatu dan tekan F2untuk membuat teks vertikal, sesederhana itu.


Alternatif lain adalah mengatur pembungkus kata otomatis, mis

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

Itu akan secara otomatis membungkus teks sedekat 1 karakter sebagaimana ruang putih memungkinkan. Kerugiannya adalah bahwa setiap huruf perlu diikuti oleh spasi (jadi hampir sama dengan Anda akan menekanEnter

kenorb
sumber
1
Daripada :s/\(.\)/\1\r/g, Anda bisa menggunakan :s/./\0\r/gyang identik secara fungsional.
Wildcard
1

Saya menemukan bahwa makro adalah cara yang luar biasa untuk melakukan hal-hal yang tidak biasa jika Anda tertarik untuk melakukan itu tidak lebih dari sekali di bulan biru. Katakanlah Anda memiliki tabel berikut:

%
%            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

Dan katakanlah Anda ingin mengganti Some Msgdengan Other Message. Pertama, mari perpanjang tabel untuk karakter tambahan (baris sebelum yang terakhir 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

Makro yang akan saya buat akan mengurus konversi teks dari horizontal ke vertikal sambil mengganti teks lama. Mulailah dengan mengetik teks di lokasi pertama (kursor ada di akhir 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

Rekam makro berikut:

  • qq: mulai merekam makro bernama q
  • ^: pergi ke awal baris
  • 3l: pindah ke kolom tempat teks akan ditempatkan
  • x: hapus karakter lama
  • l: bergerak ke kanan, meninggalkan satu karakter dari pesan menggantikan karakter lama:
  • v: masuk ke mode visual
  • f|: lompat ke |
  • 2h: mundur dua karakter
  • d: seleksi cut
  • j: bergerak ke bawah
  • P: tempelkan sebelum kursor
  • q: mengakhiri rekaman makro

Pada titik ini Anda memiliki:

%
%            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

Ulangi makro cukup banyak kali (yaitu, jumlah karakter, tetapi Anda tidak perlu mengetahuinya terlebih dahulu. Cukup meremehkan, dan lanjutkan setelah Anda melihat seberapa dekat perkiraan Anda). Jadi mari kita pergi bersama 10@q. Anda mendapatkan:

%
%            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

Oke, satu lagi ( @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

Kursor Anda sekarang adalah yang terakhir e. Makro tidak berfungsi dengan baik dengan huruf terakhir (Anda dapat mencoba @qdan kemudian u(membatalkan) untuk hasil yang tidak memuaskan). Cukup sesuaikan sendiri ( Xuntuk backspace).

Shahbaz
sumber
Sangat bagus. Macro adalah cara untuk pergi dalam vim. Upaya cepat saya pada dasarnya sama dengan usaha Anda; qq03lxldt|i ^[jPxq@q
Wildcard
@ Kartu Wild, saya dapat melakukan upvote?
Shahbaz
1
Ha! Menyelipkan pikiranku; Saya pikir saya punya. :)
Wildcard