같은 것이 있습니까
eval("is_recording()")
현재 매크로를 기록하고 있는지 확인하기 위해 vimscript를 호출 할 수 있습니까? 나는 이것이 효과가 있다고 생각했을 것이다.
eval("mode(1)")
그러나 그것은 단지을 반환합니다 "n"
.
중요한지는 확실하지 않지만 neovim을 사용하고 있으므로 neovim 독점이라면 괜찮습니다.
같은 것이 있습니까
eval("is_recording()")
현재 매크로를 기록하고 있는지 확인하기 위해 vimscript를 호출 할 수 있습니까? 나는 이것이 효과가 있다고 생각했을 것이다.
eval("mode(1)")
그러나 그것은 단지을 반환합니다 "n"
.
중요한지는 확실하지 않지만 neovim을 사용하고 있으므로 neovim 독점이라면 괜찮습니다.
답변:
첫째, 귀하의 문제는 주로 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
설정됩니다 . 그런 다음 변수 값을 통해 기록 상태에 액세스 할 수 있습니다.1
0
"단점"은 재귀 매핑을 피하기 위해 Shit-q 대신에 기록을 시작하고 중지하는 데 사용해야 한다는 것입니다 q. (그다지 큰 문제 shift-q는 아닙니다. 원래 shift-q동작을 좋아하지 않기 때문에 한동안 레코드 모드를 전환 하는 데 사용 했습니다 )
이 솔루션의 주요 문제는 잊어 버리고 q변수를 사용 하면 변수가 토글되지 않지만 더 이상 작동하지 않으면 q(예 :와 함께 nnoremap q <nop>
) 비활성화 할 수 없다는 shift-q것입니다.
매크로 기록을위한 "모드"가 없기 때문에 이것은 매우 흥미로운 요청입니다. 일부 문서를 파고 난 후 다음을 발견했습니다.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
명명되지 않은 레지스터 ""
번호가 매겨진 10 개의 레지스터 "0 ~"9
작은 삭제 레지스터 "-
26 개의 명명 된 레지스터 "a ~"z 또는 "A ~"Z
세 개의 읽기 전용 레지스터 ":,"., "%
대체 버퍼 레지스터 "#
식 레지스터 "=
선택 및 드롭 레지스터 "*,"+ 및 "~
블랙홀 레지스터 "_
마지막 검색 패턴 레지스터 "/
지금 사용할 레지스터가 있다고 가정하면 문제는 "레코딩이 중지 된 시점을 어떻게 알 수 있습니까?"가됩니다. 상기 좀 걸릴 것이 내가 돌봐 autocmd-event
를 들어 CursorHold
; 도움말 문서의 메모는 매우 유망 해 보입니다 (노멀 커서 홀드와 매크로의 목적을 위해 레지스터를 작성할 때 발생하는 유휴 / 존재하지 않는 이벤트를 어떻게 구별 할 수 있는지 알아 내려고 노력했습니다)
커서 홀드
사용자가 'updatetime'으로 지정된 시간 동안 키를 누르지 않은 경우 사용자가 키를 누를 때까지 다시 트리거되지 않습니다 (즉, Vim이 커피를 만들기 위해 떠날 경우 모든 '업데이트 시간'ms를 시작하지 않습니다. :) | CursorHold-example | 태그 미리보기 이 이벤트는 일반 모드에서만 트리거됩니다. 명령 인수가 입력되기를 기다리거나 연산자 뒤의 움직임을 기다리는 경우에는 트리거되지 않습니다. CursorHold 이벤트를 기록하는 동안 트리거되지 않습니다. | q |
blackhole register
로 이것은 힌트로만 언급되었고 흥미로운 vim tidbit는 무언가로 이어질 수 있습니다 (매크로를 기록 할 때 사용하지 않을 것입니다 ._는 사용할 수 없습니다.) 실제로 매크로를 저장하려고 시도조차 할 수 없습니다 그것에 ..
CursorHold
지연으로 인해 불가능한 꿈 인 것 같습니다 CursorHold
(이걸 볼 때마다 간단한 전역 증가가 발생했습니다). 이 작업을 수행하는 방법을 생각해내는 데 여전히 매우 관심이 있으며 해결책이 생길 때까지 키에 대해 내 얼굴을 부술 것입니다.
q
변수를 전환하고 녹음을 시작 / 중지해야합니다. 키 누르기에 대한 autocmd 트리거가 없기 때문에 autocomand를 신뢰할 수 없으며 Vim의 단일 스레드 특성으로 인해 폴링 기능을 수행 할 수 없습니다. 미래의 실험에 행운을 빕니다 :-)