キルリングに追加せずにバックスペース


12

Crtl + BackspaceまたはCtrl + Delを使用すると、削除されたテキストがキルリングに追加されます。
これを防ぐにはどうすればよいですか?テキストが削除されたときに、キルリングにテキストを送信する必要はありません。

副次的な質問:とにかくこのデフォルト設定の目的は何ですか?:)


副次的な質問について:を経由せずに削除したもののバックアップコピーを作成することをお勧めしますundo。しかし、ワイルドな推測。
マヌエルウベルティ

回答:


6

ドキュメントによると:

<C-delete>コマンドkill-word(global-mapにあります)を実行し‘simple.el’ます。これは、のインタラクティブなコンパイル済みLisp関数です。

にバインドされてい<C-delete>, M-dます。

(キルワードARG)

単語の終わりに達するまで文字を前方に殺します。引数ARGを使用して、これを何度も行います。

それでは、ソースコードを参照しましょう。

(defun kill-word (arg)                                                                                                     
  "Kill characters forward until encountering the end of a word.                                                           
With argument ARG, do this that many times."
  (interactive "p")
  (kill-region (point) (progn (forward-word arg) (point))))

次に、kill-region関数のドキュメント内で見つけます:

ポイントとマークの間のテキストをキル(「カット」)します。
This deletes the text from the buffer and saves it in the kill ring。コマンド[yank]はそこから取得できます。(リージョンを強制終了せずに保存する場合は、[kill-ring-save]を使用します。)

[...]

Lispプログラムは、テキストを削除するためにこの関数を使用する必要があります。(テキストを削除するには、を使用しますdelete-region。)

さて、さらに先に進みたい場合、これはキルリングにコピーせずに削除するために使用できる機能です:

(defun my-delete-word (arg)
  "Delete characters forward until encountering the end of a word.
With argument, do this that many times.
This command does not push text to `kill-ring'."
  (interactive "p")
  (delete-region
   (point)
   (progn
     (forward-word arg)
     (point))))

(defun my-backward-delete-word (arg)
  "Delete characters backward until encountering the beginning of a word.
With argument, do this that many times.
This command does not push text to `kill-ring'."
  (interactive "p")
  (my-delete-word (- arg)))

(defun my-delete-line ()
  "Delete text from current position to end of line char.
This command does not push text to `kill-ring'."
  (interactive)
  (delete-region
   (point)
   (progn (end-of-line 1) (point)))
  (delete-char 1))

(defun my-delete-line-backward ()
  "Delete text between the beginning of the line to the cursor position.
This command does not push text to `kill-ring'."
  (interactive)
  (let (p1 p2)
    (setq p1 (point))
    (beginning-of-line 1)
    (setq p2 (point))
    (delete-region p1 p2)))

; bind them to emacs's default shortcut keys:
(global-set-key (kbd "C-S-k") 'my-delete-line-backward) ; Ctrl+Shift+k
(global-set-key (kbd "C-k") 'my-delete-line)
(global-set-key (kbd "M-d") 'my-delete-word)
(global-set-key (kbd "<M-backspace>") 'my-backward-delete-word)

ErgoEmacs提供


おかげで解決した。サイド質問はどうですか?:p
ダニエルヒッツェル

3
@DanielHitzel申し訳ありませんが、私はサイドの質問に対する答えがありません:)
Nsukami _

D:だけではないよ私はそう
ダニエルHitzel

4

Emacsの24ので、設定がなくても、あなたはそれを選択し、押してキルリングにそれを追加することなく、任意のテキストを削除することができますBackspaceDelete。マークがアクティブな場合、これらのキーはカーソルの前後の文字を削除するだけでなく、リージョンを削除します。

つまり、削除するテキストの一方の端に移動してCtrl+を押しSpace、もう一方の端に移動して、強調表示された領域を削除Backspace(またはDelete)します。または、一方の端に移動し、Shift移動キーを使用してもう一方の端に移動し、を押しBackspaceます。


まあ、MacOSでのEmacs 25.1の場合はそうではありません。
NVaughan

0

私は同じ問題を抱えており、この方法でより簡単に解決しました:

(global-set-key (kbd "<backspace>")
          '(lambda () (interactive) (backward-delete-char-untabify 1 nil)))

呼び出し(backward-delete-char-untabify 1 nil)は、Emacsに1文字(1パラメーター)を逆方向に削除し、リング(nilパラメーター)へのコピーを控えるように指示します。パラメータを持つ関数をキーにバインドしているため、ラムダ(つまり匿名)関数が必要です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.