명령 줄에있는 동안 기록을 중지하려면 어떻게합니까?


19

매크로를 사용하여 기록 할 때 q다음을 입력 할 수 있습니다.

  • q 일반 또는 시각 모드 인 경우 녹화를 중지합니다.
  • <c-o>q 삽입 모드에있는 경우 녹음을 중지합니다.
  • ..

    매크로가 명령 모드에서 종료되면 녹화를 어떻게 중지합니까?


이것에 대한 사용 사례는 무엇입니까? 정말 궁금합니다 :)
PhilippFrank

2
@PhilippFrank 여러 텍스트 블록에서 동일한 패턴을 자주 검색하고 다른 패턴으로 바꿉니다. 이러한 매크로를 사용하면 블록을 선택하고 실제 검색 패턴을 작성하고 대체 체인을 입력하기에 적합한 위치에 커서를 놓을 수 있습니다. 내가 그것을 할 때, 그것은 블록을 선택하고, 명령 모드를 입력하고, 입력 :'<,'>s/toBeReplaced//g한 다음 커서를 둘 사이에 놓아서 //입력해야 newString<cr>합니다. :)
iago-lito

매개 변수가있는 매크로와 같습니다. 아주 좋은 생각입니다, 감사합니다!
PhilippFrank

@PhilippFrank의 종류, 예. 나는 당신이 그것을 좋아해서 기쁘다. :)
iago-lito

답변:


12

또 다른 해결 방법은 명령 줄 모드에있을 때을 사용 Ctrl-f하고을 눌러 q기록을 중지하는 것입니다.

Ctrl-f일반 모드에서 명령을 편집 할 수있는 명령 행 창을 열 수 있습니다. 명령의 유효성을 검사하려면 간단히 enter를 사용하십시오.


따라서 다음과 같은 것을 추가 한 후 :

cnoremap <c-q> <c-f>i<c-o>q

에서 명령 모드에서 매크로 기록을 중지 .vimrc할 수 있습니다 <c-q>.


플로랑


여전히 ^F매크로 끝에서 <Cf> 문자 ( ) 를 제거해야 합니까? 적어도 그것이 내가 보는 것입니다.
VanLaser

거의 다 왔어! 정말 유용합니다 (명령 줄 창에 대해서는 몰랐지만 훌륭합니다) .. aargh! 삽입 모드에서이 창에 들어가면 선택한 영역이 느슨해집니다. 명령 줄 창에서 시작한 명령을 선택한 영역에서 작동시키는 방법이 있습니까?
iago-lito

@VanLaser 아니요, 명령 행 창에 명령을 입력해도됩니다. 매크로는 비슷 qqSTARTMACRO:STARTCOMMANDLINEPART<c-f>i<c-o>q하므로 명령 부분을 입력하는 동안 실제로 기록이 중지되었습니다. 매크로를 사용하려면 @qFINISHYOURCOMMAND<cr>다음을 수행하십시오. 매크로 를 편집 할 필요가 없습니다. 불행히도 이것은 비주얼 모드에서 작동하지 않는 것 같습니다 (또는 선택이 느슨해집니다). 또는 내가 놓친 것이 있습니까?
iago-lito

아, 맞아 :) BTW, 나는 가시 범위를 선택할 수 있습니다 다음 매크로가 시작하는 한 @q명령 시작시 범위가 추가되었습니다 ....'<,'>:
VanLaser

@ lago-lito 사실, 선택 내용이 보이지 않더라도 '<,'>명령을 확인할 때 지정된 범위 (예 :)가 선택 내용 과 여전히 일치합니다.
fflorent

17

그것을하는 한 가지 방법 :

  • 평소와 같이 매크로를 시작하십시오 (예 : qq... 다른 문자)
  • cmdline 모드에 도달하면 원하는 모든 문자를 작성하십시오
  • 여기서 매크로를 끝내고 싶습니다. 히트 ESC,있는 CmdLine 모드의 나가 q매크로를 종료합니다.
  • 레지스터 ESC에서를 제거하십시오 q(*) : 버퍼에 붙여넣고, ^[캐릭터를 제거하고 , 전체 내용을 다시 (문자 방향으로) 선택하고 다시 등록하기 위해 다시 잡아 당길 수 q있습니다.
  • 그게 다야 : 매크로를 실행하십시오 : @q.

기본적으로 매크로는 레지스터에 저장되기 때문에 매크로를 약간 "후 처리"합니다.

(*) 레지스터에 저장된 매크로에서 마지막 문자를 제거하는 빠른 방법 q은 다음과 같습니다.

:let @q = @q[:-2]

ㅋ! 이것은 실제로 지금까지 나의 핵이었다 = D. 그렇게하는 "정식적인"방법이 없습니까? (또한 빠르게 )
이아고 - 리토

나는 하나를 모르지만 매크로를 너무 많이 사용하지 않습니다 (대신 작은 함수를 작성하는 것을 선호합니다). 내가 나중에 그들을 볼 때 매크로는 나를 위해 비밀 감을 느낍니다.
VanLaser

@ VanLaser : 라인에 대해 좀 더 자세히 설명해 주 :let @q = @q[:-2]시겠습니까? 특히 어떻게 [:-2]작동합니까? :-)
statox

그것은 "슬라이스"이고 목록과 문자열에서 작동합니다 ( @q위에서 액세스 / 설정하는 방법입니다 ). 여기에
VanLaser

@ VanLaser 그들은 진정으로 비밀스러워 보입니다. 그러나 매우 특정한 경우에 필요한 반복적이고 정교한 작은 작업에는 유용합니다. 한 번만 나타나고 몇 분 동안 지속되는 이러한 종류의 문제를 알고 있습니다. 매크로를 즉시 생성하여 전용 함수를 작성하고 디버깅 할 필요없이 매크로를 처리 할 수 ​​있다는 것은 정말 멋진 일입니다. ^ ^
iago-lito

3

유스 케이스에 대한 의견을 읽은 후 매크로 대신 키 맵핑을 사용할 수있는 것처럼 보입니다.

내 .vimrc 에이 줄이 있습니다 (어디에서 찾았는지 기억하지 마십시오).

nnoremap <Leader>s :%s/\<<C-r><C-w>\>//g<Left><Left>

설명 된 유스 케이스와 유사한 효과가 있으므로 명령 행에 표시되므로 대체를 입력하고 Enter 키를 누르는 것뿐입니다.이 경우 커서 아래에 있던 단어의 모든 단어를 바꾸십시오. .

현재 블록 내에서 교체하기 위해 다음과 같은 것이 작동한다고 생각합니다.

nnoremap <Leader>s m'va{<ESC>``:'<,'>s/\<<C-r><C-w>\>//g<Left><Left>

물론 원하는 키에 매핑 할 수 있습니다.

위의 작업 : 이름이없는 마커를 사용하여 현재 위치를 표시하고, 현재 블록을 시각적으로 선택하고, 비주얼 모드를 종료하고, 커서를 저장된 위치 (시각 선택 마커가 여전히 설정되어 있음)로 되돌리고, 명령 모드를 시작하고 대체 명령을 입력하십시오. 을 사용하여 커서 아래에 있던 단어를 삽입하고 <C-r><C-w>커서를 위치하여 대체를 입력하십시오.


네, 이것도 가지고 있습니다. 그러나 특정 사용 사례에서 toBeReplaced패턴은 "커서 아래 단어"만큼 단순하지 않으므로 이동 중에 만들 수있는 작고 구체적인 매크로가 필요합니다. 그리고 다시 :지도에 대해 너무 구체적 : \ 감사합니다 :)
iago-lito

2
아마도 패턴을 레지스터에 넣은 다음 위의 매핑을 조정하여 레지스터 내용을 toBeReplaced부분 으로 자동으로 가져옵니다 (커서 아래 현재 단어 대신).
VanLaser

1
@VanLaser 맞습니다. 일반 매핑이 가능하고 훨씬 간단 해집니다. va{:s/<C-r>0//g<Left><Left>이렇게하면 미리 필요한 패턴을 잡아 당긴 다음 매핑 된 키를 눌러 해당 패턴을 현재의 무언가로 바꿀 수 있습니다 블록.
dhakimian
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.