web-dev-qa-db-ja.com

Emacs:キルリングなしでテキストを削除する方法は?

一部のテキストを削除して、他のテキストをヤンクできるようにしたい代わりにどうやってやるの? C-wは選択したテキストをカットしてリングをキルし、ヤンクしたいテキストなしで終了します。

また、テキストを直接ヤンクすることは可能ですか代わりにテキストを強制終了せずにテキストを強制終了することもありませんか?

78
mannicken

M-x delete-regionをよく入力しますが、キーにバインドできます。

Emacsの新しいバージョンの Delete Selection Mode を使用すると、コマンドを入力する必要がなく、入力を開始するだけです。

デフォルトでは、マークがアクティブであってもテキストの挿入は通常行われます。たとえば、aを入力すると、文字「a」が挿入され、マークが非アクティブになります。マイナーモードである選択モードの削除は、この動作を変更します。そのモードを有効にすると、マークがアクティブなときにテキストを挿入すると、領域内のテキストが最初に削除されます。また、次のように、通常は1文字だけを削除するコマンド C-d または DEL、代わりにリージョン全体を削除します。 [選択の削除]モードをオンまたはオフに切り替えるには、M-x delete-selection-mode.と入力します

46
ashawley

M-yの後にC-yを使用して、キルリングから前のアイテムを挿入するか、または browse-kill-ring パッケージを使用できます。

2番目の質問については、「 DeleteSelectionMode 」を参照してください。

36
Eugene Morozov

同じ問題がありました。私がこれまでに得た最も近いものは、本質的に次のような小さな関数を作成することです。

(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)))
20
Haakon Løtveit

EmacsWiki から取得:

‘kill-line’‘C-k’)と同等ですが、kill-ring副作用はありません。

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

M-x eval-expression(setq kill-ring(cdr kill-ring))-kill-ringから最後のアイテムを削除します

5
Evgeny

2番目の質問では、代わりに DeleteSelectionMode を有効にすることができます CUAモード を有効にすると、C-Returnで有効にできる素敵な長方形の選択モードが追加されます。 CUAモードは、22.1以降、emacsの一部です。

4
danielpoe

これに対する答えが見つかりました。

最初に投稿 ここ

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

技術的には、他の答えは最初の部分で間違っています。

これが私の実装と動機です:

(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-regiondelete-regionforward-Wordbackward-Wordに切り替えました。このようにすると、emacsの外でkill-ringが影響を受けている他の状況とは異なり、kill-ringはTRUELYに影響しません。

2
PascalVKooten
(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)
1
ZBeginner

ほとんどのkill関数はkill-regionを使用して、テキストをkillする実際の作業を行います。 LISPマクロを使用して、kill関数からdelete関数を作成します。

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

最初の質問に対する私の答え:(マウスまたはセットマークC-SPCを使用して)テキストをemacsでマークし、C-wではなくキーボードの[<-Backspace]ボタンを押します。この方法でも、C-wによって強制終了されたテキストによってクリップボードが上書きされることを心配することなく、システムクリップボードのテキストを貼り付けることができます。

この回答の背景:emacsの領域を置き換えるために使用したいテキストをemacsの外に受け取ったとき、最初にそのテキストをシステムクリップボードにコピーして(つまりWindowsでCtrl + C)、 a置換したいテキストの領域を「削除」するためのemacsのC-w。後でM-wを使用すると、クリップボードのテキストをキルリングから回復できると期待しています。残念ながら、クリップボードはC-wによってkillされたテキストによって単に上書きされ、クリップボードの元のメッセージはkill-ringに表示されません。

2番目の質問の場合、はい、常に最初にemacsでテキストをマークし、次に直接C-yをマークできます。

1
Kevin Zhu

次のように、kill-regionおよびkill-lineキーに相当する削除C-wおよびC-kを追加します。キーC-vおよびC-zにバインドされています。

 ;; delete-regionへのキーバインドは、優れた「Windows CUT Ctrl-xの同等機能」を提供します。
 ;;どのキーバインディングを使用するかは、選択するのが面倒です。
 ;; C-v "Windows PASTE Ctrl-v"の使用はかなり破壊的なオプションです。
 ;; C-v =使用しないemacsで上にスクロールします。
(global-set-key(kbd "C-v") 'delete-region)
 
 ;; Ck(kill-line)の代わりに "Windows CUT"を使用するには、次のようにします:
(defun delete-line() "delete line、take it out of kill ring。bind this func to Cz" 
(インタラクティブ)
(setq last-command 'delete-line)
(kill-line)
(setq kill-ring(cdr kill-ring)) 
(setq kill-ring-yank-pointer kill-ring)
(setq last-command 'delete-line)
)
(global-set-key (kbd "Cz") 'delete-line)
 ;;最後のコマンドの設定なし2+ C-zsはkill-ring 
を台無しにします
1
James Coleman

キルリングなしでテキストを削除するには?

delete-region関数は、killリングに追加せずに選択した領域を削除します

また、ボタンを押して強制終了することなく、一部のテキストの代わりにテキストを直接ヤンクすることは可能ですか?

選択した領域のテキストを、すでにキルリングに配置したものに置き換える方法を尋ねていると思います。

(delete-selection-mode 1)を設定すると、選択した領域をヤンク/貼り付けできます。また、選択した領域を入力して置き換えることもできます。

OS Xのバージョン25.1.1では、選択したリージョンがキルリングにコピーされないように、(setq select-enable-primary nil)も追加する必要がありました。

0
kevincasey

以下は、キルリングに値を強制しない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
Wilfred Hughes