Clean up dotfiles

- Move shell profiles to shell folder
- Add `ffconvert` and `zipline` functions
- Delete configuration files for tools I don't use
This commit is contained in:
Joey Hafner 2024-09-04 13:06:03 -07:00
parent fd20f1a9c2
commit 27cf692572
No known key found for this signature in database
17 changed files with 439 additions and 277 deletions

View File

@ -1,36 +0,0 @@
# Aliases
alias ls='ls --color'
# extract a video from a clip without transcoding
# takes `--start <timestamp in hh:mm:ss>
# --duration <seconds>
# --file '<path to file>'
alias clip='~/Nextcloud/Dotfiles/Fedora/clip.sh'
# kills all processes related to lutris. must be adapted if steam is used instead
alias gamescopereset='kill $(ps aux | grep lutris | tr -s " " | cut -d" " -f 2)'
# restarts applications which break when pulseaudio devices restart
alias audiofix='systemctl --user restart pipewire-pulse.service'
# Get the size of a remote git repository as quickly as possible.
git-getsize() {
echo "Cloning with --no-checkout ... "
git clone --no-checkout "$1" && cd "$(basename "$_" .git)"
echo "Size of LFS objects:"
git lfs ls-files -s | cut -d' ' -f4-5
if ! [ -z ${cleanup+x} ]; then
unset cleanup
fi
while [ -z ${cleanup+x} ]; do
read -p "Clean up the git repo? [y/n]: " yn
case $yn in
[Yy]*) cleanup=0 ;;
[Nn]*) cleanup=1 ;;
*) echo "Enter y or n" ;;
esac
done
}
# The jot command works like:
# jot 'Some note I would quickly take'
function jot () { if [ -z "$@" ]; then echo -e "Usage: jot 'Some note to take'\nRemember to use single quotes"; else echo "$@" | sed -e 's/^/- /' >> ~/Documents/Notes/Daily/$(date +%Y_%m_%d).md; fi }

View File

@ -1,33 +0,0 @@
# .bashrc
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
# User specific environment
if ! [[ "$PATH" =~ "$HOME/.local/bin:$HOME/bin:" ]]; then
PATH="$HOME/.local/bin:$HOME/bin:$PATH"
fi
export PATH
# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=
# User specific aliases and functions
if [ -d ~/.bashrc.d ]; then
for rc in ~/.bashrc.d/*; do
if [ -f "$rc" ]; then
. "$rc"
fi
done
fi
unset rc
export HSA_OVERRIDE_GFX_VERSION=11.0.0
export OLLAMA_HOST=https://ollama.jafner.net
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion
export PYENV_ROOT="$HOME/.pyenv"
[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"

View File

@ -1,7 +0,0 @@
/**
* @name Discord Breeze Dark
* @author Jafner
* @description Shitty attempt to replicate KDE's Breeze Dark
* @version 0.0.1
*/

View File

@ -1,14 +0,0 @@
[global]
bs=256K
iodepth=64
direct=1
ioengine=libaio
group_reporting
time_based
runtime=120
numjobs=4
name=raw-read
rw=read
[job1]
filename=/dev/nvme1n1p1

View File

@ -1,28 +0,0 @@
{
"headingStyle": "atx",
"hr": "---",
"bulletListMarker": "-",
"codeBlockStyle": "fenced",
"fence": "```",
"emDelimiter": "*",
"strongDelimiter": "**",
"linkStyle": "inlined",
"linkReferenceStyle": "full",
"imageStyle": "originalSource",
"imageRefStyle": "inlined",
"frontmatter": "---\ncreated: {date:YYYY-MM-DDTHH:mm:ss} (UTC {date:Z})\ntags: [{keywords}]\nsource: {baseURI}\nauthor: {byline}\n---\n\n# {pageTitle}\n\n> ## Excerpt\n> {excerpt}\n\n---",
"backmatter": "",
"title": "{pageTitle}",
"includeTemplate": true,
"saveAs": false,
"downloadImages": true,
"imagePrefix": "img/{pageTitle}/",
"mdClipsFolder": "MarkDownload",
"disallowedChars": "[]#^",
"downloadMode": "downloadsApi",
"turndownEscape": true,
"contextMenus": true,
"obsidianIntegration": true,
"obsidianVault": "Notes",
"obsidianFolder": "Webclips"
}

80
dotfiles/shell/.aliases Normal file
View File

@ -0,0 +1,80 @@
# Aliases
alias ls='ls --color'
# Get the size of a remote git repository as quickly as possible.
function git-getsize() {
echo "Cloning with --no-checkout ... "
git clone --no-checkout "$1" && cd "$(basename "$_" .git)"
echo "Size of LFS objects:"
git lfs ls-files -s | cut -d' ' -f4-5
if ! [ -z ${cleanup+x} ]; then
unset cleanup
fi
while [ -z ${cleanup+x} ]; do
read -p "Clean up the git repo? [y/n]: " yn
case $yn in
[Yy]*) cleanup=0 ;;
[Nn]*) cleanup=1 ;;
*) echo "Enter y or n" ;;
esac
done
}
# Run some ffmpeg commands with only one subcommand and the file as input.
function ffconvert() {
COMMAND=$1
FILE=$2
INPUT_FILE=$(realpath "$FILE")
FILE_PATH=$(dirname "$INPUT_FILE")
FILE_NAME=$(basename "$INPUT_FILE")
FILE_EXT="${FILE_NAME##*.}"
FILE_NAME="${FILE_NAME%.*}"
case $COMMAND in
x264 ) OUTFILE=$(echo "$FILE_PATH/$FILE_NAME.x264.$FILE_EXT") &&\
ffmpeg -hide_banner -hwaccel vaapi -hwaccel_device /dev/dri/renderD128 -hwaccel_output_format vaapi -i "$INPUT_FILE" -c:v h264_vaapi -b:v 6M -maxrate 6M -c:a copy "$OUTFILE" ;;
x265 ) OUTFILE=$(echo "$FILE_PATH/$FILE_NAME.x265.$FILE_EXT") &&\
ffmpeg -hide_banner -vaapi_device /dev/dri/renderD128 -i "$INPUT_FILE" -vf 'format=hwupload' -c:v hevc_vaapi -b:v 6M -c:a copy "$OUTFILE" ;;
av1 ) OUTFILE=$(echo "$FILE_PATH/$FILE_NAME.av1.$FILE_EXT") &&\
ffmpeg -hide_banner -hwaccel vaapi -hwaccel_device /dev/dri/renderD128 -hwaccel_output_format vaapi -i "$INPUT_FILE" -map 0 -vf 'format=nv12,hwupload' -c:v av1_vaapi -crf 18 -b:v 6000k "$OUTFILE" > /dev/null ;;
mp4 ) OUTFILE=$(echo "$FILE_PATH/$FILE_NAME.mp4") &&\
ffmpeg -hide_banner -i "$INPUT_FILE" -map 0 -c:v copy -c:a copy "$OUTFILE" ;;
* ) echo "Usage: $0 (x264|x265|av1|mp4) (file)" ;;
esac
}
# Upload a file to Zipline
# Requires:
# Zipline server located at $ZIPLINE_HOST_ROOT
# Zipline upload auth token at $HOME/.zipline-auth.token
function zipline() {
FILE=$1
INPUT_FILE=$(realpath "$FILE")
FILE_NAME=$(basename "$INPUT_FILE")
FILE_NAME="${FILE_NAME%.*}"
ZIPLINE_HOST_ROOT=https://zipline.jafner.net
TOKEN=$(cat ~/.zipline-auth.token)
LINK=$(curl \
--header "authorization: $TOKEN" \
$ZIPLINE_HOST_ROOT/api/upload -F "file=@$INPUT_FILE" \
--header "Content-Type: multipart/form-data" \
--header "Format: name" \
--header "Embed: true" \
--header "Original-Name: true")
LINK=$(echo "$LINK" | jq -r .'files[0]')
echo "[$FILE_NAME]($LINK)" | wl-copy
}
# The jot command works like:
# jot 'Some note I would quickly take'
function jot () {
if [ -z "$@" ]; then
echo -e "Usage: jot 'Some note to take'\nRemember to use single quotes"
else
echo "$@" |\
sed -e 's/^/- /' >> ~/Documents/Notes/Daily/$(date +%Y_%m_%d).md
fi
}

10
dotfiles/shell/.bashrc Normal file
View File

@ -0,0 +1,10 @@
# .bashrc
SCRIPT_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/$(basename "${BASH_SOURCE[0]}")"
source $SCRIPT_PATH/.shellrc
source $SCRIPT_PATH/.aliases
# Source global definitions
if [ -f /etc/bashrc ]; then
source /etc/bashrc
fi

6
dotfiles/shell/.shellrc Normal file
View File

@ -0,0 +1,6 @@
# User specific environment
if ! [[ "$PATH" =~ "$HOME/.local/bin:$HOME/bin:" ]]; then
PATH="$HOME/.local/bin:$HOME/bin:$PATH"
fi
export PATH

View File

@ -1,3 +1,8 @@
# .zshrc
source ${0:a:h}/.shellrc
source ${0:a:h}/.aliases
# Enable Powerlevel10k instant prompt. Should stay close to the top of ~/.zshrc.
# Initialization code that may require console input (password prompts, [y/n]
# confirmations, etc.) must go above this block; everything else may go below.
@ -25,16 +30,6 @@ zinit light zsh-users/zsh-syntax-highlighting
zinit light zsh-users/zsh-completions
zinit light zsh-users/zsh-autosuggestions
zinit light jirutka/zsh-shift-select
#zinit light Aloxaf/fzf-tab
# Add in snippets
#zinit snippet OMZP::git
#zinit snippet OMZP::sudo
#zinit snippet OMZP::archlinux
#zinit snippet OMZP::aws
#zinit snippet OMZP::kubectl
#zinit snippet OMZP::kubectx
#zinit snippet OMZP::command-not-found
# Load completions
autoload -Uz compinit && compinit
@ -55,9 +50,7 @@ bindkey '^[[F' end-of-line # End
bindkey '^[w' kill-region
bindkey '^I^I' autosuggest-accept
bindkey '^[' autosuggest-clear
#bindkey '[1;6C' shift-select-word-right
#bindkey '[1;6D' shift-select-word-left
bindkey '[3~' delete-char # Delete
# History
HISTSIZE=5000
@ -76,8 +69,6 @@ setopt hist_find_no_dups
zstyle ':completion:*' matcher-list 'm:{a-z}={A-Za-z}'
zstyle ':completion:*' list-colors "${(s.:.)LS_COLORS}"
zstyle ':completion:*' menu no
#zstyle ':fzf-tab:complete:cd:*' fzf-preview 'ls --color $realpath'
#zstyle ':fzf-tab:complete:__zoxide_z:*' fzf-preview 'ls --color $realpath'
# Shell integrations
eval "$(zoxide init --cmd cd zsh)"

View File

@ -39,3 +39,5 @@ OUTFILE=$(echo "$FILE_PATH/$FILE_NAME.x264.$FILE_EXT")
notify-send -t 2000 "Transcode starting" "$FILE_NAME"
ffmpeg -hide_banner -vaapi_device /dev/dri/renderD128 -i "$INPUT_FILE" -c:v h264_vaapi -qp $RATE_FACTOR -c:a copy "$OUTFILE"
notify-send -t 4000 "Transcode complete" "$FILE_NAME"
ffmpeg -hwaccel vaapi -hwaccel_device /dev/dri/renderD128 -hwaccel_output_format vaapi -i input.mp4 -c:v h264_vaapi -b:v 2M -maxrate 2M output.mp4

View File

@ -22,7 +22,7 @@ FILE_NAME=$(basename "$INPUT_FILE")
FILE_NAME="${FILE_NAME%.*}"
ZIPLINE_HOST_ROOT=https://zipline.jafner.net
TOKEN=$(cat ~/.zipline-auth)
TOKEN=$(cat ~/.zipline-auth.token)
LINK=$(curl \
--header "authorization: $TOKEN" \
$ZIPLINE_HOST_ROOT/api/upload -F "file=@$INPUT_FILE" \

View File

@ -1,21 +0,0 @@
#!/bin/bash
NAUTILUS_SCRIPTS_DIR="/home/joey/.local/share/nautilus/scripts"
COUNTER=0
SCOUNTER=0
DCOUNTER=0
for file in ./*; do
# Get second line of file
SCRIPT_NAME="$(head -2 $file | tail -1)"
# Guard statement for script name
if [[ "$SCRIPT_NAME" == "#[\""* ]]; then
NAME="$(echo $SCRIPT_NAME | cut -d'"' -f 2)"
echo "ln -s $(realpath $file) \"$NAUTILUS_SCRIPTS_DIR/$NAME\""
ln -s $(realpath $file) "$NAUTILUS_SCRIPTS_DIR/$NAME" && COUNTER=$((COUNTER+1)) || DCOUNTER=$((DCOUNTER+1))
else
echo -n "File has no script name (Skipping): "
echo "$file"
SCOUNTER=$((SCOUNTER+1))
fi
done
echo "Created $COUNTER new symlinks ($SCOUNTER skipped, $DCOUNTER duplicates)"

View File

@ -1,17 +0,0 @@
#!/bin/bash
THEME_DIR=~/.local/share/sounds/__custom
mkdir -p $THEME_DIR && cd $THEME_DIR
touch $THEME_DIR/.disabled
cat << 'EOF' > $THEME_DIR/index.theme
[Sound Theme]
Name=__custom
Inherits=freedesktop
Directories=
EOF
gsettings set org.gnome.desktop.sound theme-name '__custom'

View File

@ -1,5 +0,0 @@
#!/bin/bash
echo "$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS" > ~/Nextcloud/Dotfiles/Fedora/test.txt
#if (( $(grep -c . <<<"$(cat ~/Nextcloud/Dotfiles/Fedora/test.txt)") > 1 )); then echo "Multiline" > ~/Nextcloud/Dotfiles/Fedora/result.txt; else echo "Single line" > ~/Nextcloud/Dotfiles/Fedora/result.txt; fi
#if (( $(grep -c . <<<"$(cat ~/.nautilus_script_selected_file_paths)") > 1 )); then echo "Multiline" > ~/Nextcloud/Dotfiles/Fedora/result.txt; else echo "Single line" > ~/Nextcloud/Dotfiles/Fedora/result.txt; fi

View File

@ -1,13 +0,0 @@
#!/bin/bash
# Comma-separated list of paths to which each of the model gguf files should be symlinked
LINKED_PATHS="/home/joey/Projects/LLMs/models"
IFS="," read -ra DIR <<< "$LINKED_PATHS"
for dir in "${DIR[@]}"; do
echo "======== GENERATING SYMLINKS FOR: $dir ========"
for file in *.gguf; do
#echo "CMD: ln -s \"$(realpath $file)\" \"$dir/$file\""
ln -s "$(realpath $file)" "$dir/$file"
done
done

View File

@ -1,87 +0,0 @@
#!/bin/bash
debug=true # set to true if you want to see debug messages
# Find your values from the output of `razer-cli -ls`
# These devices are queried for the charge value used to set the RGB color
device_name="Razer Viper Ultimate (Wireless)"
device_name_alternate="Razer Viper Ultimate (Wired)"
# This device gets its RGB set based on the charge value.
# This *can* be the same as one of the above, but I like to see the RGB on my dock.
# You could also use a non-Razer device by changing the command at the end of
# the set_color_from_charge function to one which works for your device.
dock_name="Razer Mouse Dock"
# Set the colors to use for full charge and low charge below.
# These are used to create a gradient to represent partial charge levels.
# E.g. if full charge is green and low charge is red, 50% charge will be yellow
# Or e.g. if full charge is purple (102, 0, 255) and low charge is cyan (0, 255, 255)
# then 50% charge will be a sky blue (51, 127, 255).
# You can use the rgb output of a tool like this:
# https://www.w3schools.com/colors/colors_picker.asp
full_charge_color_code="85 255 0"
low_charge_color_code="255 0 0"
# Razer devices often have different names when they're plugged in.
# But we still want to know the charge level while we're charging, so we query both names.
low_charge_percent=$(razer-cli -d "$device_name" --battery low | grep "low threshold" | tr -s ' ' | cut -d' ' -f 4)
if [[ -z $low_charge_percent ]]; then
low_charge_percent=$(razer-cli -d "$device_name_alternate" --battery low | grep "low threshold" | tr -s ' ' | cut -d' ' -f 4)
fi
# This is just for the math to get the color gradients.
charge_range=$((100 - $low_charge_percent))
full_r=$(echo "$full_charge_color_code" | cut -d' ' -f 1)
low_r=$(echo "$low_charge_color_code" | cut -d' ' -f 1)
color_range_r=$(($full_r - $low_r))
full_g=$(echo "$full_charge_color_code" | cut -d' ' -f 2)
low_g=$(echo "$low_charge_color_code" | cut -d' ' -f 2)
color_range_g=$(($full_g - $low_g))
full_b=$(echo "$full_charge_color_code" | cut -d' ' -f 3)
low_b=$(echo "$low_charge_color_code" | cut -d' ' -f 3)
color_range_b=$(($full_b - $low_b))
# Some debug echoes.
if [[ $debug -eq "true" ]]; then
echo "full_r: $full_r, low_r: $low_r, color_range_r: $color_range_r"
echo "full_g: $full_g, low_g: $low_g, color_range_g: $color_range_g"
echo "full_b: $full_b, low_b: $low_b, color_range_b: $color_range_b"
fi
# Our function for setting the new RGB color
# Uses a gradient between the "full" and "low" charge colors.
function set_color_from_charge () {
charge_scaled=$(($(($(($1 - $low_charge_percent)) * 100)) / $charge_range))
r=$(($low_r + $(($(($charge_scaled * $color_range_r)) / 100))))
g=$(($low_g + $(($(($charge_scaled * $color_range_g)) / 100))))
b=$(($low_b + $(($(($charge_scaled * $color_range_b)) / 100))))
if [[ $debug -eq "true" ]]; then
echo "charge scaled: $charge_scaled"
echo "new color: $r, $g, $b"
fi
razer-cli -d $dock_name -c $r $g $b
}
# Our main loop. Get current charge level.
# If it's reporting zero, we assume it's asleep.
# If it's reporting at or below the low battery threshold, we use the low battery color
# If it's reporting above the low battery threshold, we set the RGB color based on our gradient
# Consider adding logic to handle distinction between discharging (normal) and charging.
while true; do
charge=$(razer-cli -d "$device_name" --battery print | grep charge | tr -s ' ' | cut -d' ' -f 3)
if [[ $debug -eq "true" ]]; then
echo "charge: $charge"
fi
if [[ $charge -eq 0 ]]; then
echo "Device charge 0. Assuming the device is sleeping. Do nothing."
elif [[ $charge -lt $low_charge_percent ]]; then
razer-cli -d $dock_name -c $full_charge_color_code
else
set_color_from_charge $charge
fi
sleep 600
done

View File

@ -0,0 +1,334 @@
# ---------------------------------------------------------------------------------------------
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License. See License.txt in the project root for license information.
# ---------------------------------------------------------------------------------------------
# Prevent the script recursing when setting up
if [[ -n "${VSCODE_SHELL_INTEGRATION:-}" ]]; then
builtin return
fi
VSCODE_SHELL_INTEGRATION=1
# Run relevant rc/profile only if shell integration has been injected, not when run manually
if [ "$VSCODE_INJECTION" == "1" ]; then
if [ -z "$VSCODE_SHELL_LOGIN" ]; then
if [ -r ~/.bashrc ]; then
. ~/.bashrc
fi
else
# Imitate -l because --init-file doesn't support it:
# run the first of these files that exists
if [ -r /etc/profile ]; then
. /etc/profile
fi
# execute the first that exists
if [ -r ~/.bash_profile ]; then
. ~/.bash_profile
elif [ -r ~/.bash_login ]; then
. ~/.bash_login
elif [ -r ~/.profile ]; then
. ~/.profile
fi
builtin unset VSCODE_SHELL_LOGIN
# Apply any explicit path prefix (see #99878)
if [ -n "${VSCODE_PATH_PREFIX:-}" ]; then
export PATH=$VSCODE_PATH_PREFIX$PATH
builtin unset VSCODE_PATH_PREFIX
fi
fi
builtin unset VSCODE_INJECTION
fi
if [ -z "$VSCODE_SHELL_INTEGRATION" ]; then
builtin return
fi
# Apply EnvironmentVariableCollections if needed
if [ -n "${VSCODE_ENV_REPLACE:-}" ]; then
IFS=':' read -ra ADDR <<< "$VSCODE_ENV_REPLACE"
for ITEM in "${ADDR[@]}"; do
VARNAME="$(echo $ITEM | cut -d "=" -f 1)"
VALUE="$(echo -e "$ITEM" | cut -d "=" -f 2-)"
export $VARNAME="$VALUE"
done
builtin unset VSCODE_ENV_REPLACE
fi
if [ -n "${VSCODE_ENV_PREPEND:-}" ]; then
IFS=':' read -ra ADDR <<< "$VSCODE_ENV_PREPEND"
for ITEM in "${ADDR[@]}"; do
VARNAME="$(echo $ITEM | cut -d "=" -f 1)"
VALUE="$(echo -e "$ITEM" | cut -d "=" -f 2-)"
export $VARNAME="$VALUE${!VARNAME}"
done
builtin unset VSCODE_ENV_PREPEND
fi
if [ -n "${VSCODE_ENV_APPEND:-}" ]; then
IFS=':' read -ra ADDR <<< "$VSCODE_ENV_APPEND"
for ITEM in "${ADDR[@]}"; do
VARNAME="$(echo $ITEM | cut -d "=" -f 1)"
VALUE="$(echo -e "$ITEM" | cut -d "=" -f 2-)"
export $VARNAME="${!VARNAME}$VALUE"
done
builtin unset VSCODE_ENV_APPEND
fi
__vsc_get_trap() {
# 'trap -p DEBUG' outputs a shell command like `trap -- '…shellcode…' DEBUG`.
# The terms are quoted literals, but are not guaranteed to be on a single line.
# (Consider a trap like $'echo foo\necho \'bar\'').
# To parse, we splice those terms into an expression capturing them into an array.
# This preserves the quoting of those terms: when we `eval` that expression, they are preserved exactly.
# This is different than simply exploding the string, which would split everything on IFS, oblivious to quoting.
builtin local -a terms
builtin eval "terms=( $(trap -p "${1:-DEBUG}") )"
# |________________________|
# |
# \-------------------*--------------------/
# terms=( trap -- '…arbitrary shellcode…' DEBUG )
# |____||__| |_____________________| |_____|
# | | | |
# 0 1 2 3
# |
# \--------*----/
builtin printf '%s' "${terms[2]:-}"
}
__vsc_escape_value_fast() {
builtin local LC_ALL=C out
out=${1//\\/\\\\}
out=${out//;/\\x3b}
builtin printf '%s\n' "${out}"
}
# The property (P) and command (E) codes embed values which require escaping.
# Backslashes are doubled. Non-alphanumeric characters are converted to escaped hex.
__vsc_escape_value() {
# If the input being too large, switch to the faster function
if [ "${#1}" -ge 2000 ]; then
__vsc_escape_value_fast "$1"
builtin return
fi
# Process text byte by byte, not by codepoint.
builtin local LC_ALL=C str="${1}" i byte token out=''
for (( i=0; i < "${#str}"; ++i )); do
byte="${str:$i:1}"
# Escape backslashes, semi-colons specially, then special ASCII chars below space (0x20)
if [ "$byte" = "\\" ]; then
token="\\\\"
elif [ "$byte" = ";" ]; then
token="\\x3b"
elif (( $(builtin printf '%d' "'$byte") < 31 )); then
token=$(builtin printf '\\x%02x' "'$byte")
else
token="$byte"
fi
out+="$token"
done
builtin printf '%s\n' "${out}"
}
# Send the IsWindows property if the environment looks like Windows
if [[ "$(uname -s)" =~ ^CYGWIN*|MINGW*|MSYS* ]]; then
builtin printf '\e]633;P;IsWindows=True\a'
__vsc_is_windows=1
else
__vsc_is_windows=0
fi
# Allow verifying $BASH_COMMAND doesn't have aliases resolved via history when the right HISTCONTROL
# configuration is used
if [[ "$HISTCONTROL" =~ .*(erasedups|ignoreboth|ignoredups).* ]]; then
__vsc_history_verify=0
else
__vsc_history_verify=1
fi
__vsc_initialized=0
__vsc_original_PS1="$PS1"
__vsc_original_PS2="$PS2"
__vsc_custom_PS1=""
__vsc_custom_PS2=""
__vsc_in_command_execution="1"
__vsc_current_command=""
# It's fine this is in the global scope as it getting at it requires access to the shell environment
__vsc_nonce="$VSCODE_NONCE"
unset VSCODE_NONCE
# Report continuation prompt
builtin printf "\e]633;P;ContinuationPrompt=$(echo "$PS2" | sed 's/\x1b/\\\\x1b/g')\a"
__vsc_report_prompt() {
# Expand the original PS1 similarly to how bash would normally
# See https://stackoverflow.com/a/37137981 for technique
if ((BASH_VERSINFO[0] >= 5 || (BASH_VERSINFO[0] == 4 && BASH_VERSINFO[1] >= 4))); then
__vsc_prompt=${__vsc_original_PS1@P}
else
__vsc_prompt=${__vsc_original_PS1}
fi
__vsc_prompt="$(builtin printf "%s" "${__vsc_prompt//[$'\001'$'\002']}")"
builtin printf "\e]633;P;Prompt=%s\a" "$(__vsc_escape_value "${__vsc_prompt}")"
}
__vsc_prompt_start() {
builtin printf '\e]633;A\a'
}
__vsc_prompt_end() {
builtin printf '\e]633;B\a'
}
__vsc_update_cwd() {
if [ "$__vsc_is_windows" = "1" ]; then
__vsc_cwd="$(cygpath -m "$PWD")"
else
__vsc_cwd="$PWD"
fi
builtin printf '\e]633;P;Cwd=%s\a' "$(__vsc_escape_value "$__vsc_cwd")"
}
__vsc_command_output_start() {
if [[ -z "$__vsc_first_prompt" ]]; then
builtin return
fi
builtin printf '\e]633;E;%s;%s\a' "$(__vsc_escape_value "${__vsc_current_command}")" $__vsc_nonce
builtin printf '\e]633;C\a'
}
__vsc_continuation_start() {
builtin printf '\e]633;F\a'
}
__vsc_continuation_end() {
builtin printf '\e]633;G\a'
}
__vsc_command_complete() {
if [[ -z "$__vsc_first_prompt" ]]; then
builtin return
fi
if [ "$__vsc_current_command" = "" ]; then
builtin printf '\e]633;D\a'
else
builtin printf '\e]633;D;%s\a' "$__vsc_status"
fi
__vsc_update_cwd
}
__vsc_update_prompt() {
# in command execution
if [ "$__vsc_in_command_execution" = "1" ]; then
# Wrap the prompt if it is not yet wrapped, if the PS1 changed this this was last set it
# means the user re-exported the PS1 so we should re-wrap it
if [[ "$__vsc_custom_PS1" == "" || "$__vsc_custom_PS1" != "$PS1" ]]; then
__vsc_original_PS1=$PS1
__vsc_custom_PS1="\[$(__vsc_prompt_start)\]$__vsc_original_PS1\[$(__vsc_prompt_end)\]"
PS1="$__vsc_custom_PS1"
fi
if [[ "$__vsc_custom_PS2" == "" || "$__vsc_custom_PS2" != "$PS2" ]]; then
__vsc_original_PS2=$PS2
__vsc_custom_PS2="\[$(__vsc_continuation_start)\]$__vsc_original_PS2\[$(__vsc_continuation_end)\]"
PS2="$__vsc_custom_PS2"
fi
__vsc_in_command_execution="0"
fi
}
__vsc_precmd() {
__vsc_command_complete "$__vsc_status"
__vsc_current_command=""
__vsc_report_prompt
__vsc_first_prompt=1
__vsc_update_prompt
}
__vsc_preexec() {
__vsc_initialized=1
if [[ ! $BASH_COMMAND == __vsc_prompt* ]]; then
# Use history if it's available to verify the command as BASH_COMMAND comes in with aliases
# resolved
if [ "$__vsc_history_verify" = "1" ]; then
__vsc_current_command="$(builtin history 1 | sed 's/ *[0-9]* *//')"
else
__vsc_current_command=$BASH_COMMAND
fi
else
__vsc_current_command=""
fi
__vsc_command_output_start
}
# Debug trapping/preexec inspired by starship (ISC)
if [[ -n "${bash_preexec_imported:-}" ]]; then
__vsc_preexec_only() {
if [ "$__vsc_in_command_execution" = "0" ]; then
__vsc_in_command_execution="1"
__vsc_preexec
fi
}
precmd_functions+=(__vsc_prompt_cmd)
preexec_functions+=(__vsc_preexec_only)
else
__vsc_dbg_trap="$(__vsc_get_trap DEBUG)"
if [[ -z "$__vsc_dbg_trap" ]]; then
__vsc_preexec_only() {
if [ "$__vsc_in_command_execution" = "0" ]; then
__vsc_in_command_execution="1"
__vsc_preexec
fi
}
trap '__vsc_preexec_only "$_"' DEBUG
elif [[ "$__vsc_dbg_trap" != '__vsc_preexec "$_"' && "$__vsc_dbg_trap" != '__vsc_preexec_all "$_"' ]]; then
__vsc_preexec_all() {
if [ "$__vsc_in_command_execution" = "0" ]; then
__vsc_in_command_execution="1"
__vsc_preexec
builtin eval "${__vsc_dbg_trap}"
fi
}
trap '__vsc_preexec_all "$_"' DEBUG
fi
fi
__vsc_update_prompt
__vsc_restore_exit_code() {
return "$1"
}
__vsc_prompt_cmd_original() {
__vsc_status="$?"
__vsc_restore_exit_code "${__vsc_status}"
# Evaluate the original PROMPT_COMMAND similarly to how bash would normally
# See https://unix.stackexchange.com/a/672843 for technique
local cmd
for cmd in "${__vsc_original_prompt_command[@]}"; do
eval "${cmd:-}"
done
__vsc_precmd
}
__vsc_prompt_cmd() {
__vsc_status="$?"
__vsc_precmd
}
# PROMPT_COMMAND arrays and strings seem to be handled the same (handling only the first entry of
# the array?)
__vsc_original_prompt_command=${PROMPT_COMMAND:-}
if [[ -z "${bash_preexec_imported:-}" ]]; then
if [[ -n "${__vsc_original_prompt_command:-}" && "${__vsc_original_prompt_command:-}" != "__vsc_prompt_cmd" ]]; then
PROMPT_COMMAND=__vsc_prompt_cmd_original
else
PROMPT_COMMAND=__vsc_prompt_cmd
fi
fi