Bisakah Vim menulis baris tambahan? yaitu pada setiap baris A menjadi B, dan 1 menjadi 2

8

Saya ingin menulis ini:

A = mapping[0]
B = mapping[1]
C = mapping[2]
D = mapping[3]
E = mapping[4]
F = mapping[5]
G = mapping[6]
H = mapping[7]
I = mapping[8]
J = mapping[9]
K = mapping[10]
L = mapping[11]
M = mapping[12]
N = mapping[13]
O = mapping[14]
P = mapping[15]
Q = mapping[16]
R = mapping[17]
S = mapping[18]
T = mapping[19]
U = mapping[20]
V = mapping[21]
W = mapping[22]
X = mapping[23]
Y = mapping[24]
Z = mapping[25]

Saya akhirnya menggunakan LibreCalc, menempatkan bagian-bagian yang berbeda di sel yang berbeda, menambahkan huruf dan angka, menggabungkan hasil dan menempelkan lot kembali ke Vim.

Saya menghargai bahwa apa yang ingin saya tulis adalah kode yang buruk. Saya sedang mempelajari Python saat ini dan telah berusaha untuk menghindari mencari informasi sendiri yang saya tahu akan dibahas nanti dalam kursus yang saya ikuti ( http://interactivepython.org/ ).

Cara tercepat yang saya tahu untuk melakukan ini di vim adalah mengetikkan sesuatu seperti

A = mapping[0] <ESC> hh <CTRL>+<V> BBh y $ o B <ESC> y 1] <CR>

Saya tahu vim sangat kuat (saya telah menggunakannya selama beberapa minggu, saya benar-benar menikmatinya).

Apakah mungkin untuk menulis apa yang saya inginkan dengan perintah vim?

Duncan Betts
sumber

Jawaban:

11

Meskipun dapat dilakukan dengan skrip, jika Anda memiliki versi Vim yang sangat baru (misalnya yang ada di Arch Linux), Anda dapat menggunakan g Ctrl-auntuk menambah blok visual. Dalam kasus Anda:

  1. Tulis baris aslinya: A = mapping[0] Esc
  2. Yank line dan tulis 25 salinannya di bawah ini: yy25p
  3. Pilih secara visual kolom yang berisi 0char (pemilihan blok, menggunakan Ctrl-v), tidak termasuk 0dari baris 1 (sehingga Anda berakhir dengan kolom yang berisi 25 nol terakhir), lalu tambahkan dengan g Ctrl-a.
  4. Terapkan metode yang sama untuk kolom yang berisi A.

( Catatan : Sebagai komentar menunjukkan, salah satu kebutuhan untuk menambahkan alphake nrformatspilihan, agar dapat surat kenaikan, misalnya: set nrformats+=alpha.Saya vimrc memiliki: set nrformats=hex,alpha, sehingga menonaktifkan oktal dan kenaikan biner, yang saya tidak menggunakan)

VanLaser
sumber
kamu tidak bekerja untukku. Saya dapat melihat pada lembar contekan yang saya cetak dari www.vimcheatsheet.com bahwa ini adalah perintah yang sangat standar. vim --version mengembalikan ini: pastebin.com/DcFxZh1S . Saya harus menyelidiki mengapa itu tidak bekerja untuk saya ... (Saya sudah mencoba dalam perintah visual dan memasukkan mode). Juga ketika saya tempel, semuanya muncul di baris yang sama. Namun saya sudah mencoba g Ctrl-a dan melakukan persis apa yang saya inginkan, terima kasih :)
Duncan Betts
1
:verbose map yharus menunjukkan kepada Anda pemetaan apa yang dimulai dengan yang yAnda miliki, dan di mana mereka ditetapkan. Tetapi Anda harus menggunakan yydalam mode normal.
VanLaser
1
Diperbaiki: D asciinema.org/a/2zqavz00sbzvumxwg742h3ozi
Duncan Betts
1
Apa versi vimakan kenaikan Auntuk Bdengan Ctrl-atindakan? Punyaku pasti tidak, dan aku aktif 7.4 1-1202.
Cory Klein
4
@CoryKlein Cobalah mengetik :set nrformats+=alpha. Ini akan menambah nilai alphake opsi 'nrformats'dan harus memungkinkan Ctrl-auntuk "menambah" karakter alfabet. Jika Anda menyukai perilaku ini, Anda bisa menambahkannya ke vimrc Anda. Kalau tidak, Anda bisa menambahkannya ke opsi dengan operator +=dan menghapusnya kemudian dengan operator -=( :set nrformats-=alpha).
saginaw
6

Saya lebih suka solusi peningkatan visual yang @VanLaser gunakan (Lihat :h v_CTRL-A). Namun saya akan menunjukkan ini bisa dilakukan melalui makro juga.

Dimulai dari:

A = mapping[0]

Rekam penekanan tombol berikut ke dalam makro pilihan Anda (misalnya q):

yyp:set nrformats+=alpha<cr><c-a>:set nrformats-=alpha<c-a>

Ini akan menduplikasi baris dan kemudian menambah karakter pertama (misalnya A) dan kemudian menambah porsi nomor. Jalankan makro ini 24 kali dan Anda selesai, mis 24@q.

  • qq - Mulai merekam ke register q
  • yyp - Gandakan garis
  • :set nrformats+=alpha<cr>- 'nrformatstidak memiliki alphasecara default
  • <c-a>- Dengan alphakita sekarang dapat menambahkan huruf
  • :set nrformats-=alpha<cr>- hapus alphadari'nrformats'
  • <c-a> - Menambah nomor berikutnya
  • q - berhenti merekam
  • 24@q- memutar ulang makro dalam register q24 kali

Untuk bantuan lebih lanjut lihat:

:h q
:h @
:h yy
:h p
:h 'nrformats'
:h :set
:h CTRL-A
:h v_CTRL-A
Peter Rincker
sumber
Bagus :) 25?
VanLaser
1
@VanLaser: 1 (garis awal) + 1 (merekam makro) + 24 = 26.
Peter Rincker
4

Jawaban bagus sudah disediakan, saya tidak akan berpikir untuk melakukannya dengan baik. Saya akan mengetik semua huruf pada satu baris dan kemudian memperkenalkan teks dan baris dengan substitusi ekspresi (menggunakan nomor baris untuk nomor tambahan), sesuatu seperti

iABCDEFGHIJKLMNOPQRSTUVXYZ<Esc>:s/./\=submatch(0)." = mapping[".line('.')."]\n"/g
jjaderberg
sumber
sangat keren ! (+1)
JJoao
2

Hampir selalu ketika melakukan sesuatu seperti ini, saya memilih untuk menggunakan :substitutelebih dari makro. Khususnya kemampuan untuk mengevaluasi ekspresi sebagai pengganti ketika memulai dengan \=membuatnya sering dimungkinkan (lihat :h sub-replace-special).

Setelah Anda memiliki baris kosong di tempat ( 25i<Enter><Esc>), Anda dapat menggunakan perintah

:1,26s/^/\=nr2char(line('.')+64) . ' = mapping[' . (line('.')-1) . ']'

urutan yang diperlukan dihasilkan menggunakan '.'nomor baris ( argumen) saat ini yang dikembalikan oleh fungsi line(), dan menggunakan nr2char () untuk mengubah angka desimal menjadi setara ASCII (65 = A). String yang diperlukan digabungkan menggunakan.

Sakari Cajanus
sumber
1

Anda selalu dapat mencoba menggunakan sistem operasi ...

:r ! perl -E 'for(A..Z){say "$_ = mapping[", ord($_)-64 ,"]"}'
Joao
sumber
1
Perl tidak ada di sistem operasi.
dash-tom-bang