是否有emacs功能可以访问上次编辑?

时间:2013-05-09 19:29:15

标签: emacs elisp emacs24

在JetBrains产品中,有一个非常方便的键绑定,可让您访问您编辑的所有位置。点击一次键进入上一次编辑(文件和位置),然后按键返回之前的编辑。通常在编辑时要反复编辑相同的位置,如果有多个缓冲区打开,其中很多都没有编辑,这就更有用了。

Emacs有一个标记环,但这并不完全相同。

在相关的说明中,是否有magit中的功能,即emacs git附加组件,以跳转到编辑?

5 个答案:

答案 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

此实现适用于最后两个(全局)更改,但我想将其更改列表的长度扩展到两个以上并不太难。