Як завантажити файл у буфер?


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 Modi

4
Я б не рекомендував цю функцію. Занадто небезпечно випадково використовуватись у зміненому файлі.
Жиль

2
@Gilles Я згоден, з великою силою приходить велика відповідальність. Я б не пов'язував це з легким доступом до прив'язки.
Каушал Моді

6
Мій варіант цього запиту буде підтверджений, лише якщо буфер модифікований, використовуючи (revert-buffer t (not (buffer-modified-p)) t).
глюкас

55

Також є те, auto-revert-modeщо робить це автоматично і дає вам відгуки.

З рядка doc:

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.

50

Інший варіант, який я використовую, find-alternate-fileпов'язаний C-x C-v. Це відкриє файл, який повторно використовує поточний буфер.

За замовчуванням він вказує на файл, в якому ви зараз перебуваєте, тож ви можете просто ввести, C-x C-v RETщоб перезавантажити файл. Він не підкаже, якщо у вашому буфері немає збережених даних.

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


3
Це моя нова поїздка. Дякуємо, що згадали про це.
ramsey_tm

У моїх .emacs у мене були (ffap-прив’язки), які, здається, змінюють зв'язування C-x C-v.
ychaouche

Це чудово, дякую! Простий і ефективний. Btw, як змусити Emacs помітити, що поточний файл змінився? Наприклад, VIM в режимі GUI автоматично визначає зміну файлу, коли додаток фокусується (перемикається на фон).
мато

Це має бути прийнятою відповіддю.
Toon Claes

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 у своїй відповіді, магіт безболісно вирішує цю частину проблеми, що повертає файли
Croad Langshan

8

ви також можете ввімкнути режим глобального автоматичного повернення, як показано нижче

(global-auto-revert-mode 1)

це корисно, коли ви робите багато перевірок ваших js-файлів із увімкненим режимом автоматичного виправлення, як у jssc.


7

revert-bufferє там. Але мені подобається мати відгуки.

У мене є таке .emacs.

(global-set-key (kbd "C-c r") (lambda ()
                                (interactive)
                                (revert-buffer t t t)
                                (message "buffer is reverted")))

3

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


3

Для користувачів Spacemacs: SPC b R( spacemacs/safe-revert-buffer).

Для пропуску підтвердження інші відповіді вже охоплюють це, хоча я погоджуюся з іншими, що, мабуть, це не дуже гарна ідея прив’язувати це до ключа.


2

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

Ось документи для налаштування параметрів, які вас цікавлять:

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

Таким чином, ви можете виконувати дії з контролю версій всередині Emacs за допомогою Magit і взагалі уникати початкової проблеми.


1
Будь ласка, дайте мені знати, чи це корисно.
webappzero

Ця відповідь повинна мати більше результатів! Якщо не зрозуміло: режими WIP можуть бути хорошими (я зараз їх не використовую), але вони не є строго необхідними для того, щоб він вирішив проблему повернення для вас.
Croad Langshan
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.