2008-09-18 31 views
153

Giả sử tôi muốn mở tệp trong phiên Emacs hiện có bằng cách sử dụng su hoặc sudo, mà không thả xuống vỏ và làm sudoedit hoặc sudo emacs. Một cách để thực hiện điều này làMở tệp bằng su/sudo bên trong Emacs

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

nhưng điều này yêu cầu chi phí round-trip through SSH đắt tiền. Có cách nào trực tiếp hơn không?

[EDIT] @JBB là đúng. Tôi muốn có thể gọi su/sudo để tiết kiệm cũng như mở. Nó sẽ là OK (nhưng không lý tưởng) để tái cấp phép khi tiết kiệm. Những gì tôi đang tìm kiếm là các biến thể của find-filesave-buffer có thể được "đường ống" qua su/sudo.

+3

Tôi chỉ muốn lưu ý tramp mà đến cài đặt theo mặc định từ emacs22, vì vậy hầu hết mọi người chỉ có thể làm Cc Cf/sudo ::/path-to/file mà không có vấn đề gì. – labyrinth

+0

Cảm ơn bạn đã đề cập đến 'sudoedit'. Rất hữu dụng. – Tshepang

+2

C-c C-f phải là C-x C-f? –

Trả lời

54

Điều tuyệt vời về Tramp là bạn chỉ trả tiền cho chuyến đi khứ hồi đó cho SSH khi bạn mở tệp đầu tiên. Sudo sau đó lưu trữ thông tin đăng nhập của bạn, và Emacs tiết kiệm một xử lý, do đó các tệp sudo mở sau đó mất ít thời gian hơn nhiều.

Tôi không tìm thấy thêm thời gian để tiết kiệm gánh nặng. Đủ nhanh, IMO.

+2

Đợi một chút ... Bộ nhớ cache hết hạn bao lâu? –

+18

Đoạn đường nối không ** không ** khứ hồi qua SSH, nó sử dụng * vỏ phụ *. – Teddy

+0

Điểm của tôi thực sự là bạn phải trả chi phí cho tập tin được mở đầu tiên, và không phải cho bất kỳ người nào khác. – EfForEffort

0

Ugh. Có lẽ bạn có thể mở một shell trong Emacs và exec sudo emacs.

Vấn đề là bạn có lẽ không chỉ muốn mở tệp. Bạn muốn có thể lưu nó sau này. Vì vậy, bạn cần quyền riêng tư gốc của bạn để tồn tại, không chỉ tồn tại để mở tệp.

Có vẻ như bạn muốn Emac trở thành người quản lý cửa sổ của bạn. Nó đủ lớn mà không có điều đó. :)

+11

Ha ha bạn nói sưng lên. Emacs thường tỏ ra rất lớn. Bây giờ, so với dấu chân thời gian chạy của Java, Ruby, và có lẽ là một đống các thứ khác, nó trông khá gầy. Bất kể, tôi nghĩ câu hỏi của Chris được sử dụng một cách hoàn hảo hợp pháp của Emacs. – jfm3

+1

Bạn đánh tôi với nó. Tôi sử dụng mô hình này một cách nhất quán. Khi đăng nhập, tôi bắt đầu một phiên Emacs cho các công cụ chung, một cho SU truy cập (như root) và một hoặc nhiều hơn cho phát triển phần mềm (thường là cho mỗi dự án nhưng không phải lúc nào). Được làm việc đó trong nhiều năm. Chỉ cần làm việc. – pajato0

+0

bạn có thể làm rõ làm thế nào để làm điều này: "mở một vỏ trong Emacs và exec sudo emacs" – johnbakers

4

Ví dụ của bạn không bắt đầu ssh chút nào, ít nhất là không có phiên bản TRAMP của tôi ("2.1.13-trước"). Cả hai tập tin tìm và lưu bộ đệm đều hoạt động tốt.

+0

Bạn có thể lưu trữ thông tin đăng nhập của mình. Khi TRAMP khởi động lần đầu, nó sẽ trải qua 10-15 giây công cụ SSH. (Tôi cũng có 2.1.13-trước.) –

+0

Bạn có chắc không? Tôi có nghĩa là, nó nên được bắt đầu một subshell, nhưng không phải là một phiên SSH để localhost. Mất khoảng 5 giây để chạy tất cả các tự động TRAMP-sniffage lần đầu tiên. – jfm3

+0

Vâng, không, tôi không chắc chắn. Tôi nên nói rằng có 10-15 giây của công cụ TRAMP (có thể SSH). Tôi không quan tâm đến SSH, nhưng về sự chậm trễ trong việc khởi động. Công cụ khởi động này tồn tại trong bao lâu? –

13

Không thực sự là một câu trả lời cho câu hỏi ban đầu, nhưng đây là một hàm helper để làm tramp/đường sudo một chút dễ dàng hơn:

 
(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))) 
+0

Tôi nghĩ rằng [Emacs Starter Kit] (https://github.com/technomancy/emacs-starter-kit) có một cái gì đó tương tự trong 'esk-sudo-edit'. – mrmagooey

2

tôi khuyên bạn nên sử dụng tư vấn cho các lệnh. Đặt chức năng này trong thư mục ~/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:[email protected]:" buffer-file-name)))) 
+0

Chỉ để chỉ ra điều hiển nhiên, điều này yêu cầu bạn đang sử dụng 'ido-find-file' để tìm tệp. – tripleee

12

Nếu bạn sử dụng helm, helm-find-files hỗ trợ mở một tập tin như là người chủ với C-c r.

0

(chỉ hoạt động tại địa phương cần được cập nhật để làm việc một cách chính xác thông qua kẻ lang thang.)

Một chút mở rộng Burton của câu trả lời:

(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)) 
    )) 
    ) 
) 
Các vấn đề liên quan