我是 popup-kill-ring
的狂热用户和 multiple-cursors
但是,在后者处于事件状态时使用前者时的默认行为并不符合我的喜好。
popup-kill-ring
提供一个弹出菜单,用于从 Kill-ring 中选择一个项目进行插入。存在多个(虚拟)光标时的默认行为是为每个光标单独选择项目。通常我想在所有光标位置插入所选项目。
有人知道可以实现所需行为的解决方案吗?
最佳答案
理想情况下,我们可以添加将弹出窗口中的项目 (popup-kill-ring-select
) 插入到 mc/cmds-to-run-for-all
的命令> 这会导致命令对所有游标运行,但这不起作用。我们的另一个选择是编写一个自定义函数,如果多个光标处于事件状态,则在每个光标的弹出菜单中插入当前选定的项目,否则回退到默认命令。这是我想到的
(defun my-default-popup-kill-ring-behviour ()
"Switch to default `popup-kill-ring' behavior"
(interactive)
(define-key popup-kill-ring-keymap "\r" 'popup-kill-ring-select)
(let ((m (with-no-warnings menu)))
(when m
(popup-delete m)))
(mc/execute-command-for-all-cursors 'popup-kill-ring)
(define-key popup-kill-ring-keymap "\r" 'mc-popup-kill-ring-insert))
(defun mc-popup-kill-ring-insert()
"Insert the selected text at all cursors"
(interactive)
;; If multiple cursor mode is active
(when multiple-cursors-mode
;; Extract the currently selected text from the popup menu
;; copied from `popup-kill-ring-select'
(let* ((m (with-no-warnings menu))
(item (popup-item-value-or-self (nth (popup-cursor m) (popup-list m))))
;; Item is just the text shown in popup not the text actually killed
;; following code retrieves the killed text
(num (popup-kill-ring-get-index item))
(text (when num
(nth num kill-ring)))
;; Fake command to insert the kill text
(command (lambda ()
(interactive)
(when text
(insert text)))))
;; Execute the command for each fake cursor
(save-excursion
(mc/execute-command-for-all-fake-cursors command))))
;; Finally execute the command for current cursor
(call-interactively 'popup-kill-ring-select))
(define-key popup-kill-ring-keymap "\r" 'mc-popup-kill-ring-insert)
(define-key popup-kill-ring-keymap (kbd "C-<return>") 'my-default-popup-kill-ring-behviour)
(global-set-key (kbd "M-y") 'popup-kill-ring)
现在你可以将此命令绑定(bind)到所需的按键绑定(bind),下面我将其绑定(bind)到enter
(define-key popup-kill-ring-keymap "\r" 'mc-popup-kill-ring-insert)
要在启动 popup-kill-ring
后切换到默认行为,您可以使用命令 my-default-popup-kill-ring-behviour
命令我正在绑定(bind)它到C-RET
(define-key popup-kill-ring-keymap (kbd "C-<return>") 'my-default-popup-kill-ring-behviour)
关于emacs - popup-kill-ring 和多光标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21579996/