ProgramingTip

Emacs : 킬 링없이 텍스트를 삭제하는 방법?

bestdevel 2020. 10. 12. 07:55
반응형

Emacs : 킬 링없이 텍스트를 삭제하는 방법?


텍스트 대신 다른 텍스트 잡아 당길 수있는 일부 텍스트를 삭제하고 싶습니다 . 어떻게 할 수 있습니까? Cw는 선택한 텍스트를 잘라내어 링을 죽이고 내가 잡아 당기고 싶은 텍스트없이 끝납니다.

또한 버튼을 누르지 바로 텍스트 대신 텍스트를 직접 잡아 당기는 것이 좋습니다?


M-x delete-region자주 입력 하지만 키에 바인딩 할 수 있습니다.

최신 버전의 Emacs에서 선택 모드 삭제를 사용하면 명령을 입력 할 필요가 없습니다.

기본적으로 텍스트 삽입은 마크가 활성 상태 인 경우에도 발생합니다. 예를 들어 a를 입력하면 문자 'a'가 삽입 된 다음 마크가됩니다. 보조 모드 인 삭제 선택 모드는 동작을 수정합니다. 해당 모드를 활성화 한 다음 마크가 활성화 된 상태에서 텍스트를 삽입하면 영역의 텍스트가 먼저 삭제됩니다. 또한 일반적으로 같은 단지 하나의 문자를 삭제하는 것이 명령 C-d또는 DEL대신 전체 영역을 삭제합니다. 선택 삭제 모드를 켜거나 끄려면 다음을 입력합니다.M-x delete-selection-mode.


M-yafter C-y사용 하여 킬 링에서 이전 항목을 삽입하거나 browse-kill-ring 패키지를 사용할 수 있습니다 .

두 번째 질문에 관한 DeleteSelectionMode를 참조하십시오 .


나는 같은 문제가 있었다. 내가 지금까지 얻은 가장 가까운 것입니다.

(defun ruthlessly-kill-line ()
  "Deletes a line, but does not put it in the kill-ring. (kinda)"
  (interactive)
  (move-beginning-of-line 1)
  (kill-line 1)
  (setq kill-ring (cdr kill-ring)))

EmacsWiki 에서 발췌 :

‘kill-line’( ‘C-k’) 와 동일 하지만 킬링 부작용이 없습니다.

(delete-region (point) (line-end-position))

Mx eval-expression (setq kill-ring (cdr kill-ring))-kill-ring에서 마지막 항목을 제거합니다.


두 번째 질문에는 DeleteSelectionMode 대신 C-Return에 의해 활성화 된 멋진 사각형 선택 모드를 추가로 제공하는 CUA 모드활성화 할 수 있습니다 . CUA 모드는 22.1 이후 emacs의 일부입니다.


이것에 대한 답을 찾았습니다.

여기에 먼저 게시했습니다 .

;; Ctrl-K with no kill
(defun delete-line-no-kill ()
  (interactive)
  (delete-region
   (point)
   (save-excursion (move-end-of-line 1) (point)))
 (delete-char 1)
)
(global-set-key (kbd "C-k") 'delete-line-no-kill)

기술적으로 다른 답변은 첫 번째 부분에서 잘못되었습니다.

내 구현 및 동기는 다음과 가변적입니다.

(defun delete-word (arg)
  "Delete characters backward until encountering the beginning of a word.
With argument ARG, do this that many times."
  (interactive "p")
  (delete-region (point) (progn (backward-word arg) (point))))

에서 " kill-word"에서 코드를 수정 했습니다 simple.el. kill-region으로 delete-region로 전환 forward-word했습니다 backward-word. 이렇게하면 kill-ringemacs 외부에서 kill-ring영향을받은 다른 상황과 달리에 실제로 영향을주지 않습니다 .


(defun copy-to-register-z (p1 p2)
  "Copy text selection to register named “z”."
  (interactive "r")
  (copy-to-register ?z p1 p2))
(defun replace-register-content-z (p1 p2)
  "Replace register named “z”'s content."
  (interactive "r")
  (delete-region p1 p2)
  (insert-register ?z))
(global-set-key (kbd "C-c c") 'copy-to-register-z)
(global-set-key (kbd "C-c v") 'replace-register-content-z)

다음과 같이 kill-region 및 kill-line 키 Cw 및 Ck에 해당하는 삭제를 추가합니다. 키 Cv 및 Cz에 바인딩됩니다.

;; delete-region에 대한 키 바인딩은 "Windows CUT Ctrl-x에 해당"합니다.
;; 사용할 키 바인딩은 선택하기가 어색합니다.
;; Cv "Windows PASTE Ctrl-v"를 사용하는 것은 상당히 상당히 파괴적인 옵션입니다.
;; Cv = 내가 사용하지 않는 emacs에서 위로 스크롤합니다.
(global-set-key (kbd "Cv") 'delete-region))

;; Ck (kill-line) 대신 "Windows CUT"를 사용하여 다음을 수행 할 수 있습니다.
(defun delete-line () "줄 삭제, 킬 링에서 빼내십시오.이 func를 Cz에 바인딩"
 (인터렉티브)
 (setq 마지막 명령 '줄 삭제)
 (킬라 인)
 (setq 킬링 (cdr 킬링))
 (setq kill-ring-yank-pointer kill-ring)
 (setq 마지막 명령 '줄 삭제)
)
(글로벌 세트 키 (kbd "Cz") '삭제 라인)
;; 마지막 명령을 설정하지 않고 2+ C-zs 엉망진창 킬링

첫 번째 질문에 대한 나의 대답 : emacs에서 텍스트를 표시 (마우스 대신 또는 세트 표시 사용 C-SPC)하고 키보드에서 "<-백 스페이스"버튼을 사용 C-w합니다. 이런 식으로 시스템 클립 보드의 텍스트 위에 넣을 수 있습니다.C-w

이 답변의 배경 : 때때로 emacs에서 영역을 대체하는 데 사용하려는 emacs 외부 텍스트를 받았을 때, 해당 텍스트를 먼저 시스템 클립 보드 (예 : Windows Ctrl + C) 에 복사 한 다음 C-win emacs에서 " 나중에 M-w클립 보드에있는 내 텍스트를 킬링에서 복구 할 수 있기를 바라면서 교체하려는 텍스트 영역을 삭제하십시오 . 불행히도 클립 보드는에 의해 죽인 텍스트에 의해 무시되고 C-w클립 보드의 원본 메시지는 절대로 킬링에 표시되지 않습니다.

두 번째 질문의 경우 항상 emacs에서 텍스트를 먼저 표시 한 다음 직접 표시 할 수 있습니다. C-y


대부분의 kill 함수는 kill-region텍스트를 죽이는 실제 작업을 수행하는 데 사용 됩니다. lisp 매크로를 사용하여 kill 함수에서 삭제 함수를 만듭니다.

(defmacro jpk/delete-instead-of-kill (&rest body)
  "Replaces `kill-region' with `delete-region' in BODY."
  `(cl-letf (((symbol-function 'kill-region)
              (lambda (beg end &optional yank-handler)
                (delete-region beg end))))
     ,@body))

(defun jpk/delete-word (arg)
  "Like `kill-word', but does not save to the `kill-ring'."
  (interactive "*p")
  (jpk/delete-instead-of-kill (kill-word arg)))

여기 kill-region에 킬링에 값을 강제하지 않는 버전이 있습니다.

(defun kill-or-delete-region (beg end prefix)
  "Delete the region, storing it in the kill-ring.
If a prefix argument is given, don't change the kill-ring."
  (interactive "r\nP")
  (if prefix
      (delete-region beg end)
    (kill-region beg end)))

(global-set-key (kbd "C-w") 'kill-or-delete-region)

이를 통해 C-w이전과 같이 할 수 있지만 C-u C-w이제는 킬링을 변경하지 않고 텍스트를 삭제합니다.


킬 링없이 텍스트를 삭제하는 방법?

delete-region기능은 킬 링에 추가하지 않고 선택한 영역을 삭제합니다.

또한 버튼을 누르지 않고도 텍스트 대신 텍스트를 직접 잡아 당기는 것이 가능합니까?

선택한 영역의 텍스트를 이미 킬 링에 넣은 텍스트로 바꾸는 방법을 묻는 것 같습니다.

설정 (delete-selection-mode 1)을 통해 선택한 영역 위에 홱 잡아 당기거나 붙여 넣을 수 있습니다. 또한 선택한 영역을 입력하고 바꿀 수도 있습니다.

OS XI의 버전 25.1.1 (setq select-enable-primary nil)에서는 선택한 영역을 킬 링에 복사하지 못하도록 추가 해야했습니다.

참고 URL : https://stackoverflow.com/questions/637351/emacs-how-to-delete-text-without-kill-ring

반응형