301 lines
8.5 KiB
Bash
301 lines
8.5 KiB
Bash
|
# 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 <Shift-Tab> 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
|
||
|
# <Tab><Tab><Ctrl-C>
|
||
|
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"
|