마지막 텍스트 삽입 반복


10

Vim에서을 눌러 .텍스트 삽입을 포함하여 최신 변경 사항을 반복 할 수 있습니다 .

Emacs C-x z에서는 마지막 명령 만 반복합니다. 나는 여기서 매크로를 사용할 수 있다는 것을 알고 있지만, 종종 같은 텍스트를 너무 늦게 다시 삽입해야한다는 것을 알고 있습니다. 다시 번만 다시 삽입해야 할 때 매크로를 정의하면 의미가 없습니다.

Q : Emacs 내부에 텍스트 삽입을 반복하는 방법이 있습니까?


1
반복하려는 "텍스트"는 무엇입니까? 기술적으로 말하면 마지막 삽입은 마지막 문자 일뿐이며 아마도 당신이 추구하는 것이 아닙니다. 그렇다면 목적에 맞게 "텍스트 삽입"을 어떻게 정의 하시겠습니까? 그것을 명확히하면 그것을 달성하는 방법을 찾는 데 도움이 될 수 있습니다.
T. Verron

흠 좋은 질문- 마지막 연속 버퍼 수정 을 정의하는 방법 . 아마도 버퍼 수정 ( C-f, 검색 등) 의 결과가 아닌 두 점 이동 사이의 버퍼 수정 입니까? 말이된다면 ...
ooi

레시피로 원하는 것을 명확하게하십시오. 많은 종류의 "삽입"이 있습니다 (텍스트 삽입 방법). 대화식으로 삽입하고 있습니까? 그렇다면 어떻게?
Drew

대화식으로. 그러나 이상적으로는 어떻게 또는 무엇이 중요하지 않습니다. 그건 내가 매크로 정의를 시작하는 것을 잊었다 것처럼 . 어떤 경우에 문제는 언제 입니까? 어쩌면 일부 후크 가 사용될 수 있습니다.
ooi

2
Emacs에서 '마지막 삽입'을 어떻게 정의합니까? vi와 같이 편집 / 명령 모드 스위치가 없기 때문에 역사에서 얼마나 멀리 가야합니까? 일반적으로 "마지막 삽입"( C-space, 커서 이동, M-w복사)을 선택한 다음 C-y필요한만큼 붙여 넣습니다.
Alain

답변:


7

dot-mode"입력 또는 명령을 반복하는 부 모드"이며 필요한 작업을 수행 할 수 있습니다. 기본적으로 마지막 삽입 / 삭제를 반복합니다. .Vi (m) 과 비슷합니다 .


2
무엇 않습니다 는 무엇입니까?
Malabarba

1
Emacs.SE에 오신 것을 환영합니다. 지금, 당신은 대답보다 대답에 더 가깝습니다. dot-modeOP가 가져 오려는 기능과 기능을 어떻게 제공하는지 설명하기 위해 편집 해 주 시겠습니까?
Dan

7

그건 내가 매크로 정의를 시작하는 것을 잊었다처럼

이를 위해 kmacro-edit-lossage( C-x C-k l)를 사용할 수 있습니다 . 300 개의 마지막 키 입력 (간단한 삽입 포함)을보고 매크로로 편집 할 수 있습니다.

간단히 사용하려면 반복하려는 삽입의 시작 부분을 찾고 "매크로 :"에서 해당 지점까지의 모든 텍스트를 삭제 한 다음을 누릅니다 C-c C-c. 이제 처음에 기록하는 것을 잊지 않은 것처럼 동일한 작업을 수행하는 데 사용할 수있는 매크로가 있습니다.

슬프게도, 마지막 300 번의 키 입력에 마우스 클릭이 포함되어 있으면 실패합니다.

편집 : 다음 코드는 마지막 마우스 이벤트 이후의 키만 유지되도록 변경합니다.

(defadvice recent-keys (after tv/recent-keys-no-mouse first ())
  "Return only the keys since the last mouse event"
  (let* ((vec ad-return-value)
         (lst (append vec nil))
         (nmax (length vec))
         (i (- nmax 1)))
    (while
        (and
         (>= i 0)
         (not
          (let ((mod (event-modifiers (elt vec i))))
            (or (memq 'click mod)
                (memq 'double mod)
                (memq 'triple mod)
                (memq 'drag mod)
                (memq 'down mod)))))
      (setq i (- i 1)))
    (setq ad-return-value (vconcat (nthcdr (+ i 1) lst) nil))))

(defun tv/kmacro-edit-lossage-no-mouse ()
  "Same as `kmacro-edit-lossage', but fallback if the keys contain mouse events.

Source: http://emacs.stackexchange.com/a/4071/184"
  (interactive)
  (ad-activate-regexp "tv/recent-keys-no-mouse")
  (call-interactively #'kmacro-edit-lossage)
  (ad-deactivate-regexp "tv/recent-keys-no-mouse"))

;; If you want this function to replace the default one, uncomment this line:
; (global-set-key (kbd "C-x C-k l") 'tv/kmacro-edit-lossage-no-mouse)

나는 종종 마우스를 사용하여 스크롤하지만 매크로에서 매크로를 제거하는 방법을 보는 것이 좋습니다.
ooi

와우,이 명령은 마지막 300 번의 마우스 클릭이 포함 되어도 완전히 실패하지 않으면 유용합니다. 클릭 수를 포함시키지 않고 작업 거부를 알리는 대신 사용자에게 알릴 수도 있습니다.
nanny

@nanny 나는 오류 메시지로 실패하는 것보다 (imo) 더 나은 대체를 가능하게하기 위해 elisp를 추가했습니다.이 기능을 사용하면 마지막 마우스 이벤트 이후의 키 만 유지됩니다. 마우스 이벤트를 완전히 삭제하는 것도 가능하지만 매크로의 결과는 다소 예측할 수 없습니다.
T. Verron

@ooi 당신이 이전 코멘트에 의해 자동으로 핑을 받았는지 전혀 모른다. 그래서 당신의 핑도 여기있다.
T. Verron

고마워, 나는 똑같은 일을하고 있었다. 의 인수를 필터링하는 것이 가능할 수 있다고 생각합니다 edmacro-fix-menu-commands. 마우스 이벤트를 무시할 수있는 선택적 인수가 필요합니다. 그러나 조언 시스템이 제대로 작동하는지 알 수 없습니다.
nanny

4

dabbrev-expand함수가 트릭을 수행 할 수 있다고 생각 합니다. emacs, emotion, emoji 등의 단어를 이미 입력했다고 가정 해 봅시다. 다음에 'em'으로 시작하는 단어를 입력하면 입력 할 수 M-/있고 emacs는 이미 삽입 된 단어 중 하나를 삽입하도록 제안합니다 'em'으로 시작합니다. 계속 타격 M-/하면 이맥스에 '이모티콘', '이모티콘', 그리고 ...

repeat-complex-command를 살펴볼 수도 있습니다 . 가장 일반적인 예는 query-replace항상 동일한 인수를 사용하여 여러 버퍼에서 명령을 반복하고 "pitt"를 "patt"로 바꾸는 것입니다.

한 번 실행하고 다른 창으로 이동 한 후 C-x ESC ESC다시 입력 하여 입력 하십시오.

그리고 끝내기 위해 반복 삽입을 제안 할 수 있습니까? 이 el 파일은 어떤 종류의 논리를 사용하여 삽입하는 데 도움이됩니다. "마지막 삽입을 반복하지만 각 반복마다 인수가 변경됩니다.

이 예제는 el 파일 에서 찾을 수 있습니다 .

;; You can also iterate over lists:
;;   My desk is cluttered
;;   My desk is a real mess
;;   My desk is very hard to see
;;   My desk is buried
;;
;; from m-x insert-patterned
;;    ";;   My desk is %s"
;;    (cluttered "a real mess" "very hard to see" buried)

도움이 되길 바랍니다.


1
어쩌면 당신은 조금 확장 할 수 있습니다 ...
T. Verron

@ T.Verron Done :)
Nsukami _

1
반복 복잡한 명령은 repeat(OP가 언급 한) 것과 비슷 하지만 텍스트 삽입에는 유용하지 않습니다. Repeat-insert매크로처럼 텍스트를 삽입하기 전에 고려해야합니다. 그러나 dabbrev-expand좋은 생각입니다!
T. Verron December
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.