aboutsummaryrefslogtreecommitdiff
path: root/gnu/home
diff options
context:
space:
mode:
authorEfraim Flashner <efraim@flashner.co.il>2023-06-05 13:05:35 +0300
committerEfraim Flashner <efraim@flashner.co.il>2023-07-05 18:57:32 +0300
commit69d051f715fc2f2f56543edba22bae50bdcb36dd (patch)
tree2f1cbfd5daba2eb1be1b338e517e16e3cd37d783 /gnu/home
parentc7eed71681501afa494e8640c3cdd080cadf8290 (diff)
downloadguix-69d051f715fc2f2f56543edba22bae50bdcb36dd.tar
guix-69d051f715fc2f2f56543edba22bae50bdcb36dd.tar.gz
home: Add inputrc service.
* 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.
Diffstat (limited to 'gnu/home')
-rw-r--r--gnu/home/services/shells.scm134
1 files changed, 133 insertions, 1 deletions
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 @@
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 @@ end\n\n")
(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