developer tip

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

optionbox 2020. 10. 14. 07:43
반응형

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


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

Last, First

으로

First Last

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

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

어떤 아이디어 Vim 전문가?

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


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.

라인을 선택한 다음 키를 눌러 :명령 모드로 들어갑니다. 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

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

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

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

:Rover a

참고 URL : https://stackoverflow.com/questions/3337926/vim-macro-on-every-line-of-visual-selection

반응형