- C-x v l для просмотра истории файла.
- n и p для перемещения между коммитами.
- f, чтобы посетить файл с момента фиксации в точке.
Это связано с log-view-find-revision
, и если мы посмотрим на код, мы увидим, что критический бит:
(switch-to-buffer (vc-find-revision file revision)))
Таким образом, мы могли бы обернуть это в пользовательскую функцию следующим образом:
(defun my-vc-visit-file-revision (file revision)
"Visit FILE as it was at REVISION."
(interactive
(list (expand-file-name
(read-file-name (if (buffer-file-name)
(format "File (%s): " (file-name-nondirectory
(buffer-file-name)))
"File: ")))
(read-string "Revision: ")))
(require 'vc)
(switch-to-buffer
(vc-find-revision file revision)))
Изменить: Стефан дал лучший ответ, но если вам понравилась возможность выбрать файл, а также ревизию, вот версия моей функции, которая поддерживает интерактивный выбор файла, но использует код из vc-revision-other-window
для обработки ревизии.
Я пришел к выводу, что использование другого окна по умолчанию действительно имеет больше смысла, поэтому я сделал то же самое здесь - если вы не укажете аргумент префикса, и в этом случае он использует текущее окно.
(defun my-vc-visit-file-revision (file rev)
"Visit revision REV of FILE in another window.
With prefix argument, uses the current window instead.
If the current file is named `F', the revision is named `F.~REV~'.
If `F.~REV~' already exists, use it instead of checking it out again."
;; based on `vc-revision-other-window'.
(interactive
(let ((file (expand-file-name
(read-file-name
(if (buffer-file-name)
(format "File (%s): " (file-name-nondirectory
(buffer-file-name)))
"File: ")))))
(require 'vc)
(list file (if (vc-backend file)
(vc-read-revision
"Revision to visit (default is working revision): "
(list file))
(vc-read-revision "Revision to visit: " t
(or (vc-deduce-backend)
(vc-responsible-backend file)))))))
(require 'vc)
(let ((revision (if (string-equal rev "")
(if (vc-backend file)
(vc-working-revision file)
(error "No revision specified for unregistered file %s"
file))
rev))
(backend (or (vc-backend file)
(vc-deduce-backend)
(vc-responsible-backend file)))
(visit (if current-prefix-arg
'switch-to-buffer
'switch-to-buffer-other-window)))
(condition-case err
(funcall visit (vc-find-revision file revision backend))
;; The errors which can result when we request an invalid combination of
;; file and revision tend to be opaque side-effects of some unexpected
;; failure within the backend; so we simply trap everything and signal a
;; replacement error indicting the assumed cause.
(error (error "File not found at revision %s: %s" revision file)))))
Я привязываю эту команду к C-x v C-f
person
phils
schedule
21.08.2014