Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Emacs 弹出杀死环和多个游标_Emacs_Elisp - Fatal编程技术网

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)