22

Emacsで行を10回簡単にコピーするにはどうすればよいですか? コピーラインのショートカットまたは関数が見つかりません。C-aC-spcC-eM-w を使用して面倒な行をコピーできますが、どうすれば複数回貼り付けることができますか?

独自の関数を作成する前のアイデア。

4

10 に答える 10

21

そのためにキーボードマクロを使用できます:-

Ca Ck Cx ( Cy Cj Cx ) Cu 9 Cx e

説明:-

  • Ca : 行頭に移動
  • Ck : キルライン
  • Cx ( : キーボード マクロの記録を開始
  • Cy : キルされた行をヤンクする
  • Cj : 次の行に移動
  • Cx ) : キーボード マクロの記録を停止します。
  • Cu 9 : 9 回繰り返す
  • Cx e : キーボードマクロの実行
于 2008-09-16T13:13:53.327 に答える
11

あなたはこれを知っているかもしれませんが、多くのコマンドでは "Cu 10" プレフィックスがうまく機能します。残念なことに、Cy yank コマンドでは、"Cu" が再定義されて、"kill リング内のその数のアイテムに戻り、そのアイテムをヤンクする" という意味になります。

copy-to-register コマンドと insert-register コマンドを Cu プレフィックス コマンドで使用できると思いましたが、どうやらそれもうまくいきません。

また、Cx z、「最後のコマンドを繰り返す」は Cu に耐性があるようです。

もう 1 つの考えは、M-: を使用して Eval プロンプトを取得し、elisp を少し入力することです。(dotimes '10 'yank) のようなものができると思いましたが、そうではないようです。

したがって、マクロで Cu を使用することは、独自の小さな関数を作成する以外にできる最善の方法のようです。

投票したら、kronozの回答に投票します。

于 2008-09-16T14:02:53.957 に答える
11

コピー中:

線を頻繁に操作する場合は、領域が選択されていないときに、コピー ( kill-ring-save) とカット ( ) を線で機能させることができます。kill-region

(defadvice kill-ring-save (before slickcopy activate compile)
  "When called interactively with no active region, copy a single line instead."
  (interactive
   (if mark-active (list (region-beginning) (region-end))
     (list (line-beginning-position)
           (line-beginning-position 2)))))
(defadvice kill-region (before slickcut 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)))))

次に、Mw だけで行をコピーできます。

貼り付け

多くの場合、前置引数はアクションを複数回実行するだけなので、 Cu 10 Cy が機能することを期待しますが、この場合、Cy はその引数を使用して、キルリングのどの要素を「ヤンク」(貼り付け) するかを意味します。私が考えることができる唯一の解決策は、kronoz が言うことです: Cx ( Cy Cx ) でマクロを記録し、kmacro-end-and-call-macro代わりに Cu の引数を移動させます (それは Cu 9 Cx e または単に C-9 Cx e または M-9 Cx です) e)。

別の方法: M-x viper-modeyy10p にとどまって使用することもできます:)

于 2008-09-16T13:30:57.700 に答える
7

この例では、 Cx ) と Cx e の両方は必要ありません。

繰り返し引数を直接 Cx に与えることができます)。これにより、記録が停止し、マクロが 1 ステップで繰り返されます。または、 Cx ) を飛ばして Cx e に直行することもできます。これは、 Cx e が繰り返しを行う前に録音を終了するからです。

どの方法を選択するかは、繰り返しカウントをどのように機能させたいかによって異なります。Cx ) には、合計で何回繰り返すかを指定します (この場合は 10 回)。Cx e の場合、あと何回繰り返すか (つまり 9) を指定する必要があります。


Ca Ck Ck は末尾の改行も削除するので、後で元に戻す必要はありません。マークを使用するよりも高速で、変数を変更する必要はありません。

さらに良いことに (端末を使用している場合を除きます)、CS-Backspace* を使用して、どこにいても行全体を強制終了できます。

[* X ウィンドウを使用している場合は、必ず Shift ( alt ではなく) を入力してください。そうしないと、セッションが終了する可能性があります!]

端末といえば、C-9 を入力できない場合は、M-9 が良い代替手段です。


Emacs 22 以降では、デフォルトで F3 がマクロを開始し、F4 がマクロを終了/繰り返します。F3 を押して記録を開始し、終了したら F4 を押し、もう一度 F4 を押してマクロを繰り返します。(F4 も引数を取ります。)


これをすべてまとめると、現在の行のコピーが 10 個得られます。

  • CS-Backspace : この行を強制終了します
  • F3 : マクロ開始
  • Cy : 行をヤンクする
  • C-1 C-0 F4 : ヤンクを10回作る

yy 10 p ほど短くはありませんが、かなり近いです。:)

于 2009-10-14T17:57:43.727 に答える
3

これは、私が Emacs の OS/2 ポートから取った関数です。(はい、しばらくの間 Emacs を使用しています。)

;; Author: Eberhard Mattes <mattes@azu.informatik.uni-stuttgart.de>
(defun emx-dup-line (arg)
  "Duplicate current line.
Set mark to the beginning of the new line.
With argument, do this that many times."
  (interactive "*p")
  (setq last-command 'identity) ; Don't append to kill ring
  (let ((s (point)))
    (beginning-of-line)
    (let ((b (point)))
      (forward-line)
      (if (not (eq (preceding-char) ?\n)) (insert ?\n))
      (copy-region-as-kill b (point))
    (while (> arg 0)
      (yank)
      (setq arg (1- arg)))
    (goto-char s))))

私はそれを F9 d にバインドしました:

(global-set-key [f9 ?d]    'emx-dup-line)

次に、 Cu 10 F9 d を使用して、行を 10 回複製します。

于 2008-09-16T15:37:06.493 に答える
2

任意のコマンドを繰り返す唯一の方法は、キーボード マクロの「引数による繰り返し」機能を使用することです。

Ca C-space down Mw Cx ( Cy Cx ) C-9 Cx e

  • Ca : 行頭に移動
  • C-space : セットマーク
  • down : 次の行の先頭に移動
  • Mw : コピー領域
  • Cx ( : キーボード マクロの開始
  • Cy : コピーした行をヤンクする
  • Cx ) : キーボード マクロの終了
  • C-9 Cx e : キーボードマクロを9回実行します。

それはvimに比べてちょっと弱いです。しかし、vimがこの種のことで驚くほど効率的であるという理由だけです.

モーダルな vi のような対話が本当に必要な場合は、vi のエミュレーション モードの 1 つ (viper-mode など) を使用できます。オンラインの emacs マニュアルの「エミュレーション」セクションを確認してください。

于 2008-09-16T13:32:40.787 に答える
0

Ca Ck の次に Cy または ? の行を削除します。

于 2008-09-16T13:08:53.213 に答える
0

私は直接同等のものを知りません (Cy 10 回が私が知っている最高のものです) が、emacs の vi エミュレーション パッケージである Viper に興味があるかもしれません。標準の emacs ディストリビューションの一部です。

于 2008-09-16T13:26:45.620 に答える
0

Baxissimoの回答に基づいて、私はこれを否定しました:

(defun yank-n-times (arg)
  "yank prefix-arg number of times. Not safe in any way."
  (interactive "*p")
  (dotimes 'arg (yank)))

それをいくつかのキーに設定し、前置引数を付けて呼び出してください。

編集(上記のインタラクティブな呼び出しもお粗末に変更されました)

または、ヤンクポップを置き換えることができるバージョンは次のとおりです。

(defun yank-n-times (&optional arg)
  "yank prefix-arg number of times. Call yank-pop if last command was yank."
  (interactive "*p")
  (if (or (string= last-command "yank")
      (string= last-command "yank-pop"))
      (yank-pop arg)
    (if (> arg 1)
    (dotimes 'arg (yank))
      (message "Previous arg was not a yank, and called without a prefix."))))

メッセージは嘘のようなものですが、とにかく 1 より大きいプレフィックスなしで呼び出すべきではありません。

良いアイデアかどうかはわかりませんが、My をこれに置き換えました。どうなるか見てみましょう。

于 2009-10-29T02:40:15.203 に答える
-1

Ck で行を取得し、Cu 10 で次のコマンドを 10 回発生させ、Cy で行を貼り付けます。ものすごく単純。

常に Ck に行全体を実行させたい場合は、kill-whole-line を t に設定できます。Ca や Ce をいじる必要はもうありません。

ファンシーなキル リング、レジスタ、およびマクロを使用してできることはたくさんあります。これらを学ぶことをお勧めしますが、1 行を 10 回ヤンクすることは、難しいことや奇妙なことである必要はありません。

于 2008-09-16T18:26:10.173 に答える