Initial commit - transitioning from dotfiles
This commit is contained in:
commit
064184881a
27
.bashrc-global
Normal file
27
.bashrc-global
Normal file
@ -0,0 +1,27 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# ~/.bashrc
|
||||
#
|
||||
|
||||
# If not running interactively, don't do anything
|
||||
[[ $- != *i* ]] && return
|
||||
|
||||
# Sometimes you can't change your shell. Sometimes you have to implement hacky
|
||||
# workarounds
|
||||
if [ -f ~/.bash-to-zsh ]; then
|
||||
export SHELL=$(which zsh)
|
||||
exec zsh
|
||||
fi
|
||||
|
||||
# Source /etc/profile
|
||||
source /etc/profile
|
||||
|
||||
# Source .profile
|
||||
if [ -f ~/.profile ]; then
|
||||
source ~/.profile
|
||||
fi
|
||||
|
||||
# Source the bash-specific rc
|
||||
if [ -f ~/.bin/bashrc.sh ]; then
|
||||
source ~/.bin/bashrc.sh
|
||||
fi
|
2
.directory
Normal file
2
.directory
Normal file
@ -0,0 +1,2 @@
|
||||
[Desktop Entry]
|
||||
Icon=folder-script
|
84
bashrc.sh
Executable file
84
bashrc.sh
Executable file
@ -0,0 +1,84 @@
|
||||
#!/bin/sh
|
||||
|
||||
PROMPT_COMMAND="__prompt_command; $PROMPT_COMMAND"
|
||||
|
||||
__prompt_command() {
|
||||
PS1="$(powerline-shell.py --cwd-mode fancy --cwd-max-depth 3 --cwd-max-dir-size 16 --mode patched $? 2> /dev/null)"
|
||||
}
|
||||
|
||||
# Command to be called every time PS1 is composed
|
||||
# PROMPT_COMMAND makes this process very easy, it turns out
|
||||
__prompt_command_old() {
|
||||
local EXIT="$?"
|
||||
PS1="\[\e[m\]"
|
||||
|
||||
# Determine which separator we should use
|
||||
# Namely, don't use the Powerline separator if we know we're in a tty
|
||||
|
||||
local SEPARATOR=""
|
||||
if [[ "$(tty)" == *"tty"* ]]; then
|
||||
SEPARATOR=" "
|
||||
else
|
||||
SEPARATOR=""
|
||||
fi
|
||||
|
||||
# Generate the name color based on remote connection and root statuses
|
||||
if [ "$(id -u)" == "0" ]; then
|
||||
# We're root, gimme the flashy red prompt
|
||||
PS1+="\[\e[37;41m\]"
|
||||
else
|
||||
# Generate a background based on remote status
|
||||
if [ -z "${SSH_TTY+x}" ]; then
|
||||
#Light Grey on Light Blue (BG)
|
||||
PS1+="\[\e[104m\]"
|
||||
else
|
||||
#Light Grey on Magenta (BG)
|
||||
PS1+="\[\e[45m\]"
|
||||
fi
|
||||
# Generate a foreground based on whether or not we're in sudoers or wheel or whatever
|
||||
# Unfortunately, there's no way for us to *really* check if we can sudo or not
|
||||
local admgroups=( "wheel" "root" "sudo" )
|
||||
PS1+="\[\e[30m\]"
|
||||
for usergroup in $(groups); do
|
||||
for admgroup in $admgroups; do
|
||||
if [ "$usergroup" == "$admgroup" ]; then
|
||||
PS1+="\[\e[39m\]"
|
||||
fi
|
||||
done
|
||||
done
|
||||
#if [[ $USERGROUPS == *"wheel"* ]] || [[ $USERGROUPS == *"root"* ]] || [[ $USERGROUPS == *"sudo"* ]]; #then
|
||||
# PS1+="\[\e[37m\]"
|
||||
#else
|
||||
# PS1+="\[\e[30m\]"
|
||||
#fi
|
||||
fi
|
||||
|
||||
# Generate a name based on the remote connection and username
|
||||
PS1+=" "
|
||||
if [ -z "${SSH_TTY+x}" ]; then
|
||||
PS1+="$USER"
|
||||
else
|
||||
if [ "$USER" != "salt" ]; then
|
||||
PS1+="$USER@"
|
||||
fi
|
||||
PS1+="$HOSTNAME"
|
||||
fi
|
||||
|
||||
# Transition to PWD
|
||||
PS1+=" \[\e[7;90m\]$SEPARATOR\[\e[m\e[100m\]"
|
||||
|
||||
# Generate the PWD
|
||||
PS1+="${PWD/#$HOME/'~'}"
|
||||
|
||||
# Append a neat little arrow suffix
|
||||
if [ $EXIT == 0 ]; then
|
||||
#32: Green
|
||||
PS1+="\[\e[7;32m\]$SEPARATOR\[\e[m\e[32m\]$SEPARATOR"
|
||||
else
|
||||
#31: Red
|
||||
PS1+="\[\e[7;31m\]$SEPARATOR\[\e[0;39;41m\]$EXIT\[\e[m\e[31m\]$SEPARATOR"
|
||||
fi
|
||||
|
||||
# Cleanup
|
||||
PS1+="\[\e[m\] "
|
||||
}
|
138
bashrc.sh.bak
Executable file
138
bashrc.sh.bak
Executable file
@ -0,0 +1,138 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Setting up defaults just to be on the safe side
|
||||
PROMPT_COMMAND="__prompt_command; $PROMPT_COMMAND"
|
||||
|
||||
__prompt_command() {
|
||||
PS1="$(powerline-shell.py --cwd-mode fancy --cwd-max-depth 3 --cwd-max-dir-size 16 --mode patched $? 2> /dev/null)"
|
||||
}
|
||||
|
||||
# Command to be called every time PS1 is composed
|
||||
# PROMPT_COMMAND makes this process very easy, it turns out
|
||||
__prompt_command_old() {
|
||||
local EXIT="$?"
|
||||
PS1="\[\e[m\]"
|
||||
|
||||
# Determine which separator we should use
|
||||
# Namely, don't use the Powerline separator if we know we're in a tty
|
||||
|
||||
local SEPARATOR=""
|
||||
if [[ "$(tty)" == *"tty"* ]]; then
|
||||
SEPARATOR=" "
|
||||
else
|
||||
SEPARATOR=""
|
||||
fi
|
||||
|
||||
# Generate the name color based on remote connection and root statuses
|
||||
if [ "$(id -u)" == "0" ]; then
|
||||
# We're root, gimme the flashy red prompt
|
||||
PS1+="\[\e[37;41m\]"
|
||||
else
|
||||
# Generate a background based on remote status
|
||||
if [ -z ${SSH_TTY+x} ]; then
|
||||
#Light Grey on Light Blue (BG)
|
||||
PS1+="\[\e[104m\]"
|
||||
else
|
||||
#Light Grey on Magenta (BG)
|
||||
PS1+="\[\e[45m\]"
|
||||
fi
|
||||
# Generate a foreground based on whether or not we're in sudoers or wheel or whatever
|
||||
# Unfortunately, there's no way for us to *really* check if we can sudo or not
|
||||
local usergroups=($(groups))
|
||||
local admgroups=( "wheel" "root" "sudo" )
|
||||
PS1+="\[\e[30m\]"
|
||||
for usergroup in $usergroups; do
|
||||
for admgroup in $admgroups; do
|
||||
if [ $usergroup == $admgroup ]; then
|
||||
PS1+="\[\e[39m\]"
|
||||
fi
|
||||
done
|
||||
done
|
||||
#if [[ $USERGROUPS == *"wheel"* ]] || [[ $USERGROUPS == *"root"* ]] || [[ $USERGROUPS == *"sudo"* ]]; #then
|
||||
# PS1+="\[\e[37m\]"
|
||||
#else
|
||||
# PS1+="\[\e[30m\]"
|
||||
#fi
|
||||
fi
|
||||
|
||||
# Generate a name based on the remote connection and username
|
||||
PS1+=" "
|
||||
if [ -z ${SSH_TTY+x} ]; then
|
||||
PS1+="$USER"
|
||||
else
|
||||
if [ "$USER" != "salt" ]; then
|
||||
PS1+="$USER@"
|
||||
fi
|
||||
PS1+="$HOSTNAME"
|
||||
fi
|
||||
|
||||
# Transition to PWD
|
||||
PS1+=" \[\e[7;90m\]$SEPARATOR\[\e[m\e[100m\]"
|
||||
|
||||
# Generate the PWD
|
||||
PS1+="${PWD/#$HOME/'~'}"
|
||||
|
||||
# Append a neat little arrow suffix
|
||||
if [ $EXIT == 0 ]; then
|
||||
#32: Green
|
||||
PS1+="\[\e[7;32m\]$SEPARATOR\[\e[m\e[32m\]$SEPARATOR"
|
||||
else
|
||||
#31: Red
|
||||
PS1+="\[\e[7;31m\]$SEPARATOR\[\e[0;39;41m\]$EXIT\[\e[m\e[31m\]$SEPARATOR"
|
||||
fi
|
||||
|
||||
# Cleanup
|
||||
PS1+="\[\e[m\] "
|
||||
}
|
||||
|
||||
# Common miscellaneous aliases are all defined here for convenience
|
||||
__define_aliases() {
|
||||
|
||||
# Common Aliases
|
||||
|
||||
alias cp='cp -i'
|
||||
alias dd=dcfldd
|
||||
alias ls='ls --color=auto'
|
||||
alias ll='ls -alF'
|
||||
alias la='ls -a --color=auto'
|
||||
alias l='ls -CF'
|
||||
alias waitwhat='echo $?'
|
||||
|
||||
# Simple history thing
|
||||
|
||||
alias fug='sudo $(history -p !!)'
|
||||
}
|
||||
|
||||
# Functions to be exported to the shell
|
||||
# Mostly just helper wrappers and such
|
||||
__define_functions() {
|
||||
# Arch-only helper functions
|
||||
if [[ "$(ls /etc/*release)" == *"arch"* ]]; then
|
||||
pac_helper="pacaur"
|
||||
local helpers=( "pacaur" "yaourt" "pacman" )
|
||||
for helper in $helpers; do
|
||||
if [ $(pacman -Qq $helper > /dev/null) ]; then
|
||||
pac_helper="$helper"
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
alias pac="$pac_helper"
|
||||
alias pacq="$pac_helper -Qs"
|
||||
alias pacqi="$pac_helper -Qi"
|
||||
alias pacs="$pac_helper -S"
|
||||
alias pacss="$pac_helper -Ss"
|
||||
alias pacsu="$pac_helper -Syu"
|
||||
alias pacsyu="$pac_helper -Syyu"
|
||||
alias pacsr="$pac_helper -Rsnu"
|
||||
fi
|
||||
}
|
||||
|
||||
# Call functions that need to be called
|
||||
__define_aliases
|
||||
__define_functions
|
||||
|
||||
EDITOR=$(which vim)
|
||||
PATH=$PATH:~/.bin
|
||||
export EDITOR
|
||||
export PATH
|
6
bootstrap/replicate.sh
Executable file
6
bootstrap/replicate.sh
Executable file
@ -0,0 +1,6 @@
|
||||
#!/usr/bin/env bash
|
||||
tempfolder="/tmp/dots$(uuidgen)"
|
||||
git clone --recursive --separate-git-dir="$HOME/.dotfiles" https://github.com/rehashedsalt/home.git $tempfolder
|
||||
rsync -rvl --exclude ".git" $tempfolder/ $HOME/
|
||||
rm -r $tempfolder
|
||||
git submodule update --init --recursive --git-dir="$HOME/.dotfiles" --work-tree="$HOME" $HOME/
|
2
layout/tungsten.sh
Executable file
2
layout/tungsten.sh
Executable file
@ -0,0 +1,2 @@
|
||||
#!/bin/sh
|
||||
xrandr --output HDMI-0 --mode 1920x1080 --pos 0x360 --rotate normal --output DisplayPort-0 --primary --mode 2560x1440 --rate 143.86 --pos 1920x0 --rotate normal
|
39
mklatex
Executable file
39
mklatex
Executable file
@ -0,0 +1,39 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Copyright (c) 2017 rehashedsalt/vintagesalt
|
||||
#
|
||||
# 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.
|
||||
|
||||
if [ -z "$@" ]; then
|
||||
printf "mklatex: no files specified\n"
|
||||
exit 1
|
||||
fi
|
||||
for sourcefile in "$@"; do
|
||||
if [ ! -f "$sourcefile" ]; then
|
||||
printf "mklatex: file not found: $sourcefile\n"
|
||||
else
|
||||
pdflatex $sourcefile
|
||||
fi
|
||||
done
|
||||
if [ "$(which llpp)" ]; then
|
||||
killall -SIGHUP llpp
|
||||
fi
|
||||
if [ "$(which mupdf)" ]; then
|
||||
killall -SIGHUP mupdf
|
||||
fi
|
6
mpc/mpc-i3-consume
Executable file
6
mpc/mpc-i3-consume
Executable file
@ -0,0 +1,6 @@
|
||||
#!/bin/bash
|
||||
if [[ "$(mpc consume)" == *"consume: on"* ]]; then
|
||||
notify-send -a "Mopidy" -u low -t 1 "Consume On" "Songs will be removed from the playlist after completion"
|
||||
else
|
||||
notify-send -a "Mopidy" -u low -t 1 "Consume Off" "Songs will remain in the playlist after completion"
|
||||
fi
|
17
mpc/mpc-i3-playlists
Executable file
17
mpc/mpc-i3-playlists
Executable file
@ -0,0 +1,17 @@
|
||||
#!/bin/bash
|
||||
MESSAGE='-mesg Append:'
|
||||
if [ "$1" = "--clear" ]; then
|
||||
MESSAGE='-mesg Replace:'
|
||||
fi
|
||||
PLAYLIST="$(mpc lsplaylists | rofi -lines 10 -dmenu -p 'Play MPD Playlist: ' $MESSAGE)"
|
||||
if [ "$PLAYLIST" = "" ]; then
|
||||
exit
|
||||
fi
|
||||
if [ "$1" = "--clear" ]; then
|
||||
mpc clear
|
||||
fi
|
||||
mpc load $PLAYLIST
|
||||
if [[ "$(mpc)" != *"playing"* ]]; then
|
||||
mpc play
|
||||
fi
|
||||
notify-send -u low -t 5 -a 'Mopidy' "$PLAYLIST" "Beginning playback of playlist $PLAYLIST"
|
6
mpc/mpc-i3-repeat
Executable file
6
mpc/mpc-i3-repeat
Executable file
@ -0,0 +1,6 @@
|
||||
#!/bin/bash
|
||||
if [[ "$(mpc repeat)" == *"repeat: on"* ]]; then
|
||||
notify-send -a "Mopidy" -u low -t 1 "Repeat On" "The playlist will be repeated after it is completed"
|
||||
else
|
||||
notify-send -a "Mopidy" -u low -t 1 "Repeat Off" "Playback will stop at the end of the playlist"
|
||||
fi
|
6
mpc/mpc-i3-shuffle
Executable file
6
mpc/mpc-i3-shuffle
Executable file
@ -0,0 +1,6 @@
|
||||
#!/bin/bash
|
||||
if [[ "$(mpc random)" == *"random: on"* ]]; then
|
||||
notify-send -a "Mopidy" -u low -t 1 "Shuffle On" "Songs will be played in random order"
|
||||
else
|
||||
notify-send -a "Mopidy" -u low -t 1 "Shuffle Off" "Songs will be played sequentially"
|
||||
fi
|
112
mpv-xwinwrap
Executable file
112
mpv-xwinwrap
Executable file
@ -0,0 +1,112 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Copyright (c) 2017 rehashedsalt/vintagesalt
|
||||
#
|
||||
# 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.
|
||||
|
||||
if [ "$XDG_DATA_HOME" = "" ]; then
|
||||
cachefile="$HOME/.local/share/mpv-wrapcache"
|
||||
else
|
||||
cachefile="$XDG_DATA_HOME/mpv-wrapcache"
|
||||
fi
|
||||
|
||||
if ! [ -f "$cachefile" ]; then
|
||||
touch $cachefile
|
||||
fi
|
||||
|
||||
cachecontent="$(cat $cachefile)"
|
||||
|
||||
function video-play {
|
||||
pkill -x xwinwrap
|
||||
#xwinwrap -g 1920x1048+0+0 -ni -b -nf -o 0.5 -ov -- urxvt -bg rgba:2828/2828/2828/FFFF -embed WID -e cava
|
||||
xwinwrap -ni -fs -b -nf -ov -- mpv -wid WID --title="Desktop Video" --loop-playlist=inf $1
|
||||
return 0
|
||||
}
|
||||
|
||||
function video-validate {
|
||||
if [[ "$(curl -Is $1 | head -1)" = *"200"* ]] && [[ "$1" = *"youtu"* ]]; then
|
||||
return 0
|
||||
fi
|
||||
return 1
|
||||
}
|
||||
|
||||
function cache-add {
|
||||
if [[ "$cachecontent" == *"$1"* ]]; then
|
||||
return 1
|
||||
fi
|
||||
name="$(youtube-dl -e $1)"
|
||||
printf "$name\n$1\n" >> $cachefile
|
||||
return 0
|
||||
}
|
||||
|
||||
function cache-populate {
|
||||
names="$(awk -F'\n' 'BEGIN{RS="\n\n"} {for (i=1;i<=NF;i+=2) print $i}' $cachefile)"
|
||||
printf "$names"
|
||||
return 0
|
||||
}
|
||||
|
||||
function cache-lookup-by-name {
|
||||
url="$(awk -v URL="$1" -F'\n' 'BEGIN{RS="\n\n"} {for (i=1;i<=NF;i++) if (index($i, URL)) print $(i+1)}' $cachefile)"
|
||||
if [ "$url" = "" ]; then
|
||||
return 1
|
||||
fi
|
||||
printf "$url\n"
|
||||
return 0
|
||||
}
|
||||
|
||||
function input-get {
|
||||
cache-populate | rofi -dmenu -p 'Embed video: '
|
||||
return 0
|
||||
}
|
||||
|
||||
function soft-notify {
|
||||
notify-send -u low -t 3000 -a 'mpv-xwinwrap' "$1" "$2"
|
||||
return 0
|
||||
}
|
||||
|
||||
function hard-notify {
|
||||
notify-send -u normal -t 10000 -a 'mpv-xwinwrap' "$1" "$2"
|
||||
return 0
|
||||
}
|
||||
|
||||
input="$(input-get | tr -d '\n')"
|
||||
if [ "$input" = "" ]; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
printf "Input: $input\n"
|
||||
|
||||
if cache-lookup-by-name "$input"; then
|
||||
printf "Lookup successful: \n"
|
||||
input="$(cache-lookup-by-name "$input")"
|
||||
printf "\n"
|
||||
fi
|
||||
|
||||
if ! video-validate $input; then
|
||||
hard-notify "Unable to Find Video" "Please verify that the URL is a valid YouTube address and try again."
|
||||
printf "Not a valid stream: $input\n"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
soft-notify "Found Video" "Video $1 has been found and is buffering. It will be embedded in the desktop shortly."
|
||||
|
||||
cache-add $input
|
||||
video-play $input
|
||||
|
||||
exit 0
|
650
powerline-shell.py
Executable file
650
powerline-shell.py
Executable file
@ -0,0 +1,650 @@
|
||||
#!/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 ''
|
||||
elif code == Color.RESET:
|
||||
return self.reset
|
||||
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'\u2753',
|
||||
'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.
|
||||
"""
|
||||
# RESET is not a real color code. It is used as in indicator
|
||||
# within the code that any foreground / background color should
|
||||
# be cleared
|
||||
RESET = -1
|
||||
|
||||
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
|
||||
|
||||
|
||||
class DefaultColor:
|
||||
"""
|
||||
This class should have the default colors for every segment.
|
||||
Please test every new segment with this theme first.
|
||||
"""
|
||||
# RESET is not a real color code. It is used as in indicator
|
||||
# within the code that any foreground / background color should
|
||||
# be cleared
|
||||
RESET = -1
|
||||
|
||||
USERNAME_FG = 223 #fg1
|
||||
USERNAME_BG = 237 #bg1
|
||||
USERNAME_ROOT_BG = 172 #yellow (dark)
|
||||
|
||||
HOSTNAME_FG = 223 #fg1
|
||||
HOSTNAME_BG = 235 #bg0
|
||||
|
||||
HOME_SPECIAL_DISPLAY = False
|
||||
# HOME_BG = 239 #bg2
|
||||
HOME_FG = 223 #fg1
|
||||
PATH_BG = 239 #bg2
|
||||
PATH_FG = 223 #fg1
|
||||
CWD_FG = 223 #fg1
|
||||
SEPARATOR_FG = 246 #fg4
|
||||
|
||||
READONLY_BG = 124 #red (dark)
|
||||
READONLY_FG = 223 #fg1
|
||||
|
||||
SSH_BG = 132 #purple (dark)
|
||||
SSH_FG = 223 #fg1
|
||||
|
||||
REPO_CLEAN_BG = 106 #green (dark)
|
||||
REPO_CLEAN_FG = 223 #fg1
|
||||
REPO_DIRTY_BG = 124 #red (dark)
|
||||
REPO_DIRTY_FG = 223 #fg1
|
||||
|
||||
JOBS_FG = 223 #fg1
|
||||
JOBS_BG = 66 #blue (dark)
|
||||
|
||||
CMD_PASSED_BG = 142 #green (light)
|
||||
CMD_PASSED_FG = 235 #bg0
|
||||
CMD_FAILED_BG = 167 #red (light)
|
||||
CMD_FAILED_FG = 235 #bg0
|
||||
|
||||
SVN_CHANGES_BG = 245 #gray
|
||||
SVN_CHANGES_FG = 214 #yellow (light)
|
||||
|
||||
GIT_AHEAD_BG = 241 #bg3
|
||||
GIT_AHEAD_FG = 223 #fg1
|
||||
GIT_BEHIND_BG = 241 #bg3
|
||||
GIT_BEHIND_FG = 223 #fg1
|
||||
GIT_STAGED_BG = 142 #green (light)
|
||||
GIT_STAGED_FG = 235 #bg0
|
||||
GIT_NOTSTAGED_BG = 214 #yellow (light)
|
||||
GIT_NOTSTAGED_FG = 235 #bg0
|
||||
GIT_UNTRACKED_BG = 167 #red (light)
|
||||
GIT_UNTRACKED_FG = 235 #bg0
|
||||
GIT_CONFLICTED_BG = 167 #red (light)
|
||||
GIT_CONFLICTED_FG = 124 #red (dark)
|
||||
|
||||
VIRTUAL_ENV_BG = 106 #green (dark)
|
||||
VIRTUAL_ENV_FG = 223 #fg1
|
||||
|
||||
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)
|
||||
|
||||
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
|
||||
import re
|
||||
import subprocess
|
||||
import platform
|
||||
|
||||
def add_jobs_segment(powerline):
|
||||
num_jobs = 0
|
||||
|
||||
if platform.system().startswith('CYGWIN'):
|
||||
# cygwin ps is a special snowflake...
|
||||
output_proc = subprocess.Popen(['ps', '-af'], stdout=subprocess.PIPE)
|
||||
output = map(lambda l: int(l.split()[2].strip()),
|
||||
output_proc.communicate()[0].decode("utf-8").splitlines()[1:])
|
||||
|
||||
num_jobs = output.count(os.getppid()) - 1
|
||||
|
||||
else:
|
||||
|
||||
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)
|
||||
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, is_last_dir):
|
||||
"""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,)
|
||||
|
||||
if is_last_dir:
|
||||
return (Color.CWD_FG, Color.PATH_BG,)
|
||||
else:
|
||||
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):
|
||||
is_last_dir = (i == len(names) - 1)
|
||||
fg, bg = get_fg_bg(name, is_last_dir)
|
||||
|
||||
separator = powerline.separator_thin
|
||||
separator_fg = Color.SEPARATOR_FG
|
||||
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 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<local>\S+?)''(\.{3}(?P<remote>\S+?)( \[(ahead (?P<ahead>\d+)(, )?)?(behind (?P<behind>\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
|
||||
|
||||
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)
|
||||
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())
|
48
test/test-colors
Executable file
48
test/test-colors
Executable file
@ -0,0 +1,48 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Description:
|
||||
#
|
||||
# Prints a color table of 8bg * 8fg * 2 states (regular/bold)
|
||||
#
|
||||
# Copyright:
|
||||
#
|
||||
# (C) 2009 Wolfgang Frisch <xororand@unfoog.de>
|
||||
#
|
||||
# License:
|
||||
#
|
||||
# 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 should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
echo
|
||||
echo Table for 16-color terminal escape sequences.
|
||||
echo Replace ESC with \\033 in bash.
|
||||
echo
|
||||
echo "Background | Foreground colors"
|
||||
echo "-----------------------------------------------------------------------------"
|
||||
for((bg=40;bg<=47;bg++)); do
|
||||
for((bold=0;bold<=1;bold++)) do
|
||||
echo -en "\033[0m"" ESC[${bg}m | "
|
||||
for((fg=30;fg<=37;fg++)); do
|
||||
if [ $bold == "0" ]; then
|
||||
echo -en "\033[${bg}m\033[${fg}m █[${fg}m "
|
||||
else
|
||||
echo -en "\033[${bg}m\033[1;${fg}m █[1;${fg}m"
|
||||
fi
|
||||
done
|
||||
echo -e "\033[0m"
|
||||
done
|
||||
echo "----------------------------------------------------------------------------- "
|
||||
done
|
||||
|
||||
echo
|
||||
echo
|
5
test/test-notifications
Executable file
5
test/test-notifications
Executable file
@ -0,0 +1,5 @@
|
||||
#!/bin/sh
|
||||
notify-send -u low "Low Urgency Notification" "This is a simple test notification with low urgency. It's okay to ignore me, I guess."
|
||||
notify-send -u normal "Normal Urgency Notification" "This is another simple test notification with normal urgency. My information will help you work."
|
||||
notify-send -u critical "High Urgency Notification" "This notification really should grab your attention! It's important!"
|
||||
notify-send -u normal "Long Notification" "This is a very long notification with a very long, unabridged description. Its sole purpose is to test whether or not your notification handler can properly wrap descriptions and truncate where necessary. This is important as notifications should simply alert the user that something is going on, and should not otherwise impede work."
|
42
wal-set
Executable file
42
wal-set
Executable file
@ -0,0 +1,42 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Copyright (c) <year> rehashedsalt/vintagesalt
|
||||
#
|
||||
# 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.
|
||||
|
||||
# Set a wallpaper
|
||||
wal -a 80 -i "$HOME/Pictures/Wallpapers/i3"
|
||||
|
||||
# Source its generated colors
|
||||
source "$HOME/.cache/wal/colors.sh"
|
||||
|
||||
# Restart dunst
|
||||
pkill dunst
|
||||
dunst \
|
||||
-lb "${color0}" \
|
||||
-nb "${color0}" \
|
||||
-cb "${color0}" \
|
||||
-lfr "${color0}" \
|
||||
-nfr "${color0}" \
|
||||
-cfr "${color0}" \
|
||||
-lf "${color7}" \
|
||||
-nf "${color15}" \
|
||||
-cf "${color9}" \
|
||||
|
||||
exit 0
|
35
xephrice
Executable file
35
xephrice
Executable file
@ -0,0 +1,35 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Copyright (c) 2017 rehashedsalt/vintagesalt
|
||||
#
|
||||
# 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.
|
||||
|
||||
xephyrdisplay=":8"
|
||||
|
||||
Xephyr -screen 1920x1080 -title "Xephyr Instance" -br -ac $xephyrdisplay &
|
||||
|
||||
DISPLAY="$xephyrdisplay"
|
||||
sleep 1
|
||||
|
||||
urxvt &
|
||||
|
||||
# Disown all of our jobs
|
||||
printf "\nXephyr session started with urxvt in background. Disowning and closing this terminal may break them!\n"
|
||||
|
||||
exit 0
|
2
xrdbupdate
Executable file
2
xrdbupdate
Executable file
@ -0,0 +1,2 @@
|
||||
#!/bin/sh
|
||||
xrdb ~/.Xresources
|
Loading…
Reference in New Issue
Block a user