마지막 텍스트 삽입 반복


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.