시각적 선택의 모든 줄에 Vim 매크로


85

머리에있는 줄 수를 합산하는 대신 선택 항목의 모든 줄에서 매크로를 실행하고 싶습니다. 예를 들어 변환 할 매크로를 작성할 수 있습니다.

Last, First

으로

First Last

이 모든 라인에서 실행하고 싶습니다.

Stewart, John 
Pumpkin, Freddy
Mai, Stefan
...

어떤 아이디어 Vim 전문가?

편집 : 이것은 단지 예일뿐입니다. 분명히 이것은 상식적으로 정규식이 가능하지만 매크로를 사용하는 것을 선호하는 너무 쉽지 않은 다른 인스턴스가 있습니다.


1
솔직히 말해서 정규식으로이 특정 작업을 수행 할 것입니다. 그러나 문제는 더 복잡한 경우에도 여전히 유효합니다.
Jamie Wong

왜 Vim인가? 제 생각에는 sed가 더 적절하다고 생각합니다.
kokosing

8
@kogut : 한 줄 정규식으로 텍스트를 편집하기 위해 편집기를 종료하는 이유는 무엇입니까?
Stephen

1
좋아, 당신은 요점을 얻었다;)
kokosing

답변:


152

q한 줄에서 실행 된 (남아있는) 매크로 가 있다고 가정합니다 . 그런 다음 다음을 사용하여 선택한 모든 줄에서 실행할 수 있습니다.

:'<,'>normal @q

(이미 선택된 라인의 그룹이있는 경우, 타격은 :생산 :'<,'>명령 행에서)

예를 들어, 다음 매크로는 한 줄의 첫 번째 단어를 제외한 모든 단어를 대문자로 표시합니다.

:let @q="^dwgU$P"

따라서 다음에서 실행하십시오 ( +줄이 선택된 곳)

 0000: a long long time ago
 0001: in a galaxy far away
+0002: naboo was under an attack
+0003: and i thought me and qui-gon jinn
+0004: could talk the federation in
 0005: to maybe cutting them a little slack.

위의 normal @q명령으로 다음을 생성합니다.

 0000: a long long time ago
 0001: in a galaxy far away
 0002: naboo WAS UNDER AN ATTACK
 0003: and I THOUGHT ME AND QUI-GON JINN
 0004: could TALK THE FEDERATION IN
 0005: to maybe cutting them a little slack.

6
:let @q="^wgU$"

1
@rampion : 명령에 오타가 있습니까? 나를 위해 그것은 단지 다음과 같이 작동:'<,'>normal! @q
올리버

3
@oliver : 매핑을 확인하십시오-다시 매핑했을 수 있습니다 @q. From- :help normal"[!]가 주어지면 매핑이 사용되지 않습니다."
rampion 2011

2
@rampion : 젠장 ... 당신 말이 맞아요! 나는 yankring을 사용하고 분명히 이것에 문제가 있습니다 : ... ": normal @a"로 매크로를 실행할 수 없습니다. 여전히 불가능하지만 ": normal! @a"로 실행할 수 있습니다 (yankring 도움말 문서에서)
oliver

1
개인적으로 다음과 같은 @시각적 모드 로 매핑 하는 것을 좋아합니다 vnoremap @ :normal @. 그래도 @a예상 대로 할 수 있습니다 (나중에 Enter 키를 눌러야하지만 :()
LondonRob

19

라인을 선택한 다음 키를 눌러 :명령 모드로 들어갑니다. Vim은 자동으로을 채워 '<,'>선택한 라인으로 범위를 제한합니다. 예를 들어 다음 :s명령을 사용 하여 스왑을 수행 할 수 있습니다 .

:'<,'>s/\(\w\+\), \(\w\+\)/\2, \1/

이렇게하면 시각적 선택 항목의 모든 줄에서 쉼표로 구분 된 두 단어가 바뀝니다.

또한 사용 '<하고 '>있으므로 일반 모드에서 이동 명령의 일부로서 다른 북마크 또는 라인 위치, 예를 들어, 같은 d'<시각적 선택의 첫 번째 행의 시작에 현재 커서 위치에서 삭제됩니다. 블록이 더 이상 시각적으로 강조 표시되지 않더라도 마크는 유효합니다.

기록 된 매크로를 모든 행에서 재생하려면 :normal명령 과 함께 매크로를 실행해야합니다 . 안타깝게도이 :normal명령은 여러 줄에서 작동하지 않지만 명령을 사용하여 수정할 수 있습니다 :global. 이것은 :ex정규식과 일치하는 모든 줄 에서 명령을 실행 하므로 다음과 같이 할 수 있습니다.

:'<,'>g/^/ norm @a

설명:

:'<,'>       for every line in the visual block
g/^/         on every line that matches the regex /^/ - i.e. every line
norm         run in normal mode
@a           the macro recorded in a

새 줄을 추가하는 매크로를 지원하기 때문에 허용되는 답변보다 낫습니다.
Jan Warchoł

@Dave, Kirby 아마도 매크로가 텍스트가있는 줄에서만 실행되도록 교환 ^하는 것이 더 좋을 .것입니다.
SergioAraujo

1

아래 기능을 추가 ~/.vimrc하거나 브라우저에 복사하여 실행할 수 있습니다.:@+

fun! RunMacroOverSelection(macroname)
    execute "'<,'>normal @". a:macroname
endfun
com -nargs=1 Rover :call RunMacroOverSelection(<f-args>)
nnoremap <leader>r :Rover<space>

장점은 시각적 선택에 모든 매크로를 적용 할 수 있다는 것입니다. 다음과 같이 매크로 문자를 인수로 제공해야합니다.

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