From 490e0c86c5298d4601f910ccc41571d8e3fdcb57 Mon Sep 17 00:00:00 2001 From: Jonathan Hodgson Date: Sun, 14 May 2017 10:36:16 +0100 Subject: [PATCH] Copy config removing sensitive data --- .bash_logout | 1 + .bash_profile | 1 + .bashrc | 1 + .bin | 1 + .config | 1 + .conky | 1 + .gitconfig | 1 + .local | 1 + Templates/article.latex | 33 + Templates/html | 12 + Templates/latex | 1 + Templates/letter.latex | 37 + Templates/oldletter.latex | 60 + bash_logout | 3 + bash_profile | 10 + bashrc | 344 ++++ bin/addhost | 26 + bin/capslock | 3 + bin/code-to-pdf | 22 + bin/csvtomd | 157 ++ bin/extract | 80 + bin/git-cleaner | 75 + bin/git-delete-submodule | 24 + bin/git-jump | 158 ++ bin/git-nuke | 12 + bin/git-open | 149 ++ bin/git-recall | 349 ++++ bin/git-wtf | 364 ++++ bin/imgcat | 103 ++ bin/new | 91 + bin/php-swap | 31 + bin/update3rdPartyPlugins | 8 + bin/weather | 7 + bin/where | 2 + config/conky/.themepacks | 4 + config/conky/BibleVerse/bibleGateway | 54 + config/conky/BibleVerse/bibleGateway.py | 11 + config/conky/BibleVerse/reference.py | 8 + config/conky/MyBlue/MyBlue | 42 + config/conky/Octupi_Arch/FAMI_E.TTF | Bin 0 -> 27996 bytes config/conky/Octupi_Arch/co_main | 60 + config/conky/Octupi_Arch/face | 1 + config/conky/Octupi_Arch/face.png | Bin 0 -> 161295 bytes config/conky/Octupi_Arch/faceold | Bin 0 -> 2641 bytes config/conky/Octupi_Arch/main.lua | 1012 +++++++++++ config/conky/Octupi_Arch/settings | 17 + config/conky/conky-startup.sh | 8 + config/i3/config | 361 ++++ config/i3/configWork | 363 ++++ config/i3/fadeLockScreen | 36 + config/i3/i3exit | 31 + config/inkscape/preferences.xml | 1351 +++++++++++++++ config/powerline-shell/CHANGELOG.md | 86 + config/powerline-shell/LICENSE | 20 + config/powerline-shell/README.md | 170 ++ config/powerline-shell/bob | 0 config/powerline-shell/circle.yml | 5 + config/powerline-shell/config.py | 57 + config/powerline-shell/config.py.dist | 57 + config/powerline-shell/dev_requirements.txt | 3 + config/powerline-shell/install.py | 49 + config/powerline-shell/powerline-shell.py | 704 ++++++++ .../powerline-shell/powerline_shell_base.py | 209 +++ config/ranger/.gitignore | 3 + config/ranger/commands.py | 61 + config/ranger/commands_full.py | 1486 +++++++++++++++++ config/ranger/rc.conf | 618 +++++++ config/ranger/rifle.conf | 211 +++ config/ranger/scope.sh | 128 ++ config/termite/config | 81 + etc/dnsmasq.conf | 668 ++++++++ etc/pacman.conf | 101 ++ gitconfig | 16 + .../chromium-snapshot-bin-big.desktop | 114 ++ local/share/applications/evince.desktop | 257 +++ xampp/extra/httpd-autoindex.conf | 93 ++ xampp/extra/httpd-dav.conf | 50 + xampp/extra/httpd-default.conf | 90 + xampp/extra/httpd-info.conf | 36 + xampp/extra/httpd-languages.conf | 141 ++ xampp/extra/httpd-manual.conf | 33 + xampp/extra/httpd-mpm.conf | 119 ++ xampp/extra/httpd-multilang-errordoc.conf | 52 + xampp/extra/httpd-ssl.conf | 244 +++ xampp/extra/httpd-userdir.conf | 21 + xampp/extra/httpd-vhosts.conf | 30 + xampp/extra/httpd-xampp.conf | 58 + xampp/extra/proxy-html.conf | 90 + xampp/httpd.conf | 525 ++++++ 89 files changed, 12214 insertions(+) create mode 120000 .bash_logout create mode 120000 .bash_profile create mode 120000 .bashrc create mode 120000 .bin create mode 120000 .config create mode 120000 .conky create mode 120000 .gitconfig create mode 120000 .local create mode 100644 Templates/article.latex create mode 100644 Templates/html create mode 120000 Templates/latex create mode 100644 Templates/letter.latex create mode 100644 Templates/oldletter.latex create mode 100644 bash_logout create mode 100644 bash_profile create mode 100644 bashrc create mode 100755 bin/addhost create mode 100755 bin/capslock create mode 100755 bin/code-to-pdf create mode 100755 bin/csvtomd create mode 100755 bin/extract create mode 100755 bin/git-cleaner create mode 100755 bin/git-delete-submodule create mode 100755 bin/git-jump create mode 100755 bin/git-nuke create mode 100755 bin/git-open create mode 100755 bin/git-recall create mode 100755 bin/git-wtf create mode 100755 bin/imgcat create mode 100755 bin/new create mode 100755 bin/php-swap create mode 100755 bin/update3rdPartyPlugins create mode 100755 bin/weather create mode 100755 bin/where create mode 100644 config/conky/.themepacks create mode 100644 config/conky/BibleVerse/bibleGateway create mode 100644 config/conky/BibleVerse/bibleGateway.py create mode 100644 config/conky/BibleVerse/reference.py create mode 100644 config/conky/MyBlue/MyBlue create mode 100755 config/conky/Octupi_Arch/FAMI_E.TTF create mode 100644 config/conky/Octupi_Arch/co_main create mode 120000 config/conky/Octupi_Arch/face create mode 100644 config/conky/Octupi_Arch/face.png create mode 100644 config/conky/Octupi_Arch/faceold create mode 100644 config/conky/Octupi_Arch/main.lua create mode 100644 config/conky/Octupi_Arch/settings create mode 100644 config/conky/conky-startup.sh create mode 100644 config/i3/config create mode 100644 config/i3/configWork create mode 100755 config/i3/fadeLockScreen create mode 100755 config/i3/i3exit create mode 100644 config/inkscape/preferences.xml create mode 100644 config/powerline-shell/CHANGELOG.md create mode 100644 config/powerline-shell/LICENSE create mode 100644 config/powerline-shell/README.md create mode 100644 config/powerline-shell/bob create mode 100644 config/powerline-shell/circle.yml create mode 100644 config/powerline-shell/config.py create mode 100644 config/powerline-shell/config.py.dist create mode 100644 config/powerline-shell/dev_requirements.txt create mode 100755 config/powerline-shell/install.py create mode 100755 config/powerline-shell/powerline-shell.py create mode 100755 config/powerline-shell/powerline_shell_base.py create mode 100644 config/ranger/.gitignore create mode 100644 config/ranger/commands.py create mode 100644 config/ranger/commands_full.py create mode 100644 config/ranger/rc.conf create mode 100644 config/ranger/rifle.conf create mode 100755 config/ranger/scope.sh create mode 100644 config/termite/config create mode 100644 etc/dnsmasq.conf create mode 100644 etc/pacman.conf create mode 100644 gitconfig create mode 100644 local/share/applications/chromium-snapshot-bin-big.desktop create mode 100644 local/share/applications/evince.desktop create mode 100644 xampp/extra/httpd-autoindex.conf create mode 100644 xampp/extra/httpd-dav.conf create mode 100644 xampp/extra/httpd-default.conf create mode 100644 xampp/extra/httpd-info.conf create mode 100644 xampp/extra/httpd-languages.conf create mode 100644 xampp/extra/httpd-manual.conf create mode 100644 xampp/extra/httpd-mpm.conf create mode 100644 xampp/extra/httpd-multilang-errordoc.conf create mode 100644 xampp/extra/httpd-ssl.conf create mode 100644 xampp/extra/httpd-userdir.conf create mode 100644 xampp/extra/httpd-vhosts.conf create mode 100644 xampp/extra/httpd-xampp.conf create mode 100644 xampp/extra/proxy-html.conf create mode 100644 xampp/httpd.conf diff --git a/.bash_logout b/.bash_logout new file mode 120000 index 00000000..0a9b92a3 --- /dev/null +++ b/.bash_logout @@ -0,0 +1 @@ +bash_logout \ No newline at end of file diff --git a/.bash_profile b/.bash_profile new file mode 120000 index 00000000..2329555f --- /dev/null +++ b/.bash_profile @@ -0,0 +1 @@ +bash_profile \ No newline at end of file diff --git a/.bashrc b/.bashrc new file mode 120000 index 00000000..cee304e6 --- /dev/null +++ b/.bashrc @@ -0,0 +1 @@ +bashrc \ No newline at end of file diff --git a/.bin b/.bin new file mode 120000 index 00000000..c5e82d74 --- /dev/null +++ b/.bin @@ -0,0 +1 @@ +bin \ No newline at end of file diff --git a/.config b/.config new file mode 120000 index 00000000..30fa1cea --- /dev/null +++ b/.config @@ -0,0 +1 @@ +config \ No newline at end of file diff --git a/.conky b/.conky new file mode 120000 index 00000000..9d8006a2 --- /dev/null +++ b/.conky @@ -0,0 +1 @@ +.config/conky/ \ No newline at end of file diff --git a/.gitconfig b/.gitconfig new file mode 120000 index 00000000..61463854 --- /dev/null +++ b/.gitconfig @@ -0,0 +1 @@ +gitconfig \ No newline at end of file diff --git a/.local b/.local new file mode 120000 index 00000000..c2c027fe --- /dev/null +++ b/.local @@ -0,0 +1 @@ +local \ No newline at end of file diff --git a/Templates/article.latex b/Templates/article.latex new file mode 100644 index 00000000..627cdf5d --- /dev/null +++ b/Templates/article.latex @@ -0,0 +1,33 @@ +\documentclass[12pt]{article} + +\usepackage{geometry} % Required for adjusting page dimensions +\usepackage{amsmath} +\usepackage{amsthm} +\usepackage{amssymb} +\usepackage{amsfonts} +\usepackage{longtable} +\usepackage{booktabs} +\usepackage[UKenglish]{babel} +\geometry{ + paper=a4paper, % Change to letterpaper for US letter + top=3cm, % Top margin + bottom=1.5cm, % Bottom margin + left=4.5cm, % Left margin + right=4.5cm, % Right margin + %showframe, % Uncomment to show how the type block is set on the page +} + +\title{<++>} +\author{Jonathan Hodgson} +\date{\today} + + +\begin{document} +\maketitle + + +\section{<++>} +<++> + + +\end{document} diff --git a/Templates/html b/Templates/html new file mode 100644 index 00000000..23f4e6b5 --- /dev/null +++ b/Templates/html @@ -0,0 +1,12 @@ + + + + + <++> + <++> + + + <++> + + + diff --git a/Templates/latex b/Templates/latex new file mode 120000 index 00000000..99559768 --- /dev/null +++ b/Templates/latex @@ -0,0 +1 @@ +article.latex \ No newline at end of file diff --git a/Templates/letter.latex b/Templates/letter.latex new file mode 100644 index 00000000..fbe42d2f --- /dev/null +++ b/Templates/letter.latex @@ -0,0 +1,37 @@ +\documentclass[12pt,stdletter,orderfromtodate,sigleft,a4paper,dateleft,addrfromemail,addrfromphone]{newlfm} +\usepackage{blindtext, xfrac} +\usepackage{longtable} +\usepackage{booktabs} +\usepackage[UKenglish]{babel} + +\newcommand{\latex}{\LaTeX} + +\newlfmP{dateskipbefore=20pt} +\newlfmP{sigsize=20pt} +\newlfmP{sigskipbefore=50pt} + +\newlfmP{Headlinewd=0pt,Footlinewd=0pt} + +\namefrom{Jonathan Hodgson} +\addrfrom{Cherrydown \\ The Meadows \\ Station Road \\ Cotton \\ Stowmarket \\ Suffolk \\ IP14 4NZ \\ +} +\phonefrom{07753 492267} +\emailfrom{jonathan@lunarweb.co.uk} + +\nameto{<+Recipient Name+>} +\addrto{% + <+Recipient Address+> +} + +\dateset{\today} +\regarding{<+Subject+>} + +\greetto{<+Dear Sir or Madam+>} +\closeline{Yours sincerely,} %Sincerly if you know the name. Failthfully if you don't + +\begin{document} +\begin{newlfm} + + <+Message+> +\end{newlfm} +\end{document} diff --git a/Templates/oldletter.latex b/Templates/oldletter.latex new file mode 100644 index 00000000..79a4fd62 --- /dev/null +++ b/Templates/oldletter.latex @@ -0,0 +1,60 @@ +%---------------------------------------------------------------------------------------- +% DOCUMENT CONFIGURATION +%---------------------------------------------------------------------------------------- + +\documentclass[12pt,a4paper,stdletter,sigleft]{newlfm} % 10pt font size default, 11pt and 12pt are also possible + + +%\longindentation=0pt % Un-commenting this line will push the closing "Sincerely," to the left of the page + + +\usepackage[T1]{fontenc} % Output font encoding for international characters +\usepackage[utf8]{inputenc} % Required for inputting international characters +\usepackage[UKenglish]{babel} +\usepackage{stix} % Use the Stix font by default + +\usepackage{microtype} % Improve justification + +%---------------------------------------------------------------------------------------- +% YOUR NAME & ADDRESS SECTION +%---------------------------------------------------------------------------------------- + +\signature{Jonathan Hodgson} % Your name for the signature at the bottom + +\address{Cherrydown \\ The Meadows \\ Station Road \\ Cotton \\ Stowmarket \\ Suffolk \\ IP14 4NZ \\ 07753 492267} % Your address and phone number + +%---------------------------------------------------------------------------------------- + +\begin{document} + +%---------------------------------------------------------------------------------------- +% ADDRESSEE SECTION +%---------------------------------------------------------------------------------------- + +\begin{letter}{<++>} % Name/title of the addressee{Recipient Name \\ Recipient Address} + +%---------------------------------------------------------------------------------------- +% LETTER CONTENT SECTION +%---------------------------------------------------------------------------------------- + +\opening{\textbf{Dear Sir or Madam,}} + +<++> + +Thank you for your time and consideration. + +I look forward to your reply. + +\vspace{2\parskip} % Extra whitespace for aesthetics +\closing{Yours failthfully,} +\vspace{2\parskip} % Extra whitespace for aesthetics + +%\ps{P.S. You can find additional information attached to this letter.} % Postscript text, comment this line to remove it + +%\encl{Copyright permission form} % Enclosures with the letter, comment this line to remove it + +%---------------------------------------------------------------------------------------- + +\end{letter} + +\end{document} diff --git a/bash_logout b/bash_logout new file mode 100644 index 00000000..0e4e4f18 --- /dev/null +++ b/bash_logout @@ -0,0 +1,3 @@ +# +# ~/.bash_logout +# diff --git a/bash_profile b/bash_profile new file mode 100644 index 00000000..8e44e9ef --- /dev/null +++ b/bash_profile @@ -0,0 +1,10 @@ +# +# ~/.bash_profile +# + + +[[ -f ~/.bashrc ]] && . ~/.bashrc + + + + diff --git a/bashrc b/bashrc new file mode 100644 index 00000000..bdb15acd --- /dev/null +++ b/bashrc @@ -0,0 +1,344 @@ +# +# ~/.bashrc +# + +# If not running interactively, don't do anything +[[ $- != *i* ]] && return + +export TERMINAL=/usr/bin/konsole +export TERM=xterm-256color +export PATH=~/.bin:/opt/lampp/bin:$PATH:. +export EDITOR=vim +export CDPATH=.:~:~/Sites + +#Ruby things +#GEM_HOME=$(ls -t -U | ruby -e 'puts Gem.user_dir') +#GEM_PATH=$GEM_HOME +#export PATH=$PATH:$GEM_HOME/bin +#export GEM_HOME=$(ruby -e 'print Gem.user_dir') + +big-chromium () { + chromium --force-device-scale-factor=$1 +} + +big-new-chromium () { + chromium-snapshot-bin --force-device-scale-factor=$1 +} + +#Swap two files +function swap() { + mv $1 $1._tmp; + mv $2 $1; + mv $1._tmp $2; +} + +function old() { + mv "$1" "$1.old" +} + +#This prints the current working directory after doing a cd" +cdls(){ + cd "$@" + ls -F --color=auto +} + +#Takes you to the aquarius theme +function aquarius() { + public_html=${PWD%/public_html*}/public_html + if [ -d $public_html ]; then + theme=$public_html/wp-content/themes + if [ -d $theme ]; then + cdls $theme/aquarius + else + echo " Can't find theme folder " + fi + else + echo " Can't find public_html folder." + fi +} + +#Takes you to the child theme +function theme() { + public_html=${PWD%/public_html*}/public_html + if [ -d $public_html ]; then + theme=$public_html/wp-content/themes + if [ -d $theme ]; then + child=$(ls -d $theme/*/ | grep -v "$theme\/aquarius" | grep -v "$theme\/twenty*" | grep -v "$theme\/barelycorporate" -m 1) + cdls $child + else + echo " Can't find theme folder " + fi + else + echo " Can't find public_html folder." + fi +} + +######################################## +## ## +## Search Functions ## +## ## +######################################## + +#These search functions use grep to search all sub-folders of the current working directory +searchjs() { + # This will search through .js and .es6 files but won't search minified files + grep -r -i -n --color="auto" --include=\*.{js,es6} --exclude=\*.min.js "$1" . +} +searchcss() { + # This will search through .css and .less files but won't search minified files + grep -r -i -n --color="auto" --include=\*.{css,less} --exclude=\*.min.css "$1" . +} +searchphp() { + grep -r -i -n --color="auto" --include="*.php" "$1" . +} + +# This makes cd use function above +alias cd="cdls" + +# These alow me to easily set the file and folder permissions for a wordpress instilation. +alias folder-perms='find . -type d -not -path "./.git/*" -not -path "./.git" -exec chmod 775 {} \;' +alias file-perms='find . -type f -not -path "./.git/*" -not -path "./.git" -exec chmod 664 {} \;' +alias wp-perms='folder-perms; file-perms' + +# Make ls add Indicators to file names and colour the output +alias ls='ls -F --color=auto' + +# Make tree add indicators and color +alias tree='tree -F -C' + +#Start cups +alias cups='sudo systemctl start org.cups.cupsd.service' + +#Start network manager +alias net='sudo systemctl start NetworkManager.service' + +# Alias lampp because I don't want to clog my PATH +alias lampp='/opt/lampp/lampp' +alias glampp='gksudo /opt/lampp/manager-linux-x64.run' + +#Always make all directories necesary +alias mkdir='mkdir -p' + +# Shortcut for rewriting wp permalinks +alias perms='wp rewrite flush' + +#Clear terminal and screenfetch +alias cls='clear; screenfetch' + +#An alias for my standard less configuration +#I don't set it to lessc because sometimes I don't use this config and I always forget how to ignore an alias +#alias myless='lessc --clean-css --source-map-basepath=/home/jonathan/Sites/charts/public_html --source-map --autoprefix="last 3 versions, ie >= 9" styles.less styles.min.css' +alias myless='lessc --clean-css --source-map --autoprefix="last 3 versions, ie >= 9" styles.less styles.min.css' + +# Git shortcuts +alias status='git status ' +alias st='git status' +alias checkout='git checkout' +alias ch='git checkout' +alias push='git push ' +alias pull='git pull ' +alias bb='git open' + +# Always make grep ouput color +alias grep="grep --color=auto" + +# Shortcuts to sites folder +alias sites="cd ~/Sites" +alias s="cd ~/Sites" + +# Shortcuts to documents folder +alias documents="cd ~/Documents/" +alias d="cd ~/Documents/" + +# Shortcuts to home folder +alias home="cd ~/" +alias ~="cd ~/" + +#Goes up to the public_html folder +alias ph='cd ${PWD%/public_html*}/public_html' + +# Quit the terminal using :q (The same as Vi/Vim) +alias :q='exit;' + +# Not sure why and how but this makes sudo work with my aliases +alias sudo='sudo ' + +#Make the cal command default to start on Sunday +alias cal='cal -s' + +# update the third party wordpress plugins we are mirroring +alias u3p='update3rdPartyPlugins' + +# Edit my bashrc +alias brc='$EDITOR ~/.bashrc' + +# Edit my vimrc +alias vrc='$EDITOR ~/.vimrc' + +# Go to my .vim folder +alias .v='cd ~/.vim/' +# Go to my dotfiles folder +if [[ $(hostname) == "jonathansnuc" ]]; then + #Please don't judge - This is a reminant from first days of version controlling dotfiles + alias df='cd ~/Downloads/laptopConfig/' +else + alias df='cd ~/.dotfiles' +fi + +#Old ps1 +#PS1='[\u@\h \W]\$ ' + + +# bash completion for the `wp` command +_wp_complete() { + local OLD_IFS="$IFS" + local cur=${COMP_WORDS[COMP_CWORD]} + IFS=$'\n'; # want to preserve spaces at the end + local opts="$(wp cli completions --line="$COMP_LINE" --point="$COMP_POINT")" + if [[ "$opts" =~ \\s* ]] + then + COMPREPLY=( $(compgen -f -- $cur) ) + elif [[ $opts = "" ]] + then + COMPREPLY=( $(compgen -f -- $cur) ) + else + COMPREPLY=( ${opts[*]} ) + fi + IFS="$OLD_IFS" + return 0 +} +complete -o nospace -F _wp_complete wp + +export GIT_PS1_SHOWDIRTYSTATE=1 # Show the +(Staged) or *(unstaged) next to branch name for +export GIT_PS1_SHOWUNTRACKEDFILES=1 # Show the %(Untracked) next to branch name +export GIT_PS1_SHOWUPSTREAM="auto" + +source /usr/share/git/completion/git-completion.bash +source /usr/share/git/completion/git-prompt.sh + +############################################ +## ## +## Colours for output ## +## ## +############################################ +#{{{ +# Reset +Color_Off="\[\033[0m\]" # Text Reset + +# Regular Colors +Black="\[\033[0;30m\]" # Black +Red="\[\033[0;31m\]" # Red +Green="\[\033[0;32m\]" # Green +Yellow="\[\033[0;33m\]" # Yellow +Blue="\[\033[0;34m\]" # Blue +Purple="\[\033[0;35m\]" # Purple +Cyan="\[\033[0;36m\]" # Cyan +White="\[\033[0;37m\]" # White + +# Bold +BBlack="\[\033[1;30m\]" # Black +BRed="\[\033[1;31m\]" # Red +BGreen="\[\033[1;32m\]" # Green +BYellow="\[\033[1;33m\]" # Yellow +BBlue="\[\033[1;34m\]" # Blue +BPurple="\[\033[1;35m\]" # Purple +BCyan="\[\033[1;36m\]" # Cyan +BWhite="\[\033[1;37m\]" # White + +# Underline +UBlack="\[\033[4;30m\]" # Black +URed="\[\033[4;31m\]" # Red +UGreen="\[\033[4;32m\]" # Green +UYellow="\[\033[4;33m\]" # Yellow +UBlue="\[\033[4;34m\]" # Blue +UPurple="\[\033[4;35m\]" # Purple +UCyan="\[\033[4;36m\]" # Cyan +UWhite="\[\033[4;37m\]" # White + +# Background +On_Black="\[\033[40m\]" # Black +On_Red="\[\033[41m\]" # Red +On_Green="\[\033[42m\]" # Green +On_Yellow="\[\033[43m\]" # Yellow +On_Blue="\[\033[44m\]" # Blue +On_Purple="\[\033[45m\]" # Purple +On_Cyan="\[\033[46m\]" # Cyan +On_White="\[\033[47m\]" # White + +# High Intensty +IBlack="\[\033[0;90m\]" # Black +IRed="\[\033[0;91m\]" # Red +IGreen="\[\033[0;92m\]" # Green +IYellow="\[\033[0;93m\]" # Yellow +IBlue="\[\033[0;94m\]" # Blue +IPurple="\[\033[0;95m\]" # Purple +ICyan="\[\033[0;96m\]" # Cyan +IWhite="\[\033[0;97m\]" # White + +# Bold High Intensty +BIBlack="\[\033[1;90m\]" # Black +BIRed="\[\033[1;91m\]" # Red +BIGreen="\[\033[1;92m\]" # Green +BIYellow="\[\033[1;93m\]" # Yellow +BIBlue="\[\033[1;94m\]" # Blue +BIPurple="\[\033[1;95m\]" # Purple +BICyan="\[\033[1;96m\]" # Cyan +BIWhite="\[\033[1;97m\]" # White + +# High Intensty backgrounds +On_IBlack="\[\033[0;100m\]" # Black +On_IRed="\[\033[0;101m\]" # Red +On_IGreen="\[\033[0;102m\]" # Green +On_IYellow="\[\033[0;103m\]" # Yellow +On_IBlue="\[\033[0;104m\]" # Blue +On_IPurple="\[\033[10;95m\]" # Purple +On_ICyan="\[\033[0;106m\]" # Cyan +On_IWhite="\[\033[0;107m\]" # White +#}}} +# Various variables you might want for your PS1 prompt instead +Time12h="\T" +Time12a="\@" +PathShort="\w" +PathFull="\W" +NewLine="\n" +Jobs="\j" +Username="\u" + +# Default PS1 +# \u@\h [\w]$ +export PS1=$Username" "$Yellow$PathShort$Color_Off'$(git branch &>/dev/null;\ +if [ $? -eq 0 ]; then \ + echo "$(echo `git status` | grep "nothing to commit" > /dev/null 2>&1; \ + if [ "$?" -eq "0" ]; then \ + echo "'$Green'"$(__git_ps1 " (%s)");\ + else \ + echo "'$Red'"$(__git_ps1 " (%s)");\ + fi)"; \ +fi)'$Color_Off'\$ ' + +# export PS1="\[\033[0;97m\]\u \[\033[0;33m\]\w"'$(git branch &>/dev/null;\ +# if [ $? -eq 0 ]; then \ +# echo "$(echo `git status` | grep "nothing to commit" > /dev/null 2>&1; \ +# if [ "$?" -eq "0" ]; then \ +# echo "\[\033[0;32m\]"$(__git_ps1 " (%s)");\ +# else \ +# echo "\[\033[0;91m\]"$(__git_ps1 " (%s)");\ +# fi)"; \ +# fi)\[\033[0m\]\$ ' +function _update_ps1() { + export PS1="$(~/.config/powerline-shell/powerline-shell.py $? 2> /dev/null)" +} + +if [ "$TERM" != "linux" ]; then + PROMPT_COMMAND="_update_ps1; $PROMPT_COMMAND" +fi + +[ -r "$HOME/.smartcd_config" ] && ( [ -n $BASH_VERSION ] || [ -n $ZSH_VERSION ] ) && source ~/.smartcd_config + +#If on work computer, cd into sites + +clear +screenfetch +set -o vi + +# vim: foldmethod=marker diff --git a/bin/addhost b/bin/addhost new file mode 100755 index 00000000..81da83ba --- /dev/null +++ b/bin/addhost @@ -0,0 +1,26 @@ +#!/usr/bin/bash +if [ $1 ]; then + case $1 in + -h|--help) + echo "Add entrys to your hosts file" + echo "" + echo -e "addhost domain.com\t\t\t\tadds domain.com to your hosts and points to local machine" + echo -e "addhost (alex|aaron|jonathan) domain.com\tadds domain.com to your hosts and points to persons machine" + ;; + alex) + echo -e "10.0.1.201\t$2" | sudo tee -a /etc/hosts + ;; + aaron) + echo -e "10.0.1.202\t$2" | sudo tee -a /etc/hosts + ;; + jonathan) + echo -e "10.0.1.203\t$2" | sudo tee -a /etc/hosts + ;; + *) + echo -e "127.0.0.1\t$1" | sudo tee -a /etc/hosts + ;; + esac +else + echo "You need to add at least a domain" +fi + diff --git a/bin/capslock b/bin/capslock new file mode 100755 index 00000000..5a61a5fa --- /dev/null +++ b/bin/capslock @@ -0,0 +1,3 @@ +#!/usr/bin/bash +v=$(xset -q | grep Caps) +echo ${v:7:17} diff --git a/bin/code-to-pdf b/bin/code-to-pdf new file mode 100755 index 00000000..eabc5027 --- /dev/null +++ b/bin/code-to-pdf @@ -0,0 +1,22 @@ +#!/usr/bin/env bash + +TITLE="$1" +shift + +enscript -1 --media=A4 \ + --toc \ + --header '%H - $N | | page $% of $= in file $v' \ + --font "Menlo-Regular@8.5" \ + --header-font "Menlo-Bold@10" \ + --margins=60:60:18:60 \ + --fancy-header=sjl \ + --title $TITLE \ + --baselineskip 3 \ + --line-numbers \ + --highlight \ + --color \ + --mark-wrapped-lines=arrow \ + -p - \ + --word-wrap $* \ + | ps2pdf -i -o code.pdf + diff --git a/bin/csvtomd b/bin/csvtomd new file mode 100755 index 00000000..876db647 --- /dev/null +++ b/bin/csvtomd @@ -0,0 +1,157 @@ +#!/usr/bin/env python3 + +""" +csvtomd 0.2.1 + +Convert your CSV files into Markdown tables. + +More info: http://github.com/mplewis/csvtomd +""" + +import argparse +import csv +import sys + + +def check_negative(value): + try: + ivalue = int(value) + except ValueError: + raise argparse.ArgumentTypeError( + '"%s" must be an integer' % value) + if ivalue < 0: + raise argparse.ArgumentTypeError( + '"%s" must not be a negative value' % value) + return ivalue + + +def pad_to(unpadded, target_len): + """ + Pad a string to the target length in characters, or return the original + string if it's longer than the target length. + """ + under = target_len - len(unpadded) + if under <= 0: + return unpadded + return unpadded + (' ' * under) + + +def normalize_cols(table): + """ + Pad short rows to the length of the longest row to help render "jagged" + CSV files + """ + longest_row_len = max([len(row) for row in table]) + for row in table: + while len(row) < longest_row_len: + row.append('') + return table + + +def pad_cells(table): + """Pad each cell to the size of the largest cell in its column.""" + col_sizes = [max(map(len, col)) for col in zip(*table)] + for row in table: + for cell_num, cell in enumerate(row): + row[cell_num] = pad_to(cell, col_sizes[cell_num]) + return table + + +def horiz_div(col_widths, horiz, vert, padding): + """ + Create the column dividers for a table with given column widths. + + col_widths: list of column widths + horiz: the character to use for a horizontal divider + vert: the character to use for a vertical divider + padding: amount of padding to add to each side of a column + """ + horizs = [horiz * w for w in col_widths] + div = ''.join([padding * horiz, vert, padding * horiz]) + return div.join(horizs) + + +def add_dividers(row, divider, padding): + """Add dividers and padding to a row of cells and return a string.""" + div = ''.join([padding * ' ', divider, padding * ' ']) + return div.join(row) + + +def md_table(table, *, padding=1, divider='|', header_div='-'): + """ + Convert a 2D array of items into a Markdown table. + + padding: the number of padding spaces on either side of each divider + divider: the vertical divider to place between columns + header_div: the horizontal divider to place between the header row and + body cells + """ + table = normalize_cols(table) + table = pad_cells(table) + header = table[0] + body = table[1:] + + col_widths = [len(cell) for cell in header] + horiz = horiz_div(col_widths, header_div, divider, padding) + + header = add_dividers(header, divider, padding) + body = [add_dividers(row, divider, padding) for row in body] + + table = [header, horiz] + table.extend(body) + table = [row.rstrip() for row in table] + return '\n'.join(table) + + +def csv_to_table(file, delimiter): + return list(csv.reader(file, delimiter=delimiter)) + + +def main(): + parser = argparse.ArgumentParser( + description='Read one or more CSV files and output their contents in ' + 'the form of Markdown tables.') + parser.add_argument('files', metavar='csv_file', type=str, nargs='*', + default=['-'], + help="One or more CSV files to be converted. " + "Use - for stdin.") + parser.add_argument('-n', '--no-filenames', action='store_false', + dest='show_filenames', + help="Don't display filenames when outputting " + "multiple Markdown tables.") + parser.add_argument('-p', '--padding', type=check_negative, default=2, + help="The number of spaces to add between table cells " + "and column dividers. Default is 2 spaces.") + parser.add_argument('-d', '--delimiter', default=',', + help='The delimiter to use when parsing CSV data. ' + 'Default is "%(default)s"') + + args = parser.parse_args() + first = True + + if '-' in args.files and len(args.files) > 1: + print('Standard input can only be used alone.', file=sys.stderr) + exit(1) + for file_num, filename in enumerate(args.files): + # Print space between consecutive tables + if not first: + print('') + else: + first = False + # Read the CSV files + if filename == '-': + table = csv_to_table(sys.stdin, args.delimiter) + else: + with open(filename, 'rU') as f: + table = csv_to_table(f, args.delimiter) + # Print filename for each table if --no-filenames wasn't passed and + # more than one CSV was provided + file_count = len(args.files) + if args.show_filenames and file_count > 1: + print(filename + '\n') + # Generate and print Markdown table + print(md_table(table, padding=args.padding)) + + +if __name__ == '__main__': + main() diff --git a/bin/extract b/bin/extract new file mode 100755 index 00000000..768b5ded --- /dev/null +++ b/bin/extract @@ -0,0 +1,80 @@ +#!/usr/bin/bash + +if [ -f $1 ] ; then + case $1 in + *.tar.bz2) + if [ "$2" ]; then + tar xvjf $1 -C $2 + else + tar xvjf $1 + fi + ;; + *.tar.gz) + if [ "$2" ]; then + tar xvzf $1 -C $2 + else + tar xvzf $1 + fi + ;; + *.bz2) + if [ "$2" ]; then + bunzip -c $1 > $2 + else + bunzip $1 + fi + ;; + #*.rar) rar x $1 ;; + *.gz) + if [ "$2" ]; then + gunzip -c $1 > $2 + else + gunzip $1 + fi + ;; + *.tar) + if [ "$2" ]; then + tar xvf $1 -C $2 + else + tar xvf $1 + fi + ;; + *.tbz2) + if [ "$2" ]; then + tar xvjf $1 -C $2 + else + tar xvjf $1 + fi + ;; + *.tgz) + if [ "$2" ]; then + tar xvzf $1 -C $2 + else + tar xvzf $1 + fi + ;; + *.zip) + if [ "$2" ]; then + unzip $1 -d $2 + else + unzip $1 + fi + ;; + *.Z) + if [ "$2" ]; then + uncompress -c $1 > $2 + else + uncompress $1 + fi + ;; + *.7z) + if [ "$2" ]; then + 7z x $1 -o$2 + else + 7z x $1 + fi + ;; + *) echo "don't know how to extract '$1'..." ;; + esac +else + echo "'$1' is not a valid file!" +fi diff --git a/bin/git-cleaner b/bin/git-cleaner new file mode 100755 index 00000000..71686075 --- /dev/null +++ b/bin/git-cleaner @@ -0,0 +1,75 @@ +#!/usr/bin/bash + +function help() { +cat </dev/null + if [[ $? == 0 ]]; then + echo "Removed stored data for commit $head_sha." + fi + local repo_root="$(git_repo_toplevel)" + git reset HEAD "$repo_root" >/dev/null + git clean -f -d -q -- "$repo_root" >/dev/null + git checkout -- "$repo_root" >/dev/null + echo "Unstaged changes and untracked files removed." +} + +# Remove (permanently) all saved tags +function clean_all_tags() { + git for-each-ref refs/tags --format='%(refname:short)' | \ + while read tag; do + if [[ "$tag" =~ ^git-jump- ]]; then + git tag -d "$tag" + fi + done +} + +# Handle CLI arguments +if [[ "$1" == "clean" ]]; then + clean +elif [[ "$1" == "cleanall" ]]; then + clean_all_tags + clean +else + usage + exit 1 +fi diff --git a/bin/git-delete-submodule b/bin/git-delete-submodule new file mode 100755 index 00000000..99ed0426 --- /dev/null +++ b/bin/git-delete-submodule @@ -0,0 +1,24 @@ +#!/usr/bin/env bash + +test -z "$1" && echo "submodule required" 1>&2 && exit 1 +#cd "$(git root)" +test ! -f .gitmodules && echo ".gitmodules file not found" 1>&2 && exit 2 + +NAME="$(echo "$1" | sed 's/\/$//g')" +test -z \ + "$(git config --file=.gitmodules submodule."$NAME".url)" \ + && echo "submodule not found" 1>&2 && exit 3 + +# 1. Delete the relevant section from .git/config and clean submodule files +git submodule deinit -f "$NAME" || exit 4 +rmdir "$NAME" +rm -rf .git/modules/"$NAME" +# 2. Delete the relevant line from .gitmodules +git config --file=.gitmodules --remove-section submodule."$NAME" +git add .gitmodules +# 3. Run git rm --cached path_to_submodule +git rm --cached -rf "$NAME" +# 4. Need to confirm and commit the changes for yourself +echo +echo "Now submodule $NAME is deleted." +echo 'Confirm with `git submodule status` and commit the changes for yourself.' diff --git a/bin/git-jump b/bin/git-jump new file mode 100755 index 00000000..c2a3e93e --- /dev/null +++ b/bin/git-jump @@ -0,0 +1,158 @@ +#!/usr/bin/bash + +function help() { +cat </dev/null + # If the commit was successful, tag it (overwriting any previous tag) + if [[ $? == 0 ]]; then + status="*" + git tag -f "git-jump-$head_sha" >/dev/null + fi + echo "Previous HEAD was $head_sha$status, $(git_commit_subject $head_sha)" +} + +# Restore previously-saved changes +function restore() { + local status="" + # Save current changes before restoring + save + # Attempt to restore saved changes for specified commit + git checkout "git-jump-$1" 2>/dev/null + if [[ $? == 0 ]]; then + # If the restore was successful, figure out exactly what was saved, check + # out the original commit, then restore the saved changes on top of it + status="*" + local patch="$(git format-patch HEAD^ --stdout)" + git checkout HEAD^ 2>/dev/null + echo "$patch" | git apply - + else + # Otherwise, just restore the original commit + git checkout "$1" 2>/dev/null + fi + echo "HEAD is now $1$status, $(git_commit_subject $1)" +} + +# Jump to next commit +function next() { + local next_sha=$(git_next_sha) + if [[ "$next_sha" == "$(git_head_sha)" ]]; then + # Abort if no more commits + echo "Already at last commit in $git_branch. Congratulations!" + else + # Checkout branch by name if at its HEAD + if [[ "$next_sha" == "$(git_branch_sha)" ]]; then + next_sha="$git_branch" + fi + echo "Jumping ahead to next commit." + restore $next_sha + fi +} + +# Jump to previous commit +function prev() { + local prev_sha=$(git_prev_sha) + if [[ "$prev_sha" == "$(git_head_sha)" ]]; then + # Abort if no more commits + echo "Already at first commit in $git_branch." + else + echo "Jumping back to previous commit." + restore $prev_sha + fi +} + +# Show help if requested +if [[ "$1" == "--help" || "$1" == "-h" ]]; then + help + exit +fi + +# Check if branch is valid +git rev-parse "$git_branch" &>/dev/null +if [[ $? != 0 ]]; then + echo "Error: Branch \"$git_branch\" does not appear to be valid." + echo "Try $(basename "$0") --help for more information." + exit 1 +fi + +# Handle CLI arguments +if [[ "$1" == "next" ]]; then + next +elif [[ "$1" == "prev" ]]; then + prev +else + usage + exit 1 +fi diff --git a/bin/git-nuke b/bin/git-nuke new file mode 100755 index 00000000..0d3dad4b --- /dev/null +++ b/bin/git-nuke @@ -0,0 +1,12 @@ +#!/bin/sh +# +# Nukes a branch locally and on the origin remote. +# +# $1 - Branch name. +# +# Examples +# +# git nuke add-git-nuke + +git branch -D $1 +git push origin :$1 diff --git a/bin/git-open b/bin/git-open new file mode 100755 index 00000000..838d0a9a --- /dev/null +++ b/bin/git-open @@ -0,0 +1,149 @@ +#!/usr/bin/env bash + +# Opens the BitBucket/GitHub page for a repo/branch in your browser. +# +# git open +# git open [remote] [branch] + + +# are we in a git repo? +git rev-parse --is-inside-work-tree &>/dev/null + +if [[ $? != 0 ]]; then + echo "Not a git repository." 1>&2 + exit 1 +fi + + +# assume origin if not provided +# fallback to upstream if neither is present. +remote="origin" +if [ -n "$1" ]; then + if [ "$1" == "issue" ]; then + currentBranch=$(git symbolic-ref -q --short HEAD) + regex='^issue' + if [[ $currentBranch =~ $regex ]]; then + issue=${currentBranch#*#} + else + echo "'git open issue' expect branch naming to be issues/#123" 1>&2 + exit 1 + fi + else + remote="$1" + fi +fi + +remote_url="remote.${remote}.url" + +giturl=$(git config --get "$remote_url") +if [ -z "$giturl" ]; then + echo "$remote_url not set." 1>&2 + exit 1 +fi + +# get current branch +if [ -z "$2" ]; then + branch=$(git symbolic-ref -q --short HEAD) +else + branch="$2" +fi + +# Make # and % characters url friendly +# github.com/paulirish/git-open/pull/24 +branch=${branch//%/%25} && branch=${branch//#/%23} + +# URL normalization +# GitHub gists +if grep -q gist.github <<<$giturl; then + giturl=${giturl/git\@gist.github\.com\:/https://gist.github.com/} + providerUrlDifference=tree + +# GitHub +elif grep -q github <<<$giturl; then + giturl=${giturl/git\@github\.com\:/https://github.com/} + + # handle SSH protocol (links like ssh://git@github.com/user/repo) + giturl=${giturl/#ssh\:\/\/git\@github\.com\//https://github.com/} + + providerUrlDifference=tree + +# Bitbucket +elif grep -q bitbucket <<<$giturl; then + giturl=${giturl/git\@bitbucket\.org\:/https://bitbucket.org/} + # handle SSH protocol (change ssh://https://bitbucket.org/user/repo to https://bitbucket.org/user/repo) + giturl=${giturl/#ssh\:\/\/git\@/https://} + + rev="$(git rev-parse HEAD)" + git_pwd="$(git rev-parse --show-prefix)" + providerUrlDifference="src/${rev}/${git_pwd}" + branch="?at=${branch}" + +# Atlassian Bitbucket Server +elif grep -q "/scm/" <<<$giturl; then + re='(.*)/scm/(.*)/(.*)\.git' + if [[ $giturl =~ $re ]]; then + giturl=${BASH_REMATCH[1]}/projects/${BASH_REMATCH[2]}/repos/${BASH_REMATCH[3]} + providerUrlDifference=browse + branch="?at=refs%2Fheads%2F${branch}" + fi + +# GitLab +else + # custom GitLab + gitlab_domain=$(git config --get gitopen.gitlab.domain) + gitlab_ssh_domain=$(git config --get gitopen.gitlab.ssh.domain) + gitlab_ssh_domain=${gitlab_ssh_domain:-$gitlab_domain} + gitlab_ssh_port=$(git config --get gitopen.gitlab.ssh.port) + + gitlab_protocol=$(git config --get gitopen.gitlab.protocol) + if [ -z "$gitlab_protocol" ]; then + gitlab_protocol=https + fi + +if [ -n "$gitlab_domain" ]; then + if egrep -q "${gitlab_domain}|${gitlab_ssh_domain}" <<<$giturl; then + + # Handle GitLab's default SSH notation (like git@gitlab.domain.com:user/repo) + giturl=${giturl/git\@${gitlab_ssh_domain}\:/${gitlab_protocol}://${gitlab_domain}/} + + # handle SSH protocol (links like ssh://git@gitlab.domain.com/user/repo) + giturl=${giturl/#ssh\:\/\//${gitlab_protocol}://} + + # remove git@ from the domain + giturl=${giturl/git\@${gitlab_ssh_domain}/${gitlab_domain}/} + + # remove SSH port + if [ -n "$gitlab_ssh_port" ]; then + giturl=${giturl/\/:${gitlab_ssh_port}\///} + fi + providerUrlDifference=tree + fi + # hosted GitLab + elif grep -q gitlab <<<$giturl; then + giturl=${giturl/git\@gitlab\.com\:/https://gitlab.com/} + providerUrlDifference=tree + fi +fi +giturl=${giturl%\.git} + +if [ -n "$issue" ]; then + giturl="${giturl}/issues/${issue}" +elif [ -n "$branch" ]; then + giturl="${giturl}/${providerUrlDifference}/${branch}" +fi + +# simplify URL for master +giturl=${giturl/tree\/master/} + +# get current open browser command +case $( uname -s ) in + Darwin) open=open;; + MINGW*) open=start;; + CYGWIN*) open=cygstart;; + MSYS*) open="powershell.exe –NoProfile Start";; + *) open=${BROWSER:-xdg-open};; +esac + +# open it in a browser +$open "$giturl" &> /dev/null +exit $? diff --git a/bin/git-recall b/bin/git-recall new file mode 100755 index 00000000..5c630df4 --- /dev/null +++ b/bin/git-recall @@ -0,0 +1,349 @@ +#!/usr/bin/env bash + + +# usage info +usage() { + cat </dev/null; then + echo "abort: not a git repository." 1>&2 + exit 1 +fi + +# Parse options +while [[ "$1" =~ ^- && ! "$1" == "--" ]]; do + case $1 in + -v | --version ) + echo "$version" + exit + ;; + -d | --date ) + SINCE="$2 days ago" + shift; + ;; + -a | --author ) + AUTHOR="$2" + shift + ;; + -f | --fetch ) + FETCH=true + ;; + -h | --help ) + usage + exit + ;; + * ) + echo "abort: unknown argument" 1>&2 + exit 1 + esac + shift +done +if [[ "$1" == "--" ]]; then shift; fi + + +# Colored output. +function colored() { + GREEN=$(tput setaf 4) + YELLOW=$(tput setaf 3) + NORMAL=$(tput sgr0) + REVERSE=$(tput rev) +} + +# Uncolored output. +function uncolored() { + GREEN="" + YELLOW="" + NORMAL="" + REVERSE="" +} + +# Enable colors if supported by terminal. +if [[ -t 1 ]] && [[ -n "$TERM" ]] && which tput &>/dev/null && tput colors &>/dev/null; then + ncolors=$(tput colors) + if [[ -n "$ncolors" ]] && [[ "$ncolors" -ge 8 ]] ; then + colored + else + uncolored + fi +else + uncolored +fi + +# Check if lesskey is installed. +if command -v lesskey &> /dev/null; then + LESSKEY=true +fi + +# Set AUTHOR to current user if no param passed or display for all users if param equal to "all". +if [[ ! -n $AUTHOR ]]; then + AUTHOR=$(git config user.name 2>/dev/null) +elif [[ $AUTHOR = "all" ]]; then + AUTHOR=".*" +fi + +# Fetch changes before. +if [[ $FETCH == true ]]; then + echo "${GREEN}Fetching changes...${NORMAL}" + git fetch --all &> /dev/null + tput cuu1 + tput ed # clear screen +fi + +# Log template. +GIT_FORMAT="%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset" + +# Log command. +GIT_LOG="git log --pretty=format:'${GIT_FORMAT}' + --author \"$AUTHOR\" + --since \"$SINCE\" --abbrev-commit" + +# Change temporary the IFS to store GIT_LOG's output into an array. +IFS=$'\n' +COMMITS=($(eval ${GIT_LOG} 2>/dev/null)) +unset IFS + +NI=${#COMMITS[@]} # Total number of items. +SN=$(( `tput lines` - 1 )) # Screen's number of lines. +CN=$(tput cols) # Screen's number of columns. +TN=$(( $NI < $((SN -1)) ? $NI : $((SN -1)))) # Number of lines that we will display. +OFFSET=0 #Incremented by one each time a commit's length is higher than teminal width. + +# If there is no items, exit. +if [[ $NI = 0 ]]; then + if [[ $AUTHOR = ".*" ]]; then + echo "${YELLOW}All contributors did nothing during this period.${NORMAL}" && exit 0 + else + echo "${YELLOW}The contributor \"${AUTHOR}\" did nothing during this period.${NORMAL}" && exit 0 + fi +fi + +# Set correct sed option according OS's type +case "$OSTYPE" in + darwin*) SED_BIN="sed -E" ;; + *) SED_BIN="sed -r" ;; +esac + +# Create array with uncolred commits (removing escape sequences using sed) +for elt in "${COMMITS[@]}" +do + ELT="$(echo "$elt" | $SED_BIN "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g")" # remove colors escape codes + COMMITS_UNCOL+=("$ELT") +done +# Add +1 to OFFSET if a commit's length is bigger than the current terminal session's width. (This is to fix a redraw issue) +for C in "${COMMITS_UNCOL[@]}" +do + if [[ ${#C} -gt $CN ]]; then + OFFSET=$(( OFFSET + 1 )) + fi +done + +# Set keys. +au="`echo -e '\e[A'`" # arrow up +au_1="k" # arrow up +ad="`echo -e '\e[B'`" # arrow down +ad_1="j" # arrow down +ec="`echo -e '\e'`" # escape +nl="`echo -e '\n'`" # newline +nl_1="e" # expand +co="c" # checkout + +# Create a temporary lesskey file to change the keybindings so the user can use the TAB key to quit less. (more convenient) +if [[ $LESSKEY = true ]]; then + echo "\t quit" | lesskey -o $HOME/.lsh_less_keys_tmp -- - &> /dev/null +fi + +## Get commit's diff. +function get_diff() { + ELT="$(echo "${COMMITS_UNCOL[$CP-1]}")" + DIFF_TIP=${ELT:0:7} + DIFF_CMD="git show $DIFF_TIP --color=always" + DIFF=$(eval ${DIFF_CMD} 2>/dev/null) + tmp_diff="$(echo "$DIFF" | $SED_BIN "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g")" # remove colors escape codes + off=$(echo "$tmp_diff" | grep -c ".\{$CN\}") #Number of lines in the diff that are longer than terminal width. + DIFF_LINES_NUMBER="$(echo "$DIFF" | wc -l)" + DIFF_LINES_NUMBER=$(( DIFF_LINES_NUMBER + off )) +} + +## This function will print the diff according the commit's tip. If the diff is too long, the result will be displayed using 'less'. +function print_diff() { + get_diff # get commit's diff + if [[ $(( TN + DIFF_LINES_NUMBER + OFFSET )) -ge $(( `tput lines` - 1 )) ]]; then + if [[ $LESSKEY = true ]]; then + echo "$DIFF" | less -r -k $HOME/.lsh_less_keys_tmp + else + echo "$DIFF" | less -r + fi + tput ed # Clear screen + else + stop=false + tput ed + for i in `seq 1 $TN` + do + echo -n "$NORMAL" + [[ $CP == "$i" ]] && echo -n "$REVERSE" + echo "${COMMITS[$i - 1]}" + [[ $CP == "$i" ]] && echo "$DIFF" + done + # Wait for user action. + while ! $stop + do + read -sn 1 key + case "$key" in + "$nl" | "$nl_1") + stop=true + ;; + "q") + stop=true + END=true + ;; + esac + done + [[ $END = false ]] && tput cuu $(( TN + DIFF_LINES_NUMBER + OFFSET )) && tput ed + [[ $END = true ]] && tput cuu 1 + fi +} + +function do_checkout(){ + ELT="$(echo "${COMMITS_UNCOL[$CP-1]}")" + DIFF_TIP=${ELT:0:7} + eval "git checkout $DIFF_TIP 2> /dev/null" +} + +# Calculate OFFSET to avoid bad redraw. +function calculate_offset { + tmp=1 + index=$(( SI -1 )) + while [[ $tmp -lt $SN ]] + do + el=${COMMITS_UNCOL[$index]} + if [[ ${#el} -gt $CN ]] && [[ $CP -lt $((SN -1)) ]]; then + OFFSET_2=$(( OFFSET_2 + 1 )) + tmp=$(( tmp + 1 )) + fi + tmp=$(( tmp + 1 )) + index=$(( index + 1 )) + done +} + +{ # capture stdout to stderr + +tput civis # hide cursor. +CP=1 # current position +SI=1 # index +END=false # end while loop +EXT=0 # Used to extend the number of lines to display. + +## Loops, reads inputs and prints commits until user presses 'q' to exit or TAB to show the diff. +while ! $END +do + END_INDEX=0 # Index for the last item to display + # When the number of item is higher than screen's number of lines, OFFSET_2 is recalculated each time we select a new item + # Set last index to print. (based on OFFSET) + if [[ $TN == $NI ]]; then + END_INDEX=$TN + OFFSET_2=$OFFSET + elif [[ $TN == $(( SN - 1 )) ]]; then + # Calculate new OFFSET. + if [[ $OFFSET != 0 ]]; then + [[ $CP -lt $((SN -1)) ]] && OFFSET_2=0 + EXT=1 + calculate_offset + fi + END_INDEX=$(( TN + SI -1 + EXT - OFFSET_2 )) + fi + + # Loop and echo commits + for i in `seq $SI $END_INDEX` + do + echo -n "$NORMAL" + [[ $CP == $i ]] && echo -n "$REVERSE" + echo "${COMMITS[$i - 1]}" + done + + read -sn 1 key + [[ "$key" == "$ec" ]] && + { + read -sn 2 k2 + key="$key$k2" + } + + case "$key" in + + "$au" | "$au_1") + CP=$(( CP - 1 )) + [[ $CP == 0 ]] && [[ $SI == 1 ]] && [[ $TN == $(( SN - 1 )) ]] && CP=$NI && SI=$(( NI - SN + 2 + OFFSET_2 )) + [[ $CP == 0 ]] && [[ $SI == 1 ]] && [[ $TN == $NI ]] && CP=$TN + [[ $CP == $(( SI - 1 )) ]] && [[ $SI != 1 ]] && SI=$(( SI - 1 )) + + [[ $TN != $(( SN - 1 )) ]] && tput cuu $(( TN + OFFSET_2 )) + [[ $TN == $(( SN - 1 )) ]] && tput cuu $(( TN + EXT )) + [[ $SI != 1 ]] && tput ed # clear screen + ;; + + "$ad" | "$ad_1") + CP=$(( CP + 1 )) + [[ $CP == $(( NI + 1 )) ]] && CP=1 && SI=1 + [[ $CP == $(( SN + SI - 1 + EXT - OFFSET_2 )) ]] && [[ $TN == $(( SN - 1 )) ]] && SI=$(( SI + 1 )) + + [[ $TN != $(( SN - 1 )) ]] && tput cuu $(( TN + OFFSET_2 )) + [[ $TN == $(( SN - 1 )) ]] && tput cuu $(( TN + EXT )) + [[ $SI != 1 ]] && tput ed # clear screen + [[ $SI = 1 ]] && [[ $CP = 1 ]] && tput ed # clear screen + ;; + + "$nl" | "$nl_1") + [[ $TN == $NI ]] && tput cuu $(( TN + OFFSET_2 )) + [[ $TN != $NI ]] && tput cuu $(( TN + EXT )) + print_diff + ;; + "$co") + si=false + END=true + do_checkout + tput cuu 1 #move cursor up one line. (remove extra line) + ;; + + "q") + si=false + END=true + tput cuu 1 #move cursor up one line. (remove extra line) + ;; + + * ) + tput cuu $(( TN + OFFSET_2 )) + esac + +done + +# remove temporary less keybindings +[[ $LESSKEY = true ]] && rm $HOME/.lsh_less_keys_tmp + +tput cnorm # unhide cursor +echo "$NORMAL" # normal colors + +} >&2 # END capture + diff --git a/bin/git-wtf b/bin/git-wtf new file mode 100755 index 00000000..0d2cba8b --- /dev/null +++ b/bin/git-wtf @@ -0,0 +1,364 @@ +#!/usr/bin/env ruby + +HELP = < +.git-wtfrc" and edit it. The config file is a YAML file that specifies the +integration branches, any branches to ignore, and the max number of commits to +display when --all-commits isn't used. git-wtf will look for a .git-wtfrc file +starting in the current directory, and recursively up to the root. + +IMPORTANT NOTE: all local branches referenced in .git-wtfrc must be prefixed +with heads/, e.g. "heads/master". Remote branches must be of the form +remotes//. +EOS + +COPYRIGHT = <. +This program is free software: you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the Free +Software Foundation, either version 3 of the License, or (at your option) +any later version. + +This program is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +more details. + +You can find the GNU General Public License at: http://www.gnu.org/licenses/ +EOS + +require 'yaml' +CONFIG_FN = ".git-wtfrc" + +class Numeric; def pluralize s; "#{to_s} #{s}" + (self != 1 ? "s" : "") end end + +if ARGV.delete("--help") || ARGV.delete("-h") + puts USAGE + exit +end + +## poor man's trollop +$long = ARGV.delete("--long") || ARGV.delete("-l") +$short = ARGV.delete("--short") || ARGV.delete("-s") +$all = ARGV.delete("--all") || ARGV.delete("-a") +$all_commits = ARGV.delete("--all-commits") || ARGV.delete("-A") +$dump_config = ARGV.delete("--dump-config") +$key = ARGV.delete("--key") || ARGV.delete("-k") +$show_relations = ARGV.delete("--relations") || ARGV.delete("-r") +ARGV.each { |a| abort "Error: unknown argument #{a}." if a =~ /^--/ } + +## search up the path for a file +def find_file fn + while true + return fn if File.exist? fn + fn2 = File.join("..", fn) + return nil if File.expand_path(fn2) == File.expand_path(fn) + fn = fn2 + end +end + +want_color = `git config color.wtf` +want_color = `git config color.ui` if want_color.empty? +$color = case want_color.chomp + when "true"; true + when "auto"; $stdout.tty? +end + +def red s; $color ? "\033[31m#{s}\033[0m" : s end +def green s; $color ? "\033[32m#{s}\033[0m" : s end +def yellow s; $color ? "\033[33m#{s}\033[0m" : s end +def cyan s; $color ? "\033[36m#{s}\033[0m" : s end +def grey s; $color ? "\033[1;30m#{s}\033[0m" : s end +def purple s; $color ? "\033[35m#{s}\033[0m" : s end + +## the set of commits in 'to' that aren't in 'from'. +## if empty, 'to' has been merged into 'from'. +def commits_between from, to + if $long + `git log --pretty=format:"- %s [#{yellow "%h"}] (#{purple "%ae"}; %ar)" #{from}..#{to}` + else + `git log --pretty=format:"- %s [#{yellow "%h"}]" #{from}..#{to}` + end.split(/[\r\n]+/) +end + +def show_commits commits, prefix=" " + if commits.empty? + puts "#{prefix} none" + else + max = $all_commits ? commits.size : $config["max_commits"] + max -= 1 if max == commits.size - 1 # never show "and 1 more" + commits[0 ... max].each { |c| puts "#{prefix}#{c}" } + puts grey("#{prefix}... and #{commits.size - max} more (use -A to see all).") if commits.size > max + end +end + +def ahead_behind_string ahead, behind + [ahead.empty? ? nil : "#{ahead.size.pluralize 'commit'} ahead", + behind.empty? ? nil : "#{behind.size.pluralize 'commit'} behind"]. + compact.join("; ") +end + +def widget merged_in, remote_only=false, local_only=false, local_only_merge=false + left, right = case + when remote_only; %w({ }) + when local_only; %w{( )} + else %w([ ]) + end + middle = case + when merged_in && local_only_merge; green("~") + when merged_in; green("x") + else " " + end + print left, middle, right +end + +def show b + have_both = b[:local_branch] && b[:remote_branch] + + pushc, pullc, oosync = if have_both + [x = commits_between(b[:remote_branch], b[:local_branch]), + y = commits_between(b[:local_branch], b[:remote_branch]), + !x.empty? && !y.empty?] + end + + if b[:local_branch] + puts "Local branch: " + green(b[:local_branch].sub(/^heads\//, "")) + + if have_both + if pushc.empty? + puts "#{widget true} in sync with remote" + else + action = oosync ? "push after rebase / merge" : "push" + puts "#{widget false} NOT in sync with remote (you should #{action})" + show_commits pushc unless $short + end + end + end + + if b[:remote_branch] + puts "Remote branch: #{cyan b[:remote_branch]} (#{b[:remote_url]})" + + if have_both + if pullc.empty? + puts "#{widget true} in sync with local" + else + action = pushc.empty? ? "merge" : "rebase / merge" + puts "#{widget false} NOT in sync with local (you should #{action})" + show_commits pullc unless $short + end + end + end + + puts "\n#{red "WARNING"}: local and remote branches have diverged. A merge will occur unless you rebase." if oosync +end + +def show_relations b, all_branches + ibs, fbs = all_branches.partition { |name, br| $config["integration-branches"].include?(br[:local_branch]) || $config["integration-branches"].include?(br[:remote_branch]) } + if $config["integration-branches"].include? b[:local_branch] + puts "\nFeature branches:" unless fbs.empty? + fbs.each do |name, br| + next if $config["ignore"].member?(br[:local_branch]) || $config["ignore"].member?(br[:remote_branch]) + next if br[:ignore] + local_only = br[:remote_branch].nil? + remote_only = br[:local_branch].nil? + name = if local_only + purple br[:name] + elsif remote_only + cyan br[:name] + else + green br[:name] + end + + ## for remote_only branches, we'll compute wrt the remote branch head. otherwise, we'll + ## use the local branch head. + head = remote_only ? br[:remote_branch] : br[:local_branch] + + remote_ahead = b[:remote_branch] ? commits_between(b[:remote_branch], head) : [] + local_ahead = b[:local_branch] ? commits_between(b[:local_branch], head) : [] + + if local_ahead.empty? && remote_ahead.empty? + puts "#{widget true, remote_only, local_only} #{name} #{local_only ? "(local-only) " : ""}is merged in" + elsif local_ahead.empty? + puts "#{widget true, remote_only, local_only, true} #{name} merged in (only locally)" + else + behind = commits_between head, (br[:local_branch] || br[:remote_branch]) + ahead = remote_only ? remote_ahead : local_ahead + puts "#{widget false, remote_only, local_only} #{name} #{local_only ? "(local-only) " : ""}is NOT merged in (#{ahead_behind_string ahead, behind})" + show_commits ahead unless $short + end + end + else + puts "\nIntegration branches:" unless ibs.empty? # unlikely + ibs.sort_by { |v, br| v }.each do |v, br| + next if $config["ignore"].member?(br[:local_branch]) || $config["ignore"].member?(br[:remote_branch]) + next if br[:ignore] + local_only = br[:remote_branch].nil? + remote_only = br[:local_branch].nil? + name = remote_only ? cyan(br[:name]) : green(br[:name]) + + ahead = commits_between v, (b[:local_branch] || b[:remote_branch]) + if ahead.empty? + puts "#{widget true, local_only} merged into #{name}" + else + #behind = commits_between b[:local_branch], v + puts "#{widget false, local_only} NOT merged into #{name} (#{ahead.size.pluralize 'commit'} ahead)" + show_commits ahead unless $short + end + end + end +end + +#### EXECUTION STARTS HERE #### + +## find config file and load it +$config = { "integration-branches" => %w(heads/master heads/next heads/edge), "ignore" => [], "max_commits" => 5 }.merge begin + fn = find_file CONFIG_FN + if fn && (h = YAML::load_file(fn)) # yaml turns empty files into false + h["integration-branches"] ||= h["versions"] # support old nomenclature + h + else + {} + end +end + +if $dump_config + puts $config.to_yaml + exit +end + +## first, index registered remotes +remotes = `git config --get-regexp ^remote\.\*\.url`.split(/[\r\n]+/).inject({}) do |hash, l| + l =~ /^remote\.(.+?)\.url (.+)$/ or next hash + hash[$1] ||= $2 + hash +end + +## next, index followed branches +branches = `git config --get-regexp ^branch\.`.split(/[\r\n]+/).inject({}) do |hash, l| + case l + when /branch\.(.*?)\.remote (.+)/ + name, remote = $1, $2 + + hash[name] ||= {} + hash[name].merge! :remote => remote, :remote_url => remotes[remote] + when /branch\.(.*?)\.merge ((refs\/)?heads\/)?(.+)/ + name, remote_branch = $1, $4 + hash[name] ||= {} + hash[name].merge! :remote_mergepoint => remote_branch + end + hash +end + +## finally, index all branches +remote_branches = {} +`git show-ref`.split(/[\r\n]+/).each do |l| + sha1, ref = l.chomp.split " refs/" + + if ref =~ /^heads\/(.+)$/ # local branch + name = $1 + next if name == "HEAD" + branches[name] ||= {} + branches[name].merge! :name => name, :local_branch => ref + elsif ref =~ /^remotes\/(.+?)\/(.+)$/ # remote branch + remote, name = $1, $2 + remote_branches["#{remote}/#{name}"] = true + next if name == "HEAD" + ignore = !($all || remote == "origin") + + branch = name + if branches[name] && branches[name][:remote] == remote + # nothing + else + name = "#{remote}/#{branch}" + end + + branches[name] ||= {} + branches[name].merge! :name => name, :remote => remote, :remote_branch => "#{remote}/#{branch}", :remote_url => remotes[remote], :ignore => ignore + end +end + +## assemble remotes +branches.each do |k, b| + next unless b[:remote] && b[:remote_mergepoint] + b[:remote_branch] = if b[:remote] == "." + b[:remote_mergepoint] + else + t = "#{b[:remote]}/#{b[:remote_mergepoint]}" + remote_branches[t] && t # only if it's still alive + end +end + +show_dirty = ARGV.empty? +targets = if ARGV.empty? + [`git symbolic-ref HEAD`.chomp.sub(/^refs\/heads\//, "")] +else + ARGV.map { |x| x.sub(/^heads\//, "") } +end.map { |t| branches[t] or abort "Error: can't find branch #{t.inspect}." } + +targets.each do |t| + show t + show_relations t, branches if $show_relations || t[:remote_branch].nil? +end + +modified = show_dirty && `git ls-files -m` != "" +uncommitted = show_dirty && `git diff-index --cached HEAD` != "" + +if $key + puts + puts KEY +end + +puts if modified || uncommitted +puts "#{red "NOTE"}: working directory contains modified files." if modified +puts "#{red "NOTE"}: staging area contains staged but uncommitted files." if uncommitted + +# the end! \ No newline at end of file diff --git a/bin/imgcat b/bin/imgcat new file mode 100755 index 00000000..1303aa6d --- /dev/null +++ b/bin/imgcat @@ -0,0 +1,103 @@ +#!/bin/bash + +# tmux requires unrecognized OSC sequences to be wrapped with DCS tmux; +# ST, and for all ESCs in to be replaced with ESC ESC. It +# only accepts ESC backslash for ST. +function print_osc() { + if [[ $TERM == screen* ]] ; then + printf "\033Ptmux;\033\033]" + else + printf "\033]" + fi +} + +# More of the tmux workaround described above. +function print_st() { + if [[ $TERM == screen* ]] ; then + printf "\a\033\\" + else + printf "\a" + fi +} + +# print_image filename inline base64contents +# filename: Filename to convey to client +# inline: 0 or 1 +# base64contents: Base64-encoded contents +function print_image() { + print_osc + printf '1337;File=' + if [[ -n "$1" ]]; then + printf 'name='`echo -n "$1" | base64`";" + fi + if $(base64 --version 2>&1 | grep GNU > /dev/null) + then + BASE64ARG=-d + else + BASE64ARG=-D + fi + echo -n "$3" | base64 $BASE64ARG | wc -c | awk '{printf "size=%d",$1}' + printf ";inline=$2" + printf ";width=50" + printf ":" + echo -n "$3" + print_st + printf '\n' +} + +function error() { + echo "ERROR: $*" 1>&2 +} + +function show_help() { + echo "Usage: imgcat filename ..." 1>& 2 + echo " or: cat filename | imgcat" 1>& 2 +} + +## Main + +if [ -t 0 ]; then + has_stdin=f +else + has_stdin=t +fi + +# Show help if no arguments and no stdin. +if [ $has_stdin = f -a $# -eq 0 ]; then + show_help + exit +fi + +# Look for command line flags. +while [ $# -gt 0 ]; do + case "$1" in + -h|--h|--help) + show_help + exit + ;; + -*) + error "Unknown option flag: $1" + show_help + exit 1 + ;; + *) + if [ -r "$1" ] ; then + print_image "$1" 1 "$(base64 < "$1")" + else + error "imgcat: $1: No such file or directory" + exit 2 + fi + ;; + esac + shift +done + +# Read and print stdin +if [ $has_stdin = t ]; then + print_image "" 1 "$(cat | base64)" +fi + +echo +echo + +exit 0 diff --git a/bin/new b/bin/new new file mode 100755 index 00000000..d0de91de --- /dev/null +++ b/bin/new @@ -0,0 +1,91 @@ +#!/usr/bin/bash + +if [ $1 ]; then + while test $# -gt 0; do + case $1 in + -h|--help) + echo "Create files from template" + echo "" + echo "Usage: new [options] newFile" + echo "" + echo "Options:" + echo "--------" + echo -e "{-t,--template} filename \t Force use of template in Template Directory" + echo -e "{-l,--list} \t\t\t Lists the available templates" + echo -e "{-h,--help} \t\t\t Show this help text" + exit 0 + ;; + -t|--template) + shift + if [[ -f "$HOME/Templates/$1" ]]; then + template="$HOME/Templates/$1" + else + echo "The file $HOME/Templates/$1 does not exits" + exit 1 + fi + shift + ;; + -l|--list) + shift + for file in $HOME/Templates/*$1; do + echo ${file##*/} + done + exit 0 + ;; + *) + file=$1 + if [[ "$template" == "" ]]; then + extention=${file##*.} + posTemplates=() + if [[ -f $HOME/Templates/$extention ]]; then + posTemplates+=("$HOME/Templates/$extention") + fi + for template in $HOME/Templates/*.$extention; do + if [[ -f $template ]]; then + posTemplates+=( $template ) + fi + done + if [[ ${#posTemplates[@]} == 1 ]]; then + echo "Only one template" + template=${posTemplates[0]} + else + + posTemplates+=("Cancel") + while + echo Your options are: + for (( i=0; i<${#posTemplates[@]}; i++ )); do + echo "$i: ${posTemplates[$i]##*/}" + done + echo -e -n "Please enter a number: [0] " + read input + if [[ "$input"=="" ]]; then + test=0 + fi; + if [[ "$input" == "$(expr ${#posTemplates[@]} - 1)" ]]; then + echo "Exited By User" + exit 0 + fi + template=${posTemplates[$input]} + [[ $input>=${#posTemplates[@]} || $input<0 ]] + do + echo + echo Please chose one of the available options + done + fi + fi + + + if [[ -f "$file" ]]; then + echo "$file already exists" + echo "delete it first" + exit 1 + fi + cat "$template" > "$file" + echo "$file created from template $template" + exit 0 + ;; + esac + done +else + echo "You haven't given anything to work with" +fi diff --git a/bin/php-swap b/bin/php-swap new file mode 100755 index 00000000..be755f27 --- /dev/null +++ b/bin/php-swap @@ -0,0 +1,31 @@ +#!/usr/bin/bash +line=$(php --version | grep "PHP" -m 1) +target="$1" +lampp='/opt/lampp/lampp' +echo $phpexe +if [ "$(id -u)" != "0" ]; then + echo "Sorry, you are not root." + exit 1 +fi +if [[ $target = "" ]]; then + echo "PLease specify the version you want" + exit 1 +fi; + +file="/opt/lampp/etc/extra/httpd-xampp-php$target.conf" +phpexe=$(ls /opt/lampp/bin/php-$target*) +phpcgi=$(ls /opt/lampp/bin/php-cgi-$target*) +phpconfig=$(ls /opt/lampp/bin/php-config-$target*) +phpize=$(ls /opt/lampp/bin/phpize-$target*) + +$lampp stopapache +ln -s -f $file /opt/lampp/etc/extra/httpd-xampp.conf +ln -s -f $phpexe /opt/lampp/bin/php +ln -s -f $phpcgi /opt/lampp/bin/php-cgi +ln -s -f $phpconfig /opt/lampp/bin/php-config +ln -s -f $phpize /opt/lampp/bin/phpize + +$lampp startapache +echo +echo "Now on PHP $target" +exit 0 diff --git a/bin/update3rdPartyPlugins b/bin/update3rdPartyPlugins new file mode 100755 index 00000000..a052a9b8 --- /dev/null +++ b/bin/update3rdPartyPlugins @@ -0,0 +1,8 @@ +#!/usr/bin/bash + +pluginFolder="/home/jonathan/WPPlugins" +for dir in $pluginFolder/*/; do + cd $dir + pwd | cowsay + git-svn-mirror update +done diff --git a/bin/weather b/bin/weather new file mode 100755 index 00000000..33149d41 --- /dev/null +++ b/bin/weather @@ -0,0 +1,7 @@ +#!/usr/bin/bash +initial=$@ +place=${initial// /+} +if [[ "$place" == "" ]]; then + place="Bury+St+Edmunds" +fi +curl "wttr.in/$place" diff --git a/bin/where b/bin/where new file mode 100755 index 00000000..4e56e051 --- /dev/null +++ b/bin/where @@ -0,0 +1,2 @@ +#!/usr/bin/bash +find . -name "$1" | sed 's/[^/]\+$//' | uniq -c | sort -g diff --git a/config/conky/.themepacks b/config/conky/.themepacks new file mode 100644 index 00000000..59ddd035 --- /dev/null +++ b/config/conky/.themepacks @@ -0,0 +1,4 @@ +default-themes-1.1.cmtp.7z +default-themes-1.2.cmtp.7z +default-themes-2.1.cmtp.7z +default-themes-2.1.cmtp.7z diff --git a/config/conky/BibleVerse/bibleGateway b/config/conky/BibleVerse/bibleGateway new file mode 100644 index 00000000..cdd27d3b --- /dev/null +++ b/config/conky/BibleVerse/bibleGateway @@ -0,0 +1,54 @@ +background yes +update_interval 0.2 + + +double_buffer yes +no_buffers yes +text_buffer_size 2048 + +gap_x 10 +gap_y 10 + +own_window yes +own_window_type override +own_window_class Conky +own_window_transparent yes +own_window_hints undecorated,below,sticky,skip_taskbar,skip_pager +own_window_colour 000000 +#own_window_argb_visual yes +#own_window_argb_value 128 + +border_inner_margin 0 +border_outer_margin 0 +alignment top_left + + +draw_shades no +draw_outline no +draw_borders no +draw_graph_borders no + +override_utf8_locale yes +use_xft yes +xftfont caviar dreams:size=10 +xftalpha 0.5 +uppercase no + +# Defining colors +default_color FFFFFF +# Shades of Gray +color1 DDDDDD +color2 AAAAAA +color3 888888 +# Blue +color4 2f519a +# Green +color5 77B753 + + +minimum_size 250 500 +own_window_argb_value 0 +own_window_argb_visual no +TEXT +${font GE Inspira:pixelsize=30}${execpi 60 python ~/.conky/BibleVerse/bibleGateway.py} +${color 2f519a}${execpi 60 python ~/.conky/BibleVerse/reference.py} diff --git a/config/conky/BibleVerse/bibleGateway.py b/config/conky/BibleVerse/bibleGateway.py new file mode 100644 index 00000000..dd2848ba --- /dev/null +++ b/config/conky/BibleVerse/bibleGateway.py @@ -0,0 +1,11 @@ +__author__ = 'jonathan' + +import urllib.request +import json +import html +import textwrap + +f = urllib.request.urlopen("http://www.biblegateway.com/votd/get/?format=json&version=ESV") +content = json.loads(f.read().decode("utf-8")) + +print(textwrap.fill(html.unescape(content['votd']['text']),30)) diff --git a/config/conky/BibleVerse/reference.py b/config/conky/BibleVerse/reference.py new file mode 100644 index 00000000..29a4671b --- /dev/null +++ b/config/conky/BibleVerse/reference.py @@ -0,0 +1,8 @@ +__author__ = 'jonathan' + +import urllib.request +import json + +f = urllib.request.urlopen("http://www.biblegateway.com/votd/get/?format=json&version=ESV") +content = json.loads(f.read().decode("utf-8")) +print(content['votd']['reference']) \ No newline at end of file diff --git a/config/conky/MyBlue/MyBlue b/config/conky/MyBlue/MyBlue new file mode 100644 index 00000000..24fe397d --- /dev/null +++ b/config/conky/MyBlue/MyBlue @@ -0,0 +1,42 @@ +use_xft yes +xftfont 123:size=8 +xftalpha 0.1 +update_interval 0.5 +total_run_times 0 + +own_window yes +own_window_type override +own_window_class Conky +own_window_transparent yes +own_window_hints undecorated,below,sticky,skip_taskbar,skip_pager +own_window_colour 000000 +#own_window_argb_visual yes +#own_window_argb_value 128 + +background yes + +double_buffer yes +maximum_width 500 +draw_shades no +draw_outline no +draw_borders no +draw_graph_borders no +default_color white +default_shade_color red +default_outline_color green +alignment top_right +gap_x 0 +gap_y 10 +no_buffers yes +uppercase no +cpu_avg_samples 2 +net_avg_samples 1 +override_utf8_locale yes + + +own_window_argb_value 0 +own_window_argb_visual no +minimum_size 0 0 +TEXT +${color EAEAEA}${font GE Inspira:pixelsize=120}${time %H:%M}${color 2f519a}${time :%S}${font} +${color EAEAEA}${font GE Inspira:pixelsize=58}${time %A}${font GE Inspira:pixelsize=42}${color 2f519a}${time %d}${font GE Inspira:pixelsize=22}${color EAEAEA}${time %B} ${time %Y} diff --git a/config/conky/Octupi_Arch/FAMI_E.TTF b/config/conky/Octupi_Arch/FAMI_E.TTF new file mode 100755 index 0000000000000000000000000000000000000000..dc3a173f76ea15d39cc6b48eddbf52e96ad99925 GIT binary patch literal 27996 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
Y0E5$&adWa8ywuXPeB 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 mlvItC;}pr}Q 25 then + cairo_set_source_rgba(cr,1,0,0,0.4); + end + cairo_fill(cr); + + -- DARKcpu image + local ir = cairo_create(cs); + local image_path = "cpu"; + if color == "WHITE" then + image_path = "white/"..image_path + end + if color == "DARK" then + image_path = "dark/"..image_path + end + draw_image(ir, item_centerx, item_centery, item_radius, image_path); + + -- outside boundry + cairo_arc(cr, item_centerx, item_centery, item_radius + 5, 0, 2*math.pi ); + set_color(1,1); + if tonumber(cpu) > 25 then + cairo_set_source_rgba(cr,1,0,0,1); + end + cairo_stroke(cr); + + -- font settings + set_color(1,1); + cairo_select_font_face(cr, "Familian Elder", 0 , 1); + cairo_set_font_size(cr, item_font_size); + + -- name text + text = "CPU"; + cairo_text_extents(cr, text, extents) + cairo_move_to(cr, item_centerx - extents.width/2, item_centery - item_radius - 10); + cairo_show_text(cr, text); + + -- value text + text = cpu.."%"; + cairo_text_extents(cr, text, extents) + cairo_move_to(cr, item_centerx - extents.width/2, item_centery + item_radius + item_font_size + 8); + cairo_show_text(cr, text); + + + -- top 10 process ------------------------------------------------ top 10 process cpu ------------------------------------------------------------- + + angle = angle - 10*(math.pi/180); + item_startx = item_centerx + item_radius + 5; + item_starty = item_centery; + item_endx = item_startx + math.cos(angle) * width/6; + item_endy = item_starty + math.sin(angle) * height/6; + item_curvex = item_startx + math.cos(angle) * width/12; + item_curvey = item_starty + math.sin(angle) * height/12; + -- print(item_startx.." "..item_starty.." "..item_endx.." "..item_endy.." "..item_curvex.." "..item_curvey) + + -- arrow + cairo_move_to(cr, item_startx, item_starty); + cairo_curve_to(cr, item_curvex, item_curvey, item_curvex, item_curvey-100, item_endx, item_endy); + set_color(1,0.5); + cairo_stroke(cr); + + -- label text + set_color(1,1); + cairo_select_font_face(cr, "Familian Elder", 0 , 1); + cairo_set_font_size(cr, item_font_size); + + -- name text + text = "Top 10 Process"; + cairo_text_extents(cr, text, extents) + cairo_move_to(cr, item_endx - extents.width/2, item_endy + item_font_size+2); + cairo_show_text(cr, text); + + -- the values + set_color(1,0.7); + cairo_select_font_face(cr,"Arial",0,0); + cairo_set_font_size(cr,item_font_size/1.4); + for i = 1,10 do + local addison = " "; + local name = string.sub(conky_parse("${top name "..i.."}")..addison,1,10); + local value = conky_parse("${top cpu "..i.."}"); + text = name.." "..value; + cairo_move_to(cr, item_endx - extents.width/2, item_endy + item_font_size/1.2 * (i+1) + 5); + cairo_show_text(cr,text); + end + + + -- cpu cores ---------------------------------------------- cpu cores --------------------------------------------------------- + angle = angle + 70*(math.pi/180); + item_endx = item_startx + math.cos(angle) * width/6; + item_endy = item_starty + math.sin(angle) * height/6; + item_curvex = item_startx + math.cos(angle) * width/12; + item_curvey = item_starty + math.sin(angle) * height/12; + -- print(item_startx.." "..item_starty.." "..item_endx.." "..item_endy.." "..item_curvex.." "..item_curvey) + + -- arrow + cairo_move_to(cr, item_startx, item_starty); + cairo_curve_to(cr, item_curvex, item_curvey, item_curvex, item_curvey-100, item_endx, item_endy); + set_color(1,0.5); + cairo_stroke(cr); + + -- label text + set_color(1,1); + cairo_select_font_face(cr, "Familian Elder", 0 , 1); + cairo_set_font_size(cr, item_font_size); + + -- name text + text = "Cpu Cores"; + cairo_text_extents(cr, text, extents) + cairo_move_to(cr, item_endx - extents.width/2, item_endy + item_font_size+2); + cairo_show_text(cr, text); + + -- the values + set_color(1,0.7); + cairo_select_font_face(cr,"Arial",0,0); + cairo_set_font_size(cr,item_font_size/1.4); + for i = 1,no_of_cores do + local name = "CPU "..i; + local value = conky_parse("${top cpu "..i.."}"); + text = name.." "..value.."%"; + cairo_move_to(cr, item_endx - extents.width/2, item_endy + item_font_size/1.2 * (i+1) + 5); + cairo_show_text(cr,text); + end + + + -- swap ------------------------------------------------------------ swap ---------------------------------------------------------------------------- + + local angle = 50*math.pi/180; + local item_startx = centerx + math.cos(angle) * face_radius; + local item_starty = centery + math.sin(angle) * face_radius; + local item_endx = centerx + math.cos(angle) * width/6; + local item_endy = centery + math.sin(angle) * height/6 + local item_curvex = centerx + math.cos(angle) * width/12; + local item_curvey = centery + math.sin(angle) * height/12; + local item_radius = 15; + local item_centerx = item_endx + math.cos(angle) * (item_radius + 5); + local item_centery = item_endy + math.sin(angle) * (item_radius + 5); + local item_font_size = height/50; + + -- value of cpu + local swap = conky_parse("${swapperc}"); + if tonumber(swap) == nil then + swap = 0; + end + + -- arrow to swap + cairo_move_to(cr, item_startx, item_starty); + cairo_curve_to(cr, item_curvex, item_curvey, item_curvex-100, item_curvey+40, item_endx, item_endy); + set_color(1,0.5); + cairo_stroke(cr); + + -- background circle + cairo_arc(cr, item_centerx, item_centery, item_radius+5, 0, 2*math.pi ); + set_color(1,0.4); + cairo_fill(cr); + + -- swap image + local ir = cairo_create(cs); + image_path = "swap"; + if color == "WHITE" then + image_path = "white/"..image_path + end + if color == "DARK" then + image_path = "dark/"..image_path + end + draw_image(ir, item_centerx, item_centery, item_radius, image_path); + + -- outside boundry + cairo_arc(cr, item_centerx, item_centery, item_radius + 5, 0, 2*math.pi ); + set_color(1,1); + cairo_stroke(cr); + + -- font settings + set_color(1,1); + cairo_select_font_face(cr, "Familian Elder", 0 , 1); + cairo_set_font_size(cr, item_font_size); + + -- name text + text = "SWAP"; + cairo_text_extents(cr, text, extents); + cairo_move_to(cr, item_centerx - extents.width/2, item_centery - item_radius - 10); + cairo_show_text(cr, text); + + -- value text + text = swap.."%"; + cairo_text_extents(cr, text, extents) + cairo_move_to(cr, item_centerx - extents.width/2, item_centery + item_radius + item_font_size + 8); + cairo_show_text(cr, text); + + + -- uptime ------------------------------------------------------------ uptime ---------------------------------------------------------------------------- + + local angle = 90*math.pi/180; + local item_startx = centerx + math.cos(angle) * face_radius; + local item_starty = centery + math.sin(angle) * face_radius; + local item_endx = centerx + math.cos(angle) * width/6; + local item_endy = centery + math.sin(angle) * height/6; + local item_curvex = centerx + math.cos(angle) * width/12; + local item_curvey = centery + math.sin(angle) * height/12; + local item_radius = 15; + local item_centerx = item_endx + math.cos(angle) * (item_radius + 5); + local item_centery = item_endy + math.sin(angle) * (item_radius + 5); + local item_font_size = height/50; + + -- value of uptime + local uptime = conky_parse("${uptime}"); + + -- arrow to uptime + cairo_move_to(cr, item_startx, item_starty); + cairo_curve_to(cr, item_curvex, item_curvey, item_curvex-100, item_curvey+100, item_endx, item_endy); + set_color(1,0.5); + cairo_stroke(cr); + + -- background circle + cairo_arc(cr, item_centerx, item_centery, item_radius+5, 0, 2*math.pi ); + set_color(1,0.4); + cairo_fill(cr); + + -- uptime image + local ir = cairo_create(cs); + image_path = "uptime"; + if color == "WHITE" then + image_path = "white/"..image_path + end + if color == "DARK" then + image_path = "dark/"..image_path + end + draw_image(ir, item_centerx, item_centery, item_radius, image_path); + + -- outside boundry + cairo_arc(cr, item_centerx, item_centery, item_radius + 5, 0, 2*math.pi ); + set_color(1,1); + cairo_stroke(cr); + + -- font settings + set_color(1,1); + cairo_select_font_face(cr, "Familian Elder", 0 , 1); + cairo_set_font_size(cr, item_font_size); + + -- name text + text = "UPTIME"; + cairo_text_extents(cr, text, extents) + cairo_move_to(cr, item_centerx - extents.width/2, item_centery - item_radius - 10); + cairo_show_text(cr, text); + + -- value text + text = uptime; + cairo_text_extents(cr, text, extents) + cairo_move_to(cr, item_centerx - extents.width/2, item_centery + item_radius + item_font_size + 8); + cairo_show_text(cr, text); + + + -- root file system ------------------------------------------------------------ root fs ---------------------------------------------------------------------------- + + local angle = 130*math.pi/180; + local item_startx = centerx + math.cos(angle) * face_radius; + local item_starty = centery + math.sin(angle) * face_radius; + local item_endx = centerx + math.cos(angle) * width/6; + local item_endy = centery + math.sin(angle) * height/6; + local item_curvex = centerx + math.cos(angle) * width/12; + local item_curvey = centery + math.sin(angle) * height/12; + local item_radius = 15; + local item_centerx = item_endx + math.cos(angle) * (item_radius + 5); + local item_centery = item_endy + math.sin(angle) * (item_radius + 5); + local item_font_size = height/50; + + -- value of free space and total space + local free = "Free: "..conky_parse("${fs_free}"); + local total = "Total: "..conky_parse("${fs_size}"); + + -- arrow to root + cairo_move_to(cr, item_startx, item_starty); + cairo_curve_to(cr, item_curvex, item_curvey, item_curvex, item_curvey+100, item_endx, item_endy); + set_color(1,0.5); + cairo_stroke(cr); + + -- background circle + cairo_arc(cr, item_centerx, item_centery, item_radius+5, 0, 2*math.pi ); + set_color(1,0.4); + cairo_fill(cr); + + -- root drive image + local ir = cairo_create(cs); + image_path = "root"; + if color == "WHITE" then + image_path = "white/"..image_path + end + if color == "DARK" then + image_path = "dark/"..image_path + end + draw_image(ir, item_centerx, item_centery, item_radius, image_path); + + -- outside boundry + cairo_arc(cr, item_centerx, item_centery, item_radius + 5, 0, 2*math.pi ); + set_color(1,1); + cairo_stroke(cr); + + -- font settings + set_color(1,1); + cairo_select_font_face(cr, "Familian Elder", 0 , 1); + cairo_set_font_size(cr, item_font_size); + + -- name text + text = "ROOT"; + cairo_text_extents(cr, text, extents) + cairo_move_to(cr, item_centerx - extents.width/2, item_centery - item_radius - 10); + cairo_show_text(cr, text); + + -- value text + text = free; + cairo_text_extents(cr, text, extents) + cairo_move_to(cr, item_centerx - extents.width/2, item_centery + item_radius + item_font_size + 8); + cairo_show_text(cr, text); + text = total; + cairo_text_extents(cr, text, extents) + cairo_move_to(cr, item_centerx - extents.width/2, item_centery + item_radius + item_font_size*2 + 8); + cairo_show_text(cr, text); + + + -- ram ------------------------------------------------------------ ram ---------------------------------------------------------------------------- + + local angle = 210*math.pi/180; + local item_startx = centerx + math.cos(angle) * face_radius; + local item_starty = centery + math.sin(angle) * face_radius; + local item_endx = centerx + math.cos(angle) * width/6; + local item_endy = centery + math.sin(angle) * height/6; + local item_curvex = centerx + math.cos(angle) * width/12; + local item_curvey = centery + math.sin(angle) * height/12; + local item_radius = 15; + local item_centerx = item_endx + math.cos(angle) * (item_radius + 5); + local item_centery = item_endy + math.sin(angle) * (item_radius + 5); + local item_font_size = height/50; + + -- value of ram + local ram = conky_parse("${memperc}"); + + -- arrow to ram + cairo_move_to(cr, item_startx, item_starty); + cairo_curve_to(cr, item_curvex, item_curvey, item_curvex, item_curvey-70, item_endx, item_endy); + set_color(1,0.5); + cairo_stroke(cr); + + -- background circle + cairo_arc(cr, item_centerx, item_centery, item_radius+5, 0, 2*math.pi ); + set_color(1,0.4); + cairo_fill(cr); + + -- root drive image + local ir = cairo_create(cs); + image_path = "ram"; + if color == "WHITE" then + image_path = "white/"..image_path + end + if color == "DARK" then + image_path = "dark/"..image_path + end + draw_image(ir, item_centerx, item_centery, item_radius, image_path); + + -- outside boundry + cairo_arc(cr, item_centerx, item_centery, item_radius + 5, 0, 2*math.pi ); + set_color(1,1); + cairo_stroke(cr); + + -- font settings + set_color(1,1); + cairo_select_font_face(cr, "Familian Elder", 0 , 1); + cairo_set_font_size(cr, item_font_size); + + -- name text + text = "RAM"; + cairo_text_extents(cr, text, extents) + cairo_move_to(cr, item_centerx - extents.width/2, item_centery - item_radius - 10); + cairo_show_text(cr, text); + + -- value text + text = ram.."%"; + cairo_text_extents(cr, text, extents) + cairo_move_to(cr, item_centerx - extents.width/2, item_centery + item_radius + item_font_size + 8); + cairo_show_text(cr, text); + + + -- top 10 process ------------------------------------------------ top 10 process ram ------------------------------------------------------------- + + angle = angle + 20*(math.pi/180); + item_startx = item_centerx - item_radius - 5; + item_starty = item_centery; + item_endx = item_startx + math.cos(angle) * width/6; + item_endy = item_starty + math.sin(angle) * height/6; + item_curvex = item_startx + math.cos(angle) * width/12; + item_curvey = item_starty + math.sin(angle) * height/12; + -- print(item_startx.." "..item_starty.." "..item_endx.." "..item_endy.." "..item_curvex.." "..item_curvey) + + -- arrow + cairo_move_to(cr, item_startx, item_starty); + cairo_curve_to(cr, item_curvex, item_curvey, item_curvex, item_curvey-100, item_endx, item_endy); + set_color(1,0.5); + cairo_stroke(cr); + + -- label text + set_color(1,1); + cairo_select_font_face(cr, "Familian Elder", 0 , 1); + cairo_set_font_size(cr, item_font_size); + + -- name text + text = "Top 10 Process"; + cairo_text_extents(cr, text, extents) + cairo_move_to(cr, item_endx - extents.width/2, item_endy + item_font_size+2); + cairo_show_text(cr, text); + + -- the values + set_color(1,0.7); + cairo_select_font_face(cr,"Arial",0,0); + cairo_set_font_size(cr,item_font_size/1.4); + for i = 1,10 do + local addison = " "; + local name = string.sub(conky_parse("${top_mem name "..i.."}")..addison,1,10); + local value = conky_parse("${top_mem mem_res "..i.."}"); + text = name.." "..value; + cairo_move_to(cr, item_endx - extents.width/2, item_endy + item_font_size/1.2 * (i+1) + 5); + cairo_show_text(cr,text); + end + + + -- disk input output ------------------------------------------------------------ disk io ---------------------------------------------------------------------------- + + local angle = 170*math.pi/180; + local item_startx = centerx + math.cos(angle) * face_radius; + local item_starty = centery + math.sin(angle) * face_radius; + local item_endx = centerx + math.cos(angle) * width/6; + local item_endy = centery + math.sin(angle) * height/6; + local item_curvex = centerx + math.cos(angle) * width/12; + local item_curvey = centery + math.sin(angle) * height/12; + local item_radius = 15; + local item_centerx = item_endx + math.cos(angle) * (item_radius + 5); + local item_centery = item_endy + math.sin(angle) * (item_radius + 5); + local item_font_size = height/50; + + -- value of disk io + local diskio = conky_parse("${diskio}"); + + -- arrow to disk io + cairo_move_to(cr, item_startx, item_starty); + cairo_curve_to(cr, item_curvex, item_curvey, item_curvex, item_curvey-40, item_endx, item_endy); + set_color(1,0.5); + cairo_stroke(cr); + + -- background circle + cairo_arc(cr, item_centerx, item_centery, item_radius+5, 0, 2*math.pi ); + set_color(1,0.4); + cairo_fill(cr); + + -- root drive image + local ir = cairo_create(cs); + image_path = "root"; + if color == "WHITE" then + image_path = "white/"..image_path + end + if color == "DARK" then + image_path = "dark/"..image_path + end + draw_image(ir, item_centerx, item_centery, item_radius, image_path); + + -- outside boundry + cairo_arc(cr, item_centerx, item_centery, item_radius + 5, 0, 2*math.pi ); + set_color(1,1); + cairo_stroke(cr); + + -- font settings + set_color(1,1); + cairo_select_font_face(cr, "Familian Elder", 0 , 1); + cairo_set_font_size(cr, item_font_size); + + -- name text + text = "DISK I/O"; + cairo_text_extents(cr, text, extents) + cairo_move_to(cr, item_centerx - extents.width/2, item_centery - item_radius - 10); + cairo_show_text(cr, text); + + -- value text + text = diskio; + cairo_text_extents(cr, text, extents) + cairo_move_to(cr, item_centerx - extents.width/2, item_centery + item_radius + item_font_size + 8); + cairo_show_text(cr, text); + + + -- disk read write ------------------------------------------------ read write ------------------------------------------------------------- + + angle = angle + 10*(math.pi/180); + item_startx = item_centerx - item_radius - 5; + item_starty = item_centery; + item_endx = item_startx + math.cos(angle) * width/6; + item_endy = item_starty + math.sin(angle) * height/6; + item_curvex = item_startx + math.cos(angle) * width/12; + item_curvey = item_starty + math.sin(angle) * height/12; + -- print(item_startx.." "..item_starty.." "..item_endx.." "..item_endy.." "..item_curvex.." "..item_curvey) + + -- arrow + cairo_move_to(cr, item_startx, item_starty); + cairo_curve_to(cr, item_curvex, item_curvey, item_curvex, item_curvey-50, item_endx, item_endy); + set_color(1,0.5); + cairo_stroke(cr); + + -- label text + set_color(1,1); + cairo_select_font_face(cr, "Familian Elder", 0 , 1); + cairo_set_font_size(cr, item_font_size); + + -- read + text = "Read: "..conky_parse("${diskio_read}"); + cairo_text_extents(cr,text,extents); + cairo_move_to(cr, item_endx - extents.width/2, item_endy+item_font_size+2); + cairo_show_text(cr,text); + + -- write + text = "Write: "..conky_parse("${diskio_write}"); + cairo_text_extents(cr,text,extents); + cairo_move_to(cr, item_endx - extents.width/2, item_endy+item_font_size*2+2); + cairo_show_text(cr,text); + + + -- network ----------------------------------------------------------------------- network ------------------------------------------------------------------------- + + local angle = 320*math.pi/180; + local item_startx = centerx + math.cos(angle) * face_radius; + local item_starty = centery + math.sin(angle) * face_radius; + local item_endx = centerx + math.cos(angle) * width/6; + local item_endy = centery + math.sin(angle) * height/6; + local item_curvex = centerx + math.cos(angle) * width/12; + local item_curvey = centery + math.sin(angle) * height/12; + local item_radius = 15; + local item_centerx = item_endx + math.cos(angle) * (item_radius + 5); + local item_centery = item_endy + math.sin(angle) * (item_radius + 5); + local item_font_size = height/50; + + -- ip address + local network = conky_parse("${addr "..interface.."}"); + + -- arrow to network + cairo_move_to(cr, item_startx, item_starty); + cairo_curve_to(cr, item_curvex, item_curvey, item_curvex, item_curvey-70, item_endx, item_endy); + set_color(1,0.5); + cairo_stroke(cr); + + -- background circle + cairo_arc(cr, item_centerx, item_centery, item_radius+5, 0, 2*math.pi ); + set_color(1,0.4); + cairo_fill(cr); + + -- image + local ir = cairo_create(cs); + image_path = "network"; + if color == "WHITE" then + image_path = "white/"..image_path + end + if color == "DARK" then + image_path = "dark/"..image_path + end + draw_image(ir, item_centerx, item_centery, item_radius, image_path); + + -- outside boundry + cairo_arc(cr, item_centerx, item_centery, item_radius + 5, 0, 2*math.pi ); + set_color(1,1); + cairo_stroke(cr); + + -- font settings + set_color(1,1); + cairo_select_font_face(cr, "Familian Elder", 0 , 1); + cairo_set_font_size(cr, item_font_size); + + -- name text + text = "I.P."; + cairo_text_extents(cr, text, extents) + cairo_move_to(cr, item_centerx - extents.width/2, item_centery - item_radius - 10); + cairo_show_text(cr, text); + + -- value text + text = network; + cairo_text_extents(cr, text, extents) + cairo_move_to(cr, item_centerx - extents.width/2, item_centery + item_radius + item_font_size + 8); + cairo_show_text(cr, text); + + + -- network stats ------------------------------------------------ network stats ------------------------------------------------------------- + + angle = angle - 10*(math.pi/180); + item_startx = item_centerx + item_radius + 5; + item_starty = item_centery; + item_endx = item_startx + math.cos(angle) * width/6; + item_endy = item_starty + math.sin(angle) * height/6; + item_curvex = item_startx + math.cos(angle) * width/12; + item_curvey = item_starty + math.sin(angle) * height/12; + -- print(item_startx.." "..item_starty.." "..item_endx.." "..item_endy.." "..item_curvex.." "..item_curvey) + + -- arrow + cairo_move_to(cr, item_startx, item_starty); + cairo_curve_to(cr, item_curvex, item_curvey, item_curvex, item_curvey-100, item_endx, item_endy); + set_color(1,0.5); + cairo_stroke(cr); + + set_color(1,1); + cairo_move_to(cr,item_endx,item_endy+item_font_size+5); + cairo_show_text(cr,"Upload"); + cairo_move_to(cr,item_endx + width/13,item_endy+item_font_size+5); + cairo_show_text(cr,"Download"); + cairo_move_to(cr,item_endx - width/20,item_endy+item_font_size*2+5); + cairo_show_text(cr, "Now"); + + cairo_select_font_face(cr,"Arial",0,0) + cairo_set_font_size(cr,item_font_size/1.4); + set_color(1,0.6); + text = conky_parse("${upspeed "..interface.."}"); + cairo_move_to(cr,item_endx ,item_endy+item_font_size*2+5); + cairo_show_text(cr, text); + text = conky_parse("${downspeed "..interface.."}"); + cairo_move_to(cr,item_endx + width/13,item_endy+item_font_size*2+5); + cairo_show_text(cr, text); + + local month = conky_parse("${time %b}"); + local year = conky_parse("${time %y}"); + local stats = conky_parse("${exec vnstat -i wlo1}"); + local ntotal_recieved, ntotal_trans, nmonth_received, nmonth_trans, ntoday_rec, ntoday_trans; + -- print(stats); + if(stats ~= "") then + _,nex,ntotal_recieved = string.find(stats, "rx:%s*(.-)iB"); + if(ntotal_recieved ~= nil ) then + total_recieved = ntotal_recieved; + end + -- print("tr: "..total_recieved.."iB"); + _,nex,ntotal_trans = string.find(stats, "tx:%s*(.-)iB",nex); + if(ntotal_trans ~= nil) then + total_trans = ntotal_trans; + end + -- print("tt: "..total_trans..'iB'); + + _,nex,_ = string.find(stats, "monthly",nex); + + _,nex,nmonth_received = string.find(stats, month.."%s*\'"..year.."%s*(.-)iB",nex); + if(nmonth_received ~= nil) then + month_recieved = nmonth_received; + end + -- print("mr: "..month_recieved..'iB'); + + _,nex,nmonth_trans = string.find(stats, "|%s*(.-)iB",nex); + if(nmonth_trans ~= nil) then + month_trans = nmonth_trans; + end + -- print("mt: "..month_trans..'iB'); + + _,nex,ntoday_rec = string.find(stats, "today%s*(.-)iB",nex); + if(ntoday_rec ~= nil) then + today_rec = ntoday_rec; + end + -- print("tor: "..today_rec..'iB'); + + _,nex,ntoday_trans = string.find(stats, "|%s*(.-)iB",nex); + if(ntoday_trans ~= nil) then + today_trans = ntoday_trans; + end + -- print("tot: "..today_trans..'iB'); + + cairo_set_font_size(cr, item_font_size); + cairo_select_font_face(cr, "Familian Elder",0,1); + set_color(1,1); + cairo_move_to(cr,item_endx-width/20 ,item_endy+item_font_size*3+5); + cairo_show_text(cr,"Today"); + cairo_move_to(cr,item_endx-width/20 ,item_endy+item_font_size*4+5); + cairo_show_text(cr,"Month"); + cairo_move_to(cr,200,220); + cairo_move_to(cr,item_endx-width/20 ,item_endy+item_font_size*5+5); + cairo_show_text(cr,"Total"); + + cairo_select_font_face(cr,"Arial",0,0) + cairo_set_font_size(cr,item_font_size/1.4); + set_color(1,0.6); + cairo_move_to(cr,item_endx ,item_endy+item_font_size*3+5); + cairo_show_text(cr,today_trans.."iB"); + cairo_move_to(cr,item_endx ,item_endy+item_font_size*4+5); + cairo_show_text(cr,month_trans.."iB"); + cairo_move_to(cr,item_endx ,item_endy+item_font_size*5+5); + cairo_show_text(cr,total_trans.."iB"); + + + cairo_move_to(cr,item_endx + width/13 ,item_endy+item_font_size*3+5); + cairo_show_text(cr, today_rec.."iB"); + cairo_move_to(cr,item_endx + width/13 ,item_endy+item_font_size*4+5); + cairo_show_text(cr,month_recieved.."iB"); + cairo_move_to(cr,item_endx + width/13 ,item_endy+item_font_size*5+5); + cairo_show_text(cr,total_recieved.."iB"); + end + + + -- gmail --------------------------------------------------------------- gmail new message ------------------------------------------------------------- + + if (min*60 + sec)%298 == 0 then + check_mail = 1; + end + + if (min%5 == 0 and check_mail == 1) or start == 1 then + if internet == 1 then + local val = conky_parse("${execi 300 curl -u "..mail.."}"); + _,_,new_mail = string.find(val, "%s*(.-)%s*"); + end + check_mail = 0; + start = 0; + end + + if internet ~= 1 then + new_mail = "No Network" + end + + if new_mail == nil then + new_mail = "Error!" + end + + local angle = 290*math.pi/180; + local item_startx = centerx + math.cos(angle) * face_radius; + local item_starty = centery + math.sin(angle) * face_radius; + local item_endx = centerx + math.cos(angle) * width/6; + local item_endy = centery + math.sin(angle) * height/6; + local item_curvex = centerx + math.cos(angle) * width/12; + local item_curvey = centery + math.sin(angle) * height/12; + local item_radius = 15; + local item_centerx = item_endx + math.cos(angle) * (item_radius + 5); + local item_centery = item_endy + math.sin(angle) * (item_radius + 5); + local item_font_size = height/50; + + -- arrow to mail + cairo_move_to(cr, item_startx, item_starty); + cairo_curve_to(cr, item_curvex, item_curvey, item_curvex, item_curvey-70, item_endx, item_endy); + set_color(1,0.5); + cairo_stroke(cr); + + -- background circle + cairo_arc(cr, item_centerx, item_centery, item_radius+5, 0, 2*math.pi ); + set_color(1,0.4); + cairo_fill(cr); + + -- image + local ir = cairo_create(cs); + image_path = "mail"; + if color == "WHITE" then + image_path = "white/"..image_path + end + if color == "DARK" then + image_path = "dark/"..image_path + end + draw_image(ir, item_centerx, item_centery, item_radius, image_path); + + -- outside boundry + cairo_arc(cr, item_centerx, item_centery, item_radius + 5, 0, 2*math.pi ); + set_color(1,1); + cairo_stroke(cr); + + -- font settings + set_color(1,1); + cairo_select_font_face(cr, "Familian Elder", 0 , 1); + cairo_set_font_size(cr, item_font_size); + + -- name text + text = "Unread"; + cairo_text_extents(cr, text, extents) + cairo_move_to(cr, item_centerx - extents.width/2, item_centery - item_radius - 10); + cairo_show_text(cr, text); + + -- value text + text = new_mail; + cairo_text_extents(cr, text, extents) + cairo_move_to(cr, item_centerx - extents.width/2, item_centery + item_radius + item_font_size + 8); + cairo_show_text(cr, text); + + + + + -- battery --------------------------------------------------- battery -------------------------------------------------------------------- + local angle = 250*math.pi/180; + local item_startx = centerx + math.cos(angle) * face_radius; + local item_starty = centery + math.sin(angle) * face_radius; + local item_endx = centerx + math.cos(angle) * width/6; + local item_endy = centery + math.sin(angle) * height/6; + local item_curvex = centerx + math.cos(angle) * width/12; + local item_curvey = centery + math.sin(angle) * height/12; + local item_radius = 15; + local item_centerx = item_endx + math.cos(angle) * (item_radius + 5); + local item_centery = item_endy + math.sin(angle) * (item_radius + 5); + local item_font_size = height/50; + + -- arrow to mail + cairo_move_to(cr, item_startx, item_starty); + cairo_curve_to(cr, item_curvex, item_curvey, item_curvex+50, item_curvey-70, item_endx, item_endy); + set_color(1,0.5); + cairo_stroke(cr); + + -- background circle + cairo_arc(cr, item_centerx, item_centery, item_radius+5, 0, 2*math.pi ); + set_color(1,0.4); + cairo_fill(cr); + + -- image + local ir = cairo_create(cs); + image_path = "battery"; + if color == "WHITE" then + image_path = "white/"..image_path + end + if color == "DARK" then + image_path = "dark/"..image_path + end + draw_image(ir, item_centerx, item_centery, item_radius, image_path); + + -- outside boundry + cairo_arc(cr, item_centerx, item_centery, item_radius + 5, 0, 2*math.pi ); + set_color(1,1); + cairo_stroke(cr); + + -- font settings + set_color(1,1); + cairo_select_font_face(cr, "Familian Elder", 0 , 1); + cairo_set_font_size(cr, item_font_size); + + -- name text + text = "Power"; + cairo_text_extents(cr, text, extents) + cairo_move_to(cr, item_centerx - extents.width/2, item_centery - item_radius - 10); + cairo_show_text(cr, text); + + -- value text + text = conky_parse("${battery_short}"); + cairo_text_extents(cr, text, extents) + cairo_move_to(cr, item_centerx - extents.width/2, item_centery + item_radius + item_font_size + 8); + cairo_show_text(cr, text); + + + -- time and date ------------------------------------------ time and date + + local hour = conky_parse('${time %I}'); + local minute = conky_parse('${time %M}'); + local part = conky_parse('${time %p}'); + local day = conky_parse('${time %d}'); + local month = conky_parse('${time %B}'); + local year = conky_parse('${time %G}'); + + -- time + set_color(1,1); + cairo_select_font_face(cr, "Familian Elder", 0,1); + cairo_set_font_size(cr,height/10); + text = hour..":"..minute..part; + cairo_text_extents(cr,text,extents) + cairo_move_to(cr, centerx - extents.width/2, height/6); + cairo_show_text(cr, text); + local time_height = height/6; + + -- date + set_color(1,0.6); + item_font_size = height/30; + cairo_select_font_face(cr, "Arial",0,0); + cairo_set_font_size(cr, item_font_size) + text = month.." "..day..", "..year; + cairo_text_extents(cr,text,extents) + cairo_move_to(cr, centerx - extents.width/2, time_height + height/30); + cairo_show_text(cr, text); + + + -- destroying the cairo surface + cairo_destroy(cr); + cairo_surface_destroy(cs); + cr=nil; +end diff --git a/config/conky/Octupi_Arch/settings b/config/conky/Octupi_Arch/settings new file mode 100644 index 00000000..5c2b567b --- /dev/null +++ b/config/conky/Octupi_Arch/settings @@ -0,0 +1,17 @@ + +# dimenstions +WIDTH = 1366; +HEIGHT = 748; + +# network +NETWORK = wlo1; + +# cpu +NO_OF_CORES = 8; + +# color scheme the values are DARK or WHITE +COLOR = WHITE; + +# gmail account +MAIL = '''MAIL''':'''PASSWARD''' https://mail.google.com/mail/feed/atom/unread; + diff --git a/config/conky/conky-startup.sh b/config/conky/conky-startup.sh new file mode 100644 index 00000000..7470f295 --- /dev/null +++ b/config/conky/conky-startup.sh @@ -0,0 +1,8 @@ +sleep 5s +killall conky +cd "/home/jonathan/.conky/BibleVerse" +conky -c "/home/jonathan/.conky/BibleVerse/bibleGateway" & +cd "/home/jonathan/.conky/MyBlue" +conky -c "/home/jonathan/.conky/MyBlue/MyBlue" & +cd "/home/jonathan/.conky/Octupi_Arch" +conky -c "/home/jonathan/.conky/Octupi_Arch/co_main" & diff --git a/config/i3/config b/config/i3/config new file mode 100644 index 00000000..67153671 --- /dev/null +++ b/config/i3/config @@ -0,0 +1,361 @@ +# This file has been auto-generated by i3-config-wizard(1). +# It will not be overwritten, so edit it as you like. +# +# Should you change your keyboard layout some time, delete +# this file and re-run i3-config-wizard(1). +# + +# i3 config file (v4) +# +# Please see http://i3wm.org/docs/userguide.html for a complete reference! + +set $mod Mod4 + +set $base00 #101218 +set $base01 #1f222d +set $base02 #252936 +set $base03 #7780a1 +set $base04 #C0C5CE +set $base05 #d1d4e0 +set $base06 #C9CCDB +set $base07 #ffffff +set $base08 #ee829f +set $base09 #f99170 +set $base0A #ffefcc +set $base0B #a5ffe1 +set $base0C #97e0ff +set $base0D #97bbf7 +set $base0E #c0b7f9 +set $base0F #fcc09e + + +# Font for window titles. Will also be used by the bar unless a different font +# is used in the bar {} block below. +font pango:monospace 8 + +# This font is widely installed, provides lots of unicode glyphs, right-to-left +# text rendering and scalability on retina/hidpi displays (thanks to pango). +#font pango:DejaVu Sans Mono 8 + +# Before i3 v4.8, we used to recommend this one as the default: +# font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1 +# The font above is very space-efficient, that is, it looks good, sharp and +# clear in small sizes. However, its unicode glyph coverage is limited, the old +# X core fonts rendering does not support right-to-left and this being a bitmap +# font, it doesn’t scale on retina/hidpi displays. + +# Use Mouse+$mod to drag floating windows to their wanted position +floating_modifier $mod + +# start a terminal +# bindsym $mod+Return exec xfce4-terminal +#bindsym $mod+Return exec konsole +bindsym $mod+Return exec termite + +# kill focused window +bindsym $mod+q kill + +# start dmenu (a program launcher) +# bindsym $mod+d exec dmenu_run +bindsym $mod+d exec albert toggle +#bindsym $mod+z exec xfce4-appfinder + +#kill i3 +bindsym $mod+Shift+x exec killall i3 + +for_window [class="xfce4-appfinder"] floating enable + + + +# There also is the (new) i3-dmenu-desktop which only displays applications +# shipping a .desktop file. It is a wrapper around dmenu, so you need that +# installed. +# bindsym $mod+d exec --no-startup-id i3-dmenu-desktop + +# change focus +bindsym $mod+j focus down +bindsym $mod+k focus up +bindsym $mod+l focus right +bindsym $mod+h focus left + +# alternatively, you can use the cursor keys: +bindsym $mod+Left focus left +bindsym $mod+Down focus down +bindsym $mod+Up focus up +bindsym $mod+Right focus right + +# move focused window +bindsym $mod+Shift+j move down +bindsym $mod+Shift+k move up +bindsym $mod+Shift+l move right +bindsym $mod+Shift+h move left + +# alternatively, you can use the cursor keys: +bindsym $mod+Shift+Left move left +bindsym $mod+Shift+Down move down +bindsym $mod+Shift+Up move up +bindsym $mod+Shift+Right move right + +# split in horizontal orientation +bindsym $mod+g split h + +# split in vertical orientation +bindsym $mod+v split v + +# enter fullscreen mode for the focused container +bindsym $mod+f fullscreen toggle + +# change container layout (stacked, tabbed, toggle split) +bindsym $mod+s layout stacking +bindsym $mod+w layout tabbed +bindsym $mod+e layout toggle split + +# toggle tiling / floating +bindsym $mod+Shift+space floating toggle + +# change focus between tiling / floating windows +bindsym $mod+space focus mode_toggle + +# focus the parent container +bindsym $mod+a focus parent + +# move to the parent container +bindsym $mod+Shift+a move parent + +# focus the child container +bindsym $mod+z focus child + +# move to the child container +bindsym $mod+Shift+z focus child + + +#set workspace names +set $workspace1 "1: Browser " +set $workspace2 "2: Terminal " +set $workspace3 "3" +set $workspace4 "4" +set $workspace5 "5" +set $workspace6 "6" +set $workspace7 "7" +set $workspace8 "8" +set $workspace9 "9" +set $workspace10 "10: Chat " + +# switch to workspace +bindsym $mod+1 workspace $workspace1 +bindsym $mod+2 workspace $workspace2 +bindsym $mod+3 workspace $workspace3 +bindsym $mod+4 workspace $workspace4 +bindsym $mod+5 workspace $workspace5 +bindsym $mod+6 workspace $workspace6 +bindsym $mod+7 workspace $workspace7 +bindsym $mod+8 workspace $workspace8 +bindsym $mod+9 workspace $workspace9 +bindsym $mod+0 workspace $workspace10 + +# move focused container to workspace +bindsym $mod+Shift+1 move container to workspace $workspace1, workspace $workspace1 +bindsym $mod+Shift+2 move container to workspace $workspace2, workspace $workspace2 +bindsym $mod+Shift+3 move container to workspace $workspace3, workspace $workspace3 +bindsym $mod+Shift+4 move container to workspace $workspace4, workspace $workspace4 +bindsym $mod+Shift+5 move container to workspace $workspace5, workspace $workspace5 +bindsym $mod+Shift+6 move container to workspace $workspace6, workspace $workspace6 +bindsym $mod+Shift+7 move container to workspace $workspace7, workspace $workspace7 +bindsym $mod+Shift+8 move container to workspace $workspace8, workspace $workspace8 +bindsym $mod+Shift+9 move container to workspace $workspace9, workspace $workspace9 +bindsym $mod+Shift+0 move container to workspace $workspace10, workspace $workspace10 + +#assign programs to workspaces +assign [class="chromium"] $workspace1 +assign [instance="crx_knipolnnllmklapflnccelgolnpehhpl"] to $workspace10 + +for_window [window_role="gimp-toolbox"] floating disable; move left; move left; +for_window [window_role="gimp-dock"] floating disable; move right; move right; + +# reload the configuration file +bindsym $mod+Shift+c reload + +# restart i3 inplace (preserves your layout/session, can be used to upgrade i3) +bindsym $mod+Shift+r restart + +# exit i3 (logs you out of your X session) +#bindsym $mod+Shift+e exec "i3-nagbar -t warning -m 'You pressed the exit shortcut. Do you really want to exit i3? This will end your X session.' -b 'Yes, exit i3' 'i3-msg exit'" + +# resize window (you can also use the mouse for that) +mode "resize" { + # These bindings trigger as soon as you enter the resize mode + + # Pressing left will shrink the window’s width. + # Pressing right will grow the window’s width. + # Pressing up will shrink the window’s height. + # Pressing down will grow the window’s height. + bindsym h resize shrink width 10 px or 10 ppt + bindsym j resize grow height 10 px or 10 ppt + bindsym k resize shrink height 10 px or 10 ppt + bindsym l resize grow width 10 px or 10 ppt + + # same bindings, but for the arrow keys + bindsym Left resize shrink width 10 px or 10 ppt + bindsym Down resize grow height 10 px or 10 ppt + bindsym Up resize shrink height 10 px or 10 ppt + bindsym Right resize grow width 10 px or 10 ppt + + # back to normal: Enter or Escape + bindsym Return mode "default" + bindsym Escape mode "default" +} + +bindsym $mod+r mode "resize" + + +# Widow Colours +# border background text indicator + client.focused $base01 $base01 $base07 $base0F + client.focused_inactive $base02 $base02 $base03 $base0F + client.unfocused $base02 $base02 $base03 $base0F + client.urgent $base02 $base08 $base00 $base0F + + +# Start i3bar to display a workspace bar (plus the system information i3status +# finds out, if available) +bar { + status_command i3status + #tray_output primary + colors { + separator $base03 + background $base01 + statusline $base05 + # border background text + focused_workspace $base01 $base01 $base07 + active_workspace $base01 $base02 $base03 + inactive_workspace $base01 $base01 $base03 + urgent_workspace $base01 $base01 $base08 + } +} + +#Use xfce4 panel instead of i3's +#exec --no-startup-id xfce4-panel --disable-wm-check + +bindsym control+mod1+c exec chromium, workspace $workspace1 +bindsym control+mod1+f exec thunar + + +# Pulse Audio controls +bindsym XF86AudioRaiseVolume exec --no-startup-id pactl set-sink-volume 1 +5% #increase sound volume +bindsym XF86AudioLowerVolume exec --no-startup-id pactl set-sink-volume 1 -5% #decrease sound volume +bindsym XF86AudioMute exec --no-startup-id pactl set-sink-mute 1 toggle # mute sound + +# Sreen brightness controls +bindsym XF86MonBrightnessUp exec xbacklight -inc 20 # increase screen brightness +bindsym XF86MonBrightnessDown exec xbacklight -dec 20 # decrease screen brightness + +# Touchpad controls +bindsym XF86TouchpadToggle exec /some/path/toggletouchpad.sh # toggle touchpad + +# Media player controls +bindsym XF86AudioPlay exec playerctl play +bindsym XF86AudioPause exec playerctl pause +bindsym XF86AudioNext exec playerctl next +bindsym XF86AudioPrev exec playerctl previous + +#printscreen +bindsym Print exec xfce4-screenshooter -f +bindsym ctrl+Print exec xfce4-screenshooter -w +bindsym Shift+Print exec xfce4-screenshooter -r + + +bindsym $mod+x exec --no-startup-id ~/.config/i3/i3exit logout + + +set $mode_system System (l) lock, (e) logout, (s) suspend, (h) hibernate, (r) reboot, (Shift+s) shutdown +mode "$mode_system" { + bindsym l exec --no-startup-id ~/.config/i3/i3exit lock, mode "default" + bindsym e exec --no-startup-id ~/.config/i3/i3exit logout, mode "default" + bindsym s exec --no-startup-id ~/.config/i3/i3exit suspend, mode "default" + bindsym h exec --no-startup-id ~/.config/i3/i3exit hibernate, mode "default" + bindsym r exec --no-startup-id~/.config/i3/i3exit reboot, mode "default" + bindsym Shift+s exec --no-startup-id ~/.config/i3/i3exit shutdown, mode "default" + + # back to normal: Enter or Escape + bindsym Return mode "default" + bindsym Escape mode "default" +} +bindsym ctrl+Shift+l mode "$mode_system" +#bindsym ctrl+l exec "/home/jonathan/.bin/i3exit lock" + + +################################################## +# # +# i3 Gaps # +# # +################################################## + +for_window [class="^.*"] border pixel 0 +gaps outer 0 +gaps inner 10 +smart_gaps on + +set $mode_gaps Gaps: (o) outer, (i) inner, (d) default +set $mode_gaps_outer Outer Gaps: +|-|0 (local), Shift + +|-|0 (global) +set $mode_gaps_inner Inner Gaps: +|-|0 (local), Shift + +|-|0 (global) +bindsym $mod+Shift+g mode "$mode_gaps" + +mode "$mode_gaps" { + bindsym o mode "$mode_gaps_outer" + bindsym i mode "$mode_gaps_inner" + bindsym d gaps inner current set 10; gaps outer current set 0 + bindsym Shift+d gaps inner all set 10; gaps outer all set 0 + bindsym Return mode "default" + bindsym Escape mode "default" +} + +mode "$mode_gaps_inner" { + bindsym plus gaps inner current plus 5 + bindsym minus gaps inner current minus 5 + bindsym 0 gaps inner current set 0 + bindsym d gaps inner current set 10 + + bindsym Shift+plus gaps inner all plus 5 + bindsym Shift+minus gaps inner all minus 5 + bindsym Shift+0 gaps inner all set 0 + bindsym Shift+d gaps inner all set 10 + + bindsym Return mode "default" + bindsym Escape mode "default" +} +mode "$mode_gaps_outer" { + bindsym plus gaps outer current plus 5 + bindsym minus gaps outer current minus 5 + bindsym 0 gaps outer current set 0 + bindsym d gaps outer current set 0 + + bindsym Shift+plus gaps outer all plus 5 + bindsym Shift+minus gaps outer all minus 5 + bindsym Shift+0 gaps outer all set 0 + bindsym Shift+d gaps outer all set 0 + + bindsym Return mode "default" + bindsym Escape mode "default" +} + + + + +#exec --no-startup-id redshift-gtk +#exec_always feh --bg-fill /home/jonathan/Pictures/Wallpapers/blueConky/dfCXBel.jpg +exec --no-startup-id compton -f -i 0.95 +exec --no-startup-id albert +#exec --no-startup-id nm-applet +#exec --no-startup-id blueman-applet +#exec --no-startup-id xfce4-clipman +#exec --no-startup-id xfce4-power-manager +#exec_always --no-startup-id /usr/lib/kdeconnectd +#exec_always --no-startup-id indicator-kdeconnect +#exec_always --no-startup-id killall conky +#exec_always --no-startup-id sleep 1s; killall -9 conky +#exec --no-startup-id sh /home/jonathan/.conky/conky-startup.sh +#exec_always --no-startup-id sleep 2s; conky -c "/home/jonathan/.conky/BibleVerse/bibleGateway" +#exec_always --no-startup-id sleep 2s; conky -c "/home/jonathan/.conky/MyBlue/MyBlue" +#exec_always --no-startup-id cd /home/jonathan/.conky/Octupi_Arch +#exec_always --no-startup-id sleep 2s; conky -c "co_main" +exec setxkbmap gb diff --git a/config/i3/configWork b/config/i3/configWork new file mode 100644 index 00000000..f1cf663c --- /dev/null +++ b/config/i3/configWork @@ -0,0 +1,363 @@ +# i3 config file (v4) +# +# Please see http://i3wm.org/docs/userguide.html for a complete reference! + +set $mod Mod4 + +set $base00 #101218 +set $base01 #1f222d +set $base02 #252936 +set $base03 #7780a1 +set $base04 #C0C5CE +set $base05 #d1d4e0 +set $base06 #C9CCDB +set $base07 #ffffff +set $base08 #ee829f +set $base09 #f99170 +set $base0A #ffefcc +set $base0B #a5ffe1 +set $base0C #97e0ff +set $base0D #97bbf7 +set $base0E #c0b7f9 +set $base0F #fcc09e + + +# Font for window titles. Will also be used by the bar unless a different font +# is used in the bar {} block below. +font pango:monospace 8 + +# This font is widely installed, provides lots of unicode glyphs, right-to-left +# text rendering and scalability on retina/hidpi displays (thanks to pango). +font pango:DejaVu Sans Mono 8 + +# Before i3 v4.8, we used to recommend this one as the default: +# font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1 +# The font above is very space-efficient, that is, it looks good, sharp and +# clear in small sizes. However, its unicode glyph coverage is limited, the old +# X core fonts rendering does not support right-to-left and this being a bitmap +# font, it doesn’t scale on retina/hidpi displays. + +# Use Mouse+$mod to drag floating windows to their wanted position +floating_modifier $mod + +# start a terminal +# bindsym $mod+Return exec xfce4-terminal +# bindsym $mod+Return exec konsole +bindsym $mod+Return exec termite + +# kill focused window +bindsym $mod+q kill + +# start dmenu (a program launcher) +#bindsym $mod+d exec dmenu_run +bindsym $mod+d exec albert toggle +bindsym XF86Search exec albert toggle +#bindsym $mod+z exec xfce4-appfinder + +#kill i3 +bindsym $mod+Shift+x exec killall i3 + +for_window [class="xfce4-appfinder"] floating enable + + + +# There also is the (new) i3-dmenu-desktop which only displays applications +# shipping a .desktop file. It is a wrapper around dmenu, so you need that +# installed. +# bindsym $mod+d exec --no-startup-id i3-dmenu-desktop + +# change focus +bindsym $mod+j focus down +bindsym $mod+k focus up +bindsym $mod+l focus right +bindsym $mod+h focus left + +# alternatively, you can use the cursor keys: +bindsym $mod+Left focus left +bindsym $mod+Down focus down +bindsym $mod+Up focus up +bindsym $mod+Right focus right + +# move focused window +bindsym $mod+Shift+h move left +bindsym $mod+Shift+j move down +bindsym $mod+Shift+k move up +bindsym $mod+Shift+l move right + +# alternatively, you can use the cursor keys: +bindsym $mod+Shift+Left move left +bindsym $mod+Shift+Down move down +bindsym $mod+Shift+Up move up +bindsym $mod+Shift+Right move right + +# split in horizontal orientation +bindsym $mod+g split h + +# split in vertical orientation +bindsym $mod+v split v + +# enter fullscreen mode for the focused container +bindsym $mod+f fullscreen toggle + +# change container layout (stacked, tabbed, toggle split) +bindsym $mod+s layout stacking +bindsym $mod+w layout tabbed +bindsym $mod+e layout toggle split + +# toggle tiling / floating +bindsym $mod+Shift+space floating toggle + +# change focus between tiling / floating windows +bindsym $mod+space focus mode_toggle + +# focus the parent container +bindsym $mod+a focus parent + +# focus the child container +bindsym $mod+Shift+a focus child + + +#set workspace names +set $workspace1 "1: Browser " +set $workspace2 "2: Terminal " +set $workspace3 "3" +set $workspace4 "4" +set $workspace5 "5" +set $workspace6 "6" +set $workspace7 "7" +set $workspace8 "8" +set $workspace9 "9" +set $workspace10 "10 Chat " + +# switch to workspace +bindsym $mod+1 workspace $workspace1 +bindsym $mod+2 workspace $workspace2 +bindsym $mod+3 workspace $workspace3 +bindsym $mod+4 workspace $workspace4 +bindsym $mod+5 workspace $workspace5 +bindsym $mod+6 workspace $workspace6 +bindsym $mod+7 workspace $workspace7 +bindsym $mod+8 workspace $workspace8 +bindsym $mod+9 workspace $workspace9 +bindsym $mod+0 workspace $workspace10 + +# move focused container to workspace +bindsym $mod+Shift+1 move container to workspace $workspace1, workspace $workspace1 +bindsym $mod+Shift+2 move container to workspace $workspace2, workspace $workspace2 +bindsym $mod+Shift+3 move container to workspace $workspace3, workspace $workspace3 +bindsym $mod+Shift+4 move container to workspace $workspace4, workspace $workspace4 +bindsym $mod+Shift+5 move container to workspace $workspace5, workspace $workspace5 +bindsym $mod+Shift+6 move container to workspace $workspace6, workspace $workspace6 +bindsym $mod+Shift+7 move container to workspace $workspace7, workspace $workspace7 +bindsym $mod+Shift+8 move container to workspace $workspace8, workspace $workspace8 +bindsym $mod+Shift+9 move container to workspace $workspace9, workspace $workspace9 +bindsym $mod+Shift+0 move container to workspace $workspace10, workspace $workspace10 + +# move workspace to left/right +bindsym $mod+control+Left move workspace to output left +bindsym $mod+control+Right move workspace to output right + + +bindsym $mod+control+h move workspace to output left +bindsym $mod+control+l move workspace to output right + + +#assign programs to workspaces +assign [class="chromium"] $workspace1 +assign [class="skypeforlinux"] $workspace10 + +#make applications open in floating mode +for_window [class="Galculator"] floating enable + +# reload the configuration file +bindsym $mod+Shift+c reload + +# restart i3 inplace (preserves your layout/session, can be used to upgrade i3) +bindsym $mod+Shift+r restart + +# exit i3 (logs you out of your X session) +bindsym $mod+Shift+e exec "i3-nagbar -t warning -m 'You pressed the exit shortcut. Do you really want to exit i3? This will end your X session.' -b 'Yes, exit i3' 'i3-msg exit'" + +# resize window (you can also use the mouse for that) +mode "resize" { + # These bindings trigger as soon as you enter the resize mode + + # Pressing left will shrink the window’s width. + # Pressing right will grow the window’s width. + # Pressing up will shrink the window’s height. + # Pressing down will grow the window’s height. + bindsym h resize shrink width 10 px or 10 ppt + bindsym j resize grow height 10 px or 10 ppt + bindsym k resize shrink height 10 px or 10 ppt + bindsym l resize grow width 10 px or 10 ppt + + # same bindings, but for the arrow keys + bindsym Left resize shrink width 10 px or 10 ppt + bindsym Down resize grow height 10 px or 10 ppt + bindsym Up resize shrink height 10 px or 10 ppt + bindsym Right resize grow width 10 px or 10 ppt + + # back to normal: Enter or Escape + bindsym Return mode "default" + bindsym Escape mode "default" +} + +bindsym $mod+r mode "resize" + + +# Widow Colours +# border background text indicator + client.focused $base01 $base01 $base07 $base0F + client.focused_inactive $base02 $base02 $base03 $base0F + client.unfocused $base02 $base02 $base03 $base0F + client.urgent $base02 $base08 $base00 $base0F + + +# Start i3bar to display a workspace bar (plus the system information i3status +# finds out, if available) +bar { + status_command i3status + #tray_output primary + colors { + separator $base03 + background $base01 + statusline $base05 + # border background text + focused_workspace $base01 $base01 $base07 + active_workspace $base01 $base02 $base03 + inactive_workspace $base01 $base01 $base03 + urgent_workspace $base01 $base01 $base08 + } +} + +#Use xfce4 panel instead of i3's +#exec --no-startup-id xfce4-panel --disable-wm-check + +bindsym control+mod1+c exec chromium, workspace $workspace1 +bindsym control+mod1+f exec thunar +bindsym XF86Mail exec thunderbird +bindsym $mod+z exec zeal + +# Pulse Audio controls +bindsym XF86AudioRaiseVolume exec --no-startup-id pactl set-sink-volume 0 +5% #increase sound volume +bindsym XF86AudioLowerVolume exec --no-startup-id pactl set-sink-volume 0 -5% #decrease sound volume +bindsym XF86AudioMute exec --no-startup-id pactl set-sink-mute 0 toggle # mute sound + +# Sreen brightness controls +#bindsym XF86MonBrightnessUp exec xbacklight -inc 20 # increase screen brightness +#bindsym XF86MonBrightnessDown exec xbacklight -dec 20 # decrease screen brightness + +# Touchpad controls +#bindsym XF86TouchpadToggle exec /some/path/toggletouchpad.sh # toggle touchpad + +# Media player controls +bindsym XF86AudioPlay exec playerctl play-pause +#bindsym XF86AudioPause exec playerctl pause +#bindsym XF86AudioNext exec playerctl next +#bindsym XF86AudioPrev exec playerctl previous + +#calculator button +bindsym XF86Calculator exec galculator + +#printscreen +bindsym Print exec xfce4-screenshooter -f +bindsym ctrl+Print exec xfce4-screenshooter -w +bindsym Shift+Print exec xfce4-screenshooter -r + + +bindsym $mod+x exec --no-startup-id ~/.config/i3/i3exit logout + + +set $mode_system System (l) lock, (e) logout, (s) suspend, (h) hibernate, (r) reboot, (Shift+s) shutdown +mode "$mode_system" { + bindsym l exec --no-startup-id ~/.config/i3/i3exit lock, mode "default" + bindsym e exec --no-startup-id ~/.config/i3/i3exit logout, mode "default" + bindsym s exec --no-startup-id ~/.config/i3/i3exit suspend, mode "default" + bindsym h exec --no-startup-id ~/.config/i3/i3exit hibernate, mode "default" + bindsym r exec --no-startup-id~/.config/i3/i3exit reboot, mode "default" + bindsym Shift+s exec --no-startup-id ~/.config/i3/i3exit shutdown, mode "default" + + # back to normal: Enter or Escape + bindsym Return mode "default" + bindsym Escape mode "default" +} +bindsym ctrl+shift+l mode "$mode_system" +#bindsym ctrl+l exec "~/.config/i3/i3exit lock" + +################################################## +# # +# i3 Gaps # +# # +################################################## + +for_window [class="^.*"] border pixel 0 +gaps outer 0 +gaps inner 10 +smart_gaps on + +set $mode_gaps Gaps: (o) outer, (i) inner, (d) default +set $mode_gaps_outer Outer Gaps: +|-|0 (local), Shift + +|-|0 (global) +set $mode_gaps_inner Inner Gaps: +|-|0 (local), Shift + +|-|0 (global) +bindsym $mod+Shift+g mode "$mode_gaps" + +mode "$mode_gaps" { + bindsym o mode "$mode_gaps_outer" + bindsym i mode "$mode_gaps_inner" + bindsym d gaps inner current set 10; gaps outer current set 0 + bindsym Shift+d gaps inner all set 10; gaps outer all set 0 + bindsym Return mode "default" + bindsym Escape mode "default" +} + +mode "$mode_gaps_inner" { + bindsym plus gaps inner current plus 5 + bindsym minus gaps inner current minus 5 + bindsym 0 gaps inner current set 0 + bindsym d gaps inner current set 10 + + bindsym Shift+plus gaps inner all plus 5 + bindsym Shift+minus gaps inner all minus 5 + bindsym Shift+0 gaps inner all set 0 + bindsym Shift+d gaps inner all set 10 + + bindsym Return mode "default" + bindsym Escape mode "default" +} +mode "$mode_gaps_outer" { + bindsym plus gaps outer current plus 5 + bindsym minus gaps outer current minus 5 + bindsym 0 gaps outer current set 0 + bindsym d gaps outer current set 0 + + bindsym Shift+plus gaps outer all plus 5 + bindsym Shift+minus gaps outer all minus 5 + bindsym Shift+0 gaps outer all set 0 + bindsym Shift+d gaps outer all set 0 + + bindsym Return mode "default" + bindsym Escape mode "default" +} + + + + +#exec --no-startup-id redshift-gtk + +#exec --no-startup-id redshift-gtk +#exec feh --bg-scale /home/jonathan/Pictures/Wallpapers/blueConky/ram_memory_chip-wallpaper-3554x1999.jpg +exec --no-startup-id compton -f -i 0.95 +exec_always --no-startup-id /usr/lib/kdeconnectd +exec_always --no-startup-id indicator-kdeconnect +#exec --no-startup-id nm-applet +#exec --no-startup-id blueman-applet +exec --no-startup-id xfce4-clipman +#exec --no-startup-id xfce4-power-manager +#exec_always --no-startup-id killall conky +#exec_always --no-startup-id sleep 1s; killall -9 conky +exec --no-startup-id xrandr --output HDMI-1 --auto --left-of DP-1 +exec_always --no-startup-id /usr/lib/xfce4/notifyd/xfce4-notifyd +exec --no-startup-id sh ~/.fehbg +exec_always --no-startup-id sh "/home/jonathan/.config/conky/conky-startup.sh" +#exec --no-startup-id conky -c "/home/jonathan/.config/conky/BibleVerse/bibleGateway" +#exec --no-startup-id conky -c "/home/jonathan/.config/conky/MyBlue/MyBlue" +exec --no-startup-id albert diff --git a/config/i3/fadeLockScreen b/config/i3/fadeLockScreen new file mode 100755 index 00000000..98c96d7b --- /dev/null +++ b/config/i3/fadeLockScreen @@ -0,0 +1,36 @@ +#!/bin/bash + +scrot -z /tmp/screen.png +convert /tmp/screen.png -scale 10% -scale 1000% /tmp/screen.png + +if [[ -f $HOME/.config/screen-lock.png ]] +then + # placement x/y + PX=0 + PY=0 + # lockscreen image info + R=$(file ~/.config/screen-lock.png | grep -o '[0-9]* x [0-9]*') + RX=$(echo $R | cut -d' ' -f 1) + RY=$(echo $R | cut -d' ' -f 3) + + + + SR=$(xrandr --query | grep ' connected' | cut -f4 -d' ') + echo $SR + for RES in $SR + do + echo $RES + # monitor position/offset + SRX=$(echo $RES | cut -d'x' -f 1) # x pos + SRY=$(echo $RES | cut -d'x' -f 2 | cut -d'+' -f 1) # y pos + SROX=$(echo $RES | cut -d'x' -f 2 | cut -d'+' -f 2) # x offset + SROY=$(echo $RES | cut -d'x' -f 2 | cut -d'+' -f 3) # y offset + PX=$(($SROX + $SRX/2 - $RX/2)) + PY=$(($SROY + $SRY/2 - $RY/2)) + convert /tmp/screen.png $HOME/.config/screen-lock.png -geometry +$PX+$PY -composite -matte /tmp/screen.png + echo "done" + done +fi +# dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.Stop +# i3lock -I 10 -d -e -u -n -i /tmp/screen.png +i3lock -e -n -i /tmp/screen.png diff --git a/config/i3/i3exit b/config/i3/i3exit new file mode 100755 index 00000000..40556178 --- /dev/null +++ b/config/i3/i3exit @@ -0,0 +1,31 @@ +#!/bin/sh +lock() { + ~/.config/i3/fadeLockScreen + #i3lock +} + +case "$1" in + lock) + lock + ;; + logout) + i3-msg exit + ;; + suspend) + systemctl suspend && lock + ;; + hibernate) + systemctl hibernate && lock + ;; + reboot) + systemctl reboot + ;; + shutdown) + systemctl poweroff + ;; + *) + echo "Usage: $0 {lock|logout|suspend|hibernate|reboot|shutdown}" + exit 2 +esac + +exit 0 diff --git a/config/inkscape/preferences.xml b/config/inkscape/preferences.xml new file mode 100644 index 00000000..b0d3b118 --- /dev/null +++ b/config/inkscape/preferences.xml @@ -0,0 +1,1351 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/config/powerline-shell/CHANGELOG.md b/config/powerline-shell/CHANGELOG.md new file mode 100644 index 00000000..2a1cef31 --- /dev/null +++ b/config/powerline-shell/CHANGELOG.md @@ -0,0 +1,86 @@ +# Changes + +2016-04-16 + +* Fix issue around unicode function for python 3 + +2016-04-01 + +* Refactor of the way the git segment manages data about git's state. + ([@b-ryan](https://github.com/milkbikis/powerline-shell/pull/221)) + +2015-12-26 + +* Beginnings of unit testing for segments. Included in this change was a + refactor of the way segments are added to powerline. Now, instead of looking + for a global `powerline` object, `powerline` is passed into the function to + add the segment. Segments will also no longer add the segments by calling the + `add` function themselves. + ([@b-ryan](https://github.com/milkbikis/powerline-shell/pull/212)) +* Python3 fixes for `lib/color_compliment.py`. + ([@ceholden](https://github.com/milkbikis/powerline-shell/pull/220)) + +2015-11-25 + +* `virtual_env` segment now supports environments made with `conda` + ([@ceholden](https://github.com/milkbikis/powerline-shell/pull/198)) + +2015-11-21 + +* Fixes for Python 3 compatibility + ([@b-ryan](https://github.com/milkbikis/powerline-shell/pull/211)) + +2015-11-18 + +* The git segment has gotten a makeover + ([@MartinWetterwald](https://github.com/milkbikis/powerline-shell/pull/136)) +* Fix git segment when git is not on the standard PATH + ([@andrejgl](https://github.com/milkbikis/powerline-shell/pull/153)) +* Fix `--cwd-max-depth` showing duplicates when it's <= 2 + ([@b-ryan](https://github.com/milkbikis/powerline-shell/pull/209)) +* Add padding around `exit_code` segment + ([@phatblat](https://github.com/milkbikis/powerline-shell/pull/205)) + +2015-10-02 + +* New option (`--cwd-max-dir-size`) which allows you to limit each directory + that is displayed to a number of characters. This currently does not apply + if you are using `--cwd-mode plain`. + ([@mart-e](https://github.com/milkbikis/powerline-shell/pull/127)) + +2015-08-26 + +* New `plain` mode of displaying the current working directory which can be + used by adding `--cwd-only plain` to `powerline-shell.py`. + This deprecates the `--cwd-only` option. `--cwd-mode dironly` can be used + instead. ([@paol](https://github.com/milkbikis/powerline-shell/pull/156)) + +2015-08-18 + +* New `time` segment + ([@filipebarros](https://github.com/milkbikis/powerline-shell/pull/107)) + +2015-08-01 + +* Use `print` function for some python3 compatibility + ([@strycore](https://github.com/milkbikis/powerline-shell/pull/195)) + +2015-07-31 + +* The current working directory no longer follows symbolic links +* New `exit_code` segment + ([@disruptek](https://github.com/milkbikis/powerline-shell/pull/129)) + +2015-07-30 + +* Fix ZSH root indicator + ([@nkcfan](https://github.com/milkbikis/powerline-shell/pull/150)) +* Add uptime segment + ([@marcioAlmada](https://github.com/milkbikis/powerline-shell/pull/139)) + +2015-07-27 + +* Use `python2` instead of `python` in hashbangs + ([@Undeterminant](https://github.com/milkbikis/powerline-shell/pull/100)) +* Add `node_version` segment + ([@mmilleruva](https://github.com/milkbikis/powerline-shell/pull/189)) diff --git a/config/powerline-shell/LICENSE b/config/powerline-shell/LICENSE new file mode 100644 index 00000000..271cb592 --- /dev/null +++ b/config/powerline-shell/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2014 Shrey Banga and contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/config/powerline-shell/README.md b/config/powerline-shell/README.md new file mode 100644 index 00000000..1bcec178 --- /dev/null +++ b/config/powerline-shell/README.md @@ -0,0 +1,170 @@ +A Powerline style prompt for your shell +======================================= + +A [Powerline](https://github.com/Lokaltog/vim-powerline) like prompt for Bash, ZSH and Fish: + +![MacVim+Solarized+Powerline+CtrlP](https://raw.github.com/milkbikis/dotfiles-mac/master/bash-powerline-screenshot.png) + +* Shows some important details about the git/svn/hg/fossil branch (see below) +* Changes color if the last command exited with a failure code +* If you're too deep into a directory tree, shortens the displayed path with an ellipsis +* Shows the current Python [virtualenv](http://www.virtualenv.org/) environment +* It's easy to customize and extend. See below for details. + +### Version Control + +All of the version control systems supported by powerline shell give you a +quick look into the state of your repo: + +* The current branch is displayed and changes background color when the + branch is dirty. +* When the local branch differs from the remote, the difference in number + of commits is shown along with `⇡` or `⇣` indicating whether a git push + or pull is pending + +In addition, git has a few extra symbols: + +* `✎` -- a file has been modified, but not staged for commit +* `✔` -- a file is staged for commit +* `✼` -- a file has conflicts + +FIXME + * A `+` appears when untracked files are present (except for git, which + uses `?` instead) + +Each of these will have a number next to it if more than one file matches. + +# Setup + +This script uses ANSI color codes to display colors in a terminal. These are +notoriously non-portable, so may not work for you out of the box, but try +setting your $TERM to `xterm-256color`, because that works for me. + +* Patch the font you use for your terminal: see https://github.com/Lokaltog/powerline-fonts + + * If you struggle too much to get working fonts in your terminal, you can use "compatible" mode. + * If you're using old patched fonts, you have to use the older symbols. Basically reverse [this commit](https://github.com/milkbikis/powerline-shell/commit/2a84ecc) in your copy + +* Clone this repository somewhere: + + git clone https://github.com/milkbikis/powerline-shell + +* Copy `config.py.dist` to `config.py` and edit it to configure the segments you want. Then run + + ./install.py + + * This will generate `powerline-shell.py` + +* (optional) Create a symlink to this python script in your home: + + ln -s ~/powerline-shell.py + + * If you don't want the symlink, just modify the path in the commands below + +* For python2.6 you have to install argparse + + pip install argparse + +### All Shells: +There are a few optional arguments which can be seen by running `powerline-shell.py --help`. + +``` + --cwd-mode {fancy,plain,dironly} + How to display the current directory + --cwd-max-depth CWD_MAX_DEPTH + Maximum number of directories to show in path + --cwd-max-dir-size CWD_MAX_DIR_SIZE + Maximum number of letters displayed for each directory + in the path + --colorize-hostname Colorize the hostname based on a hash of itself. + --mode {patched,compatible,flat} + The characters used to make separators between + segments +``` + +### Bash: +Add the following to your `.bashrc` (or `.profile` on Mac): + +``` +function _update_ps1() { + PS1="$(~/powerline-shell.py $? 2> /dev/null)" +} + +if [ "$TERM" != "linux" ]; then + PROMPT_COMMAND="_update_ps1; $PROMPT_COMMAND" +fi +``` + +### ZSH: +Add the following to your `.zshrc`: + +``` +function powerline_precmd() { + PS1="$(~/powerline-shell.py $? --shell zsh 2> /dev/null)" +} + +function install_powerline_precmd() { + for s in "${precmd_functions[@]}"; do + if [ "$s" = "powerline_precmd" ]; then + return + fi + done + precmd_functions+=(powerline_precmd) +} + +if [ "$TERM" != "linux" ]; then + install_powerline_precmd +fi +``` + +### Fish: +Redefine `fish_prompt` in ~/.config/fish/config.fish: + +``` +function fish_prompt + ~/powerline-shell.py $status --shell bare ^/dev/null +end +``` + +# Customization + +### Adding, Removing and Re-arranging segments + +The `config.py` file defines which segments are drawn and in which order. Simply +comment out and rearrange segment names to get your desired arrangement. Every +time you change `config.py`, run `install.py`, which will generate a new +`powerline-shell.py` customized to your configuration. You should see the new +prompt immediately. + +### Contributing new types of segments + +The `segments` directory contains python scripts which are injected as is into +a single file `powerline_shell_base.py`. Each segment script defines a function +that inserts one or more segments into the prompt. If you want to add a new +segment, simply create a new file in the segments directory and add its name to +the `config.py` file at the appropriate location. + +Make sure that your script does not introduce new globals which might conflict +with other scripts. Your script should fail silently and run quickly in any +scenario. + +Make sure you introduce new default colors in `themes/default.py` for every new +segment you create. Test your segment with this theme first. + +You should add tests for your segment as best you are able. Unit and +integration tests are both welcome. Run your tests with the `nosetests` command +after install the requirements in `dev_requirements.txt`. + +### Themes + +The `themes` directory stores themes for your prompt, which are basically color +values used by segments. The `default.py` defines a default theme which can be +used standalone, and every other theme falls back to it if they miss colors for +any segments. Create new themes by copying any other existing theme and +changing the values. To use a theme, set the `THEME` variable in `config.py` to +the name of your theme. + +A script for testing color combinations is provided at `themes/colortest.py`. +Note that the colors you see may vary depending on your terminal. When designing +a theme, please test your theme on multiple terminals, especially with default +settings. diff --git a/config/powerline-shell/bob b/config/powerline-shell/bob new file mode 100644 index 00000000..e69de29b diff --git a/config/powerline-shell/circle.yml b/config/powerline-shell/circle.yml new file mode 100644 index 00000000..7638a893 --- /dev/null +++ b/config/powerline-shell/circle.yml @@ -0,0 +1,5 @@ +dependencies: + pre: + - sudo pip install -r dev_requirements.txt + - git config --global user.email "tester@example.com" + - git config --global user.name "Tester McGee" diff --git a/config/powerline-shell/config.py b/config/powerline-shell/config.py new file mode 100644 index 00000000..0f04c74a --- /dev/null +++ b/config/powerline-shell/config.py @@ -0,0 +1,57 @@ +# This is the configuration file for your powerline-shell prompt +# Every time you make a change to this file, run install.py to apply changes +# +# For instructions on how to use the powerline-shell.py script, see the README + +# Add, remove or rearrange these segments to customize what you see on the shell +# prompt. Any segment you add must be present in the segments/ directory + +SEGMENTS = [ +# Set the terminal window title to user@host:dir + 'set_term_title', + +# Show current virtual environment (see http://www.virtualenv.org/) + 'virtual_env', + +# Show the current user's username as in ordinary prompts + 'username', + +# Show the machine's hostname. Mostly used when ssh-ing into other machines +# 'hostname', + +# Show a padlock when ssh-ing from another machine + 'ssh', + +# Show the current directory. If the path is too long, the middle part is +# replaced with ellipsis ('...') + 'cwd', + +# Show a padlock if the current user has no write access to the current +# directory + 'read_only', + +# Show the current git branch and status + 'git', + +# Show the current mercurial branch and status + 'hg', + +# Show the current svn branch and status + 'svn', + +# Show the current fossil branch and status + 'fossil', + +# Show number of running jobs + 'jobs', + +# Show the last command's exit code if it was non-zero +# 'exit_code', + +# Shows a '#' if the current user is root, '$' otherwise +# Also, changes color if the last command exited with a non-zero error code + 'root', +] + +# Change the colors used to draw individual segments in your prompt +THEME = 'default' diff --git a/config/powerline-shell/config.py.dist b/config/powerline-shell/config.py.dist new file mode 100644 index 00000000..a1e76272 --- /dev/null +++ b/config/powerline-shell/config.py.dist @@ -0,0 +1,57 @@ +# This is the configuration file for your powerline-shell prompt +# Every time you make a change to this file, run install.py to apply changes +# +# For instructions on how to use the powerline-shell.py script, see the README + +# Add, remove or rearrange these segments to customize what you see on the shell +# prompt. Any segment you add must be present in the segments/ directory + +SEGMENTS = [ +# Set the terminal window title to user@host:dir +# 'set_term_title', + +# Show current virtual environment (see http://www.virtualenv.org/) + 'virtual_env', + +# Show the current user's username as in ordinary prompts + 'username', + +# Show the machine's hostname. Mostly used when ssh-ing into other machines + 'hostname', + +# Show a padlock when ssh-ing from another machine + 'ssh', + +# Show the current directory. If the path is too long, the middle part is +# replaced with ellipsis ('...') + 'cwd', + +# Show a padlock if the current user has no write access to the current +# directory + 'read_only', + +# Show the current git branch and status + 'git', + +# Show the current mercurial branch and status + 'hg', + +# Show the current svn branch and status + 'svn', + +# Show the current fossil branch and status + 'fossil', + +# Show number of running jobs + 'jobs', + +# Show the last command's exit code if it was non-zero +# 'exit_code', + +# Shows a '#' if the current user is root, '$' otherwise +# Also, changes color if the last command exited with a non-zero error code + 'root', +] + +# Change the colors used to draw individual segments in your prompt +THEME = 'default' diff --git a/config/powerline-shell/dev_requirements.txt b/config/powerline-shell/dev_requirements.txt new file mode 100644 index 00000000..47a4588d --- /dev/null +++ b/config/powerline-shell/dev_requirements.txt @@ -0,0 +1,3 @@ +nose>=1.3.7 +mock>=1.3.0 +sh>=1.11 diff --git a/config/powerline-shell/install.py b/config/powerline-shell/install.py new file mode 100755 index 00000000..bf36f41e --- /dev/null +++ b/config/powerline-shell/install.py @@ -0,0 +1,49 @@ +#!/usr/bin/env python +from __future__ import print_function +import os +import stat + +try: + import config +except ImportError: + print('Created personal config.py for your customizations') + import shutil + shutil.copyfile('config.py.dist', 'config.py') + import config + +TEMPLATE_FILE = 'powerline_shell_base.py' +OUTPUT_FILE = 'powerline-shell.py' +SEGMENTS_DIR = 'segments' +THEMES_DIR = 'themes' + +def load_source(srcfile): + try: + return ''.join(open(srcfile).readlines()) + '\n\n' + except IOError: + print('Could not open', srcfile) + return '' + +if __name__ == "__main__": + source = load_source(TEMPLATE_FILE) + source += load_source(os.path.join(THEMES_DIR, 'default.py')) + + if config.THEME != 'default': + source += load_source(os.path.join(THEMES_DIR, config.THEME + '.py')) + + for segment in config.SEGMENTS: + source += load_source(os.path.join(SEGMENTS_DIR, segment + '.py')) + + # assumes each segment file will have a function called + # add_segment__[segment] that accepts the powerline object + source += 'add_{}_segment(powerline)\n'.format(segment) + + source += 'sys.stdout.write(powerline.draw())\n' + + try: + open(OUTPUT_FILE, 'w').write(source) + st = os.stat(OUTPUT_FILE) + os.chmod(OUTPUT_FILE, st.st_mode | stat.S_IEXEC) + print(OUTPUT_FILE, 'saved successfully') + except IOError: + print('ERROR: Could not write to powerline-shell.py. Make sure it is writable') + exit(1) diff --git a/config/powerline-shell/powerline-shell.py b/config/powerline-shell/powerline-shell.py new file mode 100755 index 00000000..64b7f2b6 --- /dev/null +++ b/config/powerline-shell/powerline-shell.py @@ -0,0 +1,704 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +from __future__ import print_function + +import argparse +import os +import sys + +py3 = sys.version_info.major == 3 + + +def warn(msg): + print('[powerline-bash] ', msg) + + +if py3: + def unicode(x): + return x + + +class Powerline: + symbols = { + 'compatible': { + 'lock': 'RO', + 'network': 'SSH', + 'separator': u'\u25B6', + 'separator_thin': u'\u276F' + }, + 'patched': { + 'lock': u'\uE0A2', + 'network': u'\uE0A2', + 'separator': u'\uE0B0', + 'separator_thin': u'\uE0B1' + }, + 'flat': { + 'lock': '', + 'network': '', + 'separator': '', + 'separator_thin': '' + }, + } + + color_templates = { + 'bash': '\\[\\e%s\\]', + 'zsh': '%%{%s%%}', + 'bare': '%s', + } + + def __init__(self, args, cwd): + self.args = args + self.cwd = cwd + mode, shell = args.mode, args.shell + self.color_template = self.color_templates[shell] + self.reset = self.color_template % '[0m' + self.lock = Powerline.symbols[mode]['lock'] + self.network = Powerline.symbols[mode]['network'] + self.separator = Powerline.symbols[mode]['separator'] + self.separator_thin = Powerline.symbols[mode]['separator_thin'] + self.segments = [] + + def color(self, prefix, code): + if code is None: + return '' + else: + return self.color_template % ('[%s;5;%sm' % (prefix, code)) + + def fgcolor(self, code): + return self.color('38', code) + + def bgcolor(self, code): + return self.color('48', code) + + def append(self, content, fg, bg, separator=None, separator_fg=None): + self.segments.append((content, fg, bg, + separator if separator is not None else self.separator, + separator_fg if separator_fg is not None else bg)) + + def draw(self): + text = (''.join(self.draw_segment(i) for i in range(len(self.segments))) + + self.reset) + ' ' + if py3: + return text + else: + return text.encode('utf-8') + + def draw_segment(self, idx): + segment = self.segments[idx] + next_segment = self.segments[idx + 1] if idx < len(self.segments)-1 else None + + return ''.join(( + self.fgcolor(segment[1]), + self.bgcolor(segment[2]), + segment[0], + self.bgcolor(next_segment[2]) if next_segment else self.reset, + self.fgcolor(segment[4]), + segment[3])) + + +class RepoStats: + symbols = { + 'detached': u'\u2693', + 'ahead': u'\u2B06', + 'behind': u'\u2B07', + 'staged': u'\u2714', + 'not_staged': u'\u270E', + 'untracked': u'\u003F', + 'conflicted': u'\u273C' + } + + def __init__(self): + self.ahead = 0 + self.behind = 0 + self.untracked = 0 + self.not_staged = 0 + self.staged = 0 + self.conflicted = 0 + + @property + def dirty(self): + qualifiers = [ + self.untracked, + self.not_staged, + self.staged, + self.conflicted, + ] + return sum(qualifiers) > 0 + + def __getitem__(self, _key): + return getattr(self, _key) + + def n_or_empty(self, _key): + """Given a string name of one of the properties of this class, returns + the value of the property as a string when the value is greater than + 1. When it is not greater than one, returns an empty string. + + As an example, if you want to show an icon for untracked files, but you + only want a number to appear next to the icon when there are more than + one untracked files, you can do: + + segment = repo_stats.n_or_empty("untracked") + icon_string + """ + return unicode(self[_key]) if int(self[_key]) > 1 else u'' + + def add_to_powerline(self, powerline, color): + def add(_key, fg, bg): + if self[_key]: + s = u" {}{} ".format(self.n_or_empty(_key), self.symbols[_key]) + powerline.append(s, fg, bg) + add('ahead', color.GIT_AHEAD_FG, color.GIT_AHEAD_BG) + add('behind', color.GIT_BEHIND_FG, color.GIT_BEHIND_BG) + add('staged', color.GIT_STAGED_FG, color.GIT_STAGED_BG) + add('not_staged', color.GIT_NOTSTAGED_FG, color.GIT_NOTSTAGED_BG) + add('untracked', color.GIT_UNTRACKED_FG, color.GIT_UNTRACKED_BG) + add('conflicted', color.GIT_CONFLICTED_FG, color.GIT_CONFLICTED_BG) + + +def get_valid_cwd(): + """ We check if the current working directory is valid or not. Typically + happens when you checkout a different branch on git that doesn't have + this directory. + We return the original cwd because the shell still considers that to be + the working directory, so returning our guess will confuse people + """ + # Prefer the PWD environment variable. Python's os.getcwd function follows + # symbolic links, which is undesirable. But if PWD is not set then fall + # back to this func + try: + cwd = os.getenv('PWD') or os.getcwd() + except: + warn("Your current directory is invalid. If you open a ticket at " + + "https://github.com/milkbikis/powerline-shell/issues/new " + + "we would love to help fix the issue.") + sys.stdout.write("> ") + sys.exit(1) + + parts = cwd.split(os.sep) + up = cwd + while parts and not os.path.exists(up): + parts.pop() + up = os.sep.join(parts) + if cwd != up: + warn("Your current directory is invalid. Lowest valid directory: " + + up) + return cwd + + +if __name__ == "__main__": + arg_parser = argparse.ArgumentParser() + arg_parser.add_argument('--cwd-mode', action='store', + help='How to display the current directory', default='fancy', + choices=['fancy', 'plain', 'dironly']) + arg_parser.add_argument('--cwd-only', action='store_true', + help='Deprecated. Use --cwd-mode=dironly') + arg_parser.add_argument('--cwd-max-depth', action='store', type=int, + default=5, help='Maximum number of directories to show in path') + arg_parser.add_argument('--cwd-max-dir-size', action='store', type=int, + help='Maximum number of letters displayed for each directory in the path') + arg_parser.add_argument('--colorize-hostname', action='store_true', + help='Colorize the hostname based on a hash of itself.') + arg_parser.add_argument('--mode', action='store', default='patched', + help='The characters used to make separators between segments', + choices=['patched', 'compatible', 'flat']) + arg_parser.add_argument('--shell', action='store', default='bash', + help='Set this to your shell type', choices=['bash', 'zsh', 'bare']) + arg_parser.add_argument('prev_error', nargs='?', type=int, default=0, + help='Error code returned by the last command') + args = arg_parser.parse_args() + + powerline = Powerline(args, get_valid_cwd()) + + +class DefaultColor: + """ + This class should have the default colors for every segment. + Please test every new segment with this theme first. + """ + USERNAME_FG = 250 + USERNAME_BG = 240 + USERNAME_ROOT_BG = 124 + + HOSTNAME_FG = 250 + HOSTNAME_BG = 238 + + HOME_SPECIAL_DISPLAY = True + HOME_BG = 31 # blueish + HOME_FG = 15 # white + PATH_BG = 237 # dark grey + PATH_FG = 250 # light grey + CWD_FG = 254 # nearly-white grey + SEPARATOR_FG = 244 + + READONLY_BG = 124 + READONLY_FG = 254 + + SSH_BG = 166 # medium orange + SSH_FG = 254 + + REPO_CLEAN_BG = 148 # a light green color + REPO_CLEAN_FG = 0 # black + REPO_DIRTY_BG = 161 # pink/red + REPO_DIRTY_FG = 15 # white + + JOBS_FG = 39 + JOBS_BG = 238 + + CMD_PASSED_BG = 236 + CMD_PASSED_FG = 15 + CMD_FAILED_BG = 161 + CMD_FAILED_FG = 15 + + SVN_CHANGES_BG = 148 + SVN_CHANGES_FG = 22 # dark green + + GIT_AHEAD_BG = 240 + GIT_AHEAD_FG = 250 + GIT_BEHIND_BG = 240 + GIT_BEHIND_FG = 250 + GIT_STAGED_BG = 22 + GIT_STAGED_FG = 15 + GIT_NOTSTAGED_BG = 130 + GIT_NOTSTAGED_FG = 15 + GIT_UNTRACKED_BG = 52 + GIT_UNTRACKED_FG = 15 + GIT_CONFLICTED_BG = 9 + GIT_CONFLICTED_FG = 15 + + VIRTUAL_ENV_BG = 35 # a mid-tone green + VIRTUAL_ENV_FG = 00 + +class Color(DefaultColor): + """ + This subclass is required when the user chooses to use 'default' theme. + Because the segments require a 'Color' class for every theme. + """ + pass + + +def add_set_term_title_segment(powerline): + term = os.getenv('TERM') + if not (('xterm' in term) or ('rxvt' in term)): + return + + if powerline.args.shell == 'bash': + set_title = '\\[\\e]0;\\u@\\h: \\w\\a\\]' + elif powerline.args.shell == 'zsh': + set_title = '\033]0;%n@%m: %~\007' + else: + import socket + set_title = '\033]0;%s@%s: %s\007' % (os.getenv('USER'), socket.gethostname().split('.')[0], powerline.cwd or os.getenv('PWD')) + + powerline.append(set_title, None, None, '') + + + +add_set_term_title_segment(powerline) +import os + +def add_virtual_env_segment(powerline): + env = os.getenv('VIRTUAL_ENV') or os.getenv('CONDA_ENV_PATH') + if env is None: + return + + env_name = os.path.basename(env) + bg = Color.VIRTUAL_ENV_BG + fg = Color.VIRTUAL_ENV_FG + powerline.append(' %s ' % env_name, fg, bg) + + +add_virtual_env_segment(powerline) + +def add_username_segment(powerline): + import os + if powerline.args.shell == 'bash': + user_prompt = ' \\u ' + elif powerline.args.shell == 'zsh': + user_prompt = ' %n ' + else: + user_prompt = ' %s ' % os.getenv('USER') + + if os.getenv('USER') == 'root': + bgcolor = Color.USERNAME_ROOT_BG + else: + bgcolor = Color.USERNAME_BG + + powerline.append(user_prompt, Color.USERNAME_FG, bgcolor) + + +add_username_segment(powerline) +import os + +def add_ssh_segment(powerline): + + if os.getenv('SSH_CLIENT'): + powerline.append(' %s ' % powerline.network, Color.SSH_FG, Color.SSH_BG) + + +add_ssh_segment(powerline) +import os + +ELLIPSIS = u'\u2026' + + +def replace_home_dir(cwd): + home = os.getenv('HOME') + if cwd.startswith(home): + return '~' + cwd[len(home):] + return cwd + + +def split_path_into_names(cwd): + names = cwd.split(os.sep) + + if names[0] == '': + names = names[1:] + + if not names[0]: + return ['/'] + + return names + + +def requires_special_home_display(name): + """Returns true if the given directory name matches the home indicator and + the chosen theme should use a special home indicator display.""" + return (name == '~' and Color.HOME_SPECIAL_DISPLAY) + + +def maybe_shorten_name(powerline, name): + """If the user has asked for each directory name to be shortened, will + return the name up to their specified length. Otherwise returns the full + name.""" + if powerline.args.cwd_max_dir_size: + return name[:powerline.args.cwd_max_dir_size] + return name + + +def get_fg_bg(name): + """Returns the foreground and background color to use for the given name. + """ + if requires_special_home_display(name): + return (Color.HOME_FG, Color.HOME_BG,) + return (Color.PATH_FG, Color.PATH_BG,) + + +def add_cwd_segment(powerline): + cwd = powerline.cwd or os.getenv('PWD') + if not py3: + cwd = cwd.decode("utf-8") + cwd = replace_home_dir(cwd) + + if powerline.args.cwd_mode == 'plain': + powerline.append(' %s ' % (cwd,), Color.CWD_FG, Color.PATH_BG) + return + + names = split_path_into_names(cwd) + + max_depth = powerline.args.cwd_max_depth + if max_depth <= 0: + warn("Ignoring --cwd-max-depth argument since it's not greater than 0") + elif len(names) > max_depth: + # https://github.com/milkbikis/powerline-shell/issues/148 + # n_before is the number is the number of directories to put before the + # ellipsis. So if you are at ~/a/b/c/d/e and max depth is 4, it will + # show `~ a ... d e`. + # + # max_depth must be greater than n_before or else you end up repeating + # parts of the path with the way the splicing is written below. + n_before = 2 if max_depth > 2 else max_depth - 1 + names = names[:n_before] + [ELLIPSIS] + names[n_before - max_depth:] + + if (powerline.args.cwd_mode == 'dironly' or powerline.args.cwd_only): + # The user has indicated they only want the current directory to be + # displayed, so chop everything else off + names = names[-1:] + + for i, name in enumerate(names): + fg, bg = get_fg_bg(name) + + separator = powerline.separator_thin + separator_fg = Color.SEPARATOR_FG + is_last_dir = (i == len(names) - 1) + if requires_special_home_display(name) or is_last_dir: + separator = None + separator_fg = None + + powerline.append(' %s ' % maybe_shorten_name(powerline, name), fg, bg, + separator, separator_fg) + + +add_cwd_segment(powerline) +import os + +def add_read_only_segment(powerline): + cwd = powerline.cwd or os.getenv('PWD') + + if not os.access(cwd, os.W_OK): + powerline.append(' %s ' % powerline.lock, Color.READONLY_FG, Color.READONLY_BG) + + +add_read_only_segment(powerline) +import re +import subprocess +import os + +def get_PATH(): + """Normally gets the PATH from the OS. This function exists to enable + easily mocking the PATH in tests. + """ + return os.getenv("PATH") + +def git_subprocess_env(): + return { + # LANG is specified to ensure git always uses a language we are expecting. + # Otherwise we may be unable to parse the output. + "LANG": "C", + + # https://github.com/milkbikis/powerline-shell/pull/126 + "HOME": os.getenv("HOME"), + + # https://github.com/milkbikis/powerline-shell/pull/153 + "PATH": get_PATH(), + } + + +def parse_git_branch_info(status): + info = re.search('^## (?P\S+?)''(\.{3}(?P\S+?)( \[(ahead (?P\d+)(, )?)?(behind (?P\d+))?\])?)?$', status[0]) + return info.groupdict() if info else None + + +def _get_git_detached_branch(): + p = subprocess.Popen(['git', 'describe', '--tags', '--always'], + stdout=subprocess.PIPE, stderr=subprocess.PIPE, + env=git_subprocess_env()) + detached_ref = p.communicate()[0].decode("utf-8").rstrip('\n') + if p.returncode == 0: + branch = u'{} {}'.format(RepoStats.symbols['detached'], detached_ref) + else: + branch = 'Big Bang' + return branch + + +def parse_git_stats(status): + stats = RepoStats() + for statusline in status[1:]: + code = statusline[:2] + if code == '??': + stats.untracked += 1 + elif code in ('DD', 'AU', 'UD', 'UA', 'DU', 'AA', 'UU'): + stats.conflicted += 1 + else: + if code[1] != ' ': + stats.not_staged += 1 + if code[0] != ' ': + stats.staged += 1 + + return stats + + +def add_git_segment(powerline): + try: + p = subprocess.Popen(['git', 'status', '--porcelain', '-b'], + stdout=subprocess.PIPE, stderr=subprocess.PIPE, + env=git_subprocess_env()) + except OSError: + # Popen will throw an OSError if git is not found + return + + pdata = p.communicate() + if p.returncode != 0: + return + + status = pdata[0].decode("utf-8").splitlines() + stats = parse_git_stats(status) + branch_info = parse_git_branch_info(status) + + if branch_info: + stats.ahead = branch_info["ahead"] + stats.behind = branch_info["behind"] + branch = branch_info['local'] + else: + branch = _get_git_detached_branch() + + bg = Color.REPO_CLEAN_BG + fg = Color.REPO_CLEAN_FG + if stats.dirty: + bg = Color.REPO_DIRTY_BG + fg = Color.REPO_DIRTY_FG + + powerline.append(' %s ' % branch, fg, bg) + stats.add_to_powerline(powerline, Color) + + +add_git_segment(powerline) +import os +import subprocess + +def get_hg_status(): + has_modified_files = False + has_untracked_files = False + has_missing_files = False + + p = subprocess.Popen(['hg', 'status'], stdout=subprocess.PIPE) + output = p.communicate()[0].decode("utf-8") + + for line in output.split('\n'): + if line == '': + continue + elif line[0] == '?': + has_untracked_files = True + elif line[0] == '!': + has_missing_files = True + else: + has_modified_files = True + return has_modified_files, has_untracked_files, has_missing_files + +def add_hg_segment(powerline): + branch = os.popen('hg branch 2> /dev/null').read().rstrip() + if len(branch) == 0: + return False + bg = Color.REPO_CLEAN_BG + fg = Color.REPO_CLEAN_FG + has_modified_files, has_untracked_files, has_missing_files = get_hg_status() + if has_modified_files or has_untracked_files or has_missing_files: + bg = Color.REPO_DIRTY_BG + fg = Color.REPO_DIRTY_FG + extra = '' + if has_untracked_files: + extra += '+' + if has_missing_files: + extra += '!' + branch += (' ' + extra if extra != '' else '') + return powerline.append(' %s ' % branch, fg, bg) + + +add_hg_segment(powerline) +import subprocess + + +def _add_svn_segment(powerline): + is_svn = subprocess.Popen(['svn', 'status'], + stdout=subprocess.PIPE, stderr=subprocess.PIPE) + is_svn_output = is_svn.communicate()[1].decode("utf-8").strip() + if len(is_svn_output) != 0: + return + + #"svn status | grep -c "^[ACDIMRX\\!\\~]" + p1 = subprocess.Popen(['svn', 'status'], stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + p2 = subprocess.Popen(['grep', '-c', '^[ACDIMR\\!\\~]'], + stdin=p1.stdout, stdout=subprocess.PIPE) + output = p2.communicate()[0].decode("utf-8").strip() + if len(output) > 0 and int(output) > 0: + changes = output.strip() + powerline.append(' %s ' % changes, Color.SVN_CHANGES_FG, Color.SVN_CHANGES_BG) + + +def add_svn_segment(powerline): + """Wraps _add_svn_segment in exception handling.""" + + # FIXME This function was added when introducing a testing framework, + # during which the 'powerline' object was passed into the + # `add_[segment]_segment` functions instead of being a global variable. At + # that time it was unclear whether the below exceptions could actually be + # thrown. It would be preferable to find out whether they ever will. If so, + # write a comment explaining when. Otherwise remove. + + try: + _add_svn_segment(powerline) + except OSError: + pass + except subprocess.CalledProcessError: + pass + + +add_svn_segment(powerline) +import os +import subprocess + +def get_fossil_status(): + has_modified_files = False + has_untracked_files = False + has_missing_files = False + output = os.popen('fossil changes 2>/dev/null').read().strip() + has_untracked_files = True if os.popen("fossil extras 2>/dev/null").read().strip() else False + has_missing_files = 'MISSING' in output + has_modified_files = 'EDITED' in output + + return has_modified_files, has_untracked_files, has_missing_files + +def _add_fossil_segment(powerline): + subprocess.Popen(['fossil'], stdout=subprocess.PIPE).communicate()[0] + branch = ''.join([i.replace('*','').strip() for i in os.popen("fossil branch 2> /dev/null").read().strip().split("\n") if i.startswith('*')]) + if len(branch) == 0: + return + + bg = Color.REPO_CLEAN_BG + fg = Color.REPO_CLEAN_FG + has_modified_files, has_untracked_files, has_missing_files = get_fossil_status() + if has_modified_files or has_untracked_files or has_missing_files: + bg = Color.REPO_DIRTY_BG + fg = Color.REPO_DIRTY_FG + extra = '' + if has_untracked_files: + extra += '+' + if has_missing_files: + extra += '!' + branch += (' ' + extra if extra != '' else '') + powerline.append(' %s ' % branch, fg, bg) + +def add_fossil_segment(powerline): + """Wraps _add_fossil_segment in exception handling.""" + + # FIXME This function was added when introducing a testing framework, + # during which the 'powerline' object was passed into the + # `add_[segment]_segment` functions instead of being a global variable. At + # that time it was unclear whether the below exceptions could actually be + # thrown. It would be preferable to find out whether they ever will. If so, + # write a comment explaining when. Otherwise remove. + + try: + _add_fossil_segment(powerline) + except OSError: + pass + except subprocess.CalledProcessError: + pass + + +add_fossil_segment(powerline) +import os +import re +import subprocess + +def add_jobs_segment(powerline): + pppid_proc = subprocess.Popen(['ps', '-p', str(os.getppid()), '-oppid='], + stdout=subprocess.PIPE) + pppid = pppid_proc.communicate()[0].decode("utf-8").strip() + + output_proc = subprocess.Popen(['ps', '-a', '-o', 'ppid'], + stdout=subprocess.PIPE) + output = output_proc.communicate()[0].decode("utf-8") + + num_jobs = len(re.findall(str(pppid), output)) - 1 + + if num_jobs > 0: + powerline.append(' %d ' % num_jobs, Color.JOBS_FG, Color.JOBS_BG) + + +add_jobs_segment(powerline) +def add_root_segment(powerline): + root_indicators = { + 'bash': ' \\$ ', + 'zsh': ' %# ', + 'bare': ' $ ', + } + bg = Color.CMD_PASSED_BG + fg = Color.CMD_PASSED_FG + if powerline.args.prev_error != 0: + fg = Color.CMD_FAILED_FG + bg = Color.CMD_FAILED_BG + powerline.append(root_indicators[powerline.args.shell], fg, bg) + + +add_root_segment(powerline) +sys.stdout.write(powerline.draw()) diff --git a/config/powerline-shell/powerline_shell_base.py b/config/powerline-shell/powerline_shell_base.py new file mode 100755 index 00000000..f6f1cdd6 --- /dev/null +++ b/config/powerline-shell/powerline_shell_base.py @@ -0,0 +1,209 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +from __future__ import print_function + +import argparse +import os +import sys + +py3 = sys.version_info.major == 3 + + +def warn(msg): + print('[powerline-bash] ', msg) + + +if py3: + def unicode(x): + return x + + +class Powerline: + symbols = { + 'compatible': { + 'lock': 'RO', + 'network': 'SSH', + 'separator': u'\u25B6', + 'separator_thin': u'\u276F' + }, + 'patched': { + 'lock': u'\uE0A2', + 'network': u'\uE0A2', + 'separator': u'\uE0B0', + 'separator_thin': u'\uE0B1' + }, + 'flat': { + 'lock': '', + 'network': '', + 'separator': '', + 'separator_thin': '' + }, + } + + color_templates = { + 'bash': '\\[\\e%s\\]', + 'zsh': '%%{%s%%}', + 'bare': '%s', + } + + def __init__(self, args, cwd): + self.args = args + self.cwd = cwd + mode, shell = args.mode, args.shell + self.color_template = self.color_templates[shell] + self.reset = self.color_template % '[0m' + self.lock = Powerline.symbols[mode]['lock'] + self.network = Powerline.symbols[mode]['network'] + self.separator = Powerline.symbols[mode]['separator'] + self.separator_thin = Powerline.symbols[mode]['separator_thin'] + self.segments = [] + + def color(self, prefix, code): + if code is None: + return '' + else: + return self.color_template % ('[%s;5;%sm' % (prefix, code)) + + def fgcolor(self, code): + return self.color('38', code) + + def bgcolor(self, code): + return self.color('48', code) + + def append(self, content, fg, bg, separator=None, separator_fg=None): + self.segments.append((content, fg, bg, + separator if separator is not None else self.separator, + separator_fg if separator_fg is not None else bg)) + + def draw(self): + text = (''.join(self.draw_segment(i) for i in range(len(self.segments))) + + self.reset) + ' ' + if py3: + return text + else: + return text.encode('utf-8') + + def draw_segment(self, idx): + segment = self.segments[idx] + next_segment = self.segments[idx + 1] if idx < len(self.segments)-1 else None + + return ''.join(( + self.fgcolor(segment[1]), + self.bgcolor(segment[2]), + segment[0], + self.bgcolor(next_segment[2]) if next_segment else self.reset, + self.fgcolor(segment[4]), + segment[3])) + + +class RepoStats: + symbols = { + 'detached': u'\u2693', + 'ahead': u'\u2B06', + 'behind': u'\u2B07', + 'staged': u'\u2714', + 'not_staged': u'\u270E', + 'untracked': u'\u003F', + 'conflicted': u'\u273C' + } + + def __init__(self): + self.ahead = 0 + self.behind = 0 + self.untracked = 0 + self.not_staged = 0 + self.staged = 0 + self.conflicted = 0 + + @property + def dirty(self): + qualifiers = [ + self.untracked, + self.not_staged, + self.staged, + self.conflicted, + ] + return sum(qualifiers) > 0 + + def __getitem__(self, _key): + return getattr(self, _key) + + def n_or_empty(self, _key): + """Given a string name of one of the properties of this class, returns + the value of the property as a string when the value is greater than + 1. When it is not greater than one, returns an empty string. + + As an example, if you want to show an icon for untracked files, but you + only want a number to appear next to the icon when there are more than + one untracked files, you can do: + + segment = repo_stats.n_or_empty("untracked") + icon_string + """ + return unicode(self[_key]) if int(self[_key]) > 1 else u'' + + def add_to_powerline(self, powerline, color): + def add(_key, fg, bg): + if self[_key]: + s = u" {}{} ".format(self.n_or_empty(_key), self.symbols[_key]) + powerline.append(s, fg, bg) + add('ahead', color.GIT_AHEAD_FG, color.GIT_AHEAD_BG) + add('behind', color.GIT_BEHIND_FG, color.GIT_BEHIND_BG) + add('staged', color.GIT_STAGED_FG, color.GIT_STAGED_BG) + add('not_staged', color.GIT_NOTSTAGED_FG, color.GIT_NOTSTAGED_BG) + add('untracked', color.GIT_UNTRACKED_FG, color.GIT_UNTRACKED_BG) + add('conflicted', color.GIT_CONFLICTED_FG, color.GIT_CONFLICTED_BG) + + +def get_valid_cwd(): + """ We check if the current working directory is valid or not. Typically + happens when you checkout a different branch on git that doesn't have + this directory. + We return the original cwd because the shell still considers that to be + the working directory, so returning our guess will confuse people + """ + # Prefer the PWD environment variable. Python's os.getcwd function follows + # symbolic links, which is undesirable. But if PWD is not set then fall + # back to this func + try: + cwd = os.getenv('PWD') or os.getcwd() + except: + warn("Your current directory is invalid. If you open a ticket at " + + "https://github.com/milkbikis/powerline-shell/issues/new " + + "we would love to help fix the issue.") + sys.stdout.write("> ") + sys.exit(1) + + parts = cwd.split(os.sep) + up = cwd + while parts and not os.path.exists(up): + parts.pop() + up = os.sep.join(parts) + if cwd != up: + warn("Your current directory is invalid. Lowest valid directory: " + + up) + return cwd + + +if __name__ == "__main__": + arg_parser = argparse.ArgumentParser() + arg_parser.add_argument('--cwd-mode', action='store', + help='How to display the current directory', default='fancy', + choices=['fancy', 'plain', 'dironly']) + arg_parser.add_argument('--cwd-only', action='store_true', + help='Deprecated. Use --cwd-mode=dironly') + arg_parser.add_argument('--cwd-max-depth', action='store', type=int, + default=5, help='Maximum number of directories to show in path') + arg_parser.add_argument('--cwd-max-dir-size', action='store', type=int, + help='Maximum number of letters displayed for each directory in the path') + arg_parser.add_argument('--colorize-hostname', action='store_true', + help='Colorize the hostname based on a hash of itself.') + arg_parser.add_argument('--mode', action='store', default='patched', + help='The characters used to make separators between segments', + choices=['patched', 'compatible', 'flat']) + arg_parser.add_argument('--shell', action='store', default='bash', + help='Set this to your shell type', choices=['bash', 'zsh', 'bare']) + arg_parser.add_argument('prev_error', nargs='?', type=int, default=0, + help='Error code returned by the last command') + args = arg_parser.parse_args() + + powerline = Powerline(args, get_valid_cwd()) diff --git a/config/ranger/.gitignore b/config/ranger/.gitignore new file mode 100644 index 00000000..3cc04439 --- /dev/null +++ b/config/ranger/.gitignore @@ -0,0 +1,3 @@ +history +bookmarks +tagged diff --git a/config/ranger/commands.py b/config/ranger/commands.py new file mode 100644 index 00000000..1386e84e --- /dev/null +++ b/config/ranger/commands.py @@ -0,0 +1,61 @@ +# This is a sample commands.py. You can add your own commands here. +# +# Please refer to commands_full.py for all the default commands and a complete +# documentation. Do NOT add them all here, or you may end up with defunct +# commands when upgrading ranger. + +# You always need to import ranger.api.commands here to get the Command class: +from ranger.api.commands import * + +# A simple command for demonstration purposes follows. +# ----------------------------------------------------------------------------- + +# You can import any python module as needed. +import os + +# Any class that is a subclass of "Command" will be integrated into ranger as a +# command. Try typing ":my_edit" in ranger! + + +class my_edit(Command): + # The so-called doc-string of the class will be visible in the built-in + # help that is accessible by typing "?c" inside ranger. + """:my_edit + + A sample command for demonstration purposes that opens a file in an editor. + """ + + # The execute method is called when you run this command in ranger. + def execute(self): + # self.arg(1) is the first (space-separated) argument to the function. + # This way you can write ":my_edit somefilename". + if self.arg(1): + # self.rest(1) contains self.arg(1) and everything that follows + target_filename = self.rest(1) + else: + # self.fm is a ranger.core.filemanager.FileManager object and gives + # you access to internals of ranger. + # self.fm.thisfile is a ranger.container.file.File object and is a + # reference to the currently selected file. + target_filename = self.fm.thisfile.path + + # This is a generic function to print text in ranger. + self.fm.notify("Let's edit the file " + target_filename + "!") + + # Using bad=True in fm.notify allows you to print error messages: + if not os.path.exists(target_filename): + self.fm.notify("The given file does not exist!", bad=True) + return + + # This executes a function from ranger.core.acitons, a module with a + # variety of subroutines that can help you construct commands. + # Check out the source, or run "pydoc ranger.core.actions" for a list. + self.fm.edit_file(target_filename) + + # The tab method is called when you press tab, and should return a list of + # suggestions that the user will tab through. + # tabnum is 1 for and -1 for by default + def tab(self, tabnum): + # This is a generic tab-completion function that iterates through the + # content of the current directory. + return self._tab_directory_content() diff --git a/config/ranger/commands_full.py b/config/ranger/commands_full.py new file mode 100644 index 00000000..a384f427 --- /dev/null +++ b/config/ranger/commands_full.py @@ -0,0 +1,1486 @@ +# -*- coding: utf-8 -*- +# This file is part of ranger, the console file manager. +# This configuration file is licensed under the same terms as ranger. +# =================================================================== +# +# NOTE: If you copied this file to ~/.config/ranger/commands_full.py, +# then it will NOT be loaded by ranger, and only serve as a reference. +# +# =================================================================== +# This file contains ranger's commands. +# It's all in python; lines beginning with # are comments. +# +# Note that additional commands are automatically generated from the methods +# of the class ranger.core.actions.Actions. +# +# You can customize commands in the file ~/.config/ranger/commands.py. +# It has the same syntax as this file. In fact, you can just copy this +# file there with `ranger --copy-config=commands' and make your modifications. +# But make sure you update your configs when you update ranger. +# +# =================================================================== +# Every class defined here which is a subclass of `Command' will be used as a +# command in ranger. Several methods are defined to interface with ranger: +# execute(): called when the command is executed. +# cancel(): called when closing the console. +# tab(tabnum): called when is pressed. +# quick(): called after each keypress. +# +# tab() argument tabnum is 1 for and -1 for by default +# +# The return values for tab() can be either: +# None: There is no tab completion +# A string: Change the console to this string +# A list/tuple/generator: cycle through every item in it +# +# The return value for quick() can be: +# False: Nothing happens +# True: Execute the command afterwards +# +# The return value for execute() and cancel() doesn't matter. +# +# =================================================================== +# Commands have certain attributes and methods that facilitate parsing of +# the arguments: +# +# self.line: The whole line that was written in the console. +# self.args: A list of all (space-separated) arguments to the command. +# self.quantifier: If this command was mapped to the key "X" and +# the user pressed 6X, self.quantifier will be 6. +# self.arg(n): The n-th argument, or an empty string if it doesn't exist. +# self.rest(n): The n-th argument plus everything that followed. For example, +# if the command was "search foo bar a b c", rest(2) will be "bar a b c" +# self.start(n): Anything before the n-th argument. For example, if the +# command was "search foo bar a b c", start(2) will be "search foo" +# +# =================================================================== +# And this is a little reference for common ranger functions and objects: +# +# self.fm: A reference to the "fm" object which contains most information +# about ranger. +# self.fm.notify(string): Print the given string on the screen. +# self.fm.notify(string, bad=True): Print the given string in RED. +# self.fm.reload_cwd(): Reload the current working directory. +# self.fm.thisdir: The current working directory. (A File object.) +# self.fm.thisfile: The current file. (A File object too.) +# self.fm.thistab.get_selection(): A list of all selected files. +# self.fm.execute_console(string): Execute the string as a ranger command. +# self.fm.open_console(string): Open the console with the given string +# already typed in for you. +# self.fm.move(direction): Moves the cursor in the given direction, which +# can be something like down=3, up=5, right=1, left=1, to=6, ... +# +# File objects (for example self.fm.thisfile) have these useful attributes and +# methods: +# +# cf.path: The path to the file. +# cf.basename: The base name only. +# cf.load_content(): Force a loading of the directories content (which +# obviously works with directories only) +# cf.is_directory: True/False depending on whether it's a directory. +# +# For advanced commands it is unavoidable to dive a bit into the source code +# of ranger. +# =================================================================== + +from ranger.api.commands import * + + +class alias(Command): + """:alias + + Copies the oldcommand as newcommand. + """ + + context = 'browser' + resolve_macros = False + + def execute(self): + if not self.arg(1) or not self.arg(2): + self.fm.notify('Syntax: alias ', bad=True) + else: + self.fm.commands.alias(self.arg(1), self.rest(2)) + + +class echo(Command): + """:echo + + Display the text in the statusbar. + """ + def execute(self): + self.fm.notify(self.rest(1)) + + +class cd(Command): + """:cd [-r] + + The cd command changes the directory. + The command 'cd -' is equivalent to typing ``. + Using the option "-r" will get you to the real path. + """ + + def execute(self): + import os.path + if self.arg(1) == '-r': + self.shift() + destination = os.path.realpath(self.rest(1)) + if os.path.isfile(destination): + self.fm.select_file(destination) + return + else: + destination = self.rest(1) + + if not destination: + destination = '~' + + if destination == '-': + self.fm.enter_bookmark('`') + else: + self.fm.cd(destination) + + def tab(self, tabnum): + import os + from os.path import dirname, basename, expanduser, join + + cwd = self.fm.thisdir.path + rel_dest = self.rest(1) + + bookmarks = [v.path for v in self.fm.bookmarks.dct.values() + if rel_dest in v.path] + + # expand the tilde into the user directory + if rel_dest.startswith('~'): + rel_dest = expanduser(rel_dest) + + # define some shortcuts + abs_dest = join(cwd, rel_dest) + abs_dirname = dirname(abs_dest) + rel_basename = basename(rel_dest) + rel_dirname = dirname(rel_dest) + + try: + # are we at the end of a directory? + if rel_dest.endswith('/') or rel_dest == '': + _, dirnames, _ = next(os.walk(abs_dest)) + + # are we in the middle of the filename? + else: + _, dirnames, _ = next(os.walk(abs_dirname)) + dirnames = [dn for dn in dirnames + if dn.startswith(rel_basename)] + except (OSError, StopIteration): + # os.walk found nothing + pass + else: + dirnames.sort() + if self.fm.settings.cd_bookmarks: + dirnames = bookmarks + dirnames + + # no results, return None + if len(dirnames) == 0: + return + + # one result. since it must be a directory, append a slash. + if len(dirnames) == 1: + return self.start(1) + join(rel_dirname, dirnames[0]) + '/' + + # more than one result. append no slash, so the user can + # manually type in the slash to advance into that directory + return (self.start(1) + join(rel_dirname, dirname) for dirname in dirnames) + + +class chain(Command): + """:chain ; ; ... + + Calls multiple commands at once, separated by semicolons. + """ + def execute(self): + for command in [s.strip() for s in self.rest(1).split(";")]: + self.fm.execute_console(command) + + +class shell(Command): + escape_macros_for_shell = True + + def execute(self): + if self.arg(1) and self.arg(1)[0] == '-': + flags = self.arg(1)[1:] + command = self.rest(2) + else: + flags = '' + command = self.rest(1) + + if command: + self.fm.execute_command(command, flags=flags) + + def tab(self, tabnum): + from ranger.ext.get_executables import get_executables + if self.arg(1) and self.arg(1)[0] == '-': + command = self.rest(2) + else: + command = self.rest(1) + start = self.line[0:len(self.line) - len(command)] + + try: + position_of_last_space = command.rindex(" ") + except ValueError: + return (start + program + ' ' for program + in get_executables() if program.startswith(command)) + if position_of_last_space == len(command) - 1: + selection = self.fm.thistab.get_selection() + if len(selection) == 1: + return self.line + selection[0].shell_escaped_basename + ' ' + else: + return self.line + '%s ' + else: + before_word, start_of_word = self.line.rsplit(' ', 1) + return (before_word + ' ' + file.shell_escaped_basename + for file in self.fm.thisdir.files or [] + if file.shell_escaped_basename.startswith(start_of_word)) + + +class open_with(Command): + def execute(self): + app, flags, mode = self._get_app_flags_mode(self.rest(1)) + self.fm.execute_file( + files=[f for f in self.fm.thistab.get_selection()], + app=app, + flags=flags, + mode=mode) + + def tab(self, tabnum): + return self._tab_through_executables() + + def _get_app_flags_mode(self, string): + """Extracts the application, flags and mode from a string. + + examples: + "mplayer f 1" => ("mplayer", "f", 1) + "aunpack 4" => ("aunpack", "", 4) + "p" => ("", "p", 0) + "" => None + """ + + app = '' + flags = '' + mode = 0 + split = string.split() + + if len(split) == 0: + pass + + elif len(split) == 1: + part = split[0] + if self._is_app(part): + app = part + elif self._is_flags(part): + flags = part + elif self._is_mode(part): + mode = part + + elif len(split) == 2: + part0 = split[0] + part1 = split[1] + + if self._is_app(part0): + app = part0 + if self._is_flags(part1): + flags = part1 + elif self._is_mode(part1): + mode = part1 + elif self._is_flags(part0): + flags = part0 + if self._is_mode(part1): + mode = part1 + elif self._is_mode(part0): + mode = part0 + if self._is_flags(part1): + flags = part1 + + elif len(split) >= 3: + part0 = split[0] + part1 = split[1] + part2 = split[2] + + if self._is_app(part0): + app = part0 + if self._is_flags(part1): + flags = part1 + if self._is_mode(part2): + mode = part2 + elif self._is_mode(part1): + mode = part1 + if self._is_flags(part2): + flags = part2 + elif self._is_flags(part0): + flags = part0 + if self._is_mode(part1): + mode = part1 + elif self._is_mode(part0): + mode = part0 + if self._is_flags(part1): + flags = part1 + + return app, flags, int(mode) + + def _is_app(self, arg): + return not self._is_flags(arg) and not arg.isdigit() + + def _is_flags(self, arg): + from ranger.core.runner import ALLOWED_FLAGS + return all(x in ALLOWED_FLAGS for x in arg) + + def _is_mode(self, arg): + return all(x in '0123456789' for x in arg) + + +class set_(Command): + """:set