拾遗笔记

Emacs的插件openwith.el

默认情况下,当你用Emacs中的`C-xC-f' 打开文件时,不论它是什么类型的文件,都会
使用emacs打开。但有些时候希望遇到avi 文件时使用外部播放器打开,而非emacs所以
emacswiki上有人提供了openwith.el 插件。用来实现对于不同后缀的文件可以调用不
同的命令来打开.因为我用Linux及Windows两个系统所以配置文件分成了两套。
在Windows 上,同时用到了w32-browser.el w32-shell-execute.el等插件。

;;  openwith ,外部程序

;;直接用正常的方式打开相应的文件,openwith会自动做处理
;;`C-xC-f'即可
(when (eq system-type 'windows-nt)
  (require'w32-shell-execute)
  )
(require 'openwith)
(openwith-mode t)
(when (eq system-type 'gnu/linux)
  (setq openwith-associations
        '(("\\.pdf$" "acroread" (file)) ("\\.mp3$" "mplayer" (file) )
          ("\\.mov\\|\\.RM$\\|\\.RMVB$\\|\\.avi$\\|\\.AVI$\\|\\.flv$\\|\\.mp4\\|\\.mkv$\\|\\.rmvb$" "mplayer" (file) )
;;          ("\\.jpe?g$\\|\\.png$\\|\\.bmp\\|\\.gif$" "gpicview" (file))
          ("\\.CHM$\\|\\.chm$" "chmsee"  (file) )
          )
        )
  )
(when (eq system-type 'windows-nt)
  ;;windows 上使用w32-shell-execute 调用系统的相应程序打开
  (setq openwith-associations
        '(("\\.pdf$" "open" (file)) ("\\.mp3$" "open" (file) )
          ("\\.mov\\|\\.RM$\\|\\.RMVB$\\|\\.avi$\\|\\.AVI$\\|\\.flv$\\|\\.mp4\\|\\.mkv$\\|\\.rmvb$" "open" (file) )
          ("\\.jpe?g$\\|\\.png$\\|\\.bmp\\|\\.gif$" "open" (file))
          ("\\.CHM$\\|\\.chm$" "open"  (file) )
          )
        )
  )

;;默认情况下,return 即可以用`open-with'对特定后缀的文件使用相应的程序或
;;emacs mode打开,但有时候想提供第二种打开的方式 。比如默认对于html文件,我
;;会用emacs中的nxml-mode打开,但有时也想在firefox中浏览它,于是return 使用
;;nxml-mode,而C-RET则使用firefox进行打开
;;注意,我这里对html做了特殊处理,当打开html时,焦点自动切换到firefox上。使用了
;; Awesome 窗口管理器的特性。所以未必适合你,仅做参考。
(defun open-with-C-RET-on-linux()
  "in dired mode ,`C-RET' open file with ..."
  (interactive)
  (let ((file-name (dired-get-filename))
        (openwith-associations
        '(("\\.pdf$" "acroread" (file)) ("\\.mp3$" "mplayer" (file) )
          ("\\.RM$\\|\\.RMVB$\\|\\.avi$\\|\\.AVI$\\|\\.flv$\\|\\.mp4\\|\\.mkv$\\|\\.rmvb$" "mplayer" (file) )
          ("\\.jpe?g$\\|\\.png$\\|\\.bmp\\|\\.gif$" "gpicview" (file))
          ("\\.CHM$\\|\\.chm$" "chmsee"  (file) ))))
    (if (string-match "\\.html?$" file-name)
          (if (> (string-to-number (shell-command-to-string "pgrep firefox | wc -l")) 0)
              (progn
                (start-process-shell-command "firefox" nil (format "echo ' show_matched_client({class=\"Firefox\" ,instance=\"Navigator\"},\"www\",\"/usr/bin/firefox %s  \" ,nil)' |awesome-client " file-name))
                (start-process "firefox-file" nil "firefox" file-name))
            (start-process-shell-command "firefox" nil (format "echo ' show_matched_client({class=\"Firefox\" ,instance=\"Navigator\"},\"www\",\"/usr/bin/firefox %s  \" ,nil)' |awesome-client " file-name))
            )
      (dired-find-file)
      )
    )
  )
(when (equal system-type 'gnu/linux)
  (eval-after-load 'dired
  '(define-key dired-mode-map [(control return)] 'open-with-C-RET-on-linux)))

;; 使用外部 文件管理器 打开选中文件所在文件夹
(when (eq system-type 'windows-nt)
  ;;on windows
  ;;  C-RET  用系统默认程序打开选中文件
  ;; M-RET  open Windows Explorer
  ;; ^ 我改成了u ,可以列出根盘符
  ;;
  (require 'w32-browser)
  ;; (define-key diredp-w32-drives-mode-map "n" 'next-line)
  ;; (define-key diredp-w32-drives-mode-map "p" 'previous-line)

  ;;C-M-<RET> 用资源管理器打开当前文件所处目录
  (defun explorer-open()
"用windows 上的explorer.exe打开此文件夹."
    (interactive)
    (if (equal major-mode 'dired-mode)
        (w32explore (expand-file-name (dired-get-filename)))
      (w32explore (expand-file-name (buffer-file-name)))
       )
    )
  (eval-after-load 'dired
    '(define-key dired-mode-map (quote [C-M-return]) 'explorer-open))
  (global-set-key (quote [C-M-return]) 'explorer-open)
;;  (lambda () (interactive ) (w32explore (expand-file-name default-directory)))
  )

;; linux `C-M-RET' 用pcmanfm文件管理器打开当前目录
(when (eq system-type 'gnu/linux)
  (defun open-directory-with-pcmanfm()
    (interactive)
    (start-process "pcmanfm"  nil "pcmanfm" (expand-file-name  default-directory)))
  (eval-after-load 'dired
    '(define-key dired-mode-map (quote [C-M-return]) 'open-directory-with-pcmanfm))
  (global-set-key (quote [C-M-return]) (quote open-directory-with-pcmanfm))
    )

(provide 'joseph-openwith)

Comments

comments powered by Disqus