summaryrefslogtreecommitdiff
path: root/gnu/home-services/shells.scm
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/home-services/shells.scm')
-rw-r--r--gnu/home-services/shells.scm634
1 files changed, 0 insertions, 634 deletions
diff --git a/gnu/home-services/shells.scm b/gnu/home-services/shells.scm
deleted file mode 100644
index ecb02098f7..0000000000
--- a/gnu/home-services/shells.scm
+++ /dev/null
@@ -1,634 +0,0 @@
-;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2021 Andrew Tropin <andrew@trop.in>
-;;; Copyright © 2021 Xinglu Chen <public@yoctocell.xyz>
-;;;
-;;; This file is part of GNU Guix.
-;;;
-;;; GNU Guix is free software; you can redistribute it and/or modify it
-;;; under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 3 of the License, or (at
-;;; your option) any later version.
-;;;
-;;; GNU Guix is distributed in the hope that it will be useful, but
-;;; WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
-
-(define-module (gnu home-services shells)
- #:use-module (gnu services configuration)
- #:use-module (gnu home-services configuration)
- #:use-module (gnu home-services utils)
- #:use-module (gnu home-services)
- #:use-module (gnu packages shells)
- #:use-module (gnu packages bash)
- #:use-module (guix gexp)
- #:use-module (guix packages)
- #:use-module (srfi srfi-1)
- #:use-module (srfi srfi-26)
- #:use-module (ice-9 match)
-
- #:export (home-shell-profile-service-type
- home-shell-profile-configuration
-
- home-bash-service-type
- home-bash-configuration
- home-bash-extension
-
- home-zsh-service-type
- home-zsh-configuration
- home-zsh-extension
-
- home-fish-service-type
- home-fish-configuration
- home-fish-extension))
-
-;;; Commentary:
-;;;
-;;; This module contains shell related services like Zsh.
-;;;
-;;; Code:
-
-
-;;;
-;;; Shell profile.
-;;;
-
-(define path? string?)
-(define (serialize-path field-name val) val)
-
-(define-configuration home-shell-profile-configuration
- (profile
- (text-config '())
- "\
-@code{home-shell-profile} is instantiated automatically by
-@code{home-environment}, DO NOT create this service manually, it can
-only be extended.
-
-@code{profile} is a list of strings or gexps, which will go to
-@file{~/.profile}. By default @file{~/.profile} contains the
-initialization code, which have to be evaluated by login shell to make
-home-environment's profile avaliable to the user, but other commands
-can be added to the file if it is really necessary.
-
-In most cases shell's configuration files are preferred places for
-user's customizations. Extend home-shell-profile service only if you
-really know what you do."))
-
-(define (add-shell-profile-file config)
- `(("profile"
- ,(mixed-text-file
- "shell-profile"
- "\
-HOME_ENVIRONMENT=$HOME/.guix-home
-. $HOME_ENVIRONMENT/setup-environment
-$HOME_ENVIRONMENT/on-first-login\n"
- (serialize-configuration
- config
- (filter-configuration-fields
- home-shell-profile-configuration-fields '(profile)))))))
-
-(define (add-profile-extensions config extensions)
- (home-shell-profile-configuration
- (inherit config)
- (profile
- (append (home-shell-profile-configuration-profile config)
- extensions))))
-
-(define home-shell-profile-service-type
- (service-type (name 'home-shell-profile)
- (extensions
- (list (service-extension
- home-files-service-type
- add-shell-profile-file)))
- (compose concatenate)
- (extend add-profile-extensions)
- (default-value (home-shell-profile-configuration))
- (description "Create @file{~/.profile}, which is used
-for environment initialization of POSIX compliant login shells. This
-service type can be extended with a list of strings or gexps.")))
-
-(define (serialize-boolean field-name val) "")
-(define (serialize-posix-env-vars field-name val)
- #~(string-append
- #$@(map
- (match-lambda
- ((key . #f)
- "")
- ((key . #t)
- #~(string-append "export " #$key "\n"))
- ((key . value)
- #~(string-append "export " #$key "=" #$value "\n")))
- val)))
-
-
-;;;
-;;; Zsh.
-;;;
-
-(define-configuration home-zsh-configuration
- (package
- (package zsh)
- "The Zsh package to use.")
- (xdg-flavor?
- (boolean #t)
- "Place all the configs to @file{$XDG_CONFIG_HOME/zsh}. Makes
-@file{~/.zshenv} to set @env{ZDOTDIR} to @file{$XDG_CONFIG_HOME/zsh}.
-Shell startup process will continue with
-@file{$XDG_CONFIG_HOME/zsh/.zshenv}.")
- (environment-variables
- (alist '())
- "Association list of environment variables to set for the Zsh session."
- serialize-posix-env-vars)
- (zshenv
- (text-config '())
- "List of strings or gexps, which will be added to @file{.zshenv}.
-Used for setting user's shell environment variables. Must not contain
-commands assuming the presence of tty or producing output. Will be
-read always. Will be read before any other file in @env{ZDOTDIR}.")
- (zprofile
- (text-config '())
- "List of strings or gexps, which will be added to @file{.zprofile}.
-Used for executing user's commands at start of login shell (In most
-cases the shell started on tty just after login). Will be read before
-@file{.zlogin}.")
- (zshrc
- (text-config '())
- "List of strings or gexps, which will be added to @file{.zshrc}.
-Used for executing user's commands at start of interactive shell (The
-shell for interactive usage started by typing @code{zsh} or by
-terminal app or any other program).")
- (zlogin
- (text-config '())
- "List of strings or gexps, which will be added to @file{.zlogin}.
-Used for executing user's commands at the end of starting process of
-login shell.")
- (zlogout
- (text-config '())
- "List of strings or gexps, which will be added to @file{.zlogout}.
-Used for executing user's commands at the exit of login shell. It
-won't be read in some cases (if the shell terminates by exec'ing
-another process for example)."))
-
-(define (add-zsh-configuration config)
- (let* ((xdg-flavor? (home-zsh-configuration-xdg-flavor? config)))
-
- (define prefix-file
- (cut string-append
- (if xdg-flavor?
- "config/zsh/."
- "") <>))
-
- (define (filter-fields field)
- (filter-configuration-fields home-zsh-configuration-fields
- (list field)))
-
- (define (serialize-field field)
- (serialize-configuration
- config
- (filter-fields field)))
-
- (define (file-if-not-empty field)
- (let ((file-name (symbol->string field))
- (field-obj (car (filter-fields field))))
- (if (not (null? ((configuration-field-getter field-obj) config)))
- `(,(prefix-file file-name)
- ,(mixed-text-file
- file-name
- (serialize-field field)))
- '())))
-
- (filter
- (compose not null?)
- `(,(if xdg-flavor?
- `("zshenv"
- ,(mixed-text-file
- "auxiliary-zshenv"
- (if xdg-flavor?
- "source ${XDG_CONFIG_HOME:-$HOME/.config}/zsh/.zshenv\n"
- "")))
- '())
- (,(prefix-file "zshenv")
- ,(mixed-text-file
- "zshenv"
- (if xdg-flavor?
- "export ZDOTDIR=${XDG_CONFIG_HOME:-$HOME/.config}/zsh\n"
- "")
- (serialize-field 'zshenv)
- (serialize-field 'environment-variables)))
- (,(prefix-file "zprofile")
- ,(mixed-text-file
- "zprofile"
- "\
-# Setups system and user profiles and related variables
-source /etc/profile
-# Setups home environment profile
-source ~/.profile
-
-# It's only necessary if zsh is a login shell, otherwise profiles will
-# be already sourced by bash
-"
- (serialize-field 'zprofile)))
-
- ,@(list (file-if-not-empty 'zshrc)
- (file-if-not-empty 'zlogin)
- (file-if-not-empty 'zlogout))))))
-
-(define (add-zsh-packages config)
- (list (home-zsh-configuration-package config)))
-
-(define-configuration/no-serialization home-zsh-extension
- (environment-variables
- (alist '())
- "Association list of environment variables to set.")
- (zshrc
- (text-config '())
- "List of strings or gexps.")
- (zshenv
- (text-config '())
- "List of strings or gexps.")
- (zprofile
- (text-config '())
- "List of strings or gexps.")
- (zlogin
- (text-config '())
- "List of strings or gexps.")
- (zlogout
- (text-config '())
- "List of strings or gexps."))
-
-(define (home-zsh-extensions original-config extension-configs)
- (home-zsh-configuration
- (inherit original-config)
- (environment-variables
- (append (home-zsh-configuration-environment-variables original-config)
- (append-map
- home-zsh-extension-environment-variables extension-configs)))
- (zshrc
- (append (home-zsh-configuration-zshrc original-config)
- (append-map
- home-zsh-extension-zshrc extension-configs)))
- (zshenv
- (append (home-zsh-configuration-zshenv original-config)
- (append-map
- home-zsh-extension-zshenv extension-configs)))
- (zprofile
- (append (home-zsh-configuration-zprofile original-config)
- (append-map
- home-zsh-extension-zprofile extension-configs)))
- (zlogin
- (append (home-zsh-configuration-zlogin original-config)
- (append-map
- home-zsh-extension-zlogin extension-configs)))
- (zlogout
- (append (home-zsh-configuration-zlogout original-config)
- (append-map
- home-zsh-extension-zlogout extension-configs)))))
-
-(define home-zsh-service-type
- (service-type (name 'home-zsh)
- (extensions
- (list (service-extension
- home-files-service-type
- add-zsh-configuration)
- (service-extension
- home-profile-service-type
- add-zsh-packages)))
- (compose identity)
- (extend home-zsh-extensions)
- (default-value (home-zsh-configuration))
- (description "Install and configure Zsh.")))
-
-
-;;;
-;;; Bash.
-;;;
-
-(define-configuration home-bash-configuration
- (package
- (package bash)
- "The Bash package to use.")
- (guix-defaults?
- (boolean #t)
- "Add sane defaults like reading @file{/etc/bashrc}, coloring output
-for @code{ls} provided by guix to @file{.bashrc}.")
- (environment-variables
- (alist '())
- "Association list of environment variables to set for the Bash session."
- serialize-posix-env-vars)
- (bash-profile
- (text-config '())
- "List of strings or gexps, which will be added to @file{.bash_profile}.
-Used for executing user's commands at start of login shell (In most
-cases the shell started on tty just after login). @file{.bash_login}
-won't be ever read, because @file{.bash_profile} always present.")
- (bashrc
- (text-config '())
- "List of strings or gexps, which will be added to @file{.bashrc}.
-Used for executing user's commands at start of interactive shell (The
-shell for interactive usage started by typing @code{bash} or by
-terminal app or any other program).")
- (bash-logout
- (text-config '())
- "List of strings or gexps, which will be added to @file{.bash_logout}.
-Used for executing user's commands at the exit of login shell. It
-won't be read in some cases (if the shell terminates by exec'ing
-another process for example)."))
-
-;; TODO: Use value from (gnu system shadow)
-(define guix-bashrc
- "\
-# Bash initialization for interactive non-login shells and
-# for remote shells (info \"(bash) Bash Startup Files\").
-
-# Export 'SHELL' to child processes. Programs such as 'screen'
-# honor it and otherwise use /bin/sh.
-export SHELL
-
-if [[ $- != *i* ]]
-then
- # We are being invoked from a non-interactive shell. If this
- # is an SSH session (as in \"ssh host command\"), source
- # /etc/profile so we get PATH and other essential variables.
- [[ -n \"$SSH_CLIENT\" ]] && source /etc/profile
-
- # Don't do anything else.
- return
-fi
-
-# Source the system-wide file.
-source /etc/bashrc
-
-# Adjust the prompt depending on whether we're in 'guix environment'.
-if [ -n \"$GUIX_ENVIRONMENT\" ]
-then
- PS1='\\u@\\h \\w [env]\\$ '
-else
- PS1='\\u@\\h \\w\\$ '
-fi
-alias ls='ls -p --color=auto'
-alias ll='ls -l'
-alias grep='grep --color=auto'\n")
-
-(define (add-bash-configuration config)
- (define (filter-fields field)
- (filter-configuration-fields home-bash-configuration-fields
- (list field)))
-
- (define (serialize-field field)
- (serialize-configuration
- config
- (filter-fields field)))
-
- (define* (file-if-not-empty field #:optional (extra-content #f))
- (let ((file-name (symbol->string field))
- (field-obj (car (filter-fields field))))
- (if (or extra-content
- (not (null? ((configuration-field-getter field-obj) config))))
- `(,(object->snake-case-string file-name)
- ,(mixed-text-file
- (object->snake-case-string file-name)
- (if extra-content extra-content "")
- (serialize-field field)))
- '())))
-
- (filter
- (compose not null?)
- `(("bash_profile"
- ,(mixed-text-file
- "bash_profile"
- "\
-# Setups system and user profiles and related variables
-# /etc/profile will be sourced by bash automatically
-# Setups home environment profile
-if [ -f ~/.profile ]; then source ~/.profile; fi
-
-# Honor per-interactive-shell startup file
-if [ -f ~/.bashrc ]; then source ~/.bashrc; fi
-"
- (serialize-field 'bash-profile)
- (serialize-field 'environment-variables)))
-
- ,@(list (file-if-not-empty
- 'bashrc
- (if (home-bash-configuration-guix-defaults? config)
- guix-bashrc
- #f))
- (file-if-not-empty 'bash-logout)))))
-
-(define (add-bash-packages config)
- (list (home-bash-configuration-package config)))
-
-(define-configuration/no-serialization home-bash-extension
- (environment-variables
- (alist '())
- "Association list of environment variables to set.")
- (bash-profile
- (text-config '())
- "List of strings or gexps.")
- (bashrc
- (text-config '())
- "List of strings or gexps.")
- (bash-logout
- (text-config '())
- "List of strings or gexps."))
-
-(define (home-bash-extensions original-config extension-configs)
- (home-bash-configuration
- (inherit original-config)
- (environment-variables
- (append (home-bash-configuration-environment-variables original-config)
- (append-map
- home-bash-extension-environment-variables extension-configs)))
- (bash-profile
- (append (home-bash-configuration-bash-profile original-config)
- (append-map
- home-bash-extension-bash-profile extension-configs)))
- (bashrc
- (append (home-bash-configuration-bashrc original-config)
- (append-map
- home-bash-extension-bashrc extension-configs)))
- (bash-logout
- (append (home-bash-configuration-bash-logout original-config)
- (append-map
- home-bash-extension-bash-logout extension-configs)))))
-
-(define home-bash-service-type
- (service-type (name 'home-bash)
- (extensions
- (list (service-extension
- home-files-service-type
- add-bash-configuration)
- (service-extension
- home-profile-service-type
- add-bash-packages)))
- (compose identity)
- (extend home-bash-extensions)
- (default-value (home-bash-configuration))
- (description "Install and configure GNU Bash.")))
-
-
-;;;
-;;; Fish.
-;;;
-
-(define (serialize-fish-aliases field-name val)
- #~(string-append
- #$@(map (match-lambda
- ((key . value)
- #~(string-append "alias " #$key " \"" #$value "\"\n"))
- (_ ""))
- val)))
-
-(define (serialize-fish-abbreviations field-name val)
- #~(string-append
- #$@(map (match-lambda
- ((key . value)
- #~(string-append "abbr --add " #$key " " #$value "\n"))
- (_ ""))
- val)))
-
-(define (serialize-fish-env-vars field-name val)
- #~(string-append
- #$@(map (match-lambda
- ((key . #f)
- "")
- ((key . #t)
- #~(string-append "set " #$key "\n"))
- ((key . value)
- #~(string-append "set " #$key " " #$value "\n")))
- val)))
-
-(define-configuration home-fish-configuration
- (package
- (package fish)
- "The Fish package to use.")
- (config
- (text-config '())
- "List of strings or gexps, which will be added to
-@file{$XDG_CONFIG_HOME/fish/config.fish}.")
- (environment-variables
- (alist '())
- "Association list of environment variables to set in Fish."
- 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."
- serialize-fish-aliases)
- (abbreviations
- (alist '())
- "Association list of abbreviations for Fish. These are words that,
-when typed in the shell, will automatically expand to the full text."
- serialize-fish-abbreviations))
-
-(define (fish-files-service config)
- `(("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 strings or gexps for extending the Fish initialization file.")
- (environment-variables
- (alist '())
- "Association list of environment variables to set.")
- (aliases
- (alist '())
- "Association list of Fish aliases.")
- (abbreviations
- (alist '())
- "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-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-shell-profile-documentation)
- (generate-documentation
- `((home-shell-profile-configuration
- ,home-shell-profile-configuration-fields))
- 'home-shell-profile-configuration))
-
-(define (generate-home-bash-documentation)
- (generate-documentation
- `((home-bash-configuration
- ,home-bash-configuration-fields))
- 'home-bash-configuration))
-
-(define (generate-home-zsh-documentation)
- (generate-documentation
- `((home-zsh-configuration
- ,home-zsh-configuration-fields))
- 'home-zsh-configuration))
-
-(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)))