Added nvim / ghostty / starship config

Signed-off-by: Rack Lin <racklin@gmail.com>
This commit is contained in:
2026-02-10 14:50:15 +08:00
parent 6cc8e616c3
commit 86b71b9554
61 changed files with 2928 additions and 68 deletions

40
fish/conf.d/.gitnow Normal file
View File

@@ -0,0 +1,40 @@
[ options ]
# Read text from system clipboard or from the standard input
# only when using Gitflow keybindings
clipboard = false
[ keybindings ]
# Alt + S
state = \es
# Alt + E
stage = \ee
# Ctrl + E
unstage = \ce
# Alt + M
show = \em
# Alt + C
commit-all = \ec
# Alt + D
pull = \ed
# Alt + P
push = \ep
# Alt + U
upstream = \eu
# Alt + L
logs = \el
# Alt + F
feature = \ef
# Alt + H
hotfix = \eh

39
fish/conf.d/autopair.fish Normal file
View File

@@ -0,0 +1,39 @@
status is-interactive || exit
set --global autopair_left "(" "[" "{" '"' "'"
set --global autopair_right ")" "]" "}" '"' "'"
set --global autopair_pairs "()" "[]" "{}" '""' "''"
function _autopair_fish_key_bindings --on-variable fish_key_bindings
set --query fish_key_bindings[1] || return
test $fish_key_bindings = fish_default_key_bindings &&
set --local mode default insert ||
set --local mode insert default
bind --mode $mode[-1] --erase \177 \b \t
bind --mode $mode[1] \177 _autopair_backspace # macOS ⌫
bind --mode $mode[1] \b _autopair_backspace
bind --mode $mode[1] \t _autopair_tab
printf "%s\n" $autopair_pairs | while read --local left right --delimiter ""
bind --mode $mode[-1] --erase $left $right
if test $left = $right
bind --mode $mode[1] $left "_autopair_insert_same \\$left"
else
bind --mode $mode[1] $left "_autopair_insert_left \\$left \\$right"
bind --mode $mode[1] $right "_autopair_insert_right \\$right"
end
end
end
_autopair_fish_key_bindings
function _autopair_uninstall --on-event autopair_uninstall
string collect (
bind --all | string replace --filter --regex -- "_autopair.*" --erase
set --names | string replace --filter --regex -- "^autopair" "set --erase autopair"
) | source
functions --erase (functions --all | string match "_autopair_*")
end

50
fish/conf.d/dracula.fish Normal file
View File

@@ -0,0 +1,50 @@
# Dracula Color Palette
set -l foreground f8f8f2
set -l selection 44475a
set -l comment 6272a4
set -l red ff5555
set -l orange ffb86c
set -l yellow f1fa8c
set -l green 50fa7b
set -l purple bd93f9
set -l cyan 8be9fd
set -l pink ff79c6
# Syntax Highlighting Colors
set -g fish_color_normal $foreground
set -g fish_color_command $cyan
set -g fish_color_keyword $pink
set -g fish_color_quote $yellow
set -g fish_color_redirection $foreground
set -g fish_color_end $orange
set -g fish_color_error $red
set -g fish_color_param $purple
set -g fish_color_comment $comment
set -g fish_color_selection --background=$selection
set -g fish_color_search_match --background=$selection
set -g fish_color_operator $green
set -g fish_color_escape $pink
set -g fish_color_autosuggestion $comment
set -g fish_color_cancel $red --reverse
set -g fish_color_option $orange
# Default Prompt Colors
set -g fish_color_cwd $green
set -g fish_color_host $purple
set -g fish_color_host_remote $purple
set -g fish_color_user $cyan
# Completion Pager Colors
set -g fish_pager_color_progress $comment
set -g fish_pager_color_background
set -g fish_pager_color_prefix $cyan
set -g fish_pager_color_completion $foreground
set -g fish_pager_color_description $comment
set -g fish_pager_color_selected_background --background=$selection
set -g fish_pager_color_selected_prefix $cyan
set -g fish_pager_color_selected_completion $foreground
set -g fish_pager_color_selected_description $comment
set -g fish_pager_color_secondary_background
set -g fish_pager_color_secondary_prefix $cyan
set -g fish_pager_color_secondary_completion $foreground
set -g fish_pager_color_secondary_description $comment

View File

@@ -0,0 +1,7 @@
if test -z "$SSH_ENV"
set -xg SSH_ENV $HOME/.ssh/environment
end
if not __ssh_agent_is_started
__ssh_agent_start
end

View File

@@ -0,0 +1,14 @@
# This file was created by fish when upgrading to version 4.3, to migrate
# the 'fish_key_bindings' variable from its old default scope (universal)
# to its new default scope (global). We recommend you delete this file
# and configure key bindings in ~/.config/fish/config.fish if needed.
# set --global fish_key_bindings fish_default_key_bindings
# Prior to version 4.3, fish shipped an event handler that runs
# `set --universal fish_key_bindings fish_default_key_bindings`
# whenever the fish_key_bindings variable is erased.
# This means that as long as any fish < 4.3 is still running on this system,
# we cannot complete the migration.
# As a workaround, erase the universal variable at every shell startup.
set --erase --universal fish_key_bindings

28
fish/conf.d/fzf.fish Normal file
View File

@@ -0,0 +1,28 @@
# fzf.fish is only meant to be used in interactive mode. If not in interactive mode and not in CI, skip the config to speed up shell startup
if not status is-interactive && test "$CI" != true
exit
end
# Because of scoping rules, to capture the shell variables exactly as they are, we must read
# them before even executing _fzf_search_variables. We use psub to store the
# variables' info in temporary files and pass in the filenames as arguments.
# This variable is global so that it can be referenced by fzf_configure_bindings and in tests
set --global _fzf_search_vars_command '_fzf_search_variables (set --show | psub) (set --names | psub)'
# Install the default bindings, which are mnemonic and minimally conflict with fish's preset bindings
fzf_configure_bindings
# Doesn't erase autoloaded _fzf_* functions because they are not easily accessible once key bindings are erased
function _fzf_uninstall --on-event fzf_uninstall
_fzf_uninstall_bindings
set --erase _fzf_search_vars_command
functions --erase _fzf_uninstall _fzf_migration_message _fzf_uninstall_bindings fzf_configure_bindings
complete --erase fzf_configure_bindings
set_color cyan
echo "fzf.fish uninstalled."
echo "You may need to manually remove fzf_configure_bindings from your config.fish if you were using custom key bindings."
set_color normal
end

684
fish/conf.d/gitnow.fish Normal file
View File

@@ -0,0 +1,684 @@
# GitNow — Speed up your Git workflow. 🐠
# https://github.com/joseluisq/gitnow
function __gitnow_install -e gitnow_install
echo (gitnow -v)" is installed and ready to use!"
echo "Just run the `gitnow` command if you want explore the API."
end
function __gitnow_uninstall -e gitnow_uninstall
echo "GitNow was uninstalled successfully."
end
function gitnow -d "Gitnow: Speed up your Git workflow. 🐠" -a xversion
if [ "$xversion" = "-v" ]; or [ "$xversion" = "--version" ]
echo "GitNow version $gitnow_version"
else
__gitnow_manual | command less -r
end
end
function state -d "Gitnow: Show the working tree status in compact way"
if not __gitnow_is_git_repository
__gitnow_msg_not_valid_repository "state"
return
end
command git status -sb
end
function stage -d "Gitnow: Stage files in current working directory"
if not __gitnow_is_git_repository
__gitnow_msg_not_valid_repository "stage"
return
end
set -l len (count $argv)
set -l opts .
if test $len -gt 0
set opts $argv
end
command git add $opts
end
function unstage -d "Gitnow: Unstage files in current working directory"
if not __gitnow_is_git_repository
__gitnow_msg_not_valid_repository "unstage"
return
end
set -l len (count $argv)
set -l opts .
if test $len -gt 0
set opts $argv
end
command git reset $opts
end
function show -d "Gitnow: Show commit detail objects"
if not __gitnow_is_git_repository
__gitnow_msg_not_valid_repository "show"
return
end
set -l len (count $argv)
if test $len -gt 0
command git show $argv
else
command git show --compact-summary --patch HEAD
end
end
function untracked -d "Gitnow: Check for untracked files and directories on current working directory"
if not __gitnow_is_git_repository
__gitnow_msg_not_valid_repository "untracked"
return
end
command git clean --dry-run -d
end
function commit -d "Gitnow: Commit changes to the repository"
if not __gitnow_is_git_repository
__gitnow_msg_not_valid_repository "commit"
return
end
set -l len (count $argv)
if test $len -gt 0
command git commit $argv
else
command git commit
end
end
function commit-all -d "Gitnow: Add and commit all changes to the repository"
if not __gitnow_is_git_repository
__gitnow_msg_not_valid_repository "commit-all"
return
end
stage
commit .
end
function pull -d "Gitnow: Pull changes from remote server but stashing uncommitted changes"
if not __gitnow_is_git_repository
__gitnow_msg_not_valid_repository "pull"
return
end
set -l len (count $argv)
set -l xorigin (__gitnow_current_remote)
set -l xbranch (__gitnow_current_branch_name)
set -l xcmd ""
echo "⚡️ Pulling changes..."
set -l xdefaults --rebase --autostash --tags
if test $len -gt 2
set xcmd $argv
echo "Mode: Manual"
echo "Default flags: $xdefaults"
echo
else
echo "Mode: Auto"
echo "Default flags: $xdefaults"
if test $len -eq 1
set xbranch $argv[1]
end
if test $len -eq 2
set xorigin $argv[1]
set xbranch $argv[2]
end
set xcmd $xorigin $xbranch
set -l xremote_url (command git config --get "remote.$xorigin.url")
echo "Remote URL: $xorigin ($xremote_url)"
echo "Remote branch: $xbranch"
echo
end
command git pull $xcmd $xdefaults
end
# Git push with --set-upstream
# Shortcut inspired from https://github.com/jamiew/git-friendly
function push -d "Gitnow: Push commit changes to remote repository"
if not __gitnow_is_git_repository
__gitnow_msg_not_valid_repository "push"
return
end
set -l opts $argv
set -l xorigin (__gitnow_current_remote)
set -l xbranch (__gitnow_current_branch_name)
if test (count $opts) -eq 0
set opts $xorigin $xbranch
set -l xremote_url (command git config --get "remote.$xorigin.url")
echo "🚀 Pushing changes..."
echo "Mode: Auto"
echo "Remote URL: $xorigin ($xremote_url)"
echo "Remote branch: $xbranch"
else
set -l v_mode "auto"
for v in $argv
switch $v
case -t --tags
set opts $xorigin $xbranch --follow-tags
set -l xremote_url (command git config --get "remote.$xorigin.url")
echo "🚀 Pushing changes..."
echo "Mode: Auto (incl. tags)"
echo "Remote URL: $xorigin ($xremote_url)"
echo "Remote branch: $xbranch"
case -h --help
echo "NAME"
echo " Gitnow: push - Push current branch to default origin"
echo "OPTIONS:"
echo " -t --tags (auto mode) include annotated tags that relate to the commits"
echo " -h --help Show information about the options for this command"
return
case -\*
case '*'
set -l v_mode "manual"
echo "Mode: Manual"
end
end
end
echo
command git push --set-upstream $opts
end
function upstream -d "Gitnow: Commit all changes and push them to remote server"
if not __gitnow_is_git_repository
__gitnow_msg_not_valid_repository "upstream"
return
end
commit-all
push
end
function feature -d "GitNow: Creates a new Gitflow feature branch from current branch" -a xbranch
if not __gitnow_is_git_repository
__gitnow_msg_not_valid_repository "feature"
return
end
__gitnow_gitflow_branch "feature" $xbranch
end
function hotfix -d "GitNow: Creates a new Gitflow hotfix branch from current branch" -a xbranch
if not __gitnow_is_git_repository
__gitnow_msg_not_valid_repository "hotfix"
return
end
__gitnow_gitflow_branch "hotfix" $xbranch
end
function bugfix -d "GitNow: Creates a new Gitflow bugfix branch from current branch" -a xbranch
if not __gitnow_is_git_repository
__gitnow_msg_not_valid_repository "bugfix"
return
end
__gitnow_gitflow_branch "bugfix" $xbranch
end
function release -d "GitNow: Creates a new Gitflow release branch from current branch" -a xbranch
if not __gitnow_is_git_repository
__gitnow_msg_not_valid_repository "release"
return
end
__gitnow_gitflow_branch "release" $xbranch
end
function merge -d "GitNow: Merges given branch into the active one"
if not __gitnow_is_git_repository
__gitnow_msg_not_valid_repository "merge"
return
end
set -l len (count $argv)
if test $len -eq 0
echo "Merge: No argument given, needs one parameter"
return
end
set -l v_abort
set -l v_continue
set -l v_branch
for v in $argv
switch $v
case -a --abort
set v_abort $v
case -c --continue
set v_continue $v
case -h --help
echo "NAME"
echo " Gitnow: merge - Merge given branch into the active one"
echo "EXAMPLES"
echo " merge <branch to merge>"
echo "OPTIONS:"
echo " -a --abort Abort a conflicted merge"
echo " -c --continue Continue a conflicted merge"
echo " -h --help Show information about the options for this command"
return
case -\*
case '*'
set v_branch $v
end
end
# abort
if test "$v_abort";
echo "Abort the current merge"
command git merge --abort
return
end
# continue
if test "$v_continue";
echo "Continue the current merge"
command git merge --continue
return
end
# No branch defined
if not test -n "$v_branch"
echo "Provide a valid branch name to merge."
return
end
set -l v_found (__gitnow_check_if_branch_exist $v_branch)
# Branch was not found
if test $v_found -eq 0;
echo "Local branch `$v_branch` was not found. Not possible to merge."
return
end
# Detect merging current branch
if [ "$v_branch" = (__gitnow_current_branch_name) ]
echo "Branch `$v_branch` is the same as current branch. Nothing to do."
return
end
command git merge $v_branch
end
function move -d "GitNow: Switch from current branch to another but stashing uncommitted changes"
if not __gitnow_is_git_repository
__gitnow_msg_not_valid_repository "move"
return
end
set -l v_upstream
set -l v_no_apply_stash
set -l v_branch
for v in $argv
switch $v
case -u --upstream
set v_upstream $v
case -n --no-apply-stash
set v_no_apply_stash $v
case -nu -un
set v_upstream "-u"
set v_no_apply_stash "-n"
case -h --help
echo "NAME"
echo " Gitnow: move - Switch from current branch to another but stashing uncommitted changes"
echo "EXAMPLES"
echo " move <branch to switch to>"
echo "OPTIONS:"
echo " -n --no-apply-stash Switch to a local branch but without applying current stash"
echo " -u --upstream Fetch a remote branch and switch to it applying current stash. It can be combined with --no-apply-stash"
echo " -h --help Show information about the options for this command"
return
case -\*
case '*'
set v_branch $v
end
end
# No branch defined
if not test -n "$v_branch"
echo "Provide a valid branch name to switch to."
return
end
set -l v_fetched 0
# Fetch branch from remote
if test -n "$v_upstream"
set -l v_remote (__gitnow_current_remote)
command git fetch $v_remote $v_branch:refs/remotes/$v_remote/$v_branch
command git checkout --track $v_remote/$v_branch
return
end
set -l v_found (__gitnow_check_if_branch_exist $v_branch)
# Branch was not found
if begin test $v_found -eq 0; and test $v_fetched -eq 0; end
echo "Branch `$v_branch` was not found locally. No possible to switch."
echo "Tip: Use -u (--upstream) flag to fetch a remote branch."
return
end
# Prevent same branch switching
if [ "$v_branch" = (__gitnow_current_branch_name) ]
echo "Branch `$v_branch` is the same as current branch. Nothing to do."
return
end
set -l v_uncommited (__gitnow_has_uncommited_changes)
# Stash changes before checkout for uncommited changes only
if test $v_uncommited
command git stash
end
command git checkout $v_branch
# --no-apply-stash
if test -n "$v_no_apply_stash"
echo "Stashed changes were not applied. Use `git stash pop` to apply them."
end
if begin test $v_uncommited; and not test -n "$v_no_apply_stash"; end
command git stash pop
echo "Stashed changes applied."
end
end
function logs -d "Gitnow: Shows logs in a fancy way"
if not __gitnow_is_git_repository
__gitnow_msg_not_valid_repository "logs"
return
end
set -l v_max_commits "80"
set -l v_args
for v in $argv
switch $v
case -h --help
echo "NAME"
echo " Gitnow: logs - Show logs in a fancy way (first $v_max_commits commits by default)"
echo "EXAMPLES"
echo " logs [git log options]"
echo "EXTRA OPTIONS:"
echo " -h, --help Show information about the options for this command"
return
case -\*
case '*'
set v_args $argv
break
end
end
if test -n "$v_args"
set v_max_commits
else
set v_max_commits "-$v_max_commits"
end
LC_ALL=C command git log $v_max_commits $v_args --color --graph \
--pretty=format:"%C(red)%h%C(reset)%C(yellow)%d%Creset %s %C(green italic)(%cr)%C(reset) %C(blue)%an%C(reset) %C(white dim)%GK %C(reset)" --abbrev-commit \
| command less -R
end
function tag -d "Gitnow: Tag commits following Semver"
if not __gitnow_is_git_repository
__gitnow_msg_not_valid_repository "tag"
return
end
set -l v_major
set -l v_minor
set -l v_patch
set -l v_premajor
set -l v_preminor
set -l v_prepatch
set -l opts
# NOTE: this function only gets the latest *Semver release version* but no suffixed ones or others
set -l v_latest (__gitnow_get_latest_semver_release_tag)
for v in $argv
switch $v
case -x --major
set v_major $v
case -y --minor
set v_minor $v
case -z --patch
set v_patch $v
case -a --annotate
set opts $opts $v
# TODO: pre-release versions are not supported yet
# case -a --premajor
# set v_premajor $v
# case -b --preminor
# set v_preminor $v
# case -c --prepatch
# set v_prepatch $v
case -l --latest
if not test -n "$v_latest"
echo "There is no any tag created yet."
else
echo $v_latest
end
return
case -h --help
echo "NAME"
echo " Gitnow: tag - List or tag commits following The Semantic Versioning 2.0.0 (Semver) [1]"
echo " [1] https://semver.org/"
echo "EXAMPLES"
echo " List tags: tag"
echo " Custom tag: tag <my tag name>"
echo " Semver tag: tag --major"
echo "OPTIONS:"
echo " Without options all tags are listed in a lexicographic order and tag names are treated as versions"
echo " -x --major Tag auto-incrementing a major version number"
echo " -y --minor Tag auto-incrementing a minor version number"
echo " -z --patch Tag auto-incrementing a patch version number"
echo " -l --latest Show only the latest Semver release tag version (no suffixed ones or others)"
echo " -a --annotate Create as annotated tag"
echo " -h --help Show information about the options for this command"
# TODO: pre-release versions are not supported yet
# echo " -a --premajor Tag auto-incrementing a premajor version number"
# echo " -b --preminor Tag auto-incrementing a preminor version number"
# echo " -c --prepatch Tag auto-incrementing a prepatch version number"
return
case -\*
case '*'
return
end
end
# List all tags in a lexicographic order and treating tag names as versions
if test -z "$argv"
__gitnow_get_tags_ordered
return
end
# Major version tags
if test -n "$v_major"
if not test -n "$v_latest"
command git tag $opts v1.0.0
echo "First major tag \"v1.0.0\" was created."
return
else
set -l vstr (__gitnow_get_valid_semver_release_value $v_latest)
# Validate Semver format before to proceed
if not test -n "$vstr"
echo "The latest tag \"$v_latest\" has no a valid Semver format."
return
end
set -l x (echo $vstr | LC_ALL=C command awk -F '.' '{print $1}')
set -l prefix (echo $v_latest | LC_ALL=C command awk -F "$vstr" '{print $1}')
set x (__gitnow_increment_number $x)
set -l xyz "$prefix$x.0.0"
command git tag $opts $xyz
echo "Major tag \"$xyz\" was created."
return
end
end
# Minor version tags
if test -n "$v_minor"
if not test -n "$v_latest"
command git tag $opts v0.1.0
echo "First minor tag \"v0.1.0\" was created."
return
else
set -l vstr (__gitnow_get_valid_semver_release_value $v_latest)
# Validate Semver format before to proceed
if not test -n "$vstr"
echo "The latest tag \"$v_latest\" has no a valid Semver format."
return
end
set -l x (echo $vstr | LC_ALL=C command awk -F '.' '{print $1}')
set -l y (echo $vstr | LC_ALL=C command awk -F '.' '{print $2}')
set -l prefix (echo $v_latest | LC_ALL=C command awk -F "$vstr" '{print $1}')
set y (__gitnow_increment_number $y)
set -l xyz "$prefix$x.$y.0"
command git tag $opts $xyz
echo "Minor tag \"$xyz\" was created."
return
end
end
# Patch version tags
if test -n "$v_patch"
if not test -n "$v_latest"
command git tag $opts v0.0.1
echo "First patch tag \"v0.1.0\" was created."
return
else
set -l vstr (__gitnow_get_valid_semver_release_value $v_latest)
# Validate Semver format before to proceed
if not test -n "$vstr"
echo "The latest tag \"$v_latest\" has no a valid Semver format."
return
end
set -l x (echo $vstr | LC_ALL=C command awk -F '.' '{print $1}')
set -l y (echo $vstr | LC_ALL=C command awk -F '.' '{print $2}')
set -l z (echo $vstr | LC_ALL=C command awk -F '.' '{print $3}')
set -l s (echo $z | LC_ALL=C command awk -F '-' '{print $1}')
if __gitnow_is_number $s
set -l prefix (echo $v_latest | LC_ALL=C command awk -F "$vstr" '{print $1}')
set s (__gitnow_increment_number $s)
set -l xyz "$prefix$x.$y.$s"
command git tag $opts $xyz
echo "Patch tag \"$xyz\" was created."
else
echo "No patch version found."
end
return
end
end
# TODO: pre-release versions are not supported yet
# TODO: Premajor version tags
# TODO: Preminor version tags
# TODO: Prepatch version tags
end
function assume -d "Gitnow: Ignore files temporarily"
if not __gitnow_is_git_repository
__gitnow_msg_not_valid_repository "assume"
return
end
set -l v_assume_unchanged "--assume-unchanged"
set -l v_files
for v in $argv
switch $v
case -n --no-assume
set v_assume_unchanged "--no-assume-unchanged"
case -h --help
echo "NAME"
echo " Gitnow: assume - Ignores changes in certain files temporarily"
echo "OPTIONS:"
echo " -n --no-assume No assume unchanged files to be ignored (revert option)"
echo " -h --help Show information about the options for this command"
return
case -\*
case '*'
set v_files $v_files $v
end
end
if test (count $v_files) -lt 1
echo "Provide files in order to ignore them temporarily. E.g `assume Cargo.lock`"
return
end
command git update-index $v_assume_unchanged $v_files
end
function github -d "Gitnow: Clone a GitHub repository using SSH"
set -l repo (__gitnow_clone_params $argv)
__gitnow_clone_repo $repo "github"
end
function bitbucket -d "Gitnow: Clone a Bitbucket Cloud repository using SSH"
set -l repo (__gitnow_clone_params $argv)
__gitnow_clone_repo $repo "bitbucket"
end

View File

@@ -0,0 +1,32 @@
# GitNow — Speed up your Git workflow. 🐠
# https://github.com/joseluisq/gitnow
set -g gitnow_version 2.10.0
if set -q __fish_config_dir
set -g fish_config "$__fish_config_dir"
else
set -q XDG_CONFIG_HOME
and set -g fish_config "$XDG_CONFIG_HOME/fish"
or set -g fish_config "~/.config/fish"
end
set -q fish_snippets; or set -g fish_snippets "$fish_config/conf.d"
set -q fish_functions; or set -g fish_functions "$fish_config/functions"
set -q fish_completions; or set -g fish_completions "$fish_config/completions"
set -q GITNOW_CONFIG_FILE; or set -g GITNOW_CONFIG_FILE ~/.gitnow
if functions -q __fundle_plugins_dir
set -l fundledir (__fundle_plugins_dir)
source "$fundledir/joseluisq/gitnow/functions/__gitnow_functions.fish"
source "$fundledir/joseluisq/gitnow/functions/__gitnow_manual.fish"
source "$fundledir/joseluisq/gitnow/functions/__gitnow_config_file.fish"
source "$fundledir/joseluisq/gitnow/completions/__gitnow_completions.fish"
else
source "$fish_functions/__gitnow_functions.fish"
source "$fish_functions/__gitnow_manual.fish"
source "$fish_functions/__gitnow_config_file.fish"
source "$fish_completions/__gitnow_completions.fish"
end
__gitnow_read_config