pull/1653/head
Pablo Palazon 2019-11-26 19:39:44 +01:00
commit 80e4aa460f
21 changed files with 899 additions and 78 deletions

1
.gitignore vendored
View File

@ -15,4 +15,5 @@ bats
*.sublime-workspace *.sublime-workspace
*.sublime-project *.sublime-project
enabled/* enabled/*
/enabled
tmp/ tmp/

View File

@ -8,7 +8,7 @@
Includes autocompletion, themes, aliases, custom functions, a few stolen pieces from Steve Losh, and more. Includes autocompletion, themes, aliases, custom functions, a few stolen pieces from Steve Losh, and more.
Bash-it provides a solid framework for using, developing and maintaining shell scripts and custom commands for your daily work. Bash-it provides a solid framework for using, developing and maintaining shell scripts and custom commands for your daily work.
If you're using the _Bourne Again Shell_ (Bash) on a regular basis and have been looking for an easy way on how to keep all of these nice little scripts and aliases under control, then Bash-it is for you! If you're using the _Bourne Again Shell_ (Bash) regularly and have been looking for an easy way on how to keep all of these nice little scripts and aliases under control, then Bash-it is for you!
Stop polluting your `~/bin` directory and your `.bashrc` file, fork/clone Bash-it and start hacking away. Stop polluting your `~/bin` directory and your `.bashrc` file, fork/clone Bash-it and start hacking away.
- [Contributing](#contributing) - [Contributing](#contributing)
@ -58,7 +58,7 @@ Feel free to enable the tools you want to use after the installation.
When you run without the `--no-modify-config` switch, the Bash-it installer automatically modifies/replaces your existing config file. When you run without the `--no-modify-config` switch, the Bash-it installer automatically modifies/replaces your existing config file.
Use the `--no-modify-config` switch to avoid unwanted modifications, e.g. if your Bash config file already contains the code that loads Bash-it. Use the `--no-modify-config` switch to avoid unwanted modifications, e.g. if your Bash config file already contains the code that loads Bash-it.
**NOTE**: Keep in mind how Bash load its configuration files, **NOTE**: Keep in mind how Bash loads its configuration files,
`.bash_profile` for login shells (and in macOS in terminal emulators like [Terminal.app](http://www.apple.com/osx/apps/) or `.bash_profile` for login shells (and in macOS in terminal emulators like [Terminal.app](http://www.apple.com/osx/apps/) or
[iTerm2](https://www.iterm2.com/)) and `.bashrc` for interactive shells (default mode in most of the GNU/Linux terminal emulators), [iTerm2](https://www.iterm2.com/)) and `.bashrc` for interactive shells (default mode in most of the GNU/Linux terminal emulators),
to ensure that Bash-it is loaded correctly. to ensure that Bash-it is loaded correctly.
@ -77,7 +77,7 @@ Refer to the official [Bash documentation](https://www.gnu.org/software/bash/man
### Install using Docker ### Install using Docker
You can try Bash-it in an isolated environment without changing any local files via a [Docker](https://www.docker.com/) Container. You can try Bash-it in an isolated environment without changing any local files via a [Docker](https://www.docker.com/) Container.
(Bash Shell v4.4 with Bash-it, [bats](https://github.com/sstephenson/bats) and bash-completion based on [Alpine Linux](https://alpinelinux.org/)). (Bash Shell v4.4 with Bash-it, [bats](https://github.com/sstephenson/bats),and bash-completion based on [Alpine Linux](https://alpinelinux.org/)).
`docker pull ellerbrock/bash-it` `docker pull ellerbrock/bash-it`
@ -206,7 +206,7 @@ export BASH_IT_THEME=""
You can easily preview the themes in your own shell using `BASH_PREVIEW=true bash-it reload`. You can easily preview the themes in your own shell using `BASH_PREVIEW=true bash-it reload`.
If you've created your own custom prompts, we'd love it if you shared with everyone else! Just submit a Pull Request. If you've created your own custom prompts, we'd love it if you shared them with everyone else! Just submit a Pull Request.
You can see theme screenshots on [wiki/Themes](https://github.com/Bash-it/bash-it/wiki/Themes). You can see theme screenshots on [wiki/Themes](https://github.com/Bash-it/bash-it/wiki/Themes).
**NOTE**: Bash-it and some themes use UTF-8 characters, so to avoid strange behavior in your terminal, set your locale to `LC_ALL=en_US.UTF-8` or the equivalent to your language if it isn't American English. **NOTE**: Bash-it and some themes use UTF-8 characters, so to avoid strange behavior in your terminal, set your locale to `LC_ALL=en_US.UTF-8` or the equivalent to your language if it isn't American English.
@ -235,7 +235,7 @@ Bash-it will automatically reload itself after activating or deactivating plugin
### Prompt Version Control Check ### Prompt Version Control Check
Bash-it provides prompt themes the ability to check and display version control information for the current directory. Bash-it provides prompt themes with the ability to check and display version control information for the current directory.
The information is retrieved for each directory and can slow down the navigation of projects with a large number of files and folders. The information is retrieved for each directory and can slow down the navigation of projects with a large number of files and folders.
Turn version control checking off to prevent slow directory navigation within large projects. Turn version control checking off to prevent slow directory navigation within large projects.
@ -329,6 +329,19 @@ Set `SCM_GIT_SHOW_STASH_INFO` to 'false' to **don't show** it:
* `export SCM_GIT_SHOW_STASH_INFO=false` * `export SCM_GIT_SHOW_STASH_INFO=false`
### Ahead/Behind Count
When displaying information regarding whether or not the local branch is ahead or behind its remote counterpart, you can opt to display the number of commits ahead/behind.
This is useful if you only care whether or not you are ahead or behind and do not care how far ahead/behind you are.
Set `SCM_GIT_SHOW_COMMIT_COUNT` to 'true' (the default value) to **show** the count of commits ahead/behind:
* `export SCM_GIT_SHOW_COMMIT_COUNT=true`
Set `SCM_GIT_SHOW_COMMIT_COUNT` to 'false' to **don't show** it:
* `export SCM_GIT_SHOW_COMMIT_COUNT=false`
### Git user ### Git user
In some environments, it is useful to know the value of the current git user, which is used to mark all new commits. In some environments, it is useful to know the value of the current git user, which is used to mark all new commits.

View File

@ -27,7 +27,7 @@ alias gpr='git pull --rebase'
alias gpp='git pull && git push' alias gpp='git pull && git push'
alias gup='git fetch && git rebase' alias gup='git fetch && git rebase'
alias gp='git push' alias gp='git push'
alias gpo='git push origin' alias gpo='git push origin HEAD'
alias gpu='git push --set-upstream' alias gpu='git push --set-upstream'
alias gpuo='git push --set-upstream origin' alias gpuo='git push --set-upstream origin'
alias gpuoc='git push --set-upstream origin $(git symbolic-ref --short HEAD)' alias gpuoc='git push --set-upstream origin $(git symbolic-ref --short HEAD)'
@ -43,6 +43,7 @@ alias gca='git commit -v -a'
alias gcm='git commit -v -m' alias gcm='git commit -v -m'
alias gcam="git commit -v -am" alias gcam="git commit -v -am"
alias gci='git commit --interactive' alias gci='git commit --interactive'
alias gcamd='git commit --amend'
alias gb='git branch' alias gb='git branch'
alias gba='git branch -a' alias gba='git branch -a'
alias gbt='git branch --track' alias gbt='git branch --track'

View File

@ -6,8 +6,8 @@ if ! declare -F _git > /dev/null && declare -F _completion_loader > /dev/null; t
_completion_loader git _completion_loader git
fi fi
# Check that git tab completion is available # Check that git tab completion is available and we haven't already set up completion
if declare -F _git > /dev/null; then if declare -F _git > /dev/null && ! declare -F __git_list_all_commands_without_hub > /dev/null; then
# Duplicate and rename the 'list_all_commands' function # Duplicate and rename the 'list_all_commands' function
eval "$(declare -f __git_list_all_commands | \ eval "$(declare -f __git_list_all_commands | \
sed 's/__git_list_all_commands/__git_list_all_commands_without_hub/')" sed 's/__git_list_all_commands/__git_list_all_commands_without_hub/')"
@ -17,11 +17,16 @@ if declare -F _git > /dev/null; then
cat <<-EOF cat <<-EOF
alias alias
pull-request pull-request
pr
issue
release
fork fork
create create
delete
browse browse
compare compare
ci-status ci-status
sync
EOF EOF
__git_list_all_commands_without_hub __git_list_all_commands_without_hub
} }
@ -213,21 +218,36 @@ EOF
esac esac
} }
# hub fork [--no-remote] # hub fork [--no-remote] [--remote-name REMOTE] [--org ORGANIZATION]
_git_fork() { _git_fork() {
local i c=2 remote=yes local i c=2 flags="--no-remote --remote-name --org"
while [ $c -lt $cword ]; do while [ $c -lt $cword ]; do
i="${words[c]}" i="${words[c]}"
case "$i" in case "$i" in
--org)
((c++))
flags=${flags/$i/}
;;
--remote-name)
((c++))
flags=${flags/$i/}
flags=${flags/--no-remote/}
;;
--no-remote) --no-remote)
unset remote flags=${flags/$i/}
flags=${flags/--remote-name/}
;; ;;
esac esac
((c++)) ((c++))
done done
if [ -n "$remote" ]; then case "$prev" in
__gitcomp "--no-remote" --remote-name|--org)
fi COMPREPLY=()
;;
*)
__gitcomp "$flags"
;;
esac
} }
# hub pull-request [-f] [-m <MESSAGE>|-F <FILE>|-i <ISSUE>|<ISSUE-URL>] [-b <BASE>] [-h <HEAD>] [-a <USER>] [-M <MILESTONE>] [-l <LABELS>] # hub pull-request [-f] [-m <MESSAGE>|-F <FILE>|-i <ISSUE>|<ISSUE-URL>] [-b <BASE>] [-h <HEAD>] [-a <USER>] [-M <MILESTONE>] [-l <LABELS>]

View File

@ -5,6 +5,16 @@ BASH_IT_LOAD_PRIORITY_DEFAULT_PLUGIN=${BASH_IT_LOAD_PRIORITY_DEFAULT_PLUGIN:-250
BASH_IT_LOAD_PRIORITY_DEFAULT_COMPLETION=${BASH_IT_LOAD_PRIORITY_DEFAULT_COMPLETION:-350} BASH_IT_LOAD_PRIORITY_DEFAULT_COMPLETION=${BASH_IT_LOAD_PRIORITY_DEFAULT_COMPLETION:-350}
BASH_IT_LOAD_PRIORITY_SEPARATOR="---" BASH_IT_LOAD_PRIORITY_SEPARATOR="---"
# Handle the different ways of running `sed` without generating a backup file based on OS
# - GNU sed (Linux) uses `-i`
# - BSD sed (macOS) uses `-i ''`
# To use this in Bash-it for inline replacements with `sed`, use the following syntax:
# sed "${BASH_IT_SED_I_PARAMETERS[@]}" -e "..." file
BASH_IT_SED_I_PARAMETERS=(-i)
case "$(uname)" in
Darwin*) BASH_IT_SED_I_PARAMETERS=(-i "")
esac
function _command_exists () function _command_exists ()
{ {
_about 'checks for existence of a command' _about 'checks for existence of a command'

View File

@ -3,27 +3,17 @@
cite about-plugin cite about-plugin
about-plugin 'go environment variables & path configuration' about-plugin 'go environment variables & path configuration'
[ ! command -v go &>/dev/null ] && return command -v go &>/dev/null || return
function _split_path_reverse() { function _go_pathmunge_wrap() {
local a=( ${@//:/ } ) IFS=':' local -a 'a=($1)'
local i=${#a[@]} local i=${#a[@]}
local r=
while [ $i -gt 0 ] ; do while [ $i -gt 0 ] ; do
i=$(( i - 1 )) i=$(( i - 1 ))
if [ $(( i + 1 )) -eq ${#a[@]} ] ; then pathmunge "${a[i]}/bin"
r="${a[i]}"
else
r="${r} ${a[i]}"
fi
done done
echo "$r"
} }
export GOROOT=${GOROOT:-$(go env GOROOT)} export GOROOT="${GOROOT:-$(go env GOROOT)}"
pathmunge "${GOROOT}/bin" export GOPATH="${GOPATH:-$(go env GOPATH)}"
_go_pathmunge_wrap "${GOPATH}:${GOROOT}"
export GOPATH=${GOPATH:-$(go env GOPATH)}
for p in $( _split_path_reverse ${GOPATH} ) ; do
pathmunge "${p}/bin"
done

View File

@ -5,6 +5,8 @@ if $(command -v pygmentize &> /dev/null) ; then
# get the full paths to binaries # get the full paths to binaries
CAT_BIN=$(which cat) CAT_BIN=$(which cat)
LESS_BIN=$(which less) LESS_BIN=$(which less)
BASH_IT_CCAT_STYLE="${BASH_IT_CCAT_STYLE:=default}"
BASH_IT_CLESS_STYLE="${BASH_IT_CLESS_STYLE:=default}"
# pigmentize cat and less outputs - call them ccat and cless to avoid that # pigmentize cat and less outputs - call them ccat and cless to avoid that
# especially cat'ed output in scripts gets mangled with pygemtized meta characters # especially cat'ed output in scripts gets mangled with pygemtized meta characters
@ -15,7 +17,7 @@ if $(command -v pygmentize &> /dev/null) ; then
example 'cat mysite/manage.py dir/text-file.txt' example 'cat mysite/manage.py dir/text-file.txt'
for var; for var;
do do
pygmentize "$var" 2>/dev/null || "$CAT_BIN" "$var"; pygmentize -f 256 -O style="$BASH_IT_CCAT_STYLE" -g "$var" 2>/dev/null || "$CAT_BIN" "$var";
done done
} }
@ -24,6 +26,6 @@ if $(command -v pygmentize &> /dev/null) ; then
about 'it pigments the file passed in and passes it to less for pagination' about 'it pigments the file passed in and passes it to less for pagination'
param '$1: the file to paginate with less' param '$1: the file to paginate with less'
example 'less mysite/manage.py' example 'less mysite/manage.py'
pygmentize -g $* | "$LESS_BIN" -R pygmentize -f 256 -O style="$BASH_IT_CLESS_STYLE" -g $* | "$LESS_BIN" -R
} }
fi fi

View File

@ -1,7 +1,7 @@
cite about-plugin cite about-plugin
about-plugin 'Node.js helper functions' about-plugin 'Node.js helper functions'
pathmunge ./node_modules/.bin pathmunge "./node_modules/.bin" "after"
# Make sure the global npm prefix is on the path # Make sure the global npm prefix is on the path
[[ `which npm` ]] && pathmunge $(npm config get prefix)/bin [[ `which npm 2>/dev/null` ]] && pathmunge "$(npm config get prefix)/bin" "after"

View File

@ -121,6 +121,7 @@ npm-show-proxy ()
echo "===" echo "==="
echo "npm HTTP proxy: " `npm config get proxy` echo "npm HTTP proxy: " `npm config get proxy`
echo "npm HTTPS proxy: " `npm config get https-proxy` echo "npm HTTPS proxy: " `npm config get https-proxy`
echo "npm proxy exceptions: " `npm config get noproxy`
fi fi
} }
@ -132,6 +133,7 @@ npm-disable-proxy ()
if $(command -v npm &> /dev/null) ; then if $(command -v npm &> /dev/null) ; then
npm config delete proxy npm config delete proxy
npm config delete https-proxy npm config delete https-proxy
npm config delete noproxy
echo "Disabled npm proxy settings" echo "Disabled npm proxy settings"
fi fi
} }
@ -143,10 +145,12 @@ npm-enable-proxy ()
local my_http_proxy=${1:-$BASH_IT_HTTP_PROXY} local my_http_proxy=${1:-$BASH_IT_HTTP_PROXY}
local my_https_proxy=${2:-$BASH_IT_HTTPS_PROXY} local my_https_proxy=${2:-$BASH_IT_HTTPS_PROXY}
local my_no_proxy=${3:-$BASH_IT_NO_PROXY}
if $(command -v npm &> /dev/null) ; then if $(command -v npm &> /dev/null) ; then
npm config set proxy $my_http_proxy npm config set proxy $my_http_proxy
npm config set https-proxy $my_https_proxy npm config set https-proxy $my_https_proxy
npm config set noproxy $my_no_proxy
echo "Enabled npm proxy settings" echo "Enabled npm proxy settings"
fi fi
} }
@ -370,7 +374,7 @@ ssh-disable-proxy ()
group 'proxy' group 'proxy'
if [ -f ~/.ssh/config ] ; then if [ -f ~/.ssh/config ] ; then
sed -e's/^.*ProxyCommand/# ProxyCommand/' -i "" ~/.ssh/config sed -e's/^.*ProxyCommand/# ProxyCommand/' "${BASH_IT_SED_I_PARAMETERS[@]}" ~/.ssh/config
echo "Disabled SSH config proxy settings" echo "Disabled SSH config proxy settings"
fi fi
} }
@ -382,7 +386,7 @@ ssh-enable-proxy ()
group 'proxy' group 'proxy'
if [ -f ~/.ssh/config ] ; then if [ -f ~/.ssh/config ] ; then
sed -e's/# ProxyCommand/ ProxyCommand/' -i "" ~/.ssh/config sed -e's/# ProxyCommand/ ProxyCommand/' "${BASH_IT_SED_I_PARAMETERS[@]}" ~/.ssh/config
echo "Enabled SSH config proxy settings" echo "Enabled SSH config proxy settings"
fi fi
} }

View File

@ -4,7 +4,7 @@ about-plugin 'load pyenv, if you are using it'
export PYENV_ROOT="$HOME/.pyenv" export PYENV_ROOT="$HOME/.pyenv"
pathmunge "$PYENV_ROOT/bin" pathmunge "$PYENV_ROOT/bin"
[[ `which pyenv` ]] && eval "$(pyenv init - bash)" [[ `which pyenv 2>/dev/null` ]] && eval "$(pyenv init - bash)"
#Load pyenv virtualenv if the virtualenv plugin is installed. #Load pyenv virtualenv if the virtualenv plugin is installed.
if pyenv virtualenv-init - &> /dev/null; then if pyenv virtualenv-init - &> /dev/null; then

View File

@ -4,4 +4,4 @@ about-plugin 'load rbenv, if you are using it'
export RBENV_ROOT="$HOME/.rbenv" export RBENV_ROOT="$HOME/.rbenv"
pathmunge "$RBENV_ROOT/bin" pathmunge "$RBENV_ROOT/bin"
[[ `which rbenv` ]] && eval "$(rbenv init - bash)" [[ `which rbenv 2>/dev/null` ]] && eval "$(rbenv init - bash)"

View File

@ -17,3 +17,10 @@ function sshlist() {
awk '$1 ~ /Host$/ {for (i=2; i<=NF; i++) print $i}' ~/.ssh/config awk '$1 ~ /Host$/ {for (i=2; i<=NF; i++) print $i}' ~/.ssh/config
} }
function ssh-add-all() {
about 'add all ssh private keys to agent'
group 'ssh'
grep -slR "PRIVATE" ~/.ssh | xargs ssh-add
}

View File

@ -1,44 +1,53 @@
#!/usr/bin/env bats #!/usr/bin/env bats
#load ../test_helper load ../test_helper
load ../../lib/helpers load ../../lib/helpers
load ../../lib/composure load ../../lib/composure
load ../../plugins/available/go.plugin
@test 'plugins go: reverse path: single entry' { @test 'ensure _go_pathmunge_wrap is defined' {
run _split_path_reverse '/foo' load ../../plugins/available/go.plugin
echo "output = ${output}" run type -t _go_pathmunge_wrap
[ "$output" = "/foo" ] assert_line 'function'
}
@test 'plugins go: reverse path: single entry, colon empty' {
run _split_path_reverse '/foo:'
echo "output = ${output}"
[ "$output" = "/foo" ]
}
@test 'plugins go: reverse path: single entry, colon whitespace' {
run _split_path_reverse '/foo: '
echo "output = ${output}"
[ "$output" = "/foo" ]
}
@test 'plugins go: reverse path: multiple entries' {
run _split_path_reverse '/foo:/bar'
echo "output = ${output}"
[ "$output" = "/bar /foo" ]
} }
@test 'plugins go: single entry in GOPATH' { @test 'plugins go: single entry in GOPATH' {
export GOPATH="/foo" export GOPATH="/foo"
export GOROOT="/baz"
load ../../plugins/available/go.plugin load ../../plugins/available/go.plugin
echo "$(echo $PATH | cut -d':' -f1,2)" assert_equal "$(cut -d':' -f1,2 <<<$PATH)" "/foo/bin:/baz/bin"
[ "$(echo $PATH | cut -d':' -f1)" = "/foo/bin" ] }
@test 'plugins go: single entry in GOPATH, with space' {
export GOPATH="/foo bar"
export GOROOT="/baz"
load ../../plugins/available/go.plugin
assert_equal "$(cut -d':' -f1,2 <<<$PATH)" "/foo bar/bin:/baz/bin"
}
@test 'plugins go: single entry in GOPATH, with escaped space' {
export GOPATH="/foo\ bar"
export GOROOT="/baz"
load ../../plugins/available/go.plugin
assert_equal "$(cut -d':' -f1,2 <<<$PATH)" "/foo\ bar/bin:/baz/bin"
} }
@test 'plugins go: multiple entries in GOPATH' { @test 'plugins go: multiple entries in GOPATH' {
export GOPATH="/foo:/bar" export GOPATH="/foo:/bar"
export GOROOT="/baz"
load ../../plugins/available/go.plugin load ../../plugins/available/go.plugin
echo "$(echo $PATH | cut -d':' -f1,2)" assert_equal "$(cut -d':' -f1,2,3 <<<$PATH)" "/foo/bin:/bar/bin:/baz/bin"
[ "$(echo $PATH | cut -d':' -f1,2)" = "/foo/bin:/bar/bin" ] }
@test 'plugins go: multiple entries in GOPATH, with space' {
export GOPATH="/foo:/foo bar"
export GOROOT="/baz"
load ../../plugins/available/go.plugin
assert_equal "$(cut -d':' -f1,2,3 <<<$PATH)" "/foo/bin:/foo bar/bin:/baz/bin"
}
@test 'plugins go: multiple entries in GOPATH, with escaped space' {
export GOPATH="/foo:/foo\ bar"
export GOROOT="/baz"
load ../../plugins/available/go.plugin
assert_equal "$(cut -d':' -f1,2,3 <<<$PATH)" "/foo/bin:/foo\ bar/bin:/baz/bin"
} }

View File

@ -72,6 +72,8 @@ setup_repo_with_upstream() {
git clone "$remote" clone git clone "$remote" clone
cd clone cd clone
SCM_GIT_SHOW_COMMIT_COUNT=true
git_prompt_vars git_prompt_vars
assert_equal "$SCM_BRANCH" "${pre}" assert_equal "$SCM_BRANCH" "${pre}"
@ -148,6 +150,7 @@ setup_repo_with_upstream() {
pushd "${repo}" pushd "${repo}"
SCM_GIT_SHOW_REMOTE_INFO=true SCM_GIT_SHOW_REMOTE_INFO=true
SCM_GIT_SHOW_COMMIT_COUNT=true
git_prompt_vars git_prompt_vars
assert_equal "$SCM_BRANCH" "${pre}my-remote${post}" assert_equal "$SCM_BRANCH" "${pre}my-remote${post}"
@ -168,6 +171,7 @@ setup_repo_with_upstream() {
pushd "${repo}" pushd "${repo}"
SCM_GIT_SHOW_REMOTE_INFO=auto SCM_GIT_SHOW_REMOTE_INFO=auto
SCM_GIT_SHOW_COMMIT_COUNT=true
git_prompt_vars git_prompt_vars
assert_equal "$SCM_BRANCH" "${pre}${post}" assert_equal "$SCM_BRANCH" "${pre}${post}"
@ -204,6 +208,7 @@ setup_repo_with_upstream() {
git remote add third-remote "$(mktemp -d)" git remote add third-remote "$(mktemp -d)"
SCM_GIT_SHOW_REMOTE_INFO=false SCM_GIT_SHOW_REMOTE_INFO=false
SCM_GIT_SHOW_COMMIT_COUNT=true
git_prompt_vars git_prompt_vars
assert_equal "$SCM_BRANCH" "${pre}${post}" assert_equal "$SCM_BRANCH" "${pre}${post}"
@ -225,6 +230,7 @@ setup_repo_with_upstream() {
pushd "${repo}" pushd "${repo}"
SCM_GIT_SHOW_REMOTE_INFO=true SCM_GIT_SHOW_REMOTE_INFO=true
SCM_GIT_SHOW_COMMIT_COUNT=true
git_prompt_vars git_prompt_vars
assert_equal "$SCM_BRANCH" "${pre} → my-remote${post}" assert_equal "$SCM_BRANCH" "${pre} → my-remote${post}"

View File

@ -0,0 +1,423 @@
#!/usr/bin/env bash
# vim: ft=bash ts=2 sw=2 sts=2
#
# agnoster's Theme - https://gist.github.com/3712874
# A Powerline-inspired theme for BASH
#
# (Converted from ZSH theme by Kenny Root)
# https://gist.github.com/kruton/8345450
#
# Updated & fixed by Erik Selberg erik@selberg.org 1/14/17
# Tested on MacOSX, Ubuntu, Amazon Linux
# Bash v3 and v4
#
# # README
#
# In order for this theme to render correctly, you will need a
# [Powerline-patched font](https://gist.github.com/1595572).
# I recommend: https://github.com/powerline/fonts.git
# > git clone https://github.com/powerline/fonts.git fonts
# > cd fonts
# > install.sh
# In addition, I recommend the
# [Solarized theme](https://github.com/altercation/solarized/) and, if you're
# using it on Mac OS X, [iTerm 2](http://www.iterm2.com/) over Terminal.app -
# it has significantly better color fidelity.
# Install:
# I recommend the following:
# $ cd home
# $ mkdir -p .bash/themes/agnoster-bash
# $ git clone https://github.com/speedenator/agnoster-bash.git .bash/themes/agnoster-bash
# then add the following to your .bashrc:
# export THEME=$HOME/.bash/themes/agnoster-bash/agnoster.bash
# if [[ -f $THEME ]]; then
# export DEFAULT_USER=`whoami`
# source $THEME
# fi
#
# # Goals
#
# The aim of this theme is to only show you *relevant* information. Like most
# prompts, it will only show git information when in a git working directory.
# However, it goes a step further: everything from the current user and
# hostname to whether the last call exited with an error to whether background
# jobs are running in this shell will all be displayed automatically when
# appropriate.
# Generally speaking, this script has limited support for right
# prompts (ala powerlevel9k on zsh), but it's pretty problematic in Bash.
# The general pattern is to write out the right prompt, hit \r, then
# write the left. This is problematic for the following reasons:
# - Doesn't properly resize dynamically when you resize the terminal
# - Changes to the prompt (like clearing and re-typing, super common) deletes the prompt
# - Getting the right alignment via columns / tput cols is pretty problematic (and is a bug in this version)
# - Bash prompt escapes (like \h or \w) don't get interpolated
#
# all in all, if you really, really want right-side prompts without a
# ton of work, recommend going to zsh for now. If you know how to fix this,
# would appreciate it!
# note: requires bash v4+... Mac users - you often have bash3.
# 'brew install bash' will set you free
PROMPT_DIRTRIM=2 # bash4 and above
######################################################################
DEBUG=0
debug() {
if [[ ${DEBUG} -ne 0 ]]; then
>&2 echo -e $*
fi
}
######################################################################
### Segment drawing
# A few utility functions to make it easy and re-usable to draw segmented prompts
CURRENT_BG='NONE'
CURRENT_RBG='NONE'
SEGMENT_SEPARATOR=''
RIGHT_SEPARATOR=''
LEFT_SUBSEG=''
RIGHT_SUBSEG=''
text_effect() {
case "$1" in
reset) echo 0;;
bold) echo 1;;
underline) echo 4;;
esac
}
# to add colors, see
# http://bitmote.com/index.php?post/2012/11/19/Using-ANSI-Color-Codes-to-Colorize-Your-Bash-Prompt-on-Linux
# under the "256 (8-bit) Colors" section, and follow the example for orange below
fg_color() {
case "$1" in
black) echo 30;;
red) echo 31;;
green) echo 32;;
yellow) echo 33;;
blue) echo 34;;
magenta) echo 35;;
cyan) echo 36;;
white) echo 37;;
orange) echo 38\;5\;166;;
esac
}
bg_color() {
case "$1" in
black) echo 40;;
red) echo 41;;
green) echo 42;;
yellow) echo 43;;
blue) echo 44;;
magenta) echo 45;;
cyan) echo 46;;
white) echo 47;;
orange) echo 48\;5\;166;;
esac;
}
# TIL: declare is global not local, so best use a different name
# for codes (mycodes) as otherwise it'll clobber the original.
# this changes from BASH v3 to BASH v4.
ansi() {
local seq
declare -a mycodes=("${!1}")
debug "ansi: ${!1} all: $* aka ${mycodes[@]}"
seq=""
for ((i = 0; i < ${#mycodes[@]}; i++)); do
if [[ -n $seq ]]; then
seq="${seq};"
fi
seq="${seq}${mycodes[$i]}"
done
debug "ansi debug:" '\\[\\033['${seq}'m\\]'
echo -ne '\[\033['${seq}'m\]'
# PR="$PR\[\033[${seq}m\]"
}
ansi_single() {
echo -ne '\[\033['$1'm\]'
}
# Begin a segment
# Takes two arguments, background and foreground. Both can be omitted,
# rendering default background/foreground.
prompt_segment() {
local bg fg
declare -a codes
debug "Prompting $1 $2 $3"
# if commented out from kruton's original... I'm not clear
# if it did anything, but it messed up things like
# prompt_status - Erik 1/14/17
# if [[ -z $1 || ( -z $2 && $2 != default ) ]]; then
codes=("${codes[@]}" $(text_effect reset))
# fi
if [[ -n $1 ]]; then
bg=$(bg_color $1)
codes=("${codes[@]}" $bg)
debug "Added $bg as background to codes"
fi
if [[ -n $2 ]]; then
fg=$(fg_color $2)
codes=("${codes[@]}" $fg)
debug "Added $fg as foreground to codes"
fi
debug "Codes: "
# declare -p codes
if [[ $CURRENT_BG != NONE && $1 != $CURRENT_BG ]]; then
declare -a intermediate=($(fg_color $CURRENT_BG) $(bg_color $1))
debug "pre prompt " $(ansi intermediate[@])
PR="$PR $(ansi intermediate[@])$SEGMENT_SEPARATOR"
debug "post prompt " $(ansi codes[@])
PR="$PR$(ansi codes[@]) "
else
debug "no current BG, codes is $codes[@]"
PR="$PR$(ansi codes[@]) "
fi
CURRENT_BG=$1
[[ -n $3 ]] && PR="$PR$3"
}
# End the prompt, closing any open segments
prompt_end() {
if [[ -n $CURRENT_BG ]]; then
declare -a codes=($(text_effect reset) $(fg_color $CURRENT_BG))
PR="$PR $(ansi codes[@])$SEGMENT_SEPARATOR"
fi
declare -a reset=($(text_effect reset))
PR="$PR $(ansi reset[@])"
CURRENT_BG=''
}
### virtualenv prompt
prompt_virtualenv() {
if [[ -n $VIRTUAL_ENV ]]; then
color=cyan
prompt_segment $color $PRIMARY_FG
prompt_segment $color white "$(basename $VIRTUAL_ENV)"
fi
}
### Prompt components
# Each component will draw itself, and hide itself if no information needs to be shown
# Context: user@hostname (who am I and where am I)
prompt_context() {
local user=`whoami`
if [[ $user != $DEFAULT_USER || -n $SSH_CLIENT ]]; then
prompt_segment black default "$user@\h"
fi
}
# prints history followed by HH:MM, useful for remembering what
# we did previously
prompt_histdt() {
prompt_segment black default "\! [\A]"
}
git_status_dirty() {
dirty=$(git status -s 2> /dev/null | tail -n 1)
[[ -n $dirty ]] && echo " ●"
}
# Git: branch/detached head, dirty status
prompt_git() {
local ref dirty
if $(git rev-parse --is-inside-work-tree >/dev/null 2>&1); then
ZSH_THEME_GIT_PROMPT_DIRTY='±'
dirty=$(git_status_dirty)
ref=$(git symbolic-ref HEAD 2> /dev/null) || ref="$(git show-ref --head -s --abbrev |head -n1 2> /dev/null)"
if [[ -n $dirty ]]; then
prompt_segment yellow black
else
prompt_segment green black
fi
PR="$PR${ref/refs\/heads\// }$dirty"
fi
}
# Dir: current working directory
prompt_dir() {
prompt_segment blue black '\w'
}
# Status:
# - was there an error
# - am I root
# - are there background jobs?
prompt_status() {
local symbols
symbols=()
[[ $RETVAL -ne 0 ]] && symbols+="$(ansi_single $(fg_color red))"
[[ $UID -eq 0 ]] && symbols+="$(ansi_single $(fg_color yellow))"
[[ $(jobs -l | wc -l) -gt 0 ]] && symbols+="$(ansi_single $(fg_color cyan))"
[[ -n "$symbols" ]] && prompt_segment black default "$symbols"
}
######################################################################
#
# experimental right prompt stuff
# requires setting prompt_foo to use PRIGHT vs PR
# doesn't quite work per above
rightprompt() {
printf "%*s" $COLUMNS "$PRIGHT"
}
# quick right prompt I grabbed to test things.
__command_rprompt() {
local times= n=$COLUMNS tz
for tz in ZRH:Europe/Zurich PIT:US/Eastern \
MTV:US/Pacific TOK:Asia/Tokyo; do
[ $n -gt 40 ] || break
times="$times ${tz%%:*}\e[30;1m:\e[0;36;1m"
times="$times$(TZ=${tz#*:} date +%H:%M)\e[0m"
n=$(( $n - 10 ))
done
[ -z "$times" ] || printf "%${n}s$times\\r" ''
}
# PROMPT_COMMAND=__command_rprompt
# this doens't wrap code in \[ \]
ansi_r() {
local seq
declare -a mycodes2=("${!1}")
debug "ansi: ${!1} all: $* aka ${mycodes2[@]}"
seq=""
for ((i = 0; i < ${#mycodes2[@]}; i++)); do
if [[ -n $seq ]]; then
seq="${seq};"
fi
seq="${seq}${mycodes2[$i]}"
done
debug "ansi debug:" '\\[\\033['${seq}'m\\]'
echo -ne '\033['${seq}'m'
# PR="$PR\[\033[${seq}m\]"
}
# Begin a segment on the right
# Takes two arguments, background and foreground. Both can be omitted,
# rendering default background/foreground.
prompt_right_segment() {
local bg fg
declare -a codes
debug "Prompt right"
debug "Prompting $1 $2 $3"
# if commented out from kruton's original... I'm not clear
# if it did anything, but it messed up things like
# prompt_status - Erik 1/14/17
# if [[ -z $1 || ( -z $2 && $2 != default ) ]]; then
codes=("${codes[@]}" $(text_effect reset))
# fi
if [[ -n $1 ]]; then
bg=$(bg_color $1)
codes=("${codes[@]}" $bg)
debug "Added $bg as background to codes"
fi
if [[ -n $2 ]]; then
fg=$(fg_color $2)
codes=("${codes[@]}" $fg)
debug "Added $fg as foreground to codes"
fi
debug "Right Codes: "
# declare -p codes
# right always has a separator
# if [[ $CURRENT_RBG != NONE && $1 != $CURRENT_RBG ]]; then
# $CURRENT_RBG=
# fi
declare -a intermediate2=($(fg_color $1) $(bg_color $CURRENT_RBG) )
# PRIGHT="$PRIGHT---"
debug "pre prompt " $(ansi_r intermediate2[@])
PRIGHT="$PRIGHT$(ansi_r intermediate2[@])$RIGHT_SEPARATOR"
debug "post prompt " $(ansi_r codes[@])
PRIGHT="$PRIGHT$(ansi_r codes[@]) "
# else
# debug "no current BG, codes is $codes[@]"
# PRIGHT="$PRIGHT$(ansi codes[@]) "
# fi
CURRENT_RBG=$1
[[ -n $3 ]] && PRIGHT="$PRIGHT$3"
}
######################################################################
## Emacs prompt --- for dir tracking
# stick the following in your .emacs if you use this:
# (setq dirtrack-list '(".*DIR *\\([^ ]*\\) DIR" 1 nil))
# (defun dirtrack-filter-out-pwd-prompt (string)
# "dirtrack-mode doesn't remove the PWD match from the prompt. This does."
# ;; TODO: support dirtrack-mode's multiline regexp.
# (if (and (stringp string) (string-match (first dirtrack-list) string))
# (replace-match "" t t string 0)
# string))
# (add-hook 'shell-mode-hook
# #'(lambda ()
# (dirtrack-mode 1)
# (add-hook 'comint-preoutput-filter-functions
# 'dirtrack-filter-out-pwd-prompt t t)))
prompt_emacsdir() {
# no color or other setting... this will be deleted per above
PR="DIR \w DIR$PR"
}
######################################################################
## Main prompt
build_prompt() {
[[ ! -z ${AG_EMACS_DIR+x} ]] && prompt_emacsdir
prompt_status
#[[ -z ${AG_NO_HIST+x} ]] && prompt_histdt
[[ -z ${AG_NO_CONTEXT+x} ]] && prompt_context
prompt_virtualenv
prompt_dir
prompt_git
prompt_end
}
# from orig...
# export PS1='$(ansi_single $(text_effect reset)) $(build_prompt) '
# this doesn't work... new model: create a prompt via a PR variable and
# use that.
set_bash_prompt() {
RETVAL=$?
PR=""
PRIGHT=""
CURRENT_BG=NONE
PR="$(ansi_single $(text_effect reset))"
build_prompt
# uncomment below to use right prompt
# PS1='\[$(tput sc; printf "%*s" $COLUMNS "$PRIGHT"; tput rc)\]'$PR
PS1=$PR
}
PROMPT_COMMAND=set_bash_prompt

View File

@ -33,6 +33,7 @@ SCM_GIT_IGNORE_UNTRACKED=${SCM_GIT_IGNORE_UNTRACKED:=false}
SCM_GIT_SHOW_CURRENT_USER=${SCM_GIT_SHOW_CURRENT_USER:=false} SCM_GIT_SHOW_CURRENT_USER=${SCM_GIT_SHOW_CURRENT_USER:=false}
SCM_GIT_SHOW_MINIMAL_INFO=${SCM_GIT_SHOW_MINIMAL_INFO:=false} SCM_GIT_SHOW_MINIMAL_INFO=${SCM_GIT_SHOW_MINIMAL_INFO:=false}
SCM_GIT_SHOW_STASH_INFO=${SCM_GIT_SHOW_STASH_INFO:=true} SCM_GIT_SHOW_STASH_INFO=${SCM_GIT_SHOW_STASH_INFO:=true}
SCM_GIT_SHOW_COMMIT_COUNT=${SCM_GIT_SHOW_COMMIT_COUNT:=true}
SCM_GIT='git' SCM_GIT='git'
SCM_GIT_CHAR='±' SCM_GIT_CHAR='±'
@ -79,15 +80,20 @@ RBENV_THEME_PROMPT_SUFFIX='|'
RBFU_THEME_PROMPT_PREFIX=' |' RBFU_THEME_PROMPT_PREFIX=' |'
RBFU_THEME_PROMPT_SUFFIX='|' RBFU_THEME_PROMPT_SUFFIX='|'
GIT_EXE=`which git 2> /dev/null || true`
P4_EXE=`which p4 2> /dev/null || true`
HG_EXE=`which hg 2> /dev/null || true`
SVN_EXE=`which svn 2> /dev/null || true`
function scm { function scm {
if [[ "$SCM_CHECK" = false ]]; then SCM=$SCM_NONE if [[ "$SCM_CHECK" = false ]]; then SCM=$SCM_NONE
elif [[ -f .git/HEAD ]] && which git &> /dev/null; then SCM=$SCM_GIT elif [[ -f .git/HEAD ]] && [[ -x "$GIT_EXE" ]]; then SCM=$SCM_GIT
elif which git &> /dev/null && [[ -n "$(git rev-parse --is-inside-work-tree 2> /dev/null)" ]]; then SCM=$SCM_GIT elif [[ -x "$GIT_EXE" ]] && [[ -n "$(git rev-parse --is-inside-work-tree 2> /dev/null)" ]]; then SCM=$SCM_GIT
elif which p4 &> /dev/null && [[ -n "$(p4 set P4CLIENT 2> /dev/null)" ]]; then SCM=$SCM_P4 elif [[ -x "$P4_EXE" ]] && [[ -n "$(p4 set P4CLIENT 2> /dev/null)" ]]; then SCM=$SCM_P4
elif [[ -d .hg ]] && which hg &> /dev/null; then SCM=$SCM_HG elif [[ -d .hg ]] && [[ -x "$HG_EXE" ]]; then SCM=$SCM_HG
elif which hg &> /dev/null && [[ -n "$(hg root 2> /dev/null)" ]]; then SCM=$SCM_HG elif [[ -x "$HG_EXE" ]] && [[ -n "$(hg root 2> /dev/null)" ]]; then SCM=$SCM_HG
elif [[ -d .svn ]] && which svn &> /dev/null; then SCM=$SCM_SVN elif [[ -d .svn ]] && [[ -x "$SVN_EXE" ]]; then SCM=$SCM_SVN
elif which svn &> /dev/null && [[ -n "$(svn info --show-item wc-root 2>/dev/null)" ]]; then SCM=$SCM_SVN elif [[ -x "$SVN_EXE" ]] && [[ -n "$(svn info --show-item wc-root 2>/dev/null)" ]]; then SCM=$SCM_SVN
else SCM=$SCM_NONE else SCM=$SCM_NONE
fi fi
} }
@ -181,8 +187,14 @@ function git_prompt_vars {
fi fi
IFS=$'\t' read -r commits_behind commits_ahead <<< "$(_git-upstream-behind-ahead)" IFS=$'\t' read -r commits_behind commits_ahead <<< "$(_git-upstream-behind-ahead)"
[[ "${commits_ahead}" -gt 0 ]] && SCM_BRANCH+="${SCM_GIT_AHEAD_BEHIND_PREFIX_CHAR}${SCM_GIT_AHEAD_CHAR}${commits_ahead}" if [[ "${commits_ahead}" -gt 0 ]]; then
[[ "${commits_behind}" -gt 0 ]] && SCM_BRANCH+="${SCM_GIT_AHEAD_BEHIND_PREFIX_CHAR}${SCM_GIT_BEHIND_CHAR}${commits_behind}" SCM_BRANCH+="${SCM_GIT_AHEAD_BEHIND_PREFIX_CHAR}${SCM_GIT_AHEAD_CHAR}"
[[ "${SCM_GIT_SHOW_COMMIT_COUNT}" = "true" ]] && SCM_BRANCH+="${commits_ahead}"
fi
if [[ "${commits_behind}" -gt 0 ]]; then
SCM_BRANCH+="${SCM_GIT_AHEAD_BEHIND_PREFIX_CHAR}${SCM_GIT_BEHIND_CHAR}"
[[ "${SCM_GIT_SHOW_COMMIT_COUNT}" = "true" ]] && SCM_BRANCH+="${commits_behind}"
fi
if [[ "${SCM_GIT_SHOW_STASH_INFO}" = "true" ]]; then if [[ "${SCM_GIT_SHOW_STASH_INFO}" = "true" ]]; then
local stash_count local stash_count
@ -503,4 +515,4 @@ function safe_append_prompt_command {
function _save-and-reload-history() { function _save-and-reload-history() {
local autosave=${1:-0} local autosave=${1:-0}
[[ $autosave -eq 1 ]] && history -a && history -c && history -r [[ $autosave -eq 1 ]] && history -a && history -c && history -r
} }

View File

@ -13,7 +13,7 @@ function prompt_command() {
if [ "$(whoami)" = root ]; then no_color=$red; else no_color=$white; fi if [ "$(whoami)" = root ]; then no_color=$red; else no_color=$white; fi
PS1="${no_color}\u${reset_color}:${blue}\W/${reset_color} \[$(scm_prompt_info)\]${normal}$ " PS1="${no_color}\u${reset_color}:${blue}\W/${reset_color} $(scm_prompt_info)${normal}$ "
} }
safe_append_prompt_command prompt_command safe_append_prompt_command prompt_command

View File

@ -0,0 +1,68 @@
#!/usr/bin/env bash
. "$BASH_IT/themes/gitline/powerline.base.bash"
#For the logo(Uncomment if you want a logo before your name)
#PROMPT_DISTRO_LOGO="💻"
PROMPT_DISTRO_LOGO_COLOR=15
PROMPT_DISTRO_LOGO_COLORBG=52
#Prompt Seperator Charactors
PROMPT_CHAR=${POWERLINE_PROMPT_CHAR:=""}
POWERLINE_LEFT_SEPARATOR=${POWERLINE_LEFT_SEPARATOR:=""}
#USER INFO CHARACTERS
USER_INFO_SSH_CHAR=${POWERLINE_USER_INFO_SSH_CHAR:=" "}
USER_INFO_SUDO_CHAR=${POWERLINE_USER_INFO_SUDO_CHAR:=" "}
USER_INFO_THEME_PROMPT_COLOR=91
USER_INFO_THEME_PROMPT_COLOR_SUDO=1
#PYTHON VENV
PYTHON_VENV_CHAR=${POWERLINE_PYTHON_VENV_CHAR:=" "}
CONDA_PYTHON_VENV_CHAR=${POWERLINE_CONDA_PYTHON_VENV_CHAR:="c "}
PYTHON_VENV_THEME_PROMPT_COLOR=17
#GIT Prompt Symbols
SCM_NONE_CHAR=""
SCM_GIT_CHAR=${POWERLINE_SCM_GIT_CHAR:=" "}
SCM_HG_CHAR=${POWERLINE_SCM_HG_CHAR:="☿ "}
SCM_THEME_PROMPT_CLEAN=" ✓ "
SCM_THEME_PROMPT_DIRTY=" "
SCM_THEME_PROMPT_COLOR=91
SCM_THEME_PROMPT_CLEAN_COLOR=41
SCM_THEME_PROMPT_DIRTY_COLOR=94
SCM_THEME_PROMPT_STAGED_COLOR=220 #52
SCM_THEME_PROMPT_UNSTAGED_COLOR=81
#Ruby Prompt Symbols
RVM_THEME_PROMPT_PREFIX=""
RVM_THEME_PROMPT_SUFFIX=""
RBENV_THEME_PROMPT_PREFIX=""
RBENV_THEME_PROMPT_SUFFIX=""
RUBY_THEME_PROMPT_COLOR=161
RUBY_CHAR=${POWERLINE_RUBY_CHAR:="r "}
CWD_THEME_DIR_SEPARATOR=""
CWD_THEME_DIR_SEPARATOR_COLOR=52
CWD_THEME_PROMPT_COLOR=252
HOST_THEME_PROMPT_COLOR=88
LAST_STATUS_THEME_PROMPT_COLOR=52
#Clock
CLOCK_THEME_PROMPT_COLOR=240
#For Battery Plugin
BATTERY_AC_CHAR=${BATTERY_AC_CHAR:="⚡"}
BATTERY_STATUS_THEME_PROMPT_GOOD_COLOR=70
BATTERY_STATUS_THEME_PROMPT_LOW_COLOR=208
BATTERY_STATUS_THEME_PROMPT_CRITICAL_COLOR=160
THEME_CLOCK_FORMAT=${THEME_CLOCK_FORMAT:="%H:%M:%S"}
IN_VIM_THEME_PROMPT_COLOR=245
IN_VIM_THEME_PROMPT_TEXT="vim"
safe_append_prompt_command __powerline_prompt_command

View File

@ -0,0 +1,228 @@
# Sudo check after every command
THEME_CHECK_SUDO=${THEME_CHECK_SUDO:=true}
#To set color for foreground and background
function set_color {
set +u
if [[ "${1}" != "-" ]]; then
fg="38;5;${1}"
fi
if [[ "${2}" != "-" ]]; then
bg="48;5;${2}"
[[ -n "${fg}" ]] && bg=";${bg}"
fi
echo -e "\[\033[${fg}${bg}m\]"
}
#Customising User Info Segment
function __powerline_user_info_prompt {
local user_info="${USER}"
local color=${USER_INFO_THEME_PROMPT_COLOR}
local fg_color=15
if [[ "${THEME_CHECK_SUDO}" = true ]]; then
if sudo -n uptime 2>&1 | grep -q "load"; then
color=${USER_INFO_THEME_PROMPT_COLOR_SUDO}
fi
fi
case "${POWERLINE_PROMPT_USER_INFO_MODE}" in
"sudo")
if [[ "${color}" = "${USER_INFO_THEME_PROMPT_COLOR_SUDO}" ]]; then
user_info="👑 ${USER}"
fg_color=227
color=${USER_INFO_THEME_PROMPT_COLOR_SUDO}
fi
;;
*)
if [[ -n "${SSH_CLIENT}" ]] || [[ -n "${SSH_CONNECTION}" ]]; then
user_info="${USER_INFO_SSH_CHAR}${USER}"
else
user_info="${USER}"
fi
;;
esac
[[ -n "${user_info}" ]] && echo "${user_info}|${color}|${fg_color}"
}
#Customising Ruby Prompt
function __powerline_ruby_prompt {
local ruby_version=""
local fg_color=206
if _command_exists rvm; then
ruby_version="$(rvm_version_prompt)"
elif _command_exists rbenv; then
ruby_version=$(rbenv_version_prompt)
fi
[[ -n "${ruby_version}" ]] && echo "${RUBY_CHAR}${ruby_version}|${RUBY_THEME_PROMPT_COLOR}|${fg_color}"
}
#Customising Python (venv) Prompt
function __powerline_python_venv_prompt {
set +u
local python_venv=""
local fg_color=206
if [[ -n "${CONDA_DEFAULT_ENV}" ]]; then
python_venv="${CONDA_DEFAULT_ENV}"
PYTHON_VENV_CHAR=${CONDA_PYTHON_VENV_CHAR}
elif [[ -n "${VIRTUAL_ENV}" ]]; then
python_venv=$(basename "${VIRTUAL_ENV}")
fi
[[ -n "${python_venv}" ]] && echo "${PYTHON_VENV_CHAR}${python_venv}|${PYTHON_VENV_THEME_PROMPT_COLOR}|${fg_color}"
}
#Customising SCM(GIT) Prompt
function __powerline_scm_prompt {
local color=""
local scm_prompt=""
local fg_color=206
scm_prompt_vars
if [[ "${SCM_NONE_CHAR}" != "${SCM_CHAR}" ]]; then
if [[ "${SCM_DIRTY}" -eq 3 ]]; then
color=${SCM_THEME_PROMPT_STAGED_COLOR}
fg_color=124
elif [[ "${SCM_DIRTY}" -eq 2 ]]; then
color=${SCM_THEME_PROMPT_UNSTAGED_COLOR}
fg_color=56
elif [[ "${SCM_DIRTY}" -eq 1 ]]; then
color=${SCM_THEME_PROMPT_DIRTY_COLOR}
fg_color=118
elif [[ "${SCM_DIRTY}" -eq 0 ]]; then
color=${SCM_THEME_PROMPT_CLEAN_COLOR}
fg_color=16
else
color=${SCM_THEME_PROMPT_COLOR}
fg_color=255
fi
if [[ "${SCM_GIT_CHAR}" == "${SCM_CHAR}" ]]; then
scm_prompt+="${SCM_CHAR}${SCM_BRANCH}${SCM_STATE}"
elif [[ "${SCM_P4_CHAR}" == "${SCM_CHAR}" ]]; then
scm_prompt+="${SCM_CHAR}${SCM_BRANCH}${SCM_STATE}"
elif [[ "${SCM_HG_CHAR}" == "${SCM_CHAR}" ]]; then
scm_prompt+="${SCM_CHAR}${SCM_BRANCH}${SCM_STATE}"
fi
echo "${scm_prompt}${scm}|${color}|${fg_color}"
fi
}
function __powerline_cwd_prompt {
local cwd=$(pwd | sed "s|^${HOME}|~|")
local fg_color=16
echo "${cwd}|${CWD_THEME_PROMPT_COLOR}|${fg_color}"
}
function __powerline_hostname_prompt {
local fg_color=206
echo "$(hostname -s)|${HOST_THEME_PROMPT_COLOR}|${fg_color}"
}
function __powerline_wd_prompt {
local fg_color=206
echo "\W|${CWD_THEME_PROMPT_COLOR}|${fg_color}"
}
function __powerline_clock_prompt {
local fg_color=206
echo "$(date +"${THEME_CLOCK_FORMAT}")|${CLOCK_THEME_PROMPT_COLOR}|${fg_color}"
}
function __powerline_battery_prompt {
local color=""
local battery_status="$(battery_percentage 2> /dev/null)"
local fg_color=255
if [[ -z "${battery_status}" ]] || [[ "${battery_status}" = "-1" ]] || [[ "${battery_status}" = "no" ]]; then
true
else
if [[ "$((10#${battery_status}))" -le 5 ]]; then
color="${BATTERY_STATUS_THEME_PROMPT_CRITICAL_COLOR}"
elif [[ "$((10#${battery_status}))" -le 25 ]]; then
color="${BATTERY_STATUS_THEME_PROMPT_LOW_COLOR}"
else
color="${BATTERY_STATUS_THEME_PROMPT_GOOD_COLOR}"
fi
ac_adapter_connected && battery_status="${BATTERY_AC_CHAR}${battery_status}"
echo "${battery_status}%|${color}|${fg_color}"
fi
}
function __powerline_in_vim_prompt {
local fg_color=206
if [ -n "$VIMRUNTIME" ]; then
echo "${IN_VIM_THEME_PROMPT_TEXT}|${IN_VIM_THEME_PROMPT_COLOR}|${fg_color}"
fi
}
function __powerline_aws_profile_prompt {
local fg_color=206
if [[ -n "${AWS_PROFILE}" ]]; then
echo "${AWS_PROFILE_CHAR}${AWS_PROFILE}|${AWS_PROFILE_PROMPT_COLOR}|${fg_color}"
fi
}
function __powerline_left_segment {
local OLD_IFS="${IFS}"; IFS="|"
local params=( $1 )
IFS="${OLD_IFS}"
local separator_char="${POWERLINE_LEFT_SEPARATOR}"
local separator=""
local fg_color=206
#for seperator character
if [[ "${SEGMENTS_AT_LEFT}" -gt 0 ]]; then
separator="$(set_color ${LAST_SEGMENT_COLOR} ${params[1]})${separator_char}${normal}"
fi
#change here to cahnge fg color
LEFT_PROMPT+="${separator}$(set_color ${params[2]} ${params[1]}) ${params[0]} ${normal}"
#seperator char color = current bg
LAST_SEGMENT_COLOR=${params[1]}
(( SEGMENTS_AT_LEFT += 1 ))
}
function __powerline_last_status_prompt {
[[ "$1" -ne 0 ]] && echo "${1}|${LAST_STATUS_THEME_PROMPT_COLOR}"
}
function __powerline_prompt_command {
local last_status="$?" ## always the first
local separator_char="${POWERLINE_PROMPT_CHAR}"
LEFT_PROMPT=""
SEGMENTS_AT_LEFT=0
LAST_SEGMENT_COLOR=""
if [[ -n "${POWERLINE_PROMPT_DISTRO_LOGO}" ]]; then
LEFT_PROMPT+="$(set_color ${PROMPT_DISTRO_LOGO_COLOR} ${PROMPT_DISTRO_LOGO_COLORBG})${PROMPT_DISTRO_LOGO}$(set_color - -)"
fi
## left prompt ##
for segment in $POWERLINE_PROMPT; do
local info="$(__powerline_${segment}_prompt)"
[[ -n "${info}" ]] && __powerline_left_segment "${info}"
done
[[ "${last_status}" -ne 0 ]] && __powerline_left_segment $(__powerline_last_status_prompt ${last_status})
[[ -n "${LEFT_PROMPT}" ]] && LEFT_PROMPT+="$(set_color ${LAST_SEGMENT_COLOR} -)${separator_char}${normal}"
PS1="${LEFT_PROMPT} "
## cleanup ##
unset LAST_SEGMENT_COLOR \
LEFT_PROMPT \
SEGMENTS_AT_LEFT
}

View File

@ -0,0 +1,13 @@
#!/usr/bin/env bash
SCM_THEME_PROMPT_DIRTY=" ${red}"
SCM_THEME_PROMPT_CLEAN=" ${green}"
SCM_THEME_PROMPT_PREFIX=" ${purple}|${green} "
SCM_THEME_PROMPT_SUFFIX="${purple} |"
prompt() {
exit_code=$?
PS1="$(if [[ ${exit_code} = 0 ]]; then echo "${green}${exit_code}"; else echo "${red}${exit_code}"; fi) ${yellow}\t ${cyan}\w$(scm_prompt_info)${reset_color}\n${orange}$ ${reset_color}"
}
safe_append_prompt_command prompt

View File

@ -1,6 +1,13 @@
# Sexy Bash Prompt, inspired by "Extravagant Zsh Prompt" # Sexy Bash Prompt, inspired by "Extravagant Zsh Prompt"
# Screenshot: http://cloud.gf3.ca/M5rG # Screenshot: http://cloud.gf3.ca/M5rG
# A big thanks to \amethyst on Freenode # A big thanks to \amethyst on Freenode
#
# Configuration:
# * To visualize python environment (virtualenv and conda) add in your .bash_profile the following line:
# export SEXY_THEME_SHOW_PYTHON=true
# Default setting
SEXY_THEME_SHOW_PYTHON="${SEXY_THEME_SHOW_PYTHON:=false}"
if tput setaf 1 &> /dev/null; then if tput setaf 1 &> /dev/null; then
if [[ $(tput colors) -ge 256 ]] 2>/dev/null; then if [[ $(tput colors) -ge 256 ]] 2>/dev/null; then
@ -34,9 +41,16 @@ parse_git_dirty () {
parse_git_branch () { parse_git_branch () {
git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e "s/* \(.*\)/\1$(parse_git_dirty)/" git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e "s/* \(.*\)/\1$(parse_git_dirty)/"
} }
env_prompt () {
echo -e "($(virtualenv_prompt)$(condaenv_prompt))"
}
function prompt_command() { function prompt_command() {
PS1="\[${BOLD}${MAGENTA}\]\u \[$WHITE\]at \[$ORANGE\]\h \[$WHITE\]in \[$GREEN\]\w\[$WHITE\]\$([[ -n \$(git branch 2> /dev/null) ]] && echo \" on \")\[$PURPLE\]\$(parse_git_branch)\[$WHITE\]\n\$ \[$RESET\]" PS1="\[${BOLD}${MAGENTA}\]\u \[$WHITE\]at \[$ORANGE\]\h \[$WHITE\]in \[$GREEN\]\w\[$WHITE\]\$([[ -n \$(git branch 2> /dev/null) ]] && echo \" on \")\[$PURPLE\]\$(parse_git_branch)\[$WHITE\]\n\$ \[$RESET\]"
if [ "$SEXY_THEME_SHOW_PYTHON" = true ] ; then
PS1="\[${BOLD}${WHITE}\]$(env_prompt) "$PS1
fi
} }
safe_append_prompt_command prompt_command safe_append_prompt_command prompt_command