From 4495ee1d3d66fc993fbb844897b7e9342a8aab24 Mon Sep 17 00:00:00 2001 From: Renken Date: Wed, 7 Sep 2022 16:25:36 +0200 Subject: home: configure zsh --- nichijou/home/config/zsh/zlogout | 8 + nichijou/home/config/zsh/zprofile | 50 +++++++ nichijou/home/config/zsh/zshrc | 300 ++++++++++++++++++++++++++++++++++++++ nichijou/home/zsh.scm | 20 +++ 4 files changed, 378 insertions(+) create mode 100644 nichijou/home/config/zsh/zlogout create mode 100644 nichijou/home/config/zsh/zprofile create mode 100644 nichijou/home/config/zsh/zshrc create mode 100644 nichijou/home/zsh.scm diff --git a/nichijou/home/config/zsh/zlogout b/nichijou/home/config/zsh/zlogout new file mode 100644 index 0000000..83361fd --- /dev/null +++ b/nichijou/home/config/zsh/zlogout @@ -0,0 +1,8 @@ +# ~/.zshlogout: executed by zsh(1) when login shell exits. + +# when leaving the console clear the screen to increase privacy +if [ "$SHLVL" = 1 ]; then + # XXX: Avoid hard-coding the path? + # [ -x /usr/bin/clear_console ] && /usr/bin/clear_console -q + hash clear_console && clear_console -q +fi diff --git a/nichijou/home/config/zsh/zprofile b/nichijou/home/config/zsh/zprofile new file mode 100644 index 0000000..a59b620 --- /dev/null +++ b/nichijou/home/config/zsh/zprofile @@ -0,0 +1,50 @@ +# set PATH so it includes user's private bin if it exists +PATH="$PATH:/usr/sbin" + +# set PATH so it includes user's private bin if it exists +if [ -d "$HOME/bin" ] ; then + PATH="$HOME/bin:$PATH" +fi + +# set PATH so it includes user's private bin if it exists +if [ -d "$HOME/.local/bin" ] ; then + PATH="$HOME/.local/bin:$PATH" +fi + +export LESS_TERMCAP_md=$'\e[01;31m' +export LESS_TERMCAP_me=$'\e[0m' +export LESS_TERMCAP_se=$'\e[0m' +export LESS_TERMCAP_so=$'\e[01;44;33m' +export LESS_TERMCAP_ue=$'\e[0m' +export LESS_TERMCAP_us=$'\e[01;32m' + +export EDITOR=nvim +export VISUAL=nvim +export MANPAGER='nvim +Man!' +export MANWIDTH=999 +export GOPATH=$HOME/go + +# set PATH so it includes Golang's private bin if it exists +if [ -d "$GOPATH/bin" ] ; then + PATH="$GOPATH/bin:$PATH" +fi + +# set PATH so it includes Golang's private bin if it exists +if [ -d "$HOME/.cargo/bin" ] ; then + PATH="$HOME/cargo/bin:$PATH" +fi + +# Arrange so that ~/.config/guix/current comes first. +for profile in "$HOME/.guix-profile" "$HOME/.config/guix/current" +do + if [ -f "$profile/etc/profile" ] + then + # Load the user profile's settings. + GUIX_PROFILE="$profile" ; \ + . "$profile/etc/profile" + else + # At least define this one so that basic things just work + # when the user installs their first package. + export PATH="$profile/bin:$PATH" + fi +done diff --git a/nichijou/home/config/zsh/zshrc b/nichijou/home/config/zsh/zshrc new file mode 100644 index 0000000..194f3d6 --- /dev/null +++ b/nichijou/home/config/zsh/zshrc @@ -0,0 +1,300 @@ +# If not running interactively, don't do anything +case $- in + *i*) ;; + *) return;; +esac + +# Allow for substitutions inside prompt, necessary for e.g. git prompts. +setopt PROMPT_SUBST + +# Enable zsh's generic vcs info. +autoload -Uz vcs_info +precmd () { vcs_info } +zstyle ':vcs_info:*' formats ' (%F{cyan}%b%f)' +PS1='%B%F{green}%n@%m%f%b:%B%F{blue}%~%f$vcs_info_msg_0_%b%(!.#.$) ' + +setopt histignorealldups +setopt sharehistory +# Experimental options. +setopt extended_history +setopt hist_ignore_all_dups +setopt hist_ignore_space +setopt hist_reduce_blanks +# Writing the directory name only will cd to it. +setopt auto_cd +# Do not move cursor to the end of line on completion. +setopt complete_in_word +# Allow comments in interactive shell. +setopt interactive_comments +# Disable beep. +unsetopt beep +# Do not autocorrect spelling for arguments. +unsetopt correct +unsetopt correct_all + +# Remove duplicate paths. +typeset -U PATH + +# Keep 10000 lines of history within the shell and save it to ~/.zsh_history. +HISTSIZE=10000 +SAVEHIST=10000 +HISTFILE=~/.zsh_history + +# Use modern completion system. +autoload -Uz compinit +compinit +# Also complete bash-specific completions. +autoload -U bashcompinit +bashcompinit + +zstyle ':completion:*' auto-description 'specify: %d' +zstyle ':completion:*' completer _expand _complete _correct _approximate +zstyle ':completion:*' format 'Completing %d' +zstyle ':completion:*' group-name '' +zstyle ':completion:*' menu select=2 +eval "$(dircolors -b)" +zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS} +zstyle ':completion:*' list-colors '' +zstyle ':completion:*' list-prompt \ + %SAt %p: Hit TAB for more, or the character to insert%s +zstyle ':completion:*' matcher-list '' 'm:{a-z}={A-Z}' 'm:{a-zA-Z}={A-Za-z}' \ + 'r:|[._-]=* r:|=* l:|=*' +zstyle ':completion:*' menu select=long +zstyle ':completion:*' select-prompt \ + %SScrolling active: current selection at %p%s +zstyle ':completion:*' use-compctl false +zstyle ':completion:*' verbose true + +zstyle ':completion:*:*:kill:*:processes' list-colors '=(#b) #([0-9]#)*=0=01;31' +zstyle ':completion:*:kill:*' command 'ps -u $USER -o pid,%cpu,tty,cputime,cmd' + +# Source useful defaults. +source /usr/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh +source /usr/share/doc/fzf/examples/key-bindings.zsh +source /usr/share/doc/fzf/examples/completion.zsh +source /usr/share/zsh-autosuggestions/zsh-autosuggestions.zsh + +# Editor and input char assignment. +[[ ${TERM} != 'dumb' ]] && () { + + # Use human-friendly identifiers. + zmodload -F zsh/terminfo +b:echoti +p:terminfo + typeset -gA key_info + key_info=( + 'Control' '\C-' + 'ControlLeft' '\e[1;5D \e[5D \e\e[D \eOd \eOD' + 'ControlRight' '\e[1;5C \e[5C \e\e[C \eOc \eOC' + 'Escape' '\e' + 'Meta' '\M-' + 'Backspace' "${terminfo[kbs]}" + 'BackTab' "${terminfo[kcbt]}" + 'Left' "${terminfo[kcub1]}" + 'Down' "${terminfo[kcud1]}" + 'Right' "${terminfo[kcuf1]}" + 'Up' "${terminfo[kcuu1]}" + 'Delete' "${terminfo[kdch1]}" + 'End' "${terminfo[kend]}" + 'F1' "${terminfo[kf1]}" + 'F2' "${terminfo[kf2]}" + 'F3' "${terminfo[kf3]}" + 'F4' "${terminfo[kf4]}" + 'F5' "${terminfo[kf5]}" + 'F6' "${terminfo[kf6]}" + 'F7' "${terminfo[kf7]}" + 'F8' "${terminfo[kf8]}" + 'F9' "${terminfo[kf9]}" + 'F10' "${terminfo[kf10]}" + 'F11' "${terminfo[kf11]}" + 'F12' "${terminfo[kf12]}" + 'Home' "${terminfo[khome]}" + 'Insert' "${terminfo[kich1]}" + 'PageDown' "${terminfo[knp]}" + 'PageUp' "${terminfo[kpp]}" + ) + + # Bind the keys. + local key + for key (${(s: :)key_info[ControlLeft]}) bindkey ${key} backward-word + for key (${(s: :)key_info[ControlRight]}) bindkey ${key} forward-word + + if [[ -n ${key_info[Home]} ]]; then + bindkey ${key_info[Home]} beginning-of-line + fi + if [[ -n ${key_info[End]} ]] bindkey ${key_info[End]} end-of-line + + if [[ -n ${key_info[PageUp]} ]]; then + bindkey ${key_info[PageUp]} up-line-or-history + fi + if [[ -n ${key_info[PageDown]} ]]; then + bindkey ${key_info[PageDown]} down-line-or-history + fi + + if [[ -n ${key_info[Insert]} ]]; then + bindkey ${key_info[Insert]} overwrite-mode + fi + + if [[ -n ${key_info[Backspace]} ]]; then + bindkey ${key_info[Backspace]} backward-delete-char + fi + if [[ -n ${key_info[Delete]} ]] bindkey ${key_info[Delete]} delete-char + + if [[ -n ${key_info[Left]} ]] bindkey ${key_info[Left]} backward-char + if [[ -n ${key_info[Right]} ]] bindkey ${key_info[Right]} forward-char + + if [[ -n ${key_info[Up]} ]] bindkey ${key_info[Up]} history-search-backward + if [[ -n ${key_info[Down]} ]] bindkey ${key_info[Down]} history-search-forward + + # Expandpace. + bindkey ' ' magic-space + + # Clear. + bindkey "${key_info[Control]}L" clear-screen + + # Bind to go to the previous menu item. + if [[ -n ${key_info[BackTab]} ]]; then + bindkey ${key_info[BackTab]} reverse-menu-complete + fi + + # Use smart URL pasting and escaping. + autoload -Uz bracketed-paste-url-magic \ + && zle -N bracketed-paste bracketed-paste-url-magic + autoload -Uz url-quote-magic && zle -N self-insert url-quote-magic + + if zstyle -t ':zim:input' double-dot-expand; then + double-dot-expand() { + if [[ ${LBUFFER} == *.. ]]; then + LBUFFER+='/..' + else + LBUFFER+='.' + fi + } + zle -N double-dot-expand + bindkey '.' double-dot-expand + bindkey -M isearch '.' self-insert + fi + + autoload -Uz is-at-least && if ! is-at-least 5.3; then + # Redisplay after completing, and avoid blank prompt after + # + expand-or-complete-with-redisplay() { + print -Pn '...' + zle expand-or-complete + zle redisplay + } + zle -N expand-or-complete-with-redisplay + bindkey "${key_info[Control]}I" \ + expand-or-complete-with-redisplay + fi + + # Put into application mode and validate ${terminfo} + zle-line-init() { + if (( ${+terminfo[smkx]} )) echoti smkx + } + zle-line-finish() { + if (( ${+terminfo[rmkx]} )) echoti rmkx + } + zle -N zle-line-init + zle -N zle-line-finish +} + +# Color support +alias ls='ls --group-directories-first --color=auto' +alias grep='grep --color=auto' + +# Grep in a directory +alias grepd='grep -rIin' + +# List only directories and symbolic links that point to directories. +alias lsd='ls -ld *(-/DN)' + +# List all files. +alias l='ls -lhA --time-style=long-iso' +alias ll='ls -lh --time-style=long-iso' + +# Colored GCC warnings and errors +export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;'\ +'32:locus=01:quote=01' + +# Recursively finds all occurrence that satisfies the given expression +f() +{ + find . -iname "*${*}*" +} + +# Do not force window, useful for terminal use. +# TODO: Can it be turned into a config file instead? +alias mpv='mpv --force-window=no' + +# Use clipboard selection instead of default primary. +alias xclip='xclip -selection clipboard' + +# Ask before overwriting. Add a character to prove you are sure of your actions. +alias mvf=mv +alias mv='mv -i' +alias rmf=rm +alias rm='rm -i' + +# I'd rather use nvim for everything. +alias vim=nvim +alias vimdiff='nvim -d' + +# Recursively rsync the given path. +alias rsyncc='rsync --info=progress2 -avz' + +# Download youtube playlist in a sorted manner +# TODO: update +alias youtube-dl-ordered='youtube-dl -i -o +"%(playlist_index)s-%(title)s.%(ext)s"' + +# Open the todo.txt file +# This and track can be updated to use xdg documents path if others find them +# useful as well. +alias todo='$EDITOR ~/doc/txt/todo.txt' + +# Load keyboard kernel object for colors and brightness control. +# TODO: Use the deb instead or dkms. +alias keyboard='cd ~/dev/github/tuxedo-keyboard/src; sudo insmod ./*.ko; cd' + +# Switch to games-specific user fast. +alias vidya='xhost +si:localuser:vidya && sudo -u vidya -i' + +# Switch 4k monitor resolution to 720p before switching to vidya then switching +# back to 4k after gaming is done. +alias steam='xrandr --output DP-1 --mode 1280x720 --rate 60; vidya; +xrandr --output DP-1 --mode 3840x2160 --rate 60' + +# Prefer cantata-based radio to this +# Plays an online stream using mpv and records it. +# $1 Stream link. +# $2 File path. +radio() +{ + curl -l "$1" | tee "$2" | mpv - +} + +# Silly tracking. +track() +{ + echo "$(date)> $1" >>~/doc/txt/log.txt +} + +# Records microphone locally. +recordmic() +{ + ffmpeg -f pulse -i alsa_input.pci-0000_00_1f.3.analog-stereo -f pulse \ + -i alsa_output.pci-0000_00_1f.3.analog-stereo.monitor -map 0:0 \ + -map 1:0 "$HOME/tv/record/$1.ogg" +} + +# Records audio output. +record() +{ + ffmpeg -f pulse \ + -i alsa_output.pci-0000_00_1f.3.analog-stereo.monitor -map 0:0 \ + "$HOME/tv/record/$1.ogg" +} + +# TODO: load dz keyboard layout properly using setxkbmap +# Maybe should be somewhere else e.g., .profile? or somewhere system-wide + +export PATH="$HOME/.poetry/bin:$PATH" diff --git a/nichijou/home/zsh.scm b/nichijou/home/zsh.scm new file mode 100644 index 0000000..11f973c --- /dev/null +++ b/nichijou/home/zsh.scm @@ -0,0 +1,20 @@ +(define-module (nichijou home zsh) + #:use-module (gnu home services shells) + #:use-module (gnu services) + #:use-module (gnu packages shellutils) + #:use-module (gnu packages terminals) + #:use-module (guix gexp) + #:use-module (ice-9 optargs)) + +(define-public packages + (list zsh-syntax-highlighting zsh-autosuggestions fzf)) + +(define-public services + (list (service home-zsh-service-type + (home-zsh-configuration (xdg-flavor? #t) + (zprofile (list (local-file + "config/zsh/zprofile"))) + (zlogout (list (local-file + "config/zsh/zlogout"))) + (zshrc (list (local-file + "config/zsh/zshrc"))))))) -- cgit v1.2.3