最後のテキスト挿入を繰り返す


10

Vimでは、を押す.と、テキストの挿入など、最新の変更を繰り返すことができます。

EmacsではC-x z、最後のコマンドのみを繰り返します。ここではマクロを使用できることは承知していますが、同じテキストを再挿入するのが遅すぎることに気付くことがよくあります。もう一度挿入する必要がある場合は、マクロを定義しても意味がありません。

Q: Emacs内でテキストの挿入を繰り返す方法はありますか?


1
繰り返したい「テキスト」は何ですか?技術的に言えば、最後の挿入は最後の文字であり、おそらくあなたが求めているものではありません。では、目的に合わせて「テキスト挿入」をどのように定義しますか?それを明確にすることは、それを達成する方法を見つけるのにも役立ちます。
T. Verron、2014

うーん良い質問- 最後の連続的なバッファー変更を定義する方法。おそらく、バッファの変更(C-f、検索など)の結果ではない2つのポイント移動間のバッファの変更ですか?それが理にかなっている場合...
ooi 14

レシピを使用して、必要なものを明確にします。「挿入」には多くの種類があります(テキストを挿入する方法)。インタラクティブに挿入していますか?もしそうなら、どうですか?
ドリュー

インタラクティブに。しかし、理想的には、それがどのように、または何であろうと関係ありません。マクロの定義を始めるのを忘れたかようです。その場合には問題があるときそれです。多分フックが使えるかもしれません。
ooi 14

2
Emacsで「最後の挿入」をどのように定義しますか?viのように編集/コマンドモードスイッチがないため、履歴のどこまで行けばよいでしょうか。通常は、「最後の挿入」(C-space、カーソルを移動、M-wコピー)を選択し、C-y必要なだけ貼り付けます。
2014

回答:


7

dot-mode「タイピングやコマンドを繰り返すマイナーモード」であり、必要な操作を実行できます。基本的には、最後に行った挿入/削除を繰り返すだけです。.Vi(m)とよく似ています。


2
それは何をますか?
Malabarba、2014

1
Emacs.SEへようこそ。現時点では、答えは答えよりもコメントに近いものです。それを編集してdot-mode、OPが何をしようとしているか、OPが取得しようとしている機能をどのように提供するかを説明してください。
ダン

7

それはだ、私はマクロの定義を開始するのを忘れたかのように

そのためにkmacro-edit-lossageC-x C-k l)を使用できます。これにより、最後の300回のキーストローク(単純な挿入を含む)を表示し、マクロとして編集できます。

簡単な使い方としては、繰り返す挿入の先頭を見つけて、「マクロ:」からそのポイントまでのすべてのテキストを削除し、を押すだけC-c C-cです。これで、最初にマクロを記録することを忘れなかったかのように、同じアクションを実行するために使用できるマクロができました。

悲しいことに、最後の300キーストロークにマウスクリックが含まれている場合、これは失敗します。

編集:次のコードは、最後のマウスイベントの後のキーのみが保持されるように変更します。

(defadvice recent-keys (after tv/recent-keys-no-mouse first ())
  "Return only the keys since the last mouse event"
  (let* ((vec ad-return-value)
         (lst (append vec nil))
         (nmax (length vec))
         (i (- nmax 1)))
    (while
        (and
         (>= i 0)
         (not
          (let ((mod (event-modifiers (elt vec i))))
            (or (memq 'click mod)
                (memq 'double mod)
                (memq 'triple mod)
                (memq 'drag mod)
                (memq 'down mod)))))
      (setq i (- i 1)))
    (setq ad-return-value (vconcat (nthcdr (+ i 1) lst) nil))))

(defun tv/kmacro-edit-lossage-no-mouse ()
  "Same as `kmacro-edit-lossage', but fallback if the keys contain mouse events.

Source: http://emacs.stackexchange.com/a/4071/184"
  (interactive)
  (ad-activate-regexp "tv/recent-keys-no-mouse")
  (call-interactively #'kmacro-edit-lossage)
  (ad-deactivate-regexp "tv/recent-keys-no-mouse"))

;; If you want this function to replace the default one, uncomment this line:
; (global-set-key (kbd "C-x C-k l") 'tv/kmacro-edit-lossage-no-mouse)

私はよくマウスを使ってスクロールしますが、それらをマクロから削除する方法を見るのはクールです。
ooi 14

うわー、このコマンドは、最後の300回のマウスクリックが完全に失敗しなかった場合に役立ちます。おそらく、クリックを含めずに、単に作業を拒否するのではなく、ユーザーに知らせてください。
ナニー14

@nanny elispを追加して、エラーメッセージで失敗するよりも(imo)優れたフォールバックを有効にします。この関数では、最後のマウスイベントの後のキーのみが保持されます。マウスイベントを完全に削除することも可能ですが、マクロの結果はやや予測できません。
T.ヴェロン

@ooi前のコメントで自動的にpingされたかどうかわからないので、ここにもpingがあります。
T. Verron、

おかげで、私は同じことに取り組んでいました。の引数をフィルタリングできる可能性があると思いますedmacro-fix-menu-commands。マウスイベントを無視できるオプションの引数を取ります。しかし、私はそれを機能させるためのアドバイスシステムについて十分に知りません。
ナニー

4

dabbrev-expand関数がそのトリックを実行できると思います。すでにいくつかの単語を入力したとしましょう:emacs、emotion、emoji、...次に「em」で始まる単語を入力するときに、ヒットするM-/と、emacsはすでに挿入されている単語の1つを挿入するよう提案します「em」で始まる。ヒットM-/し続けると、emacsは「絵文字」、「感情、そして...を表示します。

また、repeat-complex-commandを確認することもできます。人気のある例:query-replace常に同じ引数を使用して多くの異なるバッファーでコマンドを繰り返したい場合は、「pitt」を「patt」に置き換えます。

一度実行して別のウィンドウに移動し、入力C-x ESC ESCしてもう一度実行します。

最後に、リピート挿入をお勧めしますか?このelファイルは、何らかのロジックを使用して、挿入を行うのに役立ちます。「最後の挿入を繰り返しますが、反復ごとに引数が変化します。

この例はelファイルにあります。

;; You can also iterate over lists:
;;   My desk is cluttered
;;   My desk is a real mess
;;   My desk is very hard to see
;;   My desk is buried
;;
;; from m-x insert-patterned
;;    ";;   My desk is %s"
;;    (cluttered "a real mess" "very hard to see" buried)

お役に立てば幸いです。


1
多分あなたは少し拡大することができます...
T. Verron

@ T.Verron Done :)
Nsukami _

1
Repeat-complex-commandはrepeat(OPで言及されている)に似ており、テキストの挿入にはあまり役立ちません。Repeat-insertマクロのように、テキストを挿入する前に考える必要があります。でもdabbrev-expandいいアイデアです!
T. Verron
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.