2014-02-05 52 views
1

我是popup-kill-ringmultiple-cursors的狂熱用戶,但是,在使用前者時默認行爲而後者處於活動狀態並不符合我的喜好。popup-kill-ring和多個遊標

popup-kill-ring提供了一個彈出式菜單來從殺死環中選擇一個項目進行插入。多個(虛擬)遊標存在時的默認行爲是分別爲每個遊標選擇項目。通常我想在所有光標位置插入選定的項目。

任何人都知道允許所需行爲的解決方案嗎?

+0

貴'彈出殺-ring'有*貼*函數名,您可以添加到'MC - 默認CMDS可以運行的換all'?你可以檢查以確保* paste *函數不在'mc-default-cmds-to-run-once'的列表中。 – lawlist

+0

你可能還想檢查你的'mc/list-file'來查看你是否無意中添加了* paste *函數來運行一次。注意:* paste *函數可能不會被稱爲「粘貼」 - 我只是用它來描述一般概念。 – lawlist

回答

2

理想情況下,我們可以添加從彈出式菜單(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) 

現在可以將這個命令綁定到所需的按鍵綁定,下面我把它綁定到enter

(define-key popup-kill-ring-keymap "\r" 'mc-popup-kill-ring-insert) 

要開始popup-kill-ring可以使用後切換到默認行爲命令my-default-popup-kill-ring-behviour命令我將它綁定到C-RET

+0

一個錯誤:插入完成後,只有「活動」光標放置在插入文本的後面。其他人「標記」插入的文本,但僅位於插入的文本之前。 – elemakil

+0

更新後的答案現在應該更好 – 2014-02-06 04:54:40

+0

現在它能正常工作。您已經回答了我的問題並提供了一個很好的解決方案。 :-) 感謝那!讓我稍微擴展挑戰:您的解決方案依賴於將'popup-kill-ring'放入'cmds-to-run-once'列表中。然而,要麼命中(例如)'C-RET'並且在所有遊標[現有函數提供的功能]或'RET'中插入當前項並更好地獲得每個(虛擬)遊標的彈出[這將是一個新的功能,我猜]。這是否容易實現? – elemakil