想要给emacs加一下vscode的一个功能。
具体效果如下,使用鼠标+Meta键,双击添加word,三击添加行,拖动添加region。
https://ws3.sinaimg.cn/large/006tKfTcgy1focc0ftelwg31520v04qv.gif
对应的键是 <double-mouse-1>, <triple-mouse-1>, <drag-mouse-1>
。但我不知道对应的函数应该是什么。然后copy是直接每行一个region的copy。
求教!
想要给emacs加一下vscode的一个功能。
具体效果如下,使用鼠标+Meta键,双击添加word,三击添加行,拖动添加region。
https://ws3.sinaimg.cn/large/006tKfTcgy1focc0ftelwg31520v04qv.gif
对应的键是 <double-mouse-1>, <triple-mouse-1>, <drag-mouse-1>
。但我不知道对应的函数应该是什么。然后copy是直接每行一个region的copy。
求教!
我不知道你想要的是不是这个功能
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
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 不能的事,何乐而不为
在题主的这种使用情境下能看出来鼠标还是很方便的,可能大多数时候键盘就能很好的达到目的,但能多一个方便的功能以备不时之需也挺好的
没有现成的可用,尝试自己写呗,注意不要沿用 Emacs 的 Region 的概念,自己创建个新的 Face,作为你的「选中区域」的背景,然后用 Overlay 渲染,后面需要什么操作就自己加。
多谢~目前在找工作中,没太多时间搞,然后自己lisp也才算刚入门吧,这个功能没有的话暂时先搁置下,有功夫了再搞。
请问一下,楼主这用的是什么字体呀?
Operator Mono