Откройте файл с su / sudo внутри Emacs


предположим, я хочу открыть файл в существующем сеансе Emacs с помощью su или sudo, не опускаясь до оболочки и делая sudoedit или sudo emacs. Один из способов сделать это

C-x C-f /sudo::/path/to/file

но для этого требуется дорогой туда и обратно через SSH. Есть ли более прямой путь?

[EDIT] @JBB прав. Я хочу иметь возможность вызывать su/sudo сохранить как и открыть. Было бы хорошо (но не идеально) повторно авторизоваться при сохранении. Что я такое ищем это вариации find-file и save-buffer это может быть "пропущено" через su/sudo.

9 163

9 ответов:

хорошая вещь о бродяге заключается в том, что вы платите только за эту поездку туда и обратно в SSH, когда открываете первый файл. Затем Sudo кэширует ваши учетные данные, а Emacs сохраняет дескриптор, так что последующие файлы, открытые sudo, занимают гораздо меньше времени.

Я не нашел дополнительное время, необходимое, чтобы сэкономить обременение, либо. Это достаточно быстро, ИМО.

Бродяга делает не туда и обратно sudo через SSH, он использует subshell. Смотрите инструкцию:https://www.gnu.org/software/tramp/#Inline-methods

поэтому я рекомендую вам придерживаться бродяги.

Если вы используете helm,helm-find-files поддерживает открытие файла в корень с C-c r.

не совсем ответ на исходный вопрос, но вот вспомогательная функция, чтобы сделать маршрут tramp/sudo немного проще:

(defun sudo-find-file (file-name)
  "Like find file, but opens the file as root."
  (interactive "FSudo Find File: ")
  (let ((tramp-file-name (concat "/sudo::" (expand-file-name file-name))))
    (find-file tramp-file-name)))

по крайней мере для экономии, a sudo-сохранить пакет был написан именно для такого рода проблем.

ваш пример вообще не запускает ssh, по крайней мере, не с моей версией TRAMP ("2.1.13-pre"). Как найти-файл, так и сохранить-буфер отлично работают.

Я рекомендую вам использовать консультирует команды. Поместите эту функцию в свой~/.emacs

(defadvice ido-find-file (after find-file-sudo activate)
  "Find file as root if necessary."
  (unless (and buffer-file-name
               (file-writable-p buffer-file-name))
    (find-alternate-file (concat "/sudo:root@localhost:" buffer-file-name))))

тьфу. Возможно, вы могли бы открыть оболочку в Emacs и exec sudo emacs.

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

Похоже, вы хотите, чтобы Emacs стал вашим оконным менеджером. Он и без того достаточно раздут. :)

(работает только локально. Необходимо обновить, чтобы правильно работать через бродягу)

немного расширил ответ Бертона:

(defun sudo-find-file (file-name)
"Like find file, but opens the file as root."
(interactive "FSudo Find File: ")
(let ((tramp-file-name (concat "/sudo::" (expand-file-name file-name))))
(find-file tramp-file-name)))


(add-hook 'dired-mode-hook
    (lambda ()
      ;; open current file as sudo 
      (local-set-key (kbd "C-x <M-S-return>") (lambda()
        (interactive)
        (message "!!! SUDO opening %s" (dired-file-name-at-point))
        (sudo-find-file (dired-file-name-at-point))
      ))
    )
)