[PATCH] home: Add inputrc service.

  • Done
  • quality assurance status badge
Details
2 participants
  • Efraim Flashner
  • Ludovic Courtès
Owner
unassigned
Submitted by
Efraim Flashner
Severity
normal

Debbugs page

Efraim Flashner wrote 2 years ago
(address . guix-patches@gnu.org)(name . Efraim Flashner)(address . efraim@flashner.co.il)
29f421343373bc3655abb9961f254880a295f6f7.1685967547.git.efraim@flashner.co.il
* 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(-)

Toggle diff (180 lines)
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)))

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
Ludovic Courtès wrote 2 years ago
(name . Efraim Flashner)(address . efraim@flashner.co.il)
87pm5vseyu.fsf@gnu.org
Hi!

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

Toggle quote (7 lines)
> * 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.

Toggle quote (19 lines)
> +
> +;;;
> +;;; 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’.
Efraim Flashner wrote 2 years ago
[PATCH v2] home: Add inputrc service.
f33b5c8efe1299e69d4afae2d59b1d59fe1814bd.1687078107.git.efraim@flashner.co.il
* 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(-)

Toggle diff (305 lines)
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.")))
+
+;;;
+;;; 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
Efraim Flashner wrote 2 years ago
Re: bug#64148: Acknowledgement ([PATCH v2] home: Add inputrc service.)
ZKa_7L-tGBE2xluO@3900XT
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
-----BEGIN PGP SIGNATURE-----

iQIzBAABCAAdFiEEoov0DD5VE3JmLRT3Qarn3Mo9g1EFAmSmv+wACgkQQarn3Mo9
g1HoehAAoWfcKllstQgJgsSDBe6wc/JA2qDDisgtlKkWVqXqDWsaO5p6KVkQCcI7
euTt+HERrtJkYFTCeQf/QBMkE05HWI9AqignJZCw/LgjWhCT45KIOhHZBU00ScIS
PWtH28RVVOVgLMQoSU+PakHsb3tpHbYy4L6v8r5PQcM9PH7PXKbFak1CZkOSM2FS
WVoLipfq/wspxM1csFT7qCLpgXHfQGpdC2zDgLUS1ef/zBBlrp4nAdt+/Rcq1ajF
unwe6X4IgHgXeCWb5Jpg42cbhy+9psKPabbCy2e+hFdlU9iPqWCRIMBIbTqcBxZU
EDou9Bcq0CEWscI8egusbP1sQicY2uqEe47bNEVz6FKBzFncBsT+2eyawRFM9AiT
mlRCtLeLhMZ1dMQ1vR8n3iOnlNySVgrWu1ot8bj3ytd6w4Z9sAdJdz4b1SOwzh69
njy0PhgtT43M6jvA3HgtCYOgpfN8cl7lY1KpZdl89XihBoZAYarqrN25wIENY7A7
TY/UMoWydhT/HNPlzs73uPs5dVPoC0XTKO8pD6vNFJCTL5zBp0G9ExElV0M1MdTl
8YtUaXyO6l+nvV7mRSXmQU03pXIpECRlW7ccsPEcegR81Xkf6IWzTIa95k26P+Y1
cM4vehBR7d6KWjGW5lkB8k51qlpWIaefnlQL86NkjkWoSK5BcmY=
=7AsR
-----END PGP SIGNATURE-----


Closed
?
Your comment

This issue is archived.

To comment on this conversation send an email to 63909@debbugs.gnu.org

To respond to this issue using the mumi CLI, first switch to it
mumi current 63909
Then, you may apply the latest patchset in this issue (with sign off)
mumi am -- -s
Or, compose a reply to this issue
mumi compose
Or, send patches to this issue
mumi send-email *.patch
You may also tag this issue. See list of standard tags. For example, to set the confirmed and easy tags
mumi command -t +confirmed -t +easy
Or, remove the moreinfo tag and set the help tag
mumi command -t -moreinfo -t +help