vimscript로 녹음 중인지 감지하는 방법이 있습니까?


11

같은 것이 있습니까

eval("is_recording()")

현재 매크로를 기록하고 있는지 확인하기 위해 vimscript를 호출 할 수 있습니까? 나는 이것이 효과가 있다고 생각했을 것이다.

eval("mode(1)")

그러나 그것은 단지을 반환합니다 "n".

중요한지는 확실하지 않지만 neovim을 사용하고 있으므로 neovim 독점이라면 괜찮습니다.


3
IMHO 그것은 나쁜 생각이 될 것입니다-그 경우 "녹음"은 잘못된 이름이 될 것입니다.
VanLaser

@VanLaser 잘못된 이름의 의미는 무엇입니까?
James

1
Vim 액션을 녹음 할 때 다른 경우, 이는 나중에 반복하기 위해 "저장"해야 할 때 레코딩 프로세스 자체가 액션에 영향을 미침을 의미합니다. 매크로를 실행할 때 어떤 일이 예상됩니까?
VanLaser

답변:


4

첫째, 귀하의 문제는 주로 XY 문제 라고 생각합니다 . 당신은 결국 당신이 무엇을하려고하는지에 대한 더 많은 정보를 제공해야하며 우리는 다른 해결책을 찾을 수 있다고 생각합니다.

이제 여기에 해결 방법이 있습니다. 이상적이지 않고 확실히 강력하지는 않지만 다음 행을 추가 할 수 있습니다 .vimrc.

let g:isRecording = 0
nnoremap Q :call ToggleRecording()<CR>q

function! ToggleRecording()
    let g:isRecording = !g:isRecording
    echo "is recording " . g:isRecording
endfunction

기본 모드에서을 누르면 "레코딩 모드"가 독점적으로 토글 q됩니다.

이를 기반으로 g:isRecording녹화를 시작하거나 중지 할 때마다 전환 되는 변수를 만듭니다 . 이렇게하면 녹음을 시작할 때 및 녹음을 중지 할 때로 g:isRecording설정됩니다 . 그런 다음 변수 값을 통해 기록 상태에 액세스 할 수 있습니다.10

"단점"은 재귀 매핑을 피하기 위해 Shit-q 대신에 기록을 시작하고 중지하는 데 사용해야 한다는 것입니다 q. (그다지 큰 문제 shift-q는 아닙니다. 원래 shift-q동작을 좋아하지 않기 때문에 한동안 레코드 모드를 전환 하는 데 사용 했습니다 )

이 솔루션의 주요 문제는 잊어 버리고 q변수를 사용 하면 변수가 토글되지 않지만 더 이상 작동하지 않으면 q(예 :와 함께 nnoremap q <nop>) 비활성화 할 수 없다는 shift-q것입니다.


2

매크로 기록을위한 "모드"가 없기 때문에 이것은 매우 흥미로운 요청입니다. 일부 문서를 파고 난 후 다음을 발견했습니다.usr_10

첫 줄의 첫 문자로 이동하여 시작합니다. 다음으로 다음 명령을 실행하십시오.

qa 레지스터 a에서 매크로 기록을 시작 합니다 .

^ 줄의 시작 부분으로 이동하십시오.

i # include "줄의 시작 부분에 문자열 #include"를 삽입하십시오.

$ 줄의 끝으로 이동하십시오.

a "줄 끝에 문자 큰 따옴표 (")를 추가합니다.

j 다음 줄로 이동하십시오.

매크로 기록을 중지합니다.

나에게 눈에 띄는 것은 "레지스터 a에서 매크로 기록 시작"에 관한 줄이었습니다.

각 매크로는 기본적으로 레지스터에 저장되므로 :reg목록 에서 볼 수 있기를 바랍니다 . 그것은 매력처럼 작동한다는 것이 밝혀졌습니다!

예:

일반 모드에서 : qaisomething<Esc>

그리고 :reg우리는 입구를 볼 수 있습니다!

"a   isomething^[

이 지식을 통해 매크로를 기록하고 있음을 확인하기 위해 레지스터에서 "스파이"할 수 있어야합니다 (모든 기록에서 이름이 지정된 레지스터를 q사용하십시오 (항상 동일한 레지스터 (또는 이와 유사한 것)를 사용하는 맵 )).

문제가 발생하면 알려 주시면 도와 드리겠습니다 (이 기능은 나에게도 새롭기 때문에 : D).

편집 yank 중에 사용되는 레지스터의 문제를 해결하려면 vimL쓰고 있는 사람 만 사용할 수있는 특수 유형의 레지스터를 살펴 보는 것이 좋습니다 (yank는 레지스터에 관여하지 않습니다 "ay)

:help registers사용 가능한 레지스터에 대한 약간의 정보 가 있습니다.

레지스터에는 10 가지 유형이 있습니다. 레지스터 E354

  1. 명명되지 않은 레지스터 ""

  2. 번호가 매겨진 10 개의 레지스터 "0 ~"9

  3. 작은 삭제 레지스터 "-

  4. 26 개의 명명 된 레지스터 "a ~"z 또는 "A ~"Z

  5. 세 개의 읽기 전용 레지스터 ":,"., "%

  6. 대체 버퍼 레지스터 "#

  7. 식 레지스터 "=

  8. 선택 및 드롭 레지스터 "*,"+ 및 "~

  9. 블랙홀 레지스터 "_

  10. 마지막 검색 패턴 레지스터 "/

지금 사용할 레지스터가 있다고 가정하면 문제는 "레코딩이 중지 된 시점을 어떻게 알 수 있습니까?"가됩니다. 상기 좀 걸릴 것이 내가 돌봐 autocmd-event를 들어 CursorHold; 도움말 문서의 메모는 매우 유망 해 보입니다 (노멀 커서 홀드와 매크로의 목적을 위해 레지스터를 작성할 때 발생하는 유휴 / 존재하지 않는 이벤트를 어떻게 구별 할 수 있는지 알아 내려고 노력했습니다)

커서 홀드

사용자가 'updatetime'으로 지정된 시간 동안 키를 누르지 않은 경우 사용자가 키를 누를 때까지 다시 트리거되지 않습니다 (즉, Vim이 커피를 만들기 위해 떠날 경우 모든 '업데이트 시간'ms를 시작하지 않습니다. :) | CursorHold-example | 태그 미리보기 이 이벤트는 일반 모드에서만 트리거됩니다. 명령 인수가 입력되기를 기다리거나 연산자 뒤의 움직임을 기다리는 경우에는 트리거되지 않습니다. CursorHold 이벤트를 기록하는 동안 트리거되지 않습니다. | q |


매크로가 기록을 마치면 문자열이 레지스터에 저장되지만 레지스터에 매크로가 포함되어 있거나 예를 들어 yank 명령에서 오는 것이 포함되어 있으면 어떻게 구별합니까? 또한 녹음이 끝나면 레지스터가 한 번의 샷으로 저장되므로 레지스터의 내용이 변경되었음을 확인하면 더 이상 녹음 모드가 아닙니다.
statox

내 희망은 당신이 블랙홀 레지스터와 같은 것을 사용할 수 있기를 희망했습니다. 당신이 레지스터가 잠겨있는 경우에 당신은 (즉, 나중에 도움이 있는지 확인하기 위해 좀 더 많은 정보와 내 대답을 업데이트합니다) 때 기록 모드에서 어떤 특별한 행동을 가지고 CURSORHOLD 체크 아웃 할 수
댄 브래들리

다른 레지스터에 대한 정보를 추가하고 (yank와의 충돌을 피하는 방법) 매크로 기록 중에 CursorHold가 활성화되지 않은 상태에서 "레코딩"을 잡을 수있는 방법에 대한 힌트를 추가했습니다. 그 노트 후에도 여전히 싸우고 있다면 작업이 끝난 후에 구현해 볼 수 있습니다. 참고 blackhole register로 이것은 힌트로만 언급되었고 흥미로운 vim tidbit는 무언가로 이어질 수 있습니다 (매크로를 기록 할 때 사용하지 않을 것입니다 ._는 사용할 수 없습니다.) 실제로 매크로를 저장하려고 시도조차 할 수 없습니다 그것에 ..
댄 브래들리

나는 지난 밤 (포스트 맥주 키보드 스매싱)에 약간의 시간을 보냈으며 기록이 발생하고 끝나는 시점을 정확히 파악하는 것이 매우 어렵다는 것을 알았습니다. 내 직감은 실제로 일어나는 CursorHold지연으로 인해 불가능한 꿈 인 것 같습니다 CursorHold(이걸 볼 때마다 간단한 전역 증가가 발생했습니다). 이 작업을 수행하는 방법을 생각해내는 데 여전히 매우 관심이 있으며 해결책이 생길 때까지 키에 대해 내 얼굴을 부술 것입니다.
Dan Bradbury

내 의견으로는 수천 가지 옵션이 없습니다. 동작을 재정의하고 q변수를 전환하고 녹음을 시작 / 중지해야합니다. 키 누르기에 대한 autocmd 트리거가 없기 때문에 autocomand를 신뢰할 수 없으며 Vim의 단일 스레드 특성으로 인해 폴링 기능을 수행 할 수 없습니다. 미래의 실험에 행운을 빕니다 :-)
statox
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.