求教如何配置,使用鼠标添加选中

想要给emacs加一下vscode的一个功能。 具体效果如下,使用鼠标+Meta键,双击添加word,三击添加行,拖动添加region。 对应的键是 <double-mouse-1>, <triple-mouse-1>, <drag-mouse-1>。但我不知道对应的函数应该是什么。然后copy是直接每行一个region的copy。

求教!

1 个赞

我不知道你想要的是不是这个功能

http://emacsrocks.com/e09.html

如果你想要这个功能,我觉得真的不需要使用鼠标. vs code的设计理念和 Emacs 是不一样的, vs code 是 “modern editor” 是面向鼠标的,但是 Emacs 因为历史原因, 出现的时候是没有鼠标,所以是面向键盘的. 就编程而言,只使用键盘比使用键盘+鼠标高效地多.

有个疑问:选中之后呢?我猜是要multi-cursor / multi-edit,但是gif中最后你移动了一下光标其他的选择就被取消了,之后粘贴也没有对其他选区生效。

类似这种么?(我没用过)

补充一下,这个是跟Multi-cursor类似的,但使用键盘的话只能mark跟当前区域一样的,我想要的效果是能使用鼠标添加不同区域。前者我一般就用iedit做了。

multi-cursor只有一个函数和点击事件有关, mc/add-cursor-on-click

复制粘贴是对所有选中区域都有效的。

问句题外的,你这个gif是用什么做的啊?

mac上的kap

1 个赞

Secondary selection 默认是 Meta-<mouse1>

试试这个能用么?

my-yank-multiselection 粘贴, my-clean-multiselection 清除。

;; (require 'thingatpt)

(defvar my-double-click-symbol-p nil)
(defvar my-secondary-overlays nil)
(defvar my-secondary-selections nil)

(defun advice--mouse-drag-secondary (oldfun &rest args)
  (let ((res (apply oldfun args))
        (event (car args)))
    (when res
      (pcase (car event)
        ;; double : symbol at point
        ('M-double-down-mouse-1
         (let ((buffer (window-buffer (car (cadr event)))))
           (save-excursion
             (with-current-buffer buffer
               (goto-char (posn-point (event-start event)))
               (let ((bounds (bounds-of-thing-at-point 'symbol)))
                 (if bounds
                     (progn (move-overlay mouse-secondary-overlay
                                          (car bounds) (cdr bounds))
                            (push (copy-overlay mouse-secondary-overlay)
                                  my-secondary-overlays)
                            (push (buffer-substring (car bounds) (cdr bounds))
                                  my-secondary-selections)
                            (setq my-double-click-symbol-p t))
                   (delete-overlay mouse-secondary-overlay)
                   (setq my-double-click-symbol-p nil)))))))
        ;; triple : whole line
        ('M-triple-down-mouse-1
         (when my-double-click-symbol-p
           (delete-overlay (car my-secondary-overlays))
           (setq my-secondary-overlays (cdr my-secondary-overlays))
           (setq my-secondary-selections (cdr my-secondary-selections)))
         (push (copy-overlay mouse-secondary-overlay)
               my-secondary-overlays)
         (push (substring res 0 -1) my-secondary-selections))
        ;; drag : selection
        ('M-down-mouse-1
         (push (copy-overlay mouse-secondary-overlay)
               my-secondary-overlays)
         (push res my-secondary-selections))
        (_ nil))
      res)))

(advice-add 'mouse-drag-secondary :around 'advice--mouse-drag-secondary)

(defun my-yank-multiselection ()
  (interactive)
  (let ((yank-excluded-properties yank-excluded-properties))
    (unless (memq 'line-prefix yank-excluded-properties)
      (setq yank-excluded-properties
            (cons 'line-prefix yank-excluded-properties)))
    (dolist (str (reverse my-secondary-selections))
      (insert-for-yank str)
      (newline)))
  (my-clean-multiselection))

(defun my-clean-multiselection ()
  (interactive)
  (dolist (ov my-secondary-overlays)
    (delete-overlay ov))
  (delete-overlay mouse-secondary-overlay)
  (setq my-secondary-overlays nil)
  (setq my-secondary-selections nil))

都用emacs了,还不享受键盘的快感?

能多一項 Emacs 能做 Vim 不能的事,何乐而不为

1 个赞

在题主的这种使用情境下能看出来鼠标还是很方便的,可能大多数时候键盘就能很好的达到目的,但能多一个方便的功能以备不时之需也挺好的 :smile:

没有现成的可用,尝试自己写呗,注意不要沿用 Emacs 的 Region 的概念,自己创建个新的 Face,作为你的「选中区域」的背景,然后用 Overlay 渲染,后面需要什么操作就自己加。

多谢~目前在找工作中,没太多时间搞,然后自己lisp也才算刚入门吧,这个功能没有的话暂时先搁置下,有功夫了再搞。

请问一下,楼主这用的是什么字体呀?

Operator Mono