emacs - popup-kill-ring 和多光标

标签 emacs elisp

我是 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/

相关文章:

emacs - 如何评估 Emacs init.el 文件中的某些内容?

emacs - 在emacs的sh模式下打开zsh脚本

emacs - emacs 有有理数数据类型吗

emacs 在自己的加载路径中找不到它的东西

emacs - 将字体锁定应用于 elisp 中的引号

emacs - 如何在 Emacs 中使用强制选项移动到列插入空格而不是制表符和空格

带有 sml 模式的 emacs

python - 如何让 emacs-jedi 使用项目特定的 virtualenvs

emacs - 在组织模式下颠倒笔记顺序

Emacs:将功能分配给键绑定(bind),并重复按下,撤消最后一次按下并在更广泛的设置下重做