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


81

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

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



2
당신이 첫번째 질문 두번째 질문에 대한 마크 텍스트 키보드의 백 스페이스 버튼을 사용할 수 있습니다, 내 대답은 아래를 참조
케빈 Zhu의

블록을 정의한 후에는 Cx rk가 아닌가요?
yalu2015

답변:


49

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

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

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


33
또한 최신 버전의 Emacs를 사용하면 delete-regionBackspace가 지금 그렇게하기 때문에 키 에 바인딩 할 필요조차 없습니다 . 백 스페이스는 선택한 영역을 죽이는 대신 삭제합니다. 즉, 백 스페이스는 선택한 텍스트를 죽이는 링에 저장 / 푸시하지 않고 지 웁니다. 의 값이 때문입니다 delete-active-region입니다 t당신이 다른 값으로 정의하지 않는 한.
유지상 2013-03-15


21

나는 같은 문제가 있었다. 내가 지금까지 얻은 가장 가까운 것은 본질적으로 작은 함수를 만드는 것입니다.

(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)))

1
왜 (delete-region (line-beginning-position) (line-end-position))이 아닌가?
CodyChan

나열된 기능은 좋게 들렸지 만 일반적으로 작동하지 않았습니다. 특히, yank 포인터가 일반적으로 (사실 거의 항상?) 목록의 다음 요소가 아닌 킬링의 다른 쪽 끝을 가리키게하는 것을 발견했습니다! ( 'kill-line'위임을 통해 안정적으로 작동하는 기능을 해킹하려고합니다 ... 아마도 다른 사람들이 한 것처럼 delete-region에 의지 할 것입니다 ...)
pnkfelix

11

EmacsWiki 에서 발췌 :

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

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

최고의 답변 IMO. 그리고 영역을 삭제하기 위해 ctrl-shift-W를 바인딩했습니다 : (global-set-key (kbd "CSw") 'delete-region)
Tongfa

5

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


현재 세션에서만 이상하게 수행됩니다. emacs 외부에서는 킬 링에서 제거되지 않습니다!
PascalVKooten

4

두 번째 질문의 경우, 다른 방법에 DeleteSelectionMode 당신은 사용할 수 있습니다 CUA 모드 를 추가하면 C-반환으로 활성화 멋진 사각형 선택 모드를 제공합니다. CUA 모드는 22.1 이후 emacs의 일부입니다.


3

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

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

;; 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)

문제는이 명령이 항상 줄 바꿈도 삭제하는 반면, kill-line은 변수 kill-whole-line의 값이 nil이 아닌 경우에만 줄 바꿈을 삭제한다는 것입니다. "(delete-char 1)"을 "(if kill-whole-line (delete-char 1))"로 변경하는 것이 좋습니다.
Alan

3

대부분의 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)))

어떻게 작동합니까? 이것에 대한 더 많은 정보가 있습니까? 이것은 놀랍습니다.
sinekonata

1
cl-letf동적 범위가있는 함수의 로컬 바인딩을 만들 수 있습니다. 즉, 그것은 단지 내부 코드에 대한 효과에있어 cl-letf,하지만 전체 호출 트리에 적용 (예를 kill-region직접적으로 나타나지 않는다 body, 그러나 kill-word전화 kill-region와 그 대체됩니다 delete-region).
jpkotta

.NET Framework의 다른 이름에 처음 바인딩하는 경우 대체에서 원래 함수를 호출 할 수도 있습니다 cl-letf. 그런 의미에서 cl-letf작동합니다 let*.
jpkotta

요점을 알지만 여전히 기술적 인 부분입니다. 저는 파이썬에 대한 중간 경험이 거의 없습니다. 이 "덮어 쓰기"/ 다시 쓰기 / 포킹 기능의 일반적인 이름은 무엇입니까? lisp와 같은 언어의 특정 기능입니까?
sinekonata 20.11.09

이 기술의 일반적인 이름이 정확히 무엇인지 잘 모르겠습니다. 나는 그것을 함수의 동적 범위로 설명 할 것이라고 생각하며 남용하기 매우 쉽기 때문에 대부분의 언어에서 일반적이지 않습니다. Emacs는 대부분의 언어가 사용하는 어휘 범위로 천천히 이동하고 있습니다. 일반적으로 Python에서 할 수 있는지 잘 모르겠습니다. 특정 범위에서 함수를 재정의 할 수 있도록 코드를 디자인해야합니다.
jpkotta 2010

2

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

내 구현과 동기는 다음과 같습니다.

(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에 영향을받은 다른 상황과 달리에 실제로 영향을주지 않습니다 .


2
OS 클립 보드에서 붙여 넣기를 망치지 않기 때문에이 답변을 선호합니다 (OS 클립 보드의 내용이 손실되어 킬 링에서 마지막 항목을 삭제해도 도움이되지 않음)
Brel

kill 함수의 정의를 복사하지 않고 이것을 수행하는 방법에 대한 내 대답을 확인하십시오.
jpkotta

1
(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)

나는 이것을 좋아한다. 그러나 나는 일시적인 마크 모드를 사용하지 않기 때문에 나는 delete-region 줄을 제외하고는 "insert-register-content-z"를 선호한다.
Joshua Goldberg

1

다음과 같이 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 엉망진창 킬링

1

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

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

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


0

여기 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이제는 킬링을 변경하지 않고 텍스트를 삭제합니다.


0

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

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

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

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

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

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


0

모든 답변을 보완합니다. 삭제할 elisp 코드를 작성하면 다음과 같은 로컬 킬링 객체를 사용하는 한 kill하는 함수를 호출 할 수 있습니다.

(defun delete-something()
  "Delete something without storing in kill ring."
  (let (kill-ring)
     (kill-something)))

무언가를 죽이는 대신 무언가를 죽이는 기능을 사용하십시오. 그러면 함수가 삭제되고 실제 킬링에는 아무것도 기억되지 않습니다.

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