diff mbox series

[bug#63909] home: Add inputrc service.

Message ID 29f421343373bc3655abb9961f254880a295f6f7.1685967547.git.efraim@flashner.co.il
State New
Headers show
Series [bug#63909] home: Add inputrc service. | expand

Commit Message

Efraim Flashner June 5, 2023, 12:19 p.m. UTC
* gnu/home/services/shells.scm (home-inputrc-service-type,
home-inputrc-configuration): New variables.
(serialize-inputrc-key-bindings, serialize-inputrc-variables,
serialize-inputrc-conditional-constructs,
serialize-inputrc-extra-content, generate-home-inputrc-documentation):
New procedures.
---
 gnu/home/services/shells.scm | 145 ++++++++++++++++++++++++++++++++++-
 1 file changed, 144 insertions(+), 1 deletion(-)


base-commit: 940665301de4effd065d24c167f619286f2adf4c

Comments

Ludovic Courtès June 16, 2023, 1:40 p.m. UTC | #1
Hi!

Efraim Flashner <efraim@flashner.co.il> skribis:

> * gnu/home/services/shells.scm (home-inputrc-service-type,
> home-inputrc-configuration): New variables.
> (serialize-inputrc-key-bindings, serialize-inputrc-variables,
> serialize-inputrc-conditional-constructs,
> serialize-inputrc-extra-content, generate-home-inputrc-documentation):
> New procedures.

Nice!

I’d like Andrew and ( to chime in more often :-) but here’s my take.

> +
> +;;;
> +;;; Documentation.
> +;;;
>  
>  (define (generate-home-shell-profile-documentation)
>    (generate-documentation
> @@ -662,3 +798,10 @@ (define (generate-home-fish-documentation)
>      `((home-fish-extension
>         ,home-fish-extension-fields))
>      'home-fish-extension)))
> +
> +(define (generate-home-inputrc-documentation)
> +  (string-append
> +   (generate-documentation
> +    `((home-inputrc-configuration
> +       ,home-inputrc-configuration-fields))
> +    'home-inputrc-configuration)))

I don’t think we need to keep these procedures in the file.

Overall it LGTM, except for one thing: could you add it to
‘doc/guix.texi’?  (The usual template is: an intro giving context and a
cross-reference to the upstream manual, one or two configuration
examples with an explanation, and then the reference.)

Thanks!

Ludo’.
diff mbox series

Patch

diff --git a/gnu/home/services/shells.scm b/gnu/home/services/shells.scm
index f05f2221d6..bc3daf7a21 100644
--- a/gnu/home/services/shells.scm
+++ b/gnu/home/services/shells.scm
@@ -1,6 +1,7 @@ 
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2021 Andrew Tropin <andrew@trop.in>
 ;;; Copyright © 2021 Xinglu Chen <public@yoctocell.xyz>
+;;; Copyright © 2023 Efraim Flashner <efraim@flashner.co.il>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -44,7 +45,10 @@  (define-module (gnu home services shells)
 
             home-fish-service-type
             home-fish-configuration
-            home-fish-extension))
+            home-fish-extension
+
+            home-inputrc-service-type
+            home-inputrc-configuration))
 
 ;;; Commentary:
 ;;;
@@ -626,6 +630,138 @@  (define home-fish-service-type
                 (description "\
 Install and configure Fish, the friendly interactive shell.")))
 
+
+;;;
+;;; Readline.
+;;;
+
+(define (serialize-inputrc-key-bindings field-name val)
+  #~(string-append
+     #$@(map
+         (match-lambda
+           ((key . value)
+            #~(string-append #$key ": " #$value "\n")))
+         val)))
+
+(define (serialize-inputrc-variables field-name val)
+  #~(string-append
+     #$@(map
+         (match-lambda
+           ((key . #f)
+            #~(string-append "set " #$key " off\n"))
+           ((key . #t)
+            #~(string-append "set " #$key " on\n"))
+           ((key . value)
+            #~(string-append "set " #$key " " #$value "\n")))
+         val)))
+
+(define (serialize-inputrc-conditional-constructs field-name val)
+  #~(string-append
+     #$@(map
+         (match-lambda
+           (("$endif" . _)
+            "$endif\n")
+           (("$include" . value)
+            #~(string-append "$include " #$value "\n"))
+           ;; TODO: key can only be "$if" or "$else".
+           ((key . value)
+            #~(string-append #$key "\n"
+                             #$(serialize-configuration
+                                 value
+                                 home-inputrc-configuration-fields))))
+         val)))
+
+(define (serialize-inputrc-extra-content field-name value)
+  #~(if (string=? #$value "") "" (string-append #$value "\n")))
+
+(define-configuration home-inputrc-configuration
+  (key-bindings
+   (alist '())
+   "Association list of readline key bindings to be added to the @code{.inputrc}
+file.  This is where code like this:
+
+@lisp
+'((\"Control-l\" . \"clear-screen\"))
+@end lisp
+
+turns into
+
+@example
+Control-l: clear-screen
+@end example"
+   (serializer serialize-inputrc-key-bindings))
+  (variables
+   (alist '())
+   "Association list of readline variables to set.  This is where configuration
+options like this:
+
+@lisp
+'((\"bell-style\" . \"visible\")
+  (\"colored-completion-prefix\" . #t))
+@end lisp
+
+turns into
+
+@example
+set bell-style visible
+set colored-completion-prefix on
+@end example"
+   (serializer serialize-inputrc-variables))
+  (conditional-constructs
+   (alist '())
+   "Association list of conditionals to add to the intialization file.  This
+includes @command{$if}, @command{else}, @command{endif} and @{include} and they
+receive a value of another @command{home-inputrc-configuration}.
+
+@lisp
+(conditional-constructs
+ `((\"$if mode=vi\" .
+     ,(home-inputrc-configuration
+        (variables
+         `((\"show-mode-in-prompt\" . #t)))))
+   (\"$else\" .
+     ,(home-inputrc-configuration
+        (key-bindings
+         `((\"Control-l\" . \"clear-screen\")))))
+   (\"$endif\" . #t)))
+@end lisp
+
+turns into
+
+@example
+$if mode=vi
+set show-mode-in-prompt on
+$else
+Control-l: clear-screen
+$endif
+@end example"
+   (serializer serialize-inputrc-conditional-constructs))
+  (extra-content
+   (string "")
+   "Extra content appended as-is to the configuration file.  Run @command{man
+readline} for more information about all the configuration options."
+   (serializer serialize-inputrc-extra-content)))
+
+(define (home-inputrc-files config)
+  (list
+   `(".inputrc"
+     ,(mixed-text-file "inputrc"
+                       (serialize-configuration
+                         config
+                         home-inputrc-configuration-fields)))))
+
+(define home-inputrc-service-type
+  (service-type (name 'inputrc)
+                (extensions
+                 (list (service-extension home-files-service-type
+                                          home-inputrc-files)))
+                (default-value (home-inputrc-configuration))
+                (description "Configure readline in @code{.inputrc}.")))
+
+
+;;;
+;;; Documentation.
+;;;
 
 (define (generate-home-shell-profile-documentation)
   (generate-documentation
@@ -662,3 +798,10 @@  (define (generate-home-fish-documentation)
     `((home-fish-extension
        ,home-fish-extension-fields))
     'home-fish-extension)))
+
+(define (generate-home-inputrc-documentation)
+  (string-append
+   (generate-documentation
+    `((home-inputrc-configuration
+       ,home-inputrc-configuration-fields))
+    'home-inputrc-configuration)))