[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[nongnu] elpa/nix-mode 42632ee471 168/500: Remove misc/ folder
From: |
ELPA Syncer |
Subject: |
[nongnu] elpa/nix-mode 42632ee471 168/500: Remove misc/ folder |
Date: |
Sat, 29 Jan 2022 08:27:03 -0500 (EST) |
branch: elpa/nix-mode
commit 42632ee471aed3e8a1a6ef385d1ee8bc43938a42
Author: Matthew Bauer <mjbauer95@gmail.com>
Commit: Matthew Bauer <mjbauer95@gmail.com>
Remove misc/ folder
This was unmaintained so I’ll put it to a branch for now.
Closes #32
---
misc/README.md | 6 -
misc/nix-build-log.el | 365 ------------------------------------
misc/nix-devel.el | 390 --------------------------------------
misc/nix-hydra-build.el | 370 ------------------------------------
misc/nix-hydra-jobset.el | 166 ----------------
misc/nix-hydra.el | 320 -------------------------------
misc/nix-popup.el | 51 -----
misc/nix-profiles.el | 202 --------------------
misc/nix-smie.el | 121 ------------
misc/nix-ui-messages.el | 260 -------------------------
misc/nix-ui-profile.el | 136 --------------
misc/nix-utils.el | 479 -----------------------------------------------
12 files changed, 2866 deletions(-)
diff --git a/misc/README.md b/misc/README.md
deleted file mode 100644
index 4ec2a76973..0000000000
--- a/misc/README.md
+++ /dev/null
@@ -1,6 +0,0 @@
-# nix-mode/misc
-
-These are some miscellaneous modes that I've come accross. Most are not really
-maintained and may not work. At some point, I hope to revive these and
-incorporate them into nix-mode. But for now, this is mostly a graveyard of
-unmaintained nix modes.
diff --git a/misc/nix-build-log.el b/misc/nix-build-log.el
deleted file mode 100644
index 2a9a316c46..0000000000
--- a/misc/nix-build-log.el
+++ /dev/null
@@ -1,365 +0,0 @@
-;;; nix-build-log.el --- Major and minor modes for build logs -*-
lexical-binding: t -*-
-
-;; Copyright © 2015 Alex Kost <alezost@gmail.com>
-
-;; This file is part of Emacs-Guix.
-
-;; Emacs-Guix 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.
-;;
-;; Emacs-Guix 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 Emacs-Guix. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This file provides a major mode (`nix-build-log-mode') and a minor mode
-;; (`nix-build-log-minor-mode') for highlighting Guix build logs.
-
-;;; Code:
-
-(require 'nix)
-(require 'nix-utils)
-
-(defgroup nix-build-log nil
- "Settings for `nix-build-log-mode'."
- :group 'guix)
-
-(defgroup nix-build-log-faces nil
- "Faces for `nix-build-log-mode'."
- :group 'nix-build-log
- :group 'nix-faces)
-
-(defface nix-build-log-title-head
- '((t :inherit font-lock-keyword-face))
- "Face for '@' symbol of a log title."
- :group 'nix-build-log-faces)
-
-(defface nix-build-log-title-start
- '((t :inherit nix-build-log-title-head))
- "Face for a log title denoting a start of a process."
- :group 'nix-build-log-faces)
-
-(defface nix-build-log-title-success
- '((t :inherit nix-build-log-title-head))
- "Face for a log title denoting a successful end of a process."
- :group 'nix-build-log-faces)
-
-(defface nix-build-log-title-fail
- '((t :inherit error))
- "Face for a log title denoting a failed end of a process."
- :group 'nix-build-log-faces)
-
-(defface nix-build-log-title-end
- '((t :inherit nix-build-log-title-head))
- "Face for a log title denoting an undefined end of a process."
- :group 'nix-build-log-faces)
-
-(defface nix-build-log-phase-name
- '((t :inherit font-lock-function-name-face))
- "Face for a phase name."
- :group 'nix-build-log-faces)
-
-(defface nix-build-log-phase-start
- '((default :weight bold)
- (((class grayscale) (background light)) :foreground "Gray90")
- (((class grayscale) (background dark)) :foreground "DimGray")
- (((class color) (min-colors 16) (background light))
- :foreground "DarkGreen")
- (((class color) (min-colors 16) (background dark))
- :foreground "LimeGreen")
- (((class color) (min-colors 8)) :foreground "green"))
- "Face for the start line of a phase."
- :group 'nix-build-log-faces)
-
-(defface nix-build-log-phase-end
- '((((class grayscale) (background light)) :foreground "Gray90")
- (((class grayscale) (background dark)) :foreground "DimGray")
- (((class color) (min-colors 16) (background light))
- :foreground "ForestGreen")
- (((class color) (min-colors 16) (background dark))
- :foreground "LightGreen")
- (((class color) (min-colors 8)) :foreground "green")
- (t :weight bold))
- "Face for the end line of a phase."
- :group 'nix-build-log-faces)
-
-(defface nix-build-log-phase-success
- '((t))
- "Face for the 'succeeded' word of a phase line."
- :group 'nix-build-log-faces)
-
-(defface nix-build-log-phase-fail
- '((t :inherit error))
- "Face for the 'failed' word of a phase line."
- :group 'nix-build-log-faces)
-
-(defface nix-build-log-phase-seconds
- '((t :inherit font-lock-constant-face))
- "Face for the number of seconds for a phase."
- :group 'nix-build-log-faces)
-
-(defcustom nix-build-log-mode-hook '()
- "Hook run after `nix-build-log-mode' is entered."
- :type 'hook
- :group 'nix-build-log)
-
-(defvar nix-build-log-phase-name-regexp "`\\([^']+\\)'"
- "Regexp for a phase name.")
-
-(defvar nix-build-log-phase-start-regexp
- (concat "^starting phase " nix-build-log-phase-name-regexp)
- "Regexp for the start line of a 'build' phase.")
-
-(defun nix-build-log-title-regexp (&optional state)
- "Return regexp for the log title.
-STATE is a symbol denoting a state of the title. It should be
-`start', `fail', `success' or `nil' (for a regexp matching any
-state)."
- (let* ((word-rx (rx (1+ (any word "-"))))
- (state-rx (cond ((eq state 'start) (concat word-rx "started"))
- ((eq state 'success) (concat word-rx "succeeded"))
- ((eq state 'fail) (concat word-rx "failed"))
- (t word-rx))))
- (rx-to-string
- `(and bol (group "@") " " (group (regexp ,state-rx)))
- t)))
-
-(defun nix-build-log-phase-end-regexp (&optional state)
- "Return regexp for the end line of a 'build' phase.
-STATE is a symbol denoting how a build phase was ended. It should be
-`fail', `success' or `nil' (for a regexp matching any state)."
- (let ((state-rx (cond ((eq state 'success) "succeeded")
- ((eq state 'fail) "failed")
- (t (regexp-opt '("succeeded" "failed"))))))
- (rx-to-string
- `(and bol "phase " (regexp ,nix-build-log-phase-name-regexp)
- " " (group (regexp ,state-rx)) " after "
- (group (1+ (or digit "."))) " seconds")
- t)))
-
-(defvar nix-build-log-phase-end-regexp
- ;; For efficiency, it is better to have a regexp for the general line
- ;; of the phase end, then to call the function all the time.
- (nix-build-log-phase-end-regexp)
- "Regexp for the end line of a 'build' phase.")
-
-(defvar nix-build-log-font-lock-keywords
- `((,(nix-build-log-title-regexp 'start)
- (1 'nix-build-log-title-head)
- (2 'nix-build-log-title-start))
- (,(nix-build-log-title-regexp 'success)
- (1 'nix-build-log-title-head)
- (2 'nix-build-log-title-success))
- (,(nix-build-log-title-regexp 'fail)
- (1 'nix-build-log-title-head)
- (2 'nix-build-log-title-fail))
- (,(nix-build-log-title-regexp)
- (1 'nix-build-log-title-head)
- (2 'nix-build-log-title-end))
- (,nix-build-log-phase-start-regexp
- (0 'nix-build-log-phase-start)
- (1 'nix-build-log-phase-name prepend))
- (,(nix-build-log-phase-end-regexp 'success)
- (0 'nix-build-log-phase-end)
- (1 'nix-build-log-phase-name prepend)
- (2 'nix-build-log-phase-success prepend)
- (3 'nix-build-log-phase-seconds prepend))
- (,(nix-build-log-phase-end-regexp 'fail)
- (0 'nix-build-log-phase-end)
- (1 'nix-build-log-phase-name prepend)
- (2 'nix-build-log-phase-fail prepend)
- (3 'nix-build-log-phase-seconds prepend)))
- "A list of `font-lock-keywords' for `nix-build-log-mode'.")
-
-(defvar nix-build-log-common-map
- (let ((map (make-sparse-keymap)))
- (define-key map (kbd "M-n") 'nix-build-log-next-phase)
- (define-key map (kbd "M-p") 'nix-build-log-previous-phase)
- (define-key map (kbd "TAB") 'nix-build-log-phase-toggle)
- (define-key map (kbd "<tab>") 'nix-build-log-phase-toggle)
- (define-key map (kbd "<backtab>") 'nix-build-log-phase-toggle-all)
- (define-key map [(shift tab)] 'nix-build-log-phase-toggle-all)
- map)
- "Parent keymap for 'build-log' buffers.
-For `nix-build-log-mode' this map is used as is.
-For `nix-build-log-minor-mode' this map is prefixed with 'C-c'.")
-
-(defvar nix-build-log-mode-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent
- map (make-composed-keymap (list nix-build-log-common-map)
- special-mode-map))
- (define-key map (kbd "c") 'compilation-shell-minor-mode)
- (define-key map (kbd "v") 'view-mode)
- map)
- "Keymap for `nix-build-log-mode' buffers.")
-
-(defvar nix-build-log-minor-mode-map
- (let ((map (make-sparse-keymap)))
- (define-key map (kbd "C-c") nix-build-log-common-map)
- map)
- "Keymap for `nix-build-log-minor-mode' buffers.")
-
-(defun nix-build-log-phase-start (&optional with-header?)
- "Return the start point of the current build phase.
-If WITH-HEADER? is non-nil, do not skip 'starting phase ...' header.
-Return nil, if there is no phase start before the current point."
- (save-excursion
- (end-of-line)
- (when (re-search-backward nix-build-log-phase-start-regexp nil t)
- (unless with-header? (end-of-line))
- (point))))
-
-(defun nix-build-log-phase-end ()
- "Return the end point of the current build phase."
- (save-excursion
- (beginning-of-line)
- (when (re-search-forward nix-build-log-phase-end-regexp nil t)
- (point))))
-
-(defun nix-build-log-phase-hide ()
- "Hide the body of the current build phase."
- (interactive)
- (let ((beg (nix-build-log-phase-start))
- (end (nix-build-log-phase-end)))
- (when (and beg end)
- ;; If not on the header line, move to it.
- (when (and (> (point) beg)
- (< (point) end))
- (goto-char (nix-build-log-phase-start t)))
- (remove-overlays beg end 'invisible t)
- (let ((o (make-overlay beg end)))
- (overlay-put o 'evaporate t)
- (overlay-put o 'invisible t)))))
-
-(defun nix-build-log-phase-show ()
- "Show the body of the current build phase."
- (interactive)
- (let ((beg (nix-build-log-phase-start))
- (end (nix-build-log-phase-end)))
- (when (and beg end)
- (remove-overlays beg end 'invisible t))))
-
-(defun nix-build-log-phase-hidden-p ()
- "Return non-nil, if the body of the current build phase is hidden."
- (let ((beg (nix-build-log-phase-start)))
- (and beg
- (cl-some (lambda (o)
- (overlay-get o 'invisible))
- (overlays-at beg)))))
-
-(defun nix-build-log-phase-toggle-function ()
- "Return a function to toggle the body of the current build phase."
- (if (nix-build-log-phase-hidden-p)
- #'nix-build-log-phase-show
- #'nix-build-log-phase-hide))
-
-(defun nix-build-log-phase-toggle ()
- "Show/hide the body of the current build phase."
- (interactive)
- (funcall (nix-build-log-phase-toggle-function)))
-
-(defun nix-build-log-phase-toggle-all ()
- "Show/hide the bodies of all build phases."
- (interactive)
- (save-excursion
- ;; Some phases may be hidden, and some shown. Whether to hide or to
- ;; show them, it is determined by the state of the first phase here.
- (goto-char (point-min))
- (let ((fun (save-excursion
- (re-search-forward nix-build-log-phase-start-regexp nil t)
- (nix-build-log-phase-toggle-function))))
- (while (re-search-forward nix-build-log-phase-start-regexp nil t)
- (funcall fun)))))
-
-(defun nix-build-log-next-phase (&optional arg)
- "Move to the next build phase.
-With ARG, do it that many times. Negative ARG means move
-backward."
- (interactive "^p")
- (if arg
- (when (zerop arg) (user-error "Try again"))
- (setq arg 1))
- (let ((search-fun (if (> arg 0)
- #'re-search-forward
- #'re-search-backward))
- (n (abs arg))
- found last-found)
- (save-excursion
- (end-of-line (if (> arg 0) 1 0)) ; skip the current line
- (while (and (not (zerop n))
- (setq found
- (funcall search-fun
- nix-build-log-phase-start-regexp
- nil t)))
- (setq n (1- n)
- last-found found)))
- (when last-found
- (goto-char last-found)
- (forward-line 0))
- (or found
- (user-error (if (> arg 0)
- "No next build phase"
- "No previous build phase")))))
-
-(defun nix-build-log-previous-phase (&optional arg)
- "Move to the previous build phase.
-With ARG, do it that many times. Negative ARG means move
-forward."
- (interactive "^p")
- (nix-build-log-next-phase (- (or arg 1))))
-
-;;;###autoload
-(define-derived-mode nix-build-log-mode special-mode
- "Nix-Build-Log"
- "Major mode for viewing Guix build logs.
-
-\\{nix-build-log-mode-map}"
- (setq font-lock-defaults '(nix-build-log-font-lock-keywords t)))
-
-;;;###autoload
-(define-minor-mode nix-build-log-minor-mode
- "Toggle Guix Build Log minor mode.
-
-With a prefix argument ARG, enable Guix Build Log minor mode if
-ARG is positive, and disable it otherwise. If called from Lisp,
-enable the mode if ARG is omitted or nil.
-
-When Guix Build Log minor mode is enabled, it highlights build
-log in the current buffer. This mode can be enabled
-programmatically using hooks, like this:
-
- (add-hook 'shell-mode-hook 'nix-build-log-minor-mode)
-
-\\{nix-build-log-minor-mode-map}"
- :init-value nil
- :lighter " Nix-Build-Log"
- :keymap nix-build-log-minor-mode-map
- :group 'nix-build-log
- (if nix-build-log-minor-mode
- (font-lock-add-keywords nil nix-build-log-font-lock-keywords)
- (font-lock-remove-keywords nil nix-build-log-font-lock-keywords))
- (nix-font-lock-flush))
-
-(defun nix-build-log-find-file (file-or-url)
- "Open FILE-OR-URL in `nix-build-log-mode'."
- (nix-find-file-or-url file-or-url)
- (nix-build-log-mode))
-
-;;;###autoload
-(add-to-list 'auto-mode-alist
- ;; Regexp for log files (usually placed in /var/log/guix/...)
- (cons (rx "/guix/drvs/" (= 2 alnum) "/" (= 30 alnum)
- "-" (+ (any alnum "-+.")) ".drv" string-end)
- 'nix-build-log-mode))
-
-(provide 'nix-build-log)
-
-;;; nix-build-log.el ends here
diff --git a/misc/nix-devel.el b/misc/nix-devel.el
deleted file mode 100644
index b24634e248..0000000000
--- a/misc/nix-devel.el
+++ /dev/null
@@ -1,390 +0,0 @@
-;;; nix-devel.el --- Development tools -*- lexical-binding: t -*-
-
-;; Copyright © 2015–2017 Alex Kost <alezost@gmail.com>
-
-;; This file is part of Emacs-Guix.
-
-;; Emacs-Guix 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.
-;;
-;; Emacs-Guix 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 Emacs-Guix. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This file provides `nix-devel-mode' (minor mode for `scheme-mode'
-;; buffers) that provides highlighting and indentation rules for Guix
-;; Guile code, as well as some tools to work with Guix (or even an
-;; arbitrary Guile code) with Geiser.
-
-;;; Code:
-
-(require 'lisp-mode)
-(require 'bui-utils)
-(require 'guix nil t)
-(require 'nix-utils)
-(require 'nix-guile)
-(require 'nix-geiser)
-(require 'nix-misc)
-
-(defgroup nix-devel nil
- "Settings for Guix development utils."
- :group 'guix)
-
-(defgroup nix-devel-faces nil
- "Faces for `nix-devel-mode'."
- :group 'nix-devel
- :group 'nix-faces)
-
-(defface nix-devel-modify-phases-keyword
- '((t :inherit font-lock-preprocessor-face))
- "Face for a `modify-phases' keyword ('delete', 'replace', etc.)."
- :group 'nix-devel-faces)
-
-(defface nix-devel-gexp-symbol
- '((t :inherit font-lock-keyword-face))
- "Face for gexp symbols ('#~', '#$', etc.).
-See Info node `(guix) G-Expressions'."
- :group 'nix-devel-faces)
-
-(defun nix-devel-use-modules (&rest modules)
- "Use guile MODULES."
- (apply #'nix-geiser-call "use-modules" modules))
-
-(defun nix-devel-use-module (&optional module)
- "Use guile MODULE in the current Geiser REPL.
-MODULE is a string with the module name - e.g., \"(ice-9 match)\".
-Interactively, use the module defined by the current scheme file."
- (interactive (list (nix-guile-current-module)))
- (nix-devel-use-modules module)
- (message "Using %s module." module))
-
-(defun nix-devel-copy-module-as-kill ()
- "Put the name of the current guile module into `kill-ring'."
- (interactive)
- (bui-copy-as-kill (nix-guile-current-module)))
-
-(defun nix-devel-setup-repl (&optional repl)
- "Setup REPL for using `nix-devel-...' commands."
- (nix-devel-use-modules "(guix monad-repl)"
- "(guix scripts)"
- "(guix store)"
- "(guix ui)")
- ;; Without this workaround, the warning/build output disappears. See
- ;; <https://github.com/jaor/geiser/issues/83> for details.
- (nix-geiser-eval-in-repl-synchronously
- "(begin
- (nix-warning-port (current-warning-port))
- (current-build-output-port (current-error-port)))"
- repl 'no-history 'no-display))
-
-(defvar nix-devel-repl-processes nil
- "List of REPL processes configured by `nix-devel-setup-repl'.")
-
-(defun nix-devel-setup-repl-maybe (&optional repl)
- "Setup (if needed) REPL for using `nix-devel-...' commands."
- (let ((process (get-buffer-process (or repl (nix-geiser-repl)))))
- (when (and process
- (not (memq process nix-devel-repl-processes)))
- (nix-devel-setup-repl repl)
- (push process nix-devel-repl-processes))))
-
-(defmacro nix-devel-with-definition (def-var &rest body)
- "Run BODY with the current guile definition bound to DEF-VAR.
-Bind DEF-VAR variable to the name of the current top-level
-definition, setup the current REPL, use the current module, and
-run BODY."
- (declare (indent 1) (debug (symbolp body)))
- `(let ((,def-var (nix-guile-current-definition)))
- (nix-devel-setup-repl-maybe)
- (nix-devel-use-modules (nix-guile-current-module))
- ,@body))
-
-(defun nix-devel-build-package-definition ()
- "Build a package defined by the current top-level variable definition."
- (interactive)
- (nix-devel-with-definition def
- (when (or (not nix-operation-confirm)
- (nix-operation-prompt (format "Build '%s'?" def)))
- (nix-geiser-eval-in-repl
- (concat ",run-in-store "
- (nix-guile-make-call-expression
- "build-package" def
- "#:use-substitutes?" (nix-guile-boolean
- nix-use-substitutes)
- "#:dry-run?" (nix-guile-boolean nix-dry-run)))))))
-
-(defun nix-devel-build-package-source ()
- "Build the source of the current package definition."
- (interactive)
- (nix-devel-with-definition def
- (when (or (not nix-operation-confirm)
- (nix-operation-prompt
- (format "Build '%s' package source?" def)))
- (nix-geiser-eval-in-repl
- (concat ",run-in-store "
- (nix-guile-make-call-expression
- "build-package-source" def
- "#:use-substitutes?" (nix-guile-boolean
- nix-use-substitutes)
- "#:dry-run?" (nix-guile-boolean nix-dry-run)))))))
-
-(defun nix-devel-download-package-source ()
- "Download the source of the current package.
-Use this function to compute SHA256 hash of the package source."
- (interactive)
- (nix-devel-with-definition def
- (nix-devel-use-modules "(guix packages)"
- "(guix scripts download)")
- (when (or (not nix-operation-confirm)
- (y-or-n-p (format "Download '%s' package source?" def)))
- (nix-geiser-eval-in-repl
- (format "(nix-download (origin-uri (package-source %s)))"
- def)))))
-
-(defun nix-devel-lint-package ()
- "Check the current package.
-See Info node `(guix) Invoking guix lint' for details."
- (interactive)
- (nix-devel-with-definition def
- (nix-devel-use-modules "(guix scripts lint)")
- (when (or (not nix-operation-confirm)
- (y-or-n-p (format "Lint '%s' package?"
def)))
- (nix-geiser-eval-in-repl
- (format "(run-checkers %s)" def)))))
-
-;;; Font-lock
-
-(defvar nix-devel-modify-phases-keyword-regexp
- (rx (or "delete" "replace" "add-before" "add-after"))
- "Regexp for a 'modify-phases' keyword.")
-
-(defun nix-devel-modify-phases-font-lock-matcher (limit)
- "Find a 'modify-phases' keyword.
-This function is used as a MATCHER for `font-lock-keywords'."
- (ignore-errors
- (down-list)
- (or (re-search-forward nix-devel-modify-phases-keyword-regexp
- limit t)
- (set-match-data nil))
- (up-list)
- t))
-
-(defun nix-devel-modify-phases-font-lock-pre ()
- "Skip the next sexp, and return the end point of the current list.
-This function is used as a PRE-MATCH-FORM for `font-lock-keywords'
-to find 'modify-phases' keywords."
- (let ((in-comment? (nth 4 (syntax-ppss))))
- ;; If 'modify-phases' is commented, do not try to search for its
- ;; keywords.
- (unless in-comment?
- (ignore-errors (forward-sexp))
- (save-excursion (up-list) (point)))))
-
-(defconst nix-devel-keywords
- '("call-with-compressed-output-port"
- "call-with-container"
- "call-with-decompressed-port"
- "call-with-derivation-narinfo"
- "call-with-derivation-substitute"
- "call-with-error-handling"
- "call-with-gzip-input-port"
- "call-with-gzip-output-port"
- "call-with-temporary-directory"
- "call-with-temporary-output-file"
- "define-enumerate-type"
- "define-gexp-compiler"
- "define-lift"
- "define-monad"
- "define-operation"
- "define-record-type*"
- "emacs-substitute-sexps"
- "emacs-substitute-variables"
- "mbegin"
- "mlambda"
- "mlambdaq"
- "mlet"
- "mlet*"
- "modify-services"
- "munless"
- "mwhen"
- "run-with-state"
- "run-with-store"
- "signature-case"
- "substitute*"
- "substitute-keyword-arguments"
- "test-assertm"
- "use-package-modules"
- "use-service-modules"
- "use-system-modules"
- "with-atomic-file-output"
- "with-atomic-file-replacement"
- "with-derivation-narinfo"
- "with-derivation-substitute"
- "with-directory-excursion"
- "with-error-handling"
- "with-imported-modules"
- "with-monad"
- "with-mutex"
- "with-store"))
-
-(defvar nix-devel-font-lock-keywords
- `((,(rx (or "#~" "#$" "#$@" "#+" "#+@")) .
- 'nix-devel-gexp-symbol)
- (,(nix-guile-keyword-regexp (regexp-opt nix-devel-keywords))
- (1 'font-lock-keyword-face))
- (,(nix-guile-keyword-regexp "modify-phases")
- (1 'font-lock-keyword-face)
- (nix-devel-modify-phases-font-lock-matcher
- (nix-devel-modify-phases-font-lock-pre)
- nil
- (0 'nix-devel-modify-phases-keyword nil t))))
- "A list of `font-lock-keywords' for `nix-devel-mode'.")
-
-;;; Indentation
-
-(defmacro nix-devel-scheme-indent (&rest rules)
- "Set `scheme-indent-function' according to RULES.
-Each rule should have a form (SYMBOL VALUE). See `put' for details."
- (declare (indent 0))
- `(progn
- ,@(mapcar (lambda (rule)
- `(put ',(car rule) 'scheme-indent-function ,(cadr rule)))
- rules)))
-
-(defun nix-devel-indent-package (state indent-point normal-indent)
- "Indentation rule for 'package' form."
- (let* ((package-eol (line-end-position))
- (count (if (and (ignore-errors (down-list) t)
- (< (point) package-eol)
- (looking-at "inherit\\>"))
- 1
- 0)))
- (lisp-indent-specform count state indent-point normal-indent)))
-
-(defun nix-devel-indent-modify-phases-keyword (count)
- "Return indentation function for 'modify-phases' keywords."
- (lambda (state indent-point normal-indent)
- (when (ignore-errors
- (goto-char (nth 1 state)) ; start of keyword sexp
- (backward-up-list)
- (looking-at "(modify-phases\\>"))
- (lisp-indent-specform count state indent-point normal-indent))))
-
-(defalias 'nix-devel-indent-modify-phases-keyword-1
- (nix-devel-indent-modify-phases-keyword 1))
-(defalias 'nix-devel-indent-modify-phases-keyword-2
- (nix-devel-indent-modify-phases-keyword 2))
-
-(nix-devel-scheme-indent
- (bag 0)
- (build-system 0)
- (call-with-compressed-output-port 2)
- (call-with-container 1)
- (call-with-gzip-input-port 1)
- (call-with-gzip-output-port 1)
- (call-with-decompressed-port 2)
- (call-with-error-handling 0)
- (container-excursion 1)
- (emacs-batch-edit-file 1)
- (emacs-batch-eval 0)
- (emacs-substitute-sexps 1)
- (emacs-substitute-variables 1)
- (file-system 0)
- (graft 0)
- (manifest-entry 0)
- (manifest-pattern 0)
- (mbegin 1)
- (mlambda 1)
- (mlambdaq 1)
- (mlet 2)
- (mlet* 2)
- (modify-phases 1)
- (modify-services 1)
- (munless 1)
- (mwhen 1)
- (operating-system 0)
- (origin 0)
- (package 'nix-devel-indent-package)
- (run-with-state 1)
- (run-with-store 1)
- (signature-case 1)
- (substitute* 1)
- (substitute-keyword-arguments 1)
- (test-assertm 1)
- (with-atomic-file-output 1)
- (with-derivation-narinfo 1)
- (with-derivation-substitute 2)
- (with-directory-excursion 1)
- (with-error-handling 0)
- (with-imported-modules 1)
- (with-monad 1)
- (with-mutex 1)
- (with-store 1)
- (wrap-program 1)
-
- ;; 'modify-phases' keywords:
- (replace 'nix-devel-indent-modify-phases-keyword-1)
- (add-after 'nix-devel-indent-modify-phases-keyword-2)
- (add-before 'nix-devel-indent-modify-phases-keyword-2))
-
-(defvar nix-devel-keys-map
- (let ((map (make-sparse-keymap)))
- (define-key map (kbd "b") 'nix-devel-build-package-definition)
- (define-key map (kbd "s") 'nix-devel-build-package-source)
- (define-key map (kbd "d") 'nix-devel-download-package-source)
- (define-key map (kbd "l") 'nix-devel-lint-package)
- (define-key map (kbd "k") 'nix-devel-copy-module-as-kill)
- (define-key map (kbd "u") 'nix-devel-use-module)
- map)
- "Keymap with subkeys for `nix-devel-mode-map'.")
-
-(defvar nix-devel-mode-map
- (let ((map (make-sparse-keymap)))
- (define-key map (kbd "C-c .") nix-devel-keys-map)
- map)
- "Keymap for `nix-devel-mode'.")
-
-;;;###autoload
-(define-minor-mode nix-devel-mode
- "Minor mode for `scheme-mode' buffers.
-
-With a prefix argument ARG, enable the mode if ARG is positive,
-and disable it otherwise. If called from Lisp, enable the mode
-if ARG is omitted or nil.
-
-When Guix Devel mode is enabled, it highlights various Guix
-keywords. This mode can be enabled programmatically using hooks,
-like this:
-
- (add-hook 'scheme-mode-hook 'nix-devel-mode)
-
-\\{nix-devel-mode-map}"
- :init-value nil
- :lighter " Nix"
- :keymap nix-devel-mode-map
- (if nix-devel-mode
- (progn
- (setq-local font-lock-multiline t)
- (font-lock-add-keywords nil nix-devel-font-lock-keywords))
- (setq-local font-lock-multiline nil)
- (font-lock-remove-keywords nil nix-devel-font-lock-keywords))
- (nix-font-lock-flush))
-
-(defvar nix-devel-emacs-font-lock-keywords
- (eval-when-compile
- `((,(rx "(" (group "nix-devel-with-definition") symbol-end) . 1))))
-
-(font-lock-add-keywords 'emacs-lisp-mode
- nix-devel-emacs-font-lock-keywords)
-
-(provide 'nix-devel)
-
-;;; nix-devel.el ends here
diff --git a/misc/nix-hydra-build.el b/misc/nix-hydra-build.el
deleted file mode 100644
index c4a76243f4..0000000000
--- a/misc/nix-hydra-build.el
+++ /dev/null
@@ -1,370 +0,0 @@
-;;; nix-hydra-build.el --- Interface for Hydra builds -*- lexical-binding: t
-*-
-
-;; Copyright © 2015–2017 Alex Kost <alezost@gmail.com>
-
-;; This file is part of Emacs-Guix.
-
-;; Emacs-Guix 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.
-;;
-;; Emacs-Guix 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 Emacs-Guix. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This file provides an interface for displaying Hydra builds in
-;; 'list' and 'info' buffers.
-
-;;; Code:
-
-(require 'cl-lib)
-(require 'bui)
-(require 'nix)
-(require 'nix-hydra)
-(require 'nix-utils)
-
-(nix-hydra-define-entry-type build
- :search-types '((latest . nix-hydra-build-latest-api-url)
- (queue . nix-hydra-build-queue-api-url))
- :filters '(nix-hydra-build-filter-status)
- :filter-names '((nixname . name)
- (buildstatus . build-status)
- (timestamp . time))
- :filter-boolean-params '(finished busy))
-
-(defun nix-hydra-build-get-display (search-type &rest args)
- "Search for Hydra builds and show results."
- (apply #'bui-list-get-display-entries
- 'nix-hydra-build search-type args))
-
-(cl-defun nix-hydra-build-latest-prompt-args (&key project jobset
- job system)
- "Prompt for and return a list of 'latest builds' arguments."
- (let* ((number (read-number "Number of latest builds: "))
- (project (if current-prefix-arg
- (nix-hydra-read-project nil project)
- project))
- (jobset (if current-prefix-arg
- (nix-hydra-read-jobset nil jobset)
- jobset))
- (job-or-name (if current-prefix-arg
- (nix-hydra-read-job nil job)
- job))
- (job (and job-or-name
- (string-match-p nix-hydra-job-regexp
- job-or-name)
- job-or-name))
- (system (if (and (not job)
- (or current-prefix-arg
- (and job-or-name (not system))))
- (if job-or-name
- (guix-while-null
- (guix-hydra-read-system
- (concat job-or-name ".") system))
- (guix-hydra-read-system nil system))
- system))
- (job (or job
- (and job-or-name
- (concat job-or-name "." system)))))
- (list number
- :project project
- :jobset jobset
- :job job
- :system system)))
-
-(declare-function nix-build-log-find-file "nix-build-log" (file))
-
-(defun nix-hydra-build-view-log (id)
- "View build log of a hydra build ID."
- (require 'nix-build-log)
- (nix-build-log-find-file (nix-hydra-build-log-url id)))
-
-;;; Defining URLs
-
-(defun nix-hydra-build-url (id)
- "Return Hydra URL of a build ID."
- (nix-hydra-url "build/" (number-to-string id)))
-
-(defun nix-hydra-build-log-url (id)
- "Return Hydra URL of the log file of a build ID."
- (concat (nix-hydra-build-url id) "/log/raw"))
-
-(cl-defun nix-hydra-build-latest-api-url
- (number &key project jobset job system)
- "Return Hydra API URL to receive latest NUMBER of builds."
- (nix-hydra-api-url "latestbuilds"
- `(("nr" . ,number)
- ("project" . ,project)
- ("jobset" . ,jobset)
- ("job" . ,job)
- ("system" . ,system))))
-
-(defun nix-hydra-build-queue-api-url (number)
- "Return Hydra API URL to receive the NUMBER of queued builds."
- (nix-hydra-api-url "queue"
- `(("nr" . ,number))))
-
-;;; Filters for processing raw entries
-
-(defun nix-hydra-build-filter-status (entry)
- "Add 'status' parameter to 'hydra-build' ENTRY."
- (let ((status (if (bui-entry-non-void-value entry 'finished)
- (nix-hydra-build-status-number->name
- (bui-entry-non-void-value entry 'build-status))
- (if (bui-entry-non-void-value entry 'busy)
- 'running
- 'scheduled))))
- (cons `(status . ,status)
- entry)))
-
-;;; Build status
-
-(defface nix-hydra-build-status-running
- '((t :inherit bold))
- "Face used if hydra build is not finished."
- :group 'nix-hydra-build-faces)
-
-(defface nix-hydra-build-status-scheduled
- '((t))
- "Face used if hydra build is scheduled."
- :group 'nix-hydra-build-faces)
-
-(defface nix-hydra-build-status-succeeded
- '((t :inherit success))
- "Face used if hydra build succeeded."
- :group 'nix-hydra-build-faces)
-
-(defface nix-hydra-build-status-cancelled
- '((t :inherit warning))
- "Face used if hydra build was cancelled."
- :group 'nix-hydra-build-faces)
-
-(defface nix-hydra-build-status-failed
- '((t :inherit error))
- "Face used if hydra build failed."
- :group 'nix-hydra-build-faces)
-
-(defvar nix-hydra-build-status-alist
- '((0 . succeeded)
- (1 . failed-build)
- (2 . failed-dependency)
- (3 . failed-other)
- (4 . cancelled))
- "Alist of hydra build status numbers and status names.
-Status numbers are returned by Hydra API, names (symbols) are
-used internally by the elisp code of this package.")
-
-(defun nix-hydra-build-status-number->name (number)
- "Convert build status number to a name.
-See `nix-hydra-build-status-alist'."
- (bui-assq-value nix-hydra-build-status-alist number))
-
-(defun nix-hydra-build-status-string (status)
- "Return a human readable string for build STATUS."
- (cl-case status
- (scheduled
- (bui-get-string "Scheduled" 'nix-hydra-build-status-scheduled))
- (running
- (bui-get-string "Running" 'nix-hydra-build-status-running))
- (succeeded
- (bui-get-string "Succeeded" 'nix-hydra-build-status-succeeded))
- (cancelled
- (bui-get-string "Cancelled" 'nix-hydra-build-status-cancelled))
- (failed-build
- (nix-hydra-build-status-fail-string))
- (failed-dependency
- (nix-hydra-build-status-fail-string "dependency"))
- (failed-other
- (nix-hydra-build-status-fail-string "other"))))
-
-(defun nix-hydra-build-status-fail-string (&optional reason)
- "Return a string for a failed build."
- (let ((base (bui-get-string "Failed" 'nix-hydra-build-status-failed)))
- (if reason
- (concat base " (" reason ")")
- base)))
-
-(defun nix-hydra-build-finished? (entry)
- "Return non-nil, if hydra build was finished."
- (bui-entry-non-void-value entry 'finished))
-
-(defun nix-hydra-build-running? (entry)
- "Return non-nil, if hydra build is running."
- (eq (bui-entry-non-void-value entry 'status)
- 'running))
-
-(defun nix-hydra-build-scheduled? (entry)
- "Return non-nil, if hydra build is scheduled."
- (eq (bui-entry-non-void-value entry 'status)
- 'scheduled))
-
-(defun nix-hydra-build-succeeded? (entry)
- "Return non-nil, if hydra build succeeded."
- (eq (bui-entry-non-void-value entry 'status)
- 'succeeded))
-
-(defun nix-hydra-build-cancelled? (entry)
- "Return non-nil, if hydra build was cancelled."
- (eq (bui-entry-non-void-value entry 'status)
- 'cancelled))
-
-(defun nix-hydra-build-failed? (entry)
- "Return non-nil, if hydra build failed."
- (memq (bui-entry-non-void-value entry 'status)
- '(failed-build failed-dependency failed-other)))
-
-;;; Hydra build 'info'
-
-(nix-hydra-define-interface build info
- :mode-name "Hydra-Build-Info"
- :buffer-name "*Hydra Build Info*"
- :format '((name nil (simple bui-info-heading))
- nil
- nix-hydra-build-info-insert-url
- (time format (time))
- (status format nix-hydra-build-info-insert-status)
- (project format (format nix-hydra-build-project))
- (jobset format (format nix-hydra-build-jobset))
- (job format (format nix-hydra-build-job))
- (system format (format nix-hydra-build-system))
- (priority format (format))))
-
-(defface nix-hydra-build-info-project
- '((t :inherit link))
- "Face for project names."
- :group 'nix-hydra-build-info-faces)
-
-(defface nix-hydra-build-info-jobset
- '((t :inherit link))
- "Face for jobsets."
- :group 'nix-hydra-build-info-faces)
-
-(defface nix-hydra-build-info-job
- '((t :inherit link))
- "Face for jobs."
- :group 'nix-hydra-build-info-faces)
-
-(defface nix-hydra-build-info-system
- '((t :inherit link))
- "Face for system names."
- :group 'nix-hydra-build-info-faces)
-
-(defmacro nix-hydra-build-define-button (name)
- "Define `nix-hydra-build-NAME' button."
- (let* ((name-str (symbol-name name))
- (button-name (intern (concat "nix-hydra-build-" name-str)))
- (face-name (intern (concat "nix-hydra-build-info-" name-str)))
- (keyword (intern (concat ":" name-str))))
- `(define-button-type ',button-name
- :supertype 'bui
- 'face ',face-name
- 'help-echo ,(format "\
-Show latest builds for this %s (with prefix, prompt for all parameters)"
- name-str)
- 'action (lambda (btn)
- (let ((args (nix-hydra-build-latest-prompt-args
- ,keyword (button-label btn))))
- (apply #'nix-hydra-build-get-display
- 'latest args))))))
-
-(nix-hydra-build-define-button project)
-(nix-hydra-build-define-button jobset)
-(nix-hydra-build-define-button job)
-(nix-hydra-build-define-button system)
-
-(defun nix-hydra-build-info-insert-url (entry)
- "Insert Hydra URL for the build ENTRY."
- (bui-insert-button (nix-hydra-build-url (bui-entry-id entry))
- 'bui-url)
- (when (nix-hydra-build-finished? entry)
- (bui-insert-indent)
- (bui-insert-action-button
- "Build log"
- (lambda (btn)
- (nix-hydra-build-view-log (button-get btn 'id)))
- "View build log"
- 'id (bui-entry-id entry)))
- (bui-newline))
-
-(defun nix-hydra-build-info-insert-status (status &optional _)
- "Insert a string with build STATUS."
- (insert (nix-hydra-build-status-string status)))
-
-;;; Hydra build 'list'
-
-(nix-hydra-define-interface build list
- :describe-function 'nix-hydra-list-describe
- :mode-name "Hydra-Build-List"
- :buffer-name "*Nix Hydra Builds*"
- :format '((name nil 30 t)
- (system nil 16 t)
- (status nix-hydra-build-list-get-status 20 t)
- (project nil 10 t)
- (jobset nil 17 t)
- (time bui-list-get-time 20 t))
- :hint 'nix-hydra-build-list-hint)
-
-(let ((map nix-hydra-build-list-mode-map))
- (define-key map (kbd "B") 'nix-hydra-build-list-latest-builds)
- (define-key map (kbd "L") 'nix-hydra-build-list-view-log))
-
-(defvar nix-hydra-build-list-default-hint
- '(("\\[nix-hydra-build-list-latest-builds]")
- " show latest builds of the current job;\n"
- ("\\[nix-hydra-build-list-view-log]") " show build log;\n"))
-
-(defun nix-hydra-build-list-hint ()
- (bui-format-hints
- nix-hydra-build-list-default-hint
- (bui-default-hint)))
-
-(defun nix-hydra-build-list-get-status (status &optional _)
- "Return a string for build STATUS."
- (nix-hydra-build-status-string status))
-
-(defun nix-hydra-build-list-latest-builds (number &rest args)
- "Display latest NUMBER of Hydra builds of the current job.
-Interactively, prompt for NUMBER. With prefix argument, prompt
-for all ARGS."
- (interactive
- (let ((entry (bui-list-current-entry)))
- (nix-hydra-build-latest-prompt-args
- :project (bui-entry-non-void-value entry 'project)
- :jobset (bui-entry-non-void-value entry 'name)
- :job (bui-entry-non-void-value entry 'job)
- :system (bui-entry-non-void-value entry 'system))))
- (apply #'nix-hydra-latest-builds number args))
-
-(defun nix-hydra-build-list-view-log ()
- "View build log of the current Hydra build."
- (interactive)
- (nix-hydra-build-view-log (bui-list-current-id)))
-
-;;; Interactive commands
-
-;;;###autoload
-(defun nix-hydra-latest-builds (number &rest args)
- "Display latest NUMBER of Hydra builds.
-ARGS are the same arguments as for `nix-hydra-build-latest-api-url'.
-Interactively, prompt for NUMBER. With prefix argument, prompt
-for all ARGS."
- (interactive (nix-hydra-build-latest-prompt-args))
- (apply #'nix-hydra-build-get-display
- 'latest number args))
-
-;;;###autoload
-(defun nix-hydra-queued-builds (number)
- "Display the NUMBER of queued Hydra builds."
- (interactive "NNumber of queued builds: ")
- (nix-hydra-build-get-display 'queue number))
-
-(provide 'nix-hydra-build)
-
-;;; nix-hydra-build.el ends here
diff --git a/misc/nix-hydra-jobset.el b/misc/nix-hydra-jobset.el
deleted file mode 100644
index d826d85852..0000000000
--- a/misc/nix-hydra-jobset.el
+++ /dev/null
@@ -1,166 +0,0 @@
-;;; guix-hydra-jobset.el --- Interface for Hydra jobsets -*- lexical-binding:
t -*-
-
-;; Copyright © 2015–2017 Alex Kost <alezost@gmail.com>
-
-;; This file is part of Emacs-Guix.
-
-;; Emacs-Guix 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.
-;;
-;; Emacs-Guix 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 Emacs-Guix. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This file provides an interface for displaying Hydra jobsets in
-;; 'list' and 'info' buffers.
-
-;;; Code:
-
-(require 'cl-lib)
-(require 'bui)
-(require 'nix-hydra)
-(require 'nix-hydra-build)
-
-(nix-hydra-define-entry-type jobset
- :search-types '((project . nix-hydra-jobset-api-url))
- :filters '(nix-hydra-jobset-filter-id)
- :filter-names '((nrscheduled . scheduled)
- (nrsucceeded . succeeded)
- (nrfailed . failed)
- (nrtotal . total)))
-
-(defun nix-hydra-jobset-get-display (search-type &rest args)
- "Search for Hydra builds and show results."
- (apply #'bui-list-get-display-entries
- 'nix-hydra-jobset search-type args))
-
-;;; Defining URLs
-
-(defun nix-hydra-jobset-url (project jobset)
- "Return Hydra URL of a PROJECT's JOBSET."
- (nix-hydra-url "jobset/" project "/" jobset))
-
-(defun nix-hydra-jobset-api-url (project)
- "Return Hydra API URL for jobsets by PROJECT."
- (nix-hydra-api-url "jobsets"
- `(("project" . ,project))))
-
-;;; Filters for processing raw entries
-
-(defun nix-hydra-jobset-filter-id (entry)
- "Add 'ID' parameter to 'hydra-jobset' ENTRY."
- (cons `(id . ,(bui-entry-non-void-value entry 'name))
- entry))
-
-;;; Hydra jobset 'info'
-
-(nix-hydra-define-interface jobset info
- :mode-name "Hydra-Jobset-Info"
- :buffer-name "*Hydra Jobset Info*"
- :format '((name nil (simple bui-info-heading))
- nil
- nix-hydra-jobset-info-insert-url
- (project format nix-hydra-jobset-info-insert-project)
- (scheduled format (format nix-hydra-jobset-info-scheduled))
- (succeeded format (format nix-hydra-jobset-info-succeeded))
- (failed format (format nix-hydra-jobset-info-failed))
- (total format (format nix-hydra-jobset-info-total))))
-
-(defface nix-hydra-jobset-info-scheduled
- '((t))
- "Face used for the number of scheduled builds."
- :group 'nix-hydra-jobset-info-faces)
-
-(defface nix-hydra-jobset-info-succeeded
- '((t :inherit nix-hydra-build-status-succeeded))
- "Face used for the number of succeeded builds."
- :group 'nix-hydra-jobset-info-faces)
-
-(defface nix-hydra-jobset-info-failed
- '((t :inherit nix-hydra-build-status-failed))
- "Face used for the number of failed builds."
- :group 'nix-hydra-jobset-info-faces)
-
-(defface nix-hydra-jobset-info-total
- '((t))
- "Face used for the total number of builds."
- :group 'nix-hydra-jobset-info-faces)
-
-(defun nix-hydra-jobset-info-insert-project (project entry)
- "Insert PROJECT button for the jobset ENTRY."
- (let ((jobset (bui-entry-non-void-value entry 'name)))
- (bui-insert-button
- project 'nix-hydra-build-project
- 'action (lambda (btn)
- (let ((args (nix-hydra-build-latest-prompt-args
- :project (button-get btn 'project)
- :jobset (button-get btn 'jobset))))
- (apply #'nix-hydra-build-get-display
- 'latest args)))
- 'project project
- 'jobset jobset)))
-
-(defun nix-hydra-jobset-info-insert-url (entry)
- "Insert Hydra URL for the jobset ENTRY."
- (bui-insert-button (nix-hydra-jobset-url
- (bui-entry-non-void-value entry 'project)
- (bui-entry-non-void-value entry 'name))
- 'bui-url)
- (bui-newline))
-
-;;; Hydra jobset 'list'
-
-(nix-hydra-define-interface jobset list
- :describe-function 'nix-hydra-list-describe
- :mode-name "Hydra-Jobset-List"
- :buffer-name "*Hydra Jobsets*"
- :format '((name nil 25 t)
- (project nil 10 t)
- (scheduled nil 12 t)
- (succeeded nil 12 t)
- (failed nil 9 t)
- (total nil 10 t))
- :hint 'nix-hydra-jobset-list-hint)
-
-(let ((map nix-hydra-jobset-list-mode-map))
- (define-key map (kbd "B") 'nix-hydra-jobset-list-latest-builds))
-
-(defvar nix-hydra-jobset-list-default-hint
- '(("\\[nix-hydra-jobset-list-latest-builds]")
- " show latest builds for the current jobset;\n"))
-
-(defun nix-hydra-jobset-list-hint ()
- (bui-format-hints
- nix-hydra-jobset-list-default-hint
- (bui-default-hint)))
-
-(defun nix-hydra-jobset-list-latest-builds (number &rest args)
- "Display latest NUMBER of Hydra builds of the current jobset.
-Interactively, prompt for NUMBER. With prefix argument, prompt
-for all ARGS."
- (interactive
- (let ((entry (bui-list-current-entry)))
- (nix-hydra-build-latest-prompt-args
- :project (bui-entry-non-void-value entry 'project)
- :jobset (bui-entry-non-void-value entry 'name))))
- (apply #'nix-hydra-latest-builds number args))
-
-;;; Interactive commands
-
-;;;###autoload
-(defun nix-hydra-jobsets (project)
- "Display jobsets of PROJECT."
- (interactive (list (nix-hydra-read-project)))
- (nix-hydra-jobset-get-display 'project project))
-
-(provide 'nix-hydra-jobset)
-
-;;; nix-hydra-jobset.el ends here
diff --git a/misc/nix-hydra.el b/misc/nix-hydra.el
deleted file mode 100644
index 0578959a68..0000000000
--- a/misc/nix-hydra.el
+++ /dev/null
@@ -1,320 +0,0 @@
-;;; hydra.el --- Common code for interacting with Hydra -*- lexical-binding:
t -*-
-
-;; Copyright © 2015–2017 Alex Kost <alezost@gmail.com>
-
-;; This file is part of Emacs-Guix.
-
-;; Emacs-Guix 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.
-;;
-;; Emacs-Guix 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 Emacs-Guix. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This file provides some general code for 'list'/'info' interfaces for
-;; Hydra (Guix build farm).
-
-;;; Code:
-
-(require 'json)
-(require 'bui)
-(require 'nix)
-(require 'nix-utils)
-
-(nix-define-groups hydra)
-
-(defvar nix-hydra-job-regexp
- (concat ".*\\." (regexp-opt nix-system-types) "\\'")
- "Regexp matching a full name of Hydra job (including system).")
-
-(defun nix-hydra-job-name-specification (name version)
- "Return Hydra's job name specification by NAME and VERSION."
- (concat name "-" version))
-
-(defun nix-hydra-message (entries search-type &rest _)
- "Display a message after showing Hydra ENTRIES."
- ;; XXX Add more messages maybe.
- (when (null entries)
- (if (eq search-type 'fake)
- (message "The update is impossible due to lack of Hydra API.")
- (message "Hydra has returned no results."))))
-
-(defun nix-hydra-list-describe (&rest ids)
- "Describe 'hydra' entries with IDS (list of identifiers)."
- (bui-display-entries
- (bui-entries-by-ids (bui-current-entries) ids)
- (bui-current-entry-type) 'info
- ;; Hydra does not provide an API to receive builds/jobsets by
- ;; IDs/names, so we use a 'fake' search type.
- '(fake)
- 'add))
-
-;;; Readers
-
-(defvar nix-hydra-projects
- '("nixpkgs" "nix" "disnix" "gnu" "hydra" "libchop" "nixops" "nixos"
- "node2nix" "patchelf")
- "List of available Hydra projects.")
-
-(nix-define-readers
- :completions-var nix-hydra-projects
- :single-reader nix-hydra-read-project
- :single-prompt "Project: ")
-
-(nix-define-readers
- :require-match nil
- :single-reader nix-hydra-read-jobset
- :single-prompt "Jobset: ")
-
-(nix-define-readers
- :require-match nil
- :single-reader nix-hydra-read-job
- :single-prompt "Job: ")
-
-(nix-define-readers
- :completions-var nix-help-system-types
- :single-reader nix-hydra-read-system
- :single-prompt "System: ")
-
-;;; Defining URLs
-
-(defvar nix-hydra-url "https://hydra.nixos.org"
- "URL of the Hydra build farm.")
-
-(defun nix-hydra-url (&rest url-parts)
- "Return Hydra URL."
- (apply #'concat nix-hydra-url "/" url-parts))
-
-(defun nix-hydra-api-url (type args)
- "Return URL for receiving data using Hydra API.
-TYPE is the name of an allowed method.
-ARGS is alist of (KEY . VALUE) pairs.
-Skip ARG, if VALUE is nil or an empty string."
- (declare (indent 1))
- (let* ((fields (mapcar
- (lambda (arg)
- (pcase arg
- (`(,key . ,value)
- (unless (or (null value)
- (equal "" value))
- (concat (nix-hexify key) "="
- (nix-hexify value))))
- (_ (error "Wrong argument '%s'" arg))))
- args))
- (fields (mapconcat #'identity (delq nil fields) "&")))
- (nix-hydra-url "api/" type "?" fields)))
-
-;;; Receiving data from Hydra
-
-(defun nix-hydra-receive-data (url)
- "Return output received from URL and processed with `json-read'."
- (with-temp-buffer
- (url-insert-file-contents url)
- (goto-char (point-min))
- (let ((json-key-type 'symbol)
- (json-array-type 'list)
- (json-object-type 'alist))
- (json-read))))
-
-(defun nix-hydra-get-entries (entry-type search-type &rest args)
- "Receive ENTRY-TYPE entries from Hydra.
-SEARCH-TYPE is one of the types defined by `nix-hydra-define-interface'."
- (unless (eq search-type 'fake)
- (let* ((url (apply #'nix-hydra-search-url
- entry-type search-type args))
- (raw-entries (nix-hydra-receive-data url))
- (entries (apply #'nix-modify-objects
- raw-entries
- (nix-hydra-filters entry-type))))
- entries)))
-
-;;; Filters for processing raw entries
-
-(defun nix-hydra-filter-names (entry name-alist)
- "Replace names of ENTRY parameters using NAME-ALIST.
-Each element of NAME-ALIST is (OLD-NAME . NEW-NAME) pair."
- (mapcar (lambda (param)
- (pcase param
- (`(,name . ,val)
- (let ((new-name (bui-assq-value name-alist name)))
- (if new-name
- (cons new-name val)
- param)))))
- entry))
-
-(defun nix-hydra-filter-boolean (entry params)
- "Convert number PARAMS (0/1) of ENTRY to boolean values (nil/t)."
- (mapcar (lambda (param)
- (pcase param
- (`(,name . ,val)
- (if (memq name params)
- (cons name (nix-number->bool val))
- param))))
- entry))
-
-;;; Wrappers for defined variables
-
-(defun nix-hydra-symbol (&rest symbols)
- "Return `SYMBOLS-...' symbol."
- (apply #'nix-make-symbol 'hydra symbols))
-
-(defun nix-hydra-symbol-value (entry-type symbol)
- "Return SYMBOL's value for ENTRY-TYPE."
- (symbol-value (nix-hydra-symbol entry-type symbol)))
-
-(defun nix-hydra-search-url (entry-type search-type &rest args)
- "Return URL to receive ENTRY-TYPE entries from Hydra."
- (apply (bui-assq-value (nix-hydra-symbol-value
- entry-type 'search-types)
- search-type)
- args))
-
-(defun nix-hydra-filters (entry-type)
- "Return a list of filters for ENTRY-TYPE."
- (nix-hydra-symbol-value entry-type 'filters))
-
-;;; Interface definers
-
-(defmacro nix-hydra-define-entry-type (entry-type &rest args)
- "Define general code for ENTRY-TYPE.
-Remaining arguments (ARGS) should have a form [KEYWORD VALUE] ...
-
-Required keywords:
-
- - `:search-types' - default value of the generated
- `nix-hydra-ENTRY-TYPE-search-types' variable.
-
-Optional keywords:
-
- - `:filters' - default value of the generated
- `nix-hydra-ENTRY-TYPE-filters' variable.
-
- - `:filter-names' - if specified, a generated
- `nix-hydra-ENTRY-TYPE-filter-names' function for filtering
- these names will be added to `nix-hydra-ENTRY-TYPE-filters'
- variable.
-
- - `:filter-boolean-params' - if specified, a generated
- `nix-hydra-ENTRY-TYPE-filter-boolean' function for filtering
- these names will be added to `nix-hydra-ENTRY-TYPE-filters'
- variable.
-
-The rest keyword arguments are passed to
-`bui-define-entry-type' macro."
- (declare (indent 1))
- (let* ((entry-type-str (symbol-name entry-type))
- (full-entry-type (nix-hydra-symbol entry-type))
- (prefix (concat "nix-hydra-" entry-type-str))
- (search-types-var (intern (concat prefix "-search-types")))
- (filters-var (intern (concat prefix "-filters")))
- (get-fun (intern (concat prefix "-get-entries"))))
- (bui-plist-let args
- ((search-types-val :search-types)
- (filters-val :filters)
- (filter-names-val :filter-names)
- (filter-bool-val :filter-boolean-params))
- `(progn
- (defvar ,search-types-var ,search-types-val
- ,(format "\
-Alist of search types and according URL functions.
-Functions are used to define URL to receive '%s' entries."
- entry-type-str))
-
- (defvar ,filters-var ,filters-val
- ,(format "\
-List of filters for '%s' parameters.
-Each filter is a function that should take an entry as a single
-argument, and should also return an entry."
- entry-type-str))
-
- ,(when filter-bool-val
- (let ((filter-bool-var (intern (concat prefix
- "-filter-boolean-params")))
- (filter-bool-fun (intern (concat prefix
- "-filter-boolean"))))
- `(progn
- (defvar ,filter-bool-var ,filter-bool-val
- ,(format "\
-List of '%s' parameters that should be transformed to boolean values."
- entry-type-str))
-
- (defun ,filter-bool-fun (entry)
- ,(format "\
-Run `nix-hydra-filter-boolean' with `%S' variable."
- filter-bool-var)
- (nix-hydra-filter-boolean entry ,filter-bool-var))
-
- (setq ,filters-var
- (cons ',filter-bool-fun ,filters-var)))))
-
- ;; Do not move this clause up!: name filtering should be
- ;; performed before any other filtering, so this filter should
- ;; be consed after the boolean filter.
- ,(when filter-names-val
- (let* ((filter-names-var (intern (concat prefix
- "-filter-names")))
- (filter-names-fun filter-names-var))
- `(progn
- (defvar ,filter-names-var ,filter-names-val
- ,(format "\
-Alist of '%s' parameter names returned by Hydra API and names
-used internally by the elisp code of this package."
- entry-type-str))
-
- (defun ,filter-names-fun (entry)
- ,(format "\
-Run `nix-hydra-filter-names' with `%S' variable."
- filter-names-var)
- (nix-hydra-filter-names entry ,filter-names-var))
-
- (setq ,filters-var
- (cons ',filter-names-fun ,filters-var)))))
-
- (defun ,get-fun (search-type &rest args)
- ,(format "\
-Receive '%s' entries.
-See `nix-hydra-get-entries' for details."
- entry-type-str)
- (apply #'nix-hydra-get-entries
- ',entry-type search-type args))
-
- (bui-define-groups ,full-entry-type
- :parent-group nix-hydra
- :parent-faces-group nix-hydra-faces)
-
- (bui-define-entry-type ,full-entry-type
- :message-function 'nix-hydra-message
- ,@%foreign-args)))))
-
-(defmacro nix-hydra-define-interface (entry-type buffer-type &rest args)
- "Define BUFFER-TYPE interface for displaying ENTRY-TYPE hydra entries.
-
-This macro should be called after calling
-`nix-hydra-define-entry-type' with the same ENTRY-TYPE.
-
-ARGS are passed to `bui-define-interface' macro."
- (declare (indent 2))
- `(bui-define-interface ,(nix-hydra-symbol entry-type) ,buffer-type
- :get-entries-function ',(nix-hydra-symbol entry-type 'get-entries)
- ,@args))
-
-(defvar nix-hydra-font-lock-keywords
- (eval-when-compile
- `((,(rx "(" (group (or "nix-hydra-define-entry-type"
- "nix-hydra-define-interface"))
- symbol-end)
- . 1))))
-
-(font-lock-add-keywords 'emacs-lisp-mode nix-hydra-font-lock-keywords)
-
-(provide 'nix-hydra)
-
-;;; nix-hydra.el ends here
diff --git a/misc/nix-popup.el b/misc/nix-popup.el
deleted file mode 100644
index 2dd81b0ff6..0000000000
--- a/misc/nix-popup.el
+++ /dev/null
@@ -1,51 +0,0 @@
-;;; guix-popup.el --- Popup windows library
-
-;; Copyright © 2015 Alex Kost <alezost@gmail.com>
-
-;; This file is part of Emacs-Guix.
-
-;; Emacs-Guix 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.
-;;
-;; Emacs-Guix 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 Emacs-Guix. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This file provides `guix-define-popup' macro which is just an alias
-;; to `magit-define-popup'. According to the manual:
-;;
-;; (info "(magit-popup) Defining prefix and suffix commands")
-;;
-;; `magit-popup' library will eventually be superseded by a more general
-;; library.
-
-;;; Code:
-
-(require 'magit-popup)
-
-(defalias 'guix-define-popup 'magit-define-popup)
-
-(defvar guix-popup-font-lock-keywords
- (eval-when-compile
- `((,(rx "("
- (group "guix-define-popup")
- symbol-end
- (zero-or-more blank)
- (zero-or-one
- (group (one-or-more (or (syntax word) (syntax symbol))))))
- (1 font-lock-keyword-face)
- (2 font-lock-function-name-face nil t)))))
-
-(font-lock-add-keywords 'emacs-lisp-mode guix-popup-font-lock-keywords)
-
-(provide 'guix-popup)
-
-;;; guix-popup.el ends here
diff --git a/misc/nix-profiles.el b/misc/nix-profiles.el
deleted file mode 100644
index 700afd1221..0000000000
--- a/misc/nix-profiles.el
+++ /dev/null
@@ -1,202 +0,0 @@
-;;; nix-profiles.el --- Guix profiles
-
-;; Copyright © 2014–2017 Alex Kost <alezost@gmail.com>
-;; Copyright © 2015 Mathieu Lirzin <mthl@openmailbox.org>
-
-;; This file is part of Emacs-Guix.
-
-;; Emacs-Guix 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.
-;;
-;; Emacs-Guix 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 Emacs-Guix. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This file provides a general code related to location and contents of
-;; Guix profiles.
-
-;;; Code:
-
-(require 'nix-utils)
-
-(defvar nix-state-directory
- ("/nix/var/nix"))
-
-(defvar nix-user-profile
- (expand-file-name "~/.nix-profile")
- "User profile.")
-
-(defvar nix-system-profile
- (concat nix-state-directory "/profiles/system")
- "System profile.")
-
-(defvar nix-default-profile
- (concat nix-state-directory
- "/profiles/per-user/"
- (getenv "USER")
- "/profile")
- "Default Nix profile.")
-
-(defvar nix-current-profile nix-default-profile
- "Current Nix profile.
-It is used by various commands as the default working profile.")
-
-(defvar nix-system-profile-regexp
- (rx-to-string `(and string-start
- (or ,nix-system-profile
- "/run/booted-system"
- "/run/current-system"))
- t)
- "Regexp matching system profiles.")
-
-(defun nix-current-profile? (profile)
- "Return non-nil, if package PROFILE is `nix-current-profile'."
- (string= (nix-package-profile profile)
- nix-current-profile))
-
-(defun nix-system-profile? (profile)
- "Return non-nil, if PROFILE is a system one."
- (string-match-p nix-system-profile-regexp profile))
-
-(defun nix-assert-non-system-profile (profile)
- "Raise an error when PROFILE is a system one."
- (when (nix-system-profile? profile)
- (user-error "\
-Packages cannot be installed or removed to/from profile '%s'.
-Use 'guix system reconfigure' shell command to modify a system profile."
- profile)))
-
-(defun nix-generation-file (profile generation)
- "Return the file name of a PROFILE's GENERATION."
- (format "%s-%s-link" profile generation))
-
-(defun nix-profile (profile)
- "Return normalized file name of PROFILE.
-\"Normalized\" means the returned file name is expanded, does not
-have a trailing slash and it is `nix-default-profile' if PROFILE
-is `nix-user-profile'. `nix-user-profile' is special because
-it is actually a symlink to a real user profile, and the HOME
-directory does not contain profile generations."
- (let ((profile (directory-file-name (expand-file-name profile))))
- (if (string= profile nix-user-profile)
- nix-default-profile
- profile)))
-
-(defun nix-generation-profile (profile &optional generation)
- "Return file name of PROFILE or its GENERATION.
-The returned file name is the one that have generations in the
-same parent directory.
-
-If PROFILE matches `nix-system-profile-regexp', then it is
-considered to be a system profile. Unlike usual profiles, for a
-system profile, packages are placed in 'profile' sub-directory,
-so the returned file name does not contain this potential
-trailing '/profile'."
- (let* ((profile (nix-profile profile))
- (profile (if (and (nix-system-profile? profile)
- (string-match (rx (group (* any))
- "/profile" string-end)
- profile))
- (match-string 1 profile)
- profile)))
- (if generation
- (nix-generation-file profile generation)
- profile)))
-
-(defun nix-package-profile (profile &optional generation)
- "Return file name of PROFILE or its GENERATION.
-The returned file name is the one where packages are installed.
-
-If PROFILE is a system one (see `nix-generation-profile'), then
-the returned file name ends with '/profile'."
- (let* ((profile (nix-generation-profile profile))
- (profile (if generation
- (nix-generation-file profile generation)
- profile)))
- (if (nix-system-profile? profile)
- (expand-file-name "profile" profile)
- profile)))
-
-(defun nix-manifest-file (profile &optional generation)
- "Return manifest file name of PROFILE or its GENERATION."
- (expand-file-name "manifest"
- (nix-package-profile profile generation)))
-
-(defun nix-profile-number-of-packages (profile &optional generation)
- "Return the number of packages installed in PROFILE or its GENERATION."
- (let ((manifest (nix-manifest-file profile generation)))
- ;; Just count a number of sexps inside (packages ...) of manifest
- ;; file. It should be much faster than running the REPL and
- ;; calculating manifest entries on the Scheme side.
- (when (file-exists-p manifest)
- (with-temp-buffer
- (insert-file-contents-literally manifest)
- (goto-char (point-min))
- (re-search-forward "(packages" nil t)
- (down-list)
- (let ((num 0)
- (pos (point)))
- (while (setq pos (condition-case nil
- (scan-sexps pos 1)
- (error nil)))
- (setq num (1+ num)))
- num)))))
-
-(defun nix-profile-number-of-generations (profile)
- "Return the number of generations of PROFILE."
- (let* ((profile (nix-generation-profile profile))
- (dir-name (file-name-directory profile))
- (base-name (file-name-nondirectory profile))
- (regexp (concat (regexp-quote base-name)
- "-[[:digit:]]+-link")))
- (when (file-exists-p profile)
- (length (directory-files dir-name nil regexp 'no-sort)))))
-
-
-;;; Minibuffer readers
-
-(defun nix-read-profile (&optional default)
- "Prompt for profile and return it.
-Use DEFAULT as a start directory. If it is nil, use
-`nix-current-profile'."
- (nix-read-file-name "Profile: "
- (file-name-directory
- (or default nix-current-profile))))
-
-(defun nix-read-package-profile (&optional default)
- "Prompt for a package profile and return it.
-See `nix-read-profile' for the meaning of DEFAULT, and
-`nix-package-profile' for the meaning of package profile."
- (nix-package-profile (nix-read-profile default)))
-
-(defun nix-read-generation-profile (&optional default)
- "Prompt for a generation profile and return it.
-See `nix-read-profile' for the meaning of DEFAULT, and
-`nix-generation-profile' for the meaning of generation profile."
- (nix-generation-profile (nix-read-profile default)))
-
-
-;;;###autoload
-(defun nix-set-current-profile (file-name)
- "Set `nix-current-profile' to FILE-NAME.
-Interactively, prompt for FILE-NAME. With prefix, use
-`nix-default-profile'."
- (interactive
- (list (if current-prefix-arg
- nix-default-profile
- (nix-read-package-profile))))
- (setq nix-current-profile file-name)
- (message "Current profile has been set to '%s'."
- nix-current-profile))
-
-(provide 'nix-profiles)
-
-;;; nix-profiles.el ends here
diff --git a/misc/nix-smie.el b/misc/nix-smie.el
deleted file mode 100644
index cad6eb7077..0000000000
--- a/misc/nix-smie.el
+++ /dev/null
@@ -1,121 +0,0 @@
-;;; nix-mode+.el --- Major mode to edit Nix files
-
-;; Copyright (C) 2014 Jenny Cassou
-
-;; Author: Jenny Cassou <damien.cassou@gmail.com>
-;; Version: 0.1
-
-;; 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:
-
-;; Major mode to edit Nix files
-
-;;; Code:
-(require 'smie)
-
-(defvar nix+-smie-grammar
- (smie-prec2->grammar
- (smie-bnf->prec2
- '((id)
- (expr (exprfunction))
- (exprfunction ("{" formals "}" ":" exprfunction)
- (exprassert))
- (exprassert ("assert" expr ";" exprassert)
- (exprif))
- (exprif ("if" expr "then" expr "else" expr)
- (exprop))
- (exprop ("!" exprop)
- (exprop "==" exprop)
- (exprop "!=" exprop)
- (exprop "&&" exprop)
- (exprop "||" exprop)
- (exprop "->" exprop)
- (exprop "//" exprop)
- (exprop "~" exprop)
- (exprop "?" id)
- (exprapp))
- (exprapp (exprapp "." exprselect)
- (exprselect))
- (exprselect (exprsimple))
- (exprsimple (id)
- ("true")
- ("false")
- ("null")
- ("(" expr ")")
- ("{" binds "}")
- ("let" "{" binds "}")
- ("rec" "{" binds "}")
- ("[" exprselects "]"))
- (binds (binds ";" binds)
- (bind))
- (exprselects (expreselect))
- (bind (id "=" expr)
- ("inherit" exprp))
- (exprp ("(" expr ")"))
- (formals (formals "," formals)
- (formal))
- (formal (id)
- (id "?" expr)))
- '((assoc ";"))
- '((assoc ","))
- '((assoc "==")
- (assoc "!=")
- (assoc "&&")
- (assoc "||")
- (assoc "->")
- (assoc "//")
- (assoc "~")
- (assoc "?")
- (assoc "!")))))
-
-(defvar nix+-syntax-table
- (let ((table (make-syntax-table)))
- (modify-syntax-entry ?/ ". 14" table)
- (modify-syntax-entry ?* ". 23" table)
- (modify-syntax-entry ?# "< b" table)
- (modify-syntax-entry ?\n "> b" table)
- table)
- "Syntax table for Nix mode.")
-
-;;;###autoload
-(define-derived-mode nix-mode+ prog-mode "Nix"
- "Major mode for editing Nix expressions.
-
-The following commands may be useful:
-
- '\\[newline-and-indent]'
- Insert a newline and move the cursor to align with the previous
- non-empty line.
-
- '\\[fill-paragraph]'
- Refill a paragraph so that all lines are at most `fill-column'
- lines long. This should do the right thing for comments beginning
- with `#'. However, this command doesn't work properly yet if the
- comment is adjacent to code (i.e., no intervening empty lines).
- In that case, select the text to be refilled and use
- `\\[fill-region]' instead.
-
-The hook `nix-mode-hook' is run when Nix mode is started.
-
-\\{nix-mode-map}
-"
- (set-syntax-table nix+-syntax-table)
- (smie-setup nix+-smie-grammar #'ignore))
-
-(provide 'nix-mode+)
-
-;;; nix-mode+.el ends here
diff --git a/misc/nix-ui-messages.el b/misc/nix-ui-messages.el
deleted file mode 100644
index 93c80b46ee..0000000000
--- a/misc/nix-ui-messages.el
+++ /dev/null
@@ -1,260 +0,0 @@
-;;; nix-ui-messages.el --- Minibuffer messages for Guix package management
interface
-
-;; Copyright © 2014–2017 Alex Kost <alezost@gmail.com>
-
-;; This file is part of Emacs-Guix.
-
-;; Emacs-Guix 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.
-;;
-;; Emacs-Guix 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 Emacs-Guix. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This file provides `nix-result-message' function used to show a
-;; minibuffer message after displaying packages/generations in a
-;; list/info buffer.
-
-;;; Code:
-
-(require 'cl-lib)
-(require 'bui-utils)
-
-(defvar nix-messages
- `((package
- (id
- ,(lambda (_ entries ids)
- (nix-message-packages-by-id entries 'package ids)))
- (name
- ,(lambda (_ entries names)
- (nix-message-packages-by-name entries 'package names)))
- (license
- ,(lambda (_ entries licenses)
- (apply #'nix-message-packages-by-license
- entries 'package licenses)))
- (location
- ,(lambda (_ entries locations)
- (apply #'nix-message-packages-by-location
- entries 'package locations)))
- (from-file
- (0 "No package in file '%s'." val)
- (1 "Package from file '%s'." val))
- (from-os-file
- (0 "No packages in OS file '%s'." val)
- (1 "Package from OS file '%s'." val)
- (many "%d packages from OS file '%s'." count val))
- (regexp
- (0 "No packages matching '%s'." val)
- (1 "A single package matching '%s'." val)
- (many "%d packages matching '%s'." count val))
- (all-available
- (0 "No packages are available for some reason.")
- (1 "A single available package (that's strange).")
- (many "%d available packages." count))
- (newest-available
- (0 "No packages are available for some reason.")
- (1 "A single newest available package (that's strange).")
- (many "%d newest available packages." count))
- (installed
- (0 "No packages installed in profile '%s'." profile)
- (1 "A single package installed in profile '%s'." profile)
- (many "%d packages installed in profile '%s'." count profile))
- (obsolete
- (0 "No obsolete packages in profile '%s'." profile)
- (1 "A single obsolete package in profile '%s'." profile)
- (many "%d obsolete packages in profile '%s'." count profile)))
-
- (output
- (id
- ,(lambda (_ entries ids)
- (nix-message-packages-by-id entries 'output ids)))
- (name
- ,(lambda (_ entries names)
- (nix-message-packages-by-name entries 'output names)))
- (license
- ,(lambda (_ entries licenses)
- (apply #'nix-message-packages-by-license
- entries 'output licenses)))
- (location
- ,(lambda (_ entries locations)
- (apply #'nix-message-packages-by-location
- entries 'output locations)))
- (from-file
- (0 "No package in file '%s'." val)
- (1 "Package from file '%s'." val)
- (many "Package outputs from file '%s'." val))
- (from-os-file
- (0 "No packages in OS file '%s'." val)
- (1 "Package from OS file '%s'." val)
- (many "%d package outputs from OS file '%s'." count val))
- (regexp
- (0 "No package outputs matching '%s'." val)
- (1 "A single package output matching '%s'." val)
- (many "%d package outputs matching '%s'." count val))
- (all-available
- (0 "No package outputs are available for some reason.")
- (1 "A single available package output (that's strange).")
- (many "%d available package outputs." count))
- (newest-available
- (0 "No package outputs are available for some reason.")
- (1 "A single newest available package output (that's strange).")
- (many "%d newest available package outputs." count))
- (installed
- (0 "No package outputs installed in profile '%s'." profile)
- (1 "A single package output installed in profile '%s'." profile)
- (many "%d package outputs installed in profile '%s'." count profile))
- (obsolete
- (0 "No obsolete package outputs in profile '%s'." profile)
- (1 "A single obsolete package output in profile '%s'." profile)
- (many "%d obsolete package outputs in profile '%s'." count profile))
- (profile-diff
- nix-message-outputs-by-diff))
-
- (generation
- (id
- (0 "Generations not found.")
- (1 "")
- (many "%d generations." count))
- (last
- (0 "No generations in profile '%s'." profile)
- (1 "The last generation of profile '%s'." profile)
- (many "%d last generations of profile '%s'." count profile))
- (all
- (0 "No generations in profile '%s'." profile)
- (1 "A single generation available in profile '%s'." profile)
- (many "%d generations available in profile '%s'." count profile))
- (time
- nix-message-generations-by-time))))
-
-(defun nix-message-string-name (name)
- "Return a quoted name string."
- (concat "'" name "'"))
-
-(defun nix-message-string-entry-type (entry-type &optional plural)
- "Return a string denoting an ENTRY-TYPE."
- (cl-ecase entry-type
- (package
- (if plural "packages" "package"))
- (output
- (if plural "package outputs" "package output"))
- (generation
- (if plural "generations" "generation"))))
-
-(defun nix-message-string-entries (count entry-type)
- "Return a string denoting the COUNT of ENTRY-TYPE entries."
- (cl-case count
- (0 (concat "No "
- (nix-message-string-entry-type
- entry-type 'plural)))
- (1 (concat "A single "
- (nix-message-string-entry-type
- entry-type)))
- (t (format "%d %s"
- count
- (nix-message-string-entry-type
- entry-type 'plural)))))
-
-(defun nix-message-packages-by-id (entries entry-type ids)
- "Display a message for packages or outputs searched by IDS."
- (let* ((count (length entries))
- (str-beg (nix-message-string-entries count entry-type))
- (str-end (if (> count 1)
- (concat "with the following IDs: "
- (mapconcat #'bui-get-string ids ", "))
- (concat "with ID " (bui-get-string (car ids))))))
- (if (zerop count)
- (message (substitute-command-keys "%s %s.
-Most likely, Guix REPL was restarted, so IDs are not actual
-anymore, because they live only during the REPL process.
-
-Or it may be some package variant that cannot be handled by
-Emacs-Guix. For example, it may be so called 'canonical package'
-used by '%%base-packages' in an operating-system declaration.
-
-Try \"\\[nix-search-by-name]\" to find this package.")
- str-beg str-end)
- (message "%s %s." str-beg str-end))))
-
-(defun nix-message-packages-by-name (entries entry-type names)
- "Display a message for packages or outputs searched by NAMES."
- (let* ((count (length entries))
- (str-beg (nix-message-string-entries count entry-type))
- (str-end (if (cdr names)
- (concat "matching the following names: "
- (mapconcat #'nix-message-string-name
- names ", "))
- (concat "with name "
- (nix-message-string-name (car names))))))
- (message "%s %s." str-beg str-end)))
-
-(defun nix-message-packages-by-license (entries entry-type license)
- "Display a message for packages or outputs searched by LICENSE."
- (let* ((count (length entries))
- (str-beg (nix-message-string-entries count entry-type))
- (str-end (format "with license '%s'" license)))
- (message "%s %s." str-beg str-end)))
-
-(defun nix-message-packages-by-location (entries entry-type location)
- "Display a message for packages or outputs searched by LOCATION."
- (let* ((count (length entries))
- (str-beg (nix-message-string-entries count entry-type))
- (str-end (format "placed in '%s'" location)))
- (message "%s %s." str-beg str-end)))
-
-(defun nix-message-generations-by-time (profile entries times)
- "Display a message for generations searched by TIMES."
- (let* ((count (length entries))
- (str-beg (nix-message-string-entries count 'generation))
- (time-beg (bui-get-time-string (car times)))
- (time-end (bui-get-time-string (cadr times))))
- (message (concat "%s of profile '%s'\n"
- "matching time period '%s' - '%s'.")
- str-beg profile time-beg time-end)))
-
-(defun nix-message-outputs-by-diff (_ entries profiles)
- "Display a message for outputs searched by PROFILES difference."
- (let* ((count (length entries))
- (str-beg (nix-message-string-entries count 'output))
- (profile1 (car profiles))
- (profile2 (cadr profiles)))
- (cl-multiple-value-bind (new old str-action)
- (if (string-lessp profile2 profile1)
- (list profile1 profile2 "added to")
- (list profile2 profile1 "removed from"))
- (message "%s %s profile '%s' comparing with profile '%s'."
- str-beg str-action new old))))
-
-(defun nix-result-message (profile entries entry-type
- search-type search-vals)
- "Display an appropriate message after displaying ENTRIES."
- (let* ((type-spec (bui-assq-value nix-messages
- (if (eq entry-type 'system-generation)
- 'generation
- entry-type)
- search-type))
- (fun-or-count-spec (car type-spec)))
- (if (functionp fun-or-count-spec)
- (funcall fun-or-count-spec profile entries search-vals)
- (let* ((count (length entries))
- (count-key (if (> count 1) 'many count))
- (msg-spec (bui-assq-value type-spec count-key))
- (msg (car msg-spec))
- (args (cdr msg-spec)))
- (mapc (lambda (subst)
- (setq args (cl-substitute (cdr subst) (car subst) args)))
- `((count . ,count)
- (val . ,(car search-vals))
- (profile . ,profile)))
- (apply #'message msg args)))))
-
-(provide 'nix-ui-messages)
-
-;;; nix-ui-messages.el ends here
diff --git a/misc/nix-ui-profile.el b/misc/nix-ui-profile.el
deleted file mode 100644
index f0ff1c7a15..0000000000
--- a/misc/nix-ui-profile.el
+++ /dev/null
@@ -1,136 +0,0 @@
-;;; nix-ui-profile.el --- Interface for displaying profiles -*-
lexical-binding: t -*-
-
-;; Copyright © 2016–2017 Alex Kost <alezost@gmail.com>
-
-;; This file is part of Emacs-Guix.
-
-;; Emacs-Guix 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.
-;;
-;; Emacs-Guix 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 Emacs-Guix. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This file provides a 'list' interface for displaying Guix profiles
-;; with `nix-profiles' command.
-;;
-;; `nix-profiles' variable controls what profiles are displayed.
-
-;;; Code:
-
-(require 'dash)
-(require 'bui)
-(require 'nix)
-(require 'nix-profiles)
-(require 'nix-utils)
-
-(nix-define-groups profile)
-
-(defcustom nix-profiles
- (-filter #'file-exists-p
- (list nix-user-profile
- nix-system-profile))
- "List of profiles displayed by '\\[nix-profiles]' command."
- :type '(repeat file)
- :group 'nix-profile)
-
-(defun nix-profile->entry (profile)
- "Return 'nix-profile' entry by PROFILE file-name."
- `((id . ,profile)
- (profile . ,profile)
- (current . ,(nix-current-profile? profile))
- (number-of-packages . ,(nix-profile-number-of-packages
- profile))
- (number-of-generations . ,(nix-profile-number-of-generations
- profile))))
-
-(defun nix-profile-get-entries ()
- "Return 'nix-profile' entries."
- (mapcar #'nix-profile->entry nix-profiles))
-
-
-;;; Profile 'list'
-
-(bui-define-interface nix-profile list
- :mode-name "Profile-List"
- :buffer-name "*Nix Profiles*"
- :get-entries-function 'nix-profile-get-entries
- :format '((current nix-profile-list-get-current 10 t)
- (profile bui-list-get-file-name 40 t)
- (number-of-packages nil 11 bui-list-sort-numerically-2
- :right-align t)
- (number-of-generations nil 14 bui-list-sort-numerically-3
- :right-align t))
- :titles '((number-of-packages . "Packages")
- (number-of-generations . "Generations"))
- :hint 'nix-profile-list-hint
- :sort-key '(profile))
-
-(defun nix-profile-list-hint ()
- (bui-format-hints
- nix-profile-list-default-hint
- bui-list-sort-hint
- bui-common-hint))
-
-(defun nix-profile-list-current-profile ()
- "Return file name of the current profile."
- ;; (bui-entry-value (bui-list-current-entry) 'profile)
- ;; Just get the ID, as currently ID is the profile file name.
- (bui-list-current-id))
-
-(defun nix-profile-list-get-current (value &optional _)
- "Return string from VALUE showing whether this profile is current."
- (if value "(current)" ""))
-
-(defun nix-profile-list-set-current ()
- "Set `nix-current-profile' to the profile on the current line."
- (interactive)
- (nix-set-current-profile (nix-profile-list-current-profile))
- ;; Now updating "Current" column is needed. It can be done simply by
- ;; reverting the buffer, but it should be more effective to reset
- ;; 'current' parameter for all entries and to redisplay the buffer
- ;; instead.
- (let* ((current-id (bui-list-current-id))
- (new-entries (mapcar
- (lambda (entry)
- (let ((id (bui-entry-id entry)))
- (cons `(current . ,(equal id current-id))
- (--remove-first (eq (car it) 'current)
- entry))))
- (bui-current-entries))))
- (setf (bui-item-entries bui-item)
- new-entries))
- (bui-redisplay))
-
-
-;;; Interactive commands
-
-(defun nix-profiles-show ()
- "Display Nix profiles.
-Unlike `nix-profiles', this command always recreates
-`nix-profile-list-buffer-name' buffer."
- (interactive)
- (bui-list-get-display-entries 'nix-profile))
-
-;;;###autoload
-(defun nix-profiles ()
- "Display Nix profiles.
-Switch to the `nix-profile-list-buffer-name' buffer if it
-already exists.
-
-Modify `nix-profiles' variable to add more profiles."
- (interactive)
- (nix-switch-to-buffer-or-funcall
- nix-profile-list-buffer-name #'nix-profiles-show 'message))
-
-(provide 'nix-ui-profile)
-
-;;; nix-ui-profile.el ends here
diff --git a/misc/nix-utils.el b/misc/nix-utils.el
deleted file mode 100644
index 5b65b007eb..0000000000
--- a/misc/nix-utils.el
+++ /dev/null
@@ -1,479 +0,0 @@
-;;; nix-utils.el --- General utility functions -*- lexical-binding: t -*-
-
-;; Copyright © 2014–2017 Alex Kost <alezost@gmail.com>
-
-;; This file is part of Emacs-Guix.
-
-;; Emacs-Guix 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.
-;;
-;; Emacs-Guix 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 Emacs-Guix. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This file provides auxiliary general code for Emacs-Guix package.
-
-;;; Code:
-
-(require 'cl-lib)
-(require 'dash)
-(require 'bui-utils)
-
-(defun nix-concat-strings (strings separator &optional location)
- "Return new string by concatenating STRINGS with SEPARATOR.
-If LOCATION is a symbol `head', add another SEPARATOR to the
-beginning of the returned string; if `tail' - add SEPARATOR to
-the end of the string; if nil, do not add SEPARATOR; otherwise
-add both to the end and to the beginning."
- (let ((str (mapconcat #'identity strings separator)))
- (cond ((null location)
- str)
- ((eq location 'head)
- (concat separator str))
- ((eq location 'tail)
- (concat str separator))
- (t
- (concat separator str separator)))))
-
-(defun nix-hexify (value)
- "Convert VALUE to string and hexify it."
- (url-hexify-string (bui-get-string value)))
-
-(defun nix-number->bool (number)
- "Convert NUMBER to boolean value.
-Return nil, if NUMBER is 0; return t otherwise."
- (not (zerop number)))
-
-(defun nix-list-maybe (object)
- "If OBJECT is list, return it; otherwise return (list OBJECT)."
- (if (listp object)
- object
- (list object)))
-
-(defun nix-shell-quote-argument (argument)
- "Quote shell command ARGUMENT.
-This function is similar to `shell-quote-argument', but less strict."
- (if (equal argument "")
- "''"
- (replace-regexp-in-string
- "\n" "'\n'"
- (replace-regexp-in-string
- (rx (not (any alnum "-=,./\n"))) "\\\\\\&" argument))))
-
-(defun nix-command-symbol (&optional args)
- "Return symbol by concatenating 'nix' and ARGS (strings)."
- (intern (nix-concat-strings (cons "nix" args) "-")))
-
-(defun nix-command-string (&optional args)
- "Return 'guix ARGS ...' string with quoted shell arguments."
- (let ((args (mapcar #'nix-shell-quote-argument args)))
- (nix-concat-strings (cons "nix" args) " ")))
-
-(defun nix-copy-command-as-kill (args &optional no-message?)
- "Put 'guix ARGS ...' string into `kill-ring'.
-See also `nix-copy-as-kill'."
- (bui-copy-as-kill (nix-command-string args) no-message?))
-
-(defun nix-compose-buffer-name (base-name postfix)
- "Return buffer name by appending BASE-NAME and POSTFIX.
-
-In a simple case the result is:
-
- BASE-NAME: POSTFIX
-
-If BASE-NAME is wrapped by '*', then the result is:
-
- *BASE-NAME: POSTFIX*"
- (let ((re (rx string-start
- (group (? "*"))
- (group (*? any))
- (group (? "*"))
- string-end)))
- (or (string-match re base-name)
- (error "Unexpected error in defining buffer name"))
- (let ((first* (match-string 1 base-name))
- (name-body (match-string 2 base-name))
- (last* (match-string 3 base-name)))
- ;; Handle the case when buffer name is wrapped by '*'.
- (if (and (string= "*" first*)
- (string= "*" last*))
- (concat "*" name-body ": " postfix "*")
- (concat base-name ": " postfix)))))
-
-(defun nix-completing-read (prompt table &optional predicate
- require-match initial-input
- hist def inherit-input-method)
- "Same as `completing-read' but return nil instead of an empty string."
- (let ((res (completing-read prompt table predicate
- require-match initial-input
- hist def inherit-input-method)))
- (unless (string= "" res) res)))
-
-(defun nix-completing-read-multiple (prompt table &optional predicate
- require-match initial-input
- hist def inherit-input-method)
- "Same as `completing-read-multiple' but remove duplicates in result."
- (cl-remove-duplicates
- (completing-read-multiple prompt table predicate
- require-match initial-input
- hist def inherit-input-method)
- :test #'string=))
-
-(declare-function org-read-date "org" t)
-
-(defun nix-read-date (prompt)
- "Prompt for a date or time using `org-read-date'.
-Return time value."
- (require 'org)
- (org-read-date nil t nil prompt))
-
-(declare-function pcmpl-unix-user-names "pcmpl-unix")
-
-(defun nix-read-user-name (&optional prompt initial-input)
- "Prompt for a user name using completions."
- (require 'pcmpl-unix)
- (nix-completing-read (or prompt "User name: ")
- (pcmpl-unix-user-names)
- nil nil initial-input))
-
-(defun nix-read-file-name (prompt &optional dir default-filename
- mustmatch initial predicate)
- "Read file name.
-This function is similar to `read-file-name' except it also
-expands the file name."
- (expand-file-name (read-file-name prompt dir default-filename
- mustmatch initial predicate)))
-
-(defcustom nix-find-file-function #'find-file
- "Function used to find a file.
-This function is called by `nix-find-file' with a file name as a
-single argument."
- :type '(choice (function-item find-file)
- (function-item org-open-file)
- (function :tag "Other function"))
- :group 'nix)
-
-(defun nix-find-file (file)
- "Find FILE (using `nix-find-file-function') if it exists."
- (if (file-exists-p file)
- (funcall nix-find-file-function file)
- (message "File '%s' does not exist." file)))
-
-(defvar url-handler-regexp)
-
-(defun nix-find-file-or-url (file-or-url)
- "Find FILE-OR-URL."
- (require 'url-handlers)
- (let ((file-name-handler-alist
- (cons (cons url-handler-regexp 'url-file-handler)
- file-name-handler-alist)))
- (find-file file-or-url)))
-
-(defun nix-switch-to-buffer-or-funcall (buffer-or-name function
- &optional message)
- "Switch to BUFFER-OR-NAME if it exists.
-If BUFFER-OR-NAME does not exist, call FUNCTION without
-arguments, also display a message if MESSAGE is specified (it can
-be either nil, a string, or another value for a default
-message)."
- (let ((buffer (get-buffer buffer-or-name)))
- (if buffer
- (progn
- (switch-to-buffer buffer)
- (when message
- (message (if (stringp message)
- message
- (substitute-command-keys "\
-Press '\\[revert-buffer]' to update this buffer.")))))
- (funcall function))))
-
-(defun nix-pretty-print-buffer (buffer-or-name)
- "Pretty-print the contents of BUFFER-OR-NAME."
- (with-current-buffer buffer-or-name
- (goto-char (point-max))
- (let (sexp-beg)
- (while (setq sexp-beg (scan-sexps (point) -1))
- (goto-char sexp-beg)
- (delete-horizontal-space t)
- (unless (= (point) (line-beginning-position))
- (insert "\n"))
- (indent-pp-sexp 'pp)))))
-
-(defun nix-pretty-print-file (file-name &optional mode)
- "Show FILE-NAME contents in MODE and pretty-print it.
-If MODE is nil, use `scheme-mode'.
-Put the point in the beginning of buffer.
-Return buffer with the prettified contents."
- (let* ((base-name (file-name-nondirectory file-name))
- (buffer (generate-new-buffer base-name)))
- (with-current-buffer buffer
- (insert-file-contents file-name)
- (goto-char (point-min))
- (funcall (or mode 'scheme-mode)))
- (nix-pretty-print-buffer buffer)
- buffer))
-
-(defmacro nix-while-search (regexp &rest body)
- "Evaluate BODY after each search for REGEXP in the current buffer."
- (declare (indent 1) (debug t))
- `(save-excursion
- (goto-char (point-min))
- (while (re-search-forward ,regexp nil t)
- ,@body)))
-
-(defmacro nix-while-null (&rest body)
- "Evaluate BODY until its result becomes non-nil."
- (declare (indent 0) (debug t))
- (let ((result-var (make-symbol "result")))
- `(let (,result-var)
- (while (null ,result-var)
- (setq ,result-var ,@body))
- ,result-var)))
-
-(defun nix-modify (object &rest modifiers)
- "Apply MODIFIERS to OBJECT.
-OBJECT is passed as an argument to the first function from
-MODIFIERS list, the returned result is passed to the second
-function from the list and so on. Return result of the last
-modifier call."
- (if (null modifiers)
- object
- (apply #'nix-modify
- (funcall (car modifiers) object)
- (cdr modifiers))))
-
-(defun nix-modify-objects (objects &rest modifiers)
- "Apply MODIFIERS to each object from a list of OBJECTS.
-See `nix-modify' for details."
- (--map (apply #'nix-modify it modifiers)
- objects))
-
-(defun nix-make-symbol (&rest symbols)
- "Return `nix-SYMBOLS-...' symbol."
- (apply #'bui-make-symbol 'nix symbols))
-
-(defmacro nix-define-groups (name &rest args)
- "Define `nix-NAME' and `nix-NAME-faces' customization groups.
-See `bui-define-groups' for details."
- (declare (indent 1))
- `(bui-define-groups ,(bui-make-symbol 'nix name)
- :parent-group nix
- :parent-faces-group nix-faces
- ,@args))
-
-;;; Temporary file names
-
-(defvar nix-temporary-directory nil
- "Directory for writing temporary Nix files.
-If nil, it will be set when it will be used the first time.
-This directory will be deleted on Emacs exit.")
-
-(defun nix-temporary-directory ()
- "Return `nix-temporary-directory' (set it if needed)."
- (or (and nix-temporary-directory
- (file-exists-p nix-temporary-directory)
- nix-temporary-directory)
- (setq nix-temporary-directory
- (make-temp-file "emacs-nix-" 'dir))))
-
-(defun nix-temporary-file-name (name &optional suffix)
- "Return file NAME from `nix-temporary-directory'.
-If such file name already exists, or if SUFFIX string is
-specified, make the returned name unique."
- (let* ((file-name (expand-file-name name (nix-temporary-directory)))
- (file-name (if suffix
- (concat (make-temp-name file-name) suffix)
- file-name)))
- (if (file-exists-p file-name)
- (nix-temporary-file-name name (or suffix ""))
- file-name)))
-
-(defun nix-delete-temporary-directory ()
- "Delete `nix-temporary-directory' if it exists."
- (when (and nix-temporary-directory
- (file-exists-p nix-temporary-directory))
- (condition-case nil
- (delete-directory (nix-temporary-directory) 'recursive)
- (error
- (message "Failed to delete temporary Nix directory: %s"
- nix-temporary-directory)))))
-
-(add-hook 'kill-emacs-hook 'nix-delete-temporary-directory)
-
-;;; Fontification
-
-(defvar nix-font-lock-flush-function
- (if (fboundp 'font-lock-flush)
- #'font-lock-flush ; appeared in Emacs 25.1
- #'jit-lock-refontify)
- "Function used to refontify a buffer.
-
-This function is called without arguments after
-enabling/disabling `nix-prettify-mode',
-`nix-build-log-minor-mode' and `nix-devel-mode'.
-
-If nil, do not perform refontifying.")
-
-(defun nix-font-lock-flush ()
- "Refontify the current buffer using `nix-font-lock-flush-function'."
- (when nix-font-lock-flush-function
- (if (fboundp nix-font-lock-flush-function)
- (funcall nix-font-lock-flush-function)
- (message "Unknown function: %S" nix-font-lock-flush-function))))
-
-;;; Diff
-
-(defvar nix-diff-switches "-u"
- "A string or list of strings specifying switches to be passed to diff.")
-
-(defun nix-diff (old new &optional switches no-async)
- "Same as `diff', but use `nix-diff-switches' as default."
- (diff old new (or switches nix-diff-switches) no-async))
-
-;;; Completing readers definers
-
-(defmacro nix-define-reader (name read-fun completions prompt
- &optional require-match default)
- "Define NAME function to read from minibuffer.
-READ-FUN may be `completing-read', `completing-read-multiple' or
-another function with the same arguments."
- (declare (indent 1))
- `(defun ,name (&optional prompt initial-contents)
- (,read-fun (or prompt ,prompt)
- ,completions nil ,require-match
- initial-contents nil ,default)))
-
-(defmacro nix-define-readers (&rest args)
- "Define reader functions.
-
-ARGS should have a form [KEYWORD VALUE] ... The following
-keywords are available:
-
- - `completions-var' - variable used to get completions.
-
- - `completions-getter' - function used to get completions.
-
- - `require-match' - if the match is required (see
- `completing-read' for details); default is t.
-
- - `default' - default value.
-
- - `single-reader', `single-prompt' - name of a function to read
- a single value, and a prompt for it.
-
- - `multiple-reader', `multiple-prompt' - name of a function to
- read multiple values, and a prompt for it.
-
- - `multiple-separator' - if specified, another
- `<multiple-reader-name>-string' function returning a string
- of multiple values separated the specified separator will be
- defined."
- (bui-plist-let args
- ((completions-var :completions-var)
- (completions-getter :completions-getter)
- (require-match :require-match t)
- (default :default)
- (single-reader :single-reader)
- (single-prompt :single-prompt)
- (multiple-reader :multiple-reader)
- (multiple-prompt :multiple-prompt)
- (multiple-separator :multiple-separator))
- (let ((completions
- (cond ((and completions-var completions-getter)
- `(or ,completions-var
- (setq ,completions-var
- (funcall ',completions-getter))))
- (completions-var
- completions-var)
- (completions-getter
- `(funcall ',completions-getter)))))
- `(progn
- ,(when (and completions-var
- (not (boundp completions-var)))
- `(defvar ,completions-var nil))
-
- ,(when single-reader
- `(nix-define-reader ,single-reader
- nix-completing-read ,completions ,single-prompt
- ,require-match ,default))
-
- ,(when multiple-reader
- `(nix-define-reader ,multiple-reader
- completing-read-multiple ,completions ,multiple-prompt
- ,require-match ,default))
-
- ,(when (and multiple-reader multiple-separator)
- (let ((name (intern (concat (symbol-name multiple-reader)
- "-string"))))
- `(defun ,name (&optional prompt initial-contents)
- (nix-concat-strings
- (,multiple-reader prompt initial-contents)
- ,multiple-separator))))))))
-
-;;; Memoizing
-
-(defun nix-memoize (function)
- "Return a memoized version of FUNCTION."
- (let ((cache (make-hash-table :test 'equal)))
- (lambda (&rest args)
- (let ((result (gethash args cache 'not-found)))
- (if (eq result 'not-found)
- (let ((result (apply function args)))
- (puthash args result cache)
- result)
- result)))))
-
-(defmacro nix-memoized-defun (name arglist docstring &rest body)
- "Define a memoized function NAME.
-See `defun' for the meaning of arguments."
- (declare (doc-string 3) (indent 2))
- `(defalias ',name
- (nix-memoize (lambda ,arglist ,@body))
- ;; Add '(name args ...)' string with real arglist to the docstring,
- ;; because *Help* will display '(name &rest ARGS)' for a defined
- ;; function (since `nix-memoize' returns a lambda with '(&rest
- ;; args)').
- ,(format "(%S %s)\n\n%s"
- name
- (mapconcat #'symbol-name arglist " ")
- docstring)))
-
-(defmacro nix-memoized-defalias (symbol definition &optional docstring)
- "Set SYMBOL's function definition to memoized version of DEFINITION."
- (declare (doc-string 3) (indent 1))
- `(defalias ',symbol
- (nix-memoize #',definition)
- ,(or docstring
- (format "Memoized version of `%S'." definition))))
-
-(defvar nix-utils-font-lock-keywords
- (eval-when-compile
- `((,(rx "(" (group (or "nix-define-reader"
- "nix-define-readers"
- "nix-define-groups"
- "nix-while-null"
- "nix-while-search"))
- symbol-end)
- . 1)
- (,(rx "("
- (group "nix-memoized-" (or "defun" "defalias"))
- symbol-end
- (zero-or-more blank)
- (zero-or-one
- (group (one-or-more (or (syntax word) (syntax symbol))))))
- (1 font-lock-keyword-face)
- (2 font-lock-function-name-face nil t)))))
-
-(font-lock-add-keywords 'emacs-lisp-mode nix-utils-font-lock-keywords)
-
-(provide 'nix-utils)
-
-;;; nix-utils.el ends here
- [nongnu] elpa/nix-mode b12aeada41 334/500: Don’t use smie-indent-line when nix-mode-use-smie is nil, (continued)
- [nongnu] elpa/nix-mode b12aeada41 334/500: Don’t use smie-indent-line when nix-mode-use-smie is nil, ELPA Syncer, 2022/01/29
- [nongnu] elpa/nix-mode e5abdd41e4 352/500: add json-mode dependency, ELPA Syncer, 2022/01/29
- [nongnu] elpa/nix-mode ab49f46754 027/500: Redo keymap, ELPA Syncer, 2022/01/29
- [nongnu] elpa/nix-mode 81e8c3dea6 032/500: cleanup formatting, ELPA Syncer, 2022/01/29
- [nongnu] elpa/nix-mode 09d40e95e2 037/500: Skip braces with hanging indents, ELPA Syncer, 2022/01/29
- [nongnu] elpa/nix-mode f29d9865e4 055/500: Fixup hanging indents., ELPA Syncer, 2022/01/29
- [nongnu] elpa/nix-mode 55ed31214a 053/500: Add "in" for closing., ELPA Syncer, 2022/01/29
- [nongnu] elpa/nix-mode ec0546a41d 051/500: Tweak hanging indent, ELPA Syncer, 2022/01/29
- [nongnu] elpa/nix-mode 0f94476b7e 117/500: nix-syntax-match-antiquote: Handle case where point has the property, ELPA Syncer, 2022/01/29
- [nongnu] elpa/nix-mode 183d4212e2 134/500: Fix fontification bug, ELPA Syncer, 2022/01/29
- [nongnu] elpa/nix-mode 42632ee471 168/500: Remove misc/ folder,
ELPA Syncer <=
- [nongnu] elpa/nix-mode 93bfb4428d 182/500: Add nix-build function., ELPA Syncer, 2022/01/29
- [nongnu] elpa/nix-mode 9d4eb7d199 274/500: Make find-file-at-point support <nixpkgs>, ELPA Syncer, 2022/01/29
- [nongnu] elpa/nix-mode 54f28871a3 376/500: Fix issue #70, ELPA Syncer, 2022/01/29
- [nongnu] elpa/nix-mode ef64fa293b 388/500: Set nix-version to nil, ELPA Syncer, 2022/01/29
- [nongnu] elpa/nix-mode 218c885d78 414/500: Merge pull request #116 from taku0/update-install-nix-action, ELPA Syncer, 2022/01/29
- [nongnu] elpa/nix-mode d6e895969b 400/500: Set the 'LD_LIBRARY_PATH' environment variable for mkShell, ELPA Syncer, 2022/01/29
- [nongnu] elpa/nix-mode c041115673 301/500: Fix failing test., ELPA Syncer, 2022/01/29
- [nongnu] elpa/nix-mode 01c53b7ff1 289/500: Merge pull request #66 from etu/add-travis-badge, ELPA Syncer, 2022/01/29
- [nongnu] elpa/nix-mode 1d31733ef8 311/500: Add more function documentation, ELPA Syncer, 2022/01/29
- [nongnu] elpa/nix-mode be06d675b8 315/500: Run tests for nix-indent-line and smie-indent-line, ELPA Syncer, 2022/01/29