2012-06-27 3 views
6

dired 모드에서 이미지 파일을 열 때 외부 응용 프로그램을 사용하도록 이맥스를 구성하려고합니다. .이맥스 dired 및 openwith

한편 emacs 버퍼에서 인라인 이미지를 사용하고 싶습니다.

내가 사용하는 외부 응용 프로그램에 openwith.el 패키지 파일을 열려면 http://www.emacswiki.org/emacs/OpenWith

openwith 작은 모드의 문제는 글로벌하고 있다는 것입니다 그것은 dired 모드 훅에 의해 활성화 된 경우

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

그것은 어디서나 작동하며 이맥스 버퍼 인 의 모든 인라인 이미지는 외부 응용 프로그램에서 열립니다.

은 내가 openwith.el

:global nil 

:global t 

을 변경했지만, 어떻게 든 완전히 모드를 openwith 비활성화합니다.

그래서, 내 질문은 : 이맥스 openad 마이너 모드를 사용하는 유일한 방법은 dired 버퍼와 어디 다른 사람?

감사합니다.

답변

0

한 가지 방법은 openwith.el의 openwith-associations에 원하는 파일 유형에 대해 기본 프로그램으로 emacsclient를 설정하고 emacsclient를 사용하여 시작할 수 있습니다.

매번 새로운 emacs 세션을 시작할 수 있지만 이전 제안보다 못 생겼습니다.

4

openwith-mode 작동 방식은 약간 특이합니다. 실제로는 전체적으로 또는 전혀 사용하지 않는 것으로 가정합니다. 그러나 여기서 원하는 것은 로컬로, 즉 dired 버퍼 내에서만 사용하는 것입니다.

매우 쉽게 달성 할 수 없지만 여기에 방법이 있습니다.

openwith-mode, openwith.el의 원본 파일을 엽니 다. 그런 다음 실제 마이너 모드의 정의가 나올 때까지 아래로 스크롤하십시오. 그런 다음 을 주석 각 라인의 시작 부분에 세미콜론을 배치하여 그 정의 : 다음 코드를 삽입

;;;###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)))) 

그런 다음이 코드를 아래 ((provide 'openwith) 전에 만) :

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

를이 코드는 않습니다 몇 가지.

먼저 openwith-mode라는 변수를 정의합니다. 이 변수는 외부 응용 프로그램 사용 여부를 결정하는 openwith-mode 함수 중 하나에서 사용됩니다. 일반적으로 마이너 모드를 정의 할 때이 변수는 Emacs에 의해 자동으로 제공됩니다. 그러나 위의 실제 마이너 모드의 정의를 주석 처리 했으므로 여기서이 변수를 명시 적으로 다시 소개합니다.

변수의 용도는 이미지 파일을 외부 뷰어에 인라인하거나 전달해야하는지 여부를 제어 할 수있는 스위치 종류로 작동하는 것입니다.

다음은 (mapc ...) 표현입니다. 우리가 여기에서하는 5 개 가지 기능의 목록이 반복된다

  • dired 찾기-대체 파일을
  • dired 찾기 파일
  • dired 찾기 파일 - 다른 창
  • dired - 마우스 찾기 - 파일 - 다른 창
  • dired-보기 파일 파일을 여는 제공 dired 기능입니다

. 이 함수들 각각에 advising이라는 기술로 소량의 코드를 추가합니다. (ad-add-advice...)은이 5 가지 함수 중 하나가 호출 될 때마다 변수 openwith-modet으로 설정합니다. 함수 호출 외부 변수는 nil으로 설정되어 있습니다.

dired의 함수 중 하나를 사용하여 파일을 열 때마다 외부 응용 프로그램을 호출하는 openwith-mode의 함수는 변수가 t으로 설정되고 즉시 외부 응용 프로그램을 열려고합니다 하나를 알고있다. 우리가 이러한 고리를 뛰어 넘어야하는 이유는 C-x C-f을 사용하여 이미지 파일을 열 때마다 동일한 openwith-mode 함수가 호출된다는 것입니다. 이것이 바로 openwith-mode가 구현 된 방식 일뿐입니다.

(NB : 안타깝게도 현재의 메이저 - 모드는 파일을 열 때 이미 생성 된 새로운 버퍼의 메이저 모드이므로 스위치로 사용할 수 없습니다. 항상 fundamental-mode입니다.)

마지막으로 마지막 세 줄은 이전에 주석 처리 한 부 모드 정의의 & 붙여 넣기입니다. 그들은 내가 언급 한 많은 함수가 외부 응용 프로그램 (open-with-filehandler)을 호출하는 역할을 담당하는 것으로, 소위 파일 처리기라고 말합니다. 실제로 파일에 실제로 액세스하기위한 특별한 작업을 수행하지 않으므로이 함수에 대해 safe-magict으로 설정합니다. 또한, 우리는 연산 insert-file-contents이 우리의 함수에 의해 다루어지기는 어렵지 않다고 선언합니다. 이러한 속성에 대한 자세한 내용은 here을 참조하십시오.

그리고 마지막으로 실제로 파일 처리기를 설치합니다.


중요 다음 openwith 모드 documenation는 당신이 당신의 이맥스 파일에 다음 두 줄을 넣어하는 것이 좋습니다

더 마이너 모드 openwith-mode 더 이상 (후이 없다는 것을 이제
(require 'openwith) 
(openwith-mode t) 

우리는 그 정의를 주석 처리했다), 두 번째 줄을 제거했는지 확인한다.그것도을 주석으로 :

;; (openwith-mode t) 

후 dired와 이미지 파일을 열 경우, 그것은 외부 응용 프로그램에서 열립니다, 이맥스를 다시 시작하는 C-x C-f을 통해 열면 버퍼에 인라인됩니다.

+0

Upvoted에 정의 된 함수를 사용하지만 설명하지 않은 -'평가 - 후 - load' 것 추가 코드를 추가하는 더 일반적인 방법). – phils

+0

@phils 좋은 지적 - 나는 단지 그것에 대해 작은 논평을했지만, 명확하지는 않았다 : openwith-mode가 설계된 방식은 전역 적으로 또는 전역 적으로 * 될 예정이다 : 전역 파일 핸들러 모드가 켜져 있으면 해당 파일 처리기가 외부 응용 프로그램을 검사하고 꺼져 있으면 아무것도 수행하지 않습니다. – Thomas

+0

그러나'eval-after-load'를 사용하여'fmakunbound 'openwith-mode)'와 나머지 코드를 감싸고 실제로 원래의 라이브러리를 건드리지 않고 동일한 결과를 얻지 않겠습니까? – phils