私はVIMについても同じ質問を見ましたが、私自身がEmacsの方法を知りたいと思っていました。ReSharperでは、このアクションにCTRL-Dを使用します。Emacsでこれを実行するコマンドの最小数はいくつですか?
私はVIMについても同じ質問を見ましたが、私自身がEmacsの方法を知りたいと思っていました。ReSharperでは、このアクションにCTRL-Dを使用します。Emacsでこれを実行するコマンドの最小数はいくつですか?
回答:
私が使う
C-a C-SPACE C-n M-w C-y
に分解する
C-a
:カーソルを行頭に移動C-SPACE
:選択を開始( "セットマーク")C-n
:カーソルを次の行に移動M-w
:リージョンをコピーC-y
:貼り付け( "ヤンク")前述の
C-a C-k C-k C-y C-y
同じことになる(TMTOWTDI)
C-a
:カーソルを行頭に移動C-k
:ラインをカット( "キル")C-k
:改行をカットC-y
:貼り付け( "ヤンク")(1つ前の場所に戻ります)C-y
:もう一度貼り付けます(行のコピーが2つあります)。これらはどちらもC-d
エディターと比べると恥ずかしいほど冗長ですが、Emacsでは常にカスタマイズが行われます。デフォルトでC-d
バインドさdelete-char
れているので、どうC-c C-d
ですか?以下をあなたのに追加してください.emacs
:
(global-set-key "\C-c\C-d" "\C-a\C- \C-n\M-w\C-y")
(@Nathanのelispバージョンは、キーバインディングが変更されても壊れないため、おそらく望ましいです。)
注意:一部のEmacsモードは別のことをC-c C-d
するために取り戻すかもしれません。
C-S-backspace C-y C-y
ですか?
前の回答に加えて、行を複製する独自の関数を定義することもできます。たとえば、以下を.emacsファイルに入れると、Cdは現在の行を複製します。
(defun duplicate-line()
(interactive)
(move-beginning-of-line 1)
(kill-line)
(yank)
(open-line 1)
(next-line 1)
(yank)
)
(global-set-key (kbd "C-d") 'duplicate-line)
Symbol's function definition is void: move-beginning-of-line
Del
この関数からバインドを解除する方法のアイデアはありますか?
Del
新しいを維持しながら通常に戻す解決策が見つかりましたC-d
:定義の(global-set-key (kbd "<delete>") 'delete-char)
後に追加する必要がありC-d
ます。
カーソルを行に置き、最初でない場合はCTRL-を実行しA、次に:
CTRL-K
CTRL-K
CTRL-Y
CTRL-Y
元に戻す機能でうまく機能し、カーソル位置を混乱させない、行を複製するための関数の私のバージョン。これは、1997年11月にgnu.emacs.sourcesで議論された結果です。
(defun duplicate-line (arg)
"Duplicate current line, leaving point in lower line."
(interactive "*p")
;; save the point for undo
(setq buffer-undo-list (cons (point) buffer-undo-list))
;; local variables for start and end of line
(let ((bol (save-excursion (beginning-of-line) (point)))
eol)
(save-excursion
;; don't use forward-line for this, because you would have
;; to check whether you are at the end of the buffer
(end-of-line)
(setq eol (point))
;; store the line and disable the recording of undo information
(let ((line (buffer-substring bol eol))
(buffer-undo-list t)
(count arg))
;; insert the line arg times
(while (> count 0)
(newline) ;; because there is no newline in 'line'
(insert line)
(setq count (1- count)))
)
;; create the undo information
(setq buffer-undo-list (cons (cons eol (point)) buffer-undo-list)))
) ; end-of-let
;; put the point in the lowest line and return
(next-line arg))
次に、CTRL-Dを定義してこの関数を呼び出すことができます。
(global-set-key (kbd "C-d") 'duplicate-line)
crux-duplicate-current-line-or-region
、あなたの関数で行の複製と最後の操作も取り消すので、私にとってはうまくいきます。
kill-line
(C-k
)の代わりに次のコマンドをC-a
C-k
C-k
C-y
C-y
使用しますkill-whole-line
。
C-S-Backspace
C-y
C-y
利点C-k
は、ポイントが行のどこにあるかとは関係なく(行のC-k
先頭にある必要があるのとは異なり)、また改行を削除する(ここでも何かC-k
しない)ことです。
これを行うためのもう1つの関数を次に示します。私のバージョンはキルリングに触れず、カーソルは元の行にあった新しい行に移動します。リージョンがアクティブ(一時マークモード)の場合はリージョンを複製し、それ以外の場合はデフォルトでラインを複製します。また、プレフィックス引数が指定されている場合は複数のコピーを作成し、負のプレフィックス引数が指定されている場合は元の行をコメント化します(これは、古いバージョンを保持しながらコマンド/ステートメントの異なるバージョンをテストするのに役立ちます)。
(defun duplicate-line-or-region (&optional n)
"Duplicate current line, or region if active.
With argument N, make N copies.
With negative N, comment out original line and use the absolute value."
(interactive "*p")
(let ((use-region (use-region-p)))
(save-excursion
(let ((text (if use-region ;Get region if active, otherwise line
(buffer-substring (region-beginning) (region-end))
(prog1 (thing-at-point 'line)
(end-of-line)
(if (< 0 (forward-line 1)) ;Go to beginning of next line, or make a new one
(newline))))))
(dotimes (i (abs (or n 1))) ;Insert N times, or once if not specified
(insert text))))
(if use-region nil ;Only if we're working with a line (not a region)
(let ((pos (- (point) (line-beginning-position)))) ;Save column
(if (> 0 n) ;Comment out original with negative arg
(comment-region (line-beginning-position) (line-end-position)))
(forward-line 1)
(forward-char pos)))))
私はそれに縛られていC-c d
ます:
(global-set-key [?\C-c ?d] 'duplicate-line-or-region)
C-c
単一の(変更されていない)文字が後に続くのはユーザーバインディング用に予約されているため、これをモードまたは何かによって再割り当てしないでください。
C-c d
とエラーが発生しますcommand-execute: Wrong type argument: commandp, duplicate-line-or-region
。何が起こっているのか?私は、Windows上のEmacs 25.1.1を使用しています
melpaからduplicate-thingをインストールします。
mx package-install RET duplicate-thing
(global-set-key(kbd "Mc") 'duplicate-thing)
行の重複がどこでどのように機能するかはよく覚えていませんが、以前のSciTEユーザーとして、SciTE-wayの1つの点が気に入りました。カーソルの位置には影響しません!したがって、上記のすべてのレシピは十分ではありませんでした。これが私のヒッピーバージョンです。
(defun duplicate-line ()
"Clone line at cursor, leaving the latter intact."
(interactive)
(save-excursion
(let ((kill-read-only-ok t) deactivate-mark)
(toggle-read-only 1)
(kill-whole-line)
(toggle-read-only 0)
(yank))))
処理中に実際に削除されるものはなく、マークと現在の選択はそのまま残ります。
ところで、この素敵なクリーンな全行の物(CSバックスペース)があるのにカーソルをぐるぐる回るのが好きなのはなぜですか。
あなたがあなたの.emacsに入れたいかもしれないものは
(setq kill-whole-line t)
基本的には、kill-lineを呼び出すと(つまり、Ckを介して)、行全体と改行を強制終了します。その後、追加のコードなしで、Ca Ck Cy Cyを実行して行を複製できます。に分解
C-a go to beginning of line
C-k kill-line (i.e. cut the line into clipboard)
C-y yank (i.e. paste); the first time you get the killed line back;
second time gives the duplicated line.
しかし、これを頻繁に使用する場合は、専用のキーバインディングの方が良いかもしれませんが、Ca Ck Cy Cyを使用するだけの利点は、現在の行のすぐ下ではなく、他の場所に行を複製できることです。
私はcopy-from-above-command
キーにバインドし、それを使用しています。XEmacsで提供されていますが、GNU Emacsについては知りません。
`copy-from-above-command 'はインタラクティブにコンパイルされたLisp関数です
-" /usr/share/xemacs/21.4.15/lisp/misc.elc "からロードされます(copy-from-above-command&optional ARG)ドキュメント:ポイントのすぐ上から、前の空白行以外の文字をコピーします。ARG文字をコピーしますが、その行の終わりを超えません。引数を指定しない場合は、行全体をコピーします。コピーされた文字は、ポイントの前のバッファに挿入されます。
GNU Emacs 23.2.1 (amd64-portbld-freebsd8.1) of 2010-11-14 on [host clipped]
です。
デフォルトではこれは恐ろしいです。ただし、Emacsを拡張してSlickEditやTextMateのように機能させることができます。つまり、テキストが選択されていないときに現在の行をコピー/切り取ります。
(transient-mark-mode t)
(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)))))
(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)))))
上記をに配置し.emacs
ます。その後、行をコピーしますM-w
。行を削除するには、C-w
。、行を複製しますC-a M-w C-y C-y C-y ...
。
'自分のバージョンのduplicate-line
を作成しました。これは、殺害リングを台無しにしたくないためです。
(defun jr-duplicate-line ()
"EASY"
(interactive)
(save-excursion
(let ((line-text (buffer-substring-no-properties
(line-beginning-position)
(line-end-position))))
(move-end-of-line 1)
(newline)
(insert line-text))))
(global-set-key "\C-cd" 'jr-duplicate-line)
私は2つのことを除いて、FragGodのバージョンが好きでした:(1)バッファーがで既に読み取り専用であるかどうかをチェックしません(interactive "*")
、そして(2)バッファーの最後の行が空の場合、それは失敗します(あなたとして)その場合、行を強制終了することはできません)、バッファーを読み取り専用のままにします。
それを解決するために、次の変更を加えました。
(defun duplicate-line ()
"Clone line at cursor, leaving the latter intact."
(interactive "*")
(save-excursion
;; The last line of the buffer cannot be killed
;; if it is empty. Instead, simply add a new line.
(if (and (eobp) (bolp))
(newline)
;; Otherwise kill the whole line, and yank it back.
(let ((kill-read-only-ok t)
deactivate-mark)
(toggle-read-only 1)
(kill-whole-line)
(toggle-read-only 0)
(yank)))))
最近のemacsでは、Mwを行のどこにでもコピーしてコピーできます。したがって、次のようになります。
M-w C-a RET C-y
M-w
にバインドされていeasy-kill
ます。それがあなたがするときにあなたが得るものであることを確認してくださいC-h c M-w
ctrl- k、ctrl- k、(新しい場所への位置)ctrl-y
行頭から始めない場合はctrl- を追加しaます。そして2番目ctrl- k改行文字を取得します。テキストだけが必要な場合は削除できます。
アクティブな領域なしでインタラクティブに呼び出された場合、代わりに1行をコピー(Mw)します。
(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(Cw)します。
(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))
(message "Killed line")
(list (line-beginning-position)
(line-beginning-position 2)))))
また、関連するメモ:
(defun move-line-up ()
"Move up the current line."
(interactive)
(transpose-lines 1)
(forward-line -2)
(indent-according-to-mode))
(defun move-line-down ()
"Move down the current line."
(interactive)
(forward-line 1)
(transpose-lines 1)
(forward-line -1)
(indent-according-to-mode))
(global-set-key [(meta shift up)] 'move-line-up)
(global-set-key [(meta shift down)] 'move-line-down)
私は好みに合わせて1つ作成します。
(defun duplicate-line ()
"Duplicate current line."
(interactive)
(let ((text (buffer-substring-no-properties (point-at-bol) (point-at-eol)))
(cur-col (current-column)))
(end-of-line) (insert "\n" text)
(beginning-of-line) (right-char cur-col)))
(global-set-key (kbd "C-c d l") 'duplicate-line)
しかし、現在の行にマルチバイト文字(CJK文字など)が含まれていると、問題が発生することがわかりました。この問題が発生した場合は、代わりにこれを試してください。
(defun duplicate-line ()
"Duplicate current line."
(interactive)
(let* ((text (buffer-substring-no-properties (point-at-bol) (point-at-eol)))
(cur-col (length (buffer-substring-no-properties (point-at-bol) (point)))))
(end-of-line) (insert "\n" text)
(beginning-of-line) (right-char cur-col)))
(global-set-key (kbd "C-c d l") 'duplicate-line)
この機能は、ラインまたはリージョンの両方で複製し、ポイントおよび/またはアクティブなリージョンを期待どおりに残すという点で、JetBrainsの実装と一致する必要があります。
インタラクティブフォームのラッパーです。
(defun wrx/duplicate-line-or-region (beg end)
"Implements functionality of JetBrains' `Command-d' shortcut for `duplicate-line'.
BEG & END correspond point & mark, smaller first
`use-region-p' explained:
http://emacs.stackexchange.com/questions/12334/elisp-for-applying-command-to-only-the-selected-region#answer-12335"
(interactive "r")
(if (use-region-p)
(wrx/duplicate-region-in-buffer beg end)
(wrx/duplicate-line-in-buffer)))
これは、
(defun wrx/duplicate-region-in-buffer (beg end)
"copy and duplicate context of current active region
|------------------------+----------------------------|
| before | after |
|------------------------+----------------------------|
| first <MARK>line here | first line here |
| second item<POINT> now | second item<MARK>line here |
| | second item<POINT> now |
|------------------------+----------------------------|
TODO: Acts funky when point < mark"
(set-mark-command nil)
(insert (buffer-substring beg end))
(setq deactivate-mark nil))
またはこれ
(defun wrx/duplicate-line-in-buffer ()
"Duplicate current line, maintaining column position.
|--------------------------+--------------------------|
| before | after |
|--------------------------+--------------------------|
| lorem ipsum<POINT> dolor | lorem ipsum dolor |
| | lorem ipsum<POINT> dolor |
|--------------------------+--------------------------|
TODO: Save history for `Cmd-Z'
Context:
http://stackoverflow.com/questions/88399/how-do-i-duplicate-a-whole-line-in-emacs#answer-551053"
(setq columns-over (current-column))
(save-excursion
(kill-whole-line)
(yank)
(yank))
(let (v)
(dotimes (n columns-over v)
(right-char)
(setq v (cons n v))))
(next-line))
そして、私はこれをmeta + shift + dにバインドしました
(global-set-key (kbd "M-D") 'wrx/duplicate-line-or-region)
プレフィックス引数を使用すると、直感的な動作(と思います)は次のようになります。
(defun duplicate-line (&optional arg)
"Duplicate it. With prefix ARG, duplicate ARG times."
(interactive "p")
(next-line
(save-excursion
(let ((beg (line-beginning-position))
(end (line-end-position)))
(copy-region-as-kill beg end)
(dotimes (num arg arg)
(end-of-line) (newline)
(yank))))))
カーソルは最終行に残ります。または、次の数行を一度に複製する接頭辞を指定することもできます。
(defun duplicate-line (&optional arg)
"Duplicate it. With prefix ARG, duplicate ARG times."
(interactive "p")
(save-excursion
(let ((beg (line-beginning-position))
(end
(progn (forward-line (1- arg)) (line-end-position))))
(copy-region-as-kill beg end)
(end-of-line) (newline)
(yank)))
(next-line arg))
私は両方を頻繁に使用しており、ラッパー関数を使用してプレフィックス引数の動作を切り替えています。
そしてキーバインド:
(global-set-key (kbd "C-S-d") 'duplicate-line)
;; http://www.emacswiki.org/emacs/WholeLineOrRegion#toc2
;; cut, copy, yank
(defadvice kill-ring-save (around slick-copy activate)
"When called interactively with no active region, copy a single line instead."
(if (or (use-region-p) (not (called-interactively-p)))
ad-do-it
(kill-new (buffer-substring (line-beginning-position)
(line-beginning-position 2))
nil '(yank-line))
(message "Copied line")))
(defadvice kill-region (around slick-copy activate)
"When called interactively with no active region, kill a single line instead."
(if (or (use-region-p) (not (called-interactively-p)))
ad-do-it
(kill-new (filter-buffer-substring (line-beginning-position)
(line-beginning-position 2) t)
nil '(yank-line))))
(defun yank-line (string)
"Insert STRING above the current line."
(beginning-of-line)
(unless (= (elt string (1- (length string))) ?\n)
(save-excursion (insert "\n")))
(insert string))
(global-set-key (kbd "<f2>") 'kill-region) ; cut.
(global-set-key (kbd "<f3>") 'kill-ring-save) ; copy.
(global-set-key (kbd "<f4>") 'yank) ; paste.
上記のelispをinit.elに追加すると、行全体のカット/コピー機能が得られ、F3 F4で行を複製できます。
最も簡単な方法は、Chris Conwayの方法です。
C-a C-SPACE C-n M-w C-y
これがEMACSで義務付けられているデフォルトの方法です。私の意見では、標準を使用することをお勧めします。私はEMACSでの自分自身のキーバインドのカスタマイズに常に注意しています。EMACSはすでに十分強力です。私たちは、独自のキーバインディングに適応するために最善を尽くすべきだと思います。
少し長めですが、慣れていると速くできて楽しいです!
現在の行を複製するための関数です。プレフィックス引数を使用すると、行が複数回複製されます。たとえば、C-3 C-S-o
現在の行を3回複製します。キルリングを変更しません。
(defun duplicate-lines (arg)
(interactive "P")
(let* ((arg (if arg arg 1))
(beg (save-excursion (beginning-of-line) (point)))
(end (save-excursion (end-of-line) (point)))
(line (buffer-substring-no-properties beg end)))
(save-excursion
(end-of-line)
(open-line arg)
(setq num 0)
(while (< num arg)
(setq num (1+ num))
(forward-line 1)
(insert-string line))
)))
(global-set-key (kbd "C-S-o") 'duplicate-lines)