From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: taylanbayirli@gmail.com (Taylan Ulrich =?utf-8?Q?Bay=C4=B1rl=C4=B1?= =?utf-8?Q?=2FKammer?=) Newsgroups: gmane.emacs.devel Subject: [PATCH] Add file-dwim. Date: Sun, 18 Oct 2015 16:54:49 +0200 Message-ID: <87d1wcrzuu.fsf@T420.taylan> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Trace: ger.gmane.org 1445180111 15889 80.91.229.3 (18 Oct 2015 14:55:11 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Sun, 18 Oct 2015 14:55:11 +0000 (UTC) To: emacs-devel@gnu.org Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Sun Oct 18 16:55:00 2015 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1ZnpMR-0004Q6-Dq for ged-emacs-devel@m.gmane.org; Sun, 18 Oct 2015 16:54:59 +0200 Original-Received: from localhost ([::1]:34216 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZnpMQ-00068f-PL for ged-emacs-devel@m.gmane.org; Sun, 18 Oct 2015 10:54:58 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:43035) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZnpMM-00068X-8c for emacs-devel@gnu.org; Sun, 18 Oct 2015 10:54:55 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZnpMK-0001Mk-IR for emacs-devel@gnu.org; Sun, 18 Oct 2015 10:54:54 -0400 Original-Received: from mail-wi0-x22b.google.com ([2a00:1450:400c:c05::22b]:38093) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZnpMK-0001Me-83 for emacs-devel@gnu.org; Sun, 18 Oct 2015 10:54:52 -0400 Original-Received: by wicll6 with SMTP id ll6so66824672wic.1 for ; Sun, 18 Oct 2015 07:54:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:subject:date:message-id:user-agent:mime-version :content-type; bh=kF69ib1yPY507sFTcTPaBbmZoiGwqMhaeAd9wfDHwQI=; b=pbEHSoVpqLjW5+Cg3T7B5YAXhzQH/pFNR696NOtrhWDkQ9TG9SFelJd/9KF9z+/bCJ Ih/ufaoXSkZT3p+mMFF090vslW4klhKx0vF/t52h5F0BK20zHCMDuo2mO2t2pZpKb+uj u45R7vxDiJSw21JQt3sotGelQVN5YjwG1UhgyRYwi80uvVs9eEx52+rQ+LKTZTu0QGhm IQN/izXLjSSVtHvTEAd3UBWOfi35VgS10sjqXMxoQuS0VVa778eAMwlQCmge89Zyk2yV dkC/38YH5cRnrW52U3UKdLRTI9tHrLg+pLzoft39Kexl0gZmY4IjgygM2u4e3rlSLMqn leLg== X-Received: by 10.180.182.83 with SMTP id ec19mr15885280wic.35.1445180091699; Sun, 18 Oct 2015 07:54:51 -0700 (PDT) Original-Received: from T420.taylan ([2a02:908:c32:4740:221:ccff:fe66:68f0]) by smtp.gmail.com with ESMTPSA id w1sm34425382wjz.37.2015.10.18.07.54.50 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 18 Oct 2015 07:54:50 -0700 (PDT) User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.5 (gnu/linux) X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-Received-From: 2a00:1450:400c:c05::22b X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:191952 Archived-At: --=-=-= Content-Type: text/plain This is for ELPA. --=-=-= Content-Type: text/x-diff; charset=utf-8 Content-Disposition: inline; filename=0001-Add-file-dwim.patch Content-Transfer-Encoding: quoted-printable >From 288d2752c10349fffbde0cec070e4318690a5506 Mon Sep 17 00:00:00 2001 From: =3D?UTF-8?q?Taylan=3D20Ulrich=3D20Bay=3DC4=3DB1rl=3DC4=3DB1/Kammer?=3D Date: Sun, 18 Oct 2015 16:53:51 +0200 Subject: [PATCH] Add file-dwim. --- packages/file-dwim/file-dwim.el | 132 ++++++++++++++++++++++++++++++++++++= ++++ 1 file changed, 132 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..e33f725 --- /dev/null +++ b/packages/file-dwim/file-dwim.el @@ -0,0 +1,132 @@ +;;; file-dwim.el --- Do What I Mean for files. + +;; Copyright (C) 2015 Free Software Foundation, Inc. + +;; Author: Taylan Ulrich Bay=C4=B1rl=C4=B1/Kammer +;; 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 . + +;;; Commentary: + +;; Do any action on a file, according to a dispatch-table. E.g. specify t= hat +;; 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: +;; +;; (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 (concat "my-audio-player " (shell-quote-argument file)= ))) +;; +;; (defun play-video-file (file) +;; (shell-command (concat "my-video-player " (shell-quote-argument file)= ))) +;; +;; (defun open-guitarpro-file (file) +;; (async-shell-command (concat "tuxguitar " (shell-quote-argument 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." + :group '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)) + :group 'file-dwim) + +(defcustom file-dwim-default-action 'find-file + "The default action for when none of `file-dwim-action-list' +are applicable." + :type 'function + :group 'file-dwim) + +;;;###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 --=20 2.5.0 --=-=-=--