Metin nesneleri olarak dikdörtgen bölgeler?


11

Vim'de dikdörtgen bir bölgeye etki edecek bir metin nesnesi tanımlamak mümkün müdür?

Örneğin, dikey olarak hizalanmış metin sütunlarına sahip olduğumu varsayalım:

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

cSütunlar için, dacbir sütunu silen, yaconu cacçekecek, değiştirecek , vb. İçin bir textobject tanımlamak mümkün müdür ?

(Ben dikdörtgen bölgeyi seçmek için Control-V hakkında biliyorum ve daha sonra kullanabilirsiniz biliyoruz d, yvb silmek, yank vb seçilen bölgeye. Ama metin nesneleri kullanarak mümkün olan şeyler hakkında özellikle merak ediyorum.)


6
Mümkün mü? Kesinlikle! Durum ve nokta: textobj-word-column.vim
Peter Rincker

@PeterRincker Bu güzel, ama Kana'nın textobj kullanıcısından yararlanmak için basitleştirilemediğini merak ediyorum .
lcd047

Teşekkürler Peter, tam da aradığım örnek bu.
Leah Velleman

2
@PeterRincker bu bir cevap yapmak :)
Vitor

Yanıtlar:


5

Evet, bu mümkün. @PeterRincker eklentisi anlaşılacağı textobj-sözcük sütun dört metin nesneleri (tanımlar ic, ac, iCve aCkelime bazlı sütunlar).

Bu işlevin arkasındaki fikir, sütun tabanlı bir hareketi tanımlayan bir işlev oluşturmak ve ardından bu işlevi görsel / seçim modu eşlemelerine ve operatör bekleyen eşleştirmelere uygun şekilde eşlemektir. Yukarıda belirtilen eklentiyi örnek olarak kullanmak için aşağıdaki eşlemeleri oluşturur:

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>

Burada TextObjWordBasedColumn(...)sütun hareketini tanımlar ve hem görsel / seçim moduna hem de xnoremapoperatör bekleme moduna eşlenir onoremap. Girinti ile başa çıkmak ve uygun hareket sınırlarını bulmak için fonksiyonun biraz karmaşık olduğunu unutmayın.


4

Mümkün mü? Kesinlikle! Durum ve nokta: textobj-word-column.vim .

Kendi metin nesnelerinizi oluşturma

Genellikle görsel mod, yeni bir metin nesnesi oluşturmak için kullanılır. Görsel mod satır, karakter (tipik) veya görsel blok olabilir. İşte ihtiyacınız olacak şeylerin temelleri:

  • Kullanılmayan tuş bileşimi tipik olarak a{char}veya i{char}nerede {char}açıklayıcı ve kullanılmamışsa. örneğin 's i/arasında bir metin nesnesi olarak /.
  • Metin nesnenizin başlangıcını bulmak için bir yola ihtiyacınız var. ÖrneğinT/
  • Metin nesnenizin sonunu bulmak için bir yola ihtiyacınız var. Örneğint/
  • Bir görsel mod seçin. Örneğinv
  • Üzerinden bir görsel mod (yalnızca) eşleme oluşturun xnoremap.
  • onoremapVe aracılığıyla görsel mod eşlemeyi kullanan bir operatör beklemede mod eşlemesi oluşturun :normal.

Şimdi 's i/arasında bir metin nesnesi oluşturan basit örneğimize bir örnek için /:

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

Temel malzemeleri takip ettiğiniz sürece her türlü şey için metin nesneleri oluşturabilirsiniz.

Vim-textobj-user ile gelişmiş metin nesnesi oluşturma

Vim-textobj kullanıcı eklenti daha bildirim biçimde özel metin-nesneleri tanımlamak için ortak bir yol sağlar. Örneğin burada bir php etiketi metin nesnesi:

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

Vim-textobj-kullanıcı ile daha fazla yardım için onun yardım belgeye bakın: :h textobj-user-introduction.

Daha fazla yardım için

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

Yanı sıra yeni metin nesneleri Vim wiki oluşturma sayfası.

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.