emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[nongnu] elpa/nix-mode df4ba688a7 435/500: Merge branch 'nix-search-upda


From: ELPA Syncer
Subject: [nongnu] elpa/nix-mode df4ba688a7 435/500: Merge branch 'nix-search-updates'
Date: Sat, 29 Jan 2022 08:27:54 -0500 (EST)

branch: elpa/nix-mode
commit df4ba688a7cf0f59cc0292f92bd5bf0af2398b4d
Merge: 75d2111891 37f641a913
Author: Matthew Bauer <mjbauer95@gmail.com>
Commit: Matthew Bauer <mjbauer95@gmail.com>

    Merge branch 'nix-search-updates'
---
 .dir-locals.el |   4 +++
 flake.nix      |   1 +
 nix-search.el  | 104 ++++++++++++++++++++++++++++++++++++++++++++++++---------
 nix-shell.el   |  13 ++++++++
 nix.el         |  26 ++++++++++++++-
 5 files changed, 132 insertions(+), 16 deletions(-)

diff --git a/.dir-locals.el b/.dir-locals.el
new file mode 100644
index 0000000000..8f5e85227a
--- /dev/null
+++ b/.dir-locals.el
@@ -0,0 +1,4 @@
+;;; Directory Local Variables
+;;; For more information see (info "(emacs) Directory Variables")
+
+((emacs-lisp-mode . ((indent-tabs-mode . t))))
diff --git a/flake.nix b/flake.nix
index 3688d9fdff..592fd01a03 100644
--- a/flake.nix
+++ b/flake.nix
@@ -23,6 +23,7 @@
           echo Run make run to get vanilla emacs with nix-mode loaded.
         '';
         doCheck = true;
+        meta.description = "An emacs major mode for editing Nix expressions";
       };
     });
 
diff --git a/nix-search.el b/nix-search.el
index ccd0f03645..38116bf678 100644
--- a/nix-search.el
+++ b/nix-search.el
@@ -17,36 +17,110 @@
 (require 'json)
 
 ;;;###autoload
-(defun nix-search--search (search file &optional no-cache)
+(defun nix-search--search (search file &optional no-cache use-flakes)
   (with-temp-buffer
-    (call-process nix-executable nil (list t nil) nil
-      "search" "--json" (if no-cache "--no-cache" "") "--file" file search)
+    (if use-flakes
+       (call-process nix-executable nil (list t nil) nil
+                     "search" "--json" file (if (string= search "") "." 
search))
+      (call-process nix-executable nil (list t nil) nil
+                   "search" "--json" (if no-cache "--no-cache" "") "--file" 
file search))
     (goto-char (point-min))
     (json-read)))
 
+(defface nix-search-pname
+  '((t :height 1.5
+       :weight bold))
+  "Face used for package names."
+  :group 'nix-mode)
+
+(defface nix-search-version
+  '((((class color) (background dark))
+     :foreground "light blue")
+    (((class color) (background light))
+     :foreground "blue"))
+  "Face used for package version."
+  :group 'nix-mode)
+
+(defface nix-search-description
+  '((t))
+  "Face used for package description."
+  :group 'nix-mode)
+
+(defvar nix-search-mode-menu (make-sparse-keymap "Nix")
+  "Menu for Nix Search mode.")
+
+(defvar nix-search-mode-map (make-sparse-keymap)
+  "Local keymap used for Nix Search mode.")
+
+(defvar-local nix-search--filter nil
+  "Search filter used for current buffer")
+(defvar-local nix-search---file nil
+  "File/flake used for current buffer")
+
+(defun nix-search--refresh ()
+  "Refresh Nix Search buffer"
+  (interactive)
+  (let ((results (nix-search--search nix-search--filter nix-search--file nil 
use-flakes)))
+    (nix-search--display results (current-buffer) use-flakes 
nix-search--filter nix-search--file)))
+
+(defun nix-search-create-keymap ()
+  "Create the keymap associated with the Nix Search mode.")
+
+(defun nix-search-create-menu ()
+  "Create the Nix Search menu as shown in the menu bar."
+  (let ((m '("Nix Search"
+             ["Refresh" nix-search--refresh t])))
+    (easy-menu-define nix-search-mode-menu nix-search-mode-map "Menu keymap 
for Nix mode" m)))
+
+(nix-search-create-keymap)
+(nix-search-create-menu)
+
+(define-derived-mode nix-search-mode view-mode "Nix Search"
+  "Major mode for showing Nix search results.
+
+\\{nix-search-mode-map}"
+  :group 'nix-mode
+
+  (easy-menu-add nix-search-mode-menu)
+
+  (read-only-mode 1))
+
 ;;;###autoload
-(defun nix-search--display (results &optional display-buffer)
+(defun nix-search--display (results &optional display-buffer use-flakes search 
file)
   (unless display-buffer (setq display-buffer (generate-new-buffer "*nix 
search*")))
   (with-current-buffer display-buffer
-    (dolist (entry results)
-      (widget-insert
-        (format "attr: %s\nname: %s\nversion: %s\ndescription: %s\n\n"
-          (car entry)
-          (alist-get 'pkgName (cdr entry))
-          (alist-get 'version (cdr entry))
-          (alist-get 'description (cdr entry))))))
+    (setq-local nix-search--filter search)
+    (setq-local nix-search--file file)
+    (unless (derived-mode-p 'nix-search-mode)
+      (nix-search-mode))
+    (let ((inhibit-read-only t))
+      (erase-buffer)
+      (insert 
"-------------------------------------------------------------------------------\n")
+      (dolist (entry results)
+       (let ((pname (if use-flakes
+                        (alist-get 'pname (cdr entry))
+                      (alist-get 'pkgName (cdr entry))))
+             (version (alist-get 'version (cdr entry)))
+             (description (alist-get 'description (cdr entry))))
+         (put-text-property 0 (length pname) 'face 'nix-search-pname pname)
+         (put-text-property 0 (length version) 'face 'nix-search-version 
version)
+         (put-text-property 0 (length description) 'face 
'nix-search-description description)
+         (insert (format "* %s (%s)\n%s\n" pname version description))
+         (insert 
"-------------------------------------------------------------------------------\n")
+         ))))
   (display-buffer display-buffer))
 
 ;;;###autoload
-(defun nix-search (search &optional file)
+(defun nix-search (search &optional file display-buffer)
   "Run nix search.
 SEARCH a search term to use.
 FILE a Nix expression to search in."
   (interactive "snix-search> \n")
-  (setq file (or file (nix-read-file)))
-  (let ((results (nix-search--search search file)))
+  (setq use-flakes (nix-has-flakes))
+  (setq file (or file (if use-flakes (nix-read-flake) (nix-read-file))))
+  (let ((results (nix-search--search search file nil use-flakes)))
     (when (called-interactively-p 'any)
-      (nix-search--display results))
+      (nix-search--display results display-buffer use-flakes search file))
     results))
 
 (defun nix-search-read-attr (file)
diff --git a/nix-shell.el b/nix-shell.el
index e8b5c8d21f..dcab7e5df4 100644
--- a/nix-shell.el
+++ b/nix-shell.el
@@ -60,6 +60,12 @@ Should only be set in dir-locals.el file."
   :type 'stringp
   :group 'nix-shell)
 
+(defcustom nix-flake nil
+  "Nix flake to build expressions from.
+Should only be set in dir-locals.el file."
+  :type 'stringp
+  :group 'nix-shell)
+
 (defcustom nix-attr nil
   "Nix attribute path to use.
 Should only be set in dir-locals.el file."
@@ -80,6 +86,13 @@ ATTR is the attribute to unpack."
   "Get nix attribute from user."
   (read-string "Nix attr: "))
 
+(defun nix-read-flake ()
+  "Get nix flake from user."
+  (cond
+   (nix-flake nix-flake)
+   ((and (nix-has-flakes) (file-exists-p "flake.nix")) ".")
+   (t (read-string "Nix flake: " "nixpkgs"))))
+
 (defun nix-read-file ()
   "Get nix file from user."
   (cond
diff --git a/nix.el b/nix.el
index 0507ae7e7d..ede66d7790 100644
--- a/nix.el
+++ b/nix.el
@@ -78,6 +78,17 @@
       (kill-buffer stdout)
       result)))
 
+(defun nix-show-config ()
+  "Show nix config."
+  (let ((stdout (generate-new-buffer "nix config"))
+        result)
+    (call-process nix-executable nil (list stdout nil) nil "show-config" 
"--json")
+    (setq result (with-current-buffer stdout
+                  (goto-char (point-min))
+                  (json-read)))
+    (kill-buffer stdout)
+    result))
+
 (defvar nix-commands
   '("add-to-store"
     "build"
@@ -187,10 +198,23 @@ OPTIONS a list of options to accept."
        ((or (string= "-s" last-arg) (string= "--substituter" last-arg))
         (pcomplete-here))))))
 
+(defun nix-is-24 ()
+  "Whether Nix is a version with Flakes support."
+  ;; earlier versions reported as 3, now it’s just nix-2.4
+  (let ((version (nix-version)))
+    (or (string-prefix-p "nix (Nix) 3" version)
+        (string-prefix-p "nix (Nix) 2.4" version))))
+
+(defun nix-has-flakes ()
+  "Whether Nix is a version with Flakes support."
+  ;; earlier versions reported as 3, now it’s just nix-2.4
+  (and (nix-is-24)
+       (seq-contains-p (alist-get 'value (alist-get 'experimental-features 
(nix-show-config))) "flakes")))
+
 ;;;###autoload
 (defun pcomplete/nix ()
   "Completion for the nix command."
-  (if (string-prefix-p "nix (Nix) 3" (nix-version))
+  (if (nix-is-24)
       (let ((stdout (generate-new-buffer "nix-completions"))
             (process-environment
              (cons (format "NIX_GET_COMPLETIONS=%s" (1- (length 
pcomplete-args)))



reply via email to

[Prev in Thread] Current Thread [Next in Thread]