텍스트 객체로 직사각형 영역?


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

cdac을 삭제하거나, yack거나, cac변경하는 등의 열에 대한 텍스트 객체를 정의 할 수 있습니까?

(직사각형 영역을 선택하기위한 Control-V에 대해 알고 d있으며 y,, 등을 사용 하여 선택한 영역을 삭제하거나 etc 수 있습니다 . 그러나 텍스트 객체를 사용하여 가능한 것이 무엇인지 궁금합니다.)


6
가능합니까? 물론! 사례 및 요점 : textobj-word-column.vim
Peter Rincker

@PeterRincker 이것은 훌륭하지만 Kana의 textobj-user를 활용하기 위해 단순화 할 수 없는지 궁금합니다 .
lcd047

고마워, 피터, 그건 내가 찾던 일종의 예야
Leah Velleman

2
@PeterRincker이 답변에 답하십시오 :)
Vitor

답변:


5

예, 가능합니다. @PeterRincker 플러그인 제안 textobj 단어 열 네 개의 텍스트 객체 (정의, ic, ac, iC, 및 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. indendation을 처리하고 적절한 모션 경계를 찾기 위해이 기능은 약간 복잡합니다.


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 태그 텍스트 객체입니다.

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

vim-textobj-user에 대한 추가 도움말은 help doc :을 참조하십시오 :h textobj-user-introduction.

도움이 더 필요하시면

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

잘만큼 만들기 새 텍스트 객체를 빔 위키 페이지를.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.