;;; nix.el -- run nix commands in Emacs -*- lexical-binding: t -*-
|
|
|
|
;; Author: Matthew Bauer <mjbauer95@gmail.com>
|
|
;; Homepage: https://github.com/NixOS/nix-mode
|
|
;; Keywords: nix
|
|
|
|
;; This file is NOT part of GNU Emacs.
|
|
|
|
;;; Commentary:
|
|
|
|
;; To use this just run:
|
|
|
|
;; M-x RET nix-shell RET
|
|
|
|
;; This will give you some
|
|
|
|
;;; Code:
|
|
|
|
(require 'pcomplete)
|
|
|
|
(defgroup nix nil
|
|
"Nix-related customizations"
|
|
:group 'languages)
|
|
|
|
(defcustom nix-executable "nix"
|
|
"Nix executable location."
|
|
:group 'nix
|
|
:type 'string)
|
|
|
|
(defcustom nix-build-executable "nix-build"
|
|
"Nix-build executable location."
|
|
:group 'nix
|
|
:type 'string)
|
|
|
|
(defcustom nix-instantiate-executable "nix-instantiate"
|
|
"Nix executable location."
|
|
:group 'nix
|
|
:type 'string)
|
|
|
|
(defcustom nix-store-executable "nix-store"
|
|
"Nix executable location."
|
|
:group 'nix
|
|
:type 'string)
|
|
|
|
(defcustom nix-shell-executable "nix-shell"
|
|
"Location of ‘nix-shell’ executable."
|
|
:group 'nix
|
|
:type 'string)
|
|
|
|
(defcustom nix-store-dir "/nix/store"
|
|
"Nix store directory."
|
|
:group 'nix
|
|
:type 'string)
|
|
|
|
(defcustom nix-state-dir "/nix/var"
|
|
"Nix store directory."
|
|
:group 'nix
|
|
:type 'string)
|
|
|
|
(defun nix-system ()
|
|
"Get the current system tuple."
|
|
(let ((stdout (generate-new-buffer "nix eval"))
|
|
result)
|
|
(call-process nix-executable nil (list stdout nil) nil
|
|
"eval" "--raw" "(builtins.currentSystem)")
|
|
(with-current-buffer stdout (setq result (buffer-string)))
|
|
(kill-buffer stdout)
|
|
result))
|
|
|
|
(defvar nix-commands
|
|
'("add-to-store"
|
|
"build"
|
|
"cat-nar"
|
|
"cat-store"
|
|
"copy"
|
|
"copy-sigs"
|
|
"dump-path"
|
|
"edit"
|
|
"eval"
|
|
"hash-file"
|
|
"hash-path"
|
|
"log"
|
|
"ls-nar"
|
|
"ls-store"
|
|
"optimise-store"
|
|
"path-info"
|
|
"ping-store"
|
|
"repl"
|
|
"run"
|
|
"search"
|
|
"show-config"
|
|
"show-derivation"
|
|
"sign-paths"
|
|
"to-base16"
|
|
"to-base32"
|
|
"to-base64"
|
|
"upgrade-nix"
|
|
"verify"
|
|
"why-depends"))
|
|
|
|
(defvar nix-toplevel-options
|
|
'("-v"
|
|
"--verbose"
|
|
"-h"
|
|
"--help"
|
|
"--debug"
|
|
"--help-config"
|
|
"--option"
|
|
"--version"))
|
|
|
|
(defvar nix-config-options
|
|
'("allowed-uris"
|
|
"allow-import-from-derivation"
|
|
"allow-new-priveleges"
|
|
"allowed-users"
|
|
"auto-optimise-store"
|
|
"builders"
|
|
"builders-use-substitutes"
|
|
"build-users-group"
|
|
"compress-build-log"
|
|
"connect-timeout"
|
|
"cores"
|
|
"extra-sandbox-paths"
|
|
"extra-substituters"
|
|
"fallback"
|
|
"fsync-metadata"
|
|
"hashed-mirrors"
|
|
"http-connections"
|
|
"keep-build-log"
|
|
"keep-derivations"
|
|
"keep-env-derivations"
|
|
"keep-outputs"
|
|
"max-build-log-size"
|
|
"max-jobs"
|
|
"max-silent-time"
|
|
"netrc-file"
|
|
"plugin-files"
|
|
"pre-build-hook"
|
|
"repeat"
|
|
"require-sigs"
|
|
"restrict-eval"
|
|
"sandbox"
|
|
"sandbox-dev-shm-size"
|
|
"sandbox-paths"
|
|
"secret-key-files"
|
|
"show-trace"
|
|
"substitute"
|
|
"substituters"
|
|
"system"
|
|
"timeout"
|
|
"trusted-public-keys"
|
|
"trusted-subtituters"
|
|
"trusted-users"))
|
|
|
|
(defun nix--pcomplete-flags (options)
|
|
"Complete flags to the Nix command.
|
|
OPTIONS a list of options to accept."
|
|
(while (pcomplete-match "^-" 0)
|
|
(pcomplete-here options)
|
|
(let ((last-arg (nth (1- pcomplete-index) pcomplete-args)))
|
|
(cond
|
|
((string= "--option" last-arg)
|
|
(pcomplete-here nix-config-options)
|
|
(pcomplete-here))
|
|
((or (string= "-f" last-arg) (string= "--file" last-arg))
|
|
(pcomplete-here (pcomplete-entries nil 'file-exists-p)))
|
|
((or (string= "--arg" last-arg) (string= "--argstr" last-arg))
|
|
(pcomplete-here)
|
|
(pcomplete-here))
|
|
((or (string= "-I" last-arg) (string= "--include" last-arg))
|
|
(pcomplete-here (pcomplete-entries nil 'file-exists-p)))
|
|
((or (string= "-k" last-arg) (string= "--keep" last-arg))
|
|
(pcomplete-here))
|
|
((or (string= "-u" last-arg) (string= "--unset" last-arg))
|
|
(pcomplete-here))
|
|
((or (string= "-s" last-arg) (string= "--substituter" last-arg))
|
|
(pcomplete-here))))))
|
|
|
|
;;;###autoload
|
|
(defun pcomplete/nix ()
|
|
"Completion for the nix command."
|
|
(nix--pcomplete-flags nix-toplevel-options)
|
|
(pcomplete-here nix-commands)
|
|
(pcase (nth (1- pcomplete-index) pcomplete-args)
|
|
("run"
|
|
(nix--pcomplete-flags
|
|
(append nix-toplevel-options '("--arg" "--argstr" "-c" "--command"
|
|
"-f" "--file" "-i" "-I" "--include"
|
|
"-k" "--keep" "-u" "--unset"))))
|
|
("build"
|
|
(nix--pcomplete-flags
|
|
(append nix-toplevel-options '("--arg" "--argstr" "--dry-run"
|
|
"-f" "--file" "-I" "--include"
|
|
"--no-link" "-o" "--out-link"))))
|
|
("add-to-store"
|
|
(nix--pcomplete-flags
|
|
(append nix-toplevel-options '("--dry-run" "-n" "--name"))))
|
|
("copy"
|
|
(nix--pcomplete-flags
|
|
(append nix-toplevel-options '("--all" "--arg" "--argstr"
|
|
"-f" "--file" "--from"
|
|
"-I" "--include" "--no-check-sigs"
|
|
"--no-recursive" "-s" "--substitute"
|
|
"--to"))))
|
|
("copy-sigs"
|
|
(nix--pcomplete-flags
|
|
(append nix-toplevel-options '("--all" "--arg" "--argstr"
|
|
"-f" "--file" "-I" "--include"
|
|
"-r" "--recursive" "-s" "--substituter"))))
|
|
("dump-path"
|
|
(nix--pcomplete-flags
|
|
(append nix-toplevel-options '("--arg" "--argstr"
|
|
"-f" "--file" "-I" "--include"))))
|
|
("edit"
|
|
(nix--pcomplete-flags
|
|
(append nix-toplevel-options '("--arg" "--argstr"
|
|
"-f" "--file" "-I" "--include"))))
|
|
("eval"
|
|
(nix--pcomplete-flags
|
|
(append nix-toplevel-options '("--arg" "--argstr"
|
|
"-f" "--file" "-I" "--include"
|
|
"--json" "--raw"))))
|
|
("hash-file"
|
|
(nix--pcomplete-flags
|
|
(append nix-toplevel-options '("--base16" "--base32"
|
|
"--base64" "--type"))))
|
|
("hash-path"
|
|
(nix--pcomplete-flags
|
|
(append nix-toplevel-options '("--base16" "--base32"
|
|
"--base64" "--type"))))
|
|
("log"
|
|
(nix--pcomplete-flags
|
|
(append nix-toplevel-options '("--arg" "--argstr"
|
|
"-f" "--file" "-I" "--include"
|
|
"--json" "--raw"))))
|
|
("ls-nar"
|
|
(nix--pcomplete-flags
|
|
(append nix-toplevel-options '("-d" "--directory"
|
|
"--json" "-l" "--long"
|
|
"-R" "--recursive"))))
|
|
("ls-store"
|
|
(nix--pcomplete-flags
|
|
(append nix-toplevel-options '("-d" "--directory"
|
|
"--json" "-l" "--long"
|
|
"-R" "--recursive"))))
|
|
("repl"
|
|
(nix--pcomplete-flags
|
|
(append nix-toplevel-options '("--arg" "--argstr"
|
|
"-I" "--include"))))
|
|
("search"
|
|
(nix--pcomplete-flags
|
|
(append nix-toplevel-options '("--arg" "--argstr"
|
|
"-f" "--file"
|
|
"-I" "--include"
|
|
"--json" "--no-cache"
|
|
"-u" "--update-cache"))))
|
|
("show-config"
|
|
(nix--pcomplete-flags
|
|
(append nix-toplevel-options '("--json"))))
|
|
("show-derivation"
|
|
(nix--pcomplete-flags
|
|
(append nix-toplevel-options '("--arg" "--argstr"
|
|
"-f" "--file"
|
|
"-I" "--include"
|
|
"-r" "--recursive"))))
|
|
("sign-paths"
|
|
(nix--pcomplete-flags
|
|
(append nix-toplevel-options '("--all" "--arg" "--argstr"
|
|
"-f" "--file" "-I" "--include"
|
|
"-k" "--key-file" "-r" "--recursive"))))
|
|
("upgrade-nix"
|
|
(nix--pcomplete-flags
|
|
(append nix-toplevel-options '("-p" "--profile"))))
|
|
("verify"
|
|
(nix--pcomplete-flags
|
|
(append nix-toplevel-options '("--all" "--arg" "--argstr"
|
|
"-f" "--file" "-I" "--include"
|
|
"--no-contents" "--no-trust"
|
|
"-r" "--recursive" "-n" "--sigs-needed"
|
|
"-s" "--substuter"))))
|
|
("why-depends"
|
|
(nix--pcomplete-flags
|
|
(append nix-toplevel-options '("-a" "--all" "--arg" "--argstr"
|
|
"-f" "--file" "-I" "--include"))))
|
|
(_ (nix--pcomplete-flags nix-toplevel-options)))
|
|
(pcomplete-here (pcomplete-entries)))
|
|
|
|
(provide 'nix)
|
|
;;; nix.el ends here
|