emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] Add file-dwim.


From: Taylan Ulrich Bayırlı/Kammer
Subject: Re: [PATCH] Add file-dwim.
Date: Sun, 18 Oct 2015 21:46:37 +0200
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.5 (gnu/linux)

Artur Malabarba <address@hidden> writes:

>> +  :group 'file-dwim)
>
> These :group entries are redundant. It is a (poorly documented)
> feature that all defcustoms following a defgroup belong to that
> defgroup.

Thanks, didn't know that.

>> +;; (defun play-video-file (file)
>> +;;   (shell-command (concat "my-video-player " (shell-quote-argument 
>> file))))
>
> Why not say that the cdr of an entry in `file-dwim-action-list' can
> also be a list like ("command" "arg1" "arg2"), in which case it used
> in `start-process' with the file-name at the end?
> For instance:
>
>     (add-to-list 'file-dwim-action-list
>                  (list (rx "." (or "mp3" "flac" "aac" "wav") eos) "mplayer"))
>
> I think that would be very valuable, as this sounds like the common
> use for this package.

Hmm, while that's indeed *my* most common use-case, I'm not sure if it
should be baked into the library.

People should be using shell-quasiquote to easily construct shell
commands anyway. ;-) That leaves the freedom to choose between a
synchronous and asynchronous process, whether the output goes into a
buffer, etc..

I guess I could have a cross reference to shell-quasiquote since that
will become an ELPA package too.

Here's an updated patch.

>From 210db5bd46496e6c404dfaa590a31cf79a5aef16 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Taylan=20Ulrich=20Bay=C4=B1rl=C4=B1/Kammer?=
 <address@hidden>
Date: Sun, 18 Oct 2015 16:53:51 +0200
Subject: [PATCH 1/2] Add file-dwim.

---
 packages/file-dwim/file-dwim.el | 129 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 129 insertions(+)
 create mode 100644 packages/file-dwim/file-dwim.el

diff --git a/packages/file-dwim/file-dwim.el b/packages/file-dwim/file-dwim.el
new file mode 100644
index 0000000..9343ce5
--- /dev/null
+++ b/packages/file-dwim/file-dwim.el
@@ -0,0 +1,129 @@
+;;; file-dwim.el --- Do What I Mean for files.
+
+;; Copyright (C) 2015  Free Software Foundation, Inc.
+
+;; Author: Taylan Ulrich Bayırlı/Kammer <address@hidden>
+;; Keywords: extensions, files
+;; URL: https://github.com/TaylanUB/file-dwim
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; Do any action on a file, according to a dispatch-table.  E.g. specify that
+;; media files should be played, directories opened in Dired, etc..  This could
+;; be bound to RET in Dired, or used to replace `find-file'.
+;;
+;; Example configuration (using `shqq' from the shell-quasiquote package):
+;;
+;; (define-key dired-mode-map (kbd "RET") 'file-dwim-dired)
+;;
+;; (defun file-has-extension (file exts)
+;;   (string-match-p
+;;    (rx-to-string `(: "." (or ,@exts) eos))
+;;    file))
+;;
+;; (defun audio-file-p (file)
+;;   (file-has-extension file '("mp3" "flac" "aac" "wav")))
+;;
+;; (defun video-file-p (file)
+;;   (file-has-extension
+;;    file '("mkv" "mp4" "wmv" "webm" "avi" "mpg" "mov" "flv" "mts")))
+;;
+;; (defun guitarpro-file-p (file)
+;;   (file-has-extension file '("gp3" "gp4")))
+;;
+;; (defun play-audio-file (file)
+;;   (shell-command (shqq (my-audio-player ,file))))
+;;
+;; (defun play-video-file (file)
+;;   (shell-command (shqq (my-video-player ,file))))
+;;
+;; (defun open-guitarpro-file (file)
+;;   (async-shell-command (shqq (tuxguitar ,file))))
+;;
+;; (dolist (entry
+;;          '((audio-file-p . play-audio-file)
+;;            (video-file-p . play-video-file)
+;;            (guitarpro-file-p . open-guitarpro-file)
+;;            ))
+;;   (add-to-list 'file-dwim-action-list entry))
+
+;;; Code:
+
+(eval-when-compile
+  (require 'cl)
+  (declare-function dired-get-file-for-visit "dired.el" ()))
+
+(defgroup file-dwim nil
+  "Do What I Mean for files.")
+
+(defcustom file-dwim-action-list nil
+  "A list of action-specifiers for file-types.
+
+Each entry must be either a cons cell or a unary function.
+
+If it's a cons cell, the car must either be a regexp or a
+predicate, and the cdr an unary function that will be called with
+a FILE argument.
+
+If it's a function, it will be called with a FILE argument and
+should return t to indicate that it matched, and can do its
+action at the same time.
+
+A function-entry could act on a file but return nil anyway to
+allow further actions."
+  :type '(repeat (or (cons (or string function)
+                           function)
+                     function)))
+
+(defcustom file-dwim-default-action 'find-file
+  "The default action for when none of `file-dwim-action-list'
+are applicable."
+  :type 'function)
+
+;;;###autoload
+(defun file-dwim (file)
+  "Act on a file according to `file-dwim-action-list'."
+  (interactive "FFile: ")
+  (cl-block actions
+    (dolist (action file-dwim-action-list)
+      (cond
+       ((consp action)
+        (let ((test (car action))
+              (function (cdr action)))
+          (cond
+           ((stringp test)
+            (when (string-match-p test file)
+              (return-from actions (funcall function file))))
+           ((functionp test)
+            (when (funcall test file)
+              (return-from actions (funcall function file))))
+           (t
+            (error "Bad test in `file-dwim-action-list': %S" action)))))
+       ((functionp action)
+        (if (funcall action file)
+            (return-from actions)))
+       (t
+        (error "Bad action in `file-dwim-action-list': %S" action))))
+    (funcall file-dwim-default-action file)))
+
+;;;###autoload
+(defun file-dwim-dired ()
+  "In Dired, use `file-dwim' on a file"
+  (interactive)
+  (file-dwim (dired-get-file-for-visit)))
+
+(provide 'file-dwim)
+;;; file-dwim.el ends here
-- 
2.5.0


reply via email to

[Prev in Thread] Current Thread [Next in Thread]