all messages for Guix-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: Alex Kost <alezost@gmail.com>
To: "Ludovic Courtès" <ludo@gnu.org>
Cc: Guix-devel <guix-devel@gnu.org>
Subject: Re: [PATCH] emacs: Add a name/version/synopsis heading in package-info buffers
Date: Thu, 30 Oct 2014 01:13:58 +0300	[thread overview]
Message-ID: <87y4ryle1l.fsf@gmail.com> (raw)
In-Reply-To: <87d29akflu.fsf@gnu.org> ("Ludovic \=\?utf-8\?Q\?Court\=C3\=A8s\=22'\?\= \=\?utf-8\?Q\?s\?\= message of "Wed, 29 Oct 2014 17:25:33 +0100")

[-- Attachment #1: Type: text/plain, Size: 2320 bytes --]

Ludovic Courtès (2014-10-29 19:25 +0300) wrote:

> Hello,
>
> What would think of a patch like this:

[...]

>  (defun guix-info-insert-entry (entry entry-type &optional indent-level)
>    "Insert ENTRY of ENTRY-TYPE into the current info buffer.
>  If INDENT-LEVEL is non-nil, indent displayed information by this
>  number of `guix-info-indent' spaces."
>    (let ((region-beg (point)))
> +    (guix-info-insert-heading entry)
>      (mapc (lambda (param)
> -            (guix-info-insert-param param entry entry-type))
> +            ;; The name, version, and synopsis are already displayed.
> +            (unless (memq param '(name version synopsis))
> +              (guix-info-insert-param param entry entry-type)))
>            (guix-info-get-displayed-params entry-type))
>      (when indent-level
>        (indent-rigidly region-beg (point)

‘guix-info-insert-entry’ is used to insert any type of information, not
only packages, so you can see artifacts (empty lines and "–") in other
"views".

[...]

> It changes the rendering of package-info buffers such that, instead of
> displaying something like:
>
>   Name        : coreutils
>   Version     : 8.23
>   Synopsis    : Core GNU utilities (file, text, shell)
>   ...
>
> it first displays the important info in a visible heading, and then goes
> on with the other fields unchanged:
>
>   coreutils 8.23
>   Core GNU utilities (file, text, shell)
>
>   Outputs:
>     out       Delete
>   ...
>
> On X11, the package name and version are displayed in a large
> variable-width font, and the synopsis is displayed in a slightly smaller
> font.

I think it's a great idea!

I'm attaching the modified version of your patch.  I added there several
variables that allow a user to specify functions for displaying info
(perhaps there will be several variants of displaying info in the
future).  So if someone would like to return to the previous variant of
displaying a package, he could do it with:

  (setq guix-info-insert-package-function nil)

Thanks again, I really like your suggestion, I just prefer to keep
previous possibilities instead of replacing them with the new ones.

Are you going to make a commit or should I do it?  (of course if you
don't have comments on my patch)


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: tmp.diff --]
[-- Type: text/x-diff, Size: 5514 bytes --]

diff --git a/emacs/guix-info.el b/emacs/guix-info.el
index 551d79a..d4e6ecb 100644
--- a/emacs/guix-info.el
+++ b/emacs/guix-info.el
@@ -198,7 +198,8 @@ ENTRIES should have a form of `guix-entries'."
                   entries
                   guix-info-delimiter))
 
-(defun guix-info-insert-entry (entry entry-type &optional indent-level)
+(defun guix-info-insert-entry-default (entry entry-type
+                                       &optional indent-level)
   "Insert ENTRY of ENTRY-TYPE into the current info buffer.
 If INDENT-LEVEL is non-nil, indent displayed information by this
 number of `guix-info-indent' spaces."
@@ -210,6 +211,18 @@ number of `guix-info-indent' spaces."
       (indent-rigidly region-beg (point)
                       (* indent-level guix-info-indent)))))
 
+(defun guix-info-insert-entry (entry entry-type &optional indent-level)
+  "Insert ENTRY of ENTRY-TYPE into the current info buffer.
+Use `guix-info-insert-ENTRY-TYPE-function' or
+`guix-info-insert-entry-default' if it is nil."
+  (let* ((var (intern (concat "guix-info-insert-"
+                              (symbol-name entry-type)
+                              "-function")))
+         (fun (symbol-value var)))
+    (if (functionp fun)
+        (funcall fun entry)
+      (guix-info-insert-entry-default entry entry-type indent-level))))
+
 (defun guix-info-insert-param (param entry entry-type)
   "Insert title and value of a PARAM at point.
 ENTRY is alist with parameters and their values.
@@ -376,6 +389,12 @@ See `insert-text-button' for the meaning of PROPERTIES."
 (guix-define-buffer-type info package
   :required (id installed non-unique))
 
+(defface guix-package-info-heading
+  '((((type tty pc) (class color)) :weight bold)
+    (t :height 1.6 :weight bold :inherit variable-pitch))
+  "Face for package name and version headings."
+  :group 'guix-package-info)
+
 (defface guix-package-info-name
   '((t :inherit font-lock-keyword-face))
   "Face used for a name of a package."
@@ -392,7 +411,8 @@ See `insert-text-button' for the meaning of PROPERTIES."
   :group 'guix-package-info)
 
 (defface guix-package-info-synopsis
-  '((t :inherit font-lock-doc-face))
+  '((((type tty pc) (class color)) :weight bold)
+    (t :height 1.1 :weight bold :inherit variable-pitch))
   "Face used for a synopsis of a package."
   :group 'guix-package-info)
 
@@ -433,6 +453,32 @@ See `insert-text-button' for the meaning of PROPERTIES."
   "Face used if a package is obsolete."
   :group 'guix-package-info)
 
+(defvar guix-info-insert-package-function
+  #'guix-package-info-insert-with-heading
+  "Function used to insert a package information.
+It is called with a single argument - alist of package parameters.
+If nil, insert package in a default way.")
+
+(defun guix-package-info-insert-heading (entry)
+  "Insert the heading for package ENTRY.
+Show package name, version, and synopsis."
+  (guix-format-insert (concat (guix-get-key-val entry 'name) " "
+                              (guix-get-key-val entry 'version))
+                      'guix-package-info-heading)
+  (insert "\n")
+  (guix-format-insert (guix-get-key-val entry 'synopsis)
+                      'guix-package-info-synopsis)
+  (insert "\n\n"))
+
+(defun guix-package-info-insert-with-heading (entry)
+  "Insert package ENTRY with its heading at point."
+  (guix-package-info-insert-heading entry)
+  (mapc (lambda (param)
+          ;; The name, version, and synopsis are already displayed.
+          (unless (memq param '(name version synopsis))
+            (guix-info-insert-param param entry 'package)))
+        (guix-info-get-displayed-params 'package)))
+
 (defun guix-package-info-insert-description (desc &optional _)
   "Insert description DESC at point."
   (guix-info-insert-val-simple desc 'guix-package-info-description))
@@ -494,6 +540,12 @@ formatted with this string, an action button is inserted.")
 (defvar guix-package-info-obsolete-string "(This package is obsolete)"
   "String used if a package is obsolete.")
 
+(defvar guix-info-insert-installed-function nil
+  "Function used to insert an installed information.
+It is called with a single argument - alist of installed
+parameters (`output', `path', `dependencies').
+If nil, insert installed info in a default way.")
+
 (defun guix-package-info-insert-outputs (outputs entry)
   "Insert OUTPUTS from package ENTRY at point."
   (and (guix-get-key-val entry 'obsolete)
@@ -582,6 +634,11 @@ ENTRY is an alist with package info."
   :buffer-name "*Guix Package Info*"
   :required (id package-id installed non-unique))
 
+(defvar guix-info-insert-output-function nil
+  "Function used to insert an output information.
+It is called with a single argument - alist of output parameters.
+If nil, insert output in a default way.")
+
 (defun guix-output-info-insert-version (version entry)
   "Insert output VERSION and obsolete text if needed at point."
   (guix-info-insert-val-default version
@@ -625,6 +682,11 @@ ENTRY is an alist with package info."
   "Face used if a generation is not the current one."
   :group 'guix-generation-info)
 
+(defvar guix-info-insert-generation-function nil
+  "Function used to insert a generation information.
+It is called with a single argument - alist of generation parameters.
+If nil, insert generation in a default way.")
+
 (defun guix-generation-info-insert-number (number &optional _)
   "Insert generation NUMBER and action buttons."
   (guix-info-insert-val-default number 'guix-generation-info-number)


  reply	other threads:[~2014-10-29 22:14 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-10-29 16:25 [PATCH] emacs: Add a name/version/synopsis heading in package-info buffers Ludovic Courtès
2014-10-29 22:13 ` Alex Kost [this message]
2014-10-30 13:16   ` Ludovic Courtès
2014-10-30 21:38     ` Alex Kost
2014-10-30 23:20       ` Ludovic Courtès
2014-11-01 10:58         ` Alex Kost
2014-11-02 17:23           ` Ludovic Courtès

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87y4ryle1l.fsf@gmail.com \
    --to=alezost@gmail.com \
    --cc=guix-devel@gnu.org \
    --cc=ludo@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/guix.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.