私はVIMについても同じ質問を見ましたが、それは私自身がEmacsで行う方法を知りたかったことです。ReSharperでは、このアクションにCTRL-Dを使用します。Emacsでこれを実行するためのコマンドの最小数はいくつですか?
34 に答える
私が使う
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
: 貼り付け (「ヤンク」) (振り出しに戻ります)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
を行うために回収される場合があります。
前の回答に加えて、行を複製する独自の関数を定義することもできます。たとえば、以下を .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)
行にカーソルを置きます。最初にない場合は、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)
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
が機能しない) ことが含まれます。
これを行うためのさらに別の関数があります。私のバージョンはキルリングに触れておらず、カーソルは元の行にあった新しい行に移動します。アクティブな場合(トランジェントマークモード)は領域を複製し、そうでない場合はデフォルトで行を複製します。また、プレフィックスargが指定されている場合は複数のコピーを作成し、負のプレフィックスargが指定されている場合は元の行をコメントアウトします(これは、古いバージョンを保持したまま、異なるバージョンのコマンド/ステートメントをテストする場合に役立ちます)。
(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
後続の1つの(変更されていない)文字がユーザーバインディング用に予約されているためです。
あなたの .emacs ファイルへの Nathan の追加は道のりですが、置き換えることで少し単純化できます
(open-line 1)
(next-line 1)
と
(newline)
降伏
(defun duplicate-line()
(interactive)
(move-beginning-of-line 1)
(kill-line)
(yank)
(newline)
(yank)
)
(global-set-key (kbd "C-d") 'duplicate-line)
メルパから複製物をインストールします:
Mx package-install RET duplicate-thing
このキーバインディングをinitファイルに追加します:
(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))))
プロセス中に実際に殺されるものはなく、マークと現在の選択はそのままであることに注意してください。
ところで、この素敵な「n」クリーンなキル-ホールラインのもの(CS-バックスペース)があるのに、なぜあなたたちはカーソルをぐいと動かすのが好きなのですか?
キーに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 文字をコピーしますが、その行の終わりを超えないようにします。引数が指定されていない場合は、残りの行全体をコピーします。コピーされた文字は、バッファーのポイントの前に挿入されます。
わからないので、このラウンドのゴルフをスローボールから始めます。
ctrl-k、y、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)
.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 を使用するだけの利点は、現在の行のすぐ下ではなく、別の場所に行を複製できることです。
最近の emacs では、行のどこにでも Mw を使用してコピーできます。したがって、次のようになります。
M-w C-a RET C-y
C-a C-k C-k C-y C-y
とにかく、非常に複雑なソリューションを見ました...
(defun duplicate-line ()
"Duplicate current line"
(interactive)
(kill-whole-line)
(yank)
(yank))
(global-set-key (kbd "C-x M-d") 'duplicate-line)
私は FraGGod のバージョンが気に入りましたが、次の 2 つの点を除いて: (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 を拡張して 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 ...
.
ctrl- k、ctrl- k、(新しい場所への位置)ctrl-y
行の先頭から始めていない場合は、 ctrl-を追加します。aそして2番目ctrl-kは改行文字をつかむことです。テキストだけが必要な場合は削除できます。
@[Kevin Conner]: 私の知る限り、かなり近いです。他に考慮すべき唯一のことkill-whole-line
は、Ck に改行を含めるようにすることです。
自分の好みで書きます。
(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)
最も簡単な方法は、Chris Conway の方法です。
C-a C-SPACE C-n M-w C-y
これは、EMACS によって義務付けられているデフォルトの方法です。私の意見では、標準を使用する方が良いです。私は常に、EMACS で独自のキーバインディングをカスタマイズすることに注意を払っています。EMACS はすでに十分に強力なので、独自のキー割り当てに適応するために最善を尽くすべきだと思います。
少し長いですが、慣れると早くできて楽しいです!
プレフィックス引数を使用して、直感的な動作とは(私が願っています):
(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で行を複製できます。
よく使われるアイブ:
Ctl-スペース(マークを設定) 行末に移動 Ctl-Kキルライン Ctl-Y * 2(ラインをヤンクバック)
:Pよりもはるかに良い方法があるかもしれません