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


81

一部のテキストを削除して、代わりに他のテキストをヤンクできるようにします。どうやってやるの?Cwは選択したテキストをカットしてリングを強制終了し、ヤンクしたいテキストが表示されなくなります。

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



2
以下の私の答えを参照してください。最初の質問にはキーボードのBackspaceボタンを使用し、2番目の質問にはテキストをマークすることができます
Kevin Zhu

ブロックを定義した後は、Cx rkだけではありませんか?
yalu2015 2014年

回答:


49

私はM-x delete-regionかなり頻繁に入力しますが、キーにバインドすることができます。

削除]選択モードのEmacsの新しいバージョンでは、あなただけの入力を開始コマンドを入力する必要はありません。

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


33
また、最新バージョンのEmacsでは、delete-regionBackspaceがバインドするようになったため、キーにバインドする必要さえありません。Backspaceは、選択された領域を強制終了する代わりに削除します。つまり、Backspaceは、選択されたテキストを保存/強制終了リングにプッシュせずに消去します。値がためですdelete-active-regionですtあなたには、いくつかの他の値にそれをカスタマイズしていない限り。
Jisang Yoo 2013


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 2017年

記載されている機能は良さそうに聞こえましたが、一般的には機能しませんでした。特に、ヤンクポインタがキルリングのもう一方の端を指すようになることがわかりました。これは一般に(実際にはほとんど常に?)リストの次の要素ではありません!(「kill-line」への委任を介して確実に機能する関数をハックしようとしています...他の人が行ったように、単にdelete-regionに頼るでしょう...)
pnkfelix 2018

11

EmacsWikiから取得

‘kill-line’‘C-k’)と同等ですが、キルリングの副作用はありません。

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

ベストアンサーIMO。そして、ctrl-shift-Wをバインドして領域を削除しました:(global-set-key(kbd "CSw") 'delete-region)
Tongfa 2017年

5

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


それは、現在のセッションに対して奇妙なことにそれを行うだけです。emacsの外では、キルリングから削除されません!
pascalVKooten 2012年


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-char1)」を「(ifkill-whole-line(delete-char1))」に変更することをお勧めします。
アラン

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

で最初に別の名前にバインドした場合は、元の関数をその置換から呼び出すこともできますcl-letf。 その意味でのcl-letfようlet*に動作します。
jpkotta

私はそれの要点を理解します、それはまだ私には技術的すぎます。私はPythonの中間的な経験はほとんどありません。この「上書き」/書き換え/フォーク機能の一般的な名前は何ですか?それはlispのような言語の特定の機能ですか?
sinekonata

このテクニックの一般的な名前が何であるか正確にはわかりません。関数の動的スコープとして説明すると思いますが、悪用されやすいため、ほとんどの言語では一般的ではありません。Emacsは、ほとんどの言語で使用されている字句スコープにゆっくりと移行しています。一般的にPythonでそれを実行できるかどうかはわかりません。特定のスコープで関数をオーバーライドできるように、コードを設計する必要があります。
jpkotta

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-regiondelete-regionしてforward-wordのためにbackward-word。このようにkill-ring、emacsの外で、kill-ringが影響を受けていることに気付いた他の状況とは異なり、それは本当に影響を与えません。


2
OSクリップボードからの貼り付けを台無しにしないので、私はこの答えを好みます(OSクリップボードにあるものが失われるため、キルリングから最後のものをドロップしても役に立ちません)
Brel 2013年

kill関数の定義をコピーせずにこれを行う方法については、私の答えを確認してください。
jpkotta 2015

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 CUTCtrl-x相当」を提供します。
;; どのキーバインディングを使用するかは、選択するのが面倒です。
;; Cvの使用「WindowsPASTECtrl-v」は、かなり破壊的なオプションです。
;; Cv =私が役に立たないemacsで上にスクロールします。
(global-set-key(kbd "Cv") 'delete-region)

;; Ck(キルライン)の代わりに「WindowsCUT」を使用するには、次のようにします。
(defun delete-line() "行を削除し、キルリングから取り出します。この関数をCzにバインドします。"
 (インタラクティブ)
 (setq last-command'delete-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がキルリングを台無しにする

1

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

この回答の背景:emacsの領域を置き換えるために使用したい、emacsの外部のテキストを取得したとき、最初にそのテキストをシステムクリップボード(つまりWindows Ctrl + C)にコピーし、次にC-wemacsで "を実行することで間違いを犯すことがよくありました。後でM-wクリップボード内のテキストをkill-ringから復元できることを期待して、置き換えたいテキストの領域を削除します。残念ながら、クリップボードはによって強制終了されたテキストによって上書きされるだけC-wであり、クリップボード内の元のメッセージが強制終了リングに表示されることはありません。

2番目の質問の場合、はい、いつでも最初に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-ringオブジェクトを使用している限り、killする関数を呼び出すことができます。

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

kill-somethingの代わりに何かをkillする関数を使用してください。その後、関数は削除され、実際のキルリングには何も記憶されません。

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