2012-06-27 24 views
6

Tôi muốn định cấu hình emacs để sử dụng các ứng dụng bên ngoài khi tôi mở tệp hình ảnh từ chế độ được hướng dẫn.emacs dired và openwith

Mặt khác, tôi cũng muốn sử dụng hình ảnh nội tuyến trong bộ đệm emacs.

Để mở tập tin trong ứng dụng bên ngoài tôi sử dụng openwith.el gói http://www.emacswiki.org/emacs/OpenWith

Vấn đề với OpenWith chế độ nhỏ là nó là toàn cầu và khi nó được kích hoạt bởi một dired-mode-móc

(add-hook 'dired-mode-hook 
      (lambda() 
      (setq truncate-lines t) 
      (openwith-mode t) 
      )) 

nó hoạt động ở mọi nơi và tất cả hình ảnh nội tuyến trong bộ đệm emacs được mở trong các ứng dụng bên ngoài.

Tôi cố gắng để thay đổi

:global t 

để

:global nil 

trong openwith.el, nhưng nó bằng cách nào đó vô hiệu hóa OpenWith chế độ hoàn toàn.

Vì vậy, câu hỏi của tôi là: Làm thế nào để nói với emacs để sử dụng openwith chế độ nhỏ chỉ với đệm dired và không phải bất cứ nơi nào khác?

Cảm ơn.

Trả lời

0

Một cách có thể là đặt emacsclient làm chương trình ưu tiên cho các loại tệp bạn thích trong openwith-associations trong openwith.el và bắt đầu sử dụng emacsclient.

Bạn có thể bắt đầu phiên emacs mới mỗi lần nhưng điều đó nghe có vẻ xấu hơn đề xuất trước đó.

4

Cách hoạt động của chế độ openwith-mode có một chút khác biệt: nó thực sự giả định rằng bạn sử dụng nó trên toàn cầu hoặc không hoàn toàn. Những gì bạn muốn ở đây, tuy nhiên, là sử dụng nó cục bộ, cụ thể là chỉ từ bên trong một bộ đệm dired.

Điều đó không thể đạt được rất dễ dàng, nhưng đây là một cách.

Mở tệp nguồn của chế độ openwith, openwith.el. Sau đó cuộn tất cả các con đường xuống cho đến khi bạn nhận được đến định nghĩa của chế độ nhỏ thực tế. Sau đó bình luận ra rằng định nghĩa bằng cách đặt một dấu chấm phẩy vào đầu mỗi dòng:

;;;###autoload 
; (define-minor-mode openwith-mode 
; "Automatically open files with external programs." 
; :lighter "" 
; :global t 
; (if openwith-mode 
;  (progn 
;   ;; register `openwith-file-handler' for all files 
;   (put 'openwith-file-handler 'safe-magic t) 
;   (put 'openwith-file-handler 'operations '(insert-file-contents)) 
;   (add-to-list 'file-name-handler-alist '("" . openwith-file-handler))) 
;  (setq file-name-handler-alist 
;   (delete '("" . openwith-file-handler) file-name-handler-alist)))) 

Sau đó, bên dưới mã này (nhưng trước khi (provide 'openwith)), chèn đoạn mã sau:

(defvar openwith-mode nil) 

(mapc (lambda (function) 
     (ad-add-advice function 
         '(dired-openwith nil t (advice . (lambda() (let ((openwith-mode t)) ad-do-it)))) 
         'around 0)) 
     '(dired-find-alternate-file 
     dired-find-file 
     dired-find-file-other-window 
     dired-mouse-find-file-other-window 
     dired-view-file)) 

(put 'openwith-file-handler 'safe-magic t) 
(put 'openwith-file-handler 'operations '(insert-file-contents)) 
(add-to-list 'file-name-handler-alist '("" . openwith-file-handler)) 

Mã này không một vài thứ.

Đầu tiên, nó xác định biến được gọi là chế độ openwith. Biến này được sử dụng bên trong một trong các chức năng của chế độ openwith mà quyết định có nên sử dụng một ứng dụng bên ngoài hay không. Thông thường, một biến tương tự được cung cấp tự động bởi Emacs khi bạn định nghĩa một chế độ nhỏ - tuy nhiên vì chúng ta vừa mới nhận ra định nghĩa của chế độ nhỏ thực tế ở trên, chúng tôi giới thiệu lại biến này ở đây một cách rõ ràng.

Mục đích của biến này là hoạt động như một loại chuyển đổi mà qua đó chúng ta có thể kiểm soát việc tệp hình ảnh có được inline hoặc chuyển tới người xem bên ngoài hay không.

Tiếp theo, chúng tôi có biểu thức (mapc ...). Những gì chúng ta làm ở đây được lặp trên danh sách năm chức năng:

  • dired-tìm-alternate-file
  • dired-tìm-file
  • dired-tìm-file-khác-cửa sổ
  • dired -mouse-tìm-file-khác-cửa sổ
  • dired-view-file

đó là chức năng dired cung cấp để mở một tập tin. Đối với mỗi hàm này, chúng ta thêm một số lượng nhỏ mã vào một kỹ thuật gọi là advising: những gì (ad-add-advice...) làm là đặt biến openwith-mode thành t bất cứ khi nào một trong năm hàm này được gọi. Bên ngoài cuộc gọi hàm, biến vẫn được đặt thành nil.

Điều này có tác dụng bất cứ khi nào bạn sử dụng một trong các chức năng của dired để mở tệp, chức năng của chế độ openwith chịu trách nhiệm gọi các ứng dụng bên ngoài sẽ thấy biến được đặt thành t và kịp thời mở ứng dụng bên ngoài biết một. Lý do chúng ta phải nhảy qua các vòng lặp đó là hàm cùng một chế độ openwith cũng được gọi bất cứ khi nào bạn mở một tệp hình ảnh bằng cách sử dụng C-x C-f - đó chỉ là cách chế độ openwith được triển khai.

(NB: tiếc là chúng tôi không thể sử dụng chế độ chính hiện tại làm công tắc vì đây sẽ là chế độ chính của bộ đệm mới đã được tạo để tệp mở. Nó luôn là fundamental-mode.)

Cuối cùng, ba dòng cuối cùng chỉ là sao chép & dán từ định nghĩa chế độ phụ mà chúng tôi đã nhận xét trước đây. Họ nói rằng chức năng tôi đã đề cập đến rất nhiều và đó là trách nhiệm gọi các ứng dụng bên ngoài - được gọi là open-with-filehandler - là một trình xử lý tệp được gọi là. Nó không thực sự làm bất cứ điều gì đặc biệt để truy cập thực sự vào tập tin, do đó chúng tôi đang thiết lập safe-magic cho chức năng đó để t. Ngoài ra, chúng tôi tuyên bố rằng hoạt động insert-file-contents được xử lý bởi chức năng của chúng tôi theo cách không tầm thường. (Xem here để biết thêm thông tin về các thuộc tính này.)

Và cuối cùng, chúng tôi thực sự cài đặt trình xử lý tệp.


quan trọng: Các OpenWith-mode documenation khuyên bạn nên đặt hai dòng sau vào tập tin của bạn emacs:

(require 'openwith) 
(openwith-mode t) 

Bây giờ không có nhỏ-mode openwith-mode nữa (sau khi chúng tôi đã nhận xét định nghĩa của nó), hãy đảm bảo rằng bạn xóa dòng thứ hai, ví dụbằng cách nhận xét nó ra quá:

;; (openwith-mode t) 

Sau khi khởi động lại Emacs, nếu bạn mở tệp hình ảnh có dired, nó sẽ mở trong ứng dụng bên ngoài; nếu bạn mở nó qua C-x C-f nó sẽ được inlined trong một bộ đệm.

+0

upvoted, nhưng bạn đã không giải thích lý do tại sao bạn cần phải nhận xét ra định nghĩa chế độ (hoặc trực tiếp sửa đổi thư viện ở tất cả - 'eval-sau-load' sẽ một cách tiếp cận bình thường hơn để thêm mã bổ sung đó). – phils

+0

@phils điểm tốt - Tôi chỉ đưa ra một bình luận nhỏ về điều đó, nhưng nó không rõ ràng: Cách openwith-mode được thiết kế, nó có nghĩa là hoặc là trên toàn cầu *: nó bổ sung thêm một trình xử lý tập tin toàn cục và khi chế độ được bật, trình xử lý tệp đó sẽ kiểm tra các ứng dụng bên ngoài, nếu nó tắt, nó sẽ không làm gì cả. – Thomas

+0

Nhưng bạn sẽ không đạt được kết quả tương tự bằng cách sử dụng 'eval-after-load' để bọc' (fmakunbound 'openwith-mode) 'và phần còn lại của mã của bạn, và không thực sự chạm vào thư viện gốc? – phils

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