Emacs:如果不考虑随后的杀戮,如何抽出最后一个猛拉的文字?

时间:2011-04-28 18:46:54

标签: emacs kill yank

我经常发现自己在做了一些杀戮之后反复做某事,它变成了一个过程:

  1. C-ý
  2. C-y M-y
  3. C-y M-y M-y
  4. C-y M-y M-y M-y
  5. 每当我杀死一些文本时,它会在kill ring中推回第一个kill,这样我就需要遍历所有的杀戮以返回我想要的文本。我想要做的是反复猛拉同一文本,同时杀死文本之间的冲突。这可能吗?

8 个答案:

答案 0 :(得分:20)

不要使用杀戮戒指;将文本放入寄存器中。 C-x r s a将区域的文本存储到(比如)注册“a”中;然后C-x r i a将其插入其他地方。

答案 1 :(得分:18)

这是一个奇怪的黑客,但可能有所帮助。

第一次使用M-y时,通常会出现错误(之前没有猛拉)。所以这个想法是第一次你得到最后一次猛击而不是最后一次击杀。

为了存储最后一次猛拉,我在这个例子中使用'Y'寄存器。

这两个函数将包围yank和yank-pop。你期待错误,我期待建议。

(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))

答案 2 :(得分:5)

您可以使用M-x delete-region来删除文本,如果您想要使用它,可能会将其绑定到密钥。

答案 3 :(得分:4)

  1. 如果您想反复抽取相同的文字,请使用secondary selection代替区域或杀死文字。

    香草Emacs中缺少的是对次要选择进行挑选的关键约束。我使用C-M-y(请参阅库second-sel.el)。

  2. 要获取直接访问至杀戮戒指中的任何杀戮,请将M-yBrowse Kill RingIcicles一起使用。 在这两种情况下,顶级M-y都允许您访问kill ring中的所有条目。

    如果您使用库second-sel.el,那么除了杀死响铃之外,您还可以访问过去次要选择的响铃。

    如果您使用库second-sel.el Icicles ,那么M-y会从您上次拉出的戒指(杀死戒指或次要选择戒指)中抽出一个条目。< / p>

    如果您使用库browse-kill-ring+.el,那么kill-ring浏览器还允许您访问另一个环(如果您使用库second-sel.el,默认情况下,这是次要选择的环)。

答案 4 :(得分:1)

我试图破解使用次要模式的路线。我们称之为delete-mode。进入删除模式后,kill命令(kill-linekill-paragraphkill-word,...)将改变其行为,以便命令的kill-region部分成为由delete-region替换,新材料不会添加到kill ring中。在此模式下,杀环将保持不变。当您切换回此模式时,行为将恢复正常。

以下是不完整代码试图实现我上面所写的内容。它在切换到删除模式时正常工作,但它有切换回问题(关闭次模式)。任何帮助解决这个问题将不胜感激。

(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)
)

答案 5 :(得分:1)

我会尝试更多地使用delete-region,但我更了解kill命令。不需要编程或提前规划的技巧是在特别恼人的M-y串之后使用M-w。这使得最终猛拉的更容易访问的副本进入杀戮戒指。

答案 6 :(得分:1)

更好的Yank-Pop实施

这定义了一个更好的yank-pop实现,试图修复不断增加的yank-pop问题。

它只会覆盖“current-kill”功能。由于在Emacs中使用了yank,yank-pop和kill ring变量和函数的模块化设计,事实证明,重写“current-kill”是获得我们想要的行为所必需的。

理想的行为是(1)杀死一些东西仍然把它放在杀戮戒指的前面,但是现在(2)yanking或猛拉一些东西也把它放在杀戮戒指的前面(3)我们保存yank-pop通过递增一个全局变量并使用它来替换最后一个yank-pop'ped项目来表示在kill ring中移动的能力。这也意味着(4)过渡性猛拉的物品(即由yank或yank-pop命令放置的物品,其中下一个命令是猛烈的弹出物)最终会保持在杀戮戒指的位置。

;; 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)

答案 7 :(得分:0)

我用

  

M-x browse-kill-ring

使用键绑定&#39; M-y&#39;。还有掌舵支持。

  

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

提供更多解决方案。