Daerah persegi panjang sebagai objek teks?

11

Apakah mungkin untuk mendefinisikan objek teks dalam vim yang akan bertindak pada wilayah persegi panjang?

Misalnya, saya memiliki kolom teks yang disejajarkan secara vertikal, seperti ini:

column 1 co    column 2 col
lumn 1 colu    umn 2 column
mn 1 column    2 column 2 c
1 column 1     olumn 2 colu

Apakah mungkin untuk menentukan objek teks cuntuk kolom, sehingga dacakan menghapus kolom, yacakan menariknya, cacakan mengubahnya, dan seterusnya?

(Aku tahu tentang Control-V untuk memilih wilayah persegi panjang, dan saya tahu Anda kemudian dapat menggunakan d, y, dll untuk menghapus, yank dll wilayah yang dipilih. Tapi aku secara khusus ingin tahu tentang apa yang mungkin menggunakan objek teks.)

Leah Velleman
sumber
6
Apa itu mungkin? Benar! Kasus dan titik: textobj-word-column.vim
Peter Rincker
@PeterRincker Ini bagus, tapi saya ingin tahu apakah itu tidak dapat disederhanakan untuk mengambil keuntungan dari pengguna textobj Kana .
lcd047
Terima kasih, Peter, itu persis seperti contoh yang saya cari.
Leah Velleman
2
@PeterRincker membuat ini menjadi jawaban :)
Vitor

Jawaban:

5

Ya, ini mungkin. @PeterRincker menunjukkan plugin textobj-kata-kolom , yang mendefinisikan empat objek teks ( ic, ac, iC, dan aC) untuk kolom berbasis kata.

Gagasan di balik fungsi ini adalah untuk membuat fungsi yang mendefinisikan gerakan berbasis kolom, dan kemudian memetakan fungsi ini secara tepat ke pemetaan mode visual / pilih dan pemetaan yang menunggu operator. Untuk menggunakan plugin yang disebutkan di atas sebagai contoh, itu membuat pemetaan berikut:

xnoremap <silent> ac :<C-u>call TextObjWordBasedColumn("aw")<cr>
xnoremap <silent> aC :<C-u>call TextObjWordBasedColumn("aW")<cr>
xnoremap <silent> ic :<C-u>call TextObjWordBasedColumn("iw")<cr>
xnoremap <silent> iC :<C-u>call TextObjWordBasedColumn("iW")<cr>
onoremap <silent> ac :call TextObjWordBasedColumn("aw")<cr>
onoremap <silent> aC :call TextObjWordBasedColumn("aW")<cr>
onoremap <silent> ic :call TextObjWordBasedColumn("iw")<cr>
onoremap <silent> iC :call TextObjWordBasedColumn("iW")<cr>

Di sini TextObjWordBasedColumn(...)mendefinisikan gerakan kolom dan dipetakan ke mode visual / pilih dengan xnoremapdan mode pending operator dengan onoremap. Perhatikan bahwa fungsi ini sedikit rumit untuk menangani indendasi dan untuk menemukan batas gerak yang sesuai.

Karl Yngve Lervåg
sumber
4

Apa itu mungkin? Benar! Kasus dan titik: textobj-word-column.vim .

Cara membuat objek teks Anda sendiri

Mode visual biasanya digunakan untuk membuat objek teks baru. Mode visual dapat berupa garis-bijaksana, karakter-bijaksana (biasanya), atau blok visual. Inilah dasar-dasar dari apa yang Anda butuhkan:

  • Kombinasi kunci yang tidak digunakan biasanya a{char}atau di i{char}mana {char}deskriptif dan tidak digunakan. misalnya i/sebagai objek teks antara /.
  • Perlu cara untuk menemukan awal objek teks Anda. misalnyaT/
  • Perlu cara untuk menemukan akhir objek teks Anda. misalnyat/
  • Pilih mode visual. misalnyav
  • Buat pemetaan mode visual (hanya) via xnoremap.
  • Buat pemetaan mode pending operator yang menggunakan pemetaan mode visual via onoremapdan :normal.

Sekarang untuk contoh sederhana kami i/yang membuat objek teks antara /:

xnoremap i/ :<c-u>normal! T/vt/<cr>
onoremap i/ :normal vi/<cr>

Selama Anda mengikuti bahan dasar Anda dapat membuat objek teks untuk segala macam hal.

Pembuatan objek teks tingkat lanjut dengan pengguna vim-textobj

The vim-textobj-pengguna plugin menyediakan cara yang umum untuk menentukan kustom teks-benda dengan cara yang lebih deklaratif. Sebagai contoh di sini adalah objek teks tag php:

call textobj#user#plugin('php', {
\   'code': {
\     'pattern': ['<?php\>', '?>'],
\     'select-a': 'aP',
\     'select-i': 'iP',
\   },
\ })

Untuk bantuan lebih lanjut dengan vim-textobj-pengguna melihat bantuan doc nya: :h textobj-user-introduction.

Untuk bantuan lebih lanjut

:h map-overview
:h visual-start
:h :norm

Serta halaman Membuat objek teks baru Vim wiki.

Peter Rincker
sumber