* [bug#63909] [PATCH] home: Add inputrc service.
@ 2023-06-05 12:19 Efraim Flashner
2023-06-16 13:40 ` Ludovic Courtès
0 siblings, 1 reply; 4+ messages in thread
From: Efraim Flashner @ 2023-06-05 12:19 UTC (permalink / raw)
To: 63909; +Cc: Efraim Flashner
* 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(-)
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.")))
+\f
+;;;
+;;; 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}.")))
+
+\f
+;;;
+;;; 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)))
base-commit: 940665301de4effd065d24c167f619286f2adf4c
--
Efraim Flashner <efraim@flashner.co.il> רנשלפ םירפא
GPG key = A28B F40C 3E55 1372 662D 14F7 41AA E7DC CA3D 8351
Confidentiality cannot be guaranteed on emails sent or received unencrypted
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [bug#63909] [PATCH] home: Add inputrc service.
2023-06-05 12:19 [bug#63909] [PATCH] home: Add inputrc service Efraim Flashner
@ 2023-06-16 13:40 ` Ludovic Courtès
2023-06-18 8:49 ` [bug#63909] [PATCH v2] " Efraim Flashner
0 siblings, 1 reply; 4+ messages in thread
From: Ludovic Courtès @ 2023-06-16 13:40 UTC (permalink / raw)
To: Efraim Flashner; +Cc: paren, 63909, Andrew Tropin
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.
> +\f
> +;;;
> +;;; 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’.
^ permalink raw reply [flat|nested] 4+ messages in thread
* [bug#63909] [PATCH v2] home: Add inputrc service.
2023-06-16 13:40 ` Ludovic Courtès
@ 2023-06-18 8:49 ` Efraim Flashner
[not found] ` <handler.64148.B.168707819619994.ack@debbugs.gnu.org>
0 siblings, 1 reply; 4+ messages in thread
From: Efraim Flashner @ 2023-06-18 8:49 UTC (permalink / raw)
To: 63909, ludo; +Cc: paren, efraim, andrew
* 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): New procedures.
* doc/guix.texi (Shells Home Services): Document it.
---
doc/guix.texi | 129 +++++++++++++++++++++++++++++++++
gnu/home/services/shells.scm | 134 ++++++++++++++++++++++++++++++++++-
2 files changed, 262 insertions(+), 1 deletion(-)
diff --git a/doc/guix.texi b/doc/guix.texi
index 9232c82b4b..72ab941243 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -42797,6 +42797,135 @@ Shells Home Services
@end deftp
+@subsubheading Inputrc Profile Service
+@cindex inputrc
+@cindex readline
+
+The @uref{https://tiswww.cwru.edu/php/chet/readline/rltop.html, GNU
+Readline package} includes Emacs and vi editing modes, with the ability
+to customize the configuration with settings in the @file{~/.inputrc}
+file. With the @code{gnu home services shells} module, you can setup
+your readline configuration in a predictable manner, as shown below.
+For more information about configuring an @file{~/.inputrc} file,
+@pxref{Readline Init File,,, readline, GNU Readline}.
+
+@defvar home-inputrc-service-type
+
+This is the service to setup various @file{.inputrc} configurations. The
+settings in @file{.inputrc} are read by all programs which are linked
+with GNU Readline.
+
+Here is an example of a service and its configuration that you could add
+to the @code{services} field of your @code{home-environment}:
+
+@lisp
+(service home-inputrc-service-type
+ (home-inputrc-configuration
+ (key-bindings
+ `(("Control-l" . "clear-screen")))
+ (variables
+ `(("bell-style" . "visible")
+ ("colored-completion-prefix" . #t)
+ ("editing-mode" . "vi")
+ ("show-mode-in-prompt" . #t)))
+ (conditional-constructs
+ `(("$if mode=vi" .
+ ,(home-inputrc-configuration
+ (variables
+ `(("colored-stats" . #t)
+ ("enable-bracketed-paste" . #t)))))
+ ("$else" .
+ ,(home-inputrc-configuration
+ (variables
+ `(("show-all-if-ambiguous" . #t)))))
+ ("endif" . #t)
+ ("$include" . "/etc/inputrc")
+ ("$include" . ,(file-append
+ (specification->package "readline")
+ "/etc/inputrc"))))))
+@end lisp
+
+The example above starts with a combination of @code{key-bindings} and
+@code{variables}. The @code{conditional-constructs} show how it is
+possible to add conditionals and includes. In the example above
+@code{colored-stats} is only enabled if the editing mode is @code{vi}
+style, and it also reads any additional configuration located in
+@file{/etc/inputrc} or in @file{/gnu/store/@dots{}-readline/etc/inputrc}.
+
+The value associated with a @code{home-inputrc-service-type} instance
+must be a @code{home-inputrc-configuration} record, as described below.
+
+@end defvar
+
+@anchor{home-inputrc-configuration}
+@deftp {Data Type} home-inputrc-configuration
+Available @code{home-inputrc-configuration} fields are:
+
+@table @asis
+@item @code{key-bindings} (default: @code{'()}) (type: alist)
+Association list of readline key bindings to be added to the
+@file{~/.inputrc} file.
+
+@lisp
+'((\"Control-l\" . \"clear-screen\"))
+@end lisp
+
+turns into
+
+@example
+Control-l: clear-screen
+@end example
+
+@item @code{variables} (default: @code{'()}) (type: alist)
+Association list of readline variables to set.
+
+@lisp
+'((\"bell-style\" . \"visible\")
+ (\"colored-completion-prefix\" . #t))
+@end lisp
+
+turns into
+
+@example
+set bell-style visible
+set colored-completion-prefix on
+@end example
+
+@item @code{conditional-constructs} (default: @code{'()}) (type: alist)
+Association list of conditionals to add to the initialization file. This
+includes @command{$if}, @command{else}, @command{endif} and @command{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
+
+@item @code{extra-content} (default: @code{""}) (type: text-config)
+Extra content appended as-is to the configuration file. Run @command{man
+readline} for more information about all the configuration options.
+
+@end table
+@end deftp
+
@node Mcron Home Service
@subsection Scheduled User's Job Execution
diff --git a/gnu/home/services/shells.scm b/gnu/home/services/shells.scm
index f05f2221d6..415b5470c5 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,134 @@ (define home-fish-service-type
(description "\
Install and configure Fish, the friendly interactive shell.")))
+\f
+;;;
+;;; 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 initialization file. This
+includes @command{$if}, @command{else}, @command{endif} and @command{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}.")))
+
(define (generate-home-shell-profile-documentation)
(generate-documentation
base-commit: e4087930f3ad60918689be5f4bca4ce3e22429f5
--
Efraim Flashner <efraim@flashner.co.il> רנשלפ םירפא
GPG key = A28B F40C 3E55 1372 662D 14F7 41AA E7DC CA3D 8351
Confidentiality cannot be guaranteed on emails sent or received unencrypted
^ permalink raw reply related [flat|nested] 4+ messages in thread
* bug#63909: bug#64148: Acknowledgement ([PATCH v2] home: Add inputrc service.)
[not found] ` <handler.64148.B.168707819619994.ack@debbugs.gnu.org>
@ 2023-07-06 13:21 ` Efraim Flashner
0 siblings, 0 replies; 4+ messages in thread
From: Efraim Flashner @ 2023-07-06 13:21 UTC (permalink / raw)
To: 64148-done, 63909-done
[-- Attachment #1: Type: text/plain, Size: 227 bytes --]
Patch pushed
--
Efraim Flashner <efraim@flashner.co.il> רנשלפ םירפא
GPG key = A28B F40C 3E55 1372 662D 14F7 41AA E7DC CA3D 8351
Confidentiality cannot be guaranteed on emails sent or received unencrypted
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2023-07-06 13:22 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-06-05 12:19 [bug#63909] [PATCH] home: Add inputrc service Efraim Flashner
2023-06-16 13:40 ` Ludovic Courtès
2023-06-18 8:49 ` [bug#63909] [PATCH v2] " Efraim Flashner
[not found] ` <handler.64148.B.168707819619994.ack@debbugs.gnu.org>
2023-07-06 13:21 ` bug#63909: bug#64148: Acknowledgement ([PATCH v2] home: Add inputrc service.) Efraim Flashner
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/guix.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).