回答:
を使用kill-whole-line
して、ラインポイントがオンになっている行全体を強制終了できます。ポイントの位置は関係ありません。このコマンドはC-S-DELデフォルトでバインドされています。
変数を値以外に設定して、行全体を強制終了するように指示することもできますkill-line
(にバインドC-k)。 kill-whole-line
nil
(setq kill-whole-line t)
これが機能するには、ポイントが行の先頭にある必要があることに注意してください。
次に、次の2つのgemがあります(emacs-fu経由):
(defadvice kill-region (before slick-cut activate compile)
"When called interactively with no active region, kill a single line instead."
(interactive
(if mark-active
(list (region-beginning) (region-end))
(list (line-beginning-position) (line-beginning-position 2)))))
(defadvice kill-ring-save (before slick-copy activate compile)
"When called interactively with no active region, copy a single line instead."
(interactive
(if mark-active
(list (region-beginning) (region-end))
(message "Copied line")
(list (line-beginning-position) (line-beginning-position 2)))))
これらを配置すると、1回のキーストロークでラインポイントをオンまたはオフにすることができます。
そこに活性領域があり、場合ことを注意kill-region
してkill-ring-save
、彼らは通常、何をやっていきます:キルまたはそれをコピーします。
slick-cut
とslick-copy
新しいアドバイスシステムEmacs 24.4は新しいアドバイスシステムを導入しています。一方でdefadvice
まだ動作し、それはEmacsの将来のバージョンで新システムの賛成で廃止されるかもしれないという可能性があります。そのために、更新されたバージョンのslick-cut
およびを使用することをお勧めしますslick-copy
。
(defun slick-cut (beg end)
(interactive
(if mark-active
(list (region-beginning) (region-end))
(list (line-beginning-position) (line-beginning-position 2)))))
(advice-add 'kill-region :before #'slick-cut)
(defun slick-copy (beg end)
(interactive
(if mark-active
(list (region-beginning) (region-end))
(message "Copied line")
(list (line-beginning-position) (line-beginning-position 2)))))
(advice-add 'kill-ring-save :before #'slick-copy)
kill-region
及びkill-ring-save
まだ作業領域があるない場合でも、「アクティブ」。これにより、その動作がオーバーライドされます。私は時々その動作を使用しますが、この方法で使用することに慣れていない場合は、おそらく違いに気付かないでしょう。
kill-region
使用可能であるなど/便利なときmark-active
ですnil
。
C-SPC
マークをアクティブにしてから非アクティブにするために2回実行してみてください。ファイル内の別の場所にカーソルを移動して実行するkill-region
と、マークがアクティブでなくても、ポイントとマークの間の領域が強制終了されます。セット(しかし活性化しない)マークがあることを、コマンドのいくつかの例yank
とisearch
。これらの並べ替えコマンドを実行すると、マークがアクティブでない場合でも、マークの場所がわかり、多くのコマンド(などkill-region
)で明示的にアクティブにせずにマークを使用できます。
私が見つけた解決策は、プレフィックス引数を使用することです。
私にとって、半分の行を削除することは便利な機能ですが、行全体を削除する簡単な方法も必要です。だからkill-line
、前置引数を与えられたときに目に見えるものをすべて殺すようにした
。
(defmacro bol-with-prefix (function)
"Define a new function which calls FUNCTION.
Except it moves to beginning of line before calling FUNCTION when
called with a prefix argument. The FUNCTION still receives the
prefix argument."
(let ((name (intern (format "endless/%s-BOL" function))))
`(progn
(defun ,name (p)
,(format
"Call `%s', but move to BOL when called with a prefix argument."
function)
(interactive "P")
(when p
(forward-line 0))
(call-interactively ',function))
',name)))
(global-set-key [remap paredit-kill] (bol-with-prefix paredit-kill))
(global-set-key [remap org-kill-line] (bol-with-prefix org-kill-line))
(global-set-key [remap kill-line] (bol-with-prefix kill-line))
(global-set-key "\C-k" (bol-with-prefix kill-line))
この小さなマクロでは、C-k
まだポイントからキルしますが、
C-3 C-k
3行全体を飲み込みます。ボーナスとして、を実行することでkill-whole-line
動作を取得し
ますC-1 C-k
。
kill-ring-save
接頭引数を受け付けません...
kill-visual-line
は、にバインドされていC-k
ます。直します。再度、感謝します。
whole-line-or-region
アクティブな領域がない場合に現在の行で動作するようにさまざまな組み込みコマンドをアドバイスするパッケージがあり、現在の行M-w
をコピーしC-w
て、たとえば強制終了します。私はこのパッケージを何年も使用していますが、これは不可欠です。
さらに、このパッケージは、数値のプレフィックスが処理対象の行数を示すようにM-2 M-w
するため、2行をコピーします。ここでの他の回答は、その便利な機能を提供していません。
著者がgithubアカウントでパッケージのメンテナンスを引き継ぎ、作成者がメンテナンスを停止して応答しなくなった。
whole-line-or-region
また、必要に応じて、この動作を他のコマンドに追加する機能も提供します。
@itsjeydの答えに加えて、これらの2つの機能を提案できますか?
(defun xah-copy-line-or-region ()
"Copy current line, or text selection.
When `universal-argument' is called first, copy whole buffer (but respect `narrow-to-region')."
(interactive)
(let (p1 p2)
(if (null current-prefix-arg)
(progn (if (use-region-p)
(progn (setq p1 (region-beginning))
(setq p2 (region-end)))
(progn (setq p1 (line-beginning-position))
(setq p2 (line-end-position)))))
(progn (setq p1 (point-min))
(setq p2 (point-max))))
(kill-ring-save p1 p2)))
(defun xah-cut-line-or-region ()
"Cut current line, or text selection.
When `universal-argument' is called first, cut whole buffer (but respect `narrow-to-region')."
(interactive)
(let (p1 p2)
(if (null current-prefix-arg)
(progn (if (use-region-p)
(progn (setq p1 (region-beginning))
(setq p2 (region-end)))
(progn (setq p1 (line-beginning-position))
(setq p2 (line-beginning-position 2)))))
(progn (setq p1 (point-min))
(setq p2 (point-max))))
(kill-region p1 p2)))
次に、重要な定義(おそらくそれらを調整する必要があります):
(global-set-key (kbd "<f2>") 'xah-cut-line-or-region) ; cut
(global-set-key (kbd "<f3>") 'xah-copy-line-or-region) ; copy
(global-set-key (kbd "<f4>") 'yank) ; paste
上記の@itsjeydの答えの拡張として、次のものがあります。(おそらく、ロジックはわずかにクリーンアップされる可能性があり、新しいアドバイスシステムに移植するときは、再度繰り返される場合はsexp
/ に拡張することも考えられますparagraph
)。
最初のC-w
/ M-w
はポイントの単語のみを取得し、2回目の呼び出しは行全体を取得します。
;; *** Copy word/line without selecting
(defadvice kill-ring-save (before slick-copy-line activate compile)
"When called interactively with no region, copy the word or line
Calling it once without a region will copy the current word.
Calling it a second time will copy the current line."
(interactive
(if mark-active (list (region-beginning) (region-end))
(if (eq last-command 'kill-ring-save)
(progn
;; Uncomment to only keep the line in the kill ring
;; (kill-new "" t)
(message "Copied line")
(list (line-beginning-position)
(line-beginning-position 2)))
(save-excursion
(forward-char)
(backward-word)
(mark-word)
(message "Copied word")
(list (mark) (point)))))))
;; *** Kill word/line without selecting
(defadvice kill-region (before slick-cut-line first activate compile)
"When called interactively kill the current word or line.
Calling it once without a region will kill the current word.
Calling it a second time will kill the current line."
(interactive
(if mark-active (list (region-beginning) (region-end))
(if (eq last-command 'kill-region)
(progn
;; Return the previous kill to rebuild the line
(yank)
;; Add a blank kill, otherwise the word gets appended.
;; Change to (kill-new "" t) to remove the word and only
;; keep the whole line.
(kill-new "")
(message "Killed Line")
(list (line-beginning-position)
(line-beginning-position 2)))
(save-excursion
(forward-char)
(backward-word)
(mark-word)
(message "Killed Word")
(list (mark) (point)))))))
最小限のキーストロークでそれを行いたいので、David Anderssonの優れたキーコードパッケージを使用できます。「キーコード」とは、2つのキーを同時に押すか、1つのキーを2回押すことです。
任意のキーコードをこれらの機能にバインドできます。
(require 'key-chord)
(key-chord-mode 1)
(key-chord-define-global "dd" 'kill-whole-line)
(key-chord-define-global "cc" 'yank-whole-line)
あまりアドホックではない方法は、を定義することですmark-whole-line
。これには、Emacsが実際にデフォルトのコマンドを使用する必要があります。
(defun mark-whole-line ()
"Combinition of C-a, mark, C-e"
(interactive)
(move-beginning-of-line nil)
(set-mark-command nil)
(move-end-of-line nil)
)
(global-set-key (kbd "C-2") 'mark-whole-line) ; 2 is near w
その後C-2 C-w
、仕事をします。
また、現在の行全体にコメントを付けるなどの作業を簡単にします。
これは、itsjeydによる回答の修正版です。これは現在、最も投票数の多い回答であり、私が長年使用した回答です。ただし、問題があります:kill-ring-save
マークが設定されていないため(通常は新しいバッファーに)、アドバイスされたバージョンが失敗することがあります。 。少し掘り下げた後、作業が完了した後にkill-ring-save
呼び出しindicate-copied-region
が行われたためにこれが発生することがわかりましたが、ポイントとマークがコピーされた領域と一致しないindicate-copied-region
ため、間違った領域をマークしました。
十分に言った。これを解決するソリューションは次のとおりです。
(define-advice kill-ring-save
(:before-while (beg end &optional region) slick)
(or mark-active
(not (called-interactively-p 'interactive))
(prog1 nil
(copy-region-as-kill
(line-beginning-position) (line-beginning-position 2))
(message "Copied current line"))))
のitsjeydのアドバイスには何の問題もありませんkill-region
。とにかく、上記とスタイル的に一貫性のある、それの変形です:
(define-advice kill-region
(:around (kill-region beg end &optional region) slick)
(if (or mark-active (not region))
(funcall kill-region beg end region)
(funcall kill-region
(line-beginning-position) (line-beginning-position 2))
(message "Killed current line")))
注あればということtransient-mark-mode
になっていない、これらのアドバイスは何もしません。
whole-line-or-region
代わりにパッケージの使用を検討してください。@sanityincの回答をご覧ください。
composable.elというパッケージを使用します。パッケージの素晴らしい点は、従来のemacsコマンドを代わりに受け入れるというひねりを加えて、MwとCw(コピーとキルのコマンド)をよりVimのように変更することです。したがってC-w l
、行全体を削除します。しかしC-w M->
、ファイルの終わりを強制終了するようなこともできます。領域をマークするとき、両方のコマンドは通常のように機能します。
kill-whole-line
ます。:)