Emacs로 '실행 취소'후 변경 사항을 어떻게 '다시 실행'합니까?


268

이 기사에서는 "실행 취소하는 동안 방향을 되돌릴 수 있으므로 실행 취소를 취소 할 수 있기 때문에 이맥스가 재실행했다"고한다.

이것은 무엇을 의미 하는가? 사용자가 Emacs로 어떻게 '재실행'할 수 있습니까?


3
허용 대답 아래의 대답은 당신을 알려줍니다 어떻게 대부분의 사람들이 실제로 찾고하는, 당신이 그것을 기록 어떻게 주어진이 대답보고있는 이유의, 내가 기대합니다.
Aaron Hall

방금 스페이스 바를 치고 그 후에 실행 취소하면 공간이 취소되고 끝까지 도달 한 다음 다시 돌아 가기 시작할 때까지 실행 취소가 다시 실행됩니다 ... 훨씬 더 복잡한 방법이 있다는 것을 알고 있습니다. 쉽고, 그렇게 굴립니다.
nroose

답변:


294

짧은 버전 : 실행 취소를 취소합니다. 실행 취소 한 다음과 같은 편집하지 않는 명령 C-f을 수행하면 다음 실행 취소가 실행 취소를 실행하여 다시 실행됩니다.

더 긴 버전 :

실행 취소는 작업 스택에서 작동하는 것으로 생각할 수 있습니다. C-f일련의 실행 취소 작업 후에 일부 명령 (예 :와 같은 탐색 명령 )을 수행하면 모든 실행 취소가 작업 스택으로 푸시됩니다. 따라서 다음 실행 취소는 마지막 명령을 실행 취소합니다. 다음과 같은 조작 순서가 있다고 가정하십시오.

  1. "foo"삽입
  2. "바"삽입
  3. "스팸 사랑"삽입

자, 당신은 취소합니다. 마지막 작업을 취소하여 다음 목록을 만듭니다.

  1. "foo"삽입
  2. "바"삽입

이 시점에서 실행 취소 이외 C-f의 작업을 수행하는 경우 작업 스택은 다음과 같습니다.

  1. "foo"삽입
  2. "바"삽입
  3. "스팸 사랑"삽입
  4. "스팸을 좋아합니다"를 삽입 취소

이제 취소 할 때 가장 먼저 취소해야 할 것은 실행 취소입니다. 원래 스택 결과 및 문서 상태 :

  1. "foo"삽입
  2. "바"삽입
  3. "스팸 사랑"삽입

실행 취소 시퀀스를 해제하기 위해 수정 명령을 수행하는 경우 해당 명령은 실행 취소 후에 추가되므로 이후에 실행 취소 할 첫 번째 명령입니다. 때리는 대신 "바"위로 백 스페이스 간격을두고 있다고 가정합니다 C-f. 그럼 당신은했을 것

  1. "foo"삽입
  2. "바"삽입
  3. "스팸 사랑"삽입
  4. "스팸을 좋아합니다"를 삽입 취소
  5. "바"삭제

이 추가 / 다시 추가는 무한정 발생합니다. 익숙해지는 데 약간의 시간이 걸리지 만 실제로는 Emacs에 매우 유연하고 강력한 실행 취소 / 다시 실행 메커니즘을 제공합니다.


117
이것이 성가 시게 들리는 경우를 대비하여 가장 큰 장점은 항상 이전 상태로 되돌릴 수 있다는 것입니다. 대부분의 편집자에서 여러 변경 사항을 취소 한 다음 실수로 문자를 입력하면 실행 취소 한 항목을 다시 실행할 수있는 방법없이 '스트랜드'상태가됩니다. 이맥스는 이것을 사소한 것으로 만듭니다.
Phils

3
예를 들어, "이제, 당신은 취소합니다. 마지막 행동을 취소하여 다음과 같은 결과를 낳는 지점에 두 개의 스택이 필요합니다. list : "당신은 (실제로) 실행 취소를 보여주지 않았으며, 그가 많은 실행 취소를 한 경우, 실행 취소 순서를 깨기 위해 무언가가 완료 될 때까지 표시하지 않을 것입니다. 목록을 표시하는 또 다른 방법은 하나의 목록을 갖고 취소하기 전에 목록에 실행 취소를 추가하는 것이지만 커서가 목록에있는 위치를 확인하는 것입니다. 따라서 우리는 실행 취소가 거꾸로 작동하는 위치를 알 수 있습니다
barlop

25
귀찮게 들린다.
Felipe

13
이 답변이 왜 당신에게 HOW를 말하지 않았을 때 받아 들여 졌는지 모르겠습니다 .
Aaron Hall

8
슬프게도이 대답은 Cg C- / 인 redo 명령에 대해서는 아무 것도 말하지 않습니다.
vishnuprasanth

211

실행 취소 : C-_

실행 취소 후 다시 실행하려면 : C-g C-_

여러 번 입력 C-_ 에 의해 취소 된 것을 다시 실행하려면 C-_ , 이맥스는 여러 번 명령을 다시 실행 명령 후 입력 실행하려면 C-xz다음에 여러 번 입력 z(여러 번 매크로를 실행하고자 할 때 흥미) 명령을 반복 키를


4
C-u예를 들어 C-u 8 *(캐럿이있는 곳에 8 * 삽입)을 사용하여 물건을 반복 할 수 있습니다 . 따라서 x 단계 C-u x C-_를 실행 취소 하는 데 사용할 수 있습니다 .
패트릭

10
이것은 원래 질문과 관련이 없지만 키보드 매크로 ( C-x e)를 실행 한 직후 e다시 실행 해야하는만큼 자주 누를 수 있습니다 .
Christian Berg

7
또한, C-/C-x u동등 대안 실행 취소 키 바인딩입니다 C-_. C-/때리는 것이 더 쉽기 때문에 선호합니다 .
Rory O'Kane

8
경고 :이 답변에 C-g C-_"실행 취소 후 다시 실행"이라고 표시되면 처음 조합에 도달했을 때만 적용됩니다. 그런 다음을 사용하지 않고 실행 취소 키를 반복하십시오 C-g. 실행 취소 후 바로 3 번 다시 실행하려면을 입력하십시오 C-g C-_ C-_ C-_. 당신이 입력하면 C-g C-_ C-g C-_ C-g C-_, 당신은 당신의 실행 취소의 재실행을 취소 서클에서 돌아 다니는 것입니다 ...
Rory O'Kane

@ RoryO'Kane 나는 emacs에 대해 잘 모른다. 그래서 내가 틀린 곳을 수정하십시오. 그러나 Cg C-_는 다시 실행 후에 아무런 영향을 미치지 않는다고 생각할 수 있습니다. 취소 (예 : '실행 취소 후 다시 실행'에 해당하는 설명과 같음) 실행 취소 나 다시 실행 등을 다시 실행하는 서클에서 진행되는 것은 그리 많지 않습니다. _ Cg C-_는 첫 번째 원 이후로 원 안에 들어 가지 않으며 문자 그대로 아무 것도하지 않습니다
barlop

56
  • 한 번 실행 취소 하려면C-/
  • 두 번 실행 취소하려면 : C-/ C-/
  • 실행 취소 직후에 한 번 다시 실행 하려면 :C-g C-/
  • 실행 취소 후 즉시 두 번 다시 실행하려면 : C-g C-/ C-/. 주 C-g반복하지 않는다.
  • 즉시 다시 실행 취소 하려면 다음을 수행 하십시오 .C-g C-/
  • 즉시 다시 두 번 실행 취소하려면 다음을 수행하십시오. C-g C-/ C-/
  • 하려면 다시 다시 , 같은 ...

마지막 실행 취소 명령 이후에 아무 키나 (문자 입력 또는 커서 이동) 눌렀다면 C-g다음 실행 취소 / 다시 실행 전에 입력 할 필요가 없습니다 . C-g자체적으로 아무 것도 수행하지 않는 안전한 키이지만 실행 취소 시퀀스의 끝을 알리기 위해 실행 취소 키가 아닌 키로 계산됩니다. 다른 명령을 누르면 C-f작동합니다. 커서가 있던 곳에서 커서를 움직일 수 있습니다.

당신이 충돌하는 경우 C-g또는 다른 명령을 할 때 당신이 의미하지 않았다, 당신은 지금 잘못된 방향으로 취소되어, 단순히 히트 C-g다시 방향을 전환 할 수 있습니다. 원하는 실행 취소에 도달하기 전에 실수로 다시 실행하고 실행 취소를 통해 실행 취소해야하지만, 계속해서 충돌 C-/하면 원하는 상태에 도달하게됩니다. 실제로 C-g한 번 누른 다음 C-/충분한 시간 을 누르면 버퍼가 있었던 모든 상태에 도달 할 수 있습니다 .

에 대한 대안 바로 가기 undo이외는, C-/이다 C-_, C-x u하고 M-x undo.

참조 취소 이맥스의 실행 취소 시스템에 대한 자세한 내용은 매뉴얼 이맥스한다.


38

보다 일반적인 실행 취소 / 다시 실행 기능을 원하는 사용자를 위해 누군가가 작성했습니다 undo-tree.el. Emacs가 아닌 실행 취소의 모양과 느낌을 제공하지만 실행 취소 기록의 전체 '트리'에 액세스 할 수 있습니다.

나는 이맥스의 내장 된 실행 취소 시스템을 좋아하지만이 패키지는 매우 직관적이다.

파일 자체의 주석은 다음과 같습니다.

이맥스는 강력한 실행 취소 시스템을 가지고 있습니다. 대부분의 소프트웨어의 표준 실행 취소 / 재실행 시스템과는 달리, 당신이 복구 할 수 있는 (표준 실행 취소 / 재실행 시스템이 다시 자마자 과거의 상태를 잃을 수있는 반면) 버퍼의 과거 상태. 그러나이 힘은 가격이 책정됩니다. 많은 사람들이 Emacs의 실행 취소 시스템을 혼란스럽고 사용하기 어려워서 덜 강력하지만 직관적 인 실행 취소 / 재실행 시스템으로 대체하는 여러 패키지를 생성합니다.

표준 실행 취소 / 다시 실행으로 인한 데이터 손실과 Emacs의 실행 취소 혼동은 실행 취소 히스토리를 선형 변경 순서로 처리하려고 시도한 결과입니다. 그렇지 않습니다. 이 패키지가 제공하는`undo-tree-mode '는 Emacs의 실행 취소 시스템을 실행 취소 이력을 그대로 처리하는 시스템 인 분기 트리 변경으로 대체합니다. 이 간단한 아이디어를 통해 표준 실행 취소 / 다시 실행 시스템의보다 직관적 인 동작을 기록을 잃지 않는 힘과 결합 할 수 있습니다. 부가적인 부가 보너스는 경우에 따라 실행 취소 이력을보다 효율적으로 저장하여 Emacs가 이력을 폐기하기 전에 더 많은 변경 사항이 누적 될 수 있다는 것입니다.


3
환상적인! 누가 이맥스가 취소 할 수 없다고 말했습니까? :-)
Peter.O

놀랄 만한! 개념적으로 건전하고 직관적입니다. 기본 패키지에 있어야합니다. 한 의견 : 지점으로 되돌릴 때뿐만 아니라 되돌릴 때도 경고 메시지가 표시되기를 바랍니다. 예를 들어, 사용자가 리두를 호출 할 때 : '지점에서 다시 실행'또는 '기본 리두 분기 사용'-하나 이상의 브랜치가 있음을 사용자에게 경고합니다.
바젤 시사 니

1
구현하기가 훨씬 간단하고 비주얼 라이저를 필요로하지 않는이 문제에 대한 또 다른 접근 방식은 마지막 분기 지점 만 유지하고 실행 취소, 다시 실행, 스위치 분기와 같은 3 가지 명령을 제공하는 것입니다. 실행 취소 / 다시 실행은 분기에 도달했을 때 경고를 표시하고 분기에서 다른 분기에 '지점에 없음'메시지 만 발행하면 스위치 분기가 전환됩니다. 분기가 언제라도 발생하면 이전 분기 지점이 손실됩니다. 이것은 상태 손실 문제를 합리적으로 잘 해결하고 최소한의 복잡도로 해결합니다.
바젤 시사 니

1
: 조심이 무작위로 실패 할 수 있습니다 리두에서 오랜 버그가 github.com/syl20bnr/spacemacs/issues/9903 - 2014 년 이후에 대해 알려진
ideasman42

@ ideasman42 분명히 이것은 "비-버그"입니다 : dr-qubit.org/Lost_undo-tree_history.html
Dalker

19

재실행 에 대한 실행 취소 트리 기발한 조심 !

많은 인기있는 "스타터 키트"(전주곡, 퍼셀, 스페이스 맥)는 실행 취소 트리와 함께 제공됩니다. 대부분 (모두?)도 자동으로 활성화합니다. 언급했듯이 실행 취소 트리는 실행 취소 / 재실행 트리를 시각화하고 탐색 할 수있는 편리한 방법입니다. Prelude는 키 코드 ( uu)를 제공합니다 C-x u.

문제는 undo-tree가 redo에 대한 Emacs의 기본 바인딩과 잘 알려진 바인딩을 손상시키는 것 같습니다C-g C-/ .

대신, 이러한 대칭 키를 사용하여 실행 취소 / 다시 실행할 수 있습니다 .

C-/     undo
C-S-/   redo

이 기능은 때때로 비주얼 라이저를 열지 않고 빠르게 다시 실행 하려는 경우에 유용합니다 .


이. Spacemacs를 사용하고 있는데 왜 그것이 작동하지 않는지 알 수 없었습니다. 감사!
mghaoui

11

나는 찾을 redo.el이며 매우 편리한 "정상"실행 취소 / 재실행을 수행하기위한, 그리고 일반적으로 바인딩이 CSZ과 같이, Cz를 실행 취소 :

(when (require 'redo nil 'noerror)
    (global-set-key (kbd "C-S-z") 'redo))

(global-set-key (kbd "C-z") 'undo)

파일을 다운로드하여 lisp-path에 넣고 위의 파일을에 붙여 넣으십시오 .emacs.


redo.el 헤더의 주석은 XEmacs 용으로 작성된 것이라고 말합니다. GNU Emacs 및 기타 관련 Emacsen에서 사용하는 데 문제가 있습니까?
A. Levy

나는 아직 아무런 문제가 없었고, 적어도 6 개월 동안 그것을 사용했습니다 :)
monotux

4
에서 emacswiki.org/emacs/RedoMode : 그러나, redo.el는 아웃 오브 날짜이고 자주 이맥스 (22) RedoPlus이기 때문에 '원시 - 실행 취소'의 행동이 이전과 다소 차이가 되었기 때문에 버퍼 "의 내용을 파괴 올바르게 redo.el의 포크와 이맥스의 최신 버전에서 작동 현재 RedoPlus를 얻을 수 있습니다. emacswiki.org/emacs/redo+.el
rofrol

2

Emacs 28 은 redo 명령 ( undo-redo)을 추가합니다 .

보다 일반적인 실행 취소 / 다시 실행을 원하면 다음 명령을 사용할 수 있습니다.

(global-set-key (kbd "C-z") 'undo-only)
(global-set-key (kbd "C-S-z") 'undo-redo)

1

마지막 작업을 다시 실행하려면 다음을 수행하십시오.

  1. ESC
  2. 다른 실행 취소 ( C + /)

0

기본적으로 Emacs에서 다시 실행하려면 Cg를 누른 다음 실행 취소해야합니다.

그러나 Emacs 내장 실행 취소를 사용하여 다시 실행 명령을 구현할 수도 있습니다.

undo-fu 패키지 는 Emacs 내장 실행 취소 기능을 사용하여 실행 취소 및 재실행을 모두 노출합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.