在JetBrains产品中,有一个非常方便的键绑定,可让您访问您编辑的所有位置。点击一次键进入上一次编辑(文件和位置),然后按键返回之前的编辑。通常在编辑时要反复编辑相同的位置,如果有多个缓冲区打开,其中很多都没有编辑,这就更有用了。
Emacs有一个标记环,但这并不完全相同。
在相关的说明中,是否有magit中的功能,即emacs git附加组件,以跳转到编辑?
答案 0 :(得分:12)
GotoLastChange允许您沿着撤消位置链移动。您可以将其分配给密钥:
(global-set-key "\C-x\C-\\" 'goto-last-change)
答案 1 :(得分:3)
GotoChg允许您来回移动撤消位置链。示例init代码段:
(require 'goto-chg)
(global-set-key [(control ?.)] 'goto-last-change)
(global-set-key [(control ?,)] 'goto-last-change-reverse)
(就像其他选择,GotoLastChange和session.el,它可以不在缓冲区之间跳转)
答案 2 :(得分:3)
session.el 中有会话 - 跳转到最后更改命令,允许您沿着撤消位置链移动。 Init code snippet:
(require 'session)
(setq session-jump-undo-threshold 80) ; default was 240
(global-set-key [(control ?.)] 'session-jump-to-last-change)
(就像其他选择,GotoLastChange和GotoChg,它可以不在缓冲区之间跳转)
答案 3 :(得分:2)
跟踪修改并返回它们发生的位置取决于它们的类型 如果您的编辑添加了某些内容,您可以通过相当简单的方式返回它:
(goto-char (car(cadr buffer-undo-list)))
如果您删除了某些内容,可以通过以下方式返回:
(goto-char (abs (cdr(cadr buffer-undo-list))))
您可能希望在迷你缓冲区中显示您删除的内容:
(progn
(goto-char (abs (cdr(cadr buffer-undo-list))))
(message "DEL->: %s" (substring-no-properties (car(cadr buffer-undo-list)))))
总结:
(defun last-edit ()
"Go back to last add/delete edit"
(interactive)
(let* ((ubuf (cadr buffer-undo-list))
(beg (car ubuf))
(end (cdr ubuf)))
(cond
((integerp beg) (goto-char beg))
((stringp beg) (goto-char (abs end))
(message "DEL-> %s" (substring-no-properties beg)))
(t (message "No add/delete edit occurred")))))
阅读C-h v buffer-undo-list
,您可以将其集成到不太精细的编辑中,例如设置文本属性(假设您确实需要它)。
我使用buffer-undo-list
变量来执行任务。每个缓冲区都有一个不同的列表,据我所知,没有全局撤消列表。很可能你知道在哪个缓冲区输入了一些内容,并且你希望Emacs带到编辑的地点。在这种情况下,有一个global-mark-ring
变量记录您已经存在的缓冲序列。
连续使用命令 Meta - X pop-global-mark
,
或者干脆
Ctrl - X Ctrl - Space ,
将带您到早先访问过的缓冲区(并标记位置)。一旦到达目标缓冲区,就可以触发 Meta - X last-edit
(或绑定键)。
答案 4 :(得分:1)
全局(多缓冲区)goto-last-change
:
;;; record two different file's last change. cycle them
(defvar feng-last-change-pos1 nil)
(defvar feng-last-change-pos2 nil)
(defun feng-swap-last-changes ()
(when feng-last-change-pos2
(let ((tmp feng-last-change-pos2))
(setf feng-last-change-pos2 feng-last-change-pos1
feng-last-change-pos1 tmp))))
(defun feng-goto-last-change ()
(interactive)
(when feng-last-change-pos1
(let* ((buffer (find-file-noselect (car feng-last-change-pos1)))
(win (get-buffer-window buffer)))
(if win
(select-window win)
(switch-to-buffer-other-window buffer))
(goto-char (cdr feng-last-change-pos1))
(feng-swap-last-changes))))
(defun feng-buffer-change-hook (beg end len)
(let ((bfn (buffer-file-name))
(file (car feng-last-change-pos1)))
(when bfn
(if (or (not file) (equal bfn file)) ;; change the same file
(setq feng-last-change-pos1 (cons bfn end))
(progn (setq feng-last-change-pos2 (cons bfn end))
(feng-swap-last-changes))))))
(add-hook 'after-change-functions 'feng-buffer-change-hook)
;;; just quick to reach
(global-set-key (kbd "M-`") 'feng-goto-last-change)
来自http://shenfeng.me/emacs-last-edit-location.html
此实现适用于最后两个(全局)更改,但我想将其更改列表的长度扩展到两个以上并不太难。