2011-07-27 23 views

Trả lời

19

Có. Sử dụng ! khi đang trong dired để chạy lệnh shell trên một tệp.

Trong trường hợp evince, thông minh hơn là sử dụng &, mặc dù sẽ chạy lệnh không đồng bộ, vì vậy các emacs vẫn có thể sử dụng được khi bạn mở tệp PDF.

3

Bạn có thể sử dụng ! để mở tệp và sau đó chỉ định lệnh.

+4

Và '&' thay vì '!' nếu bạn muốn chạy lệnh đó một cách không đồng bộ. – Thomas

14

Có nhiều cách để thực hiện điều đó. Tôi đề xuất thư viện OpenWith. Thiết lập cho trường hợp của bạn có thể trông như thế:

(add-to-list 'load-path "/path/to/downloaded/openwith.el") 
(require 'openwith) 
(setq openwith-associations '(("\\.pdf\\'" "evince" (file)))) 
(openwith-mode t) 

Nó đặt xử lý tập tin đó sẽ làm việc từ cả hai diredfind-file.

+3

Ít nhất trong Mac OSX, tôi thay thế 'evince' bằng' mở', và sau đó nó sử dụng phần mềm mặc định ('Skim' trong trường hợp của tôi). – Dror

+3

Lưu ý rằng trong trường hợp này, bạn chỉ cần nhấn 'RET' trên tên tệp trong dired thay vì sử dụng '!' Hoặc '&' để chạy lệnh shell.Bạn cũng mất tất cả các liên kết được xây dựng bằng cách sử dụng setq trên openwith-associations. Có thể có một cách tốt hơn để chỉ thay đổi liên kết pdf khi rời khỏi các liên kết cho .mp3, .jpg, ...? –

+0

Vâng, có một cách dễ dàng để thay đổi liên kết pdf mà không làm mất những người khác: M-x tùy chỉnh nhóm RET openwith RET – Jorge

8

Hãy thử điều này.

(defun dired-open-file() 
    "In dired, open the file named on this line." 
    (interactive) 
    (let* ((file (dired-get-filename nil t))) 
    (message "Opening %s..." file) 
    (call-process "gnome-open" nil 0 nil file) 
    (message "Opening %s done" file))) 
+3

Điều này hoạt động tốt. Tôi thay thế 'gnome-open' bằng' xdg-open', trong trường hợp sử dụng trong GUI khác như KDE. –

3

Lưu ý rằng bạn có thể giữ quá trình này còn sống sau khi thoát khỏi Emacs bằng cách sử dụng nohup [Wikipedia], do đó, đặt các điểm trên một tập tin duy nhất trong dired:

C-u ! nohup evince ? & 

mà tạo ra một Persistent Processes [EmacsWiki] .

0

Dưới đây là mở với bất kỳ ứng dụng bên ngoài nào từ chế độ dired trên hộp OSX, sử dụng phím tắt C-c o khi con trỏ nằm trên một dòng có tệp mà người dùng muốn mở bằng ứng dụng bên ngoài - bộ đệm thứ hai được mở ra cho thư mục /Applications và phím enter chọn ứng dụng bên ngoài. [Chọn nhiều tệp vượt quá phạm vi của câu trả lời này, tuy nhiên, tôi đã bao gồm định nghĩa cho dired-get-marked-files chỉ trong trường hợp ai đó quan tâm. Tôi cũng đã bao gồm một tùy chọn để mở một ứng dụng bên ngoài thay thế cho việc sử dụng một cái gì đó như Finder.app hoặc Dock.app hoặc Spotlight - từ thư mục /Applications trong dired, khóa RET sẽ cung cấp cho người dùng các lựa chọn để mở ứng dụng bên ngoài hoặc tham gia vào các thư mục ứng dụng đóng gói]

một phương pháp thứ hai sẽ được sử dụng một cái gì đó giống như (equal (file-name-extension input-filename) ".pdf")) để thiết lập điều kiện và sử dụng start-process . . . để kích hoạt một ứng dụng bên ngoài đặc biệt để mở các tập tin được lựa chọn -. ví dụ, (start-process "pdf-with-skim" nil "open" "-a" "/Applications/Skim.app/Contents/MacOS/Skim" input-filename). Điều này có thể được thực hiện khá phức tạp với các lựa chọn phụ (ví dụ: Adobe, Skim hoặc Xem trước) và cũng có thể được thực hiện để sử dụng chức năng string-match hoặc một loạt các phần mở rộng tệp. Cách tiếp cận thứ hai này hướng tới các tùy chọn cá nhân của người dùng dựa trên các chương trình cụ thể được cài đặt, trong khi tùy chọn đầu tiên (bên dưới) có thể được sử dụng để truy cập bất kỳ ứng dụng bên ngoài đã cài đặt nào.

(require 'dired) 

(defun dired-read-file-name (&optional directory) 
    (if directory 
     (dired directory) 
    (dired nil)) 
    (let (output-filename) 
     (recursive-edit) 
     output-filename)) 

;; Open with external application. 
(defvar open-with-variable nil) 
(define-key dired-mode-map (kbd "C-c o") (lambda() (interactive) 
    (setq open-with-variable t) 
    (let* (
     (lawlist-filename (dired-get-file-for-visit)) 
     (application (dired-read-file-name "/Applications"))) 
    (start-process "external" nil "open" "-a" application lawlist-filename) 
    (setq open-with-variable nil)))) 

;; select file or directory. 
(define-key dired-mode-map (kbd "<return>") (lambda() (interactive) 
    (let* (
    (input-filename 
     (if (or (re-search-backward "^*" nil t) 
      (re-search-forward "^*" nil t)) 
     (dired-get-marked-files) 
     (dired-get-file-for-visit))) 
    (dired-buffer-name (buffer-name))) 
    (cond 
    ;; open file 
    ((and (not (file-directory-p input-filename)) 
     (file-exists-p input-filename) 
     (not (equal input-filename (concat (file-name-directory input-filename) "."))) 
     (not open-with-variable)) 
     (kill-buffer dired-buffer-name) 
     (find-file input-filename)) 
    ;; open with external application 
    ((and (file-directory-p input-filename) 
     (not (equal input-filename (concat (file-name-directory input-filename) "."))) 
     open-with-variable 
     (equal (file-name-extension input-filename) "app")) 
     (setq output-filename input-filename) 
     (kill-buffer dired-buffer-name) 
     (throw 'exit nil)) 
    ;; Enter the directory; or, open an application 
    ((and (file-directory-p input-filename) 
     (not (equal input-filename (concat (file-name-directory input-filename) ".")))) 
     (if (equal (file-name-extension input-filename) "app") 
     (progn 
      (message "[o]pen %s" (file-name-nondirectory input-filename)) 
      (let* ((open-or-enter (read-char-exclusive))) 
      (cond 
       ((eq open-or-enter ?o) 
       (start-process "application" nil "open" "-a" input-filename) 
       (kill-buffer dired-buffer-name)) 
       (t 
       (dired-find-file) 
       (goto-char (point-min)) 
       (re-search-forward " \\.\\.$" nil t) 
       (kill-buffer dired-buffer-name))))) 
     (dired-find-file) 
     (goto-char (point-min)) 
     (re-search-forward " \\.\\.$" nil t) 
     (kill-buffer dired-buffer-name))))))) 
1

Trong Windows, tôi tắt sử dụng! và lệnh "explorer" để mở PDF/Word/Excel ...

+0

Tôi nghĩ rằng "bắt đầu" nên hoạt động quá và ngắn hơn. –

Các vấn đề liên quan