| @ -1 +0,0 @@ | |||||
| (define-package "dash" "1.5.0" "A modern list library for Emacs" (quote nil)) | |||||
| @ -0,0 +1 @@ | |||||
| (define-package "dash" "2.7.0" "A modern list library for Emacs" 'nil) | |||||
| @ -0,0 +1,15 @@ | |||||
| ;;; epl-autoloads.el --- automatically extracted autoloads | |||||
| ;; | |||||
| ;;; Code: | |||||
| (add-to-list 'load-path (or (file-name-directory #$) (car load-path))) | |||||
| ;;;### (autoloads nil nil ("epl.el") (21404 16857 241875 9000)) | |||||
| ;;;*** | |||||
| ;; Local Variables: | |||||
| ;; version-control: never | |||||
| ;; no-byte-compile: t | |||||
| ;; no-update-autoloads: t | |||||
| ;; End: | |||||
| ;;; epl-autoloads.el ends here | |||||
| @ -0,0 +1 @@ | |||||
| (define-package "epl" "0.7" "Emacs Package Library" '((cl-lib "0.3"))) | |||||
| @ -0,0 +1,565 @@ | |||||
| ;;; epl.el --- Emacs Package Library -*- lexical-binding: t; -*- | |||||
| ;; Copyright (C) 2013, 2014 Sebastian Wiesner | |||||
| ;; Author: Sebastian Wiesner <lunaryorn@gmail.com> | |||||
| ;; Maintainer: Johan Andersson <johan.rejeep@gmail.com> | |||||
| ;; Sebastian Wiesner <lunaryorn@gmail.com> | |||||
| ;; Version: 0.7 | |||||
| ;; Package-Requires: ((cl-lib "0.3")) | |||||
| ;; Keywords: convenience | |||||
| ;; URL: http://github.com/cask/epl | |||||
| ;; This file is NOT part of GNU Emacs. | |||||
| ;; 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: | |||||
| ;; A package management library for Emacs, based on package.el. | |||||
| ;; The purpose of this library is to wrap all the quirks and hassle of | |||||
| ;; package.el into a sane API. | |||||
| ;; The following functions comprise the public interface of this library: | |||||
| ;;; Package directory selection | |||||
| ;; `epl-package-dir' gets the directory of packages. | |||||
| ;; `epl-default-package-dir' gets the default package directory. | |||||
| ;; `epl-change-package-dir' changes the directory of packages. | |||||
| ;;; Package system management | |||||
| ;; `epl-initialize' initializes the package system and activates all | |||||
| ;; packages. | |||||
| ;; `epl-reset' resets the package system. | |||||
| ;; `epl-refresh' refreshes all package archives. | |||||
| ;; `epl-add-archive' adds a new package archive. | |||||
| ;;; Package objects | |||||
| ;; Struct `epl-requirement' describes a requirement of a package with `name' and | |||||
| ;; `version' slots. | |||||
| ;; `epl-requirement-version-string' gets a requirement version as string. | |||||
| ;; Struct `epl-package' describes an installed or installable package with a | |||||
| ;; `name' and some internal `description'. | |||||
| ;; `epl-package-version' gets the version of a package. | |||||
| ;; `epl-package-version-string' gets the version of a package as string. | |||||
| ;; `epl-package-summary' gets the summary of a package. | |||||
| ;; `epl-package-requirements' gets the requirements of a package. | |||||
| ;; `epl-package-directory' gets the installation directory of a package. | |||||
| ;; `epl-package-from-buffer' creates a package object for the package contained | |||||
| ;; in the current buffer. | |||||
| ;; `epl-package-from-file' creates a package object for a package file, either | |||||
| ;; plain lisp or tarball. | |||||
| ;; `epl-package-from-descriptor-file' creates a package object for a package | |||||
| ;; description (i.e. *-pkg.el) file. | |||||
| ;;; Package database access | |||||
| ;; `epl-package-installed-p' determines whether a package is installed. | |||||
| ;; `epl-installed-packages' and `epl-available-packages' get all packages | |||||
| ;; installed and available for installation respectively. | |||||
| ;; `epl-find-installed-package' and `epl-find-available-packages' find installed | |||||
| ;; and available packages by name. | |||||
| ;; `epl-find-upgrades' finds all upgradable packages. | |||||
| ;; `epl-built-in-p' return true if package is built-in to Emacs. | |||||
| ;;; Package operations | |||||
| ;; `epl-install-file' installs a package file. | |||||
| ;; `epl-package-install' installs a package. | |||||
| ;; `epl-package-delete' deletes a package. | |||||
| ;; `epl-upgrade' upgrades packages. | |||||
| ;;; Code: | |||||
| (require 'cl-lib) | |||||
| (require 'package) | |||||
| (defun epl--package-desc-p (package) | |||||
| "Whether PACKAGE is a `package-desc' object. | |||||
| Like `package-desc-p', but return nil, if `package-desc-p' is not | |||||
| defined as function." | |||||
| (and (fboundp 'package-desc-p) (package-desc-p package))) | |||||
| ;;;; Package directory | |||||
| (defun epl-package-dir () | |||||
| "Get the directory of packages." | |||||
| package-user-dir) | |||||
| (defun epl-default-package-dir () | |||||
| "Get the default directory of packages." | |||||
| (eval (car (get 'package-user-dir 'standard-value)))) | |||||
| (defun epl-change-package-dir (directory) | |||||
| "Change the directory of packages to DIRECTORY." | |||||
| (setq package-user-dir directory) | |||||
| (epl-initialize)) | |||||
| ;;;; Package system management | |||||
| (defvar epl--load-path-before-initialize nil | |||||
| "Remember the load path for `epl-reset'.") | |||||
| (defun epl-initialize (&optional no-activate) | |||||
| "Load Emacs Lisp packages and activate them. | |||||
| With NO-ACTIVATE non-nil, do not activate packages." | |||||
| (setq epl--load-path-before-initialize load-path) | |||||
| (package-initialize no-activate)) | |||||
| (defalias 'epl-refresh 'package-refresh-contents) | |||||
| (defun epl-add-archive (name url) | |||||
| "Add a package archive with NAME and URL." | |||||
| (add-to-list 'package-archives (cons name url))) | |||||
| (defun epl-reset () | |||||
| "Reset the package system. | |||||
| Clear the list of installed and available packages, the list of | |||||
| package archives and reset the package directory." | |||||
| (setq package-alist nil | |||||
| package-archives nil | |||||
| package-archive-contents nil | |||||
| load-path epl--load-path-before-initialize) | |||||
| (when (boundp 'package-obsolete-alist) ; Legacy package.el | |||||
| (setq package-obsolete-alist nil)) | |||||
| (epl-change-package-dir (epl-default-package-dir))) | |||||
| ;;;; Package structures | |||||
| (cl-defstruct (epl-requirement | |||||
| (:constructor epl-requirement-create)) | |||||
| "Structure describing a requirement. | |||||
| Slots: | |||||
| `name' The name of the required package, as symbol. | |||||
| `version' The version of the required package, as version list." | |||||
| name | |||||
| version) | |||||
| (defun epl-requirement-version-string (requirement) | |||||
| "The version of a REQUIREMENT, as string." | |||||
| (package-version-join (epl-requirement-version requirement))) | |||||
| (cl-defstruct (epl-package (:constructor epl-package-create)) | |||||
| "Structure representing a package. | |||||
| Slots: | |||||
| `name' The package name, as symbol. | |||||
| `description' The package description. | |||||
| The format package description varies between package.el | |||||
| variants. For `package-desc' variants, it is simply the | |||||
| corresponding `package-desc' object. For legacy variants, it is | |||||
| a vector `[VERSION REQS DOCSTRING]'. | |||||
| Do not access `description' directly, but instead use the | |||||
| `epl-package' accessors." | |||||
| name | |||||
| description) | |||||
| (defmacro epl-package-as-description (var &rest body) | |||||
| "Cast VAR to a package description in BODY. | |||||
| VAR is a symbol, bound to an `epl-package' object. This macro | |||||
| casts this object to the `description' object, and binds the | |||||
| description to VAR in BODY." | |||||
| (declare (indent 1)) | |||||
| (unless (symbolp var) | |||||
| (signal 'wrong-type-argument (list #'symbolp var))) | |||||
| `(if (epl-package-p ,var) | |||||
| (let ((,var (epl-package-description ,var))) | |||||
| ,@body) | |||||
| (signal 'wrong-type-argument (list #'epl-package-p ,var)))) | |||||
| (defun epl-package--package-desc-p (package) | |||||
| "Whether the description of PACKAGE is a `package-desc'." | |||||
| (epl--package-desc-p (epl-package-description package))) | |||||
| (defun epl-package-version (package) | |||||
| "Get the version of PACKAGE, as version list." | |||||
| (epl-package-as-description package | |||||
| (cond | |||||
| ((fboundp 'package-desc-version) (package-desc-version package)) | |||||
| ;; Legacy | |||||
| ((fboundp 'package-desc-vers) | |||||
| (let ((version (package-desc-vers package))) | |||||
| (if (listp version) version (version-to-list version)))) | |||||
| (:else (error "Cannot get version from %S" package))))) | |||||
| (defun epl-package-version-string (package) | |||||
| "Get the version from a PACKAGE, as string." | |||||
| (package-version-join (epl-package-version package))) | |||||
| (defun epl-package-summary (package) | |||||
| "Get the summary of PACKAGE, as string." | |||||
| (epl-package-as-description package | |||||
| (cond | |||||
| ((fboundp 'package-desc-summary) (package-desc-summary package)) | |||||
| ((fboundp 'package-desc-doc) (package-desc-doc package)) ; Legacy | |||||
| (:else (error "Cannot get summary from %S" package))))) | |||||
| (defun epl-requirement--from-req (req) | |||||
| "Create a `epl-requirement' from a `package-desc' REQ." | |||||
| (cl-destructuring-bind (name version) req | |||||
| (epl-requirement-create :name name | |||||
| :version (if (listp version) version | |||||
| (version-to-list version))))) | |||||
| (defun epl-package-requirements (package) | |||||
| "Get the requirements of PACKAGE. | |||||
| The requirements are a list of `epl-requirement' objects." | |||||
| (epl-package-as-description package | |||||
| (mapcar #'epl-requirement--from-req (package-desc-reqs package)))) | |||||
| (defun epl-package-directory (package) | |||||
| "Get the directory PACKAGE is installed to. | |||||
| Return the absolute path of the installation directory of | |||||
| PACKAGE, or nil, if PACKAGE is not installed." | |||||
| (cond | |||||
| ((fboundp 'package-desc-dir) | |||||
| (package-desc-dir (epl-package-description package))) | |||||
| ((fboundp 'package--dir) | |||||
| (package--dir (epl-package-name package) | |||||
| (epl-package-version-string package))) | |||||
| (:else (error "Cannot get package directory from %S" package)))) | |||||
| (defun epl-package-->= (pkg1 pkg2) | |||||
| "Determine whether PKG1 is before PKG2 by version." | |||||
| (not (version-list-< (epl-package-version pkg1) | |||||
| (epl-package-version pkg2)))) | |||||
| (defun epl-package--from-package-desc (package-desc) | |||||
| "Create an `epl-package' from a PACKAGE-DESC. | |||||
| PACKAGE-DESC is a `package-desc' object, from recent package.el | |||||
| variants." | |||||
| (if (and (fboundp 'package-desc-name) | |||||
| (epl--package-desc-p package-desc)) | |||||
| (epl-package-create :name (package-desc-name package-desc) | |||||
| :description package-desc) | |||||
| (signal 'wrong-type-argument (list 'epl--package-desc-p package-desc)))) | |||||
| (defun epl-package--parse-info (info) | |||||
| "Parse a package.el INFO." | |||||
| (if (epl--package-desc-p info) | |||||
| (epl-package--from-package-desc info) | |||||
| ;; For legacy package.el, info is a vector [NAME REQUIRES DESCRIPTION | |||||
| ;; VERSION COMMENTARY]. We need to re-shape this vector into the | |||||
| ;; `package-alist' format [VERSION REQUIRES DESCRIPTION] to attach it to the | |||||
| ;; new `epl-package'. | |||||
| (let ((name (intern (aref info 0))) | |||||
| (info (vector (aref info 3) (aref info 1) (aref info 2)))) | |||||
| (epl-package-create :name name :description info)))) | |||||
| (defun epl-package-from-buffer (&optional buffer) | |||||
| "Create an `epl-package' object from BUFFER. | |||||
| BUFFER defaults to the current buffer." | |||||
| (let ((info (with-current-buffer (or buffer (current-buffer)) | |||||
| (package-buffer-info)))) | |||||
| (epl-package--parse-info info))) | |||||
| (defun epl-package-from-lisp-file (file-name) | |||||
| "Parse the package headers the file at FILE-NAME. | |||||
| Return an `epl-package' object with the header metadata." | |||||
| (with-temp-buffer | |||||
| (insert-file-contents file-name) | |||||
| (epl-package-from-buffer (current-buffer)))) | |||||
| (defun epl-package-from-tar-file (file-name) | |||||
| "Parse the package tarball at FILE-NAME. | |||||
| Return a `epl-package' object with the meta data of the tarball | |||||
| package in FILE-NAME." | |||||
| (condition-case nil | |||||
| ;; In legacy package.el, `package-tar-file-info' takes the name of the tar | |||||
| ;; file to parse as argument. In modern package.el, it has no arguments | |||||
| ;; and works on the current buffer. Hence, we just try to call the legacy | |||||
| ;; version, and if that fails because of a mismatch between formal and | |||||
| ;; actual arguments, we use the modern approach. To avoid spurious | |||||
| ;; signature warnings by the byte compiler, we suppress warnings when | |||||
| ;; calling the function. | |||||
| (epl-package--parse-info (with-no-warnings | |||||
| (package-tar-file-info file-name))) | |||||
| (wrong-number-of-arguments | |||||
| (with-temp-buffer | |||||
| (insert-file-contents-literally file-name) | |||||
| ;; Switch to `tar-mode' to enable extraction of the file. Modern | |||||
| ;; `package-tar-file-info' relies on `tar-mode', and signals an error if | |||||
| ;; called in a buffer with a different mode. | |||||
| (tar-mode) | |||||
| (epl-package--parse-info (with-no-warnings | |||||
| (package-tar-file-info))))))) | |||||
| (defun epl-package-from-file (file-name) | |||||
| "Parse the package at FILE-NAME. | |||||
| Return an `epl-package' object with the meta data of the package | |||||
| at FILE-NAME." | |||||
| (if (string-match-p (rx ".tar" string-end) file-name) | |||||
| (epl-package-from-tar-file file-name) | |||||
| (epl-package-from-lisp-file file-name))) | |||||
| (defun epl-package--parse-descriptor-requirement (requirement) | |||||
| "Parse a REQUIREMENT in a package descriptor." | |||||
| ;; This function is only called on legacy package.el. On package-desc | |||||
| ;; package.el, we just let package.el do the work. | |||||
| (cl-destructuring-bind (name version-string) requirement | |||||
| (list name (version-to-list version-string)))) | |||||
| (defun epl-package-from-descriptor-file (descriptor-file) | |||||
| "Load a `epl-package' from a package DESCRIPTOR-FILE. | |||||
| A package descriptor is a file defining a new package. Its name | |||||
| typically ends with -pkg.el." | |||||
| (with-temp-buffer | |||||
| (insert-file-contents descriptor-file) | |||||
| (goto-char (point-min)) | |||||
| (let ((sexp (read (current-buffer)))) | |||||
| (unless (eq (car sexp) 'define-package) | |||||
| (error "%S is no valid package descriptor" descriptor-file)) | |||||
| (if (and (fboundp 'package-desc-from-define) | |||||
| (fboundp 'package-desc-name)) | |||||
| ;; In Emacs snapshot, we can conveniently call a function to parse the | |||||
| ;; descriptor | |||||
| (let ((desc (apply #'package-desc-from-define (cdr sexp)))) | |||||
| (epl-package-create :name (package-desc-name desc) | |||||
| :description desc)) | |||||
| ;; In legacy package.el, we must manually deconstruct the descriptor, | |||||
| ;; because the load function has eval's the descriptor and has a lot of | |||||
| ;; global side-effects. | |||||
| (cl-destructuring-bind | |||||
| (name version-string summary requirements) (cdr sexp) | |||||
| (epl-package-create | |||||
| :name (intern name) | |||||
| :description | |||||
| (vector (version-to-list version-string) | |||||
| (mapcar #'epl-package--parse-descriptor-requirement | |||||
| ;; Strip the leading `quote' from the package list | |||||
| (cadr requirements)) | |||||
| summary))))))) | |||||
| ;;;; Package database access | |||||
| (defun epl-package-installed-p (package) | |||||
| "Determine whether a PACKAGE is installed. | |||||
| PACKAGE is either a package name as symbol, or a package object." | |||||
| (let ((name (if (epl-package-p package) | |||||
| (epl-package-name package) | |||||
| package)) | |||||
| (version (when (epl-package-p package) | |||||
| (epl-package-version package)))) | |||||
| (package-installed-p name version))) | |||||
| (defun epl--parse-package-list-entry (entry) | |||||
| "Parse a list of packages from ENTRY. | |||||
| ENTRY is a single entry in a package list, e.g. `package-alist', | |||||
| `package-archive-contents', etc. Typically it is a cons cell, | |||||
| but the exact format varies between package.el versions. This | |||||
| function tries to parse all known variants. | |||||
| Return a list of `epl-package' objects parsed from ENTRY." | |||||
| (let ((descriptions (cdr entry))) | |||||
| (cond | |||||
| ((listp descriptions) | |||||
| (sort (mapcar #'epl-package--from-package-desc descriptions) | |||||
| #'epl-package-->=)) | |||||
| ;; Legacy package.el has just a single package in an entry, which is a | |||||
| ;; standard description vector | |||||
| ((vectorp descriptions) | |||||
| (list (epl-package-create :name (car entry) | |||||
| :description descriptions))) | |||||
| (:else (error "Cannot parse entry %S" entry))))) | |||||
| (defun epl-installed-packages () | |||||
| "Get all installed packages. | |||||
| Return a list of package objects." | |||||
| (apply #'append (mapcar #'epl--parse-package-list-entry package-alist))) | |||||
| (defun epl--find-package-in-list (name list) | |||||
| "Find a package by NAME in a package LIST. | |||||
| Return a list of corresponding `epl-package' objects." | |||||
| (let ((entry (assq name list))) | |||||
| (when entry | |||||
| (epl--parse-package-list-entry entry)))) | |||||
| (defun epl-find-installed-package (name) | |||||
| "Find an installed package by NAME. | |||||
| NAME is a package name, as symbol. | |||||
| Return the installed package as `epl-package' object, or nil, if | |||||
| no package with NAME is installed." | |||||
| ;; FIXME: We must return *all* installed packages here | |||||
| (car (epl--find-package-in-list name package-alist))) | |||||
| (defun epl-available-packages () | |||||
| "Get all packages available for installed. | |||||
| Return a list of package objects." | |||||
| (apply #'append (mapcar #'epl--parse-package-list-entry | |||||
| package-archive-contents))) | |||||
| (defun epl-find-available-packages (name) | |||||
| "Find available packages for NAME. | |||||
| NAME is a package name, as symbol. | |||||
| Return a list of available packages for NAME, sorted by version | |||||
| number in descending order. Return nil, if there are no packages | |||||
| for NAME." | |||||
| (epl--find-package-in-list name package-archive-contents)) | |||||
| (cl-defstruct (epl-upgrade | |||||
| (:constructor epl-upgrade-create)) | |||||
| "Structure describing an upgradable package. | |||||
| Slots: | |||||
| `installed' The installed package | |||||
| `available' The package available for installation." | |||||
| installed | |||||
| available) | |||||
| (defun epl-find-upgrades (&optional packages) | |||||
| "Find all upgradable PACKAGES. | |||||
| PACKAGES is a list of package objects to upgrade, defaulting to | |||||
| all installed packages. | |||||
| Return a list of `epl-upgrade' objects describing all upgradable | |||||
| packages." | |||||
| (let ((packages (or packages (epl-installed-packages))) | |||||
| upgrades) | |||||
| (dolist (pkg packages) | |||||
| (let* ((version (epl-package-version pkg)) | |||||
| (name (epl-package-name pkg)) | |||||
| ;; Find the latest available package for NAME | |||||
| (available-pkg (car (epl-find-available-packages name))) | |||||
| (available-version (when available-pkg | |||||
| (epl-package-version available-pkg)))) | |||||
| (when (and available-version (version-list-< version available-version)) | |||||
| (push (epl-upgrade-create :installed pkg | |||||
| :available available-pkg) | |||||
| upgrades)))) | |||||
| (nreverse upgrades))) | |||||
| (defalias 'epl-built-in-p 'package-built-in-p) | |||||
| ;;;; Package operations | |||||
| (defalias 'epl-install-file 'package-install-file) | |||||
| (defun epl-package-install (package &optional force) | |||||
| "Install a PACKAGE. | |||||
| PACKAGE is a `epl-package' object. If FORCE is given and | |||||
| non-nil, install PACKAGE, even if it is already installed." | |||||
| (when (or force (not (epl-package-installed-p package))) | |||||
| (if (epl-package--package-desc-p package) | |||||
| (package-install (epl-package-description package)) | |||||
| ;; The legacy API installs by name. We have no control over versioning, | |||||
| ;; etc. | |||||
| (package-install (epl-package-name package))))) | |||||
| (defun epl-package-delete (package) | |||||
| "Delete a PACKAGE. | |||||
| PACKAGE is a `epl-package' object to delete." | |||||
| ;; package-delete allows for packages being trashed instead of fully deleted. | |||||
| ;; Let's prevent his silly behavior | |||||
| (let ((delete-by-moving-to-trash nil)) | |||||
| ;; The byte compiler will warn us that we are calling `package-delete' with | |||||
| ;; the wrong number of arguments, since it can't infer that we guarantee to | |||||
| ;; always call the correct version. Thus we suppress all warnings when | |||||
| ;; calling `package-delete'. I wish there was a more granular way to | |||||
| ;; disable just that specific warning, but it is what it is. | |||||
| (if (epl-package--package-desc-p package) | |||||
| (with-no-warnings | |||||
| (package-delete (epl-package-description package))) | |||||
| ;; The legacy API deletes by name (as string!) and version instead by | |||||
| ;; descriptor. Hence `package-delete' takes two arguments. For some | |||||
| ;; insane reason, the arguments are strings here! | |||||
| (let ((name (symbol-name (epl-package-name package))) | |||||
| (version (epl-package-version-string package))) | |||||
| (with-no-warnings | |||||
| (package-delete name version)) | |||||
| ;; Legacy package.el does not remove the deleted package | |||||
| ;; from the `package-alist', so we do it manually here. | |||||
| (let ((pkg (assq (epl-package-name package) package-alist))) | |||||
| (when pkg | |||||
| (setq package-alist (delq pkg package-alist)))))))) | |||||
| (defun epl-upgrade (&optional packages preserve-obsolete) | |||||
| "Upgrade PACKAGES. | |||||
| PACKAGES is a list of package objects to upgrade, defaulting to | |||||
| all installed packages. | |||||
| The old versions of the updated packages are deleted, unless | |||||
| PRESERVE-OBSOLETE is non-nil. | |||||
| Return a list of all performed upgrades, as a list of | |||||
| `epl-upgrade' objects." | |||||
| (let ((upgrades (epl-find-upgrades packages))) | |||||
| (dolist (upgrade upgrades) | |||||
| (epl-package-install (epl-upgrade-available upgrade) 'force) | |||||
| (unless preserve-obsolete | |||||
| (epl-package-delete (epl-upgrade-installed upgrade)))) | |||||
| upgrades)) | |||||
| (provide 'epl) | |||||
| ;;; epl.el ends here | |||||
| @ -1 +0,0 @@ | |||||
| (define-package "find-file-in-project" "3.2" "Find files in a project quickly." (quote nil)) | |||||
| @ -0,0 +1 @@ | |||||
| (define-package "find-file-in-project" "3.3" "Find files in a project quickly." 'nil) | |||||
| @ -0,0 +1,24 @@ | |||||
| * flymake-perlcritic.el 1.0.5 (2012-11-06-15:16) | |||||
| * Add support for php+-mode. | |||||
| (Contributed by @mgallego.) | |||||
| * flymake-perlcritic.el 1.0.4 (2012-03-28-06:08) | |||||
| * Append flymake-mode enable to php-hook rather than prepend. | |||||
| (Contributed by arnested.) | |||||
| * flymake-perlcritic.el 1.0.3 (2012-03-22-16:49) | |||||
| * Fixed accidental inclusion of Makefile in previous patch. | |||||
| * flymake-perlcritic.el 1.0.2 (2012-03-22-06:15) | |||||
| * Makefile for ELPA packaging. | |||||
| (Contributed by arnested.) | |||||
| * Attempt to autolocate flymake_phpcs wrapper for default value. | |||||
| (Contributed by arnested.) | |||||
| * flymake-perlcritic.el 1.0.1 (2012-01-11-22:48) | |||||
| * Add support for toggle of sniff names in errors. | |||||
| (Requires PHP_CodeSniffer >= 1.3.4 or from GitHub.) | |||||
| * Add help-text to flymake_phpcs. | |||||
| * Bequeath copyright to FSF and add GPL license. | |||||
| * Define init function as flymake-phpcs-*. | |||||
| * Override Flymake PHP functions less evilly. | |||||
| @ -0,0 +1,674 @@ | |||||
| GNU GENERAL PUBLIC LICENSE | |||||
| Version 3, 29 June 2007 | |||||
| Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> | |||||
| Everyone is permitted to copy and distribute verbatim copies | |||||
| of this license document, but changing it is not allowed. | |||||
| Preamble | |||||
| The GNU General Public License is a free, copyleft license for | |||||
| software and other kinds of works. | |||||
| The licenses for most software and other practical works are designed | |||||
| to take away your freedom to share and change the works. By contrast, | |||||
| the GNU General Public License is intended to guarantee your freedom to | |||||
| share and change all versions of a program--to make sure it remains free | |||||
| software for all its users. We, the Free Software Foundation, use the | |||||
| GNU General Public License for most of our software; it applies also to | |||||
| any other work released this way by its authors. You can apply it to | |||||
| your programs, too. | |||||
| When we speak of free software, we are referring to freedom, not | |||||
| price. Our General Public Licenses are designed to make sure that you | |||||
| have the freedom to distribute copies of free software (and charge for | |||||
| them if you wish), that you receive source code or can get it if you | |||||
| want it, that you can change the software or use pieces of it in new | |||||
| free programs, and that you know you can do these things. | |||||
| To protect your rights, we need to prevent others from denying you | |||||
| these rights or asking you to surrender the rights. Therefore, you have | |||||
| certain responsibilities if you distribute copies of the software, or if | |||||
| you modify it: responsibilities to respect the freedom of others. | |||||
| For example, if you distribute copies of such a program, whether | |||||
| gratis or for a fee, you must pass on to the recipients the same | |||||
| freedoms that you received. You must make sure that they, too, receive | |||||
| or can get the source code. And you must show them these terms so they | |||||
| know their rights. | |||||
| Developers that use the GNU GPL protect your rights with two steps: | |||||
| (1) assert copyright on the software, and (2) offer you this License | |||||
| giving you legal permission to copy, distribute and/or modify it. | |||||
| For the developers' and authors' protection, the GPL clearly explains | |||||
| that there is no warranty for this free software. For both users' and | |||||
| authors' sake, the GPL requires that modified versions be marked as | |||||
| changed, so that their problems will not be attributed erroneously to | |||||
| authors of previous versions. | |||||
| Some devices are designed to deny users access to install or run | |||||
| modified versions of the software inside them, although the manufacturer | |||||
| can do so. This is fundamentally incompatible with the aim of | |||||
| protecting users' freedom to change the software. The systematic | |||||
| pattern of such abuse occurs in the area of products for individuals to | |||||
| use, which is precisely where it is most unacceptable. Therefore, we | |||||
| have designed this version of the GPL to prohibit the practice for those | |||||
| products. If such problems arise substantially in other domains, we | |||||
| stand ready to extend this provision to those domains in future versions | |||||
| of the GPL, as needed to protect the freedom of users. | |||||
| Finally, every program is threatened constantly by software patents. | |||||
| States should not allow patents to restrict development and use of | |||||
| software on general-purpose computers, but in those that do, we wish to | |||||
| avoid the special danger that patents applied to a free program could | |||||
| make it effectively proprietary. To prevent this, the GPL assures that | |||||
| patents cannot be used to render the program non-free. | |||||
| The precise terms and conditions for copying, distribution and | |||||
| modification follow. | |||||
| TERMS AND CONDITIONS | |||||
| 0. Definitions. | |||||
| "This License" refers to version 3 of the GNU General Public License. | |||||
| "Copyright" also means copyright-like laws that apply to other kinds of | |||||
| works, such as semiconductor masks. | |||||
| "The Program" refers to any copyrightable work licensed under this | |||||
| License. Each licensee is addressed as "you". "Licensees" and | |||||
| "recipients" may be individuals or organizations. | |||||
| To "modify" a work means to copy from or adapt all or part of the work | |||||
| in a fashion requiring copyright permission, other than the making of an | |||||
| exact copy. The resulting work is called a "modified version" of the | |||||
| earlier work or a work "based on" the earlier work. | |||||
| A "covered work" means either the unmodified Program or a work based | |||||
| on the Program. | |||||
| To "propagate" a work means to do anything with it that, without | |||||
| permission, would make you directly or secondarily liable for | |||||
| infringement under applicable copyright law, except executing it on a | |||||
| computer or modifying a private copy. Propagation includes copying, | |||||
| distribution (with or without modification), making available to the | |||||
| public, and in some countries other activities as well. | |||||
| To "convey" a work means any kind of propagation that enables other | |||||
| parties to make or receive copies. Mere interaction with a user through | |||||
| a computer network, with no transfer of a copy, is not conveying. | |||||
| An interactive user interface displays "Appropriate Legal Notices" | |||||
| to the extent that it includes a convenient and prominently visible | |||||
| feature that (1) displays an appropriate copyright notice, and (2) | |||||
| tells the user that there is no warranty for the work (except to the | |||||
| extent that warranties are provided), that licensees may convey the | |||||
| work under this License, and how to view a copy of this License. If | |||||
| the interface presents a list of user commands or options, such as a | |||||
| menu, a prominent item in the list meets this criterion. | |||||
| 1. Source Code. | |||||
| The "source code" for a work means the preferred form of the work | |||||
| for making modifications to it. "Object code" means any non-source | |||||
| form of a work. | |||||
| A "Standard Interface" means an interface that either is an official | |||||
| standard defined by a recognized standards body, or, in the case of | |||||
| interfaces specified for a particular programming language, one that | |||||
| is widely used among developers working in that language. | |||||
| The "System Libraries" of an executable work include anything, other | |||||
| than the work as a whole, that (a) is included in the normal form of | |||||
| packaging a Major Component, but which is not part of that Major | |||||
| Component, and (b) serves only to enable use of the work with that | |||||
| Major Component, or to implement a Standard Interface for which an | |||||
| implementation is available to the public in source code form. A | |||||
| "Major Component", in this context, means a major essential component | |||||
| (kernel, window system, and so on) of the specific operating system | |||||
| (if any) on which the executable work runs, or a compiler used to | |||||
| produce the work, or an object code interpreter used to run it. | |||||
| The "Corresponding Source" for a work in object code form means all | |||||
| the source code needed to generate, install, and (for an executable | |||||
| work) run the object code and to modify the work, including scripts to | |||||
| control those activities. However, it does not include the work's | |||||
| System Libraries, or general-purpose tools or generally available free | |||||
| programs which are used unmodified in performing those activities but | |||||
| which are not part of the work. For example, Corresponding Source | |||||
| includes interface definition files associated with source files for | |||||
| the work, and the source code for shared libraries and dynamically | |||||
| linked subprograms that the work is specifically designed to require, | |||||
| such as by intimate data communication or control flow between those | |||||
| subprograms and other parts of the work. | |||||
| The Corresponding Source need not include anything that users | |||||
| can regenerate automatically from other parts of the Corresponding | |||||
| Source. | |||||
| The Corresponding Source for a work in source code form is that | |||||
| same work. | |||||
| 2. Basic Permissions. | |||||
| All rights granted under this License are granted for the term of | |||||
| copyright on the Program, and are irrevocable provided the stated | |||||
| conditions are met. This License explicitly affirms your unlimited | |||||
| permission to run the unmodified Program. The output from running a | |||||
| covered work is covered by this License only if the output, given its | |||||
| content, constitutes a covered work. This License acknowledges your | |||||
| rights of fair use or other equivalent, as provided by copyright law. | |||||
| You may make, run and propagate covered works that you do not | |||||
| convey, without conditions so long as your license otherwise remains | |||||
| in force. You may convey covered works to others for the sole purpose | |||||
| of having them make modifications exclusively for you, or provide you | |||||
| with facilities for running those works, provided that you comply with | |||||
| the terms of this License in conveying all material for which you do | |||||
| not control copyright. Those thus making or running the covered works | |||||
| for you must do so exclusively on your behalf, under your direction | |||||
| and control, on terms that prohibit them from making any copies of | |||||
| your copyrighted material outside their relationship with you. | |||||
| Conveying under any other circumstances is permitted solely under | |||||
| the conditions stated below. Sublicensing is not allowed; section 10 | |||||
| makes it unnecessary. | |||||
| 3. Protecting Users' Legal Rights From Anti-Circumvention Law. | |||||
| No covered work shall be deemed part of an effective technological | |||||
| measure under any applicable law fulfilling obligations under article | |||||
| 11 of the WIPO copyright treaty adopted on 20 December 1996, or | |||||
| similar laws prohibiting or restricting circumvention of such | |||||
| measures. | |||||
| When you convey a covered work, you waive any legal power to forbid | |||||
| circumvention of technological measures to the extent such circumvention | |||||
| is effected by exercising rights under this License with respect to | |||||
| the covered work, and you disclaim any intention to limit operation or | |||||
| modification of the work as a means of enforcing, against the work's | |||||
| users, your or third parties' legal rights to forbid circumvention of | |||||
| technological measures. | |||||
| 4. Conveying Verbatim Copies. | |||||
| You may convey verbatim copies of the Program's source code as you | |||||
| receive it, in any medium, provided that you conspicuously and | |||||
| appropriately publish on each copy an appropriate copyright notice; | |||||
| keep intact all notices stating that this License and any | |||||
| non-permissive terms added in accord with section 7 apply to the code; | |||||
| keep intact all notices of the absence of any warranty; and give all | |||||
| recipients a copy of this License along with the Program. | |||||
| You may charge any price or no price for each copy that you convey, | |||||
| and you may offer support or warranty protection for a fee. | |||||
| 5. Conveying Modified Source Versions. | |||||
| You may convey a work based on the Program, or the modifications to | |||||
| produce it from the Program, in the form of source code under the | |||||
| terms of section 4, provided that you also meet all of these conditions: | |||||
| a) The work must carry prominent notices stating that you modified | |||||
| it, and giving a relevant date. | |||||
| b) The work must carry prominent notices stating that it is | |||||
| released under this License and any conditions added under section | |||||
| 7. This requirement modifies the requirement in section 4 to | |||||
| "keep intact all notices". | |||||
| c) You must license the entire work, as a whole, under this | |||||
| License to anyone who comes into possession of a copy. This | |||||
| License will therefore apply, along with any applicable section 7 | |||||
| additional terms, to the whole of the work, and all its parts, | |||||
| regardless of how they are packaged. This License gives no | |||||
| permission to license the work in any other way, but it does not | |||||
| invalidate such permission if you have separately received it. | |||||
| d) If the work has interactive user interfaces, each must display | |||||
| Appropriate Legal Notices; however, if the Program has interactive | |||||
| interfaces that do not display Appropriate Legal Notices, your | |||||
| work need not make them do so. | |||||
| A compilation of a covered work with other separate and independent | |||||
| works, which are not by their nature extensions of the covered work, | |||||
| and which are not combined with it such as to form a larger program, | |||||
| in or on a volume of a storage or distribution medium, is called an | |||||
| "aggregate" if the compilation and its resulting copyright are not | |||||
| used to limit the access or legal rights of the compilation's users | |||||
| beyond what the individual works permit. Inclusion of a covered work | |||||
| in an aggregate does not cause this License to apply to the other | |||||
| parts of the aggregate. | |||||
| 6. Conveying Non-Source Forms. | |||||
| You may convey a covered work in object code form under the terms | |||||
| of sections 4 and 5, provided that you also convey the | |||||
| machine-readable Corresponding Source under the terms of this License, | |||||
| in one of these ways: | |||||
| a) Convey the object code in, or embodied in, a physical product | |||||
| (including a physical distribution medium), accompanied by the | |||||
| Corresponding Source fixed on a durable physical medium | |||||
| customarily used for software interchange. | |||||
| b) Convey the object code in, or embodied in, a physical product | |||||
| (including a physical distribution medium), accompanied by a | |||||
| written offer, valid for at least three years and valid for as | |||||
| long as you offer spare parts or customer support for that product | |||||
| model, to give anyone who possesses the object code either (1) a | |||||
| copy of the Corresponding Source for all the software in the | |||||
| product that is covered by this License, on a durable physical | |||||
| medium customarily used for software interchange, for a price no | |||||
| more than your reasonable cost of physically performing this | |||||
| conveying of source, or (2) access to copy the | |||||
| Corresponding Source from a network server at no charge. | |||||
| c) Convey individual copies of the object code with a copy of the | |||||
| written offer to provide the Corresponding Source. This | |||||
| alternative is allowed only occasionally and noncommercially, and | |||||
| only if you received the object code with such an offer, in accord | |||||
| with subsection 6b. | |||||
| d) Convey the object code by offering access from a designated | |||||
| place (gratis or for a charge), and offer equivalent access to the | |||||
| Corresponding Source in the same way through the same place at no | |||||
| further charge. You need not require recipients to copy the | |||||
| Corresponding Source along with the object code. If the place to | |||||
| copy the object code is a network server, the Corresponding Source | |||||
| may be on a different server (operated by you or a third party) | |||||
| that supports equivalent copying facilities, provided you maintain | |||||
| clear directions next to the object code saying where to find the | |||||
| Corresponding Source. Regardless of what server hosts the | |||||
| Corresponding Source, you remain obligated to ensure that it is | |||||
| available for as long as needed to satisfy these requirements. | |||||
| e) Convey the object code using peer-to-peer transmission, provided | |||||
| you inform other peers where the object code and Corresponding | |||||
| Source of the work are being offered to the general public at no | |||||
| charge under subsection 6d. | |||||
| A separable portion of the object code, whose source code is excluded | |||||
| from the Corresponding Source as a System Library, need not be | |||||
| included in conveying the object code work. | |||||
| A "User Product" is either (1) a "consumer product", which means any | |||||
| tangible personal property which is normally used for personal, family, | |||||
| or household purposes, or (2) anything designed or sold for incorporation | |||||
| into a dwelling. In determining whether a product is a consumer product, | |||||
| doubtful cases shall be resolved in favor of coverage. For a particular | |||||
| product received by a particular user, "normally used" refers to a | |||||
| typical or common use of that class of product, regardless of the status | |||||
| of the particular user or of the way in which the particular user | |||||
| actually uses, or expects or is expected to use, the product. A product | |||||
| is a consumer product regardless of whether the product has substantial | |||||
| commercial, industrial or non-consumer uses, unless such uses represent | |||||
| the only significant mode of use of the product. | |||||
| "Installation Information" for a User Product means any methods, | |||||
| procedures, authorization keys, or other information required to install | |||||
| and execute modified versions of a covered work in that User Product from | |||||
| a modified version of its Corresponding Source. The information must | |||||
| suffice to ensure that the continued functioning of the modified object | |||||
| code is in no case prevented or interfered with solely because | |||||
| modification has been made. | |||||
| If you convey an object code work under this section in, or with, or | |||||
| specifically for use in, a User Product, and the conveying occurs as | |||||
| part of a transaction in which the right of possession and use of the | |||||
| User Product is transferred to the recipient in perpetuity or for a | |||||
| fixed term (regardless of how the transaction is characterized), the | |||||
| Corresponding Source conveyed under this section must be accompanied | |||||
| by the Installation Information. But this requirement does not apply | |||||
| if neither you nor any third party retains the ability to install | |||||
| modified object code on the User Product (for example, the work has | |||||
| been installed in ROM). | |||||
| The requirement to provide Installation Information does not include a | |||||
| requirement to continue to provide support service, warranty, or updates | |||||
| for a work that has been modified or installed by the recipient, or for | |||||
| the User Product in which it has been modified or installed. Access to a | |||||
| network may be denied when the modification itself materially and | |||||
| adversely affects the operation of the network or violates the rules and | |||||
| protocols for communication across the network. | |||||
| Corresponding Source conveyed, and Installation Information provided, | |||||
| in accord with this section must be in a format that is publicly | |||||
| documented (and with an implementation available to the public in | |||||
| source code form), and must require no special password or key for | |||||
| unpacking, reading or copying. | |||||
| 7. Additional Terms. | |||||
| "Additional permissions" are terms that supplement the terms of this | |||||
| License by making exceptions from one or more of its conditions. | |||||
| Additional permissions that are applicable to the entire Program shall | |||||
| be treated as though they were included in this License, to the extent | |||||
| that they are valid under applicable law. If additional permissions | |||||
| apply only to part of the Program, that part may be used separately | |||||
| under those permissions, but the entire Program remains governed by | |||||
| this License without regard to the additional permissions. | |||||
| When you convey a copy of a covered work, you may at your option | |||||
| remove any additional permissions from that copy, or from any part of | |||||
| it. (Additional permissions may be written to require their own | |||||
| removal in certain cases when you modify the work.) You may place | |||||
| additional permissions on material, added by you to a covered work, | |||||
| for which you have or can give appropriate copyright permission. | |||||
| Notwithstanding any other provision of this License, for material you | |||||
| add to a covered work, you may (if authorized by the copyright holders of | |||||
| that material) supplement the terms of this License with terms: | |||||
| a) Disclaiming warranty or limiting liability differently from the | |||||
| terms of sections 15 and 16 of this License; or | |||||
| b) Requiring preservation of specified reasonable legal notices or | |||||
| author attributions in that material or in the Appropriate Legal | |||||
| Notices displayed by works containing it; or | |||||
| c) Prohibiting misrepresentation of the origin of that material, or | |||||
| requiring that modified versions of such material be marked in | |||||
| reasonable ways as different from the original version; or | |||||
| d) Limiting the use for publicity purposes of names of licensors or | |||||
| authors of the material; or | |||||
| e) Declining to grant rights under trademark law for use of some | |||||
| trade names, trademarks, or service marks; or | |||||
| f) Requiring indemnification of licensors and authors of that | |||||
| material by anyone who conveys the material (or modified versions of | |||||
| it) with contractual assumptions of liability to the recipient, for | |||||
| any liability that these contractual assumptions directly impose on | |||||
| those licensors and authors. | |||||
| All other non-permissive additional terms are considered "further | |||||
| restrictions" within the meaning of section 10. If the Program as you | |||||
| received it, or any part of it, contains a notice stating that it is | |||||
| governed by this License along with a term that is a further | |||||
| restriction, you may remove that term. If a license document contains | |||||
| a further restriction but permits relicensing or conveying under this | |||||
| License, you may add to a covered work material governed by the terms | |||||
| of that license document, provided that the further restriction does | |||||
| not survive such relicensing or conveying. | |||||
| If you add terms to a covered work in accord with this section, you | |||||
| must place, in the relevant source files, a statement of the | |||||
| additional terms that apply to those files, or a notice indicating | |||||
| where to find the applicable terms. | |||||
| Additional terms, permissive or non-permissive, may be stated in the | |||||
| form of a separately written license, or stated as exceptions; | |||||
| the above requirements apply either way. | |||||
| 8. Termination. | |||||
| You may not propagate or modify a covered work except as expressly | |||||
| provided under this License. Any attempt otherwise to propagate or | |||||
| modify it is void, and will automatically terminate your rights under | |||||
| this License (including any patent licenses granted under the third | |||||
| paragraph of section 11). | |||||
| However, if you cease all violation of this License, then your | |||||
| license from a particular copyright holder is reinstated (a) | |||||
| provisionally, unless and until the copyright holder explicitly and | |||||
| finally terminates your license, and (b) permanently, if the copyright | |||||
| holder fails to notify you of the violation by some reasonable means | |||||
| prior to 60 days after the cessation. | |||||
| Moreover, your license from a particular copyright holder is | |||||
| reinstated permanently if the copyright holder notifies you of the | |||||
| violation by some reasonable means, this is the first time you have | |||||
| received notice of violation of this License (for any work) from that | |||||
| copyright holder, and you cure the violation prior to 30 days after | |||||
| your receipt of the notice. | |||||
| Termination of your rights under this section does not terminate the | |||||
| licenses of parties who have received copies or rights from you under | |||||
| this License. If your rights have been terminated and not permanently | |||||
| reinstated, you do not qualify to receive new licenses for the same | |||||
| material under section 10. | |||||
| 9. Acceptance Not Required for Having Copies. | |||||
| You are not required to accept this License in order to receive or | |||||
| run a copy of the Program. Ancillary propagation of a covered work | |||||
| occurring solely as a consequence of using peer-to-peer transmission | |||||
| to receive a copy likewise does not require acceptance. However, | |||||
| nothing other than this License grants you permission to propagate or | |||||
| modify any covered work. These actions infringe copyright if you do | |||||
| not accept this License. Therefore, by modifying or propagating a | |||||
| covered work, you indicate your acceptance of this License to do so. | |||||
| 10. Automatic Licensing of Downstream Recipients. | |||||
| Each time you convey a covered work, the recipient automatically | |||||
| receives a license from the original licensors, to run, modify and | |||||
| propagate that work, subject to this License. You are not responsible | |||||
| for enforcing compliance by third parties with this License. | |||||
| An "entity transaction" is a transaction transferring control of an | |||||
| organization, or substantially all assets of one, or subdividing an | |||||
| organization, or merging organizations. If propagation of a covered | |||||
| work results from an entity transaction, each party to that | |||||
| transaction who receives a copy of the work also receives whatever | |||||
| licenses to the work the party's predecessor in interest had or could | |||||
| give under the previous paragraph, plus a right to possession of the | |||||
| Corresponding Source of the work from the predecessor in interest, if | |||||
| the predecessor has it or can get it with reasonable efforts. | |||||
| You may not impose any further restrictions on the exercise of the | |||||
| rights granted or affirmed under this License. For example, you may | |||||
| not impose a license fee, royalty, or other charge for exercise of | |||||
| rights granted under this License, and you may not initiate litigation | |||||
| (including a cross-claim or counterclaim in a lawsuit) alleging that | |||||
| any patent claim is infringed by making, using, selling, offering for | |||||
| sale, or importing the Program or any portion of it. | |||||
| 11. Patents. | |||||
| A "contributor" is a copyright holder who authorizes use under this | |||||
| License of the Program or a work on which the Program is based. The | |||||
| work thus licensed is called the contributor's "contributor version". | |||||
| A contributor's "essential patent claims" are all patent claims | |||||
| owned or controlled by the contributor, whether already acquired or | |||||
| hereafter acquired, that would be infringed by some manner, permitted | |||||
| by this License, of making, using, or selling its contributor version, | |||||
| but do not include claims that would be infringed only as a | |||||
| consequence of further modification of the contributor version. For | |||||
| purposes of this definition, "control" includes the right to grant | |||||
| patent sublicenses in a manner consistent with the requirements of | |||||
| this License. | |||||
| Each contributor grants you a non-exclusive, worldwide, royalty-free | |||||
| patent license under the contributor's essential patent claims, to | |||||
| make, use, sell, offer for sale, import and otherwise run, modify and | |||||
| propagate the contents of its contributor version. | |||||
| In the following three paragraphs, a "patent license" is any express | |||||
| agreement or commitment, however denominated, not to enforce a patent | |||||
| (such as an express permission to practice a patent or covenant not to | |||||
| sue for patent infringement). To "grant" such a patent license to a | |||||
| party means to make such an agreement or commitment not to enforce a | |||||
| patent against the party. | |||||
| If you convey a covered work, knowingly relying on a patent license, | |||||
| and the Corresponding Source of the work is not available for anyone | |||||
| to copy, free of charge and under the terms of this License, through a | |||||
| publicly available network server or other readily accessible means, | |||||
| then you must either (1) cause the Corresponding Source to be so | |||||
| available, or (2) arrange to deprive yourself of the benefit of the | |||||
| patent license for this particular work, or (3) arrange, in a manner | |||||
| consistent with the requirements of this License, to extend the patent | |||||
| license to downstream recipients. "Knowingly relying" means you have | |||||
| actual knowledge that, but for the patent license, your conveying the | |||||
| covered work in a country, or your recipient's use of the covered work | |||||
| in a country, would infringe one or more identifiable patents in that | |||||
| country that you have reason to believe are valid. | |||||
| If, pursuant to or in connection with a single transaction or | |||||
| arrangement, you convey, or propagate by procuring conveyance of, a | |||||
| covered work, and grant a patent license to some of the parties | |||||
| receiving the covered work authorizing them to use, propagate, modify | |||||
| or convey a specific copy of the covered work, then the patent license | |||||
| you grant is automatically extended to all recipients of the covered | |||||
| work and works based on it. | |||||
| A patent license is "discriminatory" if it does not include within | |||||
| the scope of its coverage, prohibits the exercise of, or is | |||||
| conditioned on the non-exercise of one or more of the rights that are | |||||
| specifically granted under this License. You may not convey a covered | |||||
| work if you are a party to an arrangement with a third party that is | |||||
| in the business of distributing software, under which you make payment | |||||
| to the third party based on the extent of your activity of conveying | |||||
| the work, and under which the third party grants, to any of the | |||||
| parties who would receive the covered work from you, a discriminatory | |||||
| patent license (a) in connection with copies of the covered work | |||||
| conveyed by you (or copies made from those copies), or (b) primarily | |||||
| for and in connection with specific products or compilations that | |||||
| contain the covered work, unless you entered into that arrangement, | |||||
| or that patent license was granted, prior to 28 March 2007. | |||||
| Nothing in this License shall be construed as excluding or limiting | |||||
| any implied license or other defenses to infringement that may | |||||
| otherwise be available to you under applicable patent law. | |||||
| 12. No Surrender of Others' Freedom. | |||||
| If conditions are imposed on you (whether by court order, agreement or | |||||
| otherwise) that contradict the conditions of this License, they do not | |||||
| excuse you from the conditions of this License. If you cannot convey a | |||||
| covered work so as to satisfy simultaneously your obligations under this | |||||
| License and any other pertinent obligations, then as a consequence you may | |||||
| not convey it at all. For example, if you agree to terms that obligate you | |||||
| to collect a royalty for further conveying from those to whom you convey | |||||
| the Program, the only way you could satisfy both those terms and this | |||||
| License would be to refrain entirely from conveying the Program. | |||||
| 13. Use with the GNU Affero General Public License. | |||||
| Notwithstanding any other provision of this License, you have | |||||
| permission to link or combine any covered work with a work licensed | |||||
| under version 3 of the GNU Affero General Public License into a single | |||||
| combined work, and to convey the resulting work. The terms of this | |||||
| License will continue to apply to the part which is the covered work, | |||||
| but the special requirements of the GNU Affero General Public License, | |||||
| section 13, concerning interaction through a network will apply to the | |||||
| combination as such. | |||||
| 14. Revised Versions of this License. | |||||
| The Free Software Foundation may publish revised and/or new versions of | |||||
| the GNU General Public License from time to time. Such new versions will | |||||
| be similar in spirit to the present version, but may differ in detail to | |||||
| address new problems or concerns. | |||||
| Each version is given a distinguishing version number. If the | |||||
| Program specifies that a certain numbered version of the GNU General | |||||
| Public License "or any later version" applies to it, you have the | |||||
| option of following the terms and conditions either of that numbered | |||||
| version or of any later version published by the Free Software | |||||
| Foundation. If the Program does not specify a version number of the | |||||
| GNU General Public License, you may choose any version ever published | |||||
| by the Free Software Foundation. | |||||
| If the Program specifies that a proxy can decide which future | |||||
| versions of the GNU General Public License can be used, that proxy's | |||||
| public statement of acceptance of a version permanently authorizes you | |||||
| to choose that version for the Program. | |||||
| Later license versions may give you additional or different | |||||
| permissions. However, no additional obligations are imposed on any | |||||
| author or copyright holder as a result of your choosing to follow a | |||||
| later version. | |||||
| 15. Disclaimer of Warranty. | |||||
| THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY | |||||
| APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT | |||||
| HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY | |||||
| OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, | |||||
| THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | |||||
| PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM | |||||
| IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF | |||||
| ALL NECESSARY SERVICING, REPAIR OR CORRECTION. | |||||
| 16. Limitation of Liability. | |||||
| IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING | |||||
| WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS | |||||
| THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY | |||||
| GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE | |||||
| USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF | |||||
| DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD | |||||
| PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), | |||||
| EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF | |||||
| SUCH DAMAGES. | |||||
| 17. Interpretation of Sections 15 and 16. | |||||
| If the disclaimer of warranty and limitation of liability provided | |||||
| above cannot be given local legal effect according to their terms, | |||||
| reviewing courts shall apply local law that most closely approximates | |||||
| an absolute waiver of all civil liability in connection with the | |||||
| Program, unless a warranty or assumption of liability accompanies a | |||||
| copy of the Program in return for a fee. | |||||
| END OF TERMS AND CONDITIONS | |||||
| How to Apply These Terms to Your New Programs | |||||
| If you develop a new program, and you want it to be of the greatest | |||||
| possible use to the public, the best way to achieve this is to make it | |||||
| free software which everyone can redistribute and change under these terms. | |||||
| To do so, attach the following notices to the program. It is safest | |||||
| to attach them to the start of each source file to most effectively | |||||
| state the exclusion of warranty; and each file should have at least | |||||
| the "copyright" line and a pointer to where the full notice is found. | |||||
| <one line to give the program's name and a brief idea of what it does.> | |||||
| Copyright (C) <year> <name of author> | |||||
| 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/>. | |||||
| Also add information on how to contact you by electronic and paper mail. | |||||
| If the program does terminal interaction, make it output a short | |||||
| notice like this when it starts in an interactive mode: | |||||
| <program> Copyright (C) <year> <name of author> | |||||
| This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. | |||||
| This is free software, and you are welcome to redistribute it | |||||
| under certain conditions; type `show c' for details. | |||||
| The hypothetical commands `show w' and `show c' should show the appropriate | |||||
| parts of the General Public License. Of course, your program's commands | |||||
| might be different; for a GUI interface, you would use an "about box". | |||||
| You should also get your employer (if you work as a programmer) or school, | |||||
| if any, to sign a "copyright disclaimer" for the program, if necessary. | |||||
| For more information on this, and how to apply and follow the GNU GPL, see | |||||
| <http://www.gnu.org/licenses/>. | |||||
| The GNU General Public License does not permit incorporating your program | |||||
| into proprietary programs. If your program is a subroutine library, you | |||||
| may consider it more useful to permit linking proprietary applications with | |||||
| the library. If this is what you want to do, use the GNU Lesser General | |||||
| Public License instead of this License. But first, please read | |||||
| <http://www.gnu.org/philosophy/why-not-lgpl.html>. | |||||
| @ -0,0 +1,63 @@ | |||||
| PHP_CodeSniffer plugin for Emacs Flymake mode | |||||
| ============================================= | |||||
| Flymake mode is an Emacs mode that allows you to run continuous | |||||
| syntax checks against the current buffer "While U Type". | |||||
| PHP_CodeSniffer is a static analysis tool for PHP that can be | |||||
| configured to produce a wide range of warnings and errors | |||||
| according to various customizable coding standards. | |||||
| Emacs-flymake-phpcs glues the two together, giving you continuous | |||||
| static analysis as you edit. | |||||
| Setup | |||||
| ----- | |||||
| You will also need PHP_CodeSniffer installed, this can be installed | |||||
| via PEAR or you can get the most recent from SVN here: | |||||
| * http://svn.php.net/repository/pear/packages/PHP_CodeSniffer/trunk | |||||
| Once you have PHP_CodeSniffer installed you can install | |||||
| flymake-phpcs.el somewhere in your emacs load-path and add | |||||
| something like the following to your .emacs: | |||||
| ```lisp | |||||
| ;; If flymake_phpcs isn't found correctly, specify the full path | |||||
| (setq flymake-phpcs-command "~/projects/emacs-flymake-phpcs/bin/flymake_phpcs") | |||||
| ;; Customize the coding standard checked by phpcs | |||||
| (setq flymake-phpcs-standard | |||||
| "~/projects/devtools/php_codesniffer/MyCompanyStandard") | |||||
| ;; Show the name of sniffs in warnings (eg show | |||||
| ;; "Generic.CodeAnalysis.VariableAnalysis.UnusedVariable" in an unused | |||||
| ;; variable warning) | |||||
| (setq flymake-phpcs-show-rule t) | |||||
| (require 'flymake-phpcs) | |||||
| ``` | |||||
| Have fun. | |||||
| See Also | |||||
| -------- | |||||
| If you want undefined and unused variable warnings, you might be | |||||
| interested in my PHP_CodeSniffer-VariableAnalysis plugin: | |||||
| * https://github.com/illusori/PHP_Codesniffer-VariableAnalysis | |||||
| You might also be interested in my patched version of flymake.el | |||||
| which contains fixes and enhancements that can be used by flymake-phpcs.el, | |||||
| you can grab it from here: | |||||
| * https://github.com/illusori/emacs-flymake | |||||
| Known Issues & Bugs | |||||
| ------------------- | |||||
| * flymake-phpcs-standard file-name expansion is triggered by presence | |||||
| of a / in the value, which isn't portable across OSes that use other | |||||
| directory delimiters. | |||||
| @ -0,0 +1,25 @@ | |||||
| #!/bin/bash | |||||
| # | |||||
| # Wrapper around phpcs for Emacs flymake since flymake dislikes phpcs' exit code. | |||||
| showhelp() { | |||||
| echo "flymake_phpcs [-h] <source-file> [<phpcs-arguments>] | |||||
| Run phpcs and \"php -l\" on <source-file> in a manner appropriate for use by Emacs flymake-phpcs.el. | |||||
| -h Display this help. | |||||
| <source-file> The source file to run the checks on. | |||||
| <phpcs-arguments> Any additional argments on the commandline will be passed to phpcs."; | |||||
| exit 0; | |||||
| } | |||||
| FILE_NAME="$1" | |||||
| shift | |||||
| # Run with --report=emacs so we can use this for compile-mode too. | |||||
| phpcs --report=emacs "$FILE_NAME" $* | |||||
| # Run php -l too for good measure. | |||||
| php -l -f "$FILE_NAME" | |||||
| exit 0 | |||||
| @ -0,0 +1,16 @@ | |||||
| ;;; flymake-phpcs-autoloads.el --- automatically extracted autoloads | |||||
| ;; | |||||
| ;;; Code: | |||||
| (add-to-list 'load-path (or (file-name-directory #$) (car load-path))) | |||||
| ;;;### (autoloads nil nil ("flymake-phpcs-pkg.el" "flymake-phpcs.el") | |||||
| ;;;;;; (21371 33456 197735 130000)) | |||||
| ;;;*** | |||||
| ;; Local Variables: | |||||
| ;; version-control: never | |||||
| ;; no-byte-compile: t | |||||
| ;; no-update-autoloads: t | |||||
| ;; End: | |||||
| ;;; flymake-phpcs-autoloads.el ends here | |||||
| @ -0,0 +1 @@ | |||||
| (define-package "flymake-phpcs" "1.0.5" "Flymake handler for PHP to invoke PHP-CodeSniffer" '((flymake "0.3"))) | |||||
| @ -0,0 +1,81 @@ | |||||
| ;;; flymake-phpcs.el --- Flymake handler for PHP to invoke PHP-CodeSniffer | |||||
| ;; | |||||
| ;; Copyright (C) 2011-2012 Free Software Foundation, Inc. | |||||
| ;; | |||||
| ;; Author: Sam Graham <libflymake-phpcs-emacs BLAHBLAH illusori.co.uk> | |||||
| ;; Maintainer: Sam Graham <libflymake-phpcs-emacs BLAHBLAH illusori.co.uk> | |||||
| ;; URL: https://github.com/illusori/emacs-flymake-phpcs | |||||
| ;; Version: 1.0.5 | |||||
| ;; Package-Requires: ((flymake "0.3")) | |||||
| ;; 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: | |||||
| ;; | |||||
| ;; flymake-phpcs.el adds support for running PHP_CodeSniffer | |||||
| ;; (http://pear.php.net/package/PHP_CodeSniffer/) to perform static | |||||
| ;; analysis of your PHP file in addition to syntax checking. | |||||
| ;; | |||||
| ;;; Usage: | |||||
| ;; (require 'flymake-phpcs) | |||||
| (eval-when-compile (require 'flymake)) | |||||
| (defcustom flymake-phpcs-command (executable-find (concat | |||||
| (file-name-directory | |||||
| (or load-file-name buffer-file-name)) | |||||
| "bin/flymake_phpcs")) | |||||
| "Location of flymake_phpcs wrapper." | |||||
| :group 'flymake-phpcs | |||||
| :type 'string) | |||||
| (defcustom flymake-phpcs-standard "PEAR" | |||||
| "The coding standard to pass to phpcs via --standard." | |||||
| :group 'flymake-phpcs | |||||
| :type 'string) | |||||
| (defcustom flymake-phpcs-show-rule nil | |||||
| "Whether to display the name of the phpcs rule generating any errors or warnings." | |||||
| :group 'flymake-phpcs | |||||
| :type 'boolean) | |||||
| (defun flymake-phpcs-init () | |||||
| (let* ((temp-file (flymake-init-create-temp-buffer-copy | |||||
| (if (fboundp 'flymake-create-temp-copy) | |||||
| 'flymake-create-temp-copy | |||||
| 'flymake-create-temp-inplace))) | |||||
| (local-file (file-relative-name temp-file | |||||
| (file-name-directory buffer-file-name)))) | |||||
| (list flymake-phpcs-command | |||||
| (append | |||||
| (list local-file) | |||||
| (if flymake-phpcs-standard | |||||
| (list (concat "--standard=" | |||||
| ;; Looking for "/" is hardly portable | |||||
| (if (string-match "/" flymake-phpcs-standard) | |||||
| (expand-file-name flymake-phpcs-standard) | |||||
| flymake-phpcs-standard)))) | |||||
| (if flymake-phpcs-show-rule (list "-s")))))) | |||||
| (eval-after-load "flymake" | |||||
| '(progn | |||||
| ;; Add a new error pattern to catch PHP-CodeSniffer output | |||||
| (add-to-list 'flymake-err-line-patterns | |||||
| '("\\(.*\\):\\([0-9]+\\):\\([0-9]+\\): \\(.*\\)" 1 2 3 4)) | |||||
| (let ((mode-and-masks (flymake-get-file-name-mode-and-masks "example.php"))) | |||||
| (setcar mode-and-masks 'flymake-phpcs-init)) | |||||
| (add-hook 'php+-mode-hook (lambda() (flymake-mode 1)) t) | |||||
| (add-hook 'php-mode-hook (lambda() (flymake-mode 1)) t))) | |||||
| (provide 'flymake-phpcs) | |||||
| ;;; flymake-phpcs.el ends here | |||||
| @ -0,0 +1,16 @@ | |||||
| ;;; fringe-helper-autoloads.el --- automatically extracted autoloads | |||||
| ;; | |||||
| ;;; Code: | |||||
| (add-to-list 'load-path (or (file-name-directory #$) (car load-path))) | |||||
| ;;;### (autoloads nil nil ("fringe-helper.el") (21394 7902 706100 | |||||
| ;;;;;; 633000)) | |||||
| ;;;*** | |||||
| ;; Local Variables: | |||||
| ;; version-control: never | |||||
| ;; no-byte-compile: t | |||||
| ;; no-update-autoloads: t | |||||
| ;; End: | |||||
| ;;; fringe-helper-autoloads.el ends here | |||||
| @ -0,0 +1 @@ | |||||
| (define-package "fringe-helper" "1.0.1" "helper functions for fringe bitmaps" 'nil) | |||||
| @ -0,0 +1,345 @@ | |||||
| ;;; fringe-helper.el --- helper functions for fringe bitmaps | |||||
| ;; | |||||
| ;; Copyright (C) 2008, 2013 Nikolaj Schumacher | |||||
| ;; | |||||
| ;; Author: Nikolaj Schumacher <bugs * nschum de> | |||||
| ;; Version: 1.0.1 | |||||
| ;; Keywords: lisp | |||||
| ;; URL: http://nschum.de/src/emacs/fringe-helper/ | |||||
| ;; Compatibility: GNU Emacs 22.x, GNU Emacs 23.x, GNU Emacs 24.x | |||||
| ;; | |||||
| ;; This file is NOT part of GNU Emacs. | |||||
| ;; | |||||
| ;; 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 2 | |||||
| ;; 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: | |||||
| ;; | |||||
| ;; fringe-helper contains helper functions for fringe bitmaps. | |||||
| ;; | |||||
| ;; `fringe-helper-define' allows you to to define fringe bitmaps using a visual | |||||
| ;; string replesentation. For example: | |||||
| ;; | |||||
| ;; (fringe-helper-define 'test-bitmap '(top repeat) | |||||
| ;; "XX......" | |||||
| ;; "..XX...." | |||||
| ;; "....XX.." | |||||
| ;; "......XX") | |||||
| ;; | |||||
| ;; You can also generate arguments for `define-fringe-bitmap' yourself, by | |||||
| ;; using `fringe-helper-convert'. | |||||
| ;; | |||||
| ;; fringe-helper also provides a few stock bitmaps. They are loaded on demand | |||||
| ;; by `fringe-lib-load' and adapt to the current fringe size to a certain | |||||
| ;; extend. | |||||
| ;; | |||||
| ;; `fringe-helper-insert' inserts a fringe bitmap at point and | |||||
| ;; `fringe-helper-insert-region' inserts a fringe bitmap along a region. | |||||
| ;; `fringe-helper-remove' removes both kinds. | |||||
| ;; | |||||
| ;; | |||||
| ;; Here's an example for enhancing `flymake-mode' with fringe bitmaps: | |||||
| ;; | |||||
| ;; (require 'fringe-helper) | |||||
| ;; (require 'flymake) | |||||
| ;; | |||||
| ;; (defvar flymake-fringe-overlays nil) | |||||
| ;; (make-variable-buffer-local 'flymake-fringe-overlays) | |||||
| ;; | |||||
| ;; (defadvice flymake-make-overlay (after add-to-fringe first | |||||
| ;; (beg end tooltip-text face mouse-face) | |||||
| ;; activate compile) | |||||
| ;; (push (fringe-helper-insert-region | |||||
| ;; beg end | |||||
| ;; (fringe-lib-load (if (eq face 'flymake-errline) | |||||
| ;; fringe-lib-exclamation-mark | |||||
| ;; fringe-lib-question-mark)) | |||||
| ;; 'left-fringe 'font-lock-warning-face) | |||||
| ;; flymake-fringe-overlays)) | |||||
| ;; | |||||
| ;; (defadvice flymake-delete-own-overlays (after remove-from-fringe activate | |||||
| ;; compile) | |||||
| ;; (mapc 'fringe-helper-remove flymake-fringe-overlays) | |||||
| ;; (setq flymake-fringe-overlays nil)) | |||||
| ;; | |||||
| ;; | |||||
| ;;; Change Log: | |||||
| ;; | |||||
| ;; Workaround for deleted overlay during callback. | |||||
| ;; | |||||
| ;; 2013-05-10 (1.0.1) | |||||
| ;; Fixed overlay leak. (thanks to Cornelius Mika) | |||||
| ;; | |||||
| ;; 2013-03-24 (1.0) | |||||
| ;; Fixed byte compile error. | |||||
| ;; | |||||
| ;; 2008-06-04 (0.1.1) | |||||
| ;; Fixed bug where `fringe-helper-remove' missed overlays at the end. | |||||
| ;; Fixed `fringe-lib-load' to work when already loaded. | |||||
| ;; | |||||
| ;; 2008-04-25 (0.1) | |||||
| ;; Initial release. | |||||
| ;; | |||||
| ;;; Code: | |||||
| (eval-when-compile (require 'cl)) | |||||
| (eval-and-compile | |||||
| (defun fringe-helper-convert (&rest strings) | |||||
| "Convert STRINGS into a vector usable for `define-fringe-bitmap'. | |||||
| Each string in STRINGS represents a line of the fringe bitmap. | |||||
| Periods (.) are background-colored pixel; Xs are foreground-colored. The | |||||
| fringe bitmap always is aligned to the right. If the fringe has half | |||||
| width, only the left 4 pixels of an 8 pixel bitmap will be shown. | |||||
| For example, the following code defines a diagonal line. | |||||
| \(fringe-helper-convert | |||||
| \"XX......\" | |||||
| \"..XX....\" | |||||
| \"....XX..\" | |||||
| \"......XX\"\)" | |||||
| (unless (cdr strings) | |||||
| ;; only one string, probably with newlines | |||||
| (setq strings (split-string (car strings) "\n"))) | |||||
| (apply 'vector | |||||
| (mapcar (lambda (str) | |||||
| (let ((num 0)) | |||||
| (dolist (c (string-to-list str)) | |||||
| (setq num (+ (* num 2) (if (eq c ?.) 0 1)))) | |||||
| num)) | |||||
| strings)))) | |||||
| (defmacro fringe-helper-define (name alignment &rest strings) | |||||
| "Define a fringe bitmap from a visual representation. | |||||
| Parameters NAME and ALIGNMENT are the same as `define-fringe-bitmap'. | |||||
| Each string in STRINGS represents a line of the fringe bitmap as in | |||||
| `fringe-helper-convert'." | |||||
| (declare (indent defun)) | |||||
| `(define-fringe-bitmap ,name | |||||
| (eval-when-compile (fringe-helper-convert ,@strings)) | |||||
| nil nil ,alignment)) | |||||
| (defun fringe-helper-insert (bitmap pos &optional side face) | |||||
| "Insert a fringe bitmap at POS. | |||||
| BITMAP is the name of a bitmap defined with `define-fringe-bitmap' or | |||||
| `fringe-helper-define'. SIDE defaults to 'left-fringe and can also be | |||||
| 'right-fringe. FACE is used to determine the bitmap's color. | |||||
| The function returns an object suitable for passing to | |||||
| `fringe-helper-remove'." | |||||
| (let* ((display-string `(,(or side 'left-fringe) ,bitmap . | |||||
| ,(when face (cons face nil)))) | |||||
| (before-string (propertize "!" 'display display-string)) | |||||
| (ov (make-overlay pos pos))) | |||||
| (overlay-put ov 'before-string before-string) | |||||
| (overlay-put ov 'fringe-helper t) | |||||
| ov)) | |||||
| (defun fringe-helper-insert-region (beg end bitmap side &optional face) | |||||
| "Insert fringe bitmaps between BEG and END. | |||||
| BITMAP is the name of a bitmap defined with `define-fringe-bitmap' or | |||||
| `fringe-helper-define'. SIDE defaults to 'left-fringe and can also be | |||||
| 'right-fringe. FACE is used to determine the bitmap's color. The | |||||
| function returns an overlay covering the entire region, which is suitable | |||||
| for passing to `fringe-helper-remove'. The region grows and shrinks with | |||||
| input automatically." | |||||
| (let* ((display-string `(,(or side 'left-fringe) ,bitmap . | |||||
| ,(when face (cons face nil)))) | |||||
| (before-string (propertize "!" 'display display-string)) | |||||
| (parent (make-overlay beg end)) | |||||
| ov) | |||||
| (save-excursion | |||||
| (goto-char beg) | |||||
| (goto-char (point-at-bol 2)) | |||||
| ;; can't use <= here, or we'll get an infinity loop at buffer end | |||||
| (while (and (<= (point) end) (< (point) (point-max))) | |||||
| (setq ov (make-overlay (point) (point))) | |||||
| (overlay-put ov 'before-string before-string) | |||||
| (overlay-put ov 'fringe-helper-parent parent) | |||||
| (goto-char (point-at-bol 2)))) | |||||
| (overlay-put parent 'fringe-helper t) | |||||
| (overlay-put parent 'before-string before-string) | |||||
| (overlay-put parent 'insert-in-front-hooks | |||||
| '(fringe-helper-modification-func)) | |||||
| (overlay-put parent 'modification-hooks | |||||
| '(fringe-helper-modification-func)) | |||||
| parent)) | |||||
| (defun fringe-helper-modification-func (ov after-p beg end &optional len) | |||||
| ;; Sometimes this hook is called with a deleted overlay. | |||||
| (when (overlay-start ov) | |||||
| (setq beg (max beg (overlay-start ov))) | |||||
| (setq end (min end (overlay-end ov))) | |||||
| (if after-p | |||||
| (if (eq beg end) | |||||
| ;; evaporate overlay | |||||
| (when (= (overlay-start ov) (overlay-end ov)) | |||||
| (delete-overlay ov)) | |||||
| ;; if new lines are inserted, add new bitmaps | |||||
| (let ((before-string (overlay-get ov 'before-string)) | |||||
| fringe-ov) | |||||
| (save-excursion | |||||
| (goto-char beg) | |||||
| (while (search-forward "\n" end t) | |||||
| (setq fringe-ov (make-overlay (point) (point))) | |||||
| (overlay-put fringe-ov 'before-string before-string) | |||||
| (overlay-put fringe-ov 'fringe-helper-parent ov))))) | |||||
| ;; if a \n is removed, remove the fringe overlay | |||||
| (unless (= beg end) | |||||
| (save-excursion | |||||
| (goto-char beg) | |||||
| (while (search-forward "\n" end t) | |||||
| (let ((overlays (overlays-in (point) (1+ (point))))) | |||||
| (while overlays | |||||
| (when (eq (overlay-get (car overlays) 'fringe-helper-parent) ov) | |||||
| (delete-overlay (car overlays)) | |||||
| (setq overlays nil)) | |||||
| (pop overlays))))))))) | |||||
| (defun fringe-helper-remove (fringe-bitmap-reference) | |||||
| "Remove a fringe bitmap." | |||||
| (unless (or (not (overlay-buffer fringe-bitmap-reference)) | |||||
| (overlay-get fringe-bitmap-reference 'fringe-helper-parent)) | |||||
| ;; region | |||||
| (dolist (ov (overlays-in (overlay-start fringe-bitmap-reference) | |||||
| (1+ (overlay-end fringe-bitmap-reference)))) | |||||
| (when (eq (overlay-get ov 'fringe-helper-parent) fringe-bitmap-reference) | |||||
| (delete-overlay ov))) | |||||
| (delete-overlay fringe-bitmap-reference))) | |||||
| ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | |||||
| (defun fringe-lib-load (pattern &optional side) | |||||
| "Load a stock bitmap. | |||||
| It returns the symbol name of the loaded bitmap, which is suitable for passing | |||||
| to `fringe-helper-insert'. The actual work of defining the bitmap is only done | |||||
| once. PATTERN can be one of the following: | |||||
| `fringe-lib-exclamation-mark': an exclamation mark | |||||
| `fringe-lib-question-mark': a question mark | |||||
| `fringe-lib-zig-zag': a zig-zag pattern | |||||
| `fringe-lib-wave': a wavy-line pattern | |||||
| `fringe-lib-stipple': a stipple pattern | |||||
| `fringe-lib-full': a solid color | |||||
| SIDE should be either 'left-fringe or 'right-fringe and defaults to the former." | |||||
| (let ((fringe-width (frame-parameter (selected-frame) | |||||
| (or side 'left-fringe))) | |||||
| (alignment (when (eq (car pattern) 'repeat) | |||||
| (setq pattern (cdr pattern)) | |||||
| '(top t)))) | |||||
| (while (> (caar pattern) fringe-width) | |||||
| (pop pattern)) | |||||
| (setq pattern (cdar pattern)) | |||||
| (or (car (memq (car pattern) fringe-bitmaps)) | |||||
| (define-fringe-bitmap (car pattern) (cdr pattern) nil nil alignment)))) | |||||
| (defconst fringe-lib-exclamation-mark | |||||
| `((5 fringe-lib-exclamation-mark-5 . | |||||
| ,(eval-when-compile | |||||
| (fringe-helper-convert "...XX..." | |||||
| "..XXXX.." | |||||
| "..XXXX.." | |||||
| "...XX..." | |||||
| "...XX..." | |||||
| "........" | |||||
| "........" | |||||
| "...XX..." | |||||
| "...XX..."))) | |||||
| (0 fringe-lib-exclamation-mark-0 . | |||||
| ,(eval-when-compile | |||||
| (fringe-helper-convert ".XX....." | |||||
| ".XX....." | |||||
| ".XX....." | |||||
| ".XX....." | |||||
| ".XX....." | |||||
| "........" | |||||
| "........" | |||||
| ".XX....." | |||||
| ".XX....."))))) | |||||
| (defconst fringe-lib-question-mark | |||||
| `((5 fringe-lib-question-mark-5 . | |||||
| ,(eval-when-compile | |||||
| (fringe-helper-convert "...XX..." | |||||
| "..XXXX.." | |||||
| "..X..X.." | |||||
| "....XX.." | |||||
| "...XX..." | |||||
| "...XX..." | |||||
| "........" | |||||
| "...XX..." | |||||
| "...XX..."))) | |||||
| (0 fringe-lib-question-mark-0 . | |||||
| ,(eval-when-compile | |||||
| (fringe-helper-convert ".XX....." | |||||
| "XXXX...." | |||||
| "X..X...." | |||||
| "..XX...." | |||||
| ".XX....." | |||||
| ".XX....." | |||||
| "........" | |||||
| ".XX....." | |||||
| ".XX....."))))) | |||||
| (defconst fringe-lib-zig-zag | |||||
| `(repeat | |||||
| (0 fringe-lib-zig-zag-0 . | |||||
| ,(eval-when-compile | |||||
| (fringe-helper-convert "X......." | |||||
| "X......." | |||||
| ".X......" | |||||
| ".X......" | |||||
| "..X....." | |||||
| "..X....." | |||||
| ".X......" | |||||
| ".X......"))))) | |||||
| (defconst fringe-lib-wave | |||||
| `(repeat | |||||
| (0 fringe-lib-wave-0 . | |||||
| ,(eval-when-compile | |||||
| (fringe-helper-convert "X......." | |||||
| ".X......" | |||||
| "..X....." | |||||
| "..X....." | |||||
| "..X....." | |||||
| ".X......" | |||||
| "X......." | |||||
| "X......."))))) | |||||
| (defconst fringe-lib-stipple | |||||
| `(repeat | |||||
| (0 fringe-lib-stipple-0 . | |||||
| ,(eval-when-compile | |||||
| (fringe-helper-convert "XXXXXXXX" | |||||
| "XXXXXXXX" | |||||
| "XXXXXXXX" | |||||
| "........" | |||||
| "........" | |||||
| "........"))))) | |||||
| (defconst fringe-lib-full | |||||
| `(repeat | |||||
| (0 fringe-lib-full-0 . | |||||
| ,(eval-when-compile | |||||
| (fringe-helper-convert "XXXXXXXX"))))) | |||||
| (provide 'fringe-helper) | |||||
| ;;; fringe-helper.el ends here | |||||
| @ -1,29 +0,0 @@ | |||||
| ;;; json-mode-autoloads.el --- automatically extracted autoloads | |||||
| ;; | |||||
| ;;; Code: | |||||
| ;;;### (autoloads (json-mode) "json-mode" "json-mode.el" (21017 62178 | |||||
| ;;;;;; 0 0)) | |||||
| ;;; Generated autoloads from json-mode.el | |||||
| (autoload 'json-mode "json-mode" "\ | |||||
| Major mode for editing JSON files | |||||
| \(fn)" t nil) | |||||
| ;;;*** | |||||
| ;;;### (autoloads nil nil ("json-mode-pkg.el") (21017 62178 965022 | |||||
| ;;;;;; 0)) | |||||
| ;;;*** | |||||
| (provide 'json-mode-autoloads) | |||||
| ;; Local Variables: | |||||
| ;; version-control: never | |||||
| ;; no-byte-compile: t | |||||
| ;; no-update-autoloads: t | |||||
| ;; coding: utf-8 | |||||
| ;; End: | |||||
| ;;; json-mode-autoloads.el ends here | |||||
| @ -1 +0,0 @@ | |||||
| (define-package "json-mode" "0.1.2" "Major mode for editing JSON files" (quote nil)) | |||||
| @ -1,44 +0,0 @@ | |||||
| ;;; json-mode.el --- Major mode for editing JSON files | |||||
| ;;; Author: Josh Johnston | |||||
| ;;; URL: https://github.com/joshwnj/json-mode | |||||
| ;;; Version: 0.1.2 | |||||
| ;;;; | |||||
| ;; extend javascript-mode's syntax highlighting | |||||
| (defvar json-mode-hook nil) | |||||
| (defconst json-quoted-key-re "\\(\"[^\"]+?\"[ ]*:\\)") | |||||
| (defconst json-quoted-string-re "\\(\".*?\"\\)") | |||||
| (defconst json-number-re "[^\"]\\([0-9]+\\(\\.[0-9]+\\)?\\)[^\"]") | |||||
| (defconst json-keyword-re "\\(true\\|false\\|null\\)") | |||||
| (defconst json-font-lock-keywords-1 | |||||
| (list | |||||
| (list json-quoted-key-re 1 font-lock-keyword-face) | |||||
| (list json-quoted-string-re 1 font-lock-string-face) | |||||
| (list json-keyword-re 1 font-lock-constant-face) | |||||
| (list json-number-re 1 font-lock-constant-face) | |||||
| ) | |||||
| "Level one font lock.") | |||||
| (defun beautify-json () | |||||
| (interactive) | |||||
| (let ((b (if mark-active (min (point) (mark)) (point-min))) | |||||
| (e (if mark-active (max (point) (mark)) (point-max)))) | |||||
| ;; Beautify json with support for non-ascii characters. | |||||
| ;; Thanks to https://github.com/jarl-dk for this improvement. | |||||
| (shell-command-on-region b e | |||||
| "python -c 'import sys,json; data=json.loads(sys.stdin.read()); print json.dumps(data,sort_keys=True,indent=4).decode(\"unicode_escape\").encode(\"utf8\",\"replace\")'" (current-buffer) t))) | |||||
| ;;;###autoload | |||||
| (define-derived-mode json-mode javascript-mode "JSON" | |||||
| "Major mode for editing JSON files" | |||||
| (set (make-local-variable 'font-lock-defaults) '(json-font-lock-keywords-1 t))) | |||||
| (add-to-list 'auto-mode-alist '("\\.json$" . json-mode)) | |||||
| (define-key json-mode-map (kbd "C-c C-f") 'beautify-json) | |||||
| (provide 'json-mode) | |||||
| ;;; json-mode.el ends here | |||||
| @ -0,0 +1,34 @@ | |||||
| ;;; json-mode-autoloads.el --- automatically extracted autoloads | |||||
| ;; | |||||
| ;;; Code: | |||||
| (add-to-list 'load-path (or (file-name-directory #$) (car load-path))) | |||||
| ;;;### (autoloads nil "json-mode" "json-mode.el" (21404 16856 131173 | |||||
| ;;;;;; 649000)) | |||||
| ;;; Generated autoloads from json-mode.el | |||||
| (autoload 'json-mode-beautify "json-mode" "\ | |||||
| Beautify / pretty-print from BEG to END, and optionally PRESERVE-KEY-ORDER. | |||||
| \(fn &optional PRESERVE-KEY-ORDER)" t nil) | |||||
| (autoload 'json-mode-beautify-ordered "json-mode" "\ | |||||
| Beautify / pretty-print from BEG to END preserving key order. | |||||
| \(fn)" t nil) | |||||
| (autoload 'json-mode "json-mode" "\ | |||||
| Major mode for editing JSON files | |||||
| \(fn)" t nil) | |||||
| (add-to-list 'auto-mode-alist '("\\.json$" . json-mode)) | |||||
| ;;;*** | |||||
| ;; Local Variables: | |||||
| ;; version-control: never | |||||
| ;; no-byte-compile: t | |||||
| ;; no-update-autoloads: t | |||||
| ;; End: | |||||
| ;;; json-mode-autoloads.el ends here | |||||
| @ -0,0 +1 @@ | |||||
| (define-package "json-mode" "1.2.0" "Major mode for editing JSON files" 'nil) | |||||
| @ -0,0 +1,95 @@ | |||||
| ;;; json-mode.el --- Major mode for editing JSON files | |||||
| ;; Copyright (C) 2011-2013 Josh Johnston | |||||
| ;; Author: Josh Johnston | |||||
| ;; URL: https://github.com/joshwnj/json-mode | |||||
| ;; Version: 1.2.0 | |||||
| ;; 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: | |||||
| ;; extend the builtin js-mode's syntax highlighting | |||||
| ;;; Code: | |||||
| (require 'js) | |||||
| (require 'rx) | |||||
| (defconst json-mode-quoted-string-re | |||||
| (rx (group (char ?\") | |||||
| (zero-or-more (or (seq ?\\ ?\\) | |||||
| (seq ?\\ ?\") | |||||
| (seq ?\\ (not (any ?\" ?\\))) | |||||
| (not (any ?\" ?\\)))) | |||||
| (char ?\")))) | |||||
| (defconst json-mode-quoted-key-re | |||||
| (rx (group (char ?\") | |||||
| (zero-or-more (or (seq ?\\ ?\\) | |||||
| (seq ?\\ ?\") | |||||
| (seq ?\\ (not (any ?\" ?\\))) | |||||
| (not (any ?\" ?\\)))) | |||||
| (char ?\")) | |||||
| (zero-or-more blank) | |||||
| ?\:)) | |||||
| (defconst json-mode-number-re (rx (group (one-or-more digit) | |||||
| (optional ?\. (one-or-more digit))))) | |||||
| (defconst json-mode-keyword-re (rx (group (or "true" "false" "null")))) | |||||
| (defconst json-font-lock-keywords-1 | |||||
| (list | |||||
| (list json-mode-quoted-key-re 1 font-lock-keyword-face) | |||||
| (list json-mode-quoted-string-re 1 font-lock-string-face) | |||||
| (list json-mode-keyword-re 1 font-lock-constant-face) | |||||
| (list json-mode-number-re 1 font-lock-constant-face) | |||||
| ) | |||||
| "Level one font lock.") | |||||
| (defconst json-mode-beautify-command-python2 | |||||
| "python2 -c \"import sys,json,collections; data=json.loads(sys.stdin.read(),object_pairs_hook=collections.OrderedDict); print json.dumps(data,sort_keys=%s,indent=4,separators=(',',': ')).decode('unicode_escape').encode('utf8','replace')\"") | |||||
| (defconst json-mode-beautify-command-python3 | |||||
| "python3 -c \"import sys,json,codecs,collections; data=json.loads(sys.stdin.read(),object_pairs_hook=collections.OrderedDict); print((codecs.getdecoder('unicode_escape')(json.dumps(data,sort_keys=%s,indent=4,separators=(',',': '))))[0])\"") | |||||
| ;;;###autoload | |||||
| (defun json-mode-beautify (&optional preserve-key-order) | |||||
| "Beautify / pretty-print from BEG to END, and optionally PRESERVE-KEY-ORDER." | |||||
| (interactive "P") | |||||
| (shell-command-on-region (if (use-region-p) (region-beginning) (point-min)) | |||||
| (if (use-region-p) (region-end) (point-max)) | |||||
| (concat (if (executable-find "env") "env " "") | |||||
| (format (if (executable-find "python2") | |||||
| json-mode-beautify-command-python2 | |||||
| json-mode-beautify-command-python3) | |||||
| (if preserve-key-order "False" "True"))) | |||||
| (current-buffer) t)) | |||||
| ;;;###autoload | |||||
| (defun json-mode-beautify-ordered () | |||||
| "Beautify / pretty-print from BEG to END preserving key order." | |||||
| (interactive) | |||||
| (json-mode-beautify t)) | |||||
| ;;;###autoload | |||||
| (define-derived-mode json-mode javascript-mode "JSON" | |||||
| "Major mode for editing JSON files" | |||||
| (set (make-local-variable 'font-lock-defaults) '(json-font-lock-keywords-1 t))) | |||||
| ;;;###autoload | |||||
| (add-to-list 'auto-mode-alist '("\\.json$" . json-mode)) | |||||
| (define-key json-mode-map (kbd "C-c C-f") 'json-mode-beautify) | |||||
| (provide 'json-mode) | |||||
| ;;; json-mode.el ends here | |||||
| @ -1 +0,0 @@ | |||||
| (define-package "magit" "1.2.0" "Control Git from Emacs.") | |||||
| @ -0,0 +1 @@ | |||||
| (define-package "magit" "1.2.1" "Control Git from Emacs." 'nil) | |||||
| @ -1,102 +0,0 @@ | |||||
| ;;; php-extras-gen-eldoc.el --- Extra features for `php-mode' | |||||
| ;; Copyright (C) 2012, 2013 Arne Jørgensen | |||||
| ;; Author: Arne Jørgensen <arne@arnested.dk> | |||||
| ;; This software 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 software 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 software. If not, see | |||||
| ;; <http://www.gnu.org/licenses/>. | |||||
| ;;; Commentary: | |||||
| ;; Download and parse PHP manual from php.net and build a new | |||||
| ;; `php-extras-function-arguments' hash table of PHP functions and | |||||
| ;; their arguments. | |||||
| ;; Please note that build a new `php-extras-function-arguments' is a | |||||
| ;; slow process and might be error prone. | |||||
| ;;; Code: | |||||
| (require 'php-mode) | |||||
| (require 'php-extras) | |||||
| (defvar php-extras-gen-eldoc-temp-methodname nil) | |||||
| (defvar php-extras-php-funcsummary-url | |||||
| "http://svn.php.net/repository/phpdoc/doc-base/trunk/funcsummary.txt" | |||||
| "URL of the funcsummary.txt list of PHP functions.") | |||||
| ;;;###autoload | |||||
| (defun php-extras-generate-eldoc () | |||||
| "Regenerate PHP function argument hash table from php.net. This is slow!" | |||||
| (interactive) | |||||
| (when (yes-or-no-p "Regenerate PHP function argument hash table from php.net? This is slow! ") | |||||
| (php-extras-generate-eldoc-1 t))) | |||||
| (defun php-extras-generate-eldoc-1 (&optional byte-compile) | |||||
| (let ((function-arguments-temp (make-hash-table | |||||
| :size 5000 | |||||
| :rehash-threshold 1.0 | |||||
| :rehash-size 100 | |||||
| :test 'equal))) | |||||
| (with-temp-buffer | |||||
| (url-insert-file-contents php-extras-php-funcsummary-url) | |||||
| (goto-char (point-min)) | |||||
| (let ((line-count (count-lines (point-min) (point-max)))) | |||||
| (with-syntax-table php-mode-syntax-table | |||||
| (while (not (eobp)) | |||||
| (let ((current-line (buffer-substring (point-at-bol) (point-at-eol)))) | |||||
| ;; Skip methods for now: is there anything more intelligent | |||||
| ;; we could do with them? | |||||
| (unless (string-match-p "::" current-line) | |||||
| (search-forward "(" (point-at-eol)) | |||||
| (goto-char (match-beginning 0)) | |||||
| (let ((function-name (thing-at-point 'symbol)) | |||||
| (help-string (replace-regexp-in-string "[[:space:]]+" " " | |||||
| current-line)) | |||||
| (progress (* 100 (/ (float (line-number-at-pos)) line-count)))) | |||||
| (message "[%2d%%] Parsing %s..." progress function-name) | |||||
| (puthash function-name help-string function-arguments-temp)))) | |||||
| ;; Skip over function description | |||||
| (forward-line 2))))) | |||||
| (let* ((file (concat php-extras-eldoc-functions-file ".el")) | |||||
| (base-name (file-name-nondirectory php-extras-eldoc-functions-file))) | |||||
| (with-temp-file file | |||||
| (insert (format | |||||
| ";;; %s.el -- file auto generated by `php-extras-generate-eldoc' | |||||
| \(require 'php-extras) | |||||
| \(setq php-extras-function-arguments %S) | |||||
| \(provide 'php-extras-eldoc-functions) | |||||
| ;;; %s.el ends here | |||||
| " | |||||
| base-name | |||||
| function-arguments-temp | |||||
| base-name))) | |||||
| (when byte-compile | |||||
| (message "Byte compiling and loading %s ..." file) | |||||
| (byte-compile-file file t) | |||||
| (message "Byte compiling and loading %s ... done." file))))) | |||||
| (provide 'php-extras-gen-eldoc) | |||||
| ;;; php-extras-gen-eldoc.el ends here | |||||
| @ -1,3 +0,0 @@ | |||||
| (define-package "php-extras" "1.0.0.20130923" | |||||
| "Extra features for `php-mode'" | |||||
| '((php-mode "1.5.0"))) | |||||
| @ -0,0 +1,121 @@ | |||||
| ;;; php-extras-gen-eldoc.el --- Extra features for `php-mode' | |||||
| ;; Copyright (C) 2012, 2013, 2014 Arne Jørgensen | |||||
| ;; Author: Arne Jørgensen <arne@arnested.dk> | |||||
| ;; This software 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 software 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 software. If not, see | |||||
| ;; <http://www.gnu.org/licenses/>. | |||||
| ;;; Commentary: | |||||
| ;; Download and parse PHP manual from php.net and build a new | |||||
| ;; `php-extras-function-arguments' hash table of PHP functions and | |||||
| ;; their arguments. | |||||
| ;; Please note that build a new `php-extras-function-arguments' is a | |||||
| ;; slow process and might be error prone. | |||||
| ;;; Code: | |||||
| (require 'php-mode) | |||||
| (require 'php-extras) | |||||
| (require 'json) | |||||
| (require 'shr) | |||||
| (defvar php-extras-php-doc-url | |||||
| "http://doc.php.net/downloads/json/php_manual_en.json" | |||||
| "URL of the JSON list of PHP functions.") | |||||
| ;;;###autoload | |||||
| (defun php-extras-generate-eldoc () | |||||
| "Regenerate PHP function argument hash table from php.net. This is slow!" | |||||
| (interactive) | |||||
| (when (yes-or-no-p "Regenerate PHP function argument hash table from php.net? This is slow! ") | |||||
| (php-extras-generate-eldoc-1 t))) | |||||
| (defun php-extras-generate-eldoc-1 (&optional byte-compile) | |||||
| (with-current-buffer (url-retrieve-synchronously php-extras-php-doc-url) | |||||
| (search-forward-regexp "^$") | |||||
| (let* ((data (json-read)) | |||||
| (count 0) | |||||
| (progress 0) | |||||
| (length (length data)) | |||||
| (function-arguments-temp (make-hash-table | |||||
| :size length | |||||
| :rehash-threshold 1.0 | |||||
| :rehash-size 100 | |||||
| :test 'equal)) | |||||
| doc) | |||||
| (dolist (elem data) | |||||
| (setq count (+ count 1)) | |||||
| ;; Skip methods for now: is there anything more intelligent we | |||||
| ;; could do with them? | |||||
| (unless (string-match-p "::" (symbol-name (car elem))) | |||||
| (setq progress (* 100 (/ (float count) length))) | |||||
| (message "[%2d%%] Adding function: %s..." progress (car elem)) | |||||
| (setq doc (concat | |||||
| (cdr (assoc 'purpose (cdr elem))) | |||||
| "\n\n" | |||||
| (cdr (assoc 'prototype (cdr elem))) | |||||
| "\n\n" | |||||
| ;; The return element is HTML - use `shr' to | |||||
| ;; render it back to plain text. | |||||
| (save-window-excursion | |||||
| (with-temp-buffer | |||||
| (insert (cdr (assoc 'return (cdr elem)))) | |||||
| (shr-render-buffer (current-buffer)) | |||||
| (delete-trailing-whitespace) | |||||
| (buffer-string))) | |||||
| "\n\n" | |||||
| "(" (cdr (assoc 'versions (cdr elem))) ")")) | |||||
| (puthash (symbol-name (car elem)) (cons `(documentation . ,doc) (cdr elem)) function-arguments-temp))) | |||||
| ;; PHP control structures are not present in JSON list. We add | |||||
| ;; them here (hard coded - there are not so many of them). | |||||
| (let ((php-control-structures '("if" "else" "elseif" "while" "do.while" "for" "foreach" "break" "continue" "switch" "declare" "return" "require" "include" "require_once" "include_once" "goto"))) | |||||
| (dolist (php-control-structure php-control-structures) | |||||
| (message "Adding control structure: %s..." php-control-structure) | |||||
| (puthash php-control-structure | |||||
| '((purpose . "Control structure") | |||||
| (id . (concat "control-structures." php-control-structure))) | |||||
| function-arguments-temp))) | |||||
| (let* ((file (concat php-extras-eldoc-functions-file ".el")) | |||||
| (base-name (file-name-nondirectory php-extras-eldoc-functions-file))) | |||||
| (with-temp-file file | |||||
| (insert (format | |||||
| ";;; %s.el -- file auto generated by `php-extras-generate-eldoc' | |||||
| \(require 'php-extras) | |||||
| \(setq php-extras-function-arguments %S) | |||||
| \(provide 'php-extras-eldoc-functions) | |||||
| ;;; %s.el ends here | |||||
| " | |||||
| base-name | |||||
| function-arguments-temp | |||||
| base-name))) | |||||
| (when byte-compile | |||||
| (message "Byte compiling and loading %s ..." file) | |||||
| (byte-compile-file file t) | |||||
| (message "Byte compiling and loading %s ... done." file)))))) | |||||
| (provide 'php-extras-gen-eldoc) | |||||
| ;;; php-extras-gen-eldoc.el ends here | |||||
| @ -0,0 +1 @@ | |||||
| (define-package "php-extras" "2.2.0.20140405" "Extra features for `php-mode'" '((php-mode "1.5.0"))) | |||||
| @ -0,0 +1,122 @@ | |||||
| ;;; pkg-info-autoloads.el --- automatically extracted autoloads | |||||
| ;; | |||||
| ;;; Code: | |||||
| (add-to-list 'load-path (or (file-name-directory #$) (car load-path))) | |||||
| ;;;### (autoloads nil "pkg-info" "pkg-info.el" (21404 16847 995193 | |||||
| ;;;;;; 920000)) | |||||
| ;;; Generated autoloads from pkg-info.el | |||||
| (autoload 'pkg-info-library-original-version "pkg-info" "\ | |||||
| Get the original version in the header of LIBRARY. | |||||
| The original version is stored in the X-Original-Version header. | |||||
| This header is added by the MELPA package archive to preserve | |||||
| upstream version numbers. | |||||
| LIBRARY is either a symbol denoting a named feature, or a library | |||||
| name as string. | |||||
| If SHOW is non-nil, show the version in the minibuffer. | |||||
| Return the version from the header of LIBRARY as list. Signal an | |||||
| error if the LIBRARY was not found or had no X-Original-Version | |||||
| header. | |||||
| See Info node `(elisp)Library Headers' for more information | |||||
| about library headers. | |||||
| \(fn LIBRARY &optional SHOW)" t nil) | |||||
| (autoload 'pkg-info-library-version "pkg-info" "\ | |||||
| Get the version in the header of LIBRARY. | |||||
| LIBRARY is either a symbol denoting a named feature, or a library | |||||
| name as string. | |||||
| If SHOW is non-nil, show the version in the minibuffer. | |||||
| Return the version from the header of LIBRARY as list. Signal an | |||||
| error if the LIBRARY was not found or had no proper header. | |||||
| See Info node `(elisp)Library Headers' for more information | |||||
| about library headers. | |||||
| \(fn LIBRARY &optional SHOW)" t nil) | |||||
| (autoload 'pkg-info-defining-library-original-version "pkg-info" "\ | |||||
| Get the original version of the library defining FUNCTION. | |||||
| The original version is stored in the X-Original-Version header. | |||||
| This header is added by the MELPA package archive to preserve | |||||
| upstream version numbers. | |||||
| If SHOW is non-nil, show the version in mini-buffer. | |||||
| This function is mainly intended to find the version of a major | |||||
| or minor mode, i.e. | |||||
| (pkg-info-defining-library-version 'flycheck-mode) | |||||
| Return the version of the library defining FUNCTION. Signal an | |||||
| error if FUNCTION is not a valid function, if its defining | |||||
| library was not found, or if the library had no proper version | |||||
| header. | |||||
| \(fn FUNCTION &optional SHOW)" t nil) | |||||
| (autoload 'pkg-info-defining-library-version "pkg-info" "\ | |||||
| Get the version of the library defining FUNCTION. | |||||
| If SHOW is non-nil, show the version in mini-buffer. | |||||
| This function is mainly intended to find the version of a major | |||||
| or minor mode, i.e. | |||||
| (pkg-info-defining-library-version 'flycheck-mode) | |||||
| Return the version of the library defining FUNCTION. Signal an | |||||
| error if FUNCTION is not a valid function, if its defining | |||||
| library was not found, or if the library had no proper version | |||||
| header. | |||||
| \(fn FUNCTION &optional SHOW)" t nil) | |||||
| (autoload 'pkg-info-package-version "pkg-info" "\ | |||||
| Get the version of an installed PACKAGE. | |||||
| If SHOW is non-nil, show the version in the minibuffer. | |||||
| Return the version as list, or nil if PACKAGE is not installed. | |||||
| \(fn PACKAGE &optional SHOW)" t nil) | |||||
| (autoload 'pkg-info-version-info "pkg-info" "\ | |||||
| Obtain complete version info for LIBRARY and PACKAGE. | |||||
| LIBRARY is a symbol denoting a named feature, or a library name | |||||
| as string. PACKAGE is a symbol denoting an ELPA package. If | |||||
| omitted or nil, default to LIBRARY. | |||||
| If SHOW is non-nil, show the version in the minibuffer. | |||||
| When called interactively, prompt for LIBRARY. When called | |||||
| interactively with prefix argument, prompt for PACKAGE as well. | |||||
| Return a string with complete version information for LIBRARY. | |||||
| This version information contains the version from the headers of | |||||
| LIBRARY, and the version of the installed PACKAGE, the LIBRARY is | |||||
| part of. If PACKAGE is not installed, or if the PACKAGE version | |||||
| is the same as the LIBRARY version, do not include a package | |||||
| version. | |||||
| \(fn LIBRARY &optional PACKAGE SHOW)" t nil) | |||||
| ;;;*** | |||||
| ;; Local Variables: | |||||
| ;; version-control: never | |||||
| ;; no-byte-compile: t | |||||
| ;; no-update-autoloads: t | |||||
| ;; End: | |||||
| ;;; pkg-info-autoloads.el ends here | |||||
| @ -0,0 +1 @@ | |||||
| (define-package "pkg-info" "0.5" "Information about packages" '((dash "1.6.0") (epl "0.4"))) | |||||
| @ -0,0 +1,277 @@ | |||||
| ;;; pkg-info.el --- Information about packages -*- lexical-binding: t; -*- | |||||
| ;; Copyright (C) 2013, 2014 Sebastian Wiesner | |||||
| ;; Author: Sebastian Wiesner <lunaryorn@gmail.com> | |||||
| ;; URL: https://github.com/lunaryorn/pkg-info.el | |||||
| ;; Keywords: convenience | |||||
| ;; Version: 0.5 | |||||
| ;; Package-Requires: ((dash "1.6.0") (epl "0.4")) | |||||
| ;; This file is not part of GNU Emacs. | |||||
| ;; 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: | |||||
| ;; This library extracts information from installed packages. | |||||
| ;;;; Functions: | |||||
| ;; `pkg-info-library-version' extracts the version from the header of a library. | |||||
| ;; | |||||
| ;; `pkg-info-defining-library-version' extracts the version from the header of a | |||||
| ;; library defining a function. | |||||
| ;; | |||||
| ;; `pkg-info-package-version' gets the version of an installed package. | |||||
| ;; | |||||
| ;; `pkg-info-format-version' formats a version list as human readable string. | |||||
| ;; | |||||
| ;; `pkg-info-version-info' returns complete version information for a specific | |||||
| ;; package. | |||||
| ;;; Code: | |||||
| (require 'epl) | |||||
| (require 'dash) | |||||
| (require 'lisp-mnt) | |||||
| (require 'find-func) | |||||
| ;;;; Version information | |||||
| (defun pkg-info-format-version (version) | |||||
| "Format VERSION as human-readable string. | |||||
| Return a human-readable string representing VERSION." | |||||
| ;; XXX: Find a better, more flexible way of formatting? | |||||
| (package-version-join version)) | |||||
| (defsubst pkg-info--show-version-and-return (version show) | |||||
| "Show and return VERSION. | |||||
| When SHOW is non-nil, show VERSION in minibuffer. | |||||
| Return VERSION." | |||||
| (when show | |||||
| (message (if (listp version) (pkg-info-format-version version) version))) | |||||
| version) | |||||
| (defun pkg-info--read-library () | |||||
| "Read a library from minibuffer." | |||||
| (completing-read "Load library: " | |||||
| (apply-partially 'locate-file-completion-table | |||||
| load-path | |||||
| (get-load-suffixes)))) | |||||
| (defun pkg-info--read-function () | |||||
| "Read a function name from minibuffer." | |||||
| (let ((input (completing-read "Function: " obarray #'boundp :require-match))) | |||||
| (if (string= input "") nil (intern input)))) | |||||
| (defun pkg-info--read-package () | |||||
| "Read a package name from minibuffer." | |||||
| (let* ((installed (epl-installed-packages)) | |||||
| (names (-sort #'string< | |||||
| (--map (symbol-name (epl-package-name it)) installed))) | |||||
| (default (car names))) | |||||
| (completing-read "Installed package: " names nil 'require-match | |||||
| nil nil default))) | |||||
| (defun pkg-info-library-source (library) | |||||
| "Get the source file of LIBRARY. | |||||
| LIBRARY is either a symbol denoting a named feature, or a library | |||||
| name as string. | |||||
| Return the source file of LIBRARY as string." | |||||
| (find-library-name (if (symbolp library) (symbol-name library) library))) | |||||
| (defun pkg-info-defining-library (function) | |||||
| "Get the source file of the library defining FUNCTION. | |||||
| FUNCTION is a function symbol. | |||||
| Return the file name of the library as string. Signal an error | |||||
| if the library does not exist, or if the definition of FUNCTION | |||||
| was not found." | |||||
| (unless (functionp function) | |||||
| (signal 'wrong-type-argument (list 'functionp function))) | |||||
| (let ((library (symbol-file function 'defun))) | |||||
| (unless library | |||||
| (error "Can't find definition of %s" function)) | |||||
| library)) | |||||
| (defun pkg-info-x-original-version (file) | |||||
| "Read the X-Original-Version header from FILE. | |||||
| Return the value as version list, or return nil if FILE lacks | |||||
| this header. Signal an error, if the value of the header is not | |||||
| a valid version." | |||||
| (let ((version-str (with-temp-buffer | |||||
| (insert-file-contents file) | |||||
| (lm-header "X-Original-Version")))) | |||||
| (when version-str | |||||
| (version-to-list version-str)))) | |||||
| ;;;###autoload | |||||
| (defun pkg-info-library-original-version (library &optional show) | |||||
| "Get the original version in the header of LIBRARY. | |||||
| The original version is stored in the X-Original-Version header. | |||||
| This header is added by the MELPA package archive to preserve | |||||
| upstream version numbers. | |||||
| LIBRARY is either a symbol denoting a named feature, or a library | |||||
| name as string. | |||||
| If SHOW is non-nil, show the version in the minibuffer. | |||||
| Return the version from the header of LIBRARY as list. Signal an | |||||
| error if the LIBRARY was not found or had no X-Original-Version | |||||
| header. | |||||
| See Info node `(elisp)Library Headers' for more information | |||||
| about library headers." | |||||
| (interactive (list (pkg-info--read-library) t)) | |||||
| (let ((version (pkg-info-x-original-version | |||||
| (pkg-info-library-source library)))) | |||||
| (if version | |||||
| (pkg-info--show-version-and-return version show) | |||||
| (error "Library %s has no original version" library)))) | |||||
| ;;;###autoload | |||||
| (defun pkg-info-library-version (library &optional show) | |||||
| "Get the version in the header of LIBRARY. | |||||
| LIBRARY is either a symbol denoting a named feature, or a library | |||||
| name as string. | |||||
| If SHOW is non-nil, show the version in the minibuffer. | |||||
| Return the version from the header of LIBRARY as list. Signal an | |||||
| error if the LIBRARY was not found or had no proper header. | |||||
| See Info node `(elisp)Library Headers' for more information | |||||
| about library headers." | |||||
| (interactive (list (pkg-info--read-library) t)) | |||||
| (let* ((source (pkg-info-library-source library)) | |||||
| (version (epl-package-version (epl-package-from-file source)))) | |||||
| (pkg-info--show-version-and-return version show))) | |||||
| ;;;###autoload | |||||
| (defun pkg-info-defining-library-original-version (function &optional show) | |||||
| "Get the original version of the library defining FUNCTION. | |||||
| The original version is stored in the X-Original-Version header. | |||||
| This header is added by the MELPA package archive to preserve | |||||
| upstream version numbers. | |||||
| If SHOW is non-nil, show the version in mini-buffer. | |||||
| This function is mainly intended to find the version of a major | |||||
| or minor mode, i.e. | |||||
| (pkg-info-defining-library-version 'flycheck-mode) | |||||
| Return the version of the library defining FUNCTION. Signal an | |||||
| error if FUNCTION is not a valid function, if its defining | |||||
| library was not found, or if the library had no proper version | |||||
| header." | |||||
| (interactive (list (pkg-info--read-function) t)) | |||||
| (pkg-info-library-original-version (pkg-info-defining-library function) show)) | |||||
| ;;;###autoload | |||||
| (defun pkg-info-defining-library-version (function &optional show) | |||||
| "Get the version of the library defining FUNCTION. | |||||
| If SHOW is non-nil, show the version in mini-buffer. | |||||
| This function is mainly intended to find the version of a major | |||||
| or minor mode, i.e. | |||||
| (pkg-info-defining-library-version 'flycheck-mode) | |||||
| Return the version of the library defining FUNCTION. Signal an | |||||
| error if FUNCTION is not a valid function, if its defining | |||||
| library was not found, or if the library had no proper version | |||||
| header." | |||||
| (interactive (list (pkg-info--read-function) t)) | |||||
| (pkg-info-library-version (pkg-info-defining-library function) show)) | |||||
| ;;;###autoload | |||||
| (defun pkg-info-package-version (package &optional show) | |||||
| "Get the version of an installed PACKAGE. | |||||
| If SHOW is non-nil, show the version in the minibuffer. | |||||
| Return the version as list, or nil if PACKAGE is not installed." | |||||
| (interactive (list (pkg-info--read-package) t)) | |||||
| (let* ((name (if (stringp package) (intern package) package)) | |||||
| (package (epl-find-installed-package name))) | |||||
| (unless package | |||||
| (error "Can't find installed package %s" name)) | |||||
| (pkg-info--show-version-and-return (epl-package-version package) show))) | |||||
| ;;;###autoload | |||||
| (defun pkg-info-version-info (library &optional package show) | |||||
| "Obtain complete version info for LIBRARY and PACKAGE. | |||||
| LIBRARY is a symbol denoting a named feature, or a library name | |||||
| as string. PACKAGE is a symbol denoting an ELPA package. If | |||||
| omitted or nil, default to LIBRARY. | |||||
| If SHOW is non-nil, show the version in the minibuffer. | |||||
| When called interactively, prompt for LIBRARY. When called | |||||
| interactively with prefix argument, prompt for PACKAGE as well. | |||||
| Return a string with complete version information for LIBRARY. | |||||
| This version information contains the version from the headers of | |||||
| LIBRARY, and the version of the installed PACKAGE, the LIBRARY is | |||||
| part of. If PACKAGE is not installed, or if the PACKAGE version | |||||
| is the same as the LIBRARY version, do not include a package | |||||
| version." | |||||
| (interactive (list (pkg-info--read-library) | |||||
| (when current-prefix-arg | |||||
| (pkg-info--read-package)) | |||||
| t)) | |||||
| (let* ((package (or package (if (stringp library) (intern library) library))) | |||||
| (orig-version (condition-case nil | |||||
| (pkg-info-library-original-version library) | |||||
| (error nil))) | |||||
| ;; If we have X-Original-Version, we assume that MELPA replaced the | |||||
| ;; library version with its generated version, so we use the | |||||
| ;; X-Original-Version header instead, and ignore the library version | |||||
| ;; header | |||||
| (lib-version (or orig-version (pkg-info-library-version library))) | |||||
| (pkg-version (condition-case nil | |||||
| (pkg-info-package-version package) | |||||
| (error nil))) | |||||
| (version (if (and pkg-version | |||||
| (not (version-list-= lib-version pkg-version))) | |||||
| (format "%s (package: %s)" | |||||
| (pkg-info-format-version lib-version) | |||||
| (pkg-info-format-version pkg-version)) | |||||
| (pkg-info-format-version lib-version)))) | |||||
| (pkg-info--show-version-and-return version show))) | |||||
| (provide 'pkg-info) | |||||
| ;; Local Variables: | |||||
| ;; indent-tabs-mode: nil | |||||
| ;; coding: utf-8 | |||||
| ;; End: | |||||
| ;;; pkg-info.el ends here | |||||
| @ -1 +0,0 @@ | |||||
| (define-package "s" "1.6.1" "The long lost Emacs string manipulation library." (quote nil)) | |||||
| @ -0,0 +1 @@ | |||||
| (define-package "s" "1.9.0" "The long lost Emacs string manipulation library." 'nil) | |||||
| @ -1,18 +0,0 @@ | |||||
| ;;; yaml-mode-autoloads.el --- automatically extracted autoloads | |||||
| ;; | |||||
| ;;; Code: | |||||
| ;;;### (autoloads nil nil ("yaml-mode-pkg.el" "yaml-mode.el") (20966 | |||||
| ;;;;;; 63395 755844 0)) | |||||
| ;;;*** | |||||
| (provide 'yaml-mode-autoloads) | |||||
| ;; Local Variables: | |||||
| ;; version-control: never | |||||
| ;; no-byte-compile: t | |||||
| ;; no-update-autoloads: t | |||||
| ;; coding: utf-8 | |||||
| ;; End: | |||||
| ;;; yaml-mode-autoloads.el ends here | |||||
| @ -1 +0,0 @@ | |||||
| (define-package "yaml-mode" "0.0.7" "Major mode for editing YAML files" (quote nil)) | |||||
| @ -0,0 +1,28 @@ | |||||
| ;;; yaml-mode-autoloads.el --- automatically extracted autoloads | |||||
| ;; | |||||
| ;;; Code: | |||||
| (add-to-list 'load-path (or (file-name-directory #$) (car load-path))) | |||||
| ;;;### (autoloads nil "yaml-mode" "yaml-mode.el" (21404 16846 983196 | |||||
| ;;;;;; 439000)) | |||||
| ;;; Generated autoloads from yaml-mode.el | |||||
| (let ((loads (get 'yaml 'custom-loads))) (if (member '"yaml-mode" loads) nil (put 'yaml 'custom-loads (cons '"yaml-mode" loads)))) | |||||
| (autoload 'yaml-mode "yaml-mode" "\ | |||||
| Simple mode to edit YAML. | |||||
| \\{yaml-mode-map} | |||||
| \(fn)" t nil) | |||||
| (add-to-list 'auto-mode-alist '("\\.ya?ml$" . yaml-mode)) | |||||
| ;;;*** | |||||
| ;; Local Variables: | |||||
| ;; version-control: never | |||||
| ;; no-byte-compile: t | |||||
| ;; no-update-autoloads: t | |||||
| ;; End: | |||||
| ;;; yaml-mode-autoloads.el ends here | |||||
| @ -0,0 +1 @@ | |||||
| (define-package "yaml-mode" "0.0.9" "Major mode for editing YAML files" 'nil) | |||||