dotfiles/fish/.config/fish/config.fish

395 lines
13 KiB
Fish

set PATH {$HOME}/.nix-profile/bin {$HOME}/.cargo/bin {$HOME}/.cabal/bin {$HOME}/.local/bin $PATH
set -gx TERM xterm-kitty
set -gx NIX_PATH {$HOME}/.nix-defexpr/channels
export MANPAGER='nvim +Man!'
export NIX_SSL_CERT_FILE='/etc/ssl/certs/ca-certificates.crt'
if [ -n "$NVIM_LISTEN_ADDRESS" ]
export VISUAL="nvr"
export EDITOR="nvr"
else
export VISUAL="nvim"
export EDITOR="nvim"
end
alias b="cd .."
alias c="clear"
alias v="nvim"
alias tksa="tmux kill-session -a"
alias tks="tmux kill-server"
alias tat="tmux attach -t "
alias tls="tmux ls"
alias vf="v (fzf)"
alias cs="cscope -bqR"
alias cat="bat"
alias t="tokei ."
alias gst="gst-inspect-1.0"
alias gsl="gst-launch-1.0"
alias sds="systemctl status "
alias sde="systemctl enable "
alias sdd="systemctl disable "
alias sfc="source ~/.config/fish/config.fish"
alias icat="kitty +kitten icat (fzf)"
# emacs org
alias e="emacsclient"
alias ej="emacsclient ~/org/journal.org"
alias en="emacsclient ~/org/notes.org"
alias ep="emacsclient ~/org/projects.org"
alias et="emacsclient ~/org/todo.org"
# Git helpers
alias vg="vgrep"
alias vs="vgrep -s"
# Open fugitive with nvim directly
alias gn="nvim +Git +only"
# Branch (b)
alias gb='git branch'
alias gba='git branch --all --verbose'
alias gbc='git checkout -b'
alias gbd='git branch --delete'
alias gbD='git branch --delete --force'
alias gbl='git branch --verbose'
alias gbL='git branch --all --verbose'
alias gbm='git branch --move'
alias gbM='git branch --move --force'
alias gbr='git branch --move'
alias gbR='git branch --move --force'
alias gbs='git show-branch'
alias gbS='git show-branch --all'
alias gbv='git branch --verbose'
alias gbV='git branch --verbose --verbose'
alias gbx='git branch --delete'
alias gbX='git branch --delete --force'
# Commit (c)
alias gc='git commit --verbose'
alias gca='git commit --verbose --all'
alias gcm='git commit --message'
alias gcS='git commit -s --verbose'
alias gcSa='git commit -s --verbose --all'
alias gcSm='git commit -s --message'
alias gcam='git commit --all --message'
alias gco='git checkout'
alias gcO='git checkout --patch'
alias gcf='git commit --amend --reuse-message HEAD'
alias gcSf='git commit -S --amend --reuse-message HEAD'
alias gcF='git commit --verbose --amend'
alias gcSF='git commit -S --verbose --amend'
alias gcp='git cherry-pick --ff'
alias gcP='git cherry-pick --no-commit'
alias gcr='git revert'
alias gcR='git reset HEAD^'
alias gcs='git show'
alias gcsS='git show --pretty=short --show-signature'
alias gcl='git-commit-lost'
alias gcy='git cherry -v --abbrev'
alias gcY='git cherry -v'
# Conflict (C)
alias gCl='git --no-pager diff --name-only --diff-filter=U'
alias gCa='git add (gCl)'
alias gCe='git mergetool (gCl)'
alias gCo='git checkout --ours --'
alias gCO='gCo (gCl)'
alias gCt='git checkout --theirs --'
alias gCT='gCt (gCl)'
# Data (d)
alias gd='git ls-files'
alias gdc='git ls-files --cached'
alias gdx='git ls-files --deleted'
alias gdm='git ls-files --modified'
alias gdu='git ls-files --other --exclude-standard'
alias gdk='git ls-files --killed'
# Fetch (f)
alias gf='git fetch'
alias gfa='git fetch --all'
alias gfc='git clone'
alias gfcr='git clone --recurse-submodules'
alias gfm='git pull'
alias gfr='git pull --rebase'
# Grep (g)
alias gg='git grep'
alias ggi='git grep --ignore-case'
alias ggl='git grep --files-with-matches'
alias ggL='git grep --files-without-matches'
alias ggv='git grep --invert-match'
alias ggw='git grep --word-regexp'
# Index (i)
alias gia='git add'
alias giA='git add .'
alias gip='git add --patch'
alias giu='git add --update'
alias gid='git diff --no-ext-diff --cached'
alias giD='git diff --no-ext-diff --cached --word-diff'
alias gii='git update-index --assume-unchanged'
alias giI='git update-index --no-assume-unchanged'
alias gir='git reset'
alias giR='git reset --patch'
alias gix='git rm -r --cached'
alias giX='git rm -rf --cached'
# Log (l)
alias gl='git log --topo-order --pretty=medium'
alias glf='git log --topo-order --stat --pretty=fuller'
alias gls='git log --topo-order --stat --pretty=medium'
alias gld='git log --topo-order --stat --patch --full-diff --pretty=medium'
alias glo='git log --topo-order --pretty=oneline'
alias glg='git log --topo-order --all --graph --pretty=oneline'
alias glc='git shortlog --summary --numbered'
alias glS='git log --show-signature'
# Merge (m)
alias gm='git merge'
alias gmC='git merge --no-commit'
alias gmF='git merge --no-ff'
alias gma='git merge --abort'
alias gmt='git mergetool'
# Push (p)
alias gp='git push'
alias gpf='git push --force-with-lease'
alias gpF='git push --force'
alias gpa='git push --all'
alias gpA='git push --all && git push --tags'
alias gpt='git push --tags'
alias gpc='git push --set-upstream origin (git-branch-current 2> /dev/null)'
alias gpp='git pull origin (git-branch-current 2> /dev/null) && git push origin (git-branch-current 2> /dev/null)'
# Rebase (r)
alias gr='git rebase'
alias gra='git rebase --abort'
alias grc='git rebase --continue'
alias gri='git rebase --interactive'
alias grs='git rebase --skip'
# Remote (R)
alias gR='git remote'
alias gRl='git remote --verbose'
alias gRa='git remote add'
alias gRx='git remote rm'
alias gRm='git remote rename'
alias gRu='git remote update'
alias gRp='git remote prune'
alias gRs='git remote show'
alias gRb='git-hub-browse'
# Stash (s)
alias gs='git stash'
alias gsa='git stash apply'
alias gsx='git stash drop'
alias gsX='git-stash-clear-interactive'
alias gsl='git stash list'
alias gsL='git-stash-dropped'
alias gsd='git stash show --patch --stat'
alias gsp='git stash pop'
alias gsr='git-stash-recover'
alias gss='git stash save --include-untracked'
alias gsS='git stash save --patch --no-keep-index'
alias gsw='git stash save --include-untracked --keep-index'
# Submodule (S)
alias gS='git submodule'
alias gSa='git submodule add'
alias gSf='git submodule foreach'
alias gSi='git submodule init'
alias gSI='git submodule update --init --recursive'
alias gSl='git submodule status'
alias gSm='git-submodule-move'
alias gSs='git submodule sync'
alias gSu='git submodule foreach git pull origin master'
alias gSx='git-submodule-remove'
# Tag (t)
alias gt='git tag'
alias gtl='git tag -l'
alias gts='git tag -s'
alias gtv='git verify-tag'
# Working Copy (w)
alias gwS='git status --ignore-submodules=none --short'
alias gws='git status --ignore-submodules=none'
alias gwd='git diff --no-ext-diff'
alias gwD='git diff --no-ext-diff --word-diff'
alias gwr='git reset --soft'
alias gwR='git reset --hard'
alias gwc='git clean -n'
alias gwC='git clean -f'
alias gwx='git rm -r'
alias gwX='git rm -rf'
# Open modified files
# ACMRU = Added || Copied || Modified || Renamed || Unmerged
# Edit all uncommitted files that have changes since the last commit (be they staged or unstaged)
alias vd="nvim (git diff HEAD --name-only --diff-filter=ACMR)"
# Edit all staged files that have changes since the last commit
alias vds="nvim (git diff --staged --name-only --diff-filter=ACMR)"
# Edit all files that were altered in the last commit
alias vdc="nvim (git diff HEAD^ --name-only --diff-filter=ACMR)"
# Edit files changed since master
alias vdm="nvim (git diff master --name-only --diff-filter=ACMR)"
# Edit files unmerged
alias vdu="nvim (git diff --name-only --diff-filter=U | uniq)"
# Add unmerged files
alias vdua="git add (git diff --name-only --diff-filter=U)"
# Cargo aliases
alias cba='cargo update && cargo build --all && cargo doc'
alias cbb='cargo build --all'
alias cbc='cargo clean'
alias cbd='cargo doc'
alias cbD='env BROWSER=firefox-wayland cargo doc --open'
alias cbu='cargo update'
# Git fzf helper functions
# https://github.com/junegunn/fzf/wiki/Examples-(fish)
function fco -d "Checkout a branch using fzf"
git branch --all | grep -v HEAD | string trim | fzf | read -l result; and git checkout "$result"
end
function fcoc -d "Checkout a commit using fzf"
git log --pretty=oneline --abbrev-commit --reverse | fzf --tac +s -e | awk '{print $1;}' | read -l result; and git checkout "$result"
end
# https://gist.github.com/gabesoft/b6e5e959c4cb11ed257d41edb07d47cb
# Modify to use --exact flag for fzf and delta as pager
function fbr --description "Git browse commits"
set -l log_line_to_hash "echo {} | grep -o '[a-f0-9]\{7\}' | head -1"
set -l view_commit "$log_line_to_hash | xargs -I % sh -c 'git show --color=always % | delta | less -R'"
set -l copy_commit_hash "$log_line_to_hash | xclip"
set -l git_checkout "$log_line_to_hash | xargs -I % sh -c 'git checkout %'"
set -l open_cmd "open"
if test (uname) = Linux
set open_cmd "xdg-open"
end
set github_open "$log_line_to_hash | xargs -I % sh -c '$open_cmd https://github.\$(git config remote.origin.url | cut -f2 -d. | tr \':\' /)/commit/%'"
git log --color=always --format='%C(auto)%h%d %s %C(green)%C(bold)%cr% C(blue)%an' | \
fzf --exact --no-sort --reverse --tiebreak=index --no-multi --ansi \
--preview="$view_commit" \
--header="ENTER to view, CTRL-Y to copy hash, CTRL-O to open on GitHub, CTRL-X to checkout, CTRL-C to exit" \
--bind "enter:execute:$view_commit" \
--bind "ctrl-y:execute:$copy_commit_hash" \
--bind "ctrl-x:execute:$git_checkout" \
--bind "ctrl-o:execute:$github_open"
end
function fcf --description "Git commit fixup using fzf"
git commit --fixup (git log --pretty=oneline --abbrev-commit --color=always | fzf --ansi | cut -d ' ' -f1)
end
function fcr --description "Git reset to a selected commit using fzf"
git reset $argv (git log --pretty=oneline --abbrev-commit --color=always | fzf --ansi +s | awk '{print $1}')
end
function fcR --description "Git revert a selected commit using fzf"
git revert (git log --pretty=oneline --abbrev-commit --color=always | fzf --ansi +s | awk '{print $1}')
end
function frbi --description "Git interactive rebase using fzf"
git rebase -i (git log --pretty=oneline --abbrev-commit --color=always | fzf --ansi | cut -d ' ' -f1)
end
function ffa --description "Git add files using fzf"
git add -- (git ls-files --modified --others --exclude-standard | fzf -m --preview 'bat --color=always {}')
end
function ffco --description "Git checkout a file using fzf"
git checkout $argv -- (git ls-files --modified --exclude-standard | fzf -m)
end
function ffrs --description "Git restore a staged file using fzf"
git restore --staged $argv -- (git diff --name-only --staged | fzf -m)
end
function ffr --description "Git restore a file using fzf"
git restore $argv -- (git ls-files --modified --exclude-standard | fzf -m)
end
function grf --description "Search within a file with grep with context"
grep --color=always -C 10 --group-separator="---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------" $argv | less -R
end
function rgf --description "Search within a file with ripgrep"
rg --color always $argv | nvim -R +AnsiEsc
end
function rgc --description "Search within a file with ripgrep with context"
rg --color always -C 10 --context-separator="---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------" $argv | nvim -R +AnsiEsc
end
function vo --description "Pipe a command output to neovim"
$argv | nvim -R
end
function dotp --description "Generate Pipewire dot graph for linked nodes"
pw-dot -L -s -o /tmp/pw.dot
dot -Tsvg /tmp/pw.dot > ~/Pictures/pipewire/pw-dot-(date +%T).svg
rm /tmp/pw.dot
end
function dotP --description "Generate Pipewire dot graph for all nodes"
pw-dot -L -a -o /tmp/pw.dot
dot -Tsvg /tmp/pw.dot > ~/Pictures/pipewire/pw-dot-(date +%T).svg
rm /tmp/pw.dot
end
function dotg --description "Generate gstreamer dot graph for selected file"
find $argv -maxdepth 1 -regextype posix-extended -regex ".*\.(dot)" | fzf | read -l result; and dot -Tsvg "$result" -O
mv "$result".svg ~/Pictures/gstreamer
end
function gdba --description "Attach to a process"
gdb attach -p (ps -e | fzf | awk '{print $1}' | head -1)
end
function gdbp --description "Attach to a python process"
gdb python3 (ps -e | fzf | awk '{print $1}' | head -1)
end
function gdbr --description "Start a command/process with rust-gdb"
rust-gdb --args $argv
end
function pst --description "Show process tree of a process"
set proc (ps -e | fzf | awk '{print $1}' | head -1)
pstree -H $proc $proc
end
function cdi --description "Select a coredump to run coredumpctl info"
coredumpctl list --reverse | awk -F" " '$9 == "present"' | fzf | read -l result
coredumpctl info (echo $result | awk -F" " '{print $5}')
end
function cdg --description "coredumpctl gdb on last crashed process"
coredumpctl gdb
end
function cdG --description "Select a coredump to run coredumpctl gdb"
coredumpctl list --reverse | awk -F" " '$9 == "present"' | fzf | read -l result
coredumpctl gdb (echo $result | awk -F" " '{print $5}')
end
function pft --description "Select a process to run perf top"
set proc (ps -e | fzf | awk '{print $1}')
perf top -p $proc
end
function pfr --description "Select a process to record performance data in given file name"
set proc (ps -e | fzf | awk '{print $1}')
perf record -F 99 -o $argv -p $proc
end
fzf_key_bindings
starship init fish | source
fnm env | source