emacs, 영역을 복사하고 강조 표시하는 방법은 무엇입니까? (exchange-point-and-mark) (exchange-point-and-mark)대화식 기능 에서만

나는 (kill-ring-save)명령을 실행할 때 지역의 하이라이트를 잃는 기본 Mw에 만족 합니다. 나는 그 행동을 바꾸고 싶지 않지만 <C-insert>비슷한 행동을 수행하고 지역의 하이라이트를 유지하기 위해 리 바인드하고 싶습니다 .

transient-mark-mode직접 및 기능을 통해 설정을 시도했지만 (해제) 해당 지역은 여전히 ​​강조 표시되지 않습니다.

(kill-ring-save (region-beginning) (region-end))대화식 기능 에서만 실행 하면 예상대로 작동합니다. 강조 표시를 잃습니다.

(exchange-point-and-mark) (exchange-point-and-mark)대화식 기능 에서만 실행 하면 예상대로 작동합니다. 영역을 다시 강조 표시하고 원래 / 올바른 위치에 지점을 둡니다.

그러나 그것들을 모두 함수 로 만들면 지역이 다시 강조 표시 되지 않습니다 . 작동하지 않는 기능과 바인딩은 다음과 같습니다.

(defun kill-ring-save-keep-highlight ()
  (interactive)
  (kill-ring-save (region-beginning) (region-end))
  (exchange-point-and-mark) (exchange-point-and-mark)
)
(global-unset-key (kbd "<C-insert>"))
(global-set-key   (kbd "<C-insert>") 'kill-ring-save-keep-highlight)

사용 : Ubuntu 10.04.3의 GNU Emacs 23.1.1



답변

Running kill-ring-save은 마크를 직접 비활성화하지 않지만 나중에 비활성화를 수행하기 위해 변수 deactivate-markt로 설정합니다 . 이를 방지하려면 재설정 을 하기 전에 비활성화.deactivate-marknil

(defun kill-ring-save-keep-highlight (beg end)
  "Keep the region active after the kill"
  (interactive "r")
  (prog1 (kill-ring-save beg end)
    (setq deactivate-mark nil)))

(global-set-key (kbd "<C-insert>") 'kill-ring-save-keep-highlight)

답변

마크가 “활성화”되어 있기 때문에 영역이 강조 표시되므로 마크를 명시 적으로 활성화하면 트릭이 수행됩니다. 참고 : 왜 포인트 / 마크 교환이 작동하지 않는지 잘 모르겠습니다. 업데이트 된 함수가 있습니다. 또한 대화식을 사용하여 인수를 채우도록 업데이트했습니다.

(defun kill-ring-save-keep-highlight (beg end)
  "Keep the region active after the kill"
  (interactive "r")
  (kill-ring-save beg end)
  (activate-mark))