diff --git a/.bash-powerline b/.bash-powerline new file mode 100644 index 0000000..2120a3a --- /dev/null +++ b/.bash-powerline @@ -0,0 +1,93 @@ +#!/usr/bin/env bash + +## Uncomment to disable git info +#POWERLINE_GIT=0 + +__powerline() { + # Colors + COLOR_RESET='\[\033[m\]' + COLOR_CWD=${COLOR_CWD:-'\[\033[0;34m\]'} # blue + COLOR_GIT=${COLOR_GIT:-'\[\033[0;36m\]'} # cyan + COLOR_SUCCESS=${COLOR_SUCCESS:-'\[\033[0;32m\]'} # green + COLOR_FAILURE=${COLOR_FAILURE:-'\[\033[0;31m\]'} # red + + # Symbols + SYMBOL_GIT_BRANCH=${SYMBOL_GIT_BRANCH:-⑂} + SYMBOL_GIT_MODIFIED=${SYMBOL_GIT_MODIFIED:-*} + SYMBOL_GIT_PUSH=${SYMBOL_GIT_PUSH:-↑} + SYMBOL_GIT_PULL=${SYMBOL_GIT_PULL:-↓} + + if [[ -z "$PS_SYMBOL" ]]; then + case "$(uname)" in + Darwin) PS_SYMBOL='';; + Linux) PS_SYMBOL='$';; + *) PS_SYMBOL='%';; + esac + fi + + __git_info() { + [[ $POWERLINE_GIT = 0 ]] && return # disabled + hash git 2>/dev/null || return # git not found + local git_eng="env LANG=C git" # force git output in English to make our work easier + + # get current branch name + local ref=$($git_eng symbolic-ref --short HEAD 2>/dev/null) + + if [[ -n "$ref" ]]; then + # prepend branch symbol + ref=$SYMBOL_GIT_BRANCH$ref + else + # get tag name or short unique hash + ref=$($git_eng describe --tags --always 2>/dev/null) + fi + + [[ -n "$ref" ]] || return # not a git repo + + local marks + + # scan first two lines of output from `git status` + while IFS= read -r line; do + if [[ $line =~ ^## ]]; then # header line + [[ $line =~ ahead\ ([0-9]+) ]] && marks+=" $SYMBOL_GIT_PUSH${BASH_REMATCH[1]}" + [[ $line =~ behind\ ([0-9]+) ]] && marks+=" $SYMBOL_GIT_PULL${BASH_REMATCH[1]}" + else # branch is modified if output contains more lines after the header line + marks="$SYMBOL_GIT_MODIFIED$marks" + break + fi + done < <($git_eng status --porcelain --branch 2>/dev/null) # note the space between the two < + + # print the git branch segment without a trailing newline + printf " $ref$marks" + } + + ps1() { + # Check the exit code of the previous command and display different + # colors in the prompt accordingly. + if [ $? -eq 0 ]; then + local symbol="$COLOR_SUCCESS $PS_SYMBOL $COLOR_RESET" + else + local symbol="$COLOR_FAILURE $PS_SYMBOL $COLOR_RESET" + fi + + local cwd="$COLOR_CWD\w$COLOR_RESET" + # Bash by default expands the content of PS1 unless promptvars is disabled. + # We must use another layer of reference to prevent expanding any user + # provided strings, which would cause security issues. + # POC: https://github.com/njhartwell/pw3nage + # Related fix in git-bash: https://github.com/git/git/blob/9d77b0405ce6b471cb5ce3a904368fc25e55643d/contrib/completion/git-prompt.sh#L324 + if shopt -q promptvars; then + __powerline_git_info="$(__git_info)" + local git="$COLOR_GIT\${__powerline_git_info}$COLOR_RESET" + else + # promptvars is disabled. Avoid creating unnecessary env var. + local git="$COLOR_GIT$(__git_info)$COLOR_RESET" + fi + + PS1="$cwd$git$symbol" + } + + PROMPT_COMMAND="ps1${PROMPT_COMMAND:+; $PROMPT_COMMAND}" +} + +__powerline +unset __powerline diff --git a/.bashrc b/.bashrc new file mode 100644 index 0000000..c6cf0d6 --- /dev/null +++ b/.bashrc @@ -0,0 +1,120 @@ +# ~/.bashrc: executed by bash(1) for non-login shells. +# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc) +# for examples + +# If not running interactively, don't do anything +case $- in + *i*) ;; + *) return;; +esac + +# don't put duplicate lines or lines starting with space in the history. +# See bash(1) for more options +HISTCONTROL=ignoreboth + +# append to the history file, don't overwrite it +shopt -s histappend + +# for setting history length see HISTSIZE and HISTFILESIZE in bash(1) +HISTSIZE=1000 +HISTFILESIZE=2000 + +# check the window size after each command and, if necessary, +# update the values of LINES and COLUMNS. +shopt -s checkwinsize + +# If set, the pattern "**" used in a pathname expansion context will +# match all files and zero or more directories and subdirectories. +#shopt -s globstar + +# make less more friendly for non-text input files, see lesspipe(1) +#[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)" + +# set variable identifying the chroot you work in (used in the prompt below) +if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then + debian_chroot=$(cat /etc/debian_chroot) +fi + +# set a fancy prompt (non-color, unless we know we "want" color) +case "$TERM" in + xterm-color|*-256color) color_prompt=yes;; +esac + +# uncomment for a colored prompt, if the terminal has the capability; turned +# off by default to not distract the user: the focus in a terminal window +# should be on the output of commands, not on the prompt +#force_color_prompt=yes + +if [ -n "$force_color_prompt" ]; then + if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then + # We have color support; assume it's compliant with Ecma-48 + # (ISO/IEC-6429). (Lack of such support is extremely rare, and such + # a case would tend to support setf rather than setaf.) + color_prompt=yes + else + color_prompt= + fi +fi + +if [ "$color_prompt" = yes ]; then + PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ ' +else + PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ ' +fi +unset color_prompt force_color_prompt + +# If this is an xterm set the title to user@host:dir +case "$TERM" in +xterm*|rxvt*) + PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1" + ;; +*) + ;; +esac + +# enable color support of ls and also add handy aliases +if [ -x /usr/bin/dircolors ]; then + test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)" + alias ls='ls --color=auto' + #alias dir='dir --color=auto' + #alias vdir='vdir --color=auto' + + #alias grep='grep --color=auto' + #alias fgrep='fgrep --color=auto' + #alias egrep='egrep --color=auto' +fi + +# colored GCC warnings and errors +#export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01' + +# some more ls aliases +#alias ll='ls -l' +#alias la='ls -A' +#alias l='ls -CF' + +# Alias definitions. +# You may want to put all your additions into a separate file like +# ~/.bash_aliases, instead of adding them here directly. +# See /usr/share/doc/bash-doc/examples in the bash-doc package. + +if [ -f ~/.bash_aliases ]; then + . ~/.bash_aliases +fi + +# enable programmable completion features (you don't need to enable +# this, if it's already enabled in /etc/bash.bashrc and /etc/profile +# sources /etc/bash.bashrc). +if ! shopt -oq posix; then + if [ -f /usr/share/bash-completion/bash_completion ]; then + . /usr/share/bash-completion/bash_completion + elif [ -f /etc/bash_completion ]; then + . /etc/bash_completion + fi +fi + +# Stop Ctrl+S from freezing the terminal +bind -r '\C-s' +stty -ixon + +source ~/.bash-aliases +source ~/.bash-powerline diff --git a/.gitconfig b/.gitconfig new file mode 100644 index 0000000..6709796 --- /dev/null +++ b/.gitconfig @@ -0,0 +1,9 @@ +[init] + defaultBranch = main +[user] + name = Jono Targett + email = jono.targett@gmail.com + +[alias] + tree = log --graph --decorate --pretty=oneline --abbrev-commit + diff --git a/.vimrc b/.vimrc index 561d5fe..edee48d 100644 --- a/.vimrc +++ b/.vimrc @@ -1,4 +1,4 @@ -color slate +color desert syntax on set tabstop=8 softtabstop=0 expandtab shiftwidth=4 smarttab diff --git a/tracked-files b/tracked-files index e68ec5b..834c35d 100644 --- a/tracked-files +++ b/tracked-files @@ -1,2 +1,5 @@ .vim/ .vimrc +.gitconfig +.bashrc +.bash-powerline