Try/try.el

100 lines
3.5 KiB
EmacsLisp
Raw Normal View History

2014-11-14 19:49:01 +00:00
;;; try.el --- Try out Emacs packages. -*- lexical-binding: t -*-
2014-11-14 12:21:18 +00:00
;; Copyright (C) 2014 Lars Tveito.
;; Author: Lars Tveito <larstvei@ifi.uio.no>
2014-11-14 22:27:23 +00:00
;; URL: http://github.com/larstvei/try
2014-11-14 22:36:02 +00:00
;; Created: 13th November 2014
;; Keywords: packages
;; Version: 0.0.1
2014-11-15 12:06:09 +00:00
;; Package-Requires: ((emacs "24"))
2014-11-14 12:21:18 +00:00
;; Contains code from GNU Emacs <https://www.gnu.org/software/emacs/>,
;; released under the GNU General Public License version 3 or later.
;; Try 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, or (at your option) any later version.
;;
;; Try 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
2014-11-14 19:49:01 +00:00
;; with Try. If not, see <http://www.gnu.org/licenses/>.
2014-11-14 12:21:18 +00:00
2014-11-14 22:36:02 +00:00
;;; Commentary:
2016-02-26 15:01:54 +00:00
;; Try is a package that allows you to try out Emacs packages without
;; installing them. If you pass a URL to a plain text `.el`-file it evaluates
2014-11-14 22:36:02 +00:00
;; the content, without storing the file.
2016-02-26 15:01:54 +00:00
;; For more info see https://github.com/larstvei/Try
2014-11-14 22:36:02 +00:00
2014-11-14 22:27:23 +00:00
;;; Code:
2014-11-13 22:20:08 +00:00
(require 'package)
(require 'url)
2016-02-02 23:27:07 +00:00
(defvar try-tmp-dir (make-temp-file "try" t)
2016-02-26 15:28:59 +00:00
"A temporary directory for storing packages.")
2014-11-13 22:20:08 +00:00
(defun try-raw-link-p (url)
2014-11-13 23:21:29 +00:00
"Returns non-nil if this looks like an URL to a .el file."
2014-11-13 22:20:08 +00:00
(string-match-p "[^:]*://\\([^?\r\n]+\\).*\.el?$" url))
(defun try-raw-link (url)
(with-current-buffer (url-retrieve-synchronously url)
(condition-case nil
(progn
(eval-region (search-forward-regexp "^$") (point-max))
2014-11-13 23:21:29 +00:00
(let ((str (car (last (split-string url "/")))))
(message "Trying %s!" str)))
2014-11-13 22:20:08 +00:00
((debug error)
(message "Could not parse %s" url) nil))))
(defun try-package-exists-p (package-name)
"Returns non-nil if the package is available for download."
(assq package-name package-archive-contents))
2014-11-13 22:20:08 +00:00
(defun try-compose (f g)
2014-11-13 23:21:29 +00:00
"Compose two functions."
2014-11-13 22:20:08 +00:00
(lambda (&rest x) (funcall f (apply g x))))
2016-02-02 23:27:40 +00:00
(defun try-complete (archive)
"Complete from available package names."
(let* ((f (try-compose #'symbol-name #'car))
(pkgs (mapcar f archive)))
(completing-read "url or package: " pkgs)))
2016-02-03 00:02:08 +00:00
;;;###autoload
2016-02-02 23:26:26 +00:00
(defun try-and-refresh ()
"Refreshes package-list before calling `try'."
(interactive)
(package-refresh-contents) (try))
2014-11-14 22:27:23 +00:00
;;;###autoload
(defun try (&optional url-or-package)
2014-11-13 23:21:29 +00:00
"Try out a package from your `package-archives' or pass a URL
to a raw .el file. Packages are stored in `try-tmp-dir' and raw
.el files are not stored at all."
2014-11-13 22:20:08 +00:00
(interactive)
;; Completions for packages.
2016-02-04 18:55:01 +00:00
(let* ((url-or-package (or (if (and url-or-package (symbolp url-or-package))
(symbol-name url-or-package)
url-or-package)
(try-complete package-archive-contents)))
(package-symbol (intern url-or-package)))
2014-11-13 22:20:08 +00:00
(cond ((try-raw-link-p url-or-package) (try-raw-link url-or-package))
((try-package-exists-p package-symbol)
2014-11-13 23:21:29 +00:00
(let ((package-user-dir try-tmp-dir)
(package-alist nil))
(package-install package-symbol)
2014-11-13 23:21:29 +00:00
(message "Trying %s!" url-or-package)))
(t (message (concat "Couldn't find a sensible way to try this. "
"Try running `package-refresh-contents'!"))))))
2014-11-13 22:20:08 +00:00
(provide 'try)
2014-11-14 22:27:23 +00:00
;;; try.el ends here.