Как перезагрузить файл в буфер?

110

Я обычно работаю с файлами, которые обновляются в файловой системе с помощью контроля версий. Какой быстрый способ перезагрузить файл, не C-x C-fвозвращаясь к нему снова и не спросив, хочу ли я его перезагрузить?

Фернандо Бриано
источник

Ответы:

117

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))
Каушал Моди
источник
8
Вы , возможно, привели библиотеку, что код от: misc-cmds.el. Не то чтобы это сложно, но когда вы копируете что-то точно, обычно вежливо указывать на источник.
Дрю
3
Извиняюсь! Я сам не был уверен, откуда взял этот фрагмент. Я должен был, по крайней мере, поискать имя функции и попытаться найти ее источник, чтобы я мог указать его здесь. Обновление Я записал источники для всего, что я скопировал; просто не был уверен , что этот: github.com/kaushalmodi/.emacs.d/blob/master/setup-files/...
Kaushal Моди
4
Я бы не рекомендовал эту функцию. Слишком опасно использовать случайно на измененном файле.
Жиль
2
@ Жиль, я согласен, с большой властью приходит большая ответственность. Я бы не стал связывать это с легкодоступным связыванием.
Каушал Моди
6
Мой вариант этого будет запрашивать подтверждение, только если буфер изменен, используя (revert-buffer t (not (buffer-modified-p)) t).
glucas
55

Существует также, 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.
thermans
источник
50

Другой вариант, который я использую, find-alternate-fileсвязан с C-x C-v. Это открывает файл, повторно использующий ваш текущий буфер.

По умолчанию он указывает на файл, в котором вы сейчас находитесь, поэтому вы можете просто напечатать, C-x C-v RETчтобы перезагрузить файл. Он не выдаст подсказку, если в вашем буфере нет несохраненных данных.

Некоторые нетекстовые режимы , такие как image-mode(используемые для рендеринга изображений, PDF, SVGs ... и т.д.) и diredкоторые revert-bufferобязаны gдля более быстрого доступа.

Тихон Джелвис
источник
3
Это мой новый переход. Спасибо за упоминание этого.
ramsey_tm
У меня был (ffap-bindings) в моем .emacs, который, кажется, меняет привязку C-x C-v.
ychaouche
Это здорово, спасибо! Просто и эффективно. Кстати, как заставить Emacs заметить, что текущий файл изменился? Например, VIM в режиме графического интерфейса автоматически определяет изменение файла, когда приложение получает фокус (оно переключается из фонового режима).
Матво
Это должен быть принятый ответ.
Мультяшки Клас
10

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 {} +
жилль
источник
В эти дни, как говорит @webappzero в своем ответе, magit безболезненно решает эту часть проблемы с обращением к файлам
Croad Langshan
8

Вы также можете включить глобальный автоматический режим возврата, как показано ниже

(global-auto-revert-mode 1)

это полезно, когда вы делаете много проверок ваших js-файлов с включенным режимом авто-исправления, как в jssc.

DmitrySemenov
источник
7

revert-bufferесть. Но мне нравится иметь обратную связь.

У меня есть следующее в моем .emacs.

(global-set-key (kbd "C-c r") (lambda ()
                                (interactive)
                                (revert-buffer t t t)
                                (message "buffer is reverted")))
kindahero
источник
3

Вы можете использовать find-alternate-file, что связано с C-x C-vпо умолчанию, и просто введите RETв командной строке, чтобы перезагрузить файл.

DoMiNeLa10
источник
3

Для пользователей spacemacs: SPC b R( spacemacs/safe-revert-buffer).

Для пропуска подтверждения другие ответы уже охватывают это, хотя я согласен с другими, что, вероятно, не стоит связывать это с ключом.

Croad Langshan
источник
2

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

Вот документы для настройки интересующих вас настроек:

Если вы придерживаетесь Magit, также обязательно включите все 3 глобальных режима WIP (Work In Progress), чтобы избежать потери работы.

Таким образом, вы можете выполнять действия по управлению версиями в Emacs с помощью Magit и вообще избежать исходной проблемы.

webappzero
источник
1
Пожалуйста, дайте мне знать, если это полезно.
webappzero
Этот ответ должен иметь больше голосов! В случае, если неясно: режимы WIP могут быть хорошими (я не использую их в настоящее время), но они не являются строго необходимыми для того, чтобы это решило проблему возврата для вас.
Croad Langshan