feat: create a record to represent fish abbreviations declaratively in a more featureful and readable way
parent
d2cec18208
commit
4e27f8533b
|
@ -0,0 +1,206 @@
|
||||||
|
(define-module (radix home services shells)
|
||||||
|
#:use-module (gnu services configuration)
|
||||||
|
#:use-module (gnu home services utils)
|
||||||
|
#:use-module (gnu home services)
|
||||||
|
#:use-module (gnu packages shells)
|
||||||
|
#:use-module (guix gexp)
|
||||||
|
#:use-module (guix packages)
|
||||||
|
#:use-module (guix records)
|
||||||
|
#:use-module (srfi srfi-1)
|
||||||
|
#:use-module (srfi srfi-9)
|
||||||
|
#:use-module (srfi srfi-26)
|
||||||
|
#:use-module (ice-9 match)
|
||||||
|
|
||||||
|
#:export (home-fish-service-type
|
||||||
|
home-fish-configuration
|
||||||
|
home-fish-extension
|
||||||
|
|
||||||
|
abbreviation
|
||||||
|
abbreviation-expansion
|
||||||
|
abbreviation-marker
|
||||||
|
abbreviation-position
|
||||||
|
abbreviation-pattern
|
||||||
|
abbreviation-name
|
||||||
|
abbreviation?
|
||||||
|
|
||||||
|
fish-function
|
||||||
|
fish-function-name
|
||||||
|
fish-function?))
|
||||||
|
|
||||||
|
;;;
|
||||||
|
;;; Fish.
|
||||||
|
;;;
|
||||||
|
|
||||||
|
(define (serialize-fish-aliases field-name val)
|
||||||
|
#~(string-append
|
||||||
|
#$@(map (match-lambda
|
||||||
|
((key . value)
|
||||||
|
#~(string-append "alias " #$key " \"" #$value "\"\n"))
|
||||||
|
(_ ""))
|
||||||
|
val)))
|
||||||
|
|
||||||
|
(define-record-type <fish-function>
|
||||||
|
(fish-function name)
|
||||||
|
fish-function?
|
||||||
|
(name fish-function-name))
|
||||||
|
|
||||||
|
(define-record-type* <abbreviation>
|
||||||
|
abbreviation make-abbreviation
|
||||||
|
abbreviation?
|
||||||
|
(name abbreviation-name) ; string
|
||||||
|
(pattern abbreviation-pattern ; string | #f
|
||||||
|
(default #f))
|
||||||
|
(position abbreviation-position ; "command" | "anywhere" | #f
|
||||||
|
(default #f)) ; defaults to "command" -´
|
||||||
|
(marker abbreviation-marker ; char
|
||||||
|
(default #\%))
|
||||||
|
(expansion abbreviation-expansion)) ; string | <fish-function>
|
||||||
|
|
||||||
|
(define list-of-abbreviations?
|
||||||
|
(list-of abbreviation?))
|
||||||
|
|
||||||
|
(define (serialize-fish-abbreviations field-name val)
|
||||||
|
#~(string-append
|
||||||
|
#$@(map (lambda (abbr)
|
||||||
|
(match-record abbr <abbreviation>
|
||||||
|
(name pattern position marker expansion)
|
||||||
|
#~((@@ (ice-9 format) format) #f
|
||||||
|
"abbr --add ~a ~
|
||||||
|
~@[--position ~a ~]~
|
||||||
|
~@[--regex ~a ~]~
|
||||||
|
--set-cursor=~a ~
|
||||||
|
~a~%"
|
||||||
|
#$name
|
||||||
|
#$position
|
||||||
|
#$pattern
|
||||||
|
#$marker
|
||||||
|
#$(if (fish-function? expansion)
|
||||||
|
(format #f "--function ~a"
|
||||||
|
(fish-function-name expansion))
|
||||||
|
(format #f "\"~a\"" expansion)))))
|
||||||
|
val)))
|
||||||
|
|
||||||
|
(define (serialize-fish-env-vars field-name val)
|
||||||
|
#~(string-append
|
||||||
|
#$@(map (match-lambda
|
||||||
|
((key . #f)
|
||||||
|
"")
|
||||||
|
((key . #t)
|
||||||
|
#~(string-append "set -x " #$key "\n"))
|
||||||
|
((key . value)
|
||||||
|
#~(string-append "set -x " #$key " " #$value "\n")))
|
||||||
|
val)))
|
||||||
|
|
||||||
|
(define-configuration home-fish-configuration
|
||||||
|
(package
|
||||||
|
(package fish)
|
||||||
|
"The Fish package to use.")
|
||||||
|
(config
|
||||||
|
(text-config '())
|
||||||
|
"List of file-like objects, which will be added to
|
||||||
|
@file{$XDG_CONFIG_HOME/fish/config.fish}.")
|
||||||
|
(environment-variables
|
||||||
|
(alist '())
|
||||||
|
"Association list of environment variables to set in Fish."
|
||||||
|
(serializer serialize-fish-env-vars))
|
||||||
|
(aliases
|
||||||
|
(alist '())
|
||||||
|
"Association list of aliases for Fish, both the key and the value
|
||||||
|
should be a string. An alias is just a simple function that wraps a
|
||||||
|
command, If you want something more akin to @dfn{aliases} in POSIX
|
||||||
|
shells, see the @code{abbreviations} field."
|
||||||
|
(serializer serialize-fish-aliases))
|
||||||
|
(abbreviations
|
||||||
|
(list-of-abbreviations '())
|
||||||
|
"List of abbreviations for Fish. These are words that, when
|
||||||
|
typed in the shell, will automatically expand to the full text."
|
||||||
|
(serializer serialize-fish-abbreviations)))
|
||||||
|
|
||||||
|
(define (fish-files-service config)
|
||||||
|
`(("fish/config.fish"
|
||||||
|
,(mixed-text-file
|
||||||
|
"fish-config.fish"
|
||||||
|
#~(string-append "\
|
||||||
|
# if we haven't sourced the login config, do it
|
||||||
|
status --is-login; and not set -q __fish_login_config_sourced
|
||||||
|
and begin
|
||||||
|
|
||||||
|
set --prepend fish_function_path "
|
||||||
|
#$fish-foreign-env
|
||||||
|
"/share/fish/functions
|
||||||
|
fenv source $HOME/.profile
|
||||||
|
set -e fish_function_path[1]
|
||||||
|
|
||||||
|
set -g __fish_login_config_sourced 1
|
||||||
|
|
||||||
|
end\n\n")
|
||||||
|
(serialize-configuration
|
||||||
|
config
|
||||||
|
home-fish-configuration-fields)))))
|
||||||
|
|
||||||
|
(define (fish-profile-service config)
|
||||||
|
(list (home-fish-configuration-package config)))
|
||||||
|
|
||||||
|
(define-configuration/no-serialization home-fish-extension
|
||||||
|
(config
|
||||||
|
(text-config '())
|
||||||
|
"List of file-like objects for extending the Fish initialization file.")
|
||||||
|
(environment-variables
|
||||||
|
(alist '())
|
||||||
|
"Association list of environment variables to set.")
|
||||||
|
(aliases
|
||||||
|
(alist '())
|
||||||
|
"Association list of Fish aliases.")
|
||||||
|
(abbreviations
|
||||||
|
(list-of-abbreviations '())
|
||||||
|
"Association list of Fish abbreviations."))
|
||||||
|
|
||||||
|
(define (home-fish-extensions original-config extension-configs)
|
||||||
|
(home-fish-configuration
|
||||||
|
(inherit original-config)
|
||||||
|
(config
|
||||||
|
(append (home-fish-configuration-config original-config)
|
||||||
|
(append-map
|
||||||
|
home-fish-extension-config extension-configs)))
|
||||||
|
(environment-variables
|
||||||
|
(append (home-fish-configuration-environment-variables original-config)
|
||||||
|
(append-map
|
||||||
|
home-fish-extension-environment-variables extension-configs)))
|
||||||
|
(aliases
|
||||||
|
(append (home-fish-configuration-aliases original-config)
|
||||||
|
(append-map
|
||||||
|
home-fish-extension-aliases extension-configs)))
|
||||||
|
(abbreviations
|
||||||
|
(append (home-fish-configuration-abbreviations original-config)
|
||||||
|
(append-map
|
||||||
|
home-fish-extension-abbreviations extension-configs)))))
|
||||||
|
|
||||||
|
;; TODO: Support for generating completion files
|
||||||
|
;; TODO: Support for installing plugins
|
||||||
|
(define home-fish-service-type
|
||||||
|
(service-type (name 'home-fish)
|
||||||
|
(extensions
|
||||||
|
(list (service-extension
|
||||||
|
home-xdg-configuration-files-service-type
|
||||||
|
fish-files-service)
|
||||||
|
(service-extension
|
||||||
|
home-profile-service-type
|
||||||
|
fish-profile-service)))
|
||||||
|
(compose identity)
|
||||||
|
(extend home-fish-extensions)
|
||||||
|
(default-value (home-fish-configuration))
|
||||||
|
(description "\
|
||||||
|
Install and configure Fish, the friendly interactive shell.")))
|
||||||
|
|
||||||
|
(define (generate-home-fish-documentation)
|
||||||
|
(string-append
|
||||||
|
(generate-documentation
|
||||||
|
`((home-fish-configuration
|
||||||
|
,home-fish-configuration-fields))
|
||||||
|
'home-fish-configuration)
|
||||||
|
"\n\n"
|
||||||
|
(generate-documentation
|
||||||
|
`((home-fish-extension
|
||||||
|
,home-fish-extension-fields))
|
||||||
|
'home-fish-extension)))
|
||||||
|
|
Loading…
Reference in New Issue