2010-02-17 37 views
11

Tôi đang cố gắng tinh chỉnh chức năng dired-find-file trong các emacs trên Windows XP để khi tôi mở (nói) một tệp pdf từ dired nó kích hoạt bản sao của Acrobat Reader và mở tập tin với nó, thay vì mở nó trong các emacs. Nhưng tôi không thể tìm ra biến thể nào trên shell-command/call-process để sử dụng. Dưới đây là những gì tôi có cho đến thời điểm này:Mở tệp bằng ứng dụng Windows mặc định từ bên trong các emacs

(defadvice dired-find-file (around dired-find-file-external (filename &optional wildcards)) 
    "Open non-text files with an appropriate external program." 
    (if (string= ".pdf" (substring filename (- (length filename) 4))) ; obviously I'll replace this with something more general/robust 
    (shell-command filename) ;; what should go here? 
    (ad-do-it))) 

(ad-activate 'dired-find-file) 

Tôi biết tôi có thể mã hóa nó để khởi động Acrobat Reader bằng cách cho nó vị trí của tệp .exe. Nhưng tôi muốn có một cái gì đó mà đòi hỏi ít tìm kiếm từ tôi và sẽ không phá vỡ khi các ứng dụng mặc định di chuyển/thay đổi. Tôi nên sử dụng cái gì?

Trả lời

6
  1. Đánh giá elisp
  2. Run sau dired (Mx dired)
  3. Browse để thư mục và tập tin
  4. Với điểm trong hồ sơ, nhấn F3 sẽ mở các tập tin dựa trên phần mở rộng cửa sổ .

    (defun w32-browser (doc) (w32-shell-execute 1 doc))

    (eval-after-load "dired" '(define-key dired-mode-map [f3] (lambda() (interactive) (w32-browser (dired-replace-in-string "/" "\\" (dired-get-filename))))))

+0

Không quan tâm đến eval-after-load, nhưng +1 cho w32-shell-execute - đó rõ ràng là đúng cách để làm điều đó. –

+1

"\" phải là "\\" – Yoo

3

Tôi tìm thấy this terrific web page qua google, cho phép tôi sử dụng kỹ thuật RunDll hoạt động. Tôi đặt nó ở đây trong trường hợp bất cứ ai khác tò mò.

Đây là mảnh chìa khóa mã, mà mở filename sử dụng ứng dụng thích hợp:

(shell-command (concat "rundll32 shell32,ShellExec_RunDLL " (shell-quote-argument filename))) 

Và đây là giải pháp đầy đủ của tôi. (Lưu ý rằng dired-find-file chỉ là một vòng bao bọc find-file không biết tên tệp, do đó bạn phải tư vấn find-file thay vì dired-find-file như trong câu hỏi. Nếu bạn không muốn hành vi cho find-file, bạn có thể sẽ cần viết lại dired-find-file hoặc viết lời khuyên phức tạp hơn.)

(defun open-externally (filename) 
    (shell-command (concat "rundll32 shell32,ShellExec_RunDLL " (shell-quote-argument filename)))) 

(defun is-file-type? (filename type) 
    (string= type (substring filename (- (length filename) (length type))))) 

(defun should-open-externally? (filename) 
    (let ((file-types '(".pdf" ".doc" ".xls"))) 
    (member t (mapcar #'(lambda (type) (is-file-type? filename type)) file-types)))) 

(defadvice find-file (around find-file-external-file-advice (filename &optional wildcards)) 
    "Open non-emacs files with an appropriate external program" 
    (if (should-open-externally? filename) 
     (open-externally filename) 
    ad-do-it)) 

(ad-activate 'find-file) 
0

Câu trả lời của Tom Smith rất hay, nhưng bạn cũng có thể chạy chương trình "bắt đầu" với tên tệp làm đối số.

(shell-command (concat "start " (shell-quote-argument filename))) 
+1

Bạn có chắc chắn không? Khi tôi đã thử điều này nó không hoạt động - Tôi chỉ nhận được một cửa sổ dấu nhắc lệnh trống. –

+1

@Tom: Điều đó có ý nghĩa, vì đối số được trích dẫn đầu tiên cho 'bắt đầu' được sử dụng làm tiêu đề cửa sổ. – jamessan

3

Sử dụng Dired+ cho việc này.

  • C-RET mở file hiện tại dòng bằng cách sử dụng ứng dụng Windows tập tin liên kết của nó.

  • M-RET mở Windows Explorer vào file hoặc thư mục

  • ^, khi trong một thư mục gốc (ví dụ C:\), di chuyển lên đến một danh sách Dired giống như của tất cả các ổ đĩa Windows (địa phương và từ xa).

0

org-open-file là hệ thống mở độc lập bên ngoài. Xem org-file-apps để biết cách tùy chỉnh thêm.

8

Để mở rộng về đề xuất 'org-mở tập tin':

(defun my-dired-find-file (&optional prefix) 
    (interactive "P") 
    (if prefix 
     (org-open-file (dired-get-file-for-visit) 'system) 
     (dired-find-file))) 

(define-key dired-mode-map "\r" 'my-dired-find-file) 

sẽ cho phép bạn mở một tập tin bên ngoài với `C-u RET'.

tìm thấy tại http://lists.gnu.org/archive/html/bug-gnu-emacs/2012-11/msg01069.html

1

Tôi có điều này trong emacs của tôi:

(setq dired-guess-shell-alist-user 
    (list 
    (list "\\.*$" "cmd /k") 
)) 

này sẽ mở tệp bằng cmd.exe mà sẽ sử dụng bất cứ chương trình được kết hợp với phần mở rộng tập tin. Được thử nghiệm để hoạt động trên Windows 8 và GNU Emacs 24.2.1.

+0

Tôi đang thử nghiệm '(setq dired-guess-shell-alist-user '((". * "(Concat" start "" \ "" file "\" ")))) 'tại thời điểm này. (Tôi đã gặp phải tên tập tin có dấu cách.) –

0

Tôi muốn sử dụng (w32-shell-execute "open" file-name).

Trong thực tế, trong tập tin init của tôi, tôi có:

(defun open-externally (file-name) 
    (interactive "fOpen externally: ") 
    (let ((process-connection-type nil)) 
    (start-process "open-externally" nil 
        "xdg-open" file-name))) 

(when (eq window-system 'w32) 
    (defun open-externally (file-name) 
    (interactive "fOpen externally: ") 
    (w32-shell-execute "open" file-name))) 

nào định nghĩa một lệnh đó (có thể được sử dụng một cách tương tác và) sẽ mở ra một tập tin với các ứng dụng mặc định theo xdg-open và sau đó, nếu tôi thực sự trên Windows, xác định lại lệnh đó một cách thích hợp.

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