4 changed files with 221 additions and 2 deletions
-
5custom.el
-
40elpa/pip-requirements-20181027.1629/pip-requirements-autoloads.el
-
2elpa/pip-requirements-20181027.1629/pip-requirements-pkg.el
-
176elpa/pip-requirements-20181027.1629/pip-requirements.el
@ -0,0 +1,40 @@ |
|||||
|
;;; pip-requirements-autoloads.el --- automatically extracted autoloads |
||||
|
;; |
||||
|
;;; Code: |
||||
|
|
||||
|
(add-to-list 'load-path (directory-file-name |
||||
|
(or (file-name-directory #$) (car load-path)))) |
||||
|
|
||||
|
|
||||
|
;;;### (autoloads nil "pip-requirements" "pip-requirements.el" (0 |
||||
|
;;;;;; 0 0 0)) |
||||
|
;;; Generated autoloads from pip-requirements.el |
||||
|
|
||||
|
(add-to-list 'auto-mode-alist `(,(rx ".pip" string-end) . pip-requirements-mode)) |
||||
|
|
||||
|
(add-to-list 'auto-mode-alist `(,(rx "requirements" (zero-or-more anything) ".txt" string-end) . pip-requirements-mode)) |
||||
|
|
||||
|
(add-to-list 'auto-mode-alist `(,(rx "requirements.in") . pip-requirements-mode)) |
||||
|
|
||||
|
(autoload 'pip-requirements-auto-complete-setup "pip-requirements" "\ |
||||
|
Setup Auto-Complete for Pip Requirements. |
||||
|
|
||||
|
See URL `https://github.com/auto-complete/auto-complete' for |
||||
|
information about Auto Complete." nil nil) |
||||
|
|
||||
|
(autoload 'pip-requirements-mode "pip-requirements" "\ |
||||
|
Major mode for editing pip requirements files. |
||||
|
|
||||
|
\(fn)" t nil) |
||||
|
|
||||
|
(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "pip-requirements" '("pip-"))) |
||||
|
|
||||
|
;;;*** |
||||
|
|
||||
|
;; Local Variables: |
||||
|
;; version-control: never |
||||
|
;; no-byte-compile: t |
||||
|
;; no-update-autoloads: t |
||||
|
;; coding: utf-8 |
||||
|
;; End: |
||||
|
;;; pip-requirements-autoloads.el ends here |
||||
@ -0,0 +1,2 @@ |
|||||
|
;;; Generated package description from /home/raphael/.emacs.d/elpa/pip-requirements-20181027.1629/pip-requirements.el -*- no-byte-compile: t -*- |
||||
|
(define-package "pip-requirements" "20181027.1629" "A major mode for editing pip requirements files." '((dash "2.8.0")) :commit "216cd1690f80cc965d4ae47b8753fc185f778ff6" :authors '(("Wilfred Hughes" . "me@wilfred.me.uk")) :maintainer '("Wilfred Hughes" . "me@wilfred.me.uk")) |
||||
@ -0,0 +1,176 @@ |
|||||
|
;;; pip-requirements.el --- A major mode for editing pip requirements files. |
||||
|
|
||||
|
;; Copyright (C) 2014 Wilfred Hughes <me@wilfred.me.uk> |
||||
|
;; |
||||
|
;; Author: Wilfred Hughes <me@wilfred.me.uk> |
||||
|
;; Created: 11 September 2014 |
||||
|
;; Version: 0.6 |
||||
|
;; Package-Version: 20181027.1629 |
||||
|
;; Package-Commit: 216cd1690f80cc965d4ae47b8753fc185f778ff6 |
||||
|
;; Package-Requires: ((dash "2.8.0")) |
||||
|
|
||||
|
;;; License: |
||||
|
|
||||
|
;; This file is not part of GNU Emacs. |
||||
|
;; However, it is distributed under the same license. |
||||
|
|
||||
|
;; GNU Emacs is free software; you can redistribute it and/or modify |
||||
|
;; it under the terms of the GNU General Public License as published by |
||||
|
;; the Free Software Foundation; either version 3, or (at your option) |
||||
|
;; any later version. |
||||
|
|
||||
|
;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the |
||||
|
;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, |
||||
|
;; Boston, MA 02110-1301, USA. |
||||
|
|
||||
|
;;; Commentary: |
||||
|
|
||||
|
;; This is a major mode for editing pip requirements files, with the following features: |
||||
|
|
||||
|
;; * Syntax highlighting |
||||
|
;; * Togglable comments |
||||
|
;; * Auto completion of package names from PyPI |
||||
|
|
||||
|
;; TODO: Steal shamelessly all the fantasic ideas in |
||||
|
;; https://github.com/wuub/requirementstxt |
||||
|
|
||||
|
;;; Code: |
||||
|
|
||||
|
(require 'dash) |
||||
|
(require 'cl-lib) |
||||
|
|
||||
|
(defgroup pip-requirements nil |
||||
|
"Requirements files for pip" |
||||
|
:prefix "pip-requirements-" |
||||
|
:group 'languages |
||||
|
:link '(url-link :tag "Github" "https://github.com/Wilfred/pip-requirements.el")) |
||||
|
|
||||
|
(defcustom pip-requirements-mode-hook nil |
||||
|
"Hook to run after `pip-requirements-mode'." |
||||
|
:group 'pip-requirements |
||||
|
:type 'hook |
||||
|
:risky t) |
||||
|
|
||||
|
(defcustom pip-requirements-index-url |
||||
|
"https://pypi.org/simple/" |
||||
|
"The URL used to fetch the list of packages used for completion." |
||||
|
:group 'pip-requirements |
||||
|
:type 'string) |
||||
|
|
||||
|
;;;###autoload |
||||
|
(add-to-list 'auto-mode-alist |
||||
|
`(,(rx ".pip" string-end) . pip-requirements-mode)) |
||||
|
;;;###autoload |
||||
|
(add-to-list 'auto-mode-alist |
||||
|
`(,(rx "requirements" (zero-or-more anything) ".txt" string-end) . pip-requirements-mode)) |
||||
|
|
||||
|
;;;###autoload |
||||
|
(add-to-list 'auto-mode-alist |
||||
|
`(,(rx "requirements.in") . pip-requirements-mode)) |
||||
|
|
||||
|
(defconst pip-requirements-name-regex |
||||
|
(rx |
||||
|
line-start |
||||
|
(group (1+ (or alphanumeric "-" "_" "."))))) |
||||
|
|
||||
|
(defconst pip-requirements-version-regex |
||||
|
;; https://www.python.org/dev/peps/pep-0440/#version-specifiers |
||||
|
(rx |
||||
|
(group (or "==" ">" ">=" "<" "<=" "!=" "~=")) |
||||
|
(group (1+ (or digit "b" "." "post" "*"))))) |
||||
|
|
||||
|
(defconst pip-requirements-arbitrary-version-regex |
||||
|
;; https://www.python.org/dev/peps/pep-0440/#arbitrary-equality |
||||
|
(rx (group "===") (group (1+ not-newline)))) |
||||
|
|
||||
|
(defconst pip-requirements-operators |
||||
|
(list |
||||
|
(list pip-requirements-name-regex 1 'font-lock-variable-name-face) |
||||
|
(list pip-requirements-version-regex 1 'font-lock-builtin-face) |
||||
|
(list pip-requirements-arbitrary-version-regex 1 'font-lock-builtin-face) |
||||
|
(list pip-requirements-version-regex 2 'font-lock-constant-face) |
||||
|
(list pip-requirements-arbitrary-version-regex 2 'font-lock-constant-face))) |
||||
|
|
||||
|
(defconst pip-requirements-syntax-table |
||||
|
(let ((table (make-syntax-table))) |
||||
|
(modify-syntax-entry ?# "<" table) |
||||
|
(modify-syntax-entry ?\n ">" table) |
||||
|
(modify-syntax-entry ?> "." table) |
||||
|
(modify-syntax-entry ?< "." table) |
||||
|
(modify-syntax-entry ?= "." table) |
||||
|
(modify-syntax-entry ?~ "." table) |
||||
|
table)) |
||||
|
|
||||
|
(defvar pip-http-buffer nil) |
||||
|
(defvar pip-packages nil |
||||
|
"List of PyPI packages for completion.") |
||||
|
|
||||
|
(defun pip-requirements-callback (&rest _) |
||||
|
(with-current-buffer pip-http-buffer |
||||
|
;; Move over the HTTP header. |
||||
|
(goto-char (point-min)) |
||||
|
(re-search-forward "^$" nil 'move) |
||||
|
|
||||
|
(let* ((dom (libxml-parse-html-region (point) (point-max))) |
||||
|
(body-tag (-last-item dom)) |
||||
|
(body-children (cdddr body-tag)) |
||||
|
(a-tags (--filter (eq (car-safe it) 'a) body-children))) |
||||
|
(setq pip-packages |
||||
|
;; Inner text of anchor tags. |
||||
|
(-map #'cl-third a-tags)))) |
||||
|
(kill-buffer pip-http-buffer)) |
||||
|
|
||||
|
(defun pip-requirements-fetch-packages () |
||||
|
"Get a list of all packages available on PyPI and store them in `pip-packages'. |
||||
|
Assumes Emacs is compiled with libxml." |
||||
|
(setq pip-http-buffer |
||||
|
(url-retrieve pip-requirements-index-url |
||||
|
#'pip-requirements-callback nil t))) |
||||
|
|
||||
|
(defun pip-requirements-complete-at-point () |
||||
|
"Complete at point in Pip Requirements Mode." |
||||
|
(let* ((bounds (bounds-of-thing-at-point 'symbol)) |
||||
|
(start (or (car bounds) (point))) |
||||
|
(end (or (cdr bounds) (point)))) |
||||
|
(list start end pip-packages))) |
||||
|
|
||||
|
;; Declare variables from AC, to avoid a hard dependency on Auto Complete. |
||||
|
(defvar ac-modes) |
||||
|
(defvar ac-sources) |
||||
|
|
||||
|
;;;###autoload |
||||
|
(defun pip-requirements-auto-complete-setup () |
||||
|
"Setup Auto-Complete for Pip Requirements. |
||||
|
|
||||
|
See URL `https://github.com/auto-complete/auto-complete' for |
||||
|
information about Auto Complete." |
||||
|
(add-to-list 'ac-modes 'pip-requirements-mode) |
||||
|
(add-to-list 'ac-sources '((candidates . pip-packages))) |
||||
|
(when (and (fboundp 'auto-complete-mode) |
||||
|
(not (bound-and-true-p auto-complete-mode))) |
||||
|
;; Enable Auto Complete |
||||
|
(auto-complete-mode))) |
||||
|
|
||||
|
(custom-add-frequent-value 'pip-requirements-mode-hook |
||||
|
'pip-requirements-auto-complete-setup) |
||||
|
|
||||
|
;;;###autoload |
||||
|
(define-derived-mode pip-requirements-mode prog-mode "pip-require" |
||||
|
"Major mode for editing pip requirements files." |
||||
|
:syntax-table pip-requirements-syntax-table |
||||
|
(set (make-local-variable 'font-lock-defaults) '(pip-requirements-operators)) |
||||
|
(set (make-local-variable 'comment-start) "#") |
||||
|
(add-hook 'completion-at-point-functions |
||||
|
#'pip-requirements-complete-at-point nil 'local) |
||||
|
(unless pip-packages |
||||
|
;; Fetch the list of packages for completion |
||||
|
(pip-requirements-fetch-packages))) |
||||
|
|
||||
|
(provide 'pip-requirements) |
||||
|
;;; pip-requirements.el ends here |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue