テキストオブジェクトとしての長方形の領域?


11

長方形の領域に作用するvimでテキストオブジェクトを定義することは可能ですか?

たとえば、次のように、テキストの列が垂直方向に整列しているとします。

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

textobject定義することは可能であろうc列のため、そのようにdac列を削除するだろうが、yacそれをヤンクだろう、cacそれを変更するだろう、などを?

(私は、矩形領域を選択するためのコントロール-Vについて知っている、と私はあなたがして使用することができます知っているdyなどは削除し、ヤンクなど、選択された領域。しかし、私はテキストオブジェクトを使用して可能ですかについて、具体的興味があります。)


6
出来ますか?絶対に!事例と要点:textobj-word-column.vim
Peter Rincker

@PeterRinckerこれはいいですが、カナのtextobj-userを利用するために単純化できなかったのではないかと思います
lcd047

ありがとう、ピーター、それはまさに私が探していた類の例です。
Leah Velleman、2015

2
@PeterRinckerがこれを答えにします:)
Vitor

回答:


5

はい、可能です。@PeterRinckerプラグイン示唆textobjワードカラム 4つのテキストオブジェクト(定義、icaciC、およびaC単語ベースの列のを)。

この機能の背後にある考え方は、列ベースのモーションを定義する関数を作成してから、この関数をビジュアル/選択モードのマッピングとオペレーターの保留中のマッピングに適切にマッピングすることです。上記のプラグインを例として使用すると、次のマッピングが作成されます。

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>

ここでTextObjWordBasedColumn(...)は、列の動きを定義し、でビジュアル/選択モードとxnoremapでオペレーター保留モードの両方にマップされますonoremap。インデンドを処理し、適切なモーション境界を見つけるために、関数は少し複雑であることに注意してください。


4

出来ますか?絶対に!ケースとポイント:textobj-word-column.vim

独自のテキストオブジェクトを作成する方法

通常、ビジュアルモードは新しいテキストオブジェクトの作成に使用されます。視覚モードは、行単位、文字単位(通常)、または視覚ブロックです。必要なものの基本は次のとおりです。

  • 未使用のキーの組み合わせは、典型的にa{char}、またはi{char}どこ{char}記述と未使用の両方です。たとえばi/、間/のテキストオブジェクトの例として。
  • テキストオブジェクトの始まりを見つける方法が必要です。例えばT/
  • テキストオブジェクトの終わりを見つける方法が必要です。例えばt/
  • ビジュアルモードを選択します。例えばv
  • を介してビジュアルモード(のみ)のマッピングを作成しxnoremapます。
  • onoremapおよびを介したビジュアルモードマッピングを使用する、オペレーター保留モードマッピングを作成します:normal

次に、のi/間にテキストオブジェクトを作成する単純な例を示します/

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

基本的な要素に従っている限り、あらゆる種類のテキストオブジェクトを作成できます。

vim-textobj-userによる高度なテキストオブジェクトの作成

VIM-textobjユーザーのプラグインは、より宣言の方法でカスタムテキストオブジェクトを定義する一般的な方法を提供します。たとえば、phpタグのtext-objectは次のとおりです。

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

vim-textobj-userの詳細については、ヘルプドキュメントをご覧ください:h textobj-user-introduction

さらにヘルプが必要な場合

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

新しいテキストオブジェクト作成 Vim wikiページと同様に。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.