Emacs 弹出杀死环和多个游标
我是这两种软件的狂热用户,然而,在后者处于活动状态时使用前者的默认行为并不符合我的喜好 弹出式压井环提供一个弹出菜单,用于从压井环中选择要插入的项目。存在多个虚拟游标时的默认行为是分别为每个游标选择项目。通常,我希望在所有光标位置插入选定项Emacs 弹出杀死环和多个游标,emacs,elisp,Emacs,Elisp,我是这两种软件的狂热用户,然而,在后者处于活动状态时使用前者的默认行为并不符合我的喜好 弹出式压井环提供一个弹出菜单,用于从压井环中选择要插入的项目。存在多个虚拟游标时的默认行为是分别为每个游标选择项目。通常,我希望在所有光标位置插入选定项 有人知道一种可以实现期望行为的解决方案吗 理想情况下,我们可以添加命令,将项目从弹出式kill ring select插入mc/cmds,以便为所有人运行,这将导致命令为所有游标运行,但这不起作用。我们的另一个选择是编写一个自定义函数,如果多个光标处于活动状
有人知道一种可以实现期望行为的解决方案吗 理想情况下,我们可以添加命令,将项目从弹出式kill ring select插入mc/cmds,以便为所有人运行,这将导致命令为所有游标运行,但这不起作用。我们的另一个选择是编写一个自定义函数,如果多个光标处于活动状态,则在弹出菜单中为每个光标插入当前选定的项,否则返回默认命令。这是我想到的
(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)
要在启动popup kill ring后切换到默认行为,您可以使用命令my default popup kill ring behviour命令将其绑定到C-RET
您的弹出式kill ring是否有一个粘贴函数名,您可以将其添加到mc default cmds以供所有人运行?您可以检查以确保粘贴功能不在mc-default-cmds-to-run-once的列表中。您可能还需要检查mc/list文件,查看是否无意中将粘贴功能添加到运行一次。注意:您的粘贴功能可能不被称为粘贴-我只是用它来描述一般概念。一个错误:插入完成后,只有活动光标被放置在插入的文本后面。其他人标记插入的文本,但位于插入的文本之前。更新后的答案现在应该更好,现在它可以正常工作了。您已经回答了我的问题,并提供了一个很好的解决方案:谢谢你!让我稍微扩展一下挑战:您的解决方案依赖于将弹出式杀死环放在cmds的“运行一次”列表中。但是,最好是点击例如C-RET并在所有游标处插入当前项[现有函数提供的功能],或者点击RET并分别为每个虚拟游标获取一个弹出窗口[我猜这将是一个新函数]。这是很容易做到的吗?我想这是可以做到的,当我得到一些答案时,我会更新答案time@elemakil我已经更新了答案,我还没有完全测试过它,但它对我有效
(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)