Я обычно работаю с файлами, которые обновляются в файловой системе с помощью контроля версий. Какой быстрый способ перезагрузить файл, не C-x C-f
возвращаясь к нему снова и не спросив, хочу ли я его перезагрузить?
Я обычно работаю с файлами, которые обновляются в файловой системе с помощью контроля версий. Какой быстрый способ перезагрузить файл, не C-x C-f
возвращаясь к нему снова и не спросив, хочу ли я его перезагрузить?
Ответы:
M-x revert-buffer
будет делать именно то, что вы хотите. Это все еще попросит подтверждения.
Другой вариант (мой любимый) - функция ниже:
;; Source: http://www.emacswiki.org/emacs-en/download/misc-cmds.el
(defun revert-buffer-no-confirm ()
"Revert buffer without confirmation."
(interactive)
(revert-buffer :ignore-auto :noconfirm))
(revert-buffer t (not (buffer-modified-p)) t)
.
Существует также, auto-revert-mode
который делает это автоматически и дает вам обратную связь.
Из строки документа:
auto-revert-mode is an interactive autoloaded compiled Lisp function
in `autorevert.el'.
(auto-revert-mode &optional ARG)
Toggle reverting buffer when the file changes (Auto Revert mode).
With a prefix argument ARG, enable Auto Revert mode if ARG is
positive, and disable it otherwise. If called from Lisp, enable
the mode if ARG is omitted or nil.
Auto Revert mode is a minor mode that affects only the current
buffer. When enabled, it reverts the buffer when the file on
disk changes.
Use `global-auto-revert-mode' to automatically revert all buffers.
Use `auto-revert-tail-mode' if you know that the file will only grow
without being changed in the part that is already in the buffer.
Другой вариант, который я использую, find-alternate-file
связан с C-x C-v
. Это открывает файл, повторно использующий ваш текущий буфер.
По умолчанию он указывает на файл, в котором вы сейчас находитесь, поэтому вы можете просто напечатать, C-x C-v RET
чтобы перезагрузить файл. Он не выдаст подсказку, если в вашем буфере нет несохраненных данных.
Некоторые нетекстовые режимы , такие как image-mode
(используемые для рендеринга изображений, PDF, SVGs ... и т.д.) и dired
которые revert-buffer
обязаны g
для более быстрого доступа.
C-x C-v
.
Emacs называет это reverting
.
Вы можете вернуть текущий файл с помощью M-x revert-buffer
. Это запрашивает подтверждение, был ли файл изменен или нет, за исключением файлов, которые соответствуют шаблонам, перечисленным в переменной revert-without-query
(подробности см. В руководстве). Другое случайное раздражение в revert-buffer
том, что он сбрасывает режим файла по умолчанию.
Я использую следующую функцию, чтобы вернуть кучу файлов, заданных по имени. Если файл не открыт в каком-либо буфере, он игнорируется.
(defun revert-files (&rest files)
"Reload all specified files from disk.
Only files that are currently visited in some buffer are reverted.
Do not ask confirmation unless the buffer is modified."
(save-excursion
(let ((revert-without-query '("")))
(dolist (file-name files)
(message "Considering whether to revert file %s" file-name)
(let ((buf (find-buffer-visiting file-name)))
(when buf
(message "Reverting file in buffer %s" (buffer-name buf))
(set-buffer buf)
(revert-buffer t nil t)))))))
Типичный вариант использования этой функции - после обновления файлов из системы контроля версий. Используйте emacsclient
для вызова revert-files
всех файлов, которые были обновлены, или (это проще и чуть медленнее) для всех файлов, связанных с обновлением. Я вызываю следующий сценарий оболочки, передавая ему файлы в качестве аргументов:
#! /bin/sh
# Similar to gnuclient, but call `revert-files' on the files.
files=
## Find a way to convert a path to absolute. Bizarre OSes such as Windows
## require special cases. We also try to detect non-filenames such as URIs.
case `uname -s` in
CYGWIN*)
absolute_path () {
cygpath -a -w -- "$1"
};;
*)
wd="`pwd -P 2>/dev/null || pwd`"
absolute_path () {
case "$1" in
/*) printf '%s' "$1";; # ordinary absolute path
*:/*)
if expr "z$1" : 'z[0-9A-Z_a-z][-.0-9@A-Z_a-z]*:/.*'; then
printf '%s' "$1" # URI or machine:/some/path
else
printf '%s' "$wd/$1" # default to a relative path
fi;;
*) printf '%s' "$wd/$1";; # default to a relative path
esac
};;
esac
for x; do
files="$files \"`absolute_path "$x" | sed 's/[\\\\\\\"]/\\\\&/g'`\""
done
exec emacsclient -e "(revert-files$files)"
Пример использования:
svn update
find -name .svn -prune -o -type f -exec emacsclient-revert {} +
Вы также можете включить глобальный автоматический режим возврата, как показано ниже
(global-auto-revert-mode 1)
это полезно, когда вы делаете много проверок ваших js-файлов с включенным режимом авто-исправления, как в jssc.
Вы можете использовать find-alternate-file
, что связано с C-x C-vпо умолчанию, и просто введите RETв командной строке, чтобы перезагрузить файл.
Для пользователей spacemacs: SPC b R
( spacemacs/safe-revert-buffer
).
Для пропуска подтверждения другие ответы уже охватывают это, хотя я согласен с другими, что, вероятно, не стоит связывать это с ключом.
Magit автоматически управляет возвратом файлов, решая вашу основную проблему. Вы также извлекаете выгоду из других его функций.
Вот документы для настройки интересующих вас настроек:
Если вы придерживаетесь Magit, также обязательно включите все 3 глобальных режима WIP (Work In Progress), чтобы избежать потери работы.
Таким образом, вы можете выполнять действия по управлению версиями в Emacs с помощью Magit и вообще избежать исходной проблемы.
misc-cmds.el
. Не то чтобы это сложно, но когда вы копируете что-то точно, обычно вежливо указывать на источник.