불완전한 키보드 매크로 기록을 재개하는 방법?


10

클래식 사용 사례 :

  1. 매크로 기록을 시작합니다. C-x (
  2. 당신은 몇 가지 일을 해봅시다 hello.
  3. 오류를 발생시키는 명령을 실행하십시오. C-g예를 들어 실수로 실행 C-s하면 C-g작업 을 취소해야 합니다.

지금까지 녹음이 손실되었습니다.

녹음을 방해하는 명령을 실행하기 전에 중단 한 부분부터 다시 시작하고 싶습니다. 나는을 보았지만 C-h f start-kbd-macroC로 작성되었으므로 조정할 수는 없습니다. 나는 또한와 같은 변수를 current-kbd-macro찾아 다녔지 만 지금까지 아무것도 찾지 못했습니다.

회복 될 수 있습니까?

최신 정보:

C-u C-x (나를 위해 작동하지 않는지 알 수 없었지만 테스트를했기 때문에 발견했습니다 C-g.

그것은이 밝혀 C-g특별하다 - 당신은 오류 등의 다른 종류를 실행하는 경우

C-x ( M-: (signal 'quit nil) 

그러면 녹음이 중지되지만 last-kbd-macro을 포함 "M-: M-( signal 'quit nil"하지만

C-x ( C-g

기록을 중지하고 기록 된 내용을 버립니다. Cg- 행복한 사용자 (최소한 두 명의 친구처럼)는 다소 불행한 구별입니다. 나는 편집을 시도 keyboard-quit했지만 거기에서 할 수있는 일은 없습니다.

이것을 복구하는 유일한 방법은에서 recent-keys와 같이 start-kbd-macro (또는 유사한)가 호출 된 위치 를 통해 자동으로 알아내는 것입니다 kmacro-edit-lossage.

답변:


8

나는 시작 여기에 구현 당신이 당신의 바인딩 할 수 있습니다 C-x (에를 resmacro-start-macro.

이제 매크로를 반쯤 가져 가서 실수를해서 C-g예를 들어 C-s실수로 실행 C-g하여 취소하거나 눌렀다 고 가정하십시오.

C-x ( hello C-s C-g 

이제 C-u C-x (미니 버퍼에 다음과 같은 메시지가 표시됩니다.

(RET : 계속, DEL : 마지막 제거)를 사용하여 매크로를 다시 시작하십시오. h e l l o C-s

따라서 백 스페이스 ( DEL)를 눌러를 삭제 한 C-s다음 RET계속합니다. 이제는 말합니다 :

kbd 매크로에 추가하는 중 ...

그리고 당신은 계속할 수 있습니다.

전체적으로:

C-x (      -- start macro
hello
C-s        -- mistake
C-g        -- cancel mistake (and macro)
C-u C-x (  -- recover lost macro
DEL        -- remove mistake
RET        -- continue recording
world!

편리한, 아니 컨텍스트 스위치가 최소 키 바인딩은 매크로 (에서 시작 위치를 자동으로 파악, 작업을 달성하기 위해 C-x (에서) (recent-keys).


1
이봐, 정말 좋은데. Emacs에 패치로 제출 하시겠습니까?
Stefan

당신은 당신이 원하는대로 그렇게 / 라이센스를 환영합니다! 어느 곳에서나 발표하기 전에 로컬에서 잠시 시험 사용하여 신뢰할 수 있음을 알 수 있습니다. 그러나 Emacs 관리자는 그것이 너무 해키하다고 생각할 수도 있습니다. ;-)
Christopher 님

그것을 Emacs에 포함시키기 위해서는 저자가 저작권 서류에 서명해야합니다 (물론 동일한 서류도 신 모드를 다룰 것입니다).
Stefan

링크가 끊어졌습니다 :(
DirtY iCE

2

실행 kmacro-start-macro-or-insert-counter접두사 (과 C-u이전 매크로에 추가 할).


2
문서화 문자열은 그렇게 말하지만, 이중 접두사 인수 (하지 않는다 C-u C-u) 세트 모두APPENDNO-EXEC인수에 start-kbd-macro당신이 추가 할 수있는 없이 매크로 - 그래서 - 지금까지의 초기 재생. 그러나이 동작 매뉴얼에 문서화되어 있습니다.(emacs) Basic Keyboard Macro
phils

내 질문에있는 예제로 시도해보십시오. 작동하지 않습니다.
Christopher 완료

2

stsquad와 artagnon의 좋은 대답을 결합하면 완전히 합리적인 문제에 대한 완전한 해결책을 얻을 수 있습니다.

  • C-xC-keC-hl 손실에서 생성 된 매크로를 편집하려면
  • 매크로를 편집하여 원래 기록으로 줄입니다.
  • C-cC-c 편집 한 매크로를 저장하려면
  • 어느 쪽이든 C-u<f3>먼저 해당 매크로를 재생 한 다음 매크로 정의에 추가됩니다 이후 키 입력을 기록 계속
  • ... 매크로의 초기 재생 없이C-uC-u<f3> 녹화를 계속합니다 .

매크로로 손실을 편집해야하는 것이 이상적이지 는 않지만 (a) 기록을 중단 한 경우에 관계없이 매크로를 편집해야했고 (b) 자주 발생하지 않아야합니다. 매크로를 정상적으로 중지하는 방법을 기억하는 경우 (예 : <f4>대신 C-g).

중단 된 매크로가 어딘가에 저장된 경우 유용하지 않다고 말하는 사람은 없습니다. 나는 이것이 실제로 일어나지 않는다고 생각합니다. 아마 가치가있을 것입니다 M-x report-emacs-bug이 기능을 제안합니다.


이 문제는 해결되지 않습니다. 절반의 솔루션으로 매크로를 다시 시작하는 것이 더 쉬울 것입니다. 문제를 잘 해결하는 다른 곳에 답변을 게시했습니다.
Christopher 완료

1
물론 간단한 경우에는 다시 시작하는 것이 더 쉬울 것입니다. 그래도 나머지 부분에는 여전히 유용하지만 일부 사람들은 도움이 될 것입니다. 특히 기본적으로 사용 가능합니다. 내가 지적했듯이, 더 자동화 된 접근법에 대한 아이디어가 좋은 것이라고 생각합니다. 따라서 솔루션을 개발하고 귀하의 답변을 확실히 투표 한 것을 기쁘게 생각합니다.
phils

0

표준 솔루션은 C-x C-k C-e( kmacro-edit-macro)이며, 각 키 누르기를 통해 원하는대로 삽입 / 삭제할 수 있습니다. 편집기의 명령 구문은 약간 간결하지만 ?가이드가 표시됩니다. 주석이있는 일반 텍스트 매크로 편집기를 제공 하는보다 자연스러운 편집기가 C-x C-k e( edit-kbd-macro)에 바인딩되어 있습니다.

또 다른 옵션은 M-x insert-kbd-macro매크로를 Lisp로 편집 할 수 있지만 세계에서 가장 읽기 쉬운 것은 아닙니다.

지금까지 변수에 관한 한 당신이 찾고있는 last-kbd-macrokmacro-ring.

당신이 매크로를 완료하지 않았다는 것을 언급했듯이, 손실에서 매크로를 만들 수 있습니다. C-x C-k e C-h l최대 300 개의 선행 문자를 삭제하십시오.


이것은 내가 할 수 있다면 내가 싫어했던 나쁜 대답입니다. 질문을 읽지 않았거나 무시하고 있습니다. 누르기 전에 또는 오류가 발생 하기 전에 키를 누르 last-kbd-macro거나 kmacro-ring포함 하지 C-g마십시오. 나는 구체적으로 그러한 나쁜 답을 기대하면서 제목에 INCOMPLETE를 올캡으로 넣었다. 그래도 도와 ​​주셔서 감사합니다.
Christopher 완료

1
@ChristopherDone : 확실히 할 수 있습니다-나는 손실을 언급하기 위해 하단에 메모를 추가했습니다. 이전에 입력 한 문자 중 최대 300 개까지 매크로를 만들 수 있습니다.
stsquad

예, 누군가 #emacs에서 손실을 언급했습니다. 나는 그만 둔 곳에서 재개하고 싶다. 편집기를 열고 무언가를하고있을 때 그 물건을 삭제하기를 원하지 않습니다.
크리스토퍼 완료

2
이것과 artagnon의 응답의 조합은 훌륭한 솔루션을 제공 : C-x C-k e C-h l, 편집 C-c C-c, 다음 C-u f3(즉, 마지막 것을주의 녹음을 계속하기 위해 f3먼저합니다 플레이 매크로 이렇게까지 추가 입력을 기다리는 전). 매크로로 손실을 편집해야하는 것이 이상적이지 는 않지만 (a) 기록을 중단 한 경우에 관계없이 매크로를 편집해야했고 (b) 자주 발생하지 않아야합니다. 매크로를 정상적으로 중지하는 방법 만 기억한다면
phils

1
@phils +1 아마도 별도의 답변으로 바꿔야 할 것입니다.
itsjeyd
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.