Update: I now use sudo-edit (available on Melpa or at https://github.com/nflath/sudo-edit), which has the header warning and is more robust than this function.
This is what I use. You can open a file (even one that doesn't exist yet) or directory as a normal user, and run this function to get root privileges.
(defun find-alternative-file-with-sudo () (interactive) (let ((bname (expand-file-name (or buffer-file-name default-directory))) (pt (point))) (setq bname (or (file-remote-p bname 'localname) (concat "/sudo::" bname))) (cl-flet ((server-buffer-done (buffer &optional for-killing) nil)) (find-alternate-file bname)) (goto-char pt)))
I also have this, which makes a big red banner across the top of the buffer telling me it's opened as root.
(defface find-file-root-header-face '((t (:foreground "white" :background "red3"))) "*Face use to display header-lines for files opened as root.") (defun find-file-root-header-warning () "*Display a warning in header line of the current buffer. This function is suitable to add to `find-file-hook'." (when (string-equal (file-remote-p (or buffer-file-name default-directory) 'user) "root") (let* ((warning "WARNING: EDITING FILE AS ROOT!") (space (+ 6 (- (window-width) (length warning)))) (bracket (make-string (/ space 2) ?-)) (warning (concat bracket warning bracket))) (setq header-line-format (propertize warning 'face 'find-file-root-header-face))))) (add-hook 'find-file-hook 'find-file-root-header-warning) (add-hook 'dired-mode-hook 'find-file-root-header-warning)