質問

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

独自の関数を作成する前に何かアイデアがあれば。

役に立ちましたか?

解決

コピーする:

頻繁に線を扱う場合は、コピーを作成するとよいでしょう (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)))))

その後、M-w だけでその行をコピーできます。

貼り付け:

多くの場合、接頭辞引数はアクションを複数回実行するだけなので、C-u 10 C-y が機能することが期待されますが、この場合、C-y はその引数を使用して、キルリングのどの要素を「ヤンク」 (ペースト) するかを意味します。私が思いつく唯一の解決策は、クロノスの言うことです。C-x ( C-y C-x ) でマクロを記録し、C-u の引数を次のようにします。 kmacro-end-and-call-macro 代わりに (C-u 9 C-x e または単に C-9 C-x e または M-9 C-x e です)。

別の方法:そのまま宿泊することもできます M-x viper-mode そしてyy10pを使用してください:)

他のヒント

それにはキーボード マクロを使用できます:-

C-a C-k C-x ( C-y C-j C-x ) C-u 9 C-x e

説明:-

  • C-a :行頭へ移動
  • C-k :キルライン
  • C-x ( :キーボードマクロの記録を開始する
  • C-y :ヤンクキルライン
  • C-j :次の行に移動
  • C-x ) :キーボードマクロの記録を停止する
  • C-u9:9回繰り返します
  • C-x e :キーボードマクロを実行する

ご存知かもしれませんが、 多くの コマンドには「C-u 10」というプレフィックスを付けると効果的です。残念なことに、C-y yank コマンドに関しては、「C-u」は「キルリング内のその数のアイテムを戻し、そのアイテムをヤンクする」という意味に再定義されています。

copy-to-register および insert-register コマンドを C-u プレフィックス コマンドとともに使用できるのではないかと思いましたが、どうやらそれも機能しないようです。

また、C-x z、「最後のコマンドを繰り返す」は C-u には影響しないようです。

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

したがって、マクロで C-u を使用することが、独自の小さな関数を作成する以外にできる最善の方法である可能性があります。

私が投票するとしたら、クロノスの回答に投票するでしょう。

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

繰り返し引数を C-x に直接与えるだけです)。これにより、記録が停止され、マクロが 1 ステップで繰り返されます。または、 C-x ) をスキップして C-x e に直接進むこともできます。これは、 C-x e がリピートを実行する前に録音を終了するためです。

どちらの方法を選択するかは、繰り返し回数をどのように機能させたいかによって異なります。C-x ) の場合は、合計で何回繰り返したいかを指定します (この場合は 10)。C-x e の場合、あと何回繰り返しが残っているかを言う必要があります (つまり、9)。


C-a C-k C-k は末尾の改行も削除するため、後で自分で元に戻す必要はありません。マークを使用するよりも処理が速く、変数を変更する必要がありません。

さらに良いことに (ターミナルを使用している場合を除き)、どこにいるかに関係なく、C-S-Backspace* を使用して行全体を強制終了できます。

[* X Windows を使用している場合は、必ず「shift (ない alt) またはセッションを終了してください!]

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


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


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

  • C-S-バックスペース:この行を削除します
  • F3 :マクロを開始する
  • C-y :ラインを引っ張る
  • C-1 C-0 F4 :10回ヤンクする

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

これは、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)

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

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

C-a C-スペースダウン M-w C-x ( C-y C-x ) C-9 C-x e

  • C-a :行頭へ移動
  • Cスペース:セットマーク
  • 下 :次の行の先頭に移動
  • M-w :領域をコピーする
  • C-x ( :キーボードマクロを開始する
  • C-y :コピーされた行をヤンクする
  • C-x ) :キーボードマクロを終了する
  • C-9 C-x e :キーボードマクロを9回実行します。

vimと比べるとちょっと弱いですね。しかしそれは、vim がこの種の作業において驚くほど効率的だからにすぎません。

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

次の行を強制終了することになります。C-a C-k、次に C-y または ?

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

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

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

これを何らかのキーに設定し、接頭辞引数を付けて呼び出すと、準備完了です。

編集 (上記のインタラクティブな通話も、あまりひどいものにならないように変更しました)

または、yank-pop を置き換えることができるバージョンは次のとおりです。

(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 より大きい接頭辞を付けずにこのメッセージを呼び出すべきではありません。

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

より少ないキーストロークで行 (または領域) を 10 回ヤンクできます。

  • 線(または領域)にマークを付ける
  • 選択したテキストを 10 回ヤンクします。

C-w C-x ( C-y C-1 C-0 C-x )

または、F3 および F4 ファンクション キーを使用して、キーボード マクロを開始および終了します。

C-w F3 C-y C-1 C-0 F4

C-k で行を取得し、C-u 10 で次のコマンドを 10 回実行し、C-y で行を貼り付けます。ものすごく単純。

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top