EMACS:その後のキルに関係なく、最後のヤンクされたテキストを引っ張る方法は?

StackOverflow https://stackoverflow.com/questions/5823495

  •  26-10-2019
  •  | 
  •  

質問

私はしばしば、いくつかの殺害をした後に何かを繰り返し動いていることに気づき、それは次のようなプロセスになります

  1. cy
  2. サイ
  3. cy my my
  4. cy my my

私がいくつかのテキストを殺すたびに、それはキルリングの最初のキルを押し戻し、私がすべてのキルを循環して私がヤンクしたいテキストに戻る必要があるようにします。私がやりたいのは、ヤンクスの間にテキストを殺しながら同じテキストを繰り返し引っ張ることです。これは可能ですか?

役に立ちましたか?

解決

これは奇妙なハックですが、助けになるかもしれません。

初めて使用します M-y 通常、エラーが発生します(以前のヤンクはありません)。ですから、このアイデアは、最後のキルの代わりに最後のヤンクを手に入れるのはこの初めてだということです。

その最後のヤンクを保存するには、この例で「Y」レジスタを使用します。

これらの2つの機能は、ヤンクとヤンクポップを包み込みます。あなたはバグを期待しています、私は提案を期待しています。

(defun jp/yank (&optional arg)
  "Yank and save text to register Y"
  (interactive)
  (set-register ?Y (current-kill 0 t))
  (yank arg))

(defun jp/yank-pop (&optional arg)
  "If yank-pop fails, then insert register Y"
  (interactive)
  (condition-case nil
      (yank-pop arg)
    (error (insert (get-register ?Y)))))

(global-set-key (kbd "M-y") (quote jp/yank-pop))
(global-set-key (kbd "C-y") (quote jp/yank))

他のヒント

キルリングを使用しないでください。代わりにテキストをレジスタに入れます。 C-x r s a 地域のテキストを(たとえば)登録「a」に保存するには。それから C-x r i a 他の場所に挿入します。

使用できます M-x delete-region 代わりに、テキストを殺すために、おそらくそれを使ってみたい場合はキーに結合します。

  1. 同じテキストを繰り返しヤンクしたい場合は、 二次選択 地域または殺害されたテキストの代わりに。

    バニラ・エマックスに欠けているものは、二次選択をヤンクするための重要なバインディングです。私が使う C-M-y そのために(ライブラリを参照してください second-sel.el).

  2. 取得するため 直接アクセス キルリングのキルに、使用してください M-yキルリングを閲覧します または つらら。両方の場合において、 M-y トップレベルでは、キルリングのすべてのエントリにアクセスできます。

    ライブラリを使用する場合 second-sel.el 次に、キルリングに加えて、過去の二次セレクションのリングにアクセスできます。

    ライブラリを使用する場合 second-sel.elつらら それから M-y ヤンクあなたが最後に引っ張ったリングからのエントリ(キルリングまたは二次選択リング)。

    ライブラリを使用する場合 Browse-Kill-ring+.el 次に、キルリングブラウザは、代替リングにもアクセスできます(デフォルトでは、ライブラリを使用する場合、セカンダリセレクションのリングです。 second-sel.el).

マイナーモードの使用ラインに沿ってハッキングしようとしています。これを呼びましょう delete-mode. 。削除モードになったら、コマンドを殺します(kill-line, kill-paragraph, kill-word, 、...)彼らの行動を変えて kill-region 彼らのコマンドの一部はに置き換えられます delete-region, 、そして新しい素材はキルリングに追加されません。このモードでは、キルリングは一定のままです。このモードから切り替えると、動作は通常に戻ります。

以下は次のとおりです 不完全なコード 上に書いたものを実装しようとしています。削除モードへの切り替えで正しく動作しますが、バックの切り替えに問題があります(マイナーモードの電源を切る)。これを修正するヘルプが大歓迎です。

(defvar delete-mode nil)

(defun delete-mode ()
    "delete minor-mode"
    (interactive)
    (setq delete-mode (not delete-mode))
    (if delete-mode
        (defalias 'kill-region 'delete-region)
        (defalias 'kill-region 'original-kill-region)
    )
)

(if (not (assq 'delete-mode minor-mode-alist))
    (setq minor-mode-alist
        (cons '(delete-mode "Delete mode on") minor-mode-alist)
    )
    (defalias 'original-kill-region 'kill-region)
)

Delete-Regionをもっと使用しようとしますが、Kill Commandの方がよくわかります。プログラミングや事前の計画を必要としないトリックは、特に迷惑な私のストリングの後にMWを使用することです。これにより、最終ヤンクのよりアクセスしやすいコピーがキルリングに入ります。

より良いヤンクポップの実装

これにより、ヤンクポップの増加の問題を修正しようとするより良いヤンクポップの実装が定義されます。

関数「電流キル」をオーバーライドするだけです。ヤンク、ヤンクポップのモジュール設計、およびエマのキルリングの変数と機能により、「現在のキル」を最優先することが、私たちが望む動作を得るために必要なのはすべてであることがわかります。

望ましい動作は、(1)キルを殺すことはまだキルリングの前にそれを置いているが、今(2)ヤンキングまたはヤンクポッピングがキルリングの前にそれを置くということです(3)ヤンクポップは、グローバル変数を増やし、これを使用して最後のヤンクポップされたアイテムを置き換えることにより、キルリングを通過するように見えます。これはまた、(4)ヤンキングされているアイテム(つまり、ヤンクまたはヤンクポップコマンドによって配置されたアイテム、次のコマンドがヤンクポップである)が最終的にキルリングにいる場所に留まることを意味します。

;; Example:
;; (setq kill-ring '("a" "b" "c" "d" "e"))
;;
;; keystroke        kill ring contents              value of kill-ring-yank-index
;; C-y              ("a" "b" "c" "d" "e")           0
;; M-y              ("b" "a" "c" "d" "e")           1
;; M-y              ("c" "a" "b" "d" "e")           2
;; M-y              ("d" "a" "b" "c" "e")           3

;; C-y              ("d" "a" "b" "c" "e")           0
;; M-y              ("a" "d" "b" "c" "e")           1

;; M-d              ("x" "a" "d" "b" "c" "e")
;; etc.

コード:

;; ----------------------------------------------------------------
;; helper functions

(defun list-insert-before (l n x)
  (if (<= n 0) (cons x l)
    (cons (car l) (list-insert-before (cdr l) (- n 1) x))))

(defun list-prepend-nth (l n)
  (if (<= n 0) l
    (let* ((lx (list-prepend-nth (cdr l) (- n 1))))
      (cons (car lx) (cons (car l) (cdr lx))))))

(defun list-insert-car-at (l n)
  (list-insert-before (cdr l) n (car l)))


;; ----------------------------------------------------------------
;; overriding current-kill

(defvar kill-ring-yank-index 0
  "Index into kill-ring of last yank-pop. The item yank-popped
  will be at the head of the kill ring, but if the next command
  is also yank-pop, it will be returned here first before this
  variable is incremented.")

(defun current-kill (n)
  "Replaces standard 'current-kill' function. This version tries
to fix the increasing yank-pop problem.

TODO:
- respect second argument of original function
- deal with 'interprogram-{cut,paste}-function'
"
  (if (eq 0 n) ;; looks like we're doing a yank; reset
               ;; kill-ring-yank-index to 0 to indicate that the
               ;; current head of the list is useful to the user
      (progn (setq kill-ring-yank-index 0)
             (car kill-ring))

    ;; otherwise put the head of kill-ring back where we had
    ;; previously found it, and fetch the next element
    (setq kill-ring
        (list-insert-car-at kill-ring kill-ring-yank-index))
    (setq kill-ring-yank-index (+ kill-ring-yank-index n))
    (when (>= kill-ring-yank-index (- (length kill-ring) 1))
      (setq kill-ring-yank-index (- (length kill-ring) 1))
      (message "Reached end of kill-ring"))
    (when (< kill-ring-yank-index 0)
      (setq kill-ring-yank-index 0)
      (message "Reached beginning of kill-ring"))
    (setq kill-ring (list-prepend-nth kill-ring kill-ring-yank-index))
    (car kill-ring)))

;; ----------------------------------------------------------------
;; new key binding

;; Here's an auxiliary function and key binding that makes it easy to
;; go back and forth in the kill-ring while we're yank-popping
(defun yank-pop-back () "" (interactive "*")
       (yank-pop -1))

(global-set-key "\C-\M-y" 'yank-pop-back)

私が使う

MX Browse-Kill-ring

キーバインディング「m-y」を使用。ヘルムサポートもあります。

https://www.emacswiki.org/emacs/browsekillring

より多くのソリューションを提供します。

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