2012-05-29 4 views
7

정규식, 어떤 종류의 동작 및 복사하여 붙여 넣기를 결합해야하는 문제가 자주 발생합니다. vim에서 이것을 수행 할 수있는 방법이있을 것이라고 확신하지만 모든 것을 함께 가져 오는 것을 보지 못했습니다. 예를 들어 지금 당장 해결해야 할 문제는 이것과 같습니다.VIM을 사용하여 매크로와 정규식의 힘을 결합하는 방법

  1. /^ 설명하는 행을 찾습니다/
  2. 저장 캡처 된 텍스트/^ TEXT "입니다 라인에
  3. 이동"(*.) "(*.) -/

사람이 신속하게 VIM에서 이러한 유형의 작업을 자동화하는 방법을 알고 있나요 파일을 통해 앞으로 이동 2 단계

  • 반복 필요에서 캡처 된 텍스트 위에 캡쳐 된 텍스트를 교체?

  • 답변

    4

    나는 새롭지 않은 모든 vim 전용 기능을 배웠다. vim 전에 vi를 배웠고이 솔루션은 vi-ish 편집기에서 작동합니다. vim 기능을 사용하는 더 나은 솔루션이있을 수 있습니다.

    이 경우 일반적으로 수행 할 작업은 위의 일부를 수행하는 여러 개의 키를 바인딩하는 :map 명령을 사용하는 것입니다. 잠시 동안없이 살 수있는 키를 선택해야합니다. 나는 이것을 위해 종종 gv을 사용합니다. @Neil Forrester는 기능 키를 사용하여 제안 했으므로 좋은 아이디어입니다.

    이제 성냥 그룹을 나타내는 괄호가있는 정규 표현 패턴을 보여 줬습니다. (vi 나 vim에서 실제로 "magic"으로 만들기 위해서는 각각의 괄호 앞에 백 슬래시를 넣어야합니다 (문서 참조). 그러나이 해결책을 위해서 나는 대신 f 명령을 사용할 것입니다. (f) inds a 지정된 문자; 및/또는 t 명령은 문자를 un (t)로 점프합니다. f은 문자 위로 점프합니다. 문자 바로 앞에 t이 점프합니다. 따라서 f"을 사용하면 문자열의 첫 번째 큰 따옴표로 건너 뛴 다음 t"을 사용하면 두 번째 큰 따옴표 바로 앞까지 이동할 수 있습니다.따라서 시퀀스 f"lyt"은 첫 번째 큰 따옴표를 찾은 다음 한 문자를 오른쪽으로 이동시킨 후 다음 큰 따옴표까지 모든 것을 꺼냅니다. 그러나, yank 된 텍스트를 26 개의 명명 된 버퍼 중 하나에 저장하자. f"l"ayt" 그냥 ""을 사용하여 명명 된 버퍼 "a"를 참조해야하기 때문에 조금 혼란 스럽지만 우리가 찾고있는 많은 다른 " 문자가 있습니다.

    또한 "지도"내에서 Enter 키의 키 입력을 기록해야 할 수 있습니다. 그렇게하는 방법은 Ctrl + V를 누른 다음 Enter 키를 누르는 것입니다. 이 경우 ^M으로 표시됩니다. 아래의 코드에서 ^M이 표시되면 실제 ^ 다음에 실제 M이 나오지 않고 Enter 키를 나타내는 단일 키를 의미합니다.

    이제 우리는 두 가지 주요 매핑을 만들 수 있습니다. 의 1과 2, g이 단계를 수행하기위한 조치 할 v을 결합하자 3과 4

    :map v /^Description "/^Mf"l"ayt" 
    
    :map g /^TEXT "/^Mf"ldt""aP 
    

    그래서 그냥 수 없습니다에서 Ctrl + V를 사용하여 입력보다는 실제로^M을 입력, 잊지 마세요 위의 내용을 편집하지 않고 복사/붙여 넣기하십시오.

    이제 1 단계와 2 단계를 수행하려면 v 키를 사용하고 3 단계와 4 단계를 수행하려면 g 키를 사용하십시오. 두 키를 번갈아 누르면 빠르게 처리 할 수 ​​있습니다.

    vim에서 스크립팅을 사용하여이 작업을 수행하는 방법이있을 수도 있지만, 반면에 스크립트를 작성하려면 간단한 Python 스크립트 (또는 원하는 언어)를 작성하는 것이 좋습니다. 위의 두 개의 주요 매크로는 vim에서 이런 종류의 작업을 수행하는 빠른 방법을 제공합니다.

    vim에는 입력 할 때 키를 녹음 할 수있는 기능이 있습니다. 이런 종류의 매크로를 빨리 만들 수 있습니다.

    +0

    이것은 내가 찾고있는 대답이었다. 내가 필요한 핵심 명령은 f와 t였다. 나는 실제로 "삭제"를 "홱 잡아 당기는"것으로 바꾸어야했다. 그렇지 않으면 완벽했다. 정말 고마워. – z4ce

    +0

    확실히, "yank"가 "delete"보다 낫습니다. 왜 "텍스트"를 넣을 때 "설명"에서 텍스트를 제거하고 싶다고 생각하는지 확신 할 수 없습니다. 나는 미래의 독자들이 혼란스러워하지 않도록 답을 편집 할 것이다. – steveha

    4

    다음 시퀀스를 사용하지 않은 키 (예 : F2)에 매핑 한 다음 원하는만큼 여러 번 누를 수 있습니다. 경기가 실패 할 때까지 반복적으로 실행할 수 있도록

    :map <F2> /^Description "(.*)"<CR>y//e/^TEXT "(.*)-<CR>Pd//e 
    

    선택적으로, 당신은 마지막에 <F2>를 추가 할 수 있습니다.

    :map <F2> /^Description "(.*)"<CR>y//e/^TEXT "(.*)-<CR>Pd//e<F2> 
    

    무슨 일이 일어나는지 살펴 보도록하겠습니다. 첫 번째 검색의 시작 부분으로 이동합니다.

    /^Description "(.*)"<CR> 
    

    첫 번째 검색이 끝날 때까지 검색됩니다.

    y//e 
    

    이 두 번째 검색은 다음과 같습니다,

    /^TEXT "(.*)-<CR> 
    

    이 방금 커서 전에 꼴은 무엇을두고 오른쪽으로 한 문자 이동 한 다음 두 번째 검색이 끝날 때까지 삭제합니다.

    Pld//e 
    
    +0

    보통 두 개의 매크로로 작업을 분할하는 것이 좋습니다. 이런 종류의 일을 할 때, 때로는 한 번의 검색에 필요한 여러번의 대체 작업이 있거나 때로는 원본 라인을 편집하고 싶습니다. – steveha

    +0

    이 코드는 좋지만, 텍스트의 텍스트를 \ (. * \)와 일치시켜야한다는 점을 분명히 밝혀야합니다. 그래도이 기술을 유용하게 사용할 수있을 것입니다. – z4ce

    관련 문제