Есть ли в emacs возможность просматривать последние изменения?

В продуктах JetBrains есть очень удобная привязка клавиш, которая позволяет вам посещать все места, которые вы редактировали. Нажмите клавишу один раз, чтобы перейти к последнему редактированию (файл и местоположение), и продолжайте нажимать клавишу, чтобы вернуться к предыдущим изменениям. Обычно при редактировании вы хотите редактировать одни и те же места снова и снова, и если у вас открыто много буферов, многие из которых не редактируются, это еще более полезно.

Emacs имеет кольцо меток, но это не совсем то же самое.

В соответствующей заметке, есть ли функциональность в magit, дополнении к emacs git, для перехода к изменениям?

12 голосов | спросил justingordon 9 Maypm13 2013, 23:29:15

5 ответов


0

Существует GotoLastChange , который позволяет путешествовать по цепочке отмененных местоположений. Вы можете назначить его ключу:

(global-set-key "\C-x\C-\\" 'goto-last-change)

ответил Alex Vorobiev 10 Mayam13 2013, 00:04:01
0

Существует GotoChg , которая позволяет вам перемещаться по цепочке отмененных мест. Пример фрагмента кода инициализации:

(require 'goto-chg)
(global-set-key [(control ?.)] 'goto-last-change)
(global-set-key [(control ?,)] 'goto-last-change-reverse)

(Как и другие альтернативы, GotoLastChange и session.el, он может не переходить между буферами)

ответил David Andersson 11 WedEurope/Moscow2013-12-11T07:28:25+04:00Europe/Moscow12bEurope/MoscowWed, 11 Dec 2013 07:28:25 +0400 2013, 07:28:25
0

В session.el есть команда session-jump-to-last-change , которая позволяет вам путешествовать по цепочке отмененных местоположений. Фрагмент исходного кода:

(require 'session)
(setq session-jump-undo-threshold 80)  ; default was 240
(global-set-key [(control ?.)] 'session-jump-to-last-change)

(Как и другие альтернативы, GotoLastChange и GotoChg, он может не переходить между буферами)

ответил David Andersson 11 WedEurope/Moscow2013-12-11T07:35:25+04:00Europe/Moscow12bEurope/MoscowWed, 11 Dec 2013 07:35:25 +0400 2013, 07:35:25
0

одиночный буфер

Отслеживание изменений и возврат к месту их возникновения зависит от их типа.
Если ваша правка добавила что-то, вы можете вернуться к ней довольно просто:

(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 ​​kbd> - X pop-global-mark, или просто Ctrl - X Ctrl - Пробел , приведет вас к ранее посещенным буферам (и отметит позиции). Добравшись до целевого буфера, вы можете запустить Meta ​​kbd> - X last-edit (или связанные ключи).

ответил antonio 18 PM000000110000002331 2014, 23:09:23
0

global (мульти-буфер) 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

Эта реализация работает для последних двух (глобальных) изменений, хотя я думаю, что расширение длины ее списка изменений за пределы двух не будет слишком сложным.

ответил braham-snyder 26 MonEurope/Moscow2016-12-26T23:23:06+03:00Europe/Moscow12bEurope/MoscowMon, 26 Dec 2016 23:23:06 +0300 2016, 23:23:06

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132