aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.Xresources315
-rw-r--r--.bash_aliases9
l---------.bash_completion.d/gentoo1
-rw-r--r--.bash_logout6
-rw-r--r--.bash_profile5
-rw-r--r--.bashrc56
-rwxr-xr-x.conky/cronograph/accuweather/accuweather.sh172
-rw-r--r--.conky/cronograph/accuweather/curr_cond5
-rw-r--r--.conky/cronograph/accuweather/curr_cond_raw1646
-rw-r--r--.conky/cronograph/accuweather/last_days25
-rw-r--r--.conky/cronograph/accuweather/last_days_raw82
-rw-r--r--.conky/cronograph/accuweather/tod_ton25
-rw-r--r--.conky/cronograph/accuweather/tod_ton_raw81
-rwxr-xr-x.conky/cronograph/conky_start.sh10
-rw-r--r--.conky/cronograph/conkyrc89
-rw-r--r--.conky/cronograph/images/Blank.pngbin0 -> 11356 bytes
-rw-r--r--.conky/cronograph/images/Blue.pngbin0 -> 11605 bytes
-rw-r--r--.conky/cronograph/images/Dark_Green.pngbin0 -> 12198 bytes
-rw-r--r--.conky/cronograph/images/Dark_Purple.pngbin0 -> 11429 bytes
-rw-r--r--.conky/cronograph/images/Green.pngbin0 -> 11963 bytes
-rw-r--r--.conky/cronograph/images/Orange.pngbin0 -> 11767 bytes
-rw-r--r--.conky/cronograph/images/Pink.pngbin0 -> 11514 bytes
-rw-r--r--.conky/cronograph/images/Purple.pngbin0 -> 11335 bytes
-rw-r--r--.conky/cronograph/images/Red.pngbin0 -> 11470 bytes
-rw-r--r--.conky/cronograph/images/Yellow.pngbin0 -> 11889 bytes
-rwxr-xr-x.conky/cronograph/scripts/blinkingLED3
-rwxr-xr-x.conky/cronograph/scripts/clock_rings.lua358
-rwxr-xr-x.conky/cronograph/scripts/multi_rings.lua375
-rw-r--r--.conkyrc89
-rw-r--r--.gitconfig5
-rw-r--r--.gtk-bookmarks5
-rw-r--r--.gtkrc-2.08
-rw-r--r--.gtkrc.mine25
-rw-r--r--.i3/config362
-rw-r--r--.i3/images/wallpaper.pngbin0 -> 87684 bytes
-rw-r--r--.i3/py3status.conf78
-rw-r--r--.i3/py3status/10-mpd.py117
-rw-r--r--.i3/py3status/20-volume.py112
-rw-r--r--.i3/py3status/25-microphone.py105
-rw-r--r--.i3/py3status/30-touchpad.py86
-rw-r--r--.i3/py3status/40-power.py73
-rw-r--r--.i3/py3status/50-battery.py106
-rw-r--r--.i3/py3status/80-datetime.py76
-rw-r--r--.i3/py3status/backup/dpms.py44
-rw-r--r--.i3/py3status/backup/empty_class.py41
-rw-r--r--.i3/py3status/backup/glpi.py52
-rw-r--r--.i3/py3status/backup/i3bar_click_events.py127
-rw-r--r--.i3/py3status/backup/netdata.py132
-rw-r--r--.i3/py3status/backup/ns_checker.py57
-rw-r--r--.i3/py3status/backup/pingdom.py59
-rw-r--r--.i3/py3status/backup/pomodoro.py123
-rw-r--r--.i3/py3status/backup/sysdata.py137
-rw-r--r--.i3/py3status/backup/weather_yahoo.py106
-rw-r--r--.i3/py3status/backup/whoami.py26
-rwxr-xr-x.i3/scripts/i3exit.sh43
-rw-r--r--.i3status.conf76
-rw-r--r--.lftp/rc21
-rw-r--r--.mpdconf493
-rw-r--r--.ncmpcpp/config510
-rw-r--r--.ncmpcpp/keys188
-rw-r--r--.profile34
-rw-r--r--.sbclrc23
-rw-r--r--.tmux.conf91
-rw-r--r--.urxvt/ext/LICENSE339
-rw-r--r--.urxvt/ext/README.md107
-rw-r--r--.urxvt/ext/clipboard109
-rw-r--r--.urxvt/ext/keyboard-select567
-rw-r--r--.urxvt/ext/url-select375
-rw-r--r--.vifm/colors/Default52
-rw-r--r--.vifm/colors/alycolors60
-rw-r--r--.vifm/colors/dmilith-root21
-rw-r--r--.vifm/colors/dmilith-user21
-rw-r--r--.vifm/colors/istib-solarized-dark25
-rw-r--r--.vifm/colors/juef-zenburn21
-rw-r--r--.vifm/colors/reicheltd-light26
-rw-r--r--.vifm/vifm-help.txt3099
-rw-r--r--.vifm/vifmrc314
-rw-r--r--.xbindkeysrc104
-rw-r--r--.xinitrc15
-rw-r--r--.xprofile7
80 files changed, 12155 insertions, 0 deletions
diff --git a/.Xresources b/.Xresources
new file mode 100644
index 0000000..cb05930
--- /dev/null
+++ b/.Xresources
@@ -0,0 +1,315 @@
+! ---------------------------------------------------------
+! $HOME/.Xresources
+!
+! Weitian LI <liweitianux@gmail.com>
+! 2014/05/10
+!
+! Syntax:
+! name.Class.resource: value
+!
+! Ref: https://wiki.archlinux.org/index.php/X_resources
+! ---------------------------------------------------------
+
+!!! xft settings {{{
+Xft.dpi: 96
+Xft.antialias: true
+Xft.rgba: rgb
+Xft.hinting: true
+Xft.hintstyle: hintmedium
+!!! xft settings }}}
+
+!!! color scheme {{{
+!! foreground & background
+! XXX: NOT set background and foreground globally
+! to avoid conflicts with Tcl/Tk applications. (e.g. ds9)
+!*background: #1b1b1b
+!*foreground: #e0e0e0
+!! other colors
+*cursorColor: #eeeeee
+*colorBD: #cfcfcf
+*colorUL: #969696
+*colorIT: #969696
+!
+!! zenburn: http://xcolors.net/dl/zenburn {{{
+! Black
+*color0: #1e2320
+*color8: #709080
+! Red
+*color1: #705050
+*color9: #dca3a3
+! Green
+*color2: #60b48a
+*color10: #c3bf9f
+! Yellow
+*color3: #dfaf8f
+*color11: #f0dfaf
+! Blue
+*color4: #506070
+*color12: #94bff3
+! Magenta
+*color5: #dc8cc3
+*color13: #ec93d3
+! Cyan
+*color6: #8cd0d3
+*color14: #93e0e3
+! White
+*color7: #dcdccc
+*color15: #ffffff
+! zenburn }}}
+!
+!! clound: http://xcolors.net/dl/cloud {{{
+!!black
+!*color0: #222827
+!*color8: #5D6F74
+!!red
+!*color1: #D5A8E3
+!*color9: #CD749C
+!!green
+!*color2: #9C75DD
+!*color10: #63B0B0
+!!yellow
+!*color3: #9898AE
+!*color11: #C0C0DD
+!!blue
+!*color4: #654A96
+!*color12: #5786BC
+!!magenta
+!*color5: #625566
+!*color13: #3F3442
+!!cyan
+!*color6: #A9D1DF
+!*color14: #849DA2
+!!white
+!*color7: #E6EBE5
+!*color15: #D9D6CF
+!! clound }}}
+!
+!! kori colorscheme: http://dotshare.it/dots/659/ {{{
+!!Black
+!*color0: #3D3D3D
+!*color8: #4D4D4D
+!!Red
+!*color1: #6673BF
+!*color9: #899AFF
+!!Green
+!*color2: #3EA290
+!*color10: #52AD91
+!!Yellow
+!*color3: #B0EAD9
+!*color11: #98C9BB
+!!Blue
+!*color4: #31658C
+!*color12: #477AB3
+!!Magenta
+!*color5: #596196
+!*color13: #7882BF
+!!Cyan
+!*color6: #8292B2
+!*color14: #95A7CC
+!!White
+!*color7: #C8CACC
+!*color15: #EDEFF2
+!! }}}
+!
+!! unknown {{{
+!*color0: #353535
+!*color8: #666666
+!!red
+!*color1: #D81860
+!*color9: #F00060
+!!green
+!*color2: #B7CE42
+!*color10: #BDE077
+!!brown/yellow
+!*color3: #FEA63C
+!*color11: #FFE863
+!!blue
+!*color4: #6F99B4
+!*color12: #7C96B0
+!!magenta
+!*color5: #8B7B8B
+!*color13: #D8BFD8
+!!cyan
+!*color6: #A7A15E
+!*color14: #F0E68C
+!!white
+!*color7: #DDDDDD
+!*color15: #FFFFFF
+!! }}}
+!
+!!! color scheme }}}
+
+!!! rxvt-unicode settings {{{
+!! urxvt background true transparent
+! set to 32-bit for real transparency (compositing required [see xcompmgr])
+! xdpyinfo | grep Composite
+URxvt.depth: 32
+! transparent=0000, opaque=ffff
+URxvt.background: rgba:1111/1111/1111/dddd
+! foreground
+URxvt.foreground: #e0e0e0
+!
+!! urxvt font settings
+!URxvt.font: xft:DejaVu Sans Mono:pixelsize=16,xft:WenQuanYi Micro Hei Mono:pixelsize=16
+URxvt.font: xft:Terminus:size=12,xft:WenQuanYi Bitmap Song:size=10
+URxvt.xftAntialias: true
+!
+!! urxvt settings
+!URxvt.termName: rxvt-256color
+!URxvt.title: aly rxvt
+URxvt.geometry: 92x26
+URxvt.cursorBlink: true
+URxvt.underlineColor: green
+URxvt.buffered: true
+URxvt.jumpScroll: false
+URxvt.secondaryScroll: true
+URxvt.saveLines: 4000
+URxvt.scrollBar: true
+URxvt.scrollBar_right: true
+URxvt.scrollstyle: plain
+URxvt.scrollTtyKeypress: true
+URxvt.scrollTtyOutput: false
+! scroll with scrollback buffer
+URxvt.scrollWithBuffer: true
+!URxvt.scrollColor: AntiqueWhite
+!
+!! urxvt keysym
+! M: Meta S; Shift C: Control
+! Mod4: Win
+! \002: Control-B
+! \015: Enter
+!
+!! urxvt perl extension settings
+URxvt.perl-lib: ~/.urxvt/ext/
+URxvt.perl-ext-common: default,tabbed,clipboard,keyboard-select,url-select
+!! tabbed color
+URxvt.tabbed.tabbar-fg: 5
+URxvt.tabbed.tabbar-bg: 0
+URxvt.tabbed.tab-fg: 14
+URxvt.tabbed.tab-bg: 0
+!! copy/paste
+URxvt.keysym.Mod4-c: perl:clipboard:copy
+URxvt.keysym.Mod4-v: perl:clipboard:paste
+URxvt.keysym.Mod4-S-v: perl:clipboard:paste_escaped
+URxvt.clipboard.copycmd: xclip -i -selection clipboard
+URxvt.clipboard.pastecmd: xclip -o -selection clipboard
+!! keyboard-select
+URxvt.keysym.Mod4-Escape: perl:keyboard-select:activate
+URxvt.keysym.Mod4-s: perl:keyboard-select:search
+!! url-select
+URxvt.keysym.Mod4-u: perl:url-select:select_next
+URxvt.url-select.underline: true
+URxvt.url-select.button: 1
+URxvt.url-select.launcher: firefox -new-tab
+!
+!! urxvt misc settings
+!URxvt.loginShell: true
+URxvt.mapAlert: true
+URxvt.pointerBlank: true
+URxvt.urgentOnBell: true
+URxvt.utmpInhibit: true
+! preeditType: OverTheSpot, OffTheSpot, Root
+URxvt.preeditType: root
+! reduce the distance between characters
+!URxvt.letterSpace: -1
+URxvt.inputMethod: fcitx
+!!! rxvt-unicdoe settings }}}
+
+!!! xterm settings {{{
+XTerm.background: #1b1b1b
+XTerm.foreground: #e0e0e0
+!XTerm.geometry: 80x25
+!XTerm.faceName: xft:Dejavu Sans Mono:pixelsize=16:antialias=true
+XTerm.faceName: xft:Terminus:pixelsize=18
+XTerm.dynamicColors: true
+XTerm.utf8: 2
+XTerm.eightBitInput: true
+XTerm.saveLines: 4000
+XTerm.scrollTtyOutput: false
+XTerm.scrollKey: true
+XTerm.scrollBar: true
+XTerm.rightScrollBar: true
+!XTerm.loginShell: true
+XTerm.jumpScroll: false
+XTerm.multiScroll: true
+XTerm.toolBar: true
+!!! xterm settings }}}
+
+!!! Xcursor {{{
+! Vanilla-DMZ: white
+! Vanilla-DMZ-AA: black
+!Xcursor.theme: Vanilla-DMZ-AA
+Xcursor.theme: Vanilla-DMZ
+Xcursor.size: 32
+!!! Xcursor }}}
+
+!!! xfontsel {{{
+XFontSel.background: #1b1b1b
+XFontSel.foreground: #e0e0e0
+!!! xfontsel }}}
+
+!!! x11-ssh-askpass {{{
+x11-ssh-askpass*font: -*-dina-medium-r-*-*-12-*-*-*-*-*-*-*
+x11-ssh-askpass*background: #000000
+x11-ssh-askpass*foreground: #ffffff
+x11-ssh-askpass.Button*background: #000000
+x11-ssh-askpass.Indicator*foreground: #ff9900
+x11-ssh-askpass.Indicator*background: #090909
+x11-ssh-askpass*topShadowColor: #000000
+x11-ssh-askpass*bottomShadowColor: #000000
+x11-ssh-askpass.*borderWidth: 1
+!!! x11-ssh-askpass }}}
+
+!!! xscreensaver settings {{{
+!! font settings
+xscreensaver.Dialog.headingFont: -*-dina-bold-r-*-*-12-*-*-*-*-*-*-*
+xscreensaver.Dialog.bodyFont: -*-dina-medium-r-*-*-12-*-*-*-*-*-*-*
+xscreensaver.Dialog.labelFont: -*-dina-medium-r-*-*-12-*-*-*-*-*-*-*
+xscreensaver.Dialog.unameFont: -*-dina-medium-r-*-*-12-*-*-*-*-*-*-*
+xscreensaver.Dialog.buttonFont: -*-dina-bold-r-*-*-12-*-*-*-*-*-*-*
+xscreensaver.Dialog.dateFont: -*-dina-medium-r-*-*-12-*-*-*-*-*-*-*
+xscreensaver.passwd.passwdFont: -*-dina-bold-r-*-*-12-*-*-*-*-*-*-*
+!! general dialog box (affects main hostname, username, password text)
+xscreensaver.Dialog.foreground: #ffffff
+xscreensaver.Dialog.background: #111111
+xscreensaver.Dialog.topShadowColor: #111111
+xscreensaver.Dialog.bottomShadowColor: #111111
+xscreensaver.Dialog.Button.foreground: #666666
+xscreensaver.Dialog.Button.background: #ffffff
+!! username/password input box and date text colour
+xscreensaver.Dialog.text.foreground: #666666
+xscreensaver.Dialog.text.background: #ffffff
+xscreensaver.Dialog.internalBorderWidth: 24
+xscreensaver.Dialog.borderWidth: 20
+xscreensaver.Dialog.shadowThickness: 2
+!! timeout bar (background is actually determined by Dialog.text.background)
+xscreensaver.passwd.thermometer.foreground: #ff0000
+xscreensaver.passwd.thermometer.background: #000000
+xscreensaver.passwd.thermometer.width: 8
+!! datestamp format - see strftime(3) manual page for details
+xscreensaver.dateFormat: %I:%M%P %a %b %d, %Y
+!! preferences
+xscreensaver.mode: blank
+xscreensaver.timeout: 0:10:00
+xscreensaver.cycle: 0:10:00
+xscreensaver.lock: True
+xscreensaver.lockTimeout: 0:01:00
+xscreensaver.passwdTimeout: 0:00:30
+xscreensaver.dpmsEnabled: True
+xscreensaver.dpmsQuickoff: True
+xscreensaver.dpmsStandby: 0:10:00
+xscreensaver.dpmsSuspend: 0:10:00
+xscreensaver.dpmsOff: 0:15:00
+xscreensaver.fade: True
+xscreensaver.unfade: False
+xscreensaver.fadeSeconds: 0:00:03
+xscreensaver.fadeTicks: 20
+!! user switching from lock screen
+! Lightdm: dm-tool switch-to-greeter
+! LXDM: lxdm -c USER_SWITCH
+! GDM: gdmflexiserver -ls
+! KDM: kdmctl reverse
+xscreensaver.newLoginCommand: dm-tool switch-to-greeter
+!!! xscreensaver }}}
+
+! vim: set ts=8 sw=4 tw=78 ft=xdefaults: !
diff --git a/.bash_aliases b/.bash_aliases
new file mode 100644
index 0000000..7d25ed6
--- /dev/null
+++ b/.bash_aliases
@@ -0,0 +1,9 @@
+# ~/.bash_aliases
+#
+
+### sbcl ###
+#export CL_BREAK_CHARS="\"#'(),;\`\\|!?[]{}"
+#alias sbcl="rlwrap -b \${CL_BREAK_CHARS} sbcl"
+alias sbcl='sbcl --no-inform'
+
+# vim: set ts=8 sw=4 tw=0 fenc=utf-8 ft=sh: #
diff --git a/.bash_completion.d/gentoo b/.bash_completion.d/gentoo
new file mode 120000
index 0000000..98ef469
--- /dev/null
+++ b/.bash_completion.d/gentoo
@@ -0,0 +1 @@
+../../../usr/share/bash-completion/gentoo \ No newline at end of file
diff --git a/.bash_logout b/.bash_logout
new file mode 100644
index 0000000..44b6f79
--- /dev/null
+++ b/.bash_logout
@@ -0,0 +1,6 @@
+# /etc/skel/.bash_logout
+
+# This file is sourced when a login shell terminates.
+
+# Clear the screen for security's sake.
+clear
diff --git a/.bash_profile b/.bash_profile
new file mode 100644
index 0000000..94a6622
--- /dev/null
+++ b/.bash_profile
@@ -0,0 +1,5 @@
+# /etc/skel/.bash_profile
+
+# This file is sourced by bash for login shells. The following line
+# runs your .bashrc and is recommended by the bash info pages.
+[[ -f ~/.bashrc ]] && . ~/.bashrc
diff --git a/.bashrc b/.bashrc
new file mode 100644
index 0000000..19842ea
--- /dev/null
+++ b/.bashrc
@@ -0,0 +1,56 @@
+# ~/.bashrc
+# /etc/skel/.bashrc
+#
+# This file is sourced by all *interactive* bash shells on startup,
+# including some apparently interactive shells such as scp and rcp
+# that can't tolerate any output. So make sure this doesn't display
+# anything or bad things will happen !
+
+# Test for an interactive shell. There is no need to set anything
+# past this point for scp and rcp, and it's important to refrain from
+# outputting anything in those cases.
+if [[ $- != *i* ]] ; then
+ # Shell is non-interactive. Be done now!
+ return
+fi
+
+
+### bash settings {{{
+# no double entries in the shell history
+export HISTCONTROL="$HISTCONTROL erasedups:ignoreboth"
+
+# prompt
+export PS1="\[\033[01;33m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\] "
+### bash settings }}}
+
+
+### bash completion {{{
+# bash-completion
+if [ -f /etc/profile.d/bash-completion.sh ]; then
+ . /etc/profile.d/bash-completion.sh
+fi
+### bash completion }}}
+
+
+### environment variables {{{
+export EDITOR=vim
+
+### }}}
+
+
+### aliases {{{
+alias ll='ls -l'
+alias lf='ls -F'
+alias la='ls -A'
+
+# ~/.bash_aliases
+[ -f ~/.bash_aliases ] && . ~/.bash_aliases
+### aliases }}}
+
+
+### run applications {{{
+# music player daemon (mpd)
+[ ! -s ~/.mpd/pid ] && mpd >/dev/null 2>&1
+### run applications }}}
+
+# vim: set ts=8 sw=4 tw=0 fenc=utf-8 ft=sh: #
diff --git a/.conky/cronograph/accuweather/accuweather.sh b/.conky/cronograph/accuweather/accuweather.sh
new file mode 100755
index 0000000..fe6a407
--- /dev/null
+++ b/.conky/cronograph/accuweather/accuweather.sh
@@ -0,0 +1,172 @@
+#!/bin/sh
+
+## get the directory of this script
+SCRIPT_PATH=`readlink -f $0`
+SCRIPT_DIR=`dirname ${SCRIPT_PATH}`
+
+## address (Accuweather url)
+address="http://www.accuweather.com/en/cn/shanghai/106577/weather-forecast/106577" # Shanghai
+
+
+## function: test_image()
+test_image() {
+ case $1 in
+ 1)
+ echo a
+ ;;
+ 2|3)
+ echo b
+ ;;
+ 4|5)
+ echo c
+ ;;
+ 6)
+ echo d
+ ;;
+ 7)
+ echo e
+ ;;
+ 8)
+ echo f
+ ;;
+ 11)
+ echo 0
+ ;;
+ 12)
+ echo h
+ ;;
+ 13|14)
+ echo g
+ ;;
+ 15)
+ echo m
+ ;;
+ 16|17)
+ echo k
+ ;;
+ 18)
+ echo i
+ ;;
+ 19)
+ echo q
+ ;;
+ 20|21|23)
+ echo o
+ ;;
+ 22)
+ echo r
+ ;;
+ 24|31)
+ echo E
+ ;;
+ 25)
+ echo v
+ ;;
+ 26)
+ echo x
+ ;;
+ 29)
+ echo y
+ ;;
+ 30)
+ echo 5
+ ;;
+ 32)
+ echo 6
+ ;;
+ 33)
+ echo A
+ ;;
+ 34|35)
+ echo B
+ ;;
+ 36|37)
+ echo C
+ ;;
+ 38)
+ echo D
+ ;;
+ 39|40)
+ echo G
+ ;;
+ 41|42)
+ echo K
+ ;;
+ 43|44)
+ echo O
+ ;;
+ *)
+ echo -
+ ;;
+ esac
+}
+
+
+#kill -STOP $(pidof conky)
+#killall wget
+
+## urls and wget weather data
+loc_id=$(echo ${address} | sed 's/\/weather-forecast.*$//' | sed 's/^.*\///')
+last_number=$(echo ${address} | sed 's/^.*\///')
+
+curr_addr="$(echo ${address} | sed 's/weather-forecast.*$//')current-weather/${last_number}"
+wget -O ${SCRIPT_DIR}/curr_cond_raw "${curr_addr}"
+
+addr1="$(echo ${address} | sed 's/weather-forecast.*$//')daily-weather-forecast/${last_number}"
+wget -O ${SCRIPT_DIR}/tod_ton_raw "${addr1}"
+
+addr2="${addr1}?day=6"
+wget -O ${SCRIPT_DIR}/last_days_raw "${addr2}"
+
+## current conditions
+if [ -s ${SCRIPT_DIR}/curr_cond_raw ]; then
+ sed -i '/detail-now/,/#details/!d' ${SCRIPT_DIR}/curr_cond_raw
+ egrep -i '"cond"|icon i-|detail-tab-panel' ${SCRIPT_DIR}/curr_cond_raw > ${SCRIPT_DIR}/curr_cond
+ sed -i -e 's/^.*detail-tab-panel //g' -e 's/^.*icon i-//g' -e 's/"><\/div>.*$//g' ${SCRIPT_DIR}/curr_cond
+ sed -i -e 's/^.*"cond">//g' -e 's/&deg/\n/g' -e 's/<\/span>.*"temp">/\n/g' -e 's/<.*>//g' ${SCRIPT_DIR}/curr_cond
+ sed -i -e 's/">//g' -e 's/-->//g' -e 's/\r$//g' -e 's/ i-alarm.*$//g' -e 's/-[a-z].*$//g' ${SCRIPT_DIR}/curr_cond
+ image=$(sed -n 2p ${SCRIPT_DIR}/curr_cond)
+ sed -i 2s/${image}/$(test_image ${image})/ ${SCRIPT_DIR}/curr_cond
+fi
+
+## First 5 days
+if [ -s ${SCRIPT_DIR}/tod_ton_raw ]; then
+ sed -i '/feed-tabs/,/\.feed-tabs/!d' ${SCRIPT_DIR}/tod_ton_raw
+ egrep -i 'Early AM|Today|Tonight|Overnight|icon i-|cond|temp|Mon|Tue|Wed|Thu|Fri|Sat|Sun' ${SCRIPT_DIR}/tod_ton_raw > ${SCRIPT_DIR}/tod_ton
+ sed -i -e 's/^.*#">//g' -e 's/^.*icon i-//g' -e 's/^.*cond">//g' -e 's/^.*temp">//g' ${SCRIPT_DIR}/tod_ton
+ sed -i -e 's/Lo<\/span> /\n/g' -e 's/<\/a>.*$//g' -e 's/ "><.*$//g' -e 's/&#.*$//g' -e 's/teo//g' ${SCRIPT_DIR}/tod_ton
+ sed -i -e 's/<span>.*$//g' -e 's/<\/span>//g' -e 's/\r$//g' -e 's/ i-alarm.*$//g' ${SCRIPT_DIR}/tod_ton
+ sed -i -e 's/Early AM/EARLY AM/' -e 's/Today/TODAY/' -e 's/Tonight/TONIGHT/' -e 's/Overnight/OVERNIGHT/' -e 's/Mon/MON/' -e 's/Tue/TUE/' -e 's/Wed/WED/' -e 's/Thu/THU/' -e 's/Fri/FRI/' -e 's/Sat/SAT/' -e 's/Sun/SUN/' -e 's/-[a-z]*$//g' ${SCRIPT_DIR}/tod_ton
+ time=$(sed -n 1p ${SCRIPT_DIR}/tod_ton)
+ image=$(sed -n 2p ${SCRIPT_DIR}/tod_ton)
+ #
+ if [ "${time}" = "TODAY" ]; then
+ sed -i 2s/${image}/$(test_image ${image})/ ${SCRIPT_DIR}/tod_ton
+ elif [ "${time}" = "TONIGHT" -o "${time}" = "OVERNIGHT" -o "${time}" = "EARLY AM" ]; then
+ sed -i 2s/${image}/$(test_image ${image})/ ${SCRIPT_DIR}/tod_ton
+ sed -i 3a- ${SCRIPT_DIR}/tod_ton
+ fi
+ #
+ for i in $(seq 7 5 22); do
+ image=$(sed -n "${i}"p ${SCRIPT_DIR}/tod_ton)
+ sed -i ${i}s/${image}/$(test_image ${image})/ ${SCRIPT_DIR}/tod_ton
+ done
+fi
+
+## Next 5 days
+if [ -s ${SCRIPT_DIR}/last_days_raw ]; then
+ sed -i '/feed-tabs/,/\.feed-tabs/!d' ${SCRIPT_DIR}/last_days_raw
+ egrep -i 'icon i-|cond|temp|Mon|Tue|Wed|Thu|Fri|Sat|Sun' ${SCRIPT_DIR}/last_days_raw > ${SCRIPT_DIR}/last_days
+ sed -i -e 's/^.*#">//g' -e 's/^.*icon i-//g' -e 's/^.*cond">//g' -e 's/^.*temp">//g' ${SCRIPT_DIR}/last_days
+ sed -i -e 's/Lo<\/span> /\n/g' -e 's/<\/a>.*$//g' -e 's/ "><.*$//g' -e 's/&#.*$//g' -e 's/teo//g' ${SCRIPT_DIR}/last_days
+ sed -i -e 's/<span>.*$//g' -e 's/<\/span>//g' -e 's/\r$//g' -e 's/ i-alarm.*$//g' ${SCRIPT_DIR}/last_days
+ sed -i -e 's/Mon/MON/' -e 's/Tue/TUE/' -e 's/Wed/WED/' -e 's/Thu/THU/' -e 's/Fri/FRI/' -e 's/Sat/SAT/' -e 's/Sun/SUN/' -e 's/-[a-z]*$//g' ${SCRIPT_DIR}/last_days
+ #
+ for i in $(seq 7 5 22); do
+ image=$(sed -n "${i}"p ${SCRIPT_DIR}/last_days)
+ sed -i ${i}s/${image}/$(test_image ${image})/ ${SCRIPT_DIR}/last_days
+ done
+fi
+
+#kill -CONT $(pidof conky)
+
diff --git a/.conky/cronograph/accuweather/curr_cond b/.conky/cronograph/accuweather/curr_cond
new file mode 100644
index 0000000..f5d92e6
--- /dev/null
+++ b/.conky/cronograph/accuweather/curr_cond
@@ -0,0 +1,5 @@
+night
+A
+Clear
+18
+
diff --git a/.conky/cronograph/accuweather/curr_cond_raw b/.conky/cronograph/accuweather/curr_cond_raw
new file mode 100644
index 0000000..9f2b26c
--- /dev/null
+++ b/.conky/cronograph/accuweather/curr_cond_raw
@@ -0,0 +1,1646 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>Shanghai Current Weather - AccuWeather Forecast for Shanghai China</title>
+ <script type="text/javascript">window.NREUM||(NREUM={});NREUM.info = {"beacon":"beacon-3.newrelic.com","errorBeacon":"jserror.newrelic.com","licenseKey":"a690b21e9f","applicationID":"599479","transactionName":"NV0GYUFWCEUDBkNQDAwXIFpHeQNCIQpZTRENVAhQQRggWRAAVFgQFhcnQEFFA1gWJlhXBwtMDVpdRA==","queueTime":0,"applicationTime":48,"ttGuid":"BB8C9D8BB020BC9B","agent":"js-agent.newrelic.com/nr-411.min.js"}</script><script type="text/javascript">(window.NREUM||(NREUM={})).loader_config={xpid:"VQUFVl5UGwYJXVVVDg=="};window.NREUM||(NREUM={}),__nr_require=function(t,e,n){function r(n){if(!e[n]){var o=e[n]={exports:{}};t[n][0].call(o.exports,function(e){var o=t[n][1][e];return r(o?o:e)},o,o.exports)}return e[n].exports}if("function"==typeof __nr_require)return __nr_require;for(var o=0;o<n.length;o++)r(n[o]);return r}({1:[function(t,e){function n(t,e,n){n||(n={});for(var r=o[t],a=r&&r.length||0,s=n[i]||(n[i]={}),u=0;a>u;u++)r[u].apply(s,e);return s}function r(t,e){var n=o[t]||(o[t]=[]);n.push(e)}var o={},i="nr@context";e.exports={on:r,emit:n}},{}],2:[function(t){function e(t,e,n,i,s){return u?u-=1:r("err",[s||new UncaughtException(t,e,n)]),"function"==typeof a?a.apply(this,o(arguments)):!1}function UncaughtException(t,e,n){this.message=t||"Uncaught error with no additional information",this.sourceURL=e,this.line=n}function n(t){r("err",[t,(new Date).getTime()])}var r=t("handle"),o=t(6),i=t(5),a=window.onerror,s=!1,u=0;t("loader").features.push("err"),window.onerror=e,NREUM.noticeError=n;try{throw new Error}catch(d){"stack"in d&&(t(1),t(2),"addEventListener"in window&&t(3),window.XMLHttpRequest&&XMLHttpRequest.prototype&&XMLHttpRequest.prototype.addEventListener&&t(4),s=!0)}i.on("fn-start",function(){s&&(u+=1)}),i.on("fn-err",function(t,e,r){s&&(this.thrown=!0,n(r))}),i.on("fn-end",function(){s&&!this.thrown&&u>0&&(u-=1)}),i.on("internal-error",function(t){r("ierr",[t,(new Date).getTime(),!0])})},{1:5,2:4,3:3,4:6,5:1,6:14,handle:"D5DuLP",loader:"G9z0Bl"}],3:[function(t){function e(t){r.inPlace(t,["addEventListener","removeEventListener"],"-",n)}function n(t){return t[1]}var r=t(1),o=(t(3),t(2));if(e(window),"getPrototypeOf"in Object){for(var i=document;i&&!i.hasOwnProperty("addEventListener");)i=Object.getPrototypeOf(i);i&&e(i);for(var a=XMLHttpRequest.prototype;a&&!a.hasOwnProperty("addEventListener");)a=Object.getPrototypeOf(a);a&&e(a)}else XMLHttpRequest.prototype.hasOwnProperty("addEventListener")&&e(XMLHttpRequest.prototype);o.on("addEventListener-start",function(t){if(t[1]){var e=t[1];"function"==typeof e?this.wrapped=e["nr@wrapped"]?t[1]=e["nr@wrapped"]:e["nr@wrapped"]=t[1]=r(e,"fn-"):"function"==typeof e.handleEvent&&r.inPlace(e,["handleEvent"],"fn-")}}),o.on("removeEventListener-start",function(t){var e=this.wrapped;e&&(t[1]=e)})},{1:15,2:1,3:14}],4:[function(t){var e=(t(3),t(1)),n=t(2);e.inPlace(window,["requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","msRequestAnimationFrame"],"raf-"),n.on("raf-start",function(t){t[0]=e(t[0],"fn-")})},{1:15,2:1,3:14}],5:[function(t){function e(t){var e=t[0];"string"==typeof e&&(e=new Function(e)),t[0]=n(e,"fn-")}var n=(t(3),t(1)),r=t(2);n.inPlace(window,["setTimeout","setInterval","setImmediate"],"setTimer-"),r.on("setTimer-start",e)},{1:15,2:1,3:14}],6:[function(t){function e(){o.inPlace(this,s,"fn-")}function n(t,e){o.inPlace(e,["onreadystatechange"],"fn-")}function r(t,e){return e}var o=t(1),i=t(2),a=window.XMLHttpRequest,s=["onload","onerror","onabort","onloadstart","onloadend","onprogress","ontimeout"];window.XMLHttpRequest=function(t){var n=new a(t);try{i.emit("new-xhr",[],n),o.inPlace(n,["addEventListener","removeEventListener"],"-",function(t,e){return e}),n.addEventListener("readystatechange",e,!1)}catch(r){try{i.emit("internal-error",r)}catch(s){}}return n},window.XMLHttpRequest.prototype=a.prototype,o.inPlace(XMLHttpRequest.prototype,["open","send"],"-xhr-",r),i.on("send-xhr-start",n),i.on("open-xhr-start",n)},{1:15,2:1}],7:[function(t){function e(){function e(t){if("string"==typeof t&&t.length)return t.length;if("object"!=typeof t)return void 0;if("undefined"!=typeof ArrayBuffer&&t instanceof ArrayBuffer&&t.byteLength)return t.byteLength;if("undefined"!=typeof Blob&&t instanceof Blob&&t.size)return t.size;if("undefined"!=typeof FormData&&t instanceof FormData)return void 0;try{return JSON.stringify(t).length}catch(e){return void 0}}function n(t){var n=this.params,r=this.metrics;if(!this.ended){this.ended=!0;for(var i=0;u>i;i++)t.removeEventListener(s[i],this.listener,!1);if(!n.aborted){if(r.duration=(new Date).getTime()-this.startTime,4===t.readyState){n.status=t.status;var a=t.responseType,d="arraybuffer"===a||"blob"===a||"json"===a?t.response:t.responseText,f=e(d);if(f&&(r.rxSize=f),this.sameOrigin){var c=t.getResponseHeader("X-NewRelic-App-Data");c&&(n.cat=c.split(", ").pop())}}else n.status=0;r.cbTime=this.cbTime,o("xhr",[n,r])}}}function r(t,e){var n=i(e),r=t.params;r.host=n.hostname+":"+n.port,r.pathname=n.pathname,t.sameOrigin=n.sameOrigin}t("loader").features.push("xhr");var o=t("handle"),i=t(1),a=t(5),s=["load","error","abort","timeout"],u=s.length,d=t(2);t(3),t(4),a.on("new-xhr",function(){this.totalCbs=0,this.called=0,this.cbTime=0,this.end=n,this.ended=!1,this.xhrGuids={}}),a.on("open-xhr-start",function(t){this.params={method:t[0]},r(this,t[1]),this.metrics={}}),a.on("open-xhr-end",function(t,e){"loader_config"in NREUM&&"xpid"in NREUM.loader_config&&this.sameOrigin&&e.setRequestHeader("X-NewRelic-ID",NREUM.loader_config.xpid)}),a.on("send-xhr-start",function(t,n){var r=this.metrics,o=t[0],i=this;if(r&&o){var d=e(o);d&&(r.txSize=d)}this.startTime=(new Date).getTime(),this.listener=function(t){try{"abort"===t.type&&(i.params.aborted=!0),("load"!==t.type||i.called===i.totalCbs&&(i.onloadCalled||"function"!=typeof n.onload))&&i.end(n)}catch(e){try{a.emit("internal-error",e)}catch(r){}}};for(var f=0;u>f;f++)n.addEventListener(s[f],this.listener,!1)}),a.on("xhr-cb-time",function(t,e,n){this.cbTime+=t,e?this.onloadCalled=!0:this.called+=1,this.called!==this.totalCbs||!this.onloadCalled&&"function"==typeof n.onload||this.end(n)}),a.on("xhr-load-added",function(t,e){var n=""+d(t)+!!e;this.xhrGuids&&!this.xhrGuids[n]&&(this.xhrGuids[n]=!0,this.totalCbs+=1)}),a.on("xhr-load-removed",function(t,e){var n=""+d(t)+!!e;this.xhrGuids&&this.xhrGuids[n]&&(delete this.xhrGuids[n],this.totalCbs-=1)}),a.on("addEventListener-end",function(t,e){e instanceof XMLHttpRequest&&"load"===t[0]&&a.emit("xhr-load-added",[t[1],t[2]],e)}),a.on("removeEventListener-end",function(t,e){e instanceof XMLHttpRequest&&"load"===t[0]&&a.emit("xhr-load-removed",[t[1],t[2]],e)}),a.on("fn-start",function(t,e,n){e instanceof XMLHttpRequest&&("onload"===n&&(this.onload=!0),("load"===(t[0]&&t[0].type)||this.onload)&&(this.xhrCbStart=(new Date).getTime()))}),a.on("fn-end",function(t,e){this.xhrCbStart&&a.emit("xhr-cb-time",[(new Date).getTime()-this.xhrCbStart,this.onload,e],e)})}window.XMLHttpRequest&&XMLHttpRequest.prototype&&XMLHttpRequest.prototype.addEventListener&&!/CriOS/.test(navigator.userAgent)&&e()},{1:8,2:11,3:3,4:6,5:1,handle:"D5DuLP",loader:"G9z0Bl"}],8:[function(t,e){e.exports=function(t){var e=document.createElement("a"),n=window.location,r={};e.href=t,r.port=e.port;var o=e.href.split("://");return!r.port&&o[1]&&(r.port=o[1].split("/")[0].split(":")[1]),r.port&&"0"!==r.port||(r.port="https"===o[0]?"443":"80"),r.hostname=e.hostname||n.hostname,r.pathname=e.pathname,"/"!==r.pathname.charAt(0)&&(r.pathname="/"+r.pathname),r.sameOrigin=!e.hostname||e.hostname===document.domain&&e.port===n.port&&e.protocol===n.protocol,r}},{}],handle:[function(t,e){e.exports=t("D5DuLP")},{}],D5DuLP:[function(t,e){function n(t,e){var n=r[t];return n?n.apply(this,e):(o[t]||(o[t]=[]),void o[t].push(e))}var r={},o={};e.exports=n,n.queues=o,n.handlers=r},{}],11:[function(t,e){function n(t){if(!t||"object"!=typeof t&&"function"!=typeof t)return-1;if(t===window)return 0;if(o.call(t,"__nr"))return t.__nr;try{return Object.defineProperty(t,"__nr",{value:r,writable:!0,enumerable:!1}),r}catch(e){return t.__nr=r,r}finally{r+=1}}var r=1,o=Object.prototype.hasOwnProperty;e.exports=n},{}],loader:[function(t,e){e.exports=t("G9z0Bl")},{}],G9z0Bl:[function(t,e){function n(){var t=p.info=NREUM.info;if(t&&t.agent&&t.licenseKey&&t.applicationID&&u&&u.body){p.proto="https"===c.split(":")[0]||t.sslForHttp?"https://":"http://",a("mark",["onload",i()]);var e=u.createElement("script");e.src=p.proto+t.agent,u.body.appendChild(e)}}function r(){"complete"===u.readyState&&o()}function o(){a("mark",["domContent",i()])}function i(){return(new Date).getTime()}var a=t("handle"),s=window,u=s.document,d="addEventListener",f="attachEvent",c=(""+location).split("?")[0],p=e.exports={offset:i(),origin:c,features:[]};u[d]?(u[d]("DOMContentLoaded",o,!1),s[d]("load",n,!1)):(u[f]("onreadystatechange",r),s[f]("onload",n)),a("mark",["firstbyte",i()])},{handle:"D5DuLP"}],14:[function(t,e){function n(t,e,n){e||(e=0),"undefined"==typeof n&&(n=t?t.length:0);for(var r=-1,o=n-e||0,i=Array(0>o?0:o);++r<o;)i[r]=t[e+r];return i}e.exports=n},{}],15:[function(t,e){function n(t,e,r,s){function nrWrapper(){try{var n,a=u(arguments),d=this,f=r&&r(a,d)||{}}catch(c){i([c,"",[a,d,s],f])}o(e+"start",[a,d,s],f);try{return n=t.apply(d,a)}catch(p){throw o(e+"err",[a,d,p],f),p}finally{o(e+"end",[a,d,n],f)}}return a(t)?t:(e||(e=""),nrWrapper[n.flag]=!0,nrWrapper)}function r(t,e,r,o){r||(r="");var i,s,u,d="-"===r.charAt(0);for(u=0;u<e.length;u++)s=e[u],i=t[s],a(i)||(t[s]=n(i,d?s+r:r,o,s,t))}function o(t,e,n){try{s.emit(t,e,n)}catch(r){i([r,t,e,n])}}function i(t){try{s.emit("internal-error",t)}catch(e){}}function a(t){return!(t&&"function"==typeof t&&t.apply&&!t[n.flag])}var s=t(1),u=t(2);e.exports=n,n.inPlace=r,n.flag="nr@wrapper"},{1:1,2:14}]},{},["G9z0Bl",2,7]);</script>
+
+ <meta name="description" content="Get Shanghai, China current weather reports and conditions including temperature, RealFeel and precipitation from AccuWeather.com" />
+<link rel="canonical" href="http://www.accuweather.com/en/cn/shanghai/106577/current-weather/106577" />
+<meta name="keywords" content="Shanghai China, current weather, weather report" />
+<link rel="alternate" media="only screen and (max-width: 640px)" href="http://m.accuweather.com/en/cn/shanghai/106577/current-weather/106577" />
+<link rel="alternate" media="handheld" href="http://m.accuweather.com/en/cn/shanghai/106577/current-weather/106577" />
+
+ <meta name="viewport" content="width=988"/>
+ <link rel="stylesheet" href="http://vortex.accuweather.com/adc2010/stylesheets/site.min-20140501.css" type="text/css" media="all" />
+
+ <style type="text/css">
+ @media print{#header-davek,#header-links,#header-davek-2,#ad-prestitial-panel,#footer-nav,#offers,div.logo-ad,div.panel-ad-mr,div.ad-lr,#ad-links,#wrap-s .bt,.margusity,.column-2-r,.addthis_toolbox,body#news-news .column-2,body#news-news #news,body#news-news .panel-head-tabs-rt,#extras{display:none}body,#wrap,#wrap-content,.column-1,#panel-main,.strong .panel-body,.strong .panel-body-lt,.strong .panel-body-rt,.strong .panel-foot,.strong .panel-foot-lt,.strong .panel-foot-rt,.strong .panel-head,.strong .panel-head-lt,.strong .panel-head-rt{background:0}.clearfix{position:static;display:block}body#news-news .column-1{width:980px;float:none;}}
+ </style>
+
+ <link rel="shortcut icon" href="http://vortex.accuweather.com/adc2010/images/favicons/awx-2013-master.ico" />
+
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+
+ <style type="text/css">
+.flag-CN { background-image: url(http://vortex.accuweather.com/adc2010/images/flags/CN.png) !important;}
+.flag-US { background-image: url(http://vortex.accuweather.com/adc2010/images/flags/US.png) !important;}
+.flag-GB { background-image: url(http://vortex.accuweather.com/adc2010/images/flags/GB.png) !important;}
+ .i-11-header {background-image: url(http://vortex.accuweather.com/adc2010/images/header-bg-day/11-header.jpg);}
+ </style>
+
+<link rel="stylesheet" href="http://vortex.accuweather.com/adc2010/stylesheets/pages/forecast-extended.min-20111207.css" type="text/css" media="all" />
+<style type="text/css">
+.detail-tab-buttons li a span {
+padding: 6px 15px 0 18px;
+}
+</style>
+<style type="text/css">
+.i-11-xl{background-image:url(http://vortex.accuweather.com/adc2010/images/icons-numbered/11-xl.png)}
+.i-12-l{background-image:url(http://vortex.accuweather.com/adc2010/images/icons-numbered/12-l.png)} .i-18-l{background-image:url(http://vortex.accuweather.com/adc2010/images/icons-numbered/18-l.png)} .i-12-s{background-image:url(http://vortex.accuweather.com/adc2010/images/icons-numbered/12-s.png)} .i-18-s{background-image:url(http://vortex.accuweather.com/adc2010/images/icons-numbered/18-s.png)} .i-1-s{background-image:url(http://vortex.accuweather.com/adc2010/images/icons-numbered/01-s.png)} .i-6-s{background-image:url(http://vortex.accuweather.com/adc2010/images/icons-numbered/06-s.png)}
+</style>
+
+
+ <!--[if lte IE 6]>
+ <link rel="stylesheet" href="http://vortex.accuweather.com/adc2010/stylesheets/ie6.css" type="text/css" media="all" />
+ <script type="text/javascript" src="http://vortex.accuweather.com/adc2010/javascripts/ie6.js"></script>
+ <![endif]-->
+ <!--[if lt IE 7]>
+ <script defer type="text/javascript" src="http://vortex.accuweather.com/adc2010/javascripts/ie6_png_fix.js"></script>
+ <![endif]-->
+ <!--[if IE 7]><link rel="stylesheet" href="http://vortex.accuweather.com/adc2010/stylesheets/ie7.min-20130423.css" type="text/css" media="all" /><![endif]-->
+ <!--[if IE 8]><link rel="stylesheet" href="http://vortex.accuweather.com/adc2010/stylesheets/ie8.min-20130423.css" type="text/css" media="all" /><![endif]-->
+ <!--[if gte IE 9]><link rel="stylesheet" href="http://vortex.accuweather.com/adc2010/stylesheets/ie9.min-20121129.css" type="text/css" media="all" /><![endif]-->
+
+ <script type="text/javascript">
+ var apgUserInfoObj = {
+ country: 'CN',
+ city: 'Shanghai',
+ state: '31',
+ metro: '',
+ zip: '',
+ fcode: 'ZA80',
+ partner: 'accuweather',
+ sessionPartner: 'accuweather',
+ referer: '',
+ lang: 'en-us',
+ langid: '1',
+ lat: '31.23',
+ lon: '121.44',
+ dma: '',
+ ip: '202.120.52.45',
+ geo_dma: '',
+ geo_city: 'Shanghai',
+ geo_state: '31',
+ geo_zip: '',
+ geo_country: 'CN',
+ gmtOffset: '8',
+ locationKey: '106577'
+ };
+ var apgWxInfoObj = { nwsalrt: '', alerts: { source: '', category: '', typeid: '' }, isday: '1', lfs: { day: '1', category: '', severity: '2' }, hdln: '2', ut: '1', cu: { wx: '11', hi: '18', wd: '', hd: '', uv: '' }, fc: [{ wx: '', hi: '', lo: '' }, { wx: '', hi: '', lo: '' }, { wx: '', hi: '', lo: '' }], ix: {arthritis:'2',asthma:'2',bbq:'3',cold:'2',flu:'',lawnmowing:'4',migraine:'1',outdoor:'4',schoolclosing:'',sinus:'2',soil:'',field:'',beach:'1',biking:'4',concert:'2',construction:'3',composting:'2',dust:'1',fishing:'4',fueleconomy:'3',golf:'3',heart:'5',hiking:'4',hvac:'1',mosq:'1',sailing:'4',running:'4',schoolbus:'4',skiing:'1',star:'1',frizz:'0',pollen:'1',uvindex:'2',hunting:'4', driving:'2', travel:'4', airq:'0', pgrass:'1', pmold:'1', pweed:'1', ptree:'1' } };
+var aadCustomKeyValuePairs = {};
+ var apgConfigObj = {};
+ apgConfigObj.prompts = {};
+ </script>
+
+ <script type="text/javascript">
+ var acm_RecentLocationsCarousel= new Array();
+
+acm_RecentLocationsCarousel.push({name:'Shanghai, China', daypart:'day', href:'/en/cn/shanghai/106577/weather-forecast/106577', icon:'http://vortex.accuweather.com/adc2010/images/icons-numbered/11-m.png', bg:'f', temp:'18', realfeel:'20', text:'Light fog'});
+acm_RecentLocationsCarousel.push({name:'New York, NY', daypart:'night', href:'/en/us/new-york-ny/10017/weather-forecast/349727', icon:'http://vortex.accuweather.com/adc2010/images/icons-numbered/11-m.png', bg:'s', temp:'16', realfeel:'18', text:'Light fog'});
+acm_RecentLocationsCarousel.push({name:'Miami, FL', daypart:'night', href:'/en/us/miami-fl/33128/weather-forecast/347936', icon:'http://vortex.accuweather.com/adc2010/images/icons-numbered/38-m.png', bg:'s', temp:'26', realfeel:'26', text:'Mostly cloudy'});
+acm_RecentLocationsCarousel.push({name:'Los Angeles, CA', daypart:'night', href:'/en/us/los-angeles-ca/90012/weather-forecast/347625', icon:'http://vortex.accuweather.com/adc2010/images/icons-numbered/33-m.png', bg:'cl', temp:'17', realfeel:'18', text:'Clear'});
+
+ </script>
+
+ <script type="text/javascript">
+ var acm_InterestLayers = [
+{group:'1.1', name:'Cold & Flu', code:'10302', icon: 'cold-flu', href:'http://www.accuweather.com/en/cn/shanghai/106577/cold-flu-weather/106577', alarm:[3,4,5]},
+{group:'1.1', name:'Allergies', code:'10201', icon: 'allergies', href:'http://www.accuweather.com/en/cn/shanghai/106577/allergies-weather/106577', alarm:[3,4,5]},
+{group:'1.1', name:'Respiratory', code:'10301', icon: 'respiratory', href:'http://www.accuweather.com/en/cn/shanghai/106577/asthma-weather/106577', alarm:[3,4,5]},
+{group:'1.1', name:'Arthritis', code:'10102', icon: 'arthritis', href:'http://www.accuweather.com/en/cn/shanghai/106577/arthritis-weather/106577', alarm:[3,4,5]},
+{group:'1.1', name:'Migraine', code:'10101', icon: 'migraine', href:'http://www.accuweather.com/en/cn/shanghai/106577/migraine-weather/106577', alarm:[3,4,5]},
+{group:'1.1', name:'Sinus', code:'10103', icon: 'sinus', href:'http://www.accuweather.com/en/cn/shanghai/106577/sinus-weather/106577', alarm:[3,4,5]},
+{group:'1.2', name:'Travel', code:'20501', icon: 'travel', href:'http://www.accuweather.com/en/cn/shanghai/106577/air-travel-weather/106577', alarm:[1]},
+{group:'1.2', name:'Astronomy', code:'40501', icon: 'astro', href:'http://www.accuweather.com/en/cn/shanghai/106577/astronomy-weather/106577', alarm:[1]},
+{group:'1.2', name:'Events', code:'41001', icon: 'events', href:'http://www.accuweather.com/en/cn/shanghai/106577/events-weather/106577', alarm:[1]},
+{group:'2.1', name:'Driving', code:'20401', icon: 'driving', href:'http://www.accuweather.com/en/cn/shanghai/106577/driving-weather/106577', alarm:[1]},
+{group:'2.1', name:'School Day', code:'30401', icon: 'school', href:'http://www.accuweather.com/en/cn/shanghai/106577/school-day-weather/106577', alarm:[1]},
+{group:'2.1', name:'Hair Day', code:'30301', icon: 'hair', href:'http://www.accuweather.com/en/cn/shanghai/106577/hair-day-weather/106577', alarm:[3,4,5]},
+{group:'2.1', name:'Snow Days', code:'30402', icon: 'snow', href:'http://www.accuweather.com/en/cn/shanghai/106577/snow-day-weather/106577', alarm:[4,5]},
+{group:'2.2', name:'D.I.Y.', code:'30101', icon: 'diy', href:'http://www.accuweather.com/en/cn/shanghai/106577/diy-weather/106577', alarm:[1]},
+{group:'2.2', name:'Lawn & Garden', code:'30201', icon: 'lawn-garden', href:'http://www.accuweather.com/en/cn/shanghai/106577/lawn-garden-weather/106577', alarm:[1]},
+{group:'2.2', name:'Home Energy', code:'30501', icon: 'home-energy', href:'http://www.accuweather.com/en/cn/shanghai/106577/home-energy-weather/106577', alarm:[1]},
+{group:'2.2', name:'Entertaining', code:'40102', icon: 'entertaining', href:'http://www.accuweather.com/en/cn/shanghai/106577/outdoor-entertaining-weather/106577', alarm:[1]},
+{group:'3.1', name:'Golf', code:'40201', icon: 'golf', href:'http://www.accuweather.com/en/cn/shanghai/106577/golf-weather/106577', alarm:[1]},
+{group:'3.1', name:'Ski', code:'40301', icon: 'ski', href:'http://www.accuweather.com/en/cn/shanghai/106577/ski-weather/106577', alarm:[1]},
+{group:'3.1', name:'Hunting', code:'40601', icon: 'hunting', href:'http://www.accuweather.com/en/cn/shanghai/106577/hunting-weather/106577', alarm:[1]},
+{group:'3.1', name:'Fishing', code:'40602', icon: 'fishing', href:'http://www.accuweather.com/en/cn/shanghai/106577/fishing-weather/106577', alarm:[1]},
+{group:'3.1', name:'Running', code:'40901', icon: 'running', href:'http://www.accuweather.com/en/cn/shanghai/106577/running-weather/106577', alarm:[1]},
+{group:'3.1', name:'Hiking', code:'40903', icon: 'hiking', href:'http://www.accuweather.com/en/cn/shanghai/106577/hiking-weather/106577', alarm:[1]},
+{group:'3.1', name:'Biking', code:'40902', icon: 'biking', href:'http://www.accuweather.com/en/cn/shanghai/106577/biking-weather/106577', alarm:[1]},
+{group:'3.1', name:'Sun & Sand', code:'40401', icon: 'sun-sand', href:'http://www.accuweather.com/en/cn/shanghai/106577/sun-sand-weather/106577', alarm:[1]},
+{group:'3.1', name:'Sailing', code:'40402', icon: 'sailing', href:'http://www.accuweather.com/en/cn/shanghai/106577/sailing-weather/106577', alarm:[1]}];
+ </script>
+
+ <script type="text/javascript" src="http://vortex.accuweather.com/adc2010/javascripts/lib.min-20121129.js"></script>
+
+<script type="text/javascript">
+ var apgPageInfoObj = { ad_site: 'world',
+ section: 'forecast',
+ ad_section: 'forecast',
+ page: 'forecast-current-conditions',
+ ad_page: 'current-conditions',
+ page_code: '',
+ crumb_trail: ['Forecast', 'CurrentConditions', 'CN', 'Shanghai', 'Shanghai'],
+ pageType: 'forecast',
+ pageExt: '', adPos: { atf728: true, atfPencil: true, atf300: true, atf160: false, btf728: true, btf300: true, popunder: true, prestitial: true, links: true, ptoSkin: true } };
+
+apgWxInfoObj.cu.wx = '11';apgWxInfoObj.cu.hi = '19';apgWxInfoObj.cu.wd = '17';apgWxInfoObj.cu.hd = '88';apgWxInfoObj.cu.uv = '4'; apgWxInfoObj.fc = [{ wx: '12', hi: '22', lo: '19' },
+ { wx: '18', hi: '23', lo: '17' },
+ { wx: '1', hi: '26', lo: '16' }];
+</script>
+
+ <script type="text/javascript" src="http://vortex.accuweather.com/adc2010/javascripts/site.min-20140417.js"></script>
+ <!--[if lte IE 8]>
+ <script>acm.isOldIE = true;</script>
+ <![endif]-->
+ <script type="text/javascript" src="http://vortex.accuweather.com/adc2010/javascripts/ads.min-20140331.js"></script>
+
+
+ <script type="text/javascript">
+ var settingsCke = "acm";
+ sj_SelectCountry = "Select a Country";
+
+ function acmCitySubmit(key) {
+
+ var s_value = document.getElementById('s').value;
+ if (s_value == "Enter postal code or city...") {
+ return false;
+ }
+
+ if (s_value === "") {
+ return false;
+ }
+ var isKeyPress = (key) ? 'EnterKey' : 'ButtonClick';
+
+ if (s_value == "Shanghai, China") {
+ _gaq.push(['_trackEvent', 'LocationBox', 'DefaultLocation', s_value.toLowerCase()]);
+ setTimeout(function () {
+ window.location.href = 'http://www.accuweather.com/en/cn/shanghai/106577/weather-forecast/106577';
+ }, 50);
+ } else {
+ _gaq.push(['_trackEvent', 'LocationBox', 'SearchLocation', s_value.toLowerCase()]);
+ //setTimeout(function () {
+ // document.forms["findcity"].submit();
+ //}, 50);
+ // Execute it right away to prevent double-submit.
+ document.forms["findcity"].submit();
+ }
+ }
+
+
+ </script>
+
+ <script type="text/javascript">
+ _gaq.push(['_setCustomVar', 10, 'SkyMotion', '1', 3]);
+ </script>
+
+ <!-- Begin comScore Tag -->
+ <script>
+ var _comscore = _comscore || [];
+ _comscore.push({ c1: "2", c2: "6005068" });
+ (function () {
+ var s = document.createElement("script"), el = document.getElementsByTagName("script")[0]; s.async = true;
+ s.src = (document.location.protocol == "https:" ? "https://sb" : "http://b") + ".scorecardresearch.com/beacon.js";
+ el.parentNode.insertBefore(s, el);
+ })();
+ </script>
+ <!-- End comScore Tag -->
+
+ <script type="text/javascript">
+ (function () {
+ var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
+ ga.src = ('https:' == document.location.protocol ? 'https://' : 'http://') + 'stats.g.doubleclick.net/dc.js';
+ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
+ })()
+ </script>
+ <script>
+ if (typeof (aadObj) == 'undefined') {
+ _gaq.push(['_setCustomVar', 47, 'Ads_JS_Not_Loaded', apgUserInfoObj.sessionPartner, 3]);
+ }
+
+ _gaq.push(['_trackPageview']);
+ </script>
+</head>
+<body id="forecast-extended" class="forecast">
+ <style type="text/css">
+ #cobrand-banner-wrap-head{border-bottom:#D1D4D9 2px solid;}
+ #cobrand-banner-head{width:900px;margin:0px auto;height:40px;overflow:hidden;}
+ </style>
+ <div id="cobrand-banner-wrap-head">
+ <div id="cobrand-banner-head">
+ <style>#cobrand-banner-wrap-head{background:#ffffff !important}.cobrand-header{background:#FFF;width:100%;height:40px;}.cobrand-header .cobrand-header-container{width:90%;height:40px;margin:0 auto;clear:both}.cobrand-header .cobrand-header-container .logo{width:20%;float:left;height:40px;background-image:url(http://vortex.accuweather.com/adc2010/images/cobrand-partners/ARC-logo.jpg);background-size:contain;background-repeat:no-repeat}.cobrand-header .cobrand-header-container p{width:60%;padding-top:10px;margin:0 auto;text-align:center;display:inline-block;float:left;color:#d2341d;font-size: 16px;}.cobrand-header .cobrand-header-container span{width:20%;height:27px;padding-top:13px;display:inline-block;text-align:center;font-size:12px;color:#000;background: url(http://vortex.accuweather.com/adc2010/images/cobrand-partners/ACR-cta-btn.png) no-repeat 10px center}.lt-728 .cobrand-header .cobrand-header-container p{font-size:14px}.cobrand-header a{text-decoration:none;margin:0;padding:0;}.lt-728 .cobrand-header .cobrand-header-container span{background:red;color:#fff}.lt-623 .cobrand-header .cobrand-header-container .logo{width:10%;background-image:url(http://vortex.accuweather.com/adc2010/images/cobrand-partners/ARC-logo-sm.jpg)}.lt-623 .cobrand-header .cobrand-header-container p{width:70%;font-size:13px;line-height:12px}.lt-479 .cobrand-header .cobrand-header-container p{font-size:12px;line-height:12px;padding:10px 5% 0 5%;width:60%}</style><div class="cobrand-header"><a href="http://www.redcross.org/cm/accuweather-pub" target="_blank"><div class="cobrand-header-container"><div class="logo"></div><p>Help The Arkansas Tornado Relief Effort</p><span>Donate Now</span></div></a></div>
+ </div>
+ </div>
+
+<span id="dynamic-menu-container"></span>
+<div id="menu-cities" class="menu menu-list add-interest-menu">
+ <div class="menu-head-lt">
+ <div class="menu-head-rt">
+ <div class="menu-head"></div>
+ </div>
+ </div>
+ <!-- /.menu-head-lt -->
+ <div class="menu-body-lt">
+ <div class="menu-body-rt">
+ <div class="menu-body">
+ <ul class="menu-items">
+ <li><a href="http://www.accuweather.com/en/cn/shanghai/106577/weather-forecast/106577">Shanghai, China</a></li>
+ <li><a href="http://www.accuweather.com/en/us/new-york-ny/10017/weather-forecast/349727">New York, NY</a></li>
+ <li><a href="http://www.accuweather.com/en/us/miami-fl/33128/weather-forecast/347936">Miami, FL</a></li>
+ <li><a href="http://www.accuweather.com/en/us/los-angeles-ca/90012/weather-forecast/347625">Los Angeles, CA</a></li>
+ <li><a href="http://www.accuweather.com/en/browse-locations">Browse for your location</a></li>
+ </ul>
+ <span class="arrow"></span><span class="arrow-border"></span>
+ </div>
+ </div>
+ </div>
+ <!-- /.menu-body-lt -->
+ <div class="menu-foot-lt">
+ <div class="menu-foot-rt">
+ <div class="menu-foot"></div>
+ </div>
+ </div>
+ <!-- /.menu-foot-lt -->
+</div>
+
+<!-- NEW! menu -->
+<div id="current-city-menu" class="menu menu-list add-interest-menu">
+ <div class="menu-head-lt"><div class="menu-head-rt"><div class="menu-head"></div></div></div><!-- /.menu-head-lt -->
+ <div class="menu-body-lt">
+ <div class="menu-body-rt">
+ <div class="menu-body">
+ <ul>
+ <li><a href="http://www.accuweather.com/en/cn/shanghai/106577/weather-forecast/106577">Today's Weather</a></li>
+ <li><a href="http://www.accuweather.com/en/cn/shanghai/106577/hourly-weather-forecast/106577">Hourly Forecast</a></li>
+ <li><a href="http://www.accuweather.com/en/cn/shanghai/106577/daily-weather-forecast/106577">Extended</a></li>
+ <li><a href="http://www.accuweather.com/en/cn/shanghai/106577/weekend-weather/106577">Weekend</a></li>
+ <li><a href="http://www.accuweather.com/en/cn/shanghai/106577/may-weather/106577">Month Outlook</a></li>
+ <li><a href="http://www.accuweather.com/en/cn/shanghai/106577/current-weather/106577">Current Weather</a></li>
+ </ul>
+ <span class="arrow"></span>
+ <span class="arrow-border"></span>
+ </div>
+ </div>
+ </div>
+ <!-- /.menu-body-lt -->
+ <div class="menu-foot-lt"><div class="menu-foot-rt"><div class="menu-foot"></div></div></div><!-- /.menu-foot-lt -->
+
+</div>
+<!-- #/current-city-menu --> <div id="current-country-menu" class="menu menu-list add-interest-menu">
+ <div class="menu-head-lt">
+ <div class="menu-head-rt">
+ <div class="menu-head"></div>
+ </div>
+ </div>
+ <!-- /.menu-head-lt -->
+ <div class="menu-body-lt">
+ <div class="menu-body-rt">
+ <div class="menu-body">
+ <ul>
+ <li class="first"><a href="http://www.accuweather.com/en/cn/china-weather">Home</a></li>
+ </ul>
+ <ul>
+ <li class="first"><a href="http://www.accuweather.com/en/cn/national/satellite">Maps</a></li>
+ <li><a href="http://www.accuweather.com/en/cn/national/satellite">Satellite</a></li>
+ <li><a href="http://www.accuweather.com/en/cn/national/weather-forecast-maps">Weather Forecast Maps</a></li>
+ </ul>
+ <ul>
+ <li class="first"><a href="http://www.accuweather.com/en/weather-news">News & Video</a></li>
+ <li><a href="http://www.accuweather.com/en/weather-news">Weather News</a></li>
+ <li><a href="http://www.accuweather.com/en/weather-video">Weather Video</a></li>
+ <li><a href="http://www.accuweather.com/en/weather-blogs">Weather Blogs</a></li>
+ <li><a href="http://www.accuweather.com/en/personalities">Personalities</a></li>
+ </ul>
+ <ul>
+ <li class="first"><a href="http://www.accuweather.com/en/climate-change">Extreme Weather</a></li>
+ <li><a href="http://www.accuweather.com/en/climate-change">Climate Change</a></li>
+ </ul>
+ <ul>
+ <li class="first"><a href="http://www.accuweather.com/en/social">Social</a></li>
+ <li><a href="http://www.accuweather.com/en/social">Social Media</a></li>
+ <li><a href="http://www.accuweather.com/en/downloads">Apps & Downloads</a></li>
+ <li><a href="http://photo.accuweather.com">Weather Photos</a></li>
+ <li><a href="http://forums.accuweather.com">Weather Forums</a></li>
+ </ul>
+ <div class="clearfix"></div>
+ <span class="arrow"></span> <span class="arrow-border"></span> </div>
+ </div>
+ </div>
+ <!-- /.menu-body-lt -->
+ <div class="menu-foot-lt">
+ <div class="menu-foot-rt">
+ <div class="menu-foot"></div>
+ </div>
+ </div>
+ <!-- /.menu-foot-lt -->
+</div>
+<!-- #/current-country-menu --> <div id="menu-premium" class="menu menu-with-title">
+ <h3 class="menu-title"><span>Login</span></h3>
+ <div class="menu-head-lt">
+ <div class="menu-head-rt">
+ <div class="menu-head"></div>
+ </div>
+ </div>
+ <!-- /.menu-head-lt -->
+ <div class="menu-body-lt">
+ <div class="menu-body-rt">
+ <div class="menu-body">
+ <ul class="menu-items">
+ <li><a href="https://wwwl.AccuWeather.com/premium_login.php" target="_blank">AccuWeather.com Premium</a></li>
+
+ <li><a href="https://wwwl.AccuWeather.com/pro_login.php" target="_blank">AccuWeather.com Professional</a></li>
+ <li><a href="http://radarplus.accuweather.com/" target="_blank">AccuWeather.com RadarPlus</a></li>
+ <li><a href="http://www.accuweather.com/adcbin/public/LightningPlus_Benefits.asp" target="_blank">AccuWeather.com LightningPlus</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <!-- /.menu-body-lt -->
+ <div class="menu-foot-lt">
+ <div class="menu-foot-rt">
+ <div class="menu-foot"></div>
+ </div>
+ </div>
+ <!-- /.menu-foot-lt -->
+</div>
+
+
+<div id="menu-settings" class="menu menu-with-title">
+
+ <h3 class="menu-title"><span></span></h3>
+
+ <div class="menu-head-lt">
+ <div class="menu-head-rt">
+ <div class="menu-head"></div>
+ </div>
+ </div>
+ <!-- /.menu-head-lt -->
+ <div class="menu-body-lt">
+ <div class="menu-body-rt">
+ <div class="menu-body">
+
+ <h4>My Settings</h4>
+
+ <div class="control-wrap">
+
+ <form action="" method="post" autocomplete="false">
+
+ <label for="settings-language"></label>
+ <select id="settings-language" name="language" class="match-toggle" onchange="acm_updateLanguage(this.options[this.selectedIndex].value, (this.selectedIndex+1));">
+ <option value="en-us">English (US)</option>
+<option value="es">Espa&#241;ol</option>
+<option value="fr">Fran&#231;ais</option>
+<option value="da">Dansk</option>
+<option value="pt">Portugu&#234;s</option>
+<option value="nl">Nederlands</option>
+<option value="no">Norsk</option>
+<option value="it">Italiano</option>
+<option value="de">Deutsch</option>
+<option value="sv">Svenska</option>
+<option value="fi">Suomi</option>
+<option value="zh-hk">中文 (HK)</option>
+<option value="zh-cn">中文 (SIM)</option>
+<option value="zh-tw">中文 (Taiwan)</option>
+<option value="es-ar">Espa&#241;ol (Argentina)</option>
+<option value="es-mx">Espa&#241;ol (Latin America)</option>
+<option value="sk">Slovenčinu</option>
+<option value="ro">Romana</option>
+<option value="cs">Čeština</option>
+<option value="hu">Magyar</option>
+<option value="pl">Polski</option>
+<option value="ca">Catal&#224;</option>
+<option value="pt-br">Portugu&#234;s (Brazil)</option>
+<option value="hi">हिन्दी</option>
+<option value="ru">русский</option>
+<option value="ar">عربي</option>
+<option value="el">Ελληνικά</option>
+<option value="en-gb">English (UK)</option>
+<option value="ja">日本語</option>
+<option value="ko">한국어</option>
+<option value="tr">T&#220;RK&#199;E</option>
+<option value="fr-ca">Fran&#231;ais (Canada)</option>
+<option value="he">עברית</option>
+<option value="sl">Slovenski</option>
+<option value="uk">Українське</option>
+<option value="id">Bahasa Indonesia</option>
+<option value="bg">български</option>
+<option value="et">Eesti keeles</option>
+<option value="hr">Hrvatski</option>
+<option value="kk">Қазақша</option>
+<option value="lt">Lietuvių</option>
+<option value="lv">Latviski</option>
+<option value="mk">Македонски</option>
+<option value="ms">Bahasa Melayu</option>
+<option value="tl">Tagalog</option>
+<option value="sr">Srpski</option>
+<option value="th">ไทย</option>
+<option value="vi">Tiếng Việt</option>
+
+ </select>
+
+ </div>
+ <!-- /.control-wrap -->
+
+ <div id="radio-toggle-temp-unit" class="radio-toggle">
+ <label for="settings-temp-unit-farenheit" class="first">
+ <span>&deg;F</span>
+ <input id="settings-temp-unit-farenheit" name="temp_unit" type="radio" value="farenheit" onclick="acm_updateUnits('0');"/>
+ </label>
+
+ <label for="settings-temp-unit-celsius" class="last">
+ <span>&deg;C</span>
+ <input id="settings-temp-unit-celsius" name="temp_unit" type="radio" checked="checked" value="celsius" onclick="acm_updateUnits('1');"/>
+ </label>
+ </div>
+ <!-- /.radio-toggle -->
+
+ </form>
+
+ </div>
+ </div>
+ </div>
+ <!-- /.menu-body-lt -->
+
+ <div class="menu-foot-lt">
+ <div class="menu-foot-rt">
+ <div class="menu-foot"></div>
+ </div>
+ </div>
+ <!-- /.menu-foot-lt -->
+
+</div>
+<!-- /#settings-menu --> <div id="menu-country" class="menu menu-with-title">
+
+ <h3 class="menu-title"><span><span class="flag-CN">China</span></span></h3>
+
+ <div class="menu-head-lt">
+ <div class="menu-head-rt">
+ <div class="menu-head"></div>
+ </div>
+ </div>
+ <!-- /.menu-head-lt -->
+ <div class="menu-body-lt">
+ <div class="menu-body-rt">
+ <div class="menu-body">
+
+ <h4>My Recent Countries</h4>
+
+ <ul class="menu-items">
+ <li><a href="http://www.accuweather.com/en/cn/china-weather" class="flag-CN">China</a></li>
+ <li><a href="http://www.accuweather.com/en/us/united-states-weather" class="flag-US">United States</a></li>
+ <li><a href="http://www.accuweather.com/en/gb/united-kingdom-weather" class="flag-GB">United Kingdom</a></li>
+ </ul>
+
+ <a href="#country-selector" id="bt-more-countries">More Countries</a>
+
+ </div>
+ </div>
+ </div>
+ <!-- /.menu-body-lt -->
+
+ <div class="menu-foot-lt">
+ <div class="menu-foot-rt">
+ <div class="menu-foot"></div>
+ </div>
+ </div>
+ <!-- /.menu-foot-lt -->
+
+</div>
+<!-- /#menu-country -->
+<!-- add interest dropdown -->
+<div id="add-interest-dropdown" class="clearfix">
+
+ <div id="inner-content" class="clearfix">
+ </div><!-- end add-interest-inner-content -->
+
+ <!-- icons -->
+ <span class="arrow"></span>
+ <span class="arrow-border"></span>
+ <!-- end icons -->
+
+</div><!-- end id="add-interest-dropdown" -->
+
+<div id="wrap" class="spring h-f">
+ <div id="wrap-header-nav" class="day">
+ <div id="header-nav" class="i-11-header">
+
+
+<div id="header">
+
+ <div id="header-davek">
+ <div id="header-davek-ps"></div>
+ <script type="text/javascript">
+ acm.loadAd(aadTags, 'tile1', '#header-davek-ps', '90px');
+ </script>
+ </div>
+
+ <!-- /#header-ad -->
+ <style type="text/css">
+ #header-nav{overflow:visible;position:static;height:auto;}
+ #header-davek{margin-top:0px;padding-top:4px;}
+ </style>
+
+<div id="wrap-country-settings">
+ <div id="country-settings">
+ <a href="#menu-country" id="bt-menu-country" class="menu-arrow tmenu { el:'#menu-country', affix: { from: 'nw', to: 'nw', offset: [ -6, -8 ] } }"><strong><span class="ir flag-CN">China</span></strong></a>
+ <ul id="country-breadcrumbs">
+
+ <li class="first"><a href="http://www.accuweather.com/en/world-weather">World</a></li>
+ <li><a href="http://www.accuweather.com/en/asia-weather">Asia</a></li>
+ <li><a href="http://www.accuweather.com/en/cn/china-weather">China</a></li>
+ <li><a href="http://www.accuweather.com/en/cn/31/shanghai-weather">Shanghai</a></li>
+ <li class="last"><a href="http://www.accuweather.com/en/cn/shanghai/106577/weather-forecast/106577">Shanghai</a></li>
+ </ul>
+ <!-- /#country-breadcrumbs -->
+ </div>
+ <!-- /#nav-country -->
+</div>
+<!-- /#wrap-nav-country -->
+
+<div id="country-selector" class="strong panel">
+
+ <div class="panel-head-lt"><div class="panel-head-rt"><div class="panel-head"></div></div></div>
+ <div class="panel-body-lt">
+ <div class="panel-body-rt">
+ <div class="panel-body">
+ <div class="title">
+ <button class="bt bt-panel-close">Close</button>
+ <div id="country-selector-recent">
+ <h3>My Recent Countries</h3>
+ <ul>
+ <li class="first"><a href="http://www.accuweather.com/en/cn/china-weather" class="flag-CN">China</a></li>
+ <li class=""><a href="http://www.accuweather.com/en/us/united-states-weather" class="flag-US">United States</a></li>
+ <li class=""><a href="http://www.accuweather.com/en/gb/united-kingdom-weather" class="flag-GB">United Kingdom</a></li>
+ </ul>
+ </div>
+ <!-- /#country-selector-recent -->
+ </div>
+ <!-- /.title -->
+
+ <div id="country-selector-region" class="panel-content">
+
+ <div class="title">
+ <h3>Select a Region</h3>
+ </div>
+
+ <div class="content">
+
+ <ul id="country-selector-region-list" class="menu-items">
+ <li><a class="link-region" id="link-region-afr" href="#region-afr">Africa</a></li>
+ <li><a class="link-region" id="link-region-ant" href="#region-ant">Antarctica</a></li>
+ <li><a class="link-region" id="link-region-arc" href="#region-arc">Arctic</a></li>
+ <li><a class="link-region" id="link-region-asi" href="#region-asi">Asia</a></li>
+ <li><a class="link-region" id="link-region-cac" href="#region-cac">Central America</a></li>
+ <li><a class="link-region" id="link-region-eur" href="#region-eur">Europe</a></li>
+ <li><a class="link-region" id="link-region-mea" href="#region-mea">Middle East</a></li>
+ <li><a class="link-region" id="link-region-nam" href="#region-nam">North America</a></li>
+ <li><a class="link-region" id="link-region-ocn" href="#region-ocn">Oceania</a></li>
+ <li><a class="link-region" id="link-region-sam" href="#region-sam">South America</a></li>
+ </ul>
+ <!-- /#country-selector-region-list -->
+
+ <div id="country-selector-region-map">
+ </div>
+ <!-- /#country-selector-region-map -->
+ </div>
+ <!-- /.content -->
+ </div>
+ <!-- /#country-selector-region -->
+
+
+ <div id="country-selector-country" class="panel-content">
+ <div id="region-afr" class="region">
+ <div class="title"> <a href="#country-selector-region" class="world"><span>World</span></a>
+ <h3></h3>
+ </div>
+ <div class="items"> </div>
+ </div>
+ <!-- /africa-->
+ <div id="region-eur" class="region">
+ <div class="title"> <a href="#country-selector-region" class="world"><span>World</span></a>
+ <h3></h3>
+ </div>
+ <div class="items"> </div>
+ </div>
+ <!-- /europe-->
+ <div id="region-nam" class="region">
+ <div class="title"> <a href="#country-selector-region" class="world"><span>World</span></a>
+ <h3></h3>
+ </div>
+ <div class="items"> </div>
+ </div>
+ <!-- /north america-->
+ <div id="region-sam" class="region">
+ <div class="title"> <a href="#country-selector-region" class="world"><span>World</span></a>
+ <h3></h3>
+ </div>
+ <div class="items"> </div>
+ </div>
+ <!-- /south america-->
+ <div id="region-cac" class="region">
+ <div class="title"> <a href="#country-selector-region" class="world"><span>World</span></a>
+ <h3></h3>
+ </div>
+ <div class="items"> </div>
+ </div>
+ <!-- /central america-->
+ <div id="region-ocn" class="region">
+ <div class="title"> <a href="#country-selector-region" class="world"><span>World</span></a>
+ <h3></h3>
+ </div>
+ <div class="items"> </div>
+ </div>
+ <!-- /oceania-->
+ <div id="region-mea" class="region">
+ <div class="title"> <a href="#country-selector-region" class="world"><span>World</span></a>
+ <h3></h3>
+ </div>
+ <div class="items"> </div>
+ </div>
+ <!-- /middle east-->
+ <div id="region-ant" class="region">
+ <div class="title"> <a href="#country-selector-region" class="world"><span>World</span></a>
+ <h3></h3>
+ </div>
+ <div class="items"> </div>
+ </div>
+ <!-- /antarctica-->
+ <div id="region-arc" class="region">
+ <div class="title"> <a href="#country-selector-region" class="world"><span>World</span></a>
+ <h3></h3>
+ </div>
+ <div class="items"> </div>
+ </div>
+ <!-- /arctic-->
+ <div id="region-asi" class="region">
+ <div class="title"> <a href="#country-selector-region" class="world"><span>World</span></a>
+ <h3></h3>
+ </div>
+ <div class="items"> </div>
+ </div>
+ <!-- /asia-->
+ </div>
+ <!-- /#country-selector-country -->
+
+
+ <div id="country-selector-notes">
+ <p class="first">
+ Note: Select a region before finding a country.
+ </p>
+
+ <p></p>
+
+ </div>
+ <!-- /#country-selector-notes -->
+
+
+ </div>
+ </div>
+ </div>
+ <!-- /.panel-body-lt -->
+
+ <div class="panel-foot-lt"><div class="panel-foot-rt"><div class="panel-foot"></div></div></div>
+
+</div>
+<!-- / #country-selector -->
+
+
+ <div id="header-logo-search" class="clearfix">
+ <div id="header-logo" class="ir huafeng"><span>Shanghai Current Weather<span class="huafeng"></span></span></div>
+ <label for="s">for</label>
+
+ <div id="wrap-s-rt">
+ <div id="wrap-s-lt">
+ <div id="wrap-s" class="tmenu { affix: {offset: [ 0, 7 ], to: 'sw', from: 'nw'},el: '#menu-cities' }">
+ <form id="findcity" action="http://www.accuweather.com/en/search-locations" method="post">
+ <input onkeypress="acmCheckEnter(event);" id="s" name="s" type="text" autocomplete="off"
+ class="text hint { help: 'Shanghai, China',className:'hintedLoc' }" />
+ <input type="hidden" name="rn" value="3day" />
+ <button onclick="acmCitySubmit()" type="button" class="bt bt-go">
+ <div></div>
+ </button>
+ </form>
+ <script type="text/javascript">
+ (function ($) {
+ $('input.hint').hint();
+ })(jQuery);
+ </script>
+ </div>
+ </div>
+ </div>
+ <!-- /#wrap-s-rt -->
+
+ <!-- NEW! Removed widgets to accommodate login -->
+ <!-- NEW! Login menu -->
+ <a id="bt-menu-login" class="tmenu { el:'#menu-premium', affix: { to: 'ne', from: 'ne', offset: [ 0,-6 ] } }"><span class="menu-arrow"><span>Login</span></span></a>
+ <!-- NEW! moving menu settings here, which affects css -->
+ <a id="bt-menu-settings" class="tmenu { el:'#menu-settings', affix: { from: 'ne', to: 'ne', offset: [ 0,-6 ] } }"><span class="menu-arrow"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>, &deg;C</span></a>
+
+
+ </div>
+ <!-- /#header-logo-search -->
+</div>
+<!-- /#header -->
+
+ </div>
+ <!-- /#header-nav -->
+ </div>
+ <!-- /#wrap-header-nav -->
+
+
+ <div id="wrap-content">
+ <div id="content">
+
+<!-- NEW! adding add-interest tab -->
+<div id="nav-main-add-interests" class="clearfix">
+
+ <div id="nav-main-background"></div>
+
+ <ul id="nav-current-location" class="sub-nav">
+ <li id="current-country-tab" class=" tmenu { affix: {offset: [ 0, 5 ], to: 'sw', from: 'nw' }, el: '#current-country-menu' }">
+ <a href="http://www.accuweather.com/en/cn/china-weather" class="tab">
+ <span class="current-country">China</span>
+ <span class="title">Weather</span>
+ </a>
+ <span class="bottom-line"></span>
+ </li>
+ <li id="current-city-tab" class="selected tmenu { affix: {offset: [ 0, 5 ], to: 'sw', from: 'nw'}, el: '#current-city-menu' }">
+ <a href="http://www.accuweather.com/en/cn/shanghai/106577/weather-forecast/106577" class="tab">
+ <span class="current-city"><h1>Shanghai, CN</h1></span>
+ <span class="title"><h2>Local Weather</h2></span>
+ <span class="divider"></span>
+ <span class="more-info-arrow"></span>
+ <div class="more-info-content">
+ </div><!-- end more-info-content -->
+ </a>
+ </li>
+ <li id="locations-dropdown-tab" class="location-menu { el: '#locations-dropdown-menu' }">
+ <a href="#" class="tab">
+ <span class="arrow"></span>
+ <span class="divider"></span>
+ </a>
+ <span class="cover-line"></span>
+ </li>
+ </ul><!-- end nav-current-location -->
+
+
+ <!-- New! locations dropdown menu -->
+ <div id="locations-dropdown-menu" class="menu">
+ <div class="outer-border">
+ <div id="locations-carousel" class="locations-carousel">
+ <button class="carousel-button carousel-left disabled">
+ <span class="inner-button">
+ <span class="arrow"></span>
+ </span><!-- end inner-button-->
+ </button>
+ <button class="carousel-button carousel-right">
+ <span class="inner-button">
+ <span class="arrow"></span>
+ </span><!-- end inner-button-->
+ </button>
+ <div class="outer-carousel">
+ <div class="inner-carousel clearfix">
+
+ <div class="my-recent-locations clearfix">
+ <h3>My Recent Locations</h3>
+ <ul>
+
+ </ul>
+ </div><!-- end my recent locations -->
+
+ </div><!-- end inner-carousel-->
+ </div><!-- end outer-carousel -->
+ </div><!-- end carousel -->
+ </div><!-- outer-border -->
+ </div><!-- end locations-dropdown-menu -->
+
+</div><!-- end nav-main-add-interests-->
+
+<script type="text/javascript">
+ acm.setupMenus();
+</script>
+
+
+
+
+<div class="subnav-head-tabs-rt clearfix">
+ <div class="subnav-head-tabs-lt clearfix">
+ <ul class="subnav-tab-buttons">
+
+
+ <li ><a href="http://www.accuweather.com/en/cn/shanghai/106577/weather-forecast/106577"><span>Now</span></a></li>
+ <li ><a href="http://www.accuweather.com/en/cn/shanghai/106577/weekend-weather/106577"><span>Weekend</span></a></li>
+ <li class="current"><a href="http://www.accuweather.com/en/cn/shanghai/106577/daily-weather-forecast/106577"><span><strong>Extended</strong></span></a><div class="nub"></div></li>
+ <li ><a href="http://www.accuweather.com/en/cn/shanghai/106577/may-weather/106577"><span>Month</span></a></li>
+ <li class="last"><a href="http://www.accuweather.com/en/cn/shanghai/106577/satellite/106577"><span>Satellite</span></a></li>
+
+
+ </ul>
+ </div>
+</div>
+<!-- /.panel-head-rt -->
+
+<div class="column-1 clearfix">
+ <div id="panel-main" class="strong panel">
+ <!-- NOTE: The left and right ordering is swapped for this one, since it's a two element stretch! -->
+ <div class="panel-head-rt">
+ <div class="panel-head-lt">
+ </div>
+ </div>
+ <!-- /.panel-head-rt -->
+ <div class="panel-body-lt">
+ <div class="panel-body-rt">
+ <div class="panel-body">
+
+
+<div class="feed-controls clearfix">
+ <span class="lt">1 - 5 of 45 days | <a href="http://www.accuweather.com/en/cn/shanghai/106577/month/106577?view=table">All 45 days</a></span>
+ <ul class="g g-nav rt">
+ <li class="first"><a href="http://www.accuweather.com/en/cn/shanghai/106577/daily-weather-forecast/106577?day=6">Next 5 &gt;</a></li>
+ </ul>
+</div>
+<!-- /.feed-controls -->
+
+<div id="feed-tabs">
+ <a href="http://www.accuweather.com/en/cn/shanghai/106577/daily-weather-forecast/106577?day=6" class="arrow-right">Next 5 Days<span></span></a>
+
+ <ul>
+ <li class="day current first cl { href: 'http://www.accuweather.com/en/cn/shanghai/106577/daily-weather-forecast/106577?day=1' }">
+ <div class="frame"></div>
+ <div class="bg bg-c">
+ <h3><a href="#">Today</a></h3>
+ <h4>May 10</h4>
+ <div class="icon i-12-s "></div>
+ <div class="info">
+ <span class="cond">Rain and drizzle this morning</span>
+ <strong class="temp">22<span>&deg;</span></strong><span class="low"><span>Lo</span> 19<span>&deg;</span></span>
+ </div>
+ <!-- /.info -->
+ </div>
+ <!-- /.bg -->
+ </li>
+ <li class="day hv cl { href: 'http://www.accuweather.com/en/cn/shanghai/106577/daily-weather-forecast/106577?day=2' }">
+ <div class="frame"></div>
+ <div class="bg bg-r">
+ <h3><a href="#">Sun</a></h3>
+ <h4>May 11</h4>
+ <div class="icon i-18-s "></div>
+ <div class="info">
+ <span class="cond">Humid with heavy rain</span>
+ <strong class="temp">23<span>&deg;</span></strong><span class="low"><span>Lo</span> 17<span>&deg;</span></span>
+ </div>
+ <!-- /.info -->
+ <a href="http://www.accuweather.com/en/cn/shanghai/106577/daily-weather-forecast/106577?day=2" class="bt-more">more</a>
+ </div>
+ <!-- /.bg -->
+ </li>
+ <li class="day hv cl { href: 'http://www.accuweather.com/en/cn/shanghai/106577/daily-weather-forecast/106577?day=3' }">
+ <div class="frame"></div>
+ <div class="bg bg-su">
+ <h3><a href="#">Mon</a></h3>
+ <h4>May 12</h4>
+ <div class="icon i-1-s "></div>
+ <div class="info">
+ <span class="cond">Nice and warm with sunshine</span>
+ <strong class="temp">26<span>&deg;</span></strong><span class="low"><span>Lo</span> 16<span>&deg;</span></span>
+ </div>
+ <!-- /.info -->
+ <a href="http://www.accuweather.com/en/cn/shanghai/106577/daily-weather-forecast/106577?day=3" class="bt-more">more</a>
+ </div>
+ <!-- /.bg -->
+ </li>
+ <li class="day hv cl { href: 'http://www.accuweather.com/en/cn/shanghai/106577/daily-weather-forecast/106577?day=4' }">
+ <div class="frame"></div>
+ <div class="bg bg-c">
+ <h3><a href="#">Tue</a></h3>
+ <h4>May 13</h4>
+ <div class="icon i-6-s "></div>
+ <div class="info">
+ <span class="cond">Rather cloudy and warm</span>
+ <strong class="temp">26<span>&deg;</span></strong><span class="low"><span>Lo</span> 18<span>&deg;</span></span>
+ </div>
+ <!-- /.info -->
+ <a href="http://www.accuweather.com/en/cn/shanghai/106577/daily-weather-forecast/106577?day=4" class="bt-more">more</a>
+ </div>
+ <!-- /.bg -->
+ </li>
+ <li class="day hv last cl { href: 'http://www.accuweather.com/en/cn/shanghai/106577/daily-weather-forecast/106577?day=5' }">
+ <div class="frame"></div>
+ <div class="bg bg-c">
+ <h3><a href="#">Wed</a></h3>
+ <h4>May 14</h4>
+ <div class="icon i-12-s "></div>
+ <div class="info">
+ <span class="cond">Showers around in the morning</span>
+ <strong class="temp">25<span>&deg;</span></strong><span class="low"><span>Lo</span> 18<span>&deg;</span></span>
+ </div>
+ <!-- /.info -->
+ <a href="http://www.accuweather.com/en/cn/shanghai/106577/daily-weather-forecast/106577?day=5" class="bt-more">more</a>
+ </div>
+ <!-- /.bg -->
+ </li>
+ </ul>
+</div>
+<!-- /.feed-tabs -->
+
+
+
+ <div id="details">
+ <ul id="detail-tab-buttons" class="detail-tab-buttons">
+ <li class="first current { target: '#detail-now' }"><a href="http://www.accuweather.com/en/cn/shanghai/106577/current-weather/106577" class=""><span>Now</span></a>
+ <div class="nub"></div>
+ </li>
+ <li class="{ target: '#detail-day-night' }"><a href="http://www.accuweather.com/en/cn/shanghai/106577/daily-weather-forecast/106577"><span>Daily</span></a></li>
+ <li class="last { target: '#detail-hourly' }"><a href="http://www.accuweather.com/en/cn/shanghai/106577/hourly-weather-forecast/106577"><span>Hourly</span></a></li>
+ <li class="{ target: '#detail-morning' }"><a href="http://www.accuweather.com/en/cn/shanghai/106577/morning-weather-forecast/106577"><span>Morning</span></a></li>
+ <li class="{ target: '#detail-afternoon' }"><a href="http://www.accuweather.com/en/cn/shanghai/106577/afternoon-weather-forecast/106577"><span>Afternoon</span></a></li>
+ <li class="{ target: '#detail-evening' }"><a href="http://www.accuweather.com/en/cn/shanghai/106577/evening-weather-forecast/106577"><span>Evening</span></a></li>
+ <li class="last { target: '#detail-overnight' }"><a href="http://www.accuweather.com/en/cn/shanghai/106577/overnight-weather-forecast/106577"><span>Overnight</span></a></li>
+ </ul>
+ <!-- /#detail-tab-buttons.detail-tab-buttons -->
+ <div id="detail-now" class="detail-tab-panel day">
+ <div class="bg bg-f">
+ <div class="forecast">
+ <div class="icon i-11-xl"></div>
+ <div class="info"> <span class="cond">Light fog</span> <span class="temp">19<span>&deg;</span></span> <span class="realfeel">RealFeel&#174; 20<span>&deg;</span></span> </div>
+ <!-- /.info -->
+ </div>
+ <!-- /.forecast -->
+ <div class="more-info">
+ <!--
+ <img src="http://vortex.accuweather.com/adc2010/images/icons-wind/SE.gif" width="260" height="138" alt="" />
+ -->
+ <div class="wind-box-lg">
+ <div id="wind-arm-day" class="wind-arm"></div>
+ <p class="n">N</p>
+ <p class="e">E</p>
+ <p class="s">S</p>
+ <p class="w">W</p>
+ <script type="text/javascript">
+ (function () {
+ var d = 'SE';
+ var s = '17km/h';
+ $('#wind-arm-day').flash({ 'wmode': 'transparent', 'allowScriptAccess': 'always', 'src': 'http://vortex.accuweather.com/adc2010/flash/wind-arm-large.swf?speed=' + s + '&direction=' + d.toLowerCase() + '&units=km/h', 'width': '260', 'height': '138' });
+ if (typeof (acm_hasFlash) != 'undefined' && !acm_hasFlash) {
+ $('#wind-arm-day').html('<img src="http://vortex.accuweather.com/adc2010/images/icons-wind/arrow-lg-' + d + '.png" />');
+ }
+ })();
+ </script>
+ </div>
+
+
+ <ul class="stats">
+ <li>Humidity: <strong>88%</strong></li>
+ <li>Pressure: <strong>1014.00 mb </strong></li>
+ <li>UV Index: <strong>4</strong></li>
+ <li>Cloud Cover: <strong>20%</strong></li>
+ <li>Ceiling: <strong>549 m</strong></li>
+ <li>Dew Point: <strong>17&#176;&nbsp;C</strong></li>
+ <li>Visibility: <strong>3 km</strong></li>
+ </ul>
+ <!-- /.stats -->
+ </div>
+ <!-- /.more-info -->
+
+ <div style="position:absolute;top:124px;left:427px;height:20px;font-weight:bold;font-size:10px;text-align:center;">17 km/h</div>
+
+ </div>
+ <!-- /.bg -->
+ </div>
+ <!-- /.detail-tab-panel -->
+ </div>
+ <!-- /#details -->
+
+ <script>acm.setupLifestylePromoLinks(jQuery);</script>
+
+ <div id="feature-sun" class="feature feature-first">
+ <div class="feature-title">
+ <h3 class="lt">Sunrise/Sunset</h3>
+ </div>
+ <!-- /.feature-title -->
+
+ <img src="http://vortex.accuweather.com/adc2010/images/features/sun.jpg" width="289" height="108" alt="Sunrise / Sunset Illustration" />
+
+ <p class="time-period">
+ <span class="ac">Rises at</span>
+ <span class="start">5:03 AM</span>
+ <span class="ac">with</span>
+
+ <span class="time">13:36</span>
+
+ <span class="ac">of sunlight, then sets at</span>
+ <span class="finish">6:39 PM</span>
+ </p>
+ <!-- /.content -->
+ </div>
+ <!-- /.feature -->
+
+ <div id="feature-moon" class="feature">
+ <div class="feature-title">
+ <h3 class="lt">Moonrise/Moonset</h3>
+ <a href="http://www.accuweather.com/en/cn/shanghai/106577/astronomy-weather/106577" class="more rt">Astronomy &gt;</a>
+ </div>
+ <!-- /.feature-title -->
+
+ <img src="http://vortex.accuweather.com/adc2010/images/features/moon.jpg" width="289" height="108" alt="Moonrise / Moonset Illustration" />
+
+ <p class="time-period">
+ <span class="ac">Rises at</span>
+ <span class="start">2:18 PM</span>
+ <span class="ac">with</span>
+ <span class="time">12:14</span>
+ <span class="ac">of moolight, then sets at</span>
+ <span class="finish">2:32 AM</span>
+ </p>
+ <!-- /.content -->
+ </div>
+
+ <!-- /.feature -->
+
+ <div class="panel-body-content">
+ <div class="feature-stats">
+ <h3>Temperature Summary - 10:58 AM</h3>
+ <div class="clearfix">
+ <div class="lt" style="width:290px;">
+ <table cellspacing="0" class="stats">
+ <thead>
+ <tr>
+ <th>&nbsp;</th>
+ <th>Temp (&deg;C)</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr class="pre">
+ <th scope="row">Now</th>
+ <td>19&deg;</td>
+ </tr>
+ <tr class="pre">
+ <th scope="row">Yesterday</th>
+ <td>21&deg;</td>
+ </tr>
+ <tr class="pre">
+ <th scope="row">RealFeel&#174;</th>
+ <td>20&deg;</td>
+ </tr>
+ <tr class="pre">
+ <th scope="row">RealFeel&#174; Shade</th>
+ <td>18&deg;</td>
+ </tr>
+ <tr class="pre">
+ <th scope="row">Wind Chill</th>
+ <td>19&deg;</td>
+ </tr>
+ <tr class="last pre">
+ <th scope="row">Dew Point</th>
+ <td>17&deg;</td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ <div class="rt" style="width:290px;">
+ <table cellspacing="0" class="stats">
+ <thead>
+ <tr>
+ <th>&nbsp;</th>
+ <th>Hi / Lo</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr class="hi">
+ <th scope="row" style="border-bottom:2px solid transparent;">Previous 6 Hours</th>
+ <td>20&deg;</td>
+ </tr>
+ <tr class="lo">
+ <th scope="row">&nbsp;</th>
+ <td>18&deg;</td>
+ </tr>
+ <tr class="hi">
+ <th scope="row" style="border-bottom:2px solid transparent;">Previous 12 Hours</th>
+ <td>20&deg;</td>
+ </tr>
+ <tr class="lo">
+ <th scope="row">&nbsp;</th>
+ <td>17&deg;</td>
+ </tr>
+ <tr class="hi">
+ <th scope="row" style="border-bottom:2px solid transparent;">Previous 24 Hours</th>
+ <td>22&deg;</td>
+ </tr>
+ <tr class="lo">
+ <th scope="row">&nbsp;</th>
+ <td>17&deg;</td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </div>
+ </div>
+ </div>
+
+ <div id="feature-history">
+ <div class="clearfix">
+ <h3 class="lt">Temperature History - May 10</h3>
+ <a href="http://www.accuweather.com/en/cn/shanghai/106577/month/106577?view=table" class="more rt">more Historical Weather Data &gt;</a>
+ <!-- /.rt -->
+ </div>
+
+ <table cellspacing="0" class="stats">
+ <thead>
+ <tr>
+ <th>&nbsp;</th>
+ <th>Today</th>
+ <th>Normal</th>
+ <th>Record</th>
+ <th>5/10/2013</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr class="hi">
+ <th scope="row">High</th>
+ <td>22&#176;</td>
+
+ <td class="high">23&#176;</td>
+
+ <td>N/A</td>
+
+ <td>24&#176;</td>
+ </tr>
+
+ <tr class="last lo">
+ <th scope="row">Low</th>
+ <td>19&#176;</td>
+
+ <td class="high">16&#176;</td>
+
+ <td>N/A</td>
+
+ <td>18&#176;</td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ <!-- /#feature-history -->
+
+ <div class="panel-body-content">
+ <div class="feature-stats">
+ <h3>Precipitation Summary - 10:58 AM</h3>
+ <table cellspacing="0" class="stats">
+ <thead>
+ <tr>
+ <th>&nbsp;</th>
+ <th>Amount (mm)</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr class="pre">
+ <th scope="row">Previous 1 Hour</th>
+ <td>0</td>
+ </tr>
+ <tr class="pre">
+ <th scope="row">Previous 3 Hours</th>
+ <td>0</td>
+ </tr>
+ <tr class="pre">
+ <th scope="row">Previous 6 Hours</th>
+ <td>1</td>
+ </tr>
+ <tr class="pre">
+ <th scope="row">Previous 9 Hours</th>
+ <td>1</td>
+ </tr>
+ <tr class="pre">
+ <th scope="row">Previous 12 Hours</th>
+ <td>1</td>
+ </tr>
+ <tr class="pre">
+ <th scope="row">Previous 18 Hours</th>
+ <td>1</td>
+ </tr>
+ <tr class="last pre">
+ <th scope="row">Previous 24 Hours</th>
+ <td>1</td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </div>
+
+ </div>
+ </div>
+ </div>
+ <!-- /.panel-body-lt -->
+ <div class="panel-foot-lt">
+ <div class="panel-foot-rt">
+ <div class="panel-foot"></div>
+ </div>
+ </div>
+ </div>
+
+ <!-- /#panel-main -->
+
+ <div class="panel panel-top-story">
+ <div class="panel-head-lt">
+ <div class="panel-head-rt">
+ <div class="panel-head"></div>
+ </div>
+ </div>
+ <div class="panel-body-lt">
+ <div class="panel-body-rt">
+ <div class="panel-body">
+ <div class="article-wrap">
+ <span>Top Story</span>
+ <h3>Shanghai Weather Report</h3>
+ <div id="article" class="article">
+ <a href="http://www.accuweather.com/en/weather-news/hong-kong-flooding-rain/26703868" class="wrap">
+ <img src="http://vortex.accuweather.com/adc2004/pub/includes/columns/newsstory/2014/237x145_05091356_weekendthumb.jpg" width="237" height="145" alt="" />
+ </a>
+ <div class="info">
+ <h4><a href="http://www.accuweather.com/en/weather-news/hong-kong-flooding-rain/26703868">Rainfall Tops 400 mm Near Hong Kong, More to Come</a></h4>
+ <h5>May 9, 2014; 10:05 PM ET</h5>
+ <p>Hong Kong has already endured flooding rain, and more is on the way for this weekend. <a href="http://www.accuweather.com/en/weather-news/hong-kong-flooding-rain/26703868" class="more">more &gt;</a></p>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="panel-foot-lt">
+ <div class="panel-foot-rt">
+ <div class="panel-foot"></div>
+ </div>
+ </div>
+ </div>
+
+ </div>
+
+ <!-- /.column-1 -->
+
+
+
+<div class="column-2 clearfix">
+
+
+
+<div id="aadTop300" class="panel">
+ <div class="panel-head-lt">
+ <div class="panel-head-rt">
+ <div class="panel-head"></div>
+ </div>
+ </div>
+
+ <div class="panel-body-lt">
+ <div class="panel-body-rt">
+ <div id="top-panel-body-rt-body" class="ad-lr panel-body">
+ <div id="top-panel-body-rt-body-ps" ></div>
+ <script type="text/javascript">
+ acm.loadAd(aadTags, 'tile2', '#top-panel-body-rt-body-ps', '250px');
+ </script>
+ </div>
+ </div>
+ </div>
+
+ <div class="panel-foot-lt">
+ <div class="panel-foot-rt">
+ <div class="panel-foot"></div>
+ </div>
+ </div>
+</div><div class="panel">
+ <div class="panel-head-rt">
+ <div class="panel-head-lt">
+ <div class="panel-head"></div>
+ </div>
+ </div>
+ <div class="panel-body-lt">
+ <div class="panel-body-rt">
+ <div class="panel-body">
+ <div class="panel-body-content">
+ <a href="http://www.accuweatherglobal.com/demo.php" target="_blank"><img src="http://vortex.accuweather.com/adc2010/images/misc/Ad_Weather_Data_Portal_Final.png" /></a>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="panel-foot-lt">
+ <div class="panel-foot-rt">
+ <div class="panel-foot"></div>
+ </div>
+ </div>
+</div>
+<div id="ad-links" class="panel">
+ <div class="panel-head-lt">
+ <div class="panel-head-rt">
+ <div class="panel-head"></div>
+ </div>
+ </div>
+ <div class="panel-body-lt">
+ <div class="panel-body-rt">
+ <div class="panel-body">
+ <div class="panel-body-content" id="ad-links-content">
+ <div id="ad-links-content-x">
+ <div id="ad-links-content-x-ps"></div>
+ <script>
+ acm.loadTextAd("#ad-links-content-x");
+ </script>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="panel-foot-lt">
+ <div class="panel-foot-rt">
+ <div class="panel-foot"></div>
+ </div>
+ </div>
+</div>
+
+
+<div id="aadBot300" class="panel panel-ad-mr">
+ <div class="panel-head-lt">
+ <div class="panel-head-rt">
+ <div class="panel-head"></div>
+ </div>
+ </div>
+ <div class="panel-body-lt">
+ <div class="panel-body-rt">
+ <div id="bottom-panel-body" class="panel-body">
+ <div id="bottom-panel-body-ps" ></div>
+ <script type="text/javascript">
+ acm.loadAd(aadTags, 'tile3', '#bottom-panel-body-ps', '250px');
+ </script>
+ </div>
+ </div>
+ </div>
+ <div class="panel-foot-lt">
+ <div class="panel-foot-rt">
+ <div class="panel-foot"> </div>
+ </div>
+ </div>
+</div>
+
+ </div>
+
+ <!-- /.column-2 -->
+
+
+
+<div id="offers" class="offers-extras">
+ <div class="panel">
+ <div class="panel-head-lt">
+ <div class="panel-head-rt">
+ <div class="panel-head"></div>
+ </div>
+ </div>
+ <div class="panel-body-lt">
+ <div class="panel-body-rt">
+ <div class="panel-body">
+ <div class="panel-body-content">
+ <a class="{type:'Image',label:'AccuWeather Premium'}" href="https://wwwl.accuweather.com/premium_login.php?&amp;utm_source=adc&amp;utm_medium=ExtraAd&amp;utm_campaign=MoreWeather" target="_blank"><img src="http://vortex.accuweather.com/adc2010/images/features/en/extra_adc_premium.png" width="300" height="140" alt="AccuWeather Premium" /></a>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="panel-foot-lt">
+ <div class="panel-foot-rt">
+ <div class="panel-foot"></div>
+ </div>
+ </div>
+ </div>
+ <!-- /extra 1 -->
+ <div class="panel">
+ <div class="panel-head-lt">
+ <div class="panel-head-rt">
+ <div class="panel-head"></div>
+ </div>
+ </div>
+ <div class="panel-body-lt">
+ <div class="panel-body-rt">
+ <div class="panel-body">
+ <div class="panel-body-content">
+ <a class="{type:'Image',label:'Weather Data Portal'}" href="http://www.accuweatherglobal.com/default.php" target="_blank"><img src="http://vortex.accuweather.com/adc2004/pub/includes/columns/monthlyfeature/2013/300x140_08141931_ad_weather-data-portal_final.png" width="300" height="140" alt="Weather Data Portal" /></a>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="panel-foot-lt">
+ <div class="panel-foot-rt">
+ <div class="panel-foot"></div>
+ </div>
+ </div>
+ </div>
+ <!-- /extra 2 -->
+
+ <div class="panel scroll-panel">
+ <div class="panel-head-lt">
+ <div class="panel-head-rt">
+ <div class="panel-head"></div>
+ </div>
+ </div>
+ <div class="panel-body-lt">
+ <div class="panel-body-rt">
+ <div class="panel-body">
+ <div class="panel-body-content">
+ <h3></h3>
+ <ul class="scroll-area scrollbar">
+ <li><a class="{type:'Text',label:'AccuWeather Shines on U'}" href="http://getu.com/accuweather/?srl=1000668" target="_blank">AccuWeather Shines on U</a></li>
+ <li><a class="{type:'Text',label:'AccuWeather&#39;s Superior Accuracy'}" href="http://enterprisesolutions.accuweather.com/success-stories?utm_source=adc&amp;utm_medium=ExtraAd&amp;utm_content=accuweatheradvantage&amp;utm_campaign=SuccessStories" target="_blank">AccuWeather&#39;s Superior Accuracy</a></li>
+ <li><a class="{type:'Text',label:'Free Weather For Your Site'}" href="http://www.accuweather.com/en/free-weather-widgets?utm_source=adc&amp;utm_medium=ExtraAd&amp;utm_campaign=FreeWidget" target="_blank">Free Weather For Your Site</a></li>
+ <li><a class="{type:'Text',label:'Forensic Weather'}" href="http://enterprisesolutions.accuweather.com/legal-forensics?utm_source=adc&amp;utm_medium=ExtraAd&amp;utm_campaign=forensics" target="_blank">Forensic Weather</a></li>
+ <li><a class="{type:'Text',label:'AccuWeather Premium'}" href="https://wwwl.accuweather.com/premium_login.php?&amp;utm_source=adc&amp;utm_medium=ExtraAd&amp;utm_campaign=MoreWeather" target="_blank">AccuWeather Premium</a></li>
+ <li><a class="{type:'Text',label:'AccuWeather for iPad'}" href="http://itunes.apple.com/us/app/accu-weather-free-for-ipad/id364616869?mt=8" target="_blank">AccuWeather for iPad</a></li>
+ <li><a class="{type:'Text',label:'AccuWeather Professional'}" href="https://wwwl.accuweather.com/pro_login.php#&amp;panel1-2?&amp;utm_source=adc&amp;utm_medium=ExtraAd&amp;utm_campaign=Professional" target="_blank">AccuWeather Professional</a></li>
+ <li><a class="{type:'Text',label:'SkyGuard Warnings'}" href="http://enterprisesolutions.accuweather.com/skyguard?utm_source=adc&amp;utm_medium=ExtraAd&amp;utm_campaign=SkyGuard" target="_blank">SkyGuard Warnings</a></li>
+ <li><a class="{type:'Text',label:'AccuWeather for iPhone'}" href="http://itunes.apple.com/us/app/accuweather-for-iphone/id300048137?mt=8" target="_blank">AccuWeather for iPhone</a></li>
+ <li><a class="{type:'Text',label:'SkyGuard Online'}" href="http://enterprisesolutions.accuweather.com/skyguard-online?utm_source=adc&amp;utm_medium=ExtraAd&amp;utm_content=skyguardonline&amp;utm_campaign=SkyGuard" target="_blank">SkyGuard Online</a></li>
+ <li><a class="{type:'Text',label:'SkyGuard Long-Range'}" href="http://enterprisesolutions.accuweather.com/forecasts?utm_source=adc&amp;utm_medium=ExtraAd&amp;utm_content=longrangeforecasts&amp;utm_campaign=SkyGuard" target="_blank">SkyGuard Long-Range</a></li>
+ <li><a class="{type:'Text',label:'AccuWeather Toolbar'}" href="http://downloadmytoolbar.com/Accuweather/" target="_blank">AccuWeather Toolbar</a></li>
+ <li><a class="{type:'Text',label:'Weather Data Portal'}" href="http://www.accuweatherglobal.com/default.php" target="_blank">Weather Data Portal</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="panel-foot-lt">
+ <div class="panel-foot-rt">
+ <div class="panel-foot"></div>
+ </div>
+ </div>
+ </div>
+ <!-- /everything else -->
+</div>
+<script>
+ (function ($) {
+ $('#offers.offers-extras a').click(function () {
+ var l = $(this).metadata().label;
+ var t = $(this).metadata().type;
+ if (l && t) {
+ _gaq.push(['_trackEvent', 'AccuWeatherExtras2012', t, l]);
+ }
+ });
+ })(jQuery);
+</script>
+ </div>
+ <!-- /#content -->
+ </div>
+ <!-- /#wrap-content -->
+
+ <div id="footer">
+ <div id="footer-content-wrapper">
+ <div class="logo-ad">
+ <h5 class="logo">AccuWeather.com</h5>
+ <div id="footer-stevem">
+ <div id="footer-stevem-ps" ></div>
+ <script type="text/javascript">
+ acm.loadAd(aadTags, 'tile4', '#footer-stevem-ps', '90px');
+ </script>
+ </div>
+ </div>
+
+ <div id="custom-goog-search">
+ <style type="text/css">
+ @import url(http://www.google.com/cse/api/branding.css);
+ </style>
+ <div class="cse-branding-right" style="color:#000000">
+ <div class="cse-branding-form">
+ <form action="http://www.google.com" id="cse-search-box" target="_blank">
+ <div>
+ <input type="hidden" name="cx" value="partner-pub-5771594739411148:7839492073" />
+ <input type="hidden" name="ie" value="UTF-8" />
+ <input id="goog-cse-input" type="text" name="q" size="100" />
+ <input id="goog-cse-submit" type="submit" name="sa" value="" />
+ </div>
+ </form>
+ </div>
+ <div class="cse-branding-logo">
+ <img src="http://vortex.accuweather.com/adc2010/images/misc/googlelogo.png" alt="Google" />
+ </div>
+ <div class="cse-branding-text">
+ Custom Search
+ </div>
+ </div>
+
+ </div>
+ <div id="footer-nav-main" class="clearfix">
+ <div class="first">
+ <ul class="footer-nav-cols">
+ <li class="head">Company</li>
+ <li><a href="http://www.accuweather.com/en/about">About Us</a></li>
+ <li><a href="http://www.accuweather.com/media-kit">Advertise With Us</a></li>
+ <li><a href="http://www.accuweather.com/en/self-service-advertising">Self-Serve Advertising</a></li>
+ <li><a href="http://accuweathercareers.silkroad.com/" target="_blank">Careers</a></li>
+ <li><a href="http://www.accuweather.com/en/press">Press</a></li>
+
+ <li><a href="http://www.accuweather.com/en/contact">Contact Us</a></li>
+ </ul>
+ </div>
+ <div>
+ <ul class="footer-nav-cols">
+ <li class="head">Enterprise Solutions</li>
+ <li><a href="http://www.accuweather.com/adc2004/pub/products_services/media.asp" target="_blank">Media</a></li>
+ <li><a href="http://enterprisesolutions.accuweather.com/manufacturing" target="_blank">Manufacturing</a></li>
+ <li><a href="http://enterprisesolutions.accuweather.com/retail" target="_blank">Retail</a></li>
+ <li><a href="http://enterprisesolutions.accuweather.com/finance-banking" target="_blank">Finance &amp; Banking</a></li>
+ <li><a href="http://enterprisesolutions.accuweather.com/energy" target="_blank">Energy</a></li>
+ <li><a href="http://enterprisesolutions.accuweather.com" target="_blank">All Enterprise Solutions</a></li>
+ </ul>
+ </div>
+ <div>
+ <ul class="footer-nav-cols">
+ <li class="head">Subscription Services</li>
+ <li><a href="https://wwwl.accuweather.com/premium_login.php" target="_blank">AccuWeather Premium</a></li>
+ <li><a href="https://wwwl.accuweather.com/pro_login.php" target="_blank">AccuWeather Professional</a></li>
+ <li><a href="http://radarplus.accuweather.com/" target="_blank">AccuWeather RadarPlus</a></li>
+ <li><a href="http://www.accuweather.com/adcbin/public/LightningPlus_Benefits.asp" target="_blank">Lightning Plus</a></li>
+ </ul>
+ </div>
+ <div class="last">
+ <ul class="footer-nav-cols">
+ <li class="head">Partners</li>
+ <li class="img"><a href="http://www.adci.com/html/worldmap/adc_worldmap_digital_atlas.php" target="_blank" class="adci-world-map"></a></li>
+ <!--<li><a href="" target="_blank">Mobium GPS / GeoMicro</a></li>-->
+ </ul>
+ </div>
+ </div>
+ <div id="footer-tm"> &copy; 2014 AccuWeather, Inc. All Rights Reserved.<br />
+ AccuWeather.com is a registered trademark of AccuWeather, Inc.<br />
+ <a href="http://www.accuweather.com/en/legal">Terms of usage</a> under which this service is provided<br />
+ <a href="http://www.accuweather.com/en/privacy">Privacy Statement</a> | <a href="http://www.accuweather.com/en/privacy#adChoices">Ad Choices</a> </div>
+ <div id="footer-social">
+ <ul>
+ <li class="apps"><a href="http://www.accuweather.com/en/downloads">Apps &amp; Downloads</a></li>
+ <li class="fb"><a href="http://www.facebook.com/AccuWeather" target="_blank">Like Us</a></li>
+ <li class="twt"><a href="http://twitter.com/BreakingWeather" target="_blank">Follow Us</a></li>
+ <li class="utube"><a href="http://www.youtube.com/accuweather" target="_blank">Watch Us</a></li>
+ </ul>
+ </div>
+ <!-- /#footer-info -->
+ </div>
+ <!-- /#footer-content-wrapper -->
+ </div>
+<!-- /#footer -->
+
+ <script>
+ if (acm && acm.isUsePostscribe() === false) {
+ // Only make this call if we are not using postscribe
+ // (otherwise the call was already made in PostScribe's done event)
+ if (typeof (aad_getCustomSponsors) == 'function') {
+ aadTags.tile1Done = true;
+ aadTags.tile2Done = true;
+ aadTags.tile3Done = true;
+ aadTags.tile4Done = true;
+ aad_getCustomSponsors(aadTags);
+ }
+ }
+ </script>
+ <script>
+ if (typeof (aadSponsoredLinksObj) != 'undefined' && aadSponsoredLinksObj.type == 'google' && aadSponsoredLinksObj.show_links == true) {
+ document.write('<scr' + 'ipt src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></scr' + 'ipt>');
+ } else if (typeof (aadSponsoredLinksObj) == 'undefined') {
+ jQuery('#ad-links').remove();
+ }
+ </script>
+<div id="tracking-pixels"></div>
+
+</div>
+<!-- /#wrap -->
+
+ <div class="vcard">
+ <span class="adr">
+ <span class="locality">
+ <span class="value-title" title="Shanghai" ></span>
+ </span>
+ <abbr class="region" title="Shanghai">
+ <span class="value-title" title="31" ></span>
+ </abbr>
+ <abbr class="country-name" title="China">
+ <span class="value-title" title="CN" ></span>
+ </abbr>
+ </span>
+ <span class="geo">
+ <span class="latitude">
+ <span class="value-title" title="31.23" ></span>
+ </span>
+ <span class="longitude">
+ <span class="value-title" title="121.44"></span>
+ </span>
+ </span>
+ </div>
+
+ <script type="text/javascript">
+ var _qoptions = { qacct: 'p-4b4gl_1fWISuU' };
+ if (typeof (apgPageInfoObj) != 'undefined' && apgPageInfoObj.crumb_trail) {
+ _qoptions.labels = apgPageInfoObj.crumb_trail.join('.');
+ }
+ </script>
+ <script type="text/javascript" src="http://edge.quantserve.com/quant.js"></script>
+ <noscript>
+ <a href="http://www.quantcast.com/p-4b4gl_1fWISuU" target="_blank"><img src="http://pixel.quantserve.com/pixel/p-4b4gl_1fWISuU.gif" style="display: none" border="0" height="1" width="1" alt="Quantcast"/></a>
+ </noscript> <script type="text/javascript">
+ (function () {
+ var d = new Image(1, 1);
+ d.onerror = d.onload = function () {
+ d.onerror = d.onload = null;
+ };
+ d.src = ["//secure-us.imrworldwide.com/cgi-bin/m?ci=us-accuweather&cg=0&cc=1&si=", escape(window.location.href), "&rp=", escape(document.referrer), "&ts=compact&rnd=", (new Date()).getTime()].join('');
+ })();
+ </script>
+ <noscript>
+ <img style="display:none;" src="//secure-us.imrworldwide.com/cgi-bin/m?ci=us-accuweather&amp;cg=0&amp;cc=1&amp;ts=noscript" width="1" height="1" alt="" />
+ </noscript>
+ <noscript>
+ <img src="http://b.scorecardresearch.com/p?c1=2&c2=6005068&cv=2.0&cj=1" />
+ </noscript>
+ <!-- Migraine/migraine -->
+
+
+</body>
+</html>
diff --git a/.conky/cronograph/accuweather/last_days b/.conky/cronograph/accuweather/last_days
new file mode 100644
index 0000000..75a56d9
--- /dev/null
+++ b/.conky/cronograph/accuweather/last_days
@@ -0,0 +1,25 @@
+WED
+12
+Showers around in the morning
+25
+17
+THU
+d
+Mostly cloudy
+26
+18
+FRI
+b
+Partly sunny
+23
+15
+SAT
+i
+Cooler with rain
+17
+16
+SUN
+i
+Periods of rain
+21
+17
diff --git a/.conky/cronograph/accuweather/last_days_raw b/.conky/cronograph/accuweather/last_days_raw
new file mode 100644
index 0000000..6ac7def
--- /dev/null
+++ b/.conky/cronograph/accuweather/last_days_raw
@@ -0,0 +1,82 @@
+<div id="feed-tabs">
+ <a href="http://www.accuweather.com/en/cn/shanghai/106577/daily-weather-forecast/106577" class="arrow-left">Previous 5 Days<span></span></a>
+ <a href="http://www.accuweather.com/en/cn/shanghai/106577/daily-weather-forecast/106577?day=11" class="arrow-right">Next 5 Days<span></span></a>
+
+ <ul>
+ <li class="day current first cl { href: 'http://www.accuweather.com/en/cn/shanghai/106577/daily-weather-forecast/106577?day=6' }">
+ <div class="frame"></div>
+ <div class="bg bg-c">
+ <h3><a href="#">Wed</a></h3>
+ <h4>May 14</h4>
+ <div class="icon i-12-s "></div>
+ <div class="info">
+ <span class="cond">Showers around in the morning</span>
+ <strong class="temp">25<span>&deg;</span></strong><span class="low"><span>Lo</span> 17<span>&deg;</span></span>
+ </div>
+ <!-- /.info -->
+ </div>
+ <!-- /.bg -->
+ </li>
+ <li class="day hv cl { href: 'http://www.accuweather.com/en/cn/shanghai/106577/daily-weather-forecast/106577?day=7' }">
+ <div class="frame"></div>
+ <div class="bg bg-c">
+ <h3><a href="#">Thu</a></h3>
+ <h4>May 15</h4>
+ <div class="icon i-6-s "></div>
+ <div class="info">
+ <span class="cond">Mostly cloudy</span>
+ <strong class="temp">26<span>&deg;</span></strong><span class="low"><span>Lo</span> 18<span>&deg;</span></span>
+ </div>
+ <!-- /.info -->
+ <a href="http://www.accuweather.com/en/cn/shanghai/106577/daily-weather-forecast/106577?day=7" class="bt-more">more</a>
+ </div>
+ <!-- /.bg -->
+ </li>
+ <li class="day hv cl { href: 'http://www.accuweather.com/en/cn/shanghai/106577/daily-weather-forecast/106577?day=8' }">
+ <div class="frame"></div>
+ <div class="bg bg-su">
+ <h3><a href="#">Fri</a></h3>
+ <h4>May 16</h4>
+ <div class="icon i-3-s "></div>
+ <div class="info">
+ <span class="cond">Partly sunny</span>
+ <strong class="temp">23<span>&deg;</span></strong><span class="low"><span>Lo</span> 15<span>&deg;</span></span>
+ </div>
+ <!-- /.info -->
+ <a href="http://www.accuweather.com/en/cn/shanghai/106577/daily-weather-forecast/106577?day=8" class="bt-more">more</a>
+ </div>
+ <!-- /.bg -->
+ </li>
+ <li class="day hv cl { href: 'http://www.accuweather.com/en/cn/shanghai/106577/daily-weather-forecast/106577?day=9' }">
+ <div class="frame"></div>
+ <div class="bg bg-r">
+ <h3><a href="#">Sat</a></h3>
+ <h4>May 17</h4>
+ <div class="icon i-18-s "></div>
+ <div class="info">
+ <span class="cond">Cooler with rain</span>
+ <strong class="temp">17<span>&deg;</span></strong><span class="low"><span>Lo</span> 16<span>&deg;</span></span>
+ </div>
+ <!-- /.info -->
+ <a href="http://www.accuweather.com/en/cn/shanghai/106577/daily-weather-forecast/106577?day=9" class="bt-more">more</a>
+ </div>
+ <!-- /.bg -->
+ </li>
+ <li class="day hv last cl { href: 'http://www.accuweather.com/en/cn/shanghai/106577/daily-weather-forecast/106577?day=10' }">
+ <div class="frame"></div>
+ <div class="bg bg-r">
+ <h3><a href="#">Sun</a></h3>
+ <h4>May 18</h4>
+ <div class="icon i-18-s "></div>
+ <div class="info">
+ <span class="cond">Periods of rain</span>
+ <strong class="temp">21<span>&deg;</span></strong><span class="low"><span>Lo</span> 17<span>&deg;</span></span>
+ </div>
+ <!-- /.info -->
+ <a href="http://www.accuweather.com/en/cn/shanghai/106577/daily-weather-forecast/106577?day=10" class="bt-more">more</a>
+ </div>
+ <!-- /.bg -->
+ </li>
+ </ul>
+</div>
+<!-- /.feed-tabs -->
diff --git a/.conky/cronograph/accuweather/tod_ton b/.conky/cronograph/accuweather/tod_ton
new file mode 100644
index 0000000..a839d7e
--- /dev/null
+++ b/.conky/cronograph/accuweather/tod_ton
@@ -0,0 +1,25 @@
+TONIGHT
+h
+Rain and drizzle late
+-
+17
+SAT
+e
+Cloudy and breezy
+21
+18
+SUN
+i
+Humid with heavy rain
+23
+16
+MON
+a
+Nice and warm with sunshine
+26
+16
+TUE
+d
+Rather cloudy and warm
+26
+17
diff --git a/.conky/cronograph/accuweather/tod_ton_raw b/.conky/cronograph/accuweather/tod_ton_raw
new file mode 100644
index 0000000..2976b86
--- /dev/null
+++ b/.conky/cronograph/accuweather/tod_ton_raw
@@ -0,0 +1,81 @@
+<div id="feed-tabs">
+ <a href="http://www.accuweather.com/en/cn/shanghai/106577/daily-weather-forecast/106577?day=6" class="arrow-right">Next 5 Days<span></span></a>
+
+ <ul>
+ <li class="night current first cl { href: 'http://www.accuweather.com/en/cn/shanghai/106577/daily-weather-forecast/106577?day=1' }">
+ <div class="frame"></div>
+ <div class="bg bg-s">
+ <h3><a href="#">Tonight</a></h3>
+ <h4>May 9</h4>
+ <div class="icon i-12-s "></div>
+ <div class="info">
+ <span class="cond">Rain and drizzle late</span>
+ <span class="low" style="color:#ffffff;">Lo </span><strong class="temp">17<span>&deg;</span></strong>
+ </div>
+ <!-- /.info -->
+ </div>
+ <!-- /.bg -->
+ </li>
+ <li class="day hv cl { href: 'http://www.accuweather.com/en/cn/shanghai/106577/daily-weather-forecast/106577?day=2' }">
+ <div class="frame"></div>
+ <div class="bg bg-c">
+ <h3><a href="#">Sat</a></h3>
+ <h4>May 10</h4>
+ <div class="icon i-7-s "></div>
+ <div class="info">
+ <span class="cond">Cloudy and breezy</span>
+ <strong class="temp">21<span>&deg;</span></strong><span class="low"><span>Lo</span> 18<span>&deg;</span></span>
+ </div>
+ <!-- /.info -->
+ <a href="http://www.accuweather.com/en/cn/shanghai/106577/daily-weather-forecast/106577?day=2" class="bt-more">more</a>
+ </div>
+ <!-- /.bg -->
+ </li>
+ <li class="day hv cl { href: 'http://www.accuweather.com/en/cn/shanghai/106577/daily-weather-forecast/106577?day=3' }">
+ <div class="frame"></div>
+ <div class="bg bg-r">
+ <h3><a href="#">Sun</a></h3>
+ <h4>May 11</h4>
+ <div class="icon i-18-s "></div>
+ <div class="info">
+ <span class="cond">Humid with heavy rain</span>
+ <strong class="temp">23<span>&deg;</span></strong><span class="low"><span>Lo</span> 16<span>&deg;</span></span>
+ </div>
+ <!-- /.info -->
+ <a href="http://www.accuweather.com/en/cn/shanghai/106577/daily-weather-forecast/106577?day=3" class="bt-more">more</a>
+ </div>
+ <!-- /.bg -->
+ </li>
+ <li class="day hv cl { href: 'http://www.accuweather.com/en/cn/shanghai/106577/daily-weather-forecast/106577?day=4' }">
+ <div class="frame"></div>
+ <div class="bg bg-su">
+ <h3><a href="#">Mon</a></h3>
+ <h4>May 12</h4>
+ <div class="icon i-1-s "></div>
+ <div class="info">
+ <span class="cond">Nice and warm with sunshine</span>
+ <strong class="temp">26<span>&deg;</span></strong><span class="low"><span>Lo</span> 16<span>&deg;</span></span>
+ </div>
+ <!-- /.info -->
+ <a href="http://www.accuweather.com/en/cn/shanghai/106577/daily-weather-forecast/106577?day=4" class="bt-more">more</a>
+ </div>
+ <!-- /.bg -->
+ </li>
+ <li class="day hv last cl { href: 'http://www.accuweather.com/en/cn/shanghai/106577/daily-weather-forecast/106577?day=5' }">
+ <div class="frame"></div>
+ <div class="bg bg-c">
+ <h3><a href="#">Tue</a></h3>
+ <h4>May 13</h4>
+ <div class="icon i-6-s "></div>
+ <div class="info">
+ <span class="cond">Rather cloudy and warm</span>
+ <strong class="temp">26<span>&deg;</span></strong><span class="low"><span>Lo</span> 17<span>&deg;</span></span>
+ </div>
+ <!-- /.info -->
+ <a href="http://www.accuweather.com/en/cn/shanghai/106577/daily-weather-forecast/106577?day=5" class="bt-more">more</a>
+ </div>
+ <!-- /.bg -->
+ </li>
+ </ul>
+</div>
+<!-- /.feed-tabs -->
diff --git a/.conky/cronograph/conky_start.sh b/.conky/cronograph/conky_start.sh
new file mode 100755
index 0000000..98dbb27
--- /dev/null
+++ b/.conky/cronograph/conky_start.sh
@@ -0,0 +1,10 @@
+#!/bin/sh
+
+CONKYRC="$HOME/.conky/cronograph/conkyrc"
+
+sleep 5
+
+conky -d -c ${CONKYRC} "$@"
+
+exit 0
+
diff --git a/.conky/cronograph/conkyrc b/.conky/cronograph/conkyrc
new file mode 100644
index 0000000..3a54030
--- /dev/null
+++ b/.conky/cronograph/conkyrc
@@ -0,0 +1,89 @@
+# — Conky settings — #
+
+background yes
+
+update_interval 1
+total_run_times 0
+net_avg_samples 2
+
+override_utf8_locale yes
+
+double_buffer yes
+no_buffers yes
+
+text_buffer_size 2048
+imlib_cache_size 0
+
+temperature_unit celsius
+
+# — Window specifications — #
+
+own_window_class Conky
+own_window yes
+own_window_type desktop
+own_window_transparent yes
+own_window_hints undecorated,below,sticky,skip_taskbar,skip_pager
+
+border_inner_margin 0
+border_outer_margin 0
+
+minimum_size 300 330
+maximum_width 300
+
+alignment top_right
+
+gap_x 30
+gap_y 75
+
+
+# — Graphics settings — #
+draw_shades no
+draw_outline no
+draw_borders no
+draw_graph_borders no
+
+# — Text settings — #
+use_xft yes
+xftfont hooge 05_53:size=6
+xftalpha 0.5
+
+default_color FFFFFF
+
+uppercase no
+use_spacer right
+
+color0 white
+color1 orange
+color2 green
+
+# — Lua Load — #
+
+lua_load $HOME/.conky/cronograph/scripts/clock_rings.lua
+lua_draw_hook_pre clock_rings
+lua_load $HOME/.conky/cronograph/scripts/multi_rings.lua
+lua_draw_hook_post main
+
+TEXT
+${execi 600 sh $HOME/.conky/cronograph/accuweather/accuweather.sh}
+#${voffset 29}${offset 120}BAT:
+${voffset 29}${goto 109}GENTOO${goto 157}Linux
+${voffset 17}${goto 65}${font hooge 05_53:size=12}${time %H:%M}${font}${goto 185}UPTIME:
+${voffset 2}${goto 65}${time %a %d %b}${goto 185}${uptime}
+${voffset 2}${goto 65}${time %Y}
+${voffset -6}${goto 145}HD
+${voffset 12}${alignc}${fs_free}/${fs_size}
+${voffset 36}${goto 91}${cpu cpu0}%${goto 221}${memperc}%
+${voffset 10}${goto 76}CPU${goto 205}MEM
+${voffset 16}${goto 82}${font hooge 05_53:size=12}${execpi 600 sed -n '4p' $HOME/.conky/cronograph/accuweather/curr_cond}°C${font}${voffset -30}${goto 125}${font ConkyWeather:size=40}${execpi 600 sed -n '2p' $HOME/.conky/cronograph/accuweather/curr_cond}${font}${voffset -16}${goto 185}${execpi 600 sed -n '3p' $HOME/.conky/cronograph/accuweather/curr_cond}${voffset 12}${goto 185}${font ConkyWeather:size=20}${voffset 1}${goto 80}${execpi 600 sed -n '7p' $HOME/.conky/cronograph/accuweather/tod_ton}${goto 135}${execpi 600 sed -n '12p' $HOME/.conky/cronograph/accuweather/tod_ton}${goto 185}${execpi 600 sed -n '17p' $HOME/.conky/cronograph/accuweather/tod_ton}${font}${voffset 6}${goto 84}${execpi 600 sed -n '9p' $HOME/.conky/cronograph/accuweather/tod_ton}°/${execpi 600 sed -n '10p' $HOME/.conky/cronograph/accuweather/tod_ton}°${goto 140}${execpi 600 sed -n '14p' $HOME/.conky/cronograph/accuweather/tod_ton}°/${execpi 600 sed -n '15p' $HOME/.conky/cronograph/accuweather/tod_ton}°${goto 190}${execpi 600 sed -n '19p' $HOME/.conky/cronograph/accuweather/tod_ton}°/${execpi 600 sed -n '20p' $HOME/.conky/cronograph/accuweather/tod_ton}°${voffset 7}${goto 85}${execpi 600 sed -n '6p' $HOME/.conky/cronograph/accuweather/tod_ton}${goto 140}${execpi 600 sed -n '11p' $HOME/.conky/cronograph/accuweather/tod_ton}${goto 190}${execpi 600 sed -n '16p' $HOME/.conky/cronograph/accuweather/tod_ton}
+${if_match ${battery_percent BAT0}>0}${if_match ${battery_percent BAT0}<=15}${image $HOME/.conky/cronograph/images/Red.png -p 129,18 -s 40x40}${endif}${endif}
+${if_match ${battery_percent BAT0}>15}${if_match ${battery_percent BAT0}<=20}${image $HOME/.conky/cronograph/images/Orange.png -p 129,18 -s 40x40}${endif}${endif}
+${if_match ${battery_percent BAT0}>20}${if_match ${battery_percent BAT0}<=35}${image $HOME/.conky/cronograph/images/Yellow.png -p 129,18 -s 40x40}${endif}${endif}
+${if_match ${battery_percent BAT0}>35}${if_match ${battery_percent BAT0}<=100}${image $HOME/.conky/cronograph/images/Dark_Green.png -p 129,18 -s 40x40}${endif}${endif}
+${execpi 30 cat $HOME/.conky/cronograph/scripts/blinkingLED}
+## mpd ##
+${if_mpd_playing}${voffset 6}${goto 10}${font Sans:size=8:bold}${mpd_artist}${font}${voffset -5}${font Sans:size=8} - ${mpd_title}${font}
+${voffset 4}${goto 10}${mpd_bar 5,220}${alignr 10}${mpd_elapsed}/${mpd_length}
+${else}${voffset 6}${goto 10}${font hooge 05_53:size=8}MPD: stopped${font}
+${endif}
+
+# vim: set ts=8 sw=4 tw=0 fenc=utf-8 ft=conkyrc: #
diff --git a/.conky/cronograph/images/Blank.png b/.conky/cronograph/images/Blank.png
new file mode 100644
index 0000000..a8adf65
--- /dev/null
+++ b/.conky/cronograph/images/Blank.png
Binary files differ
diff --git a/.conky/cronograph/images/Blue.png b/.conky/cronograph/images/Blue.png
new file mode 100644
index 0000000..2407cbe
--- /dev/null
+++ b/.conky/cronograph/images/Blue.png
Binary files differ
diff --git a/.conky/cronograph/images/Dark_Green.png b/.conky/cronograph/images/Dark_Green.png
new file mode 100644
index 0000000..d40bcc4
--- /dev/null
+++ b/.conky/cronograph/images/Dark_Green.png
Binary files differ
diff --git a/.conky/cronograph/images/Dark_Purple.png b/.conky/cronograph/images/Dark_Purple.png
new file mode 100644
index 0000000..bb5da19
--- /dev/null
+++ b/.conky/cronograph/images/Dark_Purple.png
Binary files differ
diff --git a/.conky/cronograph/images/Green.png b/.conky/cronograph/images/Green.png
new file mode 100644
index 0000000..602ad43
--- /dev/null
+++ b/.conky/cronograph/images/Green.png
Binary files differ
diff --git a/.conky/cronograph/images/Orange.png b/.conky/cronograph/images/Orange.png
new file mode 100644
index 0000000..7574f9c
--- /dev/null
+++ b/.conky/cronograph/images/Orange.png
Binary files differ
diff --git a/.conky/cronograph/images/Pink.png b/.conky/cronograph/images/Pink.png
new file mode 100644
index 0000000..6d2d973
--- /dev/null
+++ b/.conky/cronograph/images/Pink.png
Binary files differ
diff --git a/.conky/cronograph/images/Purple.png b/.conky/cronograph/images/Purple.png
new file mode 100644
index 0000000..e8c58e7
--- /dev/null
+++ b/.conky/cronograph/images/Purple.png
Binary files differ
diff --git a/.conky/cronograph/images/Red.png b/.conky/cronograph/images/Red.png
new file mode 100644
index 0000000..d2673e6
--- /dev/null
+++ b/.conky/cronograph/images/Red.png
Binary files differ
diff --git a/.conky/cronograph/images/Yellow.png b/.conky/cronograph/images/Yellow.png
new file mode 100644
index 0000000..8e2f62c
--- /dev/null
+++ b/.conky/cronograph/images/Yellow.png
Binary files differ
diff --git a/.conky/cronograph/scripts/blinkingLED b/.conky/cronograph/scripts/blinkingLED
new file mode 100755
index 0000000..3f4c814
--- /dev/null
+++ b/.conky/cronograph/scripts/blinkingLED
@@ -0,0 +1,3 @@
+${image $HOME/.conky/cronograph/images/Blank.png -p 129, 241 -s 40x40}${if_match ${execi 1 num=$(date +%-S);rem=$(( num % 2 ));if [ $rem -eq 0 ] ; then echo 0 ; else echo 1 ; fi}==0}${image $HOME/.conky/cronograph/images/Blue.png -p 129, 241 -s 40x40}${endif}
+${image $HOME/.conky/cronograph/images/Blank.png -p 19, 129 -s 40x40}${if_match ${execi 1 num=$(date +%-S);rem=$(( num % 2 ));if [ $rem -eq 0 ] ; then echo 0 ; else echo 1 ; fi}==0}${image $HOME/.conky/cronograph/images/Blue.png -p 19, 129 -s 40x40}${endif}
+${image $HOME/.conky/cronograph/images/Blank.png -p 240, 129 -s 40x40}${if_match ${execi 1 num=$(date +%-S);rem=$(( num % 2 ));if [ $rem -eq 0 ] ; then echo 0 ; else echo 1 ; fi}==0}${image $HOME/.conky/cronograph/images/Blue.png -p 240, 129 -s 40x40}${endif}
diff --git a/.conky/cronograph/scripts/clock_rings.lua b/.conky/cronograph/scripts/clock_rings.lua
new file mode 100755
index 0000000..fb6a838
--- /dev/null
+++ b/.conky/cronograph/scripts/clock_rings.lua
@@ -0,0 +1,358 @@
+--[[
+Clock Rings by londonali1010 (2009)
+
+This script draws percentage meters as rings, and also draws clock hands if you want! It is fully customisable; all options are described in the script. This script is based off a combination of my clock.lua script and my rings.lua script.
+
+IMPORTANT: if you are using the 'cpu' function, it will cause a segmentation fault if it tries to draw a ring straight away. The if statement near the end of the script uses a delay to make sure that this doesn't happen. It calculates the length of the delay by the number of updates since Conky started. Generally, a value of 5s is long enough, so if you update Conky every 1s, use update_num > 5 in that if statement (the default). If you only update Conky every 2s, you should change it to update_num > 3; conversely if you update Conky every 0.5s, you should use update_num > 10. ALSO, if you change your Conky, is it best to use "killall conky; conky" to update it, otherwise the update_num will not be reset and you will get an error.
+
+To call this script in Conky, use the following (assuming that you save this script to ~/scripts/rings.lua):
+ lua_load ~/scripts/clock_rings-v1.1.1.lua
+ lua_draw_hook_pre clock_rings
+
+Changelog:
++ v1.1.1 -- Fixed minor bug that caused the script to crash if conky_parse() returns a nil value (20.10.2009)
++ v1.1 -- Added colour option for clock hands (07.10.2009)
++ v1.0 -- Original release (30.09.2009)
+]]
+
+settings_table = {
+ {
+ -- Edit this table to customise your rings.
+ -- You can create more rings simply by adding more elements to settings_table.
+ -- "name" is the type of stat to display; you can choose from 'cpu', 'memperc', 'fs_used_perc', 'battery_used_perc'.
+ name='time',
+ -- "arg" is the argument to the stat type, e.g. if in Conky you would write ${cpu cpu0}, 'cpu0' would be the argument. If you would not use an argument in the Conky variable, use ''.
+ arg='%I.%M',
+ -- "max" is the maximum value of the ring. If the Conky variable outputs a percentage, use 100.
+ max=12,
+ -- "bg_colour" is the colour of the base ring.
+ bg_colour=0xFFFFFF,
+ -- "bg_alpha" is the alpha value of the base ring.
+ bg_alpha=0.1,
+ -- "fg_colour" is the colour of the indicator part of the ring.
+ fg_colour=0xFFFFFF,
+ -- "fg_alpha" is the alpha value of the indicator part of the ring.
+ fg_alpha=0.5,
+ -- "x" and "y" are the x and y coordinates of the centre of the ring, relative to the top left corner of the Conky window.
+ x=150, y=150,
+ -- "radius" is the radius of the ring.
+ radius=135,
+ -- "thickness" is the thickness of the ring, centred around the radius.
+ thickness=4,
+ -- "start_angle" is the starting angle of the ring, in degrees, clockwise from top. Value can be either positive or negative.
+ start_angle=0,
+ -- "end_angle" is the ending angle of the ring, in degrees, clockwise from top. Value can be either positive or negative, but must be larger than start_angle.
+ end_angle=360
+ },
+ {
+ name='time',
+ arg='%M.%S',
+ max=60,
+ bg_colour=0xFFFFFF,
+ bg_alpha=0.1,
+ fg_colour=0xFFFFFF,
+ fg_alpha=0.5,
+ x=150, y=150,
+ radius=140,
+ thickness=4,
+ start_angle=0,
+ end_angle=360
+ },
+ {
+ name='time',
+ arg='%S',
+ max=60,
+ bg_colour=0xFFFFFF,
+ bg_alpha=0.1,
+ fg_colour=0xFFFFFF,
+ fg_alpha=0.5,
+ x=150, y=150,
+ radius=145,
+ thickness=4,
+ start_angle=0,
+ end_angle=360
+ },
+ {
+ name='',
+ arg='',
+ max=100,
+ bg_colour=0x000000,
+ bg_alpha=0.1,
+ fg_colour=0xFFFFFF,
+ fg_alpha=0.0,
+ x=150, y=150,
+ radius=66,
+ thickness=130,
+ start_angle=0,
+ end_angle=360
+ },
+ {
+ name='',
+ arg='',
+ max=100,
+ bg_colour=0xFFFFFF,
+ bg_alpha=1.0,
+ fg_colour=0xFFFFFF,
+ fg_alpha=0.0,
+ x=150, y=150,
+ radius=1,
+ thickness=10,
+ start_angle=0,
+ end_angle=360
+ },
+ {
+ name='',
+ arg='',
+ max=100,
+ bg_colour=0xFFFFFF,
+ bg_alpha=1.0,
+ fg_colour=0xFFFFFF,
+ fg_alpha=0.0,
+ x=85, y=150,
+ radius=30,
+ thickness=1,
+ start_angle=0,
+ end_angle=360
+ },
+ {
+ name='',
+ arg='',
+ max=100,
+ bg_colour=0x000000,
+ bg_alpha=0.3,
+ fg_colour=0xFFFFFF,
+ fg_alpha=0.0,
+ x=85, y=150,
+ radius=15,
+ thickness=27,
+ start_angle=0,
+ end_angle=360
+ },
+ {
+ name='',
+ arg='',
+ max=100,
+ bg_colour=0xFFFFFF,
+ bg_alpha=1.0,
+ fg_colour=0xFFFFFF,
+ fg_alpha=0.0,
+ x=85, y=150,
+ radius=1,
+ thickness=2,
+ start_angle=0,
+ end_angle=360
+ },
+ {
+ name='',
+ arg='',
+ max=100,
+ bg_colour=0xFFFFFF,
+ bg_alpha=1.0,
+ fg_colour=0xFFFFFF,
+ fg_alpha=0.0,
+ x=215, y=150,
+ radius=30,
+ thickness=1,
+ start_angle=0,
+ end_angle=360
+ },
+ {
+ name='',
+ arg='',
+ max=100,
+ bg_colour=0x000000,
+ bg_alpha=0.3,
+ fg_colour=0xFFFFFF,
+ fg_alpha=0.0,
+ x=215, y=150,
+ radius=15,
+ thickness=27,
+ start_angle=0,
+ end_angle=360
+ },
+ {
+ name='',
+ arg='',
+ max=100,
+ bg_colour=0xFFFFFF,
+ bg_alpha=1.0,
+ fg_colour=0xFFFFFF,
+ fg_alpha=0.0,
+ x=215, y=150,
+ radius=1,
+ thickness=2,
+ start_angle=0,
+ end_angle=360
+ },
+ {
+ name='',
+ arg='',
+ max=100,
+ bg_colour=0xFFFFFF,
+ bg_alpha=1.0,
+ fg_colour=0xFFFFFF,
+ fg_alpha=0.0,
+ x=150, y=75,
+ radius=25,
+ thickness=1,
+ start_angle=0,
+ end_angle=360
+ },
+ {
+ name='',
+ arg='',
+ max=100,
+ bg_colour=0x000000,
+ bg_alpha=0.3,
+ fg_colour=0xFFFFFF,
+ fg_alpha=0.0,
+ x=150, y=75,
+ radius=13,
+ thickness=22,
+ start_angle=0,
+ end_angle=360
+ },
+ {
+ name='',
+ arg='',
+ max=100,
+ bg_colour=0xFFFFFF,
+ bg_alpha=1.0,
+ fg_colour=0xFFFFFF,
+ fg_alpha=0.0,
+ x=150, y=75,
+ radius=1,
+ thickness=2,
+ start_angle=0,
+ end_angle=360
+ },
+ }
+
+-- Use these settings to define the origin and extent of your clock.
+
+clock_r=127
+
+-- "clock_x" and "clock_y" are the coordinates of the centre of the clock, in pixels, from the top left of the Conky window.
+
+clock_x=150
+clock_y=150
+
+-- Colour & alpha of the clock hands
+
+clock_colour=0xFFFFFF
+clock_alpha=1
+
+-- Do you want to show the seconds hand?
+
+show_seconds=true
+
+require 'cairo'
+
+function rgb_to_r_g_b(colour,alpha)
+ return ((colour / 0x10000) % 0x100) / 255., ((colour / 0x100) % 0x100) / 255., (colour % 0x100) / 255., alpha
+end
+
+function draw_ring(cr,t,pt)
+ local w,h=conky_window.width,conky_window.height
+
+ local xc,yc,ring_r,ring_w,sa,ea=pt['x'],pt['y'],pt['radius'],pt['thickness'],pt['start_angle'],pt['end_angle']
+ local bgc, bga, fgc, fga=pt['bg_colour'], pt['bg_alpha'], pt['fg_colour'], pt['fg_alpha']
+
+ local angle_0=sa*(2*math.pi/360)-math.pi/2
+ local angle_f=ea*(2*math.pi/360)-math.pi/2
+ local t_arc=t*(angle_f-angle_0)
+
+ -- Draw background ring
+
+ cairo_arc(cr,xc,yc,ring_r,angle_0,angle_f)
+ cairo_set_source_rgba(cr,rgb_to_r_g_b(bgc,bga))
+ cairo_set_line_width(cr,ring_w)
+ cairo_stroke(cr)
+
+ -- Draw indicator ring
+
+ cairo_arc(cr,xc,yc,ring_r,angle_0,angle_0+t_arc)
+ cairo_set_source_rgba(cr,rgb_to_r_g_b(fgc,fga))
+ cairo_stroke(cr)
+end
+
+function draw_clock_hands(cr,xc,yc)
+ local secs,mins,hours,secs_arc,mins_arc,hours_arc
+ local xh,yh,xm,ym,xs,ys
+
+ secs=os.date("%S")
+ mins=os.date("%M")
+ hours=os.date("%I")
+
+ secs_arc=(2*math.pi/60)*secs
+ mins_arc=(2*math.pi/60)*mins+secs_arc/60
+ hours_arc=(2*math.pi/12)*hours+mins_arc/12
+
+ -- Draw hour hand
+
+ xh=xc+0.7*clock_r*math.sin(hours_arc)
+ yh=yc-0.7*clock_r*math.cos(hours_arc)
+ cairo_move_to(cr,xc,yc)
+ cairo_line_to(cr,xh,yh)
+
+ cairo_set_line_cap(cr,CAIRO_LINE_CAP_ROUND)
+ cairo_set_line_width(cr,5)
+ cairo_set_source_rgba(cr,rgb_to_r_g_b(clock_colour,clock_alpha))
+ cairo_stroke(cr)
+
+ -- Draw minute hand
+
+ xm=xc+clock_r*math.sin(mins_arc)
+ ym=yc-clock_r*math.cos(mins_arc)
+ cairo_move_to(cr,xc,yc)
+ cairo_line_to(cr,xm,ym)
+
+ cairo_set_line_width(cr,3)
+ cairo_stroke(cr)
+
+ -- Draw seconds hand
+
+ if show_seconds then
+ xs=xc+clock_r*math.sin(secs_arc)
+ ys=yc-clock_r*math.cos(secs_arc)
+ cairo_move_to(cr,xc,yc)
+ cairo_line_to(cr,xs,ys)
+
+ cairo_set_line_width(cr,1)
+ cairo_stroke(cr)
+ end
+end
+
+function conky_clock_rings()
+ local function setup_rings(cr,pt)
+ local str=''
+ local value=0
+
+ str=string.format('${%s %s}',pt['name'],pt['arg'])
+ str=conky_parse(str)
+
+ value=tonumber(str)
+ if value == nil then value = 0 end
+ pct=value/pt['max']
+
+ draw_ring(cr,pct,pt)
+ end
+
+ -- Check that Conky has been running for at least 5s
+
+ if conky_window==nil then return end
+ local cs=cairo_xlib_surface_create(conky_window.display,conky_window.drawable,conky_window.visual, conky_window.width,conky_window.height)
+
+ local cr=cairo_create(cs)
+
+ local updates=conky_parse('${updates}')
+ update_num=tonumber(updates)
+
+ if update_num>5 then
+ for i in pairs(settings_table) do
+ setup_rings(cr,settings_table[i])
+ end
+ end
+
+ draw_clock_hands(cr,clock_x,clock_y)
+end
diff --git a/.conky/cronograph/scripts/multi_rings.lua b/.conky/cronograph/scripts/multi_rings.lua
new file mode 100755
index 0000000..b9735b2
--- /dev/null
+++ b/.conky/cronograph/scripts/multi_rings.lua
@@ -0,0 +1,375 @@
+--==============================================================================
+-- multi_rings.lua
+--
+-- author : SLK
+-- version : v2011011601
+-- license : Distributed under the terms of GNU GPL version 2 or later
+--
+--==============================================================================
+
+require 'cairo'
+
+--------------------------------------------------------------------------------
+-- clock DATA
+-- HOURS
+clock_h = {
+ {
+ name='time', arg='%H', max_value=12,
+ x=150, y=150,
+ graph_radius=140,
+ graph_thickness=3,
+ graph_unit_angle=30, graph_unit_thickness=5,
+ graph_bg_colour=0xffffff, graph_bg_alpha=0.0,
+ graph_fg_colour=0xFFFFFF, graph_fg_alpha=0.0,
+ txt_radius=100,
+ txt_weight=1, txt_size=10.0,
+ txt_fg_colour=0xFFFFFF, txt_fg_alpha=0.0,
+ graduation_radius=125,
+ graduation_thickness=10, graduation_mark_thickness=2,
+ graduation_unit_angle=30,
+ graduation_fg_colour=0xFFFFFF, graduation_fg_alpha=1.0,
+ },
+}
+-- MINUTES
+clock_m = {
+ {
+ name='time', arg='%M', max_value=60,
+ x=150, y=150,
+ graph_radius=100,
+ graph_thickness=3,
+ graph_unit_angle=6, graph_unit_thickness=3,
+ graph_bg_colour=0xffffff, graph_bg_alpha=0.0,
+ graph_fg_colour=0xFFFFFF, graph_fg_alpha=0.0,
+ txt_radius=100,
+ txt_weight=0, txt_size=9.0,
+ txt_fg_colour=0xFFFFFF, txt_fg_alpha=0.0,
+ graduation_radius=57,
+ graduation_thickness=0, graduation_mark_thickness=2,
+ graduation_unit_angle=30,
+ graduation_fg_colour=0xFFFFFF, graduation_fg_alpha=0.0,
+ },
+}
+-- SECONDS
+clock_s = {
+ {
+ name='time', arg='%S', max_value=60,
+ x=150, y=150,
+ graph_radius=50,
+ graph_thickness=3,
+ graph_unit_angle=6, graph_unit_thickness=3,
+ graph_bg_colour=0xffffff, graph_bg_alpha=0.0,
+ graph_fg_colour=0xFFFFFF, graph_fg_alpha=0.0,
+ txt_radius=100,
+ txt_weight=0, txt_size=12.0,
+ txt_fg_colour=0xFFFFFF, txt_fg_alpha=0.0,
+ graduation_radius=0,
+ graduation_thickness=0, graduation_mark_thickness=0,
+ graduation_unit_angle=0,
+ graduation_fg_colour=0xFFFFFF, graduation_fg_alpha=0.0,
+ },
+}
+
+--------------------------------------------------------------------------------
+-- gauge DATA
+gauge = {
+{
+ name='cpu', arg='cpu0', max_value=100,
+ x=85, y=150,
+ graph_radius=14,
+ graph_thickness=27,
+ graph_start_angle=0,
+ graph_unit_angle=3.5, graph_unit_thickness=3.0,
+ graph_bg_colour=0xFFFFFF, graph_bg_alpha=0.0,
+ graph_fg_colour=0xFFFFFF, graph_fg_alpha=0.0,
+ hand_fg_colour=0xFFFFFF, hand_fg_alpha=1.0,
+ txt_radius=1,
+ txt_weight=0, txt_size=8.0,
+ txt_fg_colour=0xFFFFFF, txt_fg_alpha=0.0,
+ graduation_radius=27,
+ graduation_thickness=4, graduation_mark_thickness=4,
+ graduation_unit_angle=30,
+ graduation_fg_colour=0xFFFFFF, graduation_fg_alpha=1.0,
+ caption='',
+ caption_weight=1, caption_size=8.0,
+ caption_fg_colour=0xFFFFFF, caption_fg_alpha=0.0,
+},
+{
+ name='memperc', arg='', max_value=100,
+ x=215, y=150,
+ graph_radius=14,
+ graph_thickness=27,
+ graph_start_angle=0,
+ graph_unit_angle=3.5, graph_unit_thickness=3.0,
+ graph_bg_colour=0xFFFFFF, graph_bg_alpha=0.0,
+ graph_fg_colour=0xFFFFFF, graph_fg_alpha=0.0,
+ hand_fg_colour=0xFFFFFF, hand_fg_alpha=1.0,
+ txt_radius=1,
+ txt_weight=0, txt_size=8.0,
+ txt_fg_colour=0xFFFFFF, txt_fg_alpha=0.0,
+ graduation_radius=27,
+ graduation_thickness=4, graduation_mark_thickness=4,
+ graduation_unit_angle=30,
+ graduation_fg_colour=0xFFFFFF, graduation_fg_alpha=1.0,
+ caption='',
+ caption_weight=1, caption_size=8.0,
+ caption_fg_colour=0xFFFFFF, caption_fg_alpha=0.0,
+},
+{
+ name='fs_used_perc', arg='/', max_value=100,
+ x=150, y=75,
+ graph_radius=10,
+ graph_thickness=23,
+ graph_start_angle=0,
+ graph_unit_angle=3.5, graph_unit_thickness=3.0,
+ graph_bg_colour=0xFFFFFF, graph_bg_alpha=0.0,
+ graph_fg_colour=0xFFFFFF, graph_fg_alpha=0.0,
+ hand_fg_colour=0xFFFFFF, hand_fg_alpha=1.0,
+ txt_radius=1,
+ txt_weight=0, txt_size=8.0,
+ txt_fg_colour=0xFFFFFF, txt_fg_alpha=0.0,
+ graduation_radius=22,
+ graduation_thickness=4, graduation_mark_thickness=4,
+ graduation_unit_angle=30,
+ graduation_fg_colour=0xFFFFFF, graduation_fg_alpha=1.0,
+ caption='',
+ caption_weight=1, caption_size=8.0,
+ caption_fg_colour=0xFFFFFF, caption_fg_alpha=0.0,
+},
+}
+
+-------------------------------------------------------------------------------
+-- rgb_to_r_g_b
+-- converts color in hexa to decimal
+--
+function rgb_to_r_g_b(colour, alpha)
+ return ((colour / 0x10000) % 0x100) / 255., ((colour / 0x100) % 0x100) / 255., (colour % 0x100) / 255., alpha
+end
+
+-------------------------------------------------------------------------------
+-- angle_to_position
+-- convert degree to rad and rotate (0 degree is top/north)
+--
+function angle_to_position(start_angle, current_angle)
+ local pos = current_angle + start_angle
+ return ( ( pos * (2 * math.pi / 360) ) - (math.pi / 2) )
+end
+
+-------------------------------------------------------------------------------
+-- draw_clock_ring
+-- displays clock
+--
+function draw_clock_ring(display, data, value)
+ local max_value = data['max_value']
+ local x, y = data['x'], data['y']
+ local graph_radius = data['graph_radius']
+ local graph_thickness, graph_unit_thickness = data['graph_thickness'], data['graph_unit_thickness']
+ local graph_unit_angle = data['graph_unit_angle']
+ local graph_bg_colour, graph_bg_alpha = data['graph_bg_colour'], data['graph_bg_alpha']
+ local graph_fg_colour, graph_fg_alpha = data['graph_fg_colour'], data['graph_fg_alpha']
+
+ -- background ring
+ cairo_arc(display, x, y, graph_radius, 0, 2 * math.pi)
+ cairo_set_source_rgba(display, rgb_to_r_g_b(graph_bg_colour, graph_bg_alpha))
+ cairo_set_line_width(display, graph_thickness)
+ cairo_stroke(display)
+
+ -- arc of value
+ local val = (value % max_value)
+ local i = 1
+ while i <= val do
+ cairo_arc(display, x, y, graph_radius,( ((graph_unit_angle * i) - graph_unit_thickness)*(2*math.pi/360) )-(math.pi/2),((graph_unit_angle * i) * (2*math.pi/360))-(math.pi/2))
+ cairo_set_source_rgba(display,rgb_to_r_g_b(graph_fg_colour,graph_fg_alpha))
+ cairo_stroke(display)
+ i = i + 1
+ end
+ local angle = (graph_unit_angle * i) - graph_unit_thickness
+
+ -- graduations marks
+ local graduation_radius = data['graduation_radius']
+ local graduation_thickness, graduation_mark_thickness = data['graduation_thickness'], data['graduation_mark_thickness']
+ local graduation_unit_angle = data['graduation_unit_angle']
+ local graduation_fg_colour, graduation_fg_alpha = data['graduation_fg_colour'], data['graduation_fg_alpha']
+ if graduation_radius > 0 and graduation_thickness > 0 and graduation_unit_angle > 0 then
+ local nb_graduation = 360 / graduation_unit_angle
+ local i = 1
+ while i <= nb_graduation do
+ cairo_set_line_width(display, graduation_thickness)
+ cairo_arc(display, x, y, graduation_radius, (((graduation_unit_angle * i)-(graduation_mark_thickness/2))*(2*math.pi/360))-(math.pi/2),(((graduation_unit_angle * i)+(graduation_mark_thickness/2))*(2*math.pi/360))-(math.pi/2))
+ cairo_set_source_rgba(display,rgb_to_r_g_b(graduation_fg_colour,graduation_fg_alpha))
+ cairo_stroke(display)
+ cairo_set_line_width(display, graph_thickness)
+ i = i + 1
+ end
+ end
+
+ -- text
+ local txt_radius = data['txt_radius']
+ local txt_weight, txt_size = data['txt_weight'], data['txt_size']
+ local txt_fg_colour, txt_fg_alpha = data['txt_fg_colour'], data['txt_fg_alpha']
+ local movex = txt_radius * (math.cos((angle * 2 * math.pi / 360)-(math.pi/2)))
+ local movey = txt_radius * (math.sin((angle * 2 * math.pi / 360)-(math.pi/2)))
+ cairo_select_font_face (display, "ubuntu", CAIRO_FONT_SLANT_NORMAL, txt_weight);
+ cairo_set_font_size (display, txt_size);
+ cairo_set_source_rgba (display, rgb_to_r_g_b(txt_fg_colour, txt_fg_alpha));
+ cairo_move_to (display, x + movex - (txt_size / 2), y + movey + 3);
+ cairo_show_text (display, value);
+ cairo_stroke (display);
+end
+
+-------------------------------------------------------------------------------
+-- draw_gauge_ring
+-- displays gauges
+--
+function draw_gauge_ring(display, data, value)
+ local max_value = data['max_value']
+ local x, y = data['x'], data['y']
+ local graph_radius = data['graph_radius']
+ local graph_thickness, graph_unit_thickness = data['graph_thickness'], data['graph_unit_thickness']
+ local graph_start_angle = data['graph_start_angle']
+ local graph_unit_angle = data['graph_unit_angle']
+ local graph_bg_colour, graph_bg_alpha = data['graph_bg_colour'], data['graph_bg_alpha']
+ local graph_fg_colour, graph_fg_alpha = data['graph_fg_colour'], data['graph_fg_alpha']
+ local hand_fg_colour, hand_fg_alpha = data['hand_fg_colour'], data['hand_fg_alpha']
+ local graph_end_angle = (max_value * graph_unit_angle) % 360
+
+ -- background ring
+ cairo_arc(display, x, y, graph_radius, angle_to_position(graph_start_angle, 0), angle_to_position(graph_start_angle, graph_end_angle))
+ cairo_set_source_rgba(display, rgb_to_r_g_b(graph_bg_colour, graph_bg_alpha))
+ cairo_set_line_width(display, graph_thickness)
+ cairo_stroke(display)
+
+ -- arc of value
+ local val = value % (max_value + 1)
+ local start_arc = 0
+ local stop_arc = 0
+ local i = 1
+ while i <= val do
+ start_arc = (graph_unit_angle * i) - graph_unit_thickness
+ stop_arc = (graph_unit_angle * i)
+ cairo_arc(display, x, y, graph_radius, angle_to_position(graph_start_angle, start_arc), angle_to_position(graph_start_angle, stop_arc))
+ cairo_set_source_rgba(display, rgb_to_r_g_b(graph_fg_colour, graph_fg_alpha))
+ cairo_stroke(display)
+ i = i + 1
+ end
+ local angle = start_arc
+
+ -- hand
+ start_arc = (graph_unit_angle * val) - (graph_unit_thickness * 2)
+ stop_arc = (graph_unit_angle * val)
+ cairo_arc(display, x, y, graph_radius, angle_to_position(graph_start_angle, start_arc), angle_to_position(graph_start_angle, stop_arc))
+ cairo_set_source_rgba(display, rgb_to_r_g_b(hand_fg_colour, hand_fg_alpha))
+ cairo_stroke(display)
+
+ -- graduations marks
+ local graduation_radius = data['graduation_radius']
+ local graduation_thickness, graduation_mark_thickness = data['graduation_thickness'], data['graduation_mark_thickness']
+ local graduation_unit_angle = data['graduation_unit_angle']
+ local graduation_fg_colour, graduation_fg_alpha = data['graduation_fg_colour'], data['graduation_fg_alpha']
+ if graduation_radius > 0 and graduation_thickness > 0 and graduation_unit_angle > 0 then
+ local nb_graduation = graph_end_angle / graduation_unit_angle
+ local i = 0
+ while i < nb_graduation do
+ cairo_set_line_width(display, graduation_thickness)
+ start_arc = (graduation_unit_angle * i) - (graduation_mark_thickness / 2)
+ stop_arc = (graduation_unit_angle * i) + (graduation_mark_thickness / 2)
+ cairo_arc(display, x, y, graduation_radius, angle_to_position(graph_start_angle, start_arc), angle_to_position(graph_start_angle, stop_arc))
+ cairo_set_source_rgba(display,rgb_to_r_g_b(graduation_fg_colour,graduation_fg_alpha))
+ cairo_stroke(display)
+ cairo_set_line_width(display, graph_thickness)
+ i = i + 1
+ end
+ end
+
+ -- text
+ local txt_radius = data['txt_radius']
+ local txt_weight, txt_size = data['txt_weight'], data['txt_size']
+ local txt_fg_colour, txt_fg_alpha = data['txt_fg_colour'], data['txt_fg_alpha']
+ local movex = txt_radius * math.cos(angle_to_position(graph_start_angle, angle))
+ local movey = txt_radius * math.sin(angle_to_position(graph_start_angle, angle))
+ cairo_select_font_face (display, "ubuntu", CAIRO_FONT_SLANT_NORMAL, txt_weight)
+ cairo_set_font_size (display, txt_size)
+ cairo_set_source_rgba (display, rgb_to_r_g_b(txt_fg_colour, txt_fg_alpha))
+ cairo_move_to (display, x + movex - (txt_size / 2), y + movey + 3)
+ cairo_show_text (display, value)
+ cairo_stroke (display)
+
+ -- caption
+ local caption = data['caption']
+ local caption_weight, caption_size = data['caption_weight'], data['caption_size']
+ local caption_fg_colour, caption_fg_alpha = data['caption_fg_colour'], data['caption_fg_alpha']
+ local tox = graph_radius * (math.cos((graph_start_angle * 2 * math.pi / 360)-(math.pi/2)))
+ local toy = graph_radius * (math.sin((graph_start_angle * 2 * math.pi / 360)-(math.pi/2)))
+ cairo_select_font_face (display, "ubuntu", CAIRO_FONT_SLANT_NORMAL, caption_weight);
+ cairo_set_font_size (display, caption_size)
+ cairo_set_source_rgba (display, rgb_to_r_g_b(caption_fg_colour, caption_fg_alpha))
+ cairo_move_to (display, x + tox + 5, y + toy + 1)
+ -- bad hack but not enough time !
+ if graph_start_angle < 105 then
+ cairo_move_to (display, x + tox - 30, y + toy + 1)
+ end
+ cairo_show_text (display, caption)
+ cairo_stroke (display)
+end
+
+-------------------------------------------------------------------------------
+-- go_clock_rings
+-- loads data and displays clock
+--
+function go_clock_rings(display)
+ local function load_clock_rings(display, data)
+ local str, value = '', 0
+ str = string.format('${%s %s}',data['name'], data['arg'])
+ str = conky_parse(str)
+ value = tonumber(str)
+ draw_clock_ring(display, data, value)
+ end
+
+ for i in pairs(clock_h) do
+ load_clock_rings(display, clock_h[i])
+ end
+ for i in pairs(clock_m) do
+ load_clock_rings(display, clock_m[i])
+ end
+ for i in pairs(clock_s) do
+ load_clock_rings(display, clock_s[i])
+ end
+end
+
+-------------------------------------------------------------------------------
+-- go_gauge_rings
+-- loads data and displays gauges
+--
+function go_gauge_rings(display)
+ local function load_gauge_rings(display, data)
+ local str, value = '', 0
+ str = string.format('${%s %s}',data['name'], data['arg'])
+ str = conky_parse(str)
+ value = tonumber(str)
+ draw_gauge_ring(display, data, value)
+ end
+
+ for i in pairs(gauge) do
+ load_gauge_rings(display, gauge[i])
+ end
+end
+
+-------------------------------------------------------------------------------
+-- MAIN
+function conky_main()
+ if conky_window == nil then
+ return
+ end
+
+ local cs = cairo_xlib_surface_create(conky_window.display, conky_window.drawable, conky_window.visual, conky_window.width, conky_window.height)
+ local display = cairo_create(cs)
+
+ local updates = conky_parse('${updates}')
+ update_num = tonumber(updates)
+
+ if update_num > 5 then
+ go_clock_rings(display)
+ go_gauge_rings(display)
+ end
+
+end
+
diff --git a/.conkyrc b/.conkyrc
new file mode 100644
index 0000000..3a54030
--- /dev/null
+++ b/.conkyrc
@@ -0,0 +1,89 @@
+# — Conky settings — #
+
+background yes
+
+update_interval 1
+total_run_times 0
+net_avg_samples 2
+
+override_utf8_locale yes
+
+double_buffer yes
+no_buffers yes
+
+text_buffer_size 2048
+imlib_cache_size 0
+
+temperature_unit celsius
+
+# — Window specifications — #
+
+own_window_class Conky
+own_window yes
+own_window_type desktop
+own_window_transparent yes
+own_window_hints undecorated,below,sticky,skip_taskbar,skip_pager
+
+border_inner_margin 0
+border_outer_margin 0
+
+minimum_size 300 330
+maximum_width 300
+
+alignment top_right
+
+gap_x 30
+gap_y 75
+
+
+# — Graphics settings — #
+draw_shades no
+draw_outline no
+draw_borders no
+draw_graph_borders no
+
+# — Text settings — #
+use_xft yes
+xftfont hooge 05_53:size=6
+xftalpha 0.5
+
+default_color FFFFFF
+
+uppercase no
+use_spacer right
+
+color0 white
+color1 orange
+color2 green
+
+# — Lua Load — #
+
+lua_load $HOME/.conky/cronograph/scripts/clock_rings.lua
+lua_draw_hook_pre clock_rings
+lua_load $HOME/.conky/cronograph/scripts/multi_rings.lua
+lua_draw_hook_post main
+
+TEXT
+${execi 600 sh $HOME/.conky/cronograph/accuweather/accuweather.sh}
+#${voffset 29}${offset 120}BAT:
+${voffset 29}${goto 109}GENTOO${goto 157}Linux
+${voffset 17}${goto 65}${font hooge 05_53:size=12}${time %H:%M}${font}${goto 185}UPTIME:
+${voffset 2}${goto 65}${time %a %d %b}${goto 185}${uptime}
+${voffset 2}${goto 65}${time %Y}
+${voffset -6}${goto 145}HD
+${voffset 12}${alignc}${fs_free}/${fs_size}
+${voffset 36}${goto 91}${cpu cpu0}%${goto 221}${memperc}%
+${voffset 10}${goto 76}CPU${goto 205}MEM
+${voffset 16}${goto 82}${font hooge 05_53:size=12}${execpi 600 sed -n '4p' $HOME/.conky/cronograph/accuweather/curr_cond}°C${font}${voffset -30}${goto 125}${font ConkyWeather:size=40}${execpi 600 sed -n '2p' $HOME/.conky/cronograph/accuweather/curr_cond}${font}${voffset -16}${goto 185}${execpi 600 sed -n '3p' $HOME/.conky/cronograph/accuweather/curr_cond}${voffset 12}${goto 185}${font ConkyWeather:size=20}${voffset 1}${goto 80}${execpi 600 sed -n '7p' $HOME/.conky/cronograph/accuweather/tod_ton}${goto 135}${execpi 600 sed -n '12p' $HOME/.conky/cronograph/accuweather/tod_ton}${goto 185}${execpi 600 sed -n '17p' $HOME/.conky/cronograph/accuweather/tod_ton}${font}${voffset 6}${goto 84}${execpi 600 sed -n '9p' $HOME/.conky/cronograph/accuweather/tod_ton}°/${execpi 600 sed -n '10p' $HOME/.conky/cronograph/accuweather/tod_ton}°${goto 140}${execpi 600 sed -n '14p' $HOME/.conky/cronograph/accuweather/tod_ton}°/${execpi 600 sed -n '15p' $HOME/.conky/cronograph/accuweather/tod_ton}°${goto 190}${execpi 600 sed -n '19p' $HOME/.conky/cronograph/accuweather/tod_ton}°/${execpi 600 sed -n '20p' $HOME/.conky/cronograph/accuweather/tod_ton}°${voffset 7}${goto 85}${execpi 600 sed -n '6p' $HOME/.conky/cronograph/accuweather/tod_ton}${goto 140}${execpi 600 sed -n '11p' $HOME/.conky/cronograph/accuweather/tod_ton}${goto 190}${execpi 600 sed -n '16p' $HOME/.conky/cronograph/accuweather/tod_ton}
+${if_match ${battery_percent BAT0}>0}${if_match ${battery_percent BAT0}<=15}${image $HOME/.conky/cronograph/images/Red.png -p 129,18 -s 40x40}${endif}${endif}
+${if_match ${battery_percent BAT0}>15}${if_match ${battery_percent BAT0}<=20}${image $HOME/.conky/cronograph/images/Orange.png -p 129,18 -s 40x40}${endif}${endif}
+${if_match ${battery_percent BAT0}>20}${if_match ${battery_percent BAT0}<=35}${image $HOME/.conky/cronograph/images/Yellow.png -p 129,18 -s 40x40}${endif}${endif}
+${if_match ${battery_percent BAT0}>35}${if_match ${battery_percent BAT0}<=100}${image $HOME/.conky/cronograph/images/Dark_Green.png -p 129,18 -s 40x40}${endif}${endif}
+${execpi 30 cat $HOME/.conky/cronograph/scripts/blinkingLED}
+## mpd ##
+${if_mpd_playing}${voffset 6}${goto 10}${font Sans:size=8:bold}${mpd_artist}${font}${voffset -5}${font Sans:size=8} - ${mpd_title}${font}
+${voffset 4}${goto 10}${mpd_bar 5,220}${alignr 10}${mpd_elapsed}/${mpd_length}
+${else}${voffset 6}${goto 10}${font hooge 05_53:size=8}MPD: stopped${font}
+${endif}
+
+# vim: set ts=8 sw=4 tw=0 fenc=utf-8 ft=conkyrc: #
diff --git a/.gitconfig b/.gitconfig
new file mode 100644
index 0000000..2ca776e
--- /dev/null
+++ b/.gitconfig
@@ -0,0 +1,5 @@
+[user]
+ name = Weitian LI
+ email = liweitianux@gmail.com
+[push]
+ default = simple
diff --git a/.gtk-bookmarks b/.gtk-bookmarks
new file mode 100644
index 0000000..8af8f6f
--- /dev/null
+++ b/.gtk-bookmarks
@@ -0,0 +1,5 @@
+file:///home/aly/Documents
+file:///home/aly/Music
+file:///home/aly/Pictures
+file:///home/aly/Videos
+file:///home/aly/Downloads
diff --git a/.gtkrc-2.0 b/.gtkrc-2.0
new file mode 100644
index 0000000..dc786c3
--- /dev/null
+++ b/.gtkrc-2.0
@@ -0,0 +1,8 @@
+##
+## ~/.gtkrc-2.0
+##
+
+## NOTE: cannot use `~' and `$HOME' here
+
+include "/home/aly/.gtkrc.mine"
+
diff --git a/.gtkrc.mine b/.gtkrc.mine
new file mode 100644
index 0000000..7652fa4
--- /dev/null
+++ b/.gtkrc.mine
@@ -0,0 +1,25 @@
+##
+## ~/.gtkrc.mine
+##
+
+## font
+gtk-font-name = "Sans 10"
+
+## theme
+#gtk-theme-name = "Clearlooks"
+#gtk-theme-name = "FlatStudioLight"
+#gtk-theme-name = "FlatStudioGray"
+gtk-theme-name = "FlatStudioDark"
+
+## icon
+#gtk-icon-theme-name = "AwOken"
+gtk-icon-theme-name = "AwOkenWhite"
+#gtk-icon-theme-name = "AwOkenDark"
+
+## toolbar
+# GTK_TOOLBAR_ICONS: only icons
+# GTK_TOOLBAR_TEXT: only text
+# GTK_TOOLBAR_BOTH: both icon and text
+# GTK_TOOLBAR_BOTH_HORIZ: icon and text next to the icon
+gtk-toolbar-style = GTK_TOOLBAR_ICONS
+
diff --git a/.i3/config b/.i3/config
new file mode 100644
index 0000000..3388538
--- /dev/null
+++ b/.i3/config
@@ -0,0 +1,362 @@
+###########################################################
+## ~/.i3/config
+##
+## i3 config file (v4)
+## Ref: http://i3wm.org/docs/userguide.html
+##
+## Weitian LI <liweitianux@gmail.com>
+## 2014/05/10
+###########################################################
+
+###### NOTES ###### {{{
+# To get a config file with the same key positions, but for your current
+# layout, use the `i3-config-wizard'
+###### NOTES ###### }}}
+
+###### variables ###### {{{
+## modifier
+# Mod1: Alt
+# Mod4: Win
+set $mod Mod1
+set $sup Mod4
+
+# variables used in this config
+set $i3_scripts ~/.i3/scripts
+set $i3_images ~/.i3/images
+
+# screenshots directory
+set $shots_dir ~/pictures/screenshots
+###### variables ###### }}}
+
+###### settings ###### {{{
+# Font for window titles. (also for bar if not specified)
+# ISO 10646: Unicode
+# Use pango to choose FreeType fonts
+#font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
+#font pango:DejaVu Sans Mono 10
+font pango:Terminus, WenQuanYi Bitmap Song, Icons, FontAwesome, 10
+
+# use `Mouse+$mod' to drag floating windows
+floating_modifier $mod
+
+# focus follows mouse (default yes)
+#focus_follows_mouse no
+
+# timeout of urgency hint on workspace change (default 500ms)
+force_display_urgency_hint 1000 ms
+
+# ipc (`i3-msg' to run i3 commands)
+ipc-socket ~/.i3/i3-ipc.sock
+###### settings ###### }}}
+
+###### appearance ###### {{{
+# border style
+#new_window 1pixel
+bindsym $mod+t border normal
+bindsym $mod+y border 1pixel
+bindsym $mod+u border none
+
+# orientation for new workspaces
+default_orientation auto
+
+# hide vertical borders adjacent to the screen edge
+#hide_edge_borders vertical
+
+### colors
+## solarized colorscheme (customized) {{{
+client.background #1e2320
+# colorclass border background text indicator
+client.focused #859900 #859900 #fdf6e3 #2e9ef4
+client.focused_inactive #268bd2 #268bd2 #fdf6e3 #484e50
+client.unfocused #93a1a1 #93a1a1 #fdf6e3 #292d2e
+client.urgent #cb4b16 #cb4b16 #fdf6e3 #2e9ef4
+## colorscheme }}}
+#
+###### appearance ###### }}}
+
+###### workspace ###### {{{
+# name workspace
+set $ws1 1gentoo
+set $ws2 2term
+set $ws3 3vim
+set $ws4 4web
+set $ws5 5work
+set $ws6 6media
+set $ws7 7game
+set $ws8 8sys
+set $ws9 9misc
+set $ws0 0float
+
+# switch to workspace
+bindsym $mod+1 workspace $ws1
+bindsym $mod+2 workspace $ws2
+bindsym $mod+3 workspace $ws3
+bindsym $mod+4 workspace $ws4
+bindsym $mod+5 workspace $ws5
+bindsym $mod+6 workspace $ws6
+bindsym $mod+7 workspace $ws7
+bindsym $mod+8 workspace $ws8
+bindsym $mod+9 workspace $ws9
+bindsym $mod+0 workspace $ws0
+# auto back-and-forth when switched to the current workspace
+workspace_auto_back_and_forth yes
+
+# move focused container to workspace
+bindsym $mod+Shift+1 move container to workspace $ws1
+bindsym $mod+Shift+2 move container to workspace $ws2
+bindsym $mod+Shift+3 move container to workspace $ws3
+bindsym $mod+Shift+4 move container to workspace $ws4
+bindsym $mod+Shift+5 move container to workspace $ws5
+bindsym $mod+Shift+6 move container to workspace $ws6
+bindsym $mod+Shift+7 move container to workspace $ws7
+bindsym $mod+Shift+8 move container to workspace $ws8
+bindsym $mod+Shift+9 move container to workspace $ws9
+bindsym $mod+Shift+0 move container to workspace $ws0
+# move to provided workspace
+bindsym $mod+Shift+m exec i3-input -F 'move container to workspace "%s"' -P 'move to workspace: '
+
+# assign workspace for applications
+assign [class="Gvim"] $ws3
+assign [class="Firefox" instance="Navigator"] $ws4
+assign [class="Vlc"] $ws6
+
+# switch workspace
+bindsym $mod+Tab workspace back_and_forth
+bindsym $mod+Ctrl+Left workspace prev
+bindsym $mod+Ctrl+Right workspace next
+# also bind ThinkPad 'XF86Back' and 'XF86Forward' keys
+#bindsym XF86Back workspace prev
+#bindsym XF86Forward workspace next
+###### workspace ###### }}}
+
+###### key bindings ###### {{{
+# start a terminal
+bindsym $mod+Return exec urxvtc || i3-sensible-terminal
+
+# kill focused window
+bindsym $mod+Shift+q kill
+bindsym $mod+F4 kill
+
+# change focus (h/j/k/l)
+bindsym $mod+h focus left
+bindsym $mod+j focus down
+bindsym $mod+k focus up
+bindsym $mod+l focus right
+
+# 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 (h/j/k/l)
+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+Shift+v split h
+
+# split in vertical orientation
+bindsym $mod+v split v
+
+# enter fullscreen mode for the focused container
+bindsym $mod+f fullscreen
+
+# 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+c focus child
+
+## scratchpad
+# move the currently focused window to the scratchpad
+bindsym $mod+Shift+minus move scratchpad
+# Show the next scratchpad window or hide the focused scratchpad window.
+# If there are multiple scratchpad windows, this command cycles through them.
+bindsym $mod+minus scratchpad show
+
+# reload the configuration file
+bindsym $mod+Shift+c reload
+# restart i3 inplace (preserves 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'"
+###### key bindings ###### }}}
+
+###### i3 modes ###### {{{
+# 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"
+
+# mode_system: prompt for lock, logout, suspend, shutdown, etc.
+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 $i3_scripts/i3exit.sh lock, mode "default"
+ bindsym e exec --no-startup-id $i3_scripts/i3exit.sh logout, mode "default"
+ bindsym s exec --no-startup-id $i3_scripts/i3exit.sh suspend, mode "default"
+ bindsym h exec --no-startup-id $i3_scripts/i3exit.sh hibernate, mode "default"
+ bindsym r exec --no-startup-id $i3_scripts/i3exit.sh reboot, mode "default"
+ bindsym Shift+s exec --no-startup-id $i3_scripts/i3exit.sh shutdown, mode "default"
+ # back to normal: Enter or Escape
+ bindsym Return mode "default"
+ bindsym Escape mode "default"
+}
+bindsym $mod+Ctrl+Delete mode "$mode_system"
+###### i3 modes ###### }}}
+
+###### applications bindings ###### {{{
+## NOTE: (Mod4: Win)
+## Some Mod4-keys binded for urxvt (~/.Xresources)
+## Mod4-c, Mod4-v, Mod4-Shift-v
+## Mod4-Escape, Mode4-s, Mod4-u
+
+# dmenu & i3-dmenu-desktop
+bindsym $mod+d exec --no-startup-id dmenu_run
+bindsym $mod+F2 exec --no-startup-id dmenu_run
+# `i3-dmenu-desktop' only displays applications with a .desktop file
+bindsym $mod+p exec --no-startup-id i3-dmenu-desktop
+
+# lock screen (i3lock)
+bindsym $mod+Ctrl+l exec --no-startup-id $i3_scripts/i3exit.sh lock
+# turn off display
+bindsym $mod+Ctrl+b exec --no-startup-id sleep 1 && xset dpms force off
+
+# screenshots
+bindsym Print exec --no-startup-id scrot -e 'mv $f $shots_dir/$f'
+bindsym $mod+Print exec --no-startup-id scrot -s -e 'mv $f $shots_dir/$f'
+
+# terminal
+bindsym $sup+t exec urxvtc || urxvt || i3-sensible-terminal
+# file manager
+bindsym $sup+f exec thunar
+# web browser
+bindsym $sup+w exec ~/bin/firefox || firefox
+
+## dropdown terminal
+# auto start urxvt if closed
+exec --no-startup-id "while true; do urxvt -name 'dropdown_term'; done"
+#for_window [instance="dropdown_term"] floating enable, border 1pixel
+#for_window [instance="dropdown_term"] move scratchpad; [instance="dropdown_term"] scratchpad show; resize shrink height 100px; resize grow width 626px; move position 1px 20px; move scratchpad
+for_window [instance="dropdown_term"] floating enable, border 1pixel, resize shrink height 100px, resize grow width 626px, move position 1px 20px
+for_window [instance="dropdown_term"] move scratchpad
+bindsym $mod+backslash [instance="dropdown_term"] scratchpad show
+###### applications bindings ###### }}}
+
+###### window control ###### {{{
+## floating
+for_window [window_role="pop-up"] floating enable
+for_window [class="Feh"] floating enable
+for_window [class="XFontSel"] floating enable
+for_window [class="Arandr"] floating enable
+for_window [class="Xfce4-notifyd"] floating enable
+for_window [class="Xscreensaver-demo"] floating enable
+for_window [class="Pinentry-gtk-2"] floating enable
+for_window [class="Ds9"] floating enable
+for_window [class="Toplevel"] floating enable
+for_window [class="Firefox" instance="Places"] floating enable
+for_window [class="Firefox" instance="Browser"] floating enable
+for_window [class="Firefox" instance="Update"] floating enable
+## floating by title
+# xbindkeys
+for_window [title="^XBindKey:.*Hit.*"] floating enable
+# xev
+for_window [title="^Event Tester$"] floating enable
+# thunar copy files
+for_window [title="^File Operation Progress$"] floating enable
+
+## adjust window border
+for_window [class="URxvt"] border 1pixel
+for_window [class="Firefox"] border 1pixel
+for_window [class="Xfce4-notifyd"] border none
+###### window control ###### }}}
+
+###### i3bar ###### {{{
+# i3bar (plus the system information i3status finds out, if available)
+bar {
+ #status_command py3status -c ~/.i3/py3status.conf
+ status_command py3status -s -c ~/.i3/py3status.conf
+ position top
+ # whether show the current binding mode indicator (default yes)
+ #binding_mode_indicator no
+
+ ## color theme
+ colors {
+ ## zenburn colorscheme (customized) {{{
+ background #1e2320
+ statusline #dcdccc
+ separator #94bff3
+ # colorclass border background text
+ focused_workspace #506070 #506070 #ffffff
+ active_workspace #dcdccc #506070 #ffffff
+ inactive_workspace #dcdccc #1e2320 #dcdccc
+ urgent_workspace #dcdccc #cb4b16 #dcdccc
+ ## colorscheme }}}
+ #
+ ## solarized colorscheme {{{
+ #background #073642
+ #statusline #eee8d5
+ #focused_workspace #cb4b16 #cb4b16 #eee8d5
+ #active_workspace #cb4b16 #cb4b16 #eee8d5
+ #inactive_workspace #b58900 #b58900 #eee8d5
+ ## solarized }}}
+ }
+}
+###### i3bar ###### }}}
+
+###### autostart ###### {{{
+## run applications on startup
+## if need to run command when restarting i3, use `exec_always'
+# disable bell
+exec --no-startup-id xset b off
+exec --no-startup-id xrdb -load ~/.Xresources
+exec --no-startup-id sh ~/.fehbg
+exec --no-startup-id xcompmgr
+exec --no-startup-id xbindkeys
+exec --no-startup-id urxvtd -q -o -f
+exec --no-startup-id parcellite
+exec --no-startup-id fcitx
+exec --no-startup-id nm-applet
+exec --no-startup-id xbacklight -set 80
+exec --no-startup-id xscreensaver -no-splash
+exec --no-startup-id xfce4-power-manager
+exec --no-startup-id mpd
+###### autostart ###### }}}
+
+# vim: set ts=8 sw=4 tw=0 fenc=utf-8 ft=conf: #
diff --git a/.i3/images/wallpaper.png b/.i3/images/wallpaper.png
new file mode 100644
index 0000000..468b1a9
--- /dev/null
+++ b/.i3/images/wallpaper.png
Binary files differ
diff --git a/.i3/py3status.conf b/.i3/py3status.conf
new file mode 100644
index 0000000..d19b4b8
--- /dev/null
+++ b/.i3/py3status.conf
@@ -0,0 +1,78 @@
+## ~/.i3/py3status.conf
+##
+## py3status configuration file
+## same syntax as 'i3status.conf' (man i3status)
+##
+
+# It is important that this file is edited as *UTF-8*.
+# The following line should contain a sharp s:
+# ß
+# If the above line is not correctly displayed, fix your editor first!
+
+general {
+ colors = true
+ color_good = '#dcdccc'
+ color_degraded = '#8cd0d3'
+ color_bad = '#dc8cc3'
+ interval = 3
+ # output format (i3bar|dzen2|xmobar|none)
+ output_format = 'i3bar'
+}
+
+#order += "volume master"
+#order += "ipv6"
+#order += "disk /"
+#order += "run_watch DHCP"
+#order += "run_watch VPN"
+#order += "wireless wlp3s0"
+#order += "ethernet enp0s25"
+order += "battery 0"
+order += "load"
+#order += "tztime local"
+
+volume master {
+ format = "%volume"
+ device = "default"
+ mixer = "Master"
+ mixer_idx = 0
+}
+
+wireless wlp3s0 {
+ #format_up = "W: (%quality at %essid) %ip"
+ format_up = "%essid(%ip)"
+ format_down = "down"
+}
+
+ethernet enp0s25 {
+ # if you use %speed, i3status requires root privileges
+ format_up = "E: %ip"
+ format_down = "E: down"
+}
+
+battery 0 {
+ format = "%status %percentage %remaining"
+}
+
+run_watch DHCP {
+ #pidfile = "/var/run/dhclient*.pid"
+ pidfile = "/var/run/dhcpd*.pid"
+}
+
+run_watch VPN {
+ pidfile = "/var/run/vpnc/pid"
+}
+
+tztime local {
+ #format = "%Y-%m-%d %H:%M:%S"
+ format = "%m-%d|%H:%M"
+}
+
+load {
+ format = "%1min"
+}
+
+disk "/" {
+ format = "%free"
+}
+
+# vim: set ts=8 sw=4 tw=0 fenc=utf-8 ft=conf: #
diff --git a/.i3/py3status/10-mpd.py b/.i3/py3status/10-mpd.py
new file mode 100644
index 0000000..95b7b4f
--- /dev/null
+++ b/.i3/py3status/10-mpd.py
@@ -0,0 +1,117 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+#
+# Weitian LI <liweitianux@gmail.com>
+# 2014/05/14
+
+"""
+mpd module for py3status
+"""
+
+## Get output of shell command:
+## python 3.x:
+## >>> subprocess.getoutput(cmd)
+## >>> subprocess.getstatusoutput(cmd)
+## python 2.7.x:
+## >>> subprocess.Popen(cmd, shell=True, stderr=subprocess.PIPE)
+
+import os
+import re
+import subprocess
+import time
+
+
+POSITION = 0
+# regex to match the status string of 'mpc status' output
+mpd_status_p = re.compile(r'.*\n^\[([a-z]+)\]', re.M) # multiline
+
+class Py3status:
+ """
+ MPD module to show mpd status and play info.
+
+ This module also handle click events:
+ left button: mpc toggle
+ middle button: mpc stop
+ right button: mpc next
+ """
+
+ def mpd(self, i3status_output_json, i3status_config):
+ """
+ Display MPD status and song info.
+ """
+ response = {
+ 'full_text': '',
+ 'name': 'mpd',
+ 'instance': 'first',
+ }
+ # update response fields
+ self._update_response(i3status_config)
+ if self.color:
+ response['color'] = self.color
+ response['full_text'] = self.full_text
+ # cache status for 5 seconds
+ response['cached_until'] = time.time() + 5
+ return (POSITION, response)
+
+ def on_click(self, i3status_output_json, i3status_config, event):
+ """
+ Handle click events.
+ """
+ if event['button'] == 1:
+ # left button click
+ cmd = 'mpc toggle'
+ cmd_output = subprocess.getoutput(cmd)
+ elif event['button'] == 2:
+ # middle button click
+ cmd = 'mpc stop'
+ cmd_output = subprocess.getoutput(cmd)
+ elif event['button'] == 3:
+ # right button click
+ cmd = 'mpc next'
+ cmd_output = subprocess.getoutput(cmd)
+ #
+ self._update_response(i3status_config)
+ os.system('killall -USR1 py3status')
+
+ def _update_response(self, i3status_config=None):
+ ## get mpd status
+ cmd = 'mpc status'
+ cmd_out = subprocess.getstatusoutput(cmd)
+ if cmd_out[0] == 0:
+ # mpd is running
+ mpd_status_m = mpd_status_p.match(cmd_out[1])
+ if mpd_status_m:
+ self.status = mpd_status_m.group(1)
+ else:
+ self.status = 'stopped'
+ else:
+ # mpd not running (N/A)
+ self.status = 'na'
+ ## set full_text and color
+ prompt = '' # Icons: uF198 (music)
+ if self.status == 'playing':
+ status_text = ' ' # Icons: uF04B (play)
+ cmd = 'mpc status -f "%artist%-%title%" | head -n 1'
+ song_text = subprocess.getoutput(cmd)
+ if i3status_config:
+ self.color = i3status_config['color_good']
+ elif self.status == 'paused':
+ status_text = ' ' # Icons: uF04C (pause)
+ cmd = 'mpc status -f "%title%" | head -n 1'
+ song_text = subprocess.getoutput(cmd)
+ if i3status_config:
+ self.color = i3status_config['color_degraded']
+ elif self.status == 'stopped':
+ status_text = '' # Icons: uF04D (stop)
+ song_text = ''
+ if i3status_config:
+ self.color = i3status_config['color_bad']
+ else:
+ # mpd not running (N/A)
+ status_text = '' # Icons: uF00D (X)
+ song_text = ''
+ if i3status_config:
+ self.color = i3status_config['color_bad']
+ # full_text
+ self.full_text = '{0} {1}{2}'.format(prompt, status_text, song_text)
+
diff --git a/.i3/py3status/20-volume.py b/.i3/py3status/20-volume.py
new file mode 100644
index 0000000..467764c
--- /dev/null
+++ b/.i3/py3status/20-volume.py
@@ -0,0 +1,112 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+#
+# Weitian LI <liweitianux@gmail.com>
+# 2014/05/15
+
+"""
+volume module for py3status
+"""
+
+## Get output of shell command:
+## python 3.x:
+## >>> subprocess.getoutput(cmd)
+## >>> subprocess.getstatusoutput(cmd)
+## python 2.7.x:
+## >>> subprocess.Popen(cmd, shell=True, stderr=subprocess.PIPE)
+
+import os
+import re
+import subprocess
+import time
+
+
+POSITION = 0
+DEVICE = 'default'
+MIXER = 'Master'
+# regex compile to match amixer output volume info
+amixer_rep = re.compile(r'.*\[(\d+)%\]\s*\[(on|off)\]')
+
+
+class Py3status:
+ """
+ Volume module to show volume info.
+
+ This module also handle click events:
+ left button: decrease volume
+ middle button: mute/unmute toggle
+ right button: increase volume
+ """
+
+ def myvolume(self, i3status_output_json, i3status_config):
+ """
+ Display volume info.
+
+ XXX: cannot use name 'volume' ??
+ """
+ response = {
+ 'full_text': '',
+ 'name': 'myvolume',
+ 'instance': 'first',
+ }
+ # update response fields
+ self._update_response(i3status_config)
+ if self.color:
+ response['color'] = self.color
+ response['full_text'] = self.full_text
+ # cache status for 5 seconds
+ response['cached_until'] = time.time() + 5
+ return (POSITION, response)
+
+ def on_click(self, i3status_output_json, i3status_config, event):
+ """
+ Handle click events.
+ """
+ if event['button'] == 1:
+ # left button click
+ cmd = 'amixer -D "{0}" sset "{1}" "5%-" unmute'.format(DEVICE, MIXER)
+ cmd_output = subprocess.getoutput(cmd)
+ elif event['button'] == 2:
+ # middle button click
+ cmd = 'amixer -D "{0}" sset "{1}" toggle'.format(DEVICE, MIXER)
+ cmd_output = subprocess.getoutput(cmd)
+ elif event['button'] == 3:
+ # right button click
+ cmd = 'amixer -D "{0}" sset "{1}" "5%+" unmute'.format(DEVICE, MIXER)
+ cmd_output = subprocess.getoutput(cmd)
+ #
+ self._update_response(i3status_config)
+ os.system('killall -USR1 py3status')
+
+ def _update_response(self, i3status_config=None):
+ """
+ update self.full_text
+ """
+ # get volume info
+ cmd = 'amixer -D "{0}" sget "{1}" | tail -n 1'.format(DEVICE, MIXER)
+ cmd_output = subprocess.getoutput(cmd)
+ m = amixer_rep.match(cmd_output)
+ self.volume, self.status = m.group(1, 2)
+ if int(self.volume) > 60:
+ self.level = 'high'
+ prompt = '' # Icons: uF357 (volume-high)
+ if i3status_config:
+ self.color = i3status_config['color_degraded']
+ elif int(self.volume) > 30:
+ self.level = 'medium'
+ prompt = '' # Icons: uF359 (volume-medium)
+ if i3status_config:
+ self.color = i3status_config['color_good']
+ else:
+ self.level = 'low'
+ prompt = '' # Icons: uF358 (volume-low)
+ if i3status_config:
+ self.color = i3status_config['color_good']
+ # determine icon
+ if self.status == 'off':
+ prompt = '' # Icons: uF35A (volume-off)
+ if i3status_config:
+ self.color = i3status_config['color_bad']
+ # determine display info
+ self.full_text = '{0} {1}%'.format(prompt, self.volume)
+
diff --git a/.i3/py3status/25-microphone.py b/.i3/py3status/25-microphone.py
new file mode 100644
index 0000000..379a44c
--- /dev/null
+++ b/.i3/py3status/25-microphone.py
@@ -0,0 +1,105 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+#
+# Weitian LI <liweitianux@gmail.com>
+# 2014/05/15
+
+"""
+microphone module for py3status
+"""
+
+## Get output of shell command:
+## python 3.x:
+## >>> subprocess.getoutput(cmd)
+## >>> subprocess.getstatusoutput(cmd)
+## python 2.7.x:
+## >>> subprocess.Popen(cmd, shell=True, stderr=subprocess.PIPE)
+
+import os
+import re
+import subprocess
+
+
+POSITION = 0
+DEVICE = 'default'
+MIXER = 'Capture' # Microphone
+# regex compile to match amixer output volume info
+amixer_rep = re.compile(r'.*\[(\d+)%\]\s*\[(on|off)\]')
+
+
+class Py3status:
+ """
+ Microphone module to show microphone info.
+
+ This module also handle click events:
+ left button: decrease volume
+ middle button: mute/unmute toggle
+ right button: increase volume
+ """
+
+ def microphone(self, i3status_output_json, i3status_config):
+ """
+ Display microphone info.
+ """
+ response = {
+ 'full_text': '',
+ 'name': 'microphone',
+ 'instance': 'first',
+ }
+ # update response fields
+ self._update_response(i3status_config)
+ response['full_text'] = self.full_text
+ if self.color:
+ response['color'] = self.color
+ return (POSITION, response)
+
+ def on_click(self, i3status_output_json, i3status_config, event):
+ """
+ Handle click events.
+ """
+ if event['button'] == 1:
+ # left button click
+ cmd = 'amixer -D "{0}" sset "{1}" "5%-" unmute'.format(DEVICE, MIXER)
+ cmd_output = subprocess.getoutput(cmd)
+ elif event['button'] == 2:
+ # middle button click
+ cmd = 'amixer -D "{0}" sset "{1}" toggle'.format(DEVICE, MIXER)
+ cmd_output = subprocess.getoutput(cmd)
+ elif event['button'] == 3:
+ # right button click
+ cmd = 'amixer -D "{0}" sset "{1}" "5%+" unmute'.format(DEVICE, MIXER)
+ cmd_output = subprocess.getoutput(cmd)
+ #
+ self._update_response(i3status_config)
+ os.system('killall -USR1 py3status')
+
+ def _update_response(self, i3status_config=None):
+ """
+ update self.full_text
+ """
+ # get volume info
+ cmd = 'amixer -D "{0}" sget "{1}" | tail -n 1'.format(DEVICE, MIXER)
+ cmd_output = subprocess.getoutput(cmd)
+ m = amixer_rep.match(cmd_output)
+ self.volume, self.status = m.group(1, 2)
+ prompt = '' # Icons: uF130 (mic-on)
+ if int(self.volume) > 60:
+ self.level = 'high'
+ if i3status_config:
+ self.color = i3status_config['color_degraded']
+ elif int(self.volume) > 30:
+ self.level = 'medium'
+ if i3status_config:
+ self.color = i3status_config['color_good']
+ else:
+ self.level = 'low'
+ if i3status_config:
+ self.color = i3status_config['color_good']
+ # determine icon
+ if self.status == 'off':
+ prompt = '' # Icons: uF131 (mic-off)
+ if i3status_config:
+ self.color = i3status_config['color_bad']
+ # determine display info
+ self.full_text = '{0} {1}%'.format(prompt, self.volume)
+
diff --git a/.i3/py3status/30-touchpad.py b/.i3/py3status/30-touchpad.py
new file mode 100644
index 0000000..195d6b1
--- /dev/null
+++ b/.i3/py3status/30-touchpad.py
@@ -0,0 +1,86 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+#
+# Weitian LI <liweitianux@gmail.com>
+# 2014/05/15
+
+"""
+touchpad module for py3status
+"""
+
+## Get output of shell command:
+## python 3.x:
+## >>> subprocess.getoutput(cmd)
+## >>> subprocess.getstatusoutput(cmd)
+## python 2.7.x:
+## >>> subprocess.Popen(cmd, shell=True, stderr=subprocess.PIPE)
+
+import os
+import re
+import subprocess
+
+
+POSITION = 0
+
+
+class Py3status:
+ """
+ Touchpad module to show the status of touchpad.
+
+ Click events:
+ left button: enable touchpad
+ middle button: toggle touchpad
+ """
+
+ def __init__(self):
+ """
+ get touchpad status
+ """
+ cmd = 'synclient -l | grep -c "TouchpadOff.*=.*0"'
+ touchpad_status = subprocess.getoutput(cmd)
+ if int(touchpad_status) == 1:
+ self.status = 'on'
+ else:
+ self.status = 'off'
+
+ def touchpad(self, i3status_output_json, i3status_config):
+ """
+ Display touchpad status.
+ """
+ #prompt = '' # Icons: uF10A (ipad)
+ prompt = '' # Icons: uF3E3 (palm)
+ response = {
+ 'full_text': '',
+ 'name': 'touchpad',
+ 'instance': 'first',
+ }
+ if self.status == 'on':
+ response['color'] = i3status_config['color_good']
+ status_text = '' # Icons: uF00C (check)
+ else:
+ response['color'] = i3status_config['color_bad']
+ status_text = '' # Icons: uF00D (cross)
+ response['full_text'] = '{0} {1}'.format(prompt, status_text)
+ return (POSITION, response)
+
+ def on_click(self, i3status_output_json, i3status_config, event):
+ """
+ Handle click events.
+ """
+ if event['button'] == 1:
+ # left button click
+ cmd = 'synclient TouchpadOff=0'
+ cmd_output = subprocess.getoutput(cmd)
+ self.status = 'on'
+ elif event['button'] == 2:
+ # middle button click
+ if self.status == 'on':
+ cmd = 'synclient TouchpadOff=1'
+ self.status = 'off'
+ else:
+ cmd = 'synclient TouchpadOff=0'
+ self.status = 'on'
+ cmd_output = subprocess.getoutput(cmd)
+ #
+ os.system('killall -USR1 py3status')
+
diff --git a/.i3/py3status/40-power.py b/.i3/py3status/40-power.py
new file mode 100644
index 0000000..96b8ce5
--- /dev/null
+++ b/.i3/py3status/40-power.py
@@ -0,0 +1,73 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+#
+# Weitian LI <liweitianux@gmail.com>
+# 2014/05/15
+
+"""
+power module for py3status
+"""
+
+## Get output of shell command:
+## python 3.x:
+## >>> subprocess.getoutput(cmd)
+## >>> subprocess.getstatusoutput(cmd)
+## python 2.7.x:
+## >>> subprocess.Popen(cmd, shell=True, stderr=subprocess.PIPE)
+
+import re
+import subprocess
+import time
+
+
+POSITION = 0
+
+BAT_PRESENT = '/sys/class/power_supply/BAT0/present'
+# regex to match the '1' at the beginning
+one_p = re.compile(r'(^1).*')
+
+
+class Py3status:
+ """
+ Power module to show whether AC/battery is online.
+
+ ac_status: online, offline
+ bat_status: present, na
+ """
+
+ def power(self, i3status_output_json, i3status_config):
+ """
+ Display power status.
+ """
+ response = {
+ 'full_text': '',
+ 'name': 'power',
+ 'instance': 'first',
+ }
+ # AC online
+ ac_cmd = 'on_ac_power'
+ ac_cmd_out = subprocess.getstatusoutput(ac_cmd)
+ if ac_cmd_out[0] == 0:
+ ac_text = '' # Icons: uF237 (ac-online)
+ self.ac_status = 'online'
+ response['color'] = i3status_config['color_good']
+ else:
+ ac_text = '' # Icons: uF236 (ac-offline)
+ self.ac_status = 'offline'
+ response['color'] = i3status_config['color_bad']
+ # Battery present
+ with open(BAT_PRESENT, 'r') as bat_present_f:
+ bat_present_c = bat_present_f.read()
+ bat_m = one_p.match(bat_present_c)
+ if bat_m.group(1):
+ bat_text = ' ' # Icons: uF3CF (battery-vertical)
+ self.bat_status = 'present'
+ else:
+ bat_text = ''
+ self.bat_status = 'na'
+ #
+ response['full_text'] = '{0} {1}'.format(ac_text, bat_text)
+ # cache status for 5 seconds
+ response['cached_until'] = time.time() + 5
+ return (POSITION, response)
+
diff --git a/.i3/py3status/50-battery.py b/.i3/py3status/50-battery.py
new file mode 100644
index 0000000..5e88125
--- /dev/null
+++ b/.i3/py3status/50-battery.py
@@ -0,0 +1,106 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+#
+# Weitian LI <liweitianux@gmail.com>
+# 2014/05/17
+
+"""
+battery module for py3status
+"""
+
+## Get output of shell command:
+## python 3.x:
+## >>> subprocess.getoutput(cmd)
+## >>> subprocess.getstatusoutput(cmd)
+## python 2.7.x:
+## >>> subprocess.Popen(cmd, shell=True, stderr=subprocess.PIPE)
+
+import re
+import subprocess
+import time
+
+
+POSITION = 0
+
+BAT_ID = 0
+## uevent:
+## ENERGY_NOW: energy that battery has now
+## POWER_NOW: battery current discharging/charing rate
+BAT_UEVENT = '/sys/class/power_supply/BAT{0}/uevent'.format(BAT_ID)
+
+# regex to match pattern in 'uevent' contents'
+status_p = re.compile(r'.*STATUS=(\w+)', re.S)
+present_p = re.compile(r'.*PRESENT=(\d)', re.S)
+capacity_p = re.compile(r'.*CAPACITY=(\d+)', re.S)
+energynow_p = re.compile(r'.*ENERGY_NOW=(\d+)', re.S)
+powernow_p = re.compile(r'.*POWER_NOW=(\d+)', re.S)
+
+
+class Py3status:
+ """
+ Battery module to show battery information.
+
+ battery status: Full, Discharging, Charging, Unknown
+ """
+
+ def mybattery(self, i3status_output_json, i3status_config):
+ """
+ Display battery information.
+ """
+ response = {
+ 'full_text': '',
+ 'name': 'mybattery',
+ 'instance': 'first',
+ }
+ # open battery uevent file
+ with open(BAT_UEVENT, 'r') as bat_f:
+ bat_info = bat_f.read()
+ status_m = status_p.match(bat_info)
+ capacity_m = capacity_p.match(bat_info)
+ energynow_m = energynow_p.match(bat_info)
+ powernow_m = powernow_p.match(bat_info)
+ self.status = status_m.group(1)
+ self.capacity = int(capacity_m.group(1))
+ energynow = int(energynow_m.group(1))
+ powernow = int(powernow_m.group(1))
+ #
+ bat_text = '{0}%'.format(self.capacity)
+ if self.status == 'Full':
+ prompt = '' # Icons: uF213 (battery-full)
+ color = i3status_config['color_good']
+ elif self.status == 'Charging':
+ prompt = '' # Icons: uF211 (battery-charing)
+ color = i3status_config['color_degraded']
+ elif self.status == 'Discharging':
+ if self.capacity > 80:
+ prompt = '' # Icons: uF213 (battery-full)
+ color = i3status_config['color_good']
+ elif self.capacity > 60:
+ prompt = '' # Icons: uF214 (battery-high)
+ color = i3status_config['color_degraded']
+ elif self.capacity > 30:
+ prompt = '' # Icons: uF215 (battery-low)
+ color = i3status_config['color_degraded']
+ else:
+ prompt = '' # Icons: uF212 (battery-empty)
+ color = i3status_config['color_bad']
+ # calc remaining time
+ remaining_h = energynow // powernow
+ remaining_m = int((energynow % powernow) / powernow * 60)
+ if remaining_h:
+ remaining = '{0}h{1:02d}m'.format(remaining_h, remaining_m)
+ else:
+ remaining = '{0:02d}m'.format(remaining_m)
+ bat_text = '{0} {1}'.format(bat_text, remaining)
+ else:
+ # unknown battery status
+ prompt = '' # Icons: uF215 (battery-low)
+ prompt = prompt + ' ' # Icons: uF243 (question-sign)
+ color = i3status_config['color_bad']
+ #
+ response['full_text'] = '{0} {1}'.format(prompt, bat_text)
+ response['color'] = color
+ # cache status for 5 seconds
+ response['cached_until'] = time.time() + 5
+ return (POSITION, response)
+
diff --git a/.i3/py3status/80-datetime.py b/.i3/py3status/80-datetime.py
new file mode 100644
index 0000000..5d578a0
--- /dev/null
+++ b/.i3/py3status/80-datetime.py
@@ -0,0 +1,76 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+#
+# Weitian LI <liweitianux@gmail.com>
+# 2014/05/15
+
+"""
+datetime module for py3status
+"""
+
+## Get output of shell command:
+## python 3.x:
+## >>> subprocess.getoutput(cmd)
+## >>> subprocess.getstatusoutput(cmd)
+## python 2.7.x:
+## >>> subprocess.Popen(cmd, shell=True, stderr=subprocess.PIPE)
+
+import re
+import subprocess
+import time
+
+
+# regext to match date and time from output of 'date'
+datetime_p = re.compile(r'(^\d+/\d+)\s*(\d+:\d+)')
+
+
+class Py3status:
+ """
+ Datetime module to show current date and time.
+ """
+
+ def mydate(self, i3status_output_json, i3status_config):
+ """
+ Display current date.
+ """
+ POSITION = 0
+ response = {
+ 'full_text': '',
+ 'name': 'mydate',
+ 'instance': 'first',
+ }
+ prompt = '' # Icons: uF073 (calendar)
+ # update datetime
+ self._get_datetime()
+ response['full_text'] = '{0} {1}'.format(prompt, self.date)
+ # cache status for 5 seconds
+ response['cached_until'] = time.time() + 5
+ return (POSITION, response)
+
+ def mytime(self, i3status_output_json, i3status_config):
+ """
+ Display current time.
+ """
+ POSITION = 1
+ response = {
+ 'full_text': '',
+ 'name': 'mytime',
+ 'instance': 'first',
+ }
+ prompt = '' # Icons: uF017 (clock)
+ # update datetime
+ self._get_datetime()
+ response['full_text'] = '{0} {1}'.format(prompt, self.time)
+ # cache status for 5 seconds
+ response['cached_until'] = time.time() + 5
+ return (POSITION, response)
+
+ def _get_datetime(self):
+ """
+ Get current date and time
+ """
+ cmd = 'date "+%m/%d %H:%M"'
+ datetime = subprocess.getoutput(cmd)
+ dt_m = datetime_p.match(datetime)
+ self.date, self.time = dt_m.group(1, 2)
+
diff --git a/.i3/py3status/backup/dpms.py b/.i3/py3status/backup/dpms.py
new file mode 100644
index 0000000..783c53c
--- /dev/null
+++ b/.i3/py3status/backup/dpms.py
@@ -0,0 +1,44 @@
+from os import system
+
+
+class Py3status:
+ """
+ This module allows activation and deactivation
+ of DPMS (Display Power Management Signaling)
+ by clicking on 'DPMS' in the status bar.
+
+ Written and contributed by @tasse:
+ Andre Doser <dosera AT tf.uni-freiburg.de>
+ """
+ def __init__(self):
+ """
+ Detect current state on start.
+ """
+ self.run = system('xset -q | grep -iq "DPMS is enabled"') == 0
+
+ def dpms(self, i3status_output_json, i3status_config):
+ """
+ Display a colorful state of DPMS.
+ """
+ result = {
+ 'full_text': 'DPMS',
+ 'name': 'dpms'
+ }
+ if self.run:
+ result['color'] = i3status_config['color_good']
+ else:
+ result['color'] = i3status_config['color_bad']
+ return (0, result)
+
+ def on_click(self, json, i3status_config, event):
+ """
+ Enable/Disable DPMS on left click.
+ """
+ if event['button'] == 1:
+ if self.run:
+ self.run = False
+ system("xset -dpms")
+ else:
+ self.run = True
+ system("xset +dpms")
+ system("killall -USR1 py3status")
diff --git a/.i3/py3status/backup/empty_class.py b/.i3/py3status/backup/empty_class.py
new file mode 100644
index 0000000..077269c
--- /dev/null
+++ b/.i3/py3status/backup/empty_class.py
@@ -0,0 +1,41 @@
+class Py3status:
+ """
+ Empty and basic py3status class.
+
+ NOTE: py3status will NOT execute:
+ - methods starting with '_'
+ - methods decorated by @property and @staticmethod
+
+ NOTE: reserved method names:
+ - 'kill' method for py3status exit notification
+ - 'on_click' method for click events from i3bar
+ """
+ def kill(self, i3status_output_json, i3status_config):
+ """
+ This method will be called upon py3status exit.
+ """
+ pass
+
+ def on_click(self, i3status_output_json, i3status_config, event):
+ """
+ This method will be called when a click event occurs on this module's
+ output on the i3bar.
+
+ Example 'event' json object:
+ {'y': 13, 'x': 1737, 'button': 1, 'name': 'empty', 'instance': 'first'}
+ """
+ pass
+
+ def empty(self, i3status_output_json, i3status_config):
+ """
+ This method will return an empty text message
+ so it will NOT be displayed on your i3bar.
+
+ If you want something displayed you should write something
+ in the 'full_text' key of your response.
+
+ See the i3bar protocol spec for more information:
+ http://i3wm.org/docs/i3bar-protocol.html
+ """
+ response = {'full_text': '', 'name': 'empty', 'instance': 'first'}
+ return (0, response)
diff --git a/.i3/py3status/backup/glpi.py b/.i3/py3status/backup/glpi.py
new file mode 100644
index 0000000..929749d
--- /dev/null
+++ b/.i3/py3status/backup/glpi.py
@@ -0,0 +1,52 @@
+# You need MySQL-python from http://pypi.python.org/pypi/MySQL-python
+import MySQLdb
+
+
+class Py3status:
+ """
+ This example class demonstrates how to display the current total number of
+ open tickets from GLPI in your i3bar.
+
+ It features thresholds to colorize the output and forces a low timeout to
+ limit the impact of a server connectivity problem on your i3bar freshness.
+
+ Note that we don't have to implement a cache layer as it is handled by
+ py3status automagically.
+ """
+ def count_glpi_open_tickets(self, json, i3status_config):
+ response = {'full_text': '', 'name': 'glpi_tickets'}
+
+ # user-defined variables
+ CRIT_THRESHOLD = 20
+ WARN_THRESHOLD = 15
+ MYSQL_DB = ''
+ MYSQL_HOST = ''
+ MYSQL_PASSWD = ''
+ MYSQL_USER = ''
+ POSITION = 0
+
+ mydb = MySQLdb.connect(
+ host=MYSQL_HOST,
+ user=MYSQL_USER,
+ passwd=MYSQL_PASSWD,
+ db=MYSQL_DB,
+ connect_timeout=5,
+ )
+ mycr = mydb.cursor()
+ mycr.execute('''select count(*)
+ from glpi_tickets
+ where closedate is NULL and solvedate is NULL;''')
+ row = mycr.fetchone()
+ if row:
+ open_tickets = int(row[0])
+ if i3status_config['colors']:
+ if open_tickets > CRIT_THRESHOLD:
+ response.update({'color': i3status_config['color_bad']})
+ elif open_tickets > WARN_THRESHOLD:
+ response.update(
+ {'color': i3status_config['color_degraded']}
+ )
+ response['full_text'] = '%s tickets' % open_tickets
+ mydb.close()
+
+ return (POSITION, response)
diff --git a/.i3/py3status/backup/i3bar_click_events.py b/.i3/py3status/backup/i3bar_click_events.py
new file mode 100644
index 0000000..792965c
--- /dev/null
+++ b/.i3/py3status/backup/i3bar_click_events.py
@@ -0,0 +1,127 @@
+from subprocess import Popen
+from time import time
+
+
+class Py3status:
+ """
+ This module allows you to take actions based on click events made on
+ the i3status modules. For example, thanks to this module you could
+ launch the wicd GUI when clicking on the ethernet or wireless module
+ of your i3status output !
+
+ IMPORTANT:
+ This module file name is reserved and should NOT be changed if you
+ want py3status to handle your i3status modules click events !
+
+ The behavior described above will only work if this file is named
+ 'i3bar_click_events.py' !
+ """
+ def __init__(self):
+ """
+ This is where you setup your actions based on your i3status config.
+
+ Configuration:
+ --------------
+ self.actions = {
+ "<module name and instance>": {
+ <button number>: [<function to run>, <arg1>, <arg2>],
+ }
+ }
+
+ Variables:
+ ----------
+ <button number> is an integer from 1 to 3:
+ 1 : left click
+ 2 : middle click
+ 3 : right click
+
+ <function to run> is a python function written in this module.
+ The 'external_command' function is provided for convenience if
+ you want to call an external program from this module.
+ You can of course write your own functions and have them executed
+ on a click event at will with possible arguments <arg1>, <arg2>...
+
+ <module name and instance> is a string made from the module
+ attribute 'name' and 'instance' using a space as separator:
+ For i3status modules, it's simply the name of the module as it
+ appears in the 'order' instruction of your i3status.conf.
+ Example:
+ in i3status.conf -> order += "wireless wlan0"
+ self.actions key -> "wireless wlan0"
+
+ Usage example:
+ --------------
+ - Open the wicd-gtk GUI when we LEFT click on the ethernet
+ module of i3status.
+ - Open emelfm2 to /home when we LEFT click on
+ the /home instance of disk_info
+ - Open emelfm2 to / when we LEFT click on
+ the / instance of disk_info
+
+ The related i3status.conf looks like:
+ order += "disk /home"
+ order += "disk /"
+ order += "ethernet eth0"
+
+ The resulting self.actions should be:
+ self.actions = {
+ "ethernet eth0": {
+ 1: [external_command, 'wicd-gtk', '-n'],
+ },
+ "disk_info /home": {
+ 1: [external_command, 'emelfm2', '-1', '~'],
+ },
+ "disk_info /": {
+ 1: [external_command, 'emelfm2', '-1', '/'],
+ },
+ }
+ """
+ # CONFIGURE ME PLEASE, LOVE YOU BIG TIME !
+ self.actions = {
+ }
+
+ def on_click(self, i3status_output_json, i3status_config, event):
+ """
+ If an action is configured for the given i3status module 'name' and
+ 'instance' (if present), then we'll execute the given function with
+ its arguments (if present).
+
+ Usually you SHOULD NOT modify this part of the code.
+ """
+ button = event['button']
+ key_name = '{} {}'.format(
+ event['name'],
+ event.get('instance', '')
+ ).strip()
+ if key_name in self.actions and button in self.actions[key_name]:
+ # get the function to run
+ func = self.actions[key_name][button][0]
+ assert hasattr(func, '__call__'), \
+ 'first element of the action list must be a function'
+
+ # run the function with the possibly given arguments
+ func(*self.actions[key_name][button][1:])
+
+ def i3bar_click_events(self, i3status_output_json, i3status_config):
+ """
+ Cached empty output, this module doesn't show anything.
+ """
+ response = {'full_text': '', 'name': 'i3bar_click_events'}
+ response['cached_until'] = time() + 3600
+ return (-1, response)
+
+
+def external_command(*cmd):
+ """
+ This convenience function lets you call an external program at will.
+
+ NOTE:
+ The stdout and stderr MUST be suppressed as shown here to avoid any
+ output from being caught by the i3bar (this would freeze it).
+ See issue #20 for more info.
+ """
+ Popen(
+ cmd,
+ stdout=open('/dev/null', 'w'),
+ stderr=open('/dev/null', 'w')
+ )
diff --git a/.i3/py3status/backup/netdata.py b/.i3/py3status/backup/netdata.py
new file mode 100644
index 0000000..729983b
--- /dev/null
+++ b/.i3/py3status/backup/netdata.py
@@ -0,0 +1,132 @@
+# -*- coding: utf-8 -*-
+
+# netdata
+
+# Netdata is a module uses great Py3status (i3status wrapper) to
+# display network information (Linux systems) in i3bar.
+# For more information read:
+# i3wm homepage: http://i3wm.org
+# py3status homepage: https://github.com/ultrabug/py3status
+
+# Copyright (C) <2013> <Shahin Azad [ishahinism at Gmail]>
+
+# 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/>.
+
+# ----------------------------------------------------------------- #
+# Notes:
+# 1. netdata will check 'eth0' interface by default. You can
+# change it by changing 'self.net_interface' variable in 'GetData'
+# class.
+# 2. Colors are depended on strict specification in traffic/netspeed methods.
+# You can change them by manipulating conditions.
+
+import subprocess
+from time import time
+
+# Method 'netSpeed' will use this variables to calculate downloaded
+# bytes in last second. Initializing this variables globally is
+# necessary since we can't use __init__ method in Py3Status class.
+old_transmitted, old_received = 0, 0
+
+
+class GetData:
+ """Get system status
+
+ """
+ def __init__(self):
+ # You can change it to another interface.
+ # It'll be used for grabbing net interface data.
+ self.net_interface = 'eth0'
+
+ def execCMD(self, cmd, arg):
+ """Take a system command and its argument, then return the result.
+
+ Arguments:
+ - `cmd`: system command.
+ - `arg`: argument.
+ """
+ result = subprocess.check_output([cmd, arg])
+ return result
+
+ def netBytes(self):
+ """Execute 'cat /proc/net/dev', find the interface line (Default
+ 'eth0') and grab received/transmitted bytes.
+
+ """
+ net_data = self.execCMD('cat', '/proc/net/dev').decode('utf-8').split()
+ interface_index = net_data.index(self.net_interface + ':')
+ received_bytes = int(net_data[interface_index + 1])
+ transmitted_bytes = int(net_data[interface_index + 9])
+
+ return received_bytes, transmitted_bytes
+
+
+class Py3status:
+ """
+ System status in i3bar
+ """
+ def netSpeed(self, json, i3status_config):
+ """Calculate network speed ('eth0' interface) and return it. You can
+ change the interface using 'self.net_interface' variable in
+ 'GetData' class.
+
+ """
+ data = GetData()
+ response = {'full_text': '', 'name': 'net_speed'}
+
+ global old_received
+ global old_transmitted
+
+ received_bytes, transmitted_bytes = data.netBytes()
+ dl_speed = (received_bytes - old_received) / 1024.
+ up_speed = (transmitted_bytes - old_transmitted) / 1024.
+
+ if dl_speed < 30:
+ response['color'] = i3status_config['color_bad']
+ elif dl_speed < 60:
+ response['color'] = i3status_config['color_degraded']
+ else:
+ response['color'] = i3status_config['color_good']
+
+ response['full_text'] = "LAN(Kb): {:5.1f}↓ {:5.1f}↑"\
+ .format(dl_speed, up_speed)
+ response['cached_until'] = time()
+
+ old_received, old_transmitted = received_bytes, transmitted_bytes
+ return (0, response)
+
+ def traffic(self, json, i3status_config):
+ """Calculate networks used traffic. Same as 'netSpeed' method you can
+ change the interface.
+
+ """
+ data = GetData()
+ response = {'full_text': '', 'name': 'traffic'}
+
+ received_bytes, transmitted_bytes = data.netBytes()
+ download = received_bytes / 1024 / 1024.
+ upload = transmitted_bytes / 1024 / 1024.
+ total = download + upload
+
+ if total < 400:
+ response['color'] = i3status_config['color_good']
+ elif total < 700:
+ response['color'] = i3status_config['color_degraded']
+ else:
+ response['color'] = i3status_config['color_bad']
+
+ response['full_text'] = "T(Mb): {:3.0f}↓ {:3.0f}↑ {:3.0f}↕"\
+ .format(download, upload, total)
+
+ return (1, response)
diff --git a/.i3/py3status/backup/ns_checker.py b/.i3/py3status/backup/ns_checker.py
new file mode 100644
index 0000000..4a332b1
--- /dev/null
+++ b/.i3/py3status/backup/ns_checker.py
@@ -0,0 +1,57 @@
+import dns.resolver
+import socket
+
+
+class Py3status:
+ """
+ This module launch a simple query on each nameservers for the specified domain.
+ Nameservers are dynamically retrieved. The FQDN is the only one mandatory parameter.
+ It's also possible to add additional nameservers by appending them in nameservers list.
+
+ The default resolver can be overwritten with my_resolver.nameservers parameter.
+
+ Written and contributed by @nawadanp
+ """
+ def __init__(self):
+ self.domain = 'google.com'
+ self.lifetime = 0.3
+ self.resolver = []
+ self.nameservers = []
+
+ def ns_checker(self, i3status_output_json, i3status_config):
+ response = {'full_text': '', 'name': 'ns_checker'}
+ position = 0
+ counter = 0
+ error = False
+ nameservers = []
+
+ my_resolver = dns.resolver.Resolver()
+ my_resolver.lifetime = self.lifetime
+ if self.resolver:
+ my_resolver.nameservers = self.resolver
+
+ my_ns = my_resolver.query(self.domain, 'NS')
+
+ # Insert each NS ip address in nameservers
+ for ns in my_ns:
+ nameservers.append(str(socket.gethostbyname(str(ns))))
+ for ns in self.nameservers:
+ nameservers.append(str(ns))
+
+ # Perform a simple DNS query, for each NS servers
+ for ns in nameservers:
+ my_resolver.nameservers = [ns]
+ counter += 1
+ try:
+ my_resolver.query(self.domain, 'A')
+ except:
+ error = True
+
+ if error:
+ response['full_text'] = str(counter) + ' NS NOK'
+ response['color'] = i3status_config['color_bad']
+ else:
+ response['full_text'] = str(counter) + ' NS OK'
+ response['color'] = i3status_config['color_good']
+
+ return (position, response)
diff --git a/.i3/py3status/backup/pingdom.py b/.i3/py3status/backup/pingdom.py
new file mode 100644
index 0000000..cddf1a9
--- /dev/null
+++ b/.i3/py3status/backup/pingdom.py
@@ -0,0 +1,59 @@
+# -*- coding: utf-8 -*-
+
+import requests
+from time import time
+
+
+class Py3status:
+ """
+ Dynamically display the latest response time of the configured checks using
+ the Pingdom API.
+ We also verify the status of the checks and colorize if needed.
+ Pingdom API doc : https://www.pingdom.com/services/api-documentation-rest/
+
+ #NOTE: This module needs the 'requests' python module from pypi
+ https://pypi.python.org/pypi/requests
+ """
+ def pingdom_checks(self, json, i3status_config):
+ response = {'full_text': '', 'name': 'pingdom_checks'}
+
+ #NOTE: configure me !
+ APP_KEY = '' # create an APP KEY on pingdom first
+ CACHE_TIMEOUT = 600 # recheck every 10 mins
+ CHECKS = [] # checks' names you want added to your bar
+ LATENCY_THRESHOLD = 500 # when to colorize the output
+ LOGIN = '' # pingdom login
+ PASSWORD = '' # pingdom password
+ TIMEOUT = 15
+ POSITION = 0
+
+ r = requests.get(
+ 'https://api.pingdom.com/api/2.0/checks',
+ auth=(LOGIN, PASSWORD),
+ headers={'App-Key': APP_KEY},
+ timeout=TIMEOUT,
+ )
+ result = r.json()
+ if 'checks' in result:
+ for check in [
+ ck for ck in result['checks'] if ck['name'] in CHECKS
+ ]:
+ if check['status'] == 'up':
+ response['full_text'] += '{}: {}ms, '.format(
+ check['name'],
+ check['lastresponsetime']
+ )
+ if check['lastresponsetime'] > LATENCY_THRESHOLD:
+ response.update(
+ {'color': i3status_config['color_degraded']}
+ )
+ else:
+ response['full_text'] += '{}: DOWN'.format(
+ check['name'],
+ check['lastresponsetime']
+ )
+ response.update({'color': i3status_config['color_bad']})
+ response['full_text'] = response['full_text'].strip(', ')
+ response['cached_until'] = time() + CACHE_TIMEOUT
+
+ return (POSITION, response)
diff --git a/.i3/py3status/backup/pomodoro.py b/.i3/py3status/backup/pomodoro.py
new file mode 100644
index 0000000..28b5ea1
--- /dev/null
+++ b/.i3/py3status/backup/pomodoro.py
@@ -0,0 +1,123 @@
+"""
+Pomodoro countdown on i3bar originally written by @Fandekasp (Adrien Lemaire)
+"""
+from subprocess import call
+from time import time
+
+MAX_BREAKS = 4
+POSITION = 0
+TIMER_POMODORO = 25 * 60
+TIMER_BREAK = 5 * 60
+TIMER_LONG_BREAK = 15 * 60
+
+
+class Py3status:
+ """
+ """
+ def __init__(self):
+ self.__setup('stop')
+ self.alert = False
+ self.run = False
+
+ def on_click(self, json, i3status_config, event):
+ """
+ Handles click events
+ """
+ if event['button'] == 1:
+ if self.status == 'stop':
+ self.status = 'start'
+ self.run = True
+
+ elif event['button'] == 2:
+ self.__setup('stop')
+ self.run = False
+
+ elif event['button'] == 3:
+ self.__setup('pause')
+ self.run = False
+
+ @property
+ def response(self):
+ """
+ Return the response full_text string
+ """
+ return {
+ 'full_text': '{} ({})'.format(self.prefix, self.timer),
+ 'name': 'pomodoro'
+ }
+
+ def __setup(self, status):
+ """
+ Setup a step
+ """
+ self.status = status
+ if status == 'stop':
+ self.prefix = 'Pomodoro'
+ self.status = 'stop'
+ self.timer = TIMER_POMODORO
+ self.breaks = 1
+
+ elif status == 'start':
+ self.prefix = 'Pomodoro'
+ self.timer = TIMER_POMODORO
+
+ elif status == 'pause':
+ self.prefix = 'Break #%d' % self.breaks
+ if self.breaks > MAX_BREAKS:
+ self.timer = TIMER_LONG_BREAK
+ self.breaks = 1
+ else:
+ self.breaks += 1
+ self.timer = TIMER_BREAK
+
+ def __decrement(self):
+ """
+ Countdown handler
+ """
+ self.timer -= 1
+ if self.timer < 0:
+ self.alert = True
+ self.run = False
+ self.__i3_nagbar()
+ if self.status == 'start':
+ self.__setup('pause')
+ self.status = 'pause'
+ elif self.status == 'pause':
+ self.__setup('start')
+ self.status = 'start'
+
+ def __i3_nagbar(self, level='warning'):
+ """
+ Make use of i3-nagbar to display warnings to the user.
+ """
+ msg = '{} time is up !'.format(self.prefix)
+ try:
+ call(
+ ['i3-nagbar', '-m', msg, '-t', level],
+ stdout=open('/dev/null', 'w'),
+ stderr=open('/dev/null', 'w')
+ )
+ except:
+ pass
+
+ def pomodoro(self, json, i3status_config):
+ """
+ Pomodoro response handling and countdown
+ """
+ if self.run:
+ self.__decrement()
+
+ response = self.response
+ if self.alert:
+ response['urgent'] = True
+ self.alert = False
+
+ if self.status == 'start':
+ response['color'] = i3status_config['color_good']
+ elif self.status == 'pause':
+ response['color'] = i3status_config['color_degraded']
+ else:
+ response['color'] = i3status_config['color_bad']
+
+ response['cached_until'] = time()
+ return (POSITION, response)
diff --git a/.i3/py3status/backup/sysdata.py b/.i3/py3status/backup/sysdata.py
new file mode 100644
index 0000000..14aefb3
--- /dev/null
+++ b/.i3/py3status/backup/sysdata.py
@@ -0,0 +1,137 @@
+# -*- coding: utf-8 -*-
+
+# sysdata
+
+# Sysdata is a module uses great Py3status (i3status wrapper) to
+# display system information (RAM usage) in i3bar (Linux systems).
+# For more information read:
+# i3wm homepage: http://i3wm.org
+# py3status homepage: https://github.com/ultrabug/py3status
+
+# Copyright (C) <2013> <Shahin Azad [ishahinism at Gmail]>
+
+# 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/>.
+
+import subprocess
+from time import time
+
+
+class GetData:
+ """Get system status
+
+ """
+ def execCMD(self, cmd, arg):
+ """Take a system command and its argument, then return the result.
+
+ Arguments:
+ - `cmd`: system command.
+ - `arg`: argument.
+ """
+ result = subprocess.check_output([cmd, arg])
+ return result
+
+ def cpu(self):
+ """Get the cpu usage data from /proc/stat :
+ cpu 2255 34 2290 22625563 6290 127 456 0 0
+ - user: normal processes executing in user mode
+ - nice: niced processes executing in user mode
+ - system: processes executing in kernel mode
+ - idle: twiddling thumbs
+ - iowait: waiting for I/O to complete
+ - irq: servicing interrupts
+ - softirq: servicing softirqs
+ - steal: involuntary wait
+ - guest: running a normal guest
+ - guest_nice: running a niced guest
+ These numbers identify the amount of time the CPU has spent performing
+ different kinds of work. Time units are in USER_HZ (typically hundredths of a
+ second)
+ """
+ with open('/proc/stat', 'r') as fd:
+ line = fd.readline()
+ cpu_data = line.split()
+ total_cpu_time = sum(map(int, cpu_data[1:]))
+ cpu_idle_time = int(cpu_data[4])
+
+ #return the cpu total&idle time
+ return total_cpu_time, cpu_idle_time
+
+ def memory(self):
+ """Execute 'free -m' command, grab the memory capacity and used size
+ then return; Memory size 'total_mem', Used_mem, and percentage
+ of used memory.
+
+ """
+ # Run 'free -m' command and make a list from output.
+ mem_data = self.execCMD('free', '-m').split()
+ total_mem = int(mem_data[7]) / 1024.
+ used_mem = int(mem_data[15]) / 1024.
+ # Caculate percentage
+ used_mem_percent = int(used_mem / (total_mem / 100))
+
+ # Results are in kilobyte.
+ return total_mem, used_mem, used_mem_percent
+
+
+class Py3status:
+ """
+ System status in i3bar
+ """
+ def __init__(self):
+ self.data = GetData()
+ self.cpu_total = 0
+ self.cpu_idle = 0
+
+ def cpuInfo(self, json, i3status_config):
+ """calculate the CPU status and return it.
+
+ """
+ response = {'full_text': '', 'name': 'cpu_usage'}
+ cpu_total, cpu_idle = self.data.cpu()
+ used_cpu_percent = 1 - float(cpu_idle-self.cpu_idle)/float(cpu_total-self.cpu_total)
+ self.cpu_total = cpu_total
+ self.cpu_idle = cpu_idle
+
+ if used_cpu_percent <= 40:
+ response['color'] = i3status_config['color_good']
+ elif used_cpu_percent <= 75:
+ response['color'] = i3status_config['color_degraded']
+ else:
+ response['color'] = i3status_config['color_bad']
+
+ response['full_text'] = "CPU: %.2f%%" % (used_cpu_percent*100)
+ #cache the status for 10 seconds
+ response['cached_until'] = time() + 10
+
+ return (0, response)
+
+ def ramInfo(self, json, i3status_config):
+ """calculate the memory (RAM) status and return it.
+
+ """
+ response = {'full_text': '', 'name': 'ram_info'}
+ total_mem, used_mem, used_mem_percent = self.data.memory()
+
+ if used_mem_percent <= 40:
+ response['color'] = i3status_config['color_good']
+ elif used_mem_percent <= 75:
+ response['color'] = i3status_config['color_degraded']
+ else:
+ response['color'] = i3status_config['color_bad']
+
+ response['full_text'] = "RAM: %.2f/%.2f GB (%d%%)" % \
+ (used_mem, total_mem, used_mem_percent)
+ response['cached_until'] = time()
+
+ return (0, response)
diff --git a/.i3/py3status/backup/weather_yahoo.py b/.i3/py3status/backup/weather_yahoo.py
new file mode 100644
index 0000000..6b91b04
--- /dev/null
+++ b/.i3/py3status/backup/weather_yahoo.py
@@ -0,0 +1,106 @@
+# -*- coding: utf-8 -*-
+from time import time
+import requests
+
+
+class Py3status:
+ """
+ Display current day + 3 days weather forecast as icons on your i3bar
+ Based on Yahoo! Weather. forecast, thanks guys !
+ See: http://developer.yahoo.com/weather/
+ """
+ def __init__(self):
+ """
+ Basic configuration
+ Find your city code using:
+ http://answers.yahoo.com/question/index?qid=20091216132708AAf7o0g
+ The city_code in this example is for Paris, France
+ """
+ self.cache_timeout = 1800
+ self.city_code = 'FRXX0076'
+ self.request_timeout = 10
+
+ def _get_forecast(self):
+ """
+ Ask Yahoo! Weather. for a forecast
+ """
+ r = requests.get(
+ 'http://query.yahooapis.com/v1/public/yql?q=select item from weather.forecast where location="%s"&format=json' % self.city_code,
+ timeout=self.request_timeout
+ )
+
+ result = r.json()
+ status = r.status_code
+ forecasts = []
+
+ if status == 200:
+ forecasts = result['query']['results']['channel']['item']['forecast']
+ # reset today
+ forecasts[0] = result['query']['results']['channel']['item']['condition']
+ else:
+ raise Exception('got status {}'.format(status))
+
+ # return current today + 3 days forecast
+ return forecasts[:4]
+
+ def _get_icon(self, forecast):
+ """
+ Return an unicode icon based on the forecast code and text
+ See: http://developer.yahoo.com/weather/#codes
+ """
+ icons = ['☀', '☁', '☂', '☃', '?']
+ code = int(forecast['code'])
+ text = forecast['text'].lower()
+
+ # sun
+ if 'sun' in text or code in [31, 32, 33, 34, 36]:
+ code = 0
+
+ # cloud / early rain
+ elif 'cloud' in text or code in [
+ 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
+ 44
+ ]:
+ code = 1
+
+ # rain
+ elif 'rain' in text or code in [
+ 0, 1, 2, 3, 4, 5, 6, 9,
+ 11, 12,
+ 37, 38, 39,
+ 40, 45, 47
+ ]:
+ code = 2
+
+ # snow
+ elif 'snow' in text or code in [
+ 7, 8,
+ 10, 13, 14, 15, 16, 17, 18,
+ 35,
+ 41, 42, 43, 46
+ ]:
+ code = 3
+
+ # dunno
+ else:
+ code = -1
+
+ return icons[code]
+
+ def weather_yahoo(self, json, i3status_config):
+ """
+ This method gets executed by py3status
+ """
+ response = {
+ 'cached_until': time() + self.cache_timeout,
+ 'full_text': '',
+ 'name': 'weather_yahoo'
+ }
+
+ forecasts = self._get_forecast()
+ for forecast in forecasts:
+ icon = self._get_icon(forecast)
+ response['full_text'] += '{} '.format(icon)
+ response['full_text'] = response['full_text'].strip()
+
+ return (0, response)
diff --git a/.i3/py3status/backup/whoami.py b/.i3/py3status/backup/whoami.py
new file mode 100644
index 0000000..f930991
--- /dev/null
+++ b/.i3/py3status/backup/whoami.py
@@ -0,0 +1,26 @@
+from getpass import getuser
+from time import time
+
+
+class Py3status:
+ """
+ Simply output the currently logged in user in i3bar.
+
+ Inspired by i3 FAQ:
+ https://faq.i3wm.org/question/1618/add-user-name-to-status-bar/
+ """
+ def whoami(self, i3status_output_json, i3status_config):
+ """
+ We use the getpass module to get the current user.
+ """
+ # the current user doesnt change so much, cache it good
+ CACHE_TIMEOUT = 600
+
+ # here you can change the format of the output
+ # default is just to show the username
+ username = '{}'.format(getuser())
+
+ # set, cache and return the output
+ response = {'full_text': username, 'name': 'whoami'}
+ response['cached_until'] = time() + CACHE_TIMEOUT
+ return (0, response)
diff --git a/.i3/scripts/i3exit.sh b/.i3/scripts/i3exit.sh
new file mode 100755
index 0000000..3616139
--- /dev/null
+++ b/.i3/scripts/i3exit.sh
@@ -0,0 +1,43 @@
+#!/bin/sh
+#
+# exit script used in i3 wm
+#
+
+PNG_IMAGE="~/.i3/images/wallpaper.png"
+
+lock() {
+ if [ -f ${PNG_IMAGE} ]; then
+ i3lock -d -ti "${PNG_IMAGE}"
+ else
+ i3lock -d -c 000000
+ fi
+}
+
+case "$1" in
+ lock)
+ lock
+ ;;
+ logout)
+ i3-msg exit
+ ;;
+ suspend)
+ lock
+ dbus-send --system --print-reply --dest="org.freedesktop.UPower" /org/freedesktop/UPower org.freedesktop.UPower.Suspend
+ ;;
+ hibernate)
+ lock
+ dbus-send --system --print-reply --dest="org.freedesktop.UPower" /org/freedesktop/UPower org.freedesktop.UPower.Hibernate
+ ;;
+ reboot)
+ dbus-send --system --print-reply --dest="org.freedesktop.ConsoleKit" /org/freedesktop/ConsoleKit/Manager org.freedesktop.ConsoleKit.Manager.Restart
+ ;;
+ shutdown)
+ dbus-send --system --print-reply --dest="org.freedesktop.ConsoleKit" /org/freedesktop/ConsoleKit/Manager org.freedesktop.ConsoleKit.Manager.Stop
+ ;;
+ *)
+ echo "Usage: $0 {lock|logout|suspend|hibernate|reboot|shutdown}"
+ exit 2
+esac
+
+exit 0
+
diff --git a/.i3status.conf b/.i3status.conf
new file mode 100644
index 0000000..972032b
--- /dev/null
+++ b/.i3status.conf
@@ -0,0 +1,76 @@
+# ~/.i3status.conf
+# i3status configuration file.
+# see "man i3status" for documentation.
+
+# It is important that this file is edited as UTF-8.
+# The following line should contain a sharp s:
+# ß
+# If the above line is not correctly displayed, fix your editor first!
+
+general {
+ colors = true
+ color_good = '#88b090'
+ color_degraded = '#ccdc90'
+ color_bad = '#e89393'
+ interval = 3
+ # output format (i3bar|dzen2|xmobar|none)
+ output_format = 'i3bar'
+}
+
+order += "volume master"
+#order += "ipv6"
+order += "disk /"
+#order += "run_watch DHCP"
+#order += "run_watch VPN"
+order += "wireless wlp3s0"
+order += "ethernet enp0s25"
+order += "battery 0"
+order += "load"
+order += "tztime local"
+
+volume master {
+ format = "%volume"
+ device = "default"
+ mixer = "Master"
+ mixer_idx = 0
+}
+
+wireless wlp3s0 {
+ #format_up = "W: (%quality at %essid) %ip"
+ format_up = "%essid(%ip)"
+ format_down = "down"
+}
+
+ethernet enp0s25 {
+ # if you use %speed, i3status requires root privileges
+ format_up = "E: %ip"
+ format_down = "E: down"
+}
+
+battery 0 {
+ format = "%status %percentage %remaining"
+}
+
+run_watch DHCP {
+ #pidfile = "/var/run/dhclient*.pid"
+ pidfile = "/var/run/dhcpd*.pid"
+}
+
+run_watch VPN {
+ pidfile = "/var/run/vpnc/pid"
+}
+
+tztime local {
+ #format = "%Y-%m-%d %H:%M:%S"
+ format = "%m-%d|%H:%M"
+}
+
+load {
+ format = "%1min"
+}
+
+disk "/" {
+ format = "%free"
+}
+
+# vim: set ts=8 sw=4 tw=0 fenc=utf-8 ft=conf: #
diff --git a/.lftp/rc b/.lftp/rc
new file mode 100644
index 0000000..f70b0c6
--- /dev/null
+++ b/.lftp/rc
@@ -0,0 +1,21 @@
+# ~/.lftp/rc
+# ~/.lftprc
+#
+# lftp configurations
+#
+# Weitian LI <liweitianux@gmail.com>
+# 2014/05/17
+#
+
+### character set {{{
+set file:charset "utf-8"
+set ftp:charset "gbk"
+### charset }}}
+
+### ssl {{{
+# fix certificate verification not trusted
+set ssl:verify-certificate no
+### ssl }}}
+
+
+# vim: set ts=8 sw=4 tw=0 fenc=utf-8 ft=lftp: #
diff --git a/.mpdconf b/.mpdconf
new file mode 100644
index 0000000..0f119be
--- /dev/null
+++ b/.mpdconf
@@ -0,0 +1,493 @@
+# An example configuration file for MPD
+# See the mpd.conf man page for a more detailed description of each parameter.
+
+
+# Files and directories #######################################################
+#
+# This setting controls the top directory which MPD will search to discover the
+# available audio files and add them to the daemon's online database. This
+# setting defaults to the XDG directory, otherwise the music directory will be
+# be disabled and audio files will only be accepted over ipc socket (using
+# file:// protocol) or streaming files over an accepted protocol.
+#
+music_directory "~/music"
+#
+# This setting sets the MPD internal playlist directory. The purpose of this
+# directory is storage for playlists created by MPD. The server will use
+# playlist files not created by the server but only if they are in the MPD
+# format. This setting defaults to playlist saving being disabled.
+#
+playlist_directory "~/.mpd/playlists"
+#
+# This setting sets the location of the MPD database. This file is used to
+# load the database at server start up and store the database while the
+# server is not up. This setting defaults to disabled which will allow
+# MPD to accept files over ipc socket (using file:// protocol) or streaming
+# files over an accepted protocol.
+#
+db_file "~/.mpd/database"
+#
+# These settings are the locations for the daemon log files for the daemon.
+# These logs are great for troubleshooting, depending on your log_level
+# settings.
+#
+# The special value "syslog" makes MPD use the local syslog daemon. This
+# setting defaults to logging to syslog, otherwise logging is disabled.
+#
+log_file "~/.mpd/log"
+#
+# This setting sets the location of the file which stores the process ID
+# for use of mpd --kill and some init scripts. This setting is disabled by
+# default and the pid file will not be stored.
+#
+pid_file "~/.mpd/pid"
+#
+# This setting sets the location of the file which contains information about
+# most variables to get MPD back into the same general shape it was in before
+# it was brought down. This setting is disabled by default and the server
+# state will be reset on server start up.
+#
+state_file "~/.mpd/state"
+#
+# The location of the sticker database. This is a database which
+# manages dynamic information attached to songs.
+#
+sticker_file "~/.mpd/sticker.sql"
+#
+###############################################################################
+
+
+# General music daemon options ################################################
+#
+# This setting specifies the user that MPD will run as. MPD should never run as
+# root and you may use this setting to make MPD change its user ID after
+# initialization. This setting is disabled by default and MPD is run as the
+# current user.
+#
+#user "nobody"
+#
+# This setting specifies the group that MPD will run as. If not specified
+# primary group of user specified with "user" setting will be used (if set).
+# This is useful if MPD needs to be a member of group such as "audio" to
+# have permission to use sound card.
+#
+#group "nogroup"
+#
+# This setting sets the address for the daemon to listen on. Careful attention
+# should be paid if this is assigned to anything other then the default, any.
+# This setting can deny access to control of the daemon.
+#
+# For network
+#bind_to_address "any"
+bind_to_address "localhost"
+#
+# And for Unix Socket
+#bind_to_address "~/.mpd/socket"
+#
+# This setting is the TCP port that is desired for the daemon to get assigned
+# to.
+#
+#port "6600"
+#
+# This setting controls the type of information which is logged. Available
+# setting arguments are "default", "secure" or "verbose". The "verbose" setting
+# argument is recommended for troubleshooting, though can quickly stretch
+# available resources on limited hardware storage.
+#
+#log_level "default"
+#
+# If you have a problem with your MP3s ending abruptly it is recommended that
+# you set this argument to "no" to attempt to fix the problem. If this solves
+# the problem, it is highly recommended to fix the MP3 files with vbrfix
+# (available from <http://www.willwap.co.uk/Programs/vbrfix.php>), at which
+# point gapless MP3 playback can be enabled.
+#
+#gapless_mp3_playback "yes"
+#
+# Setting "restore_paused" to "yes" puts MPD into pause mode instead
+# of starting playback after startup.
+#
+#restore_paused "no"
+restore_paused "yes"
+#
+# This setting enables MPD to create playlists in a format usable by other
+# music players.
+#
+#save_absolute_paths_in_playlists "no"
+#
+# This setting defines a list of tag types that will be extracted during the
+# audio file discovery process. The complete list of possible values can be
+# found in the mpd.conf man page.
+metadata_to_use "artist,album,title,track,name,genre,date,composer,performer,disc"
+#
+# This setting enables automatic update of MPD's database when files in
+# music_directory are changed.
+#
+auto_update "yes"
+#
+# Limit the depth of the directories being watched, 0 means only watch
+# the music directory itself. There is no limit by default.
+#
+#auto_update_depth "3"
+#
+###############################################################################
+
+
+# Symbolic link behavior ######################################################
+#
+# If this setting is set to "yes", MPD will discover audio files by following
+# symbolic links outside of the configured music_directory.
+#
+follow_outside_symlinks "yes"
+#
+# If this setting is set to "yes", MPD will discover audio files by following
+# symbolic links inside of the configured music_directory.
+#
+follow_inside_symlinks "yes"
+#
+###############################################################################
+
+
+# Zeroconf / Avahi Service Discovery ##########################################
+#
+# If this setting is set to "yes", service information will be published with
+# Zeroconf / Avahi.
+#
+#zeroconf_enabled "yes"
+#
+# The argument to this setting will be the Zeroconf / Avahi unique name for
+# this MPD server on the network.
+#
+#zeroconf_name "Music Player"
+#
+###############################################################################
+
+
+# Permissions #################################################################
+#
+# If this setting is set, MPD will require password authorization. The password
+# can setting can be specified multiple times for different password profiles.
+#
+#password "password@read,add,control,admin"
+#
+# This setting specifies the permissions a user has who has not yet logged in.
+#
+#default_permissions "read,add,control,admin"
+#
+###############################################################################
+
+
+# Input #######################################################################
+#
+
+input {
+ plugin "curl"
+# proxy "proxy.isp.com:8080"
+# proxy_user "user"
+# proxy_password "password"
+}
+
+#
+###############################################################################
+
+# Audio Output ################################################################
+#
+# MPD supports various audio output types, as well as playing through multiple
+# audio outputs at the same time, through multiple audio_output settings
+# blocks. Setting this block is optional, though the server will only attempt
+# autodetection for one sound card.
+#
+# See <http://mpd.wikia.com/wiki/Configuration#Audio_Outputs> for examples of
+# other audio outputs.
+#
+# An example of an ALSA output:
+#
+audio_output {
+ type "alsa"
+ name "My ALSA Device"
+## device "hw:0,0" # optional
+## format "44100:16:2" # optional
+## mixer_type "hardware" # optional
+ mixer_type "software" # optional
+## mixer_device "default" # optional
+## mixer_control "PCM" # optional
+## mixer_index "0" # optional
+}
+#
+# An example of an OSS output:
+#
+#audio_output {
+# type "oss"
+# name "My OSS Device"
+## device "/dev/dsp" # optional
+## format "44100:16:2" # optional
+## mixer_type "hardware" # optional
+## mixer_device "/dev/mixer" # optional
+## mixer_control "PCM" # optional
+#}
+#
+# An example of a shout output (for streaming to Icecast):
+#
+#audio_output {
+# type "shout"
+# encoding "ogg" # optional
+# name "My Shout Stream"
+# host "localhost"
+# port "8000"
+# mount "/mpd.ogg"
+# password "hackme"
+# quality "5.0"
+# bitrate "128"
+# format "44100:16:1"
+## protocol "icecast2" # optional
+## user "source" # optional
+## description "My Stream Description" # optional
+## url "http://example.com" # optional
+## genre "jazz" # optional
+## public "no" # optional
+## timeout "2" # optional
+## mixer_type "software" # optional
+#}
+#
+# An example of a recorder output:
+#
+#audio_output {
+# type "recorder"
+# name "My recorder"
+# encoder "vorbis" # optional, vorbis or lame
+# path "/var/lib/mpd/recorder/mpd.ogg"
+## quality "5.0" # do not define if bitrate is defined
+# bitrate "128" # do not define if quality is defined
+# format "44100:16:1"
+#}
+#
+# An example of a httpd output (built-in HTTP streaming server):
+#
+#audio_output {
+# type "httpd"
+# name "My HTTP Stream"
+# encoder "vorbis" # optional, vorbis or lame
+# port "8000"
+# bind_to_address "0.0.0.0" # optional, IPv4 or IPv6
+## quality "5.0" # do not define if bitrate is defined
+# bitrate "128" # do not define if quality is defined
+# format "44100:16:1"
+# max_clients "0" # optional 0=no limit
+#}
+#
+# An example of a pulseaudio output (streaming to a remote pulseaudio server)
+#
+audio_output {
+ type "pulse"
+ name "My Pulse Output"
+## server "remote_server" # optional
+## sink "remote_server_sink" # optional
+}
+#
+# An example of a winmm output (Windows multimedia API).
+#
+#audio_output {
+# type "winmm"
+# name "My WinMM output"
+## device "Digital Audio (S/PDIF) (High Definition Audio Device)" # optional
+# or
+## device "0" # optional
+## mixer_type "hardware" # optional
+#}
+#
+# An example of an openal output.
+#
+#audio_output {
+# type "openal"
+# name "My OpenAL output"
+## device "Digital Audio (S/PDIF) (High Definition Audio Device)" # optional
+#}
+#
+## Example "pipe" output:
+#
+#audio_output {
+# type "pipe"
+# name "my pipe"
+# command "aplay -f cd 2>/dev/null"
+## Or if you're want to use AudioCompress
+# command "AudioCompress -m | aplay -f cd 2>/dev/null"
+## Or to send raw PCM stream through PCM:
+# command "nc example.org 8765"
+# format "44100:16:2"
+#}
+#
+## An example of a null output (for no audio output):
+#
+#audio_output {
+# type "null"
+# name "My Null Output"
+# mixer_type "none" # optional
+#}
+#
+##### ncmpcpp -- music visualizer #####
+## Note: In order to make music visualizer work you'll
+## need to use mpd fifo output, whose format parameter
+## has to be set to 44100:16:1 for mono visualization
+## or 44100:16:2 for stereo visualization. Example
+## configuration (it has to be put into mpd.conf):
+audio_output {
+ type "fifo"
+ name "My FIFO"
+ path "/tmp/mpd.fifo"
+ format "44100:16:2"
+}
+#
+# This setting will change all decoded audio to be converted to the specified
+# format before being passed to the audio outputs. By default, this setting is
+# disabled.
+#
+#audio_output_format "44100:16:2"
+#
+# If MPD has been compiled with libsamplerate support, this setting specifies
+# the sample rate converter to use. Possible values can be found in the
+# mpd.conf man page or the libsamplerate documentation. By default, this is
+# setting is disabled.
+#
+#samplerate_converter "Fastest Sinc Interpolator"
+#
+###############################################################################
+
+
+# Normalization automatic volume adjustments ##################################
+#
+# This setting specifies the type of ReplayGain to use. This setting can have
+# the argument "off", "album", "track" or "auto". "auto" is a special mode that
+# chooses between "track" and "album" depending on the current state of
+# random playback. If random playback is enabled then "track" mode is used.
+# See <http://www.replaygain.org> for more details about ReplayGain.
+# This setting is off by default.
+#
+#replaygain "album"
+#
+# This setting sets the pre-amp used for files that have ReplayGain tags. By
+# default this setting is disabled.
+#
+#replaygain_preamp "0"
+#
+# This setting sets the pre-amp used for files that do NOT have ReplayGain tags.
+# By default this setting is disabled.
+#
+#replaygain_missing_preamp "0"
+#
+# This setting enables or disables ReplayGain limiting.
+# MPD calculates actual amplification based on the ReplayGain tags
+# and replaygain_preamp / replaygain_missing_preamp setting.
+# If replaygain_limit is enabled MPD will never amplify audio signal
+# above its original level. If replaygain_limit is disabled such amplification
+# might occur. By default this setting is enabled.
+#
+#replaygain_limit "yes"
+#
+# This setting enables on-the-fly normalization volume adjustment. This will
+# result in the volume of all playing audio to be adjusted so the output has
+# equal "loudness". This setting is disabled by default.
+#
+#volume_normalization "no"
+#
+###############################################################################
+
+
+# MPD Internal Buffering ######################################################
+#
+# This setting adjusts the size of internal decoded audio buffering. Changing
+# this may have undesired effects. Don't change this if you don't know what you
+# are doing.
+#
+#audio_buffer_size "2048"
+#
+# This setting controls the percentage of the buffer which is filled before
+# beginning to play. Increasing this reduces the chance of audio file skipping,
+# at the cost of increased time prior to audio playback.
+#
+#buffer_before_play "10%"
+#
+###############################################################################
+
+
+# Resource Limitations ########################################################
+#
+# These settings are various limitations to prevent MPD from using too many
+# resources. Generally, these settings should be minimized to prevent security
+# risks, depending on the operating resources.
+#
+#connection_timeout "60"
+#max_connections "10"
+#max_playlist_length "16384"
+#max_command_list_size "2048"
+#max_output_buffer_size "8192"
+#
+###############################################################################
+
+# Client TCP keep alive #######################################################
+#
+# For clients connected by TCP on supported platforms.
+# Allows detection of dangling connections due to clients disappearing from
+# the network without closing their connections.
+#
+# This is not usually necessary but can be useful in cases such as wifi connectected
+# clients that go in and out of network range or turn off wifi without closing their
+# connections. Combined with low max_connections this can soon cause clients to not
+# be able to connect.
+#
+#
+# Enable tcp keepalive on new client connections (default is "no")
+#
+#tcp_keep_alive "no"
+#
+# Time in seconds since the last communication on the connection and before
+# the keepalive probing is started. (default is 7200 seconds)
+#tcp_keep_alive_idle "7200"
+#
+# Interval in seconds between keepalive probes, once a probe started.
+# (default is 75 seconds)
+#tcp_keep_alive_interval "75"
+#
+# Number of failed probes before the connection is pronounced dead and
+# the connection is closed. (default is 9 times)
+#tcp_keep_alive_count "9"
+#
+###############################################################################
+
+# Character Encoding ##########################################################
+#
+# If file or directory names do not display correctly for your locale then you
+# may need to modify this setting.
+#
+#filesystem_charset "UTF-8"
+#
+# This setting controls the encoding that ID3v1 tags should be converted from.
+#
+#id3v1_encoding "ISO-8859-1"
+#
+###############################################################################
+
+
+# SIDPlay decoder #############################################################
+#
+# songlength_database:
+# Location of your songlengths file, as distributed with the HVSC.
+# The sidplay plugin checks this for matching MD5 fingerprints.
+# See http://www.c64.org/HVSC/DOCUMENTS/Songlengths.faq
+#
+# default_songlength:
+# This is the default playing time in seconds for songs not in the
+# songlength database, or in case you're not using a database.
+# A value of 0 means play indefinitely.
+#
+# filter:
+# Turns the SID filter emulation on or off.
+#
+#decoder {
+# plugin "sidplay"
+# songlength_database "/media/C64Music/DOCUMENTS/Songlengths.txt"
+# default_songlength "120"
+# filter "true"
+#}
+#
+###############################################################################
+
diff --git a/.ncmpcpp/config b/.ncmpcpp/config
new file mode 100644
index 0000000..5d49d70
--- /dev/null
+++ b/.ncmpcpp/config
@@ -0,0 +1,510 @@
+####################################################
+## this is example configuration file, copy it to ##
+## ~/.ncmpcpp/config and set up your preferences ##
+####################################################
+#
+##### directories ######
+##
+## Directory for storing ncmpcpp related files.
+## Changing it is useful if you want to store
+## everything somewhere else and provide command
+## line setting for alternative location to config
+## file which defines that while launching ncmpcpp.
+##
+#
+#ncmpcpp_directory = "~/.ncmpcpp"
+#
+##
+## Directory for storing downloaded lyrics. It
+## defaults to ~/.lyrics since other MPD clients
+## (eg. ncmpc) also use that location.
+##
+#
+lyrics_directory = "~/.lyrics"
+#
+##### connection settings #####
+#
+## set it in order to make tag editor and renaming files work properly
+#
+#mpd_host = "localhost"
+#
+#mpd_port = "6600"
+#
+mpd_music_dir = "~/music"
+#
+#mpd_connection_timeout = "5"
+#
+mpd_crossfade_time = "5"
+#
+#mpd_communication_mode = "notifications" (polling/notifications)
+#
+##### music visualizer #####
+##
+## Note: In order to make music visualizer work you'll
+## need to use mpd fifo output, whose format parameter
+## has to be set to 44100:16:1 for mono visualization
+## or 44100:16:2 for stereo visualization. Example
+## configuration (it has to be put into mpd.conf):
+##
+## audio_output {
+## type "fifo"
+## name "My FIFO"
+## path "/tmp/mpd.fifo"
+## format "44100:16:2"
+## }
+##
+#
+##
+## If you set format to 44100:16:2, make it 'yes'.
+##
+#
+#visualizer_in_stereo = "no"
+visualizer_in_stereo = "yes"
+#
+visualizer_fifo_path = "/tmp/mpd.fifo"
+#
+##
+## Note: Below parameter is needed for ncmpcpp
+## to determine which output provides data for
+## visualizer and thus allow syncing between
+## visualization and sound as currently there
+## are some problems with it.
+##
+#
+visualizer_output_name = "My FIFO"
+#
+##
+## Note: Below parameter defines how often ncmpcpp
+## has to "synchronize" visualizer and audio outputs.
+## 30 seconds is optimal value, but if you experience
+## synchronization problems, set it to lower value.
+## Keep in mind that sane values start with >=10.
+##
+#
+visualizer_sync_interval = "30"
+#
+##
+## Note: To enable spectrum frequency visualization
+## you need to compile ncmpcpp with fftw3 support.
+##
+#
+#visualizer_type = "wave" (spectrum/wave)
+visualizer_type = "spectrum" (spectrum/wave)
+#
+#visualizer_look = "◆│"
+visualizer_look = "◆▋"
+#
+##### system encoding #####
+##
+## ncmpcpp should detect your charset encoding
+## but if it failed to do so, you can specify
+## charset encoding you are using here.
+##
+## Note: You can see whether your ncmpcpp build
+## supports charset detection by checking output
+## of `ncmpcpp --version`.
+##
+## Note: Since MPD uses utf8 by default, setting
+## this option makes sense only if your encoding
+## is different.
+##
+#
+#system_encoding = ""
+#
+##### delays #####
+#
+## delay after playlist highlighting will be disabled (0 = don't disable)
+#
+#playlist_disable_highlight_delay = "5"
+#
+## defines how long various messages are supposed to be visible
+#
+#message_delay_time = "4"
+#
+##### song format #####
+##
+## for song format you can use:
+##
+## %l - length
+## %f - filename
+## %D - directory
+## %a - artist
+## %A - album artist
+## %t - title
+## %b - album
+## %y - year
+## %n - track number (01/12 -> 01)
+## %N - full track info (01/12 -> 01/12)
+## %g - genre
+## %c - composer
+## %p - performer
+## %d - disc
+## %C - comment
+## $R - begin right alignment
+##
+## you can also put them in { } and then it will be displayed
+## only if all requested values are available and/or define alternate
+## value with { }|{ } eg. {%a - %t}|{%f}
+##
+## Note: If you want to set limit on maximal length of a tag, just
+## put the appropriate number between % and character that defines
+## tag type, e.g. to make album take max. 20 terminal cells, use '%20b'.
+##
+## Note: Format that is similar to "%a - %t" (i.e. without any additional
+## braces) is equal to "{%a - %t}", so if one of the tags is missing,
+## you'll get nothing.
+##
+## text can also have different color than the main window has,
+## eg. if you want length to be green, write $3%l$9
+##
+## available values:
+##
+## - 0 - default window color (discards all other colors)
+## - 1 - black
+## - 2 - red
+## - 3 - green
+## - 4 - yellow
+## - 5 - blue
+## - 6 - magenta
+## - 7 - cyan
+## - 8 - white
+## - 9 - end of current color
+##
+## Note: colors can be nested.
+##
+#
+#song_list_format = "{%a - }{%t}|{$8%f$9}$R{$3(%l)$9}"
+#
+#song_status_format = "{{%a{ \"%b\"{ (%y)}} - }{%t}}|{%f}"
+#
+#song_library_format = "{%n - }{%t}|{%f}"
+#
+#tag_editor_album_format = "{(%y) }%b"
+#
+##
+## Note: Below variables are for alternative version of user's interface.
+## Their syntax supports all tags and colors listed above plus some extra
+## markers used for text attributes. They are followed by character '$'.
+## After that you can put:
+##
+## - b - bold text
+## - u - underline text
+## - r - reverse colors
+## - a - use alternative character set
+##
+## If you don't want to use an attribute anymore, just put it again, but
+## this time insert character '/' between '$' and attribute character,
+## e.g. {$b%t$/b}|{$r%f$/r} will display bolded title tag or filename
+## with reversed colors.
+##
+#
+#alternative_header_first_line_format = "$b$1$aqqu$/a$9 {%t}|{%f} $1$atqq$/a$9$/b"
+#
+#alternative_header_second_line_format = "{{$4$b%a$/b$9}{ - $7%b$9}{ ($4%y$9)}}|{%D}"
+#
+##
+## Note: Below variables also supports
+## text attributes listed above.
+##
+#
+#now_playing_prefix = "$b"
+#
+#now_playing_suffix = "$/b"
+#
+#browser_playlist_prefix = "$2playlist$9 "
+#
+#selected_item_prefix = "$6"
+#
+#selected_item_suffix = "$9"
+#
+## colors are not supported for below variable
+#
+#song_window_title_format = "{%a - }{%t}|{%f}"
+song_window_title_format = "{%a - }{%t}|{%f}"
+#
+##### columns settings #####
+##
+## syntax of song columns list format is "column column etc."
+##
+## - syntax for each column is:
+##
+## (width of column)[column's color]{displayed tag}
+##
+## Note: Width is by default in %, if you want a column to
+## have fixed size, add 'f' after the value, e.g. (10)[white]{a}
+## will be the column that take 10% of screen (so the real column's
+## width will depend on actual screen size), whereas (10f)[white]{a}
+## will take 10 terminal cells, no matter how wide the screen is.
+##
+## - color is optional (if you want the default one, type [])
+##
+## Note: You can give a column additional attributes by putting appropriate
+## character after displayed tag character. Available attributes are:
+##
+## - r - column will be right aligned
+## - E - if tag is empty, empty tag marker won't be displayed
+##
+## You can also:
+##
+## - give a column custom name by putting it after attributes,
+## separated with character ':', e.g. {lr:Length} gives you
+## right aligned column of lengths named "Length".
+##
+## - define sequence of tags, that have to be displayed in case
+## predecessor is empty in a way similar to the one in classic
+## song format, i.e. using '|' character, e.g. {a|c|p:Owner}
+## creates column named "Owner" that tries to display artist
+## tag and then composer and performer if previous ones are
+## not available.
+##
+#
+#song_columns_list_format = "(7f)[green]{l} (25)[cyan]{a} (40)[]{t|f} (30)[red]{b}"
+song_columns_list_format = "(7f)[green]{l} (25)[cyan]{a} (40)[]{t|f} (30)[magenta]{b}"
+#
+##### various settings #####
+#
+##
+## Note: Custom command that will be executed each
+## time song changes. Useful for notifications etc.
+##
+## Attention: It doesn't support song format anymore.
+## Use `ncmpcpp --now-playing SONG_FORMAT` instead.
+##
+#execute_on_song_change = ""
+#
+#playlist_show_remaining_time = "no"
+#
+#playlist_shorten_total_times = "no"
+#
+#playlist_separate_albums = "no"
+#
+#playlist_display_mode = "classic" (classic/columns)
+playlist_display_mode = "columns" (classic/columns)
+#
+#browser_display_mode = "classic" (classic/columns)
+browser_display_mode = "columns" (classic/columns)
+#
+#search_engine_display_mode = "classic" (classic/columns)
+search_engine_display_mode = "columns" (classic/columns)
+#
+#playlist_editor_display_mode = "classic" (classic/columns)
+playlist_editor_display_mode = "columns" (classic/columns)
+#
+#discard_colors_if_item_is_selected = "yes"
+#
+#incremental_seeking = "yes"
+#
+#seek_time = "1"
+#
+#autocenter_mode = "no"
+autocenter_mode = "yes"
+#
+#centered_cursor = "no"
+#
+##
+## Note: You can specify third character which will
+## be used to build 'empty' part of progressbar.
+##
+#progressbar_look = "=>"
+#progressbar_look = "■■□"
+progressbar_look = "♪♪ "
+#
+#default_place_to_search_in = "database" (database/playlist)
+#
+#user_interface = "classic" (classic/alternative)
+user_interface = "alternative" (classic/alternative)
+#
+#media_library_left_column = "a" (possible values: a,y,g,c,p, legend above)
+#
+#default_find_mode = "wrapped" (wrapped/normal)
+#
+#default_space_mode = "add" (add/select)
+#
+#default_tag_editor_left_col = "albums" (albums/dirs)
+#
+#default_tag_editor_pattern = "%n - %t"
+#
+#header_visibility = "yes"
+#
+#statusbar_visibility = "yes"
+#
+#titles_visibility = "yes"
+titles_visibility = "no"
+#
+#header_text_scrolling = "yes"
+#
+#fancy_scrolling = "yes"
+#
+#cyclic_scrolling = "no"
+#
+#lines_scrolled = "2"
+#
+#follow_now_playing_lyrics = "no"
+follow_now_playing_lyrics = "yes"
+#
+#fetch_lyrics_for_current_song_in_background = "no"
+#
+#store_lyrics_in_song_dir = "no"
+#
+##
+## Note: If you set this variable, ncmpcpp will try to
+## get info from last.fm in language you set and if it
+## fails, it will fall back to english. Otherwise it will
+## use english the first time.
+##
+## Note: Language has to be expressed as an ISO 639 alpha-2 code.
+##
+#lastfm_preferred_language = ""
+#
+#ncmpc_like_songs_adding = "no" (enabled - add/remove, disabled - always add)
+#
+#show_hidden_files_in_local_browser = "no"
+#
+#display_screens_numbers_on_start = "yes"
+#
+##
+## How shall key_screen_switcher work?
+##
+## - "previous" - switch between current and last used screen
+## - "sequence: 2 -> 9 -> 5" - switch between given sequence of screens.
+##
+## Screen numbers you can use after 'sequence' keyword are:
+##
+## - 1 - help
+## - 2 - playlist
+## - 3 - browser
+## - 4 - search engine
+## - 5 - media library
+## - 6 - playlist editor
+## - 7 - tag editor
+## - 8 - outputs
+## - 9 - visualizer
+## - 10 - clock
+##
+## As you can see, above example will switch between
+## playlist, visualizer and media library screens.
+##
+#screen_switcher_mode = "sequence: 2 -> 3"
+#
+##
+## Default width of locked screen (in %).
+## Acceptable values are from 20 to 80.
+##
+#
+#locked_screen_width_part = "50"
+#
+#ask_for_locked_screen_width_part = "yes"
+#
+##
+## Note: You can define startup screen for ncmpcpp
+## by choosing screen number from the list above.
+##
+#startup_screen = "2"
+#
+#jump_to_now_playing_song_at_start = "yes"
+#
+#ask_before_clearing_main_playlist = "no"
+#
+#clock_display_seconds = "no"
+#
+#display_volume_level = "yes"
+#
+#display_bitrate = "no"
+display_bitrate = "yes"
+#
+#display_remaining_time = "no"
+#
+#regular_expressions = "basic" (basic/extended)
+#
+##
+## Note: If below is enabled, ncmpcpp will ignore leading
+## "The" word while sorting items in browser, tags in
+## media library, etc.
+##
+#ignore_leading_the = "no"
+ignore_leading_the = "yes"
+#
+#block_search_constraints_change_if_items_found = "yes"
+#
+#mouse_support = "yes"
+#
+#mouse_list_scroll_whole_page = "yes"
+#
+#empty_tag_marker = "<empty>"
+#
+#tag_editor_extended_numeration = "no"
+#
+#media_library_display_date = "yes"
+#
+#media_library_display_empty_tag = "yes"
+#
+#media_library_disable_two_column_mode = "no"
+#
+#enable_window_title = "yes"
+#
+##
+## Note: You can choose default search mode for search
+## engine. Available modes are:
+##
+## - 1 - use mpd built-in searching (no regexes, pattern matching)
+## - 2 - use ncmpcpp searching (pattern matching with support for regexes,
+## but if your mpd is on a remote machine, downloading big database
+## to process it can take a while
+## - 3 - match only exact values (this mode uses mpd function for searching
+## in database and local one for searching in current playlist)
+##
+#
+#search_engine_default_search_mode = "1"
+#
+##
+## Note: Below variables can allow you to physically
+## remove files and directories from your hdd using
+## ncmpcpp's browser screen.
+##
+#
+#allow_physical_files_deletion = "no"
+#
+#allow_physical_directories_deletion = "no"
+#
+#external_editor = ""
+external_editor = "vim"
+#
+#use_console_editor = "no" (set to yes, if your editor is console app)
+use_console_editor = "yes"
+#
+##### colors definitions #####
+#
+#colors_enabled = "yes"
+#
+#empty_tag_color = "cyan"
+#
+#header_window_color = "default"
+#
+#volume_color = "default"
+#
+#state_line_color = "default"
+#
+#state_flags_color = "default"
+#
+#main_window_color = "yellow"
+#
+#color1 = "white"
+#
+#color2 = "green"
+#
+#main_window_highlight_color = "yellow"
+#
+#progressbar_color = "default"
+#
+#statusbar_color = "default"
+#
+#alternative_ui_separator_color = "black"
+#
+#active_column_color = "red"
+#
+#visualizer_color = "yellow"
+#
+#window_border_color = "green"
+#
+#active_window_border = "red"
+#
diff --git a/.ncmpcpp/keys b/.ncmpcpp/keys
new file mode 100644
index 0000000..a88498f
--- /dev/null
+++ b/.ncmpcpp/keys
@@ -0,0 +1,188 @@
+#####################################################
+## this is example key configuration file, copy it ##
+## to ~/.ncmpcpp/keys and set up your preferences ##
+#####################################################
+##
+## Tips:
+## - it's possible to bind maximum two keys to a command
+## - keys can be defined with a character or a decimal value
+## - a command can be disabled by binding it to 0
+##
+## Note: First bind of volume_up/down
+## will be used to switch between columns.
+##
+#
+#key_up = 259 'k'
+#
+#key_down = 258 'j'
+#
+#key_up_album = '['
+#
+#key_down_album = ']'
+#
+#key_up_artist = '{'
+#
+#key_down_artist = '}'
+#
+#key_page_up = 339
+#
+#key_page_down = 338
+#
+#key_home = 262
+#
+#key_end = 360
+#
+#key_space = 32
+#
+#key_enter = 10
+#
+#key_delete = 330 'd'
+#
+#key_volume_up = 261 '+'
+#
+#key_volume_down = 260 '-'
+#
+#key_prev_column = 260
+#
+#key_next_column = 261
+#
+#key_toggle_space_mode = 't'
+#
+#key_toggle_add_mode = 'T'
+#
+#key_toggle_mouse = '|'
+#
+#key_toggle_bitrate_visibility = '#'
+#
+#key_screen_switcher = 9
+#
+#key_backward_screen_switcher = 353
+#
+#key_help = '1' 265
+#
+#key_playlist = '2' 266
+#
+#key_browser = '3' 267
+#
+#key_search_engine = '4' 268
+#
+#key_media_library = '5' 269
+#
+#key_playlist_editor = '6' 270
+#
+#key_tag_editor = '7' 271
+#
+#key_outputs = '8' 272
+#
+#key_music_visualizer = '9' 273
+#
+#key_clock = '0' 274
+#
+#key_server_info = '@'
+#
+#key_stop = 's'
+#
+#key_pause = 'P'
+key_pause = 'p'
+#
+#key_next = '>'
+#
+#key_prev = '<'
+#
+#key_replay = 263 127
+#
+#key_seek_forward = 'f'
+#
+#key_seek_backward = 'b'
+#
+#key_toggle_repeat = 'r'
+#
+#key_toggle_random = 'z'
+#
+#key_toggle_single = 'y'
+#
+#key_toggle_consume = 'R'
+#
+#key_toggle_replay_gain_mode = 'Y'
+#
+#key_shuffle = 'Z'
+#
+#key_toggle_crossfade = 'x'
+#
+#key_set_crossfade = 'X'
+#
+#key_update_db = 'u'
+#
+#key_sort_playlist = 22
+#
+#key_apply_filter = 6
+#
+#key_find_forward = '/'
+#
+#key_find_backward = '?'
+#
+#key_next_found_position = '.'
+#
+#key_prev_found_position = ','
+#
+#key_toggle_find_mode = 'w'
+#
+#key_edit_tags = 'e'
+#
+#key_go_to_position = 'g'
+#
+#key_song_info = 'i'
+#
+#key_artist_info = 'I'
+#
+#key_lyrics = 'l'
+#
+#key_reverse_selection = 'v'
+#
+#key_deselect_all = 'V'
+#
+#key_select_album = 'B'
+#
+#key_add_selected_items = 'A'
+#
+#key_clear = 'c'
+#
+#key_crop = 'C'
+#
+#key_move_song_up = 'm'
+#
+#key_move_song_down = 'n'
+#
+#key_move_to = 'M'
+#
+#key_move_before = 0
+#
+#key_move_after = 0
+#
+#key_add = 'a'
+#
+#key_save_playlist = 'S'
+#
+#key_go_to_now_playing = 'o'
+#
+#key_toggle_auto_center = 'U'
+#
+#key_toggle_display_mode = 'p'
+key_toggle_display_mode = 'P'
+#
+#key_toggle_separators_in_playlist = '!'
+#
+#key_toggle_lyrics_db = 'L'
+#
+#key_toggle_fetching_lyrics_for_current_song_in_background = 'F'
+#
+#key_go_to_containing_directory = 'G'
+#
+#key_go_to_media_library = '~'
+#
+#key_go_to_parent_dir = 263 127
+#
+#key_switch_tag_type_list = '`'
+#
+#key_quit = 'q' 'Q'
+#
diff --git a/.profile b/.profile
new file mode 100644
index 0000000..09bef4a
--- /dev/null
+++ b/.profile
@@ -0,0 +1,34 @@
+###########################################################
+# ~/.profile
+#
+###########################################################
+
+###### locale ######
+export LANG="en_US.utf8"
+export LC_CTYPE="zh_CN.utf8"
+export LC_COLLATE="C"
+
+###### input method ######
+export XMODIFIERS="@im=fcitx"
+export INPUT_METHOD="fcitx"
+export GTK_IM_MODULE="fcitx"
+export GTK3_IM_MODULE="fcitx"
+export QT_IM_MODULE="fcitx"
+export QT4_IM_MODULE="fcitx"
+
+###### PATH ######
+# $HOME/bin
+export PATH=$HOME/bin:$PATH
+# TeXlive
+export PATH=$PATH:/usr/local/texlive/bin/x86_64-linux
+# admin
+export PATH=$PATH:/usr/local/sbin:/usr/sbin:/sbin
+
+###### gpg agent ######
+eval "$(gpg-agent --daemon)"
+
+# This file is sourced by bash for login shells. The following line
+# runs your .bashrc and is recommended by the bash info pages.
+[ -f ~/.bashrc ] && . ~/.bashrc
+
+# vim: set ts=8 sw=4 tw=0 fenc=utf-8 ft=sh: #
diff --git a/.sbclrc b/.sbclrc
new file mode 100644
index 0000000..d50d88f
--- /dev/null
+++ b/.sbclrc
@@ -0,0 +1,23 @@
+;;; ~/.sbclrc
+
+;;; The following lines added by ql:add-to-init-file:
+#-quicklisp
+(let ((quicklisp-init (merge-pathnames "~/.quicklisp/setup.lisp"
+ (user-homedir-pathname))))
+ (when (probe-file quicklisp-init)
+ (load quicklisp-init)))
+
+;;; http://common-lisp.net/project/linedit/
+;;; Check for --no-linedit command-line option.
+(if (member "--no-linedit" sb-ext:*posix-argv* :test 'equal)
+ (setf sb-ext:*posix-argv*
+ (remove "--no-linedit" sb-ext:*posix-argv* :test 'equal))
+ (when (interactive-stream-p *terminal-io*)
+ (require :sb-aclrepl)
+ (require :linedit)
+ (funcall (intern "INSTALL-REPL" :linedit) :wrap-current t)))
+
+;;; https://gist.github.com/bdsatish/5403002
+;; Don't break into debugger, but just display error message and return to top-level loop (REPL)
+(setf *debugger-hook* #'(lambda (c h) (declare (ignore h)) (print c) (abort)))
+
diff --git a/.tmux.conf b/.tmux.conf
new file mode 100644
index 0000000..8a7d291
--- /dev/null
+++ b/.tmux.conf
@@ -0,0 +1,91 @@
+##
+## tmux config file
+##
+## LY4ever
+## 3/15/2011
+##
+
+#########################################################################
+## BINDINGS ##
+#########################################################################
+## change escape to c-a
+#set-option -g prefix C-a
+#unbind-key C-b
+#bind-key C-a send-prefix
+
+## switch between windows
+bind-key -n C-p previous-window
+bind-key -n C-n next-window
+
+## C-c also create new window, like in screen
+bind-key C-c new-window
+
+## More straight forward key bindings for splitting
+unbind %
+bind | split-window -h
+unbind '"'
+bind - split-window -v
+
+## Move between the split windows
+bind k selectp -U
+bind j selectp -D
+bind h selectp -L
+bind l selectp -R
+
+## resize the windows
+bind C-k resizep -U 10
+bind C-j resizep -D 10
+bind C-h resizep -L 10
+bind C-l resizep -R 10
+
+## extra bindings
+bind m command-prompt "splitw -h 'exec man %%'"
+bind @ command-prompt "splitw -h 'exec perldoc -f %%'"
+#########################################################################
+
+#########################################################################
+## SETTINGS ##
+#########################################################################
+## Use Vi mode
+set-window-option -g mode-keys vi
+set-option -g status-keys vi
+
+## use xterm function key sequence
+set-window-option -g xterm-keys on
+
+## Notifying if other windows has activities
+set-option -g visual-activity on
+set-window-option -g monitor-activity off
+
+## Terminal emulator window title
+## set it to off so that we can use zsh to operate it
+#setw -g automatic-rename off
+
+## utf8
+set-window-option -g utf8 on
+
+## altscreen
+set-window-option -g alternate-screen on
+
+## terminal overrides
+#set-option -g terminal-overrides "*88col*:colors=88,*256col*:colors=256,xterm*:colors=256"
+#set -g default-terminal "rxvt-256color"
+
+## start index from 1
+set-option -g base-index 1
+
+## Set status bar
+set-option -g display-time 3000
+set-option -g repeat-time 1000
+set-option -g status-utf8 on
+set-option -g status-justify centre
+set-option -g status-bg default
+set-option -g status-left "#[fg=white,bold]:: #[fg=red][ #[fg=colour227]#H #[fg=red]]#[default]"
+set-option -g status-left-length 25
+set-option -g status-right-length 25
+set-option -g status-right "#[fg=red][ #[fg=colour154]%H:%M #[fg=colour183]%a %m/%d #[fg=red]] #[fg=white,bold]::#[default]"
+set-window-option -g window-status-format '#[fg=blue,bold]#I #T#[default] '
+set-window-option -g window-status-current-format '#[fg=blue,bold,reverse]#I #T#[default] '
+#########################################################################
+
+# vim: set ts=8 sw=4 tw=0 fenc=utf-8 ft=conf: #
diff --git a/.urxvt/ext/LICENSE b/.urxvt/ext/LICENSE
new file mode 100644
index 0000000..d159169
--- /dev/null
+++ b/.urxvt/ext/LICENSE
@@ -0,0 +1,339 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ 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 2 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, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
diff --git a/.urxvt/ext/README.md b/.urxvt/ext/README.md
new file mode 100644
index 0000000..b800ed3
--- /dev/null
+++ b/.urxvt/ext/README.md
@@ -0,0 +1,107 @@
+A small collection of perl extensions for the rxvt-unicode terminal emulator.
+
+Installation
+------------
+Simply place the scripts you want to install in /usr/lib/urxvt/perl/ for
+system-wide availability or in ~/.urxvt/ext/ for user-only availability.
+You can also put them in a folder of your choice, but then you have to add this
+line to your .Xdefaults/.Xresources:
+
+ URxvt.perl-lib: /your/folder/
+
+See the following sections for information on how to enable the scripts or set
+script-specific options and keyboard mappings in your .Xdefaults/.Xresources.
+
+
+keyboard-select
+---------------
+Use keyboard shortcuts to select and copy text.
+
+After installing, put the following lines in your .Xdefaults/.Xresources:
+
+ URxvt.perl-ext-common: ...,keyboard-select
+ URxvt.keysym.M-Escape: perl:keyboard-select:activate
+
+The following line overwrites the default Meta-s binding and allows to activate
+keyboard-select directly in backward search mode:
+
+ URxvt.keysym.M-s: perl:keyboard-select:search
+
+Use Meta-Escape to activate selection mode, then use the following keys:
+
+ h/j/k/l: Move cursor left/down/up/right (also with arrow keys)
+ g/G/0/^/$/H/M/L/f/F/;/,/w/W/b/B/e/E: More vi-like cursor movement keys
+ '/'/?: Start forward/backward search
+ n/N: Repeat last search, N: in reverse direction
+ Ctrl-f/b: Scroll down/up one screen
+ Ctrl-d/u: Scroll down/up half a screen
+ v/V/Ctrl-v: Toggle normal/linewise/blockwise selection
+ y/Return: Copy selection to primary buffer, Return: deactivate afterwards
+ q/Escape: Deactivate keyboard selection mode
+
+
+url-select
+----------
+Use keyboard shortcuts to select URLs.
+
+This should be used as a replacement for the default matcher extension, it also
+makes URLs clickable with the middle mouse button.
+
+After installing, put the following lines in your .Xdefaults/.Xresources:
+
+ URxvt.perl-ext-common: ...,url-select
+ URxvt.keysym.M-u: perl:url-select:select_next
+
+Use Meta-u to activate URL selection mode, then use the following keys:
+
+ j/k: Select next downward/upward URL (also with arrow keys)
+ g/G: Select first/last URL (also with home/end key)
+ o/Return: Open selected URL in browser, Return: deactivate afterwards
+ y: Copy (yank) selected URL and deactivate selection mode
+ q/Escape: Deactivate URL selection mode
+
+Options:
+
+ URxvt.url-select.autocopy: if set to true, selected URLs are automatically
+ copied to the PRIMARY buffer
+ URxvt.url-select.button: mouse button to click-open URLs (default: 2)
+ URxvt.url-select.launcher: browser/command to open selected URL with
+ URxvt.url-select.underline: if set to true, all URLs get underlined
+
+For compatibility reasons, url-select will also use any patterns defined for
+the matcher extension by reading all `URxvt.matcher.pattern.[0-9]` resources.
+
+
+clipboard
+---------
+Use keyboard shortcuts to copy the selection to the clipboard and to paste the
+clipboard contents (optionally escaping all special characters).
+
+After installing, put the following lines in your .Xdefaults/.Xresources:
+
+ URxvt.perl-ext-common: ...,clipboard
+ URxvt.keysym.M-c: perl:clipboard:copy
+ URxvt.keysym.M-v: perl:clipboard:paste
+ URxvt.keysym.M-C-v: perl:clipboard:paste_escaped
+
+Options:
+ URxvt.clipboard.autocopy: if set to true, the clipboard is automatically
+ updated whenever the PRIMARY selection changes
+
+You can also overwrite the system commands to use for copying/pasting.
+The default ones are:
+
+ URxvt.clipboard.copycmd: xsel -ib
+ URxvt.clipboard.pastecmd: xsel -ob
+
+If you prefer xclip, then put these lines in your .Xdefaults/.Xresources:
+
+ URxvt.clipboard.copycmd: xclip -i -selection clipboard
+ URxvt.clipboard.pastecmd: xclip -o -selection clipboard
+
+On Mac OS X, put these lines in your .Xdefaults/.Xresources:
+
+ URxvt.clipboard.copycmd: pbcopy
+ URxvt.clipboard.pastecmd: pbpaste
+
+The use of the functions should be self-explanatory!
diff --git a/.urxvt/ext/clipboard b/.urxvt/ext/clipboard
new file mode 100644
index 0000000..8e71792
--- /dev/null
+++ b/.urxvt/ext/clipboard
@@ -0,0 +1,109 @@
+#! perl -w
+# Author: Bert Muennich
+# Website: http://www.github.com/muennich/urxvt-perls
+# License: GPLv2
+
+# Use keyboard shortcuts to copy the selection to the clipboard and to paste
+# the clipboard contents (optionally escaping all special characters).
+# Requires xsel to be installed!
+
+# Usage: put the following lines in your .Xdefaults/.Xresources:
+# URxvt.perl-ext-common: ...,clipboard
+# URxvt.keysym.M-c: perl:clipboard:copy
+# URxvt.keysym.M-v: perl:clipboard:paste
+# URxvt.keysym.M-C-v: perl:clipboard:paste_escaped
+
+# Options:
+# URxvt.clipboard.autocopy: If true, PRIMARY overwrites clipboard
+
+# You can also overwrite the system commands to use for copying/pasting.
+# The default ones are:
+# URxvt.clipboard.copycmd: xsel -ib
+# URxvt.clipboard.pastecmd: xsel -ob
+# If you prefer xclip, then put these lines in your .Xdefaults/.Xresources:
+# URxvt.clipboard.copycmd: xclip -i -selection clipboard
+# URxvt.clipboard.pastecmd: xclip -o -selection clipboard
+# On Mac OS X, put these lines in your .Xdefaults/.Xresources:
+# URxvt.clipboard.copycmd: pbcopy
+# URxvt.clipboard.pastecmd: pbpaste
+
+# The use of the functions should be self-explanatory!
+
+use strict;
+
+sub on_start {
+ my ($self) = @_;
+
+ $self->{copy_cmd} = $self->x_resource('clipboard.copycmd') || 'xsel -ib';
+ $self->{paste_cmd} = $self->x_resource('clipboard.pastecmd') || 'xsel -ob';
+
+ if ($self->x_resource('clipboard.autocopy') eq 'true') {
+ $self->enable(sel_grab => \&sel_grab);
+ }
+
+ ()
+}
+
+sub copy {
+ my ($self) = @_;
+
+ if (open(CLIPBOARD, "| $self->{copy_cmd}")) {
+ my $sel = $self->selection();
+ utf8::encode($sel);
+ print CLIPBOARD $sel;
+ close(CLIPBOARD);
+ } else {
+ print STDERR "error running '$self->{copy_cmd}': $!\n";
+ }
+
+ ()
+}
+
+sub paste {
+ my ($self) = @_;
+
+ my $str = `$self->{paste_cmd}`;
+ if ($? == 0) {
+ $self->tt_paste($str);
+ } else {
+ print STDERR "error running '$self->{paste_cmd}': $!\n";
+ }
+
+ ()
+}
+
+sub paste_escaped {
+ my ($self) = @_;
+
+ my $str = `$self->{paste_cmd}`;
+ if ($? == 0) {
+ $str =~ s/([!#\$%&\*\(\) ='"\\\|\[\]`~,<>\?])/\\\1/g;
+ $self->tt_paste($str);
+ } else {
+ print STDERR "error running '$self->{paste_cmd}': $!\n";
+ }
+
+ ()
+}
+
+sub on_user_command {
+ my ($self, $cmd) = @_;
+
+ if ($cmd eq "clipboard:copy") {
+ $self->copy;
+ } elsif ($cmd eq "clipboard:paste") {
+ $self->paste;
+ } elsif ($cmd eq "clipboard:paste_escaped") {
+ $self->paste_escaped;
+ }
+
+ ()
+}
+
+sub sel_grab {
+ my ($self) = @_;
+
+ $self->copy;
+
+ ()
+}
diff --git a/.urxvt/ext/keyboard-select b/.urxvt/ext/keyboard-select
new file mode 100644
index 0000000..d9f16bf
--- /dev/null
+++ b/.urxvt/ext/keyboard-select
@@ -0,0 +1,567 @@
+#! perl -w
+# Author: Bert Muennich
+# Website: http://www.github.com/muennich/urxvt-perls
+# License: GPLv2
+
+# Use keyboard shortcuts to select and copy text.
+
+# Usage: put the following lines in your .Xdefaults/.Xresources:
+# URxvt.perl-ext-common: ...,keyboard-select
+# URxvt.keysym.M-Escape: perl:keyboard-select:activate
+# The following line overwrites the default Meta-s binding and allows to
+# activate keyboard-select directly in backward search mode:
+# URxvt.keysym.M-s: perl:keyboard-select:search
+
+# Use Meta-Escape to activate selection mode, then use the following keys:
+# h/j/k/l: Move cursor left/down/up/right (also with arrow keys)
+# g/G/0/^/$/H/M/L/f/F/;/,/w/W/b/B/e/E: More vi-like cursor movement keys
+# '/'/?: Start forward/backward search
+# n/N: Repeat last search, N: in reverse direction
+# Ctrl-f/b: Scroll down/up one screen
+# Ctrl-d/u: Scroll down/up half a screen
+# v/V/Ctrl-v: Toggle normal/linewise/blockwise selection
+# y/Return: Copy selection to primary buffer, Return: deactivate afterwards
+# q/Escape: Deactivate keyboard selection mode
+
+
+use strict;
+
+sub on_start{
+ my ($self) = @_;
+
+ $self->{patterns}{'w'} = qr/\w[^\w\s]|\W\w|\s\S/;
+ $self->{patterns}{'W'} = qr/\s\S/;
+ $self->{patterns}{'b'} = qr/.*(?:\w[^\w\s]|\W\w|\s\S)/;
+ $self->{patterns}{'B'} = qr/.*\s\S/;
+ $self->{patterns}{'e'} = qr/[^\w\s](?=\w)|\w(?=\W)|\S(?=\s|$)/;
+ $self->{patterns}{'E'} = qr/\S(?=\s|$)/;
+
+ ()
+}
+
+
+sub on_user_command {
+ my ($self, $cmd) = @_;
+
+ if (not $self->{active}) {
+ if ($cmd eq 'keyboard-select:activate') {
+ activate($self);
+ } elsif ($cmd eq 'keyboard-select:search') {
+ activate($self, 1);
+ }
+ }
+
+ ()
+}
+
+
+sub key_press {
+ my ($self, $event, $keysym, $char) = @_;
+ my $key = chr($keysym);
+
+ if (lc($key) eq 'c' && $event->{state} & urxvt::ControlMask) {
+ deactivate($self);
+ } elsif ($self->{search}) {
+ if ($keysym == 0xff1b) {
+ if ($self->{search_mode}) {
+ deactivate($self);
+ } else {
+ $self->{search} = '';
+ status_area($self);
+ }
+ } elsif ($keysym == 0xff08) {
+ $self->{search} = substr($self->{search}, 0, -1);
+ if (not $self->{search} and $self->{search_mode}) {
+ deactivate($self);
+ } else {
+ status_area($self);
+ }
+ } elsif ($keysym == 0xff0d) {
+ my $txt = substr($self->{search}, 1);
+ if ($txt) {
+ $self->{pattern} = ($txt =~ m/[[:upper:]]/) ? qr/\Q$txt\E/ :
+ qr/\Q$txt\E/i;
+ } elsif ($self->{pattern}) {
+ delete $self->{pattern};
+ }
+ $self->{search} = '';
+ if (not find_next($self)) {
+ if ($self->{search_mode}) {
+ deactivate($self);
+ } else {
+ status_area($self);
+ }
+ }
+ } elsif (length($char) > 0) {
+ $self->{search} .= $self->locale_decode($char);
+ status_area($self);
+ }
+ } elsif ($self->{move_to}) {
+ if ($keysym == 0xff1b) {
+ $self->{move_to} = 0;
+ status_area($self);
+ } elsif (length($char) > 0) {
+ $self->{move_to} = 0;
+ $self->{patterns}{'f-1'} = qr/^.*\Q$key\E/;
+ $self->{patterns}{'f+1'} = qr/^.+?\Q$key\E/;
+ move_to($self, ';');
+ status_area($self);
+ }
+ } elsif ($keysym == 0xff1b || lc($key) eq 'q') {
+ deactivate($self);
+ } elsif ($key eq 'y' || $keysym == 0xff0d) {
+ if ($self->{select}) {
+ if ($self->{select} eq 'b') {
+ $self->selection($self->{selection});
+ $self->selection_grab($event->{time});
+ } else {
+ my ($br, $bc, $er, $ec) = calc_span($self);
+ $ec = $self->line($er)->l if $self->{select} eq 'l';
+ $self->selection_beg($br, $bc);
+ $self->selection_end($er, $ec);
+ $self->selection_make($event->{time});
+ }
+ if ($key eq 'y') {
+ if ($self->{select} ne 'b') {
+ $self->selection_beg(1, 0);
+ $self->selection_end(1, 0);
+ }
+ $self->{select} = '';
+ status_area($self);
+ $self->want_refresh();
+ } else {
+ deactivate($self);
+ }
+ }
+ } elsif ($key eq 'V') {
+ toggle_select($self, 'l');
+ } elsif ($key eq 'v') {
+ if ($event->{state} & urxvt::ControlMask) {
+ toggle_select($self, 'b');
+ } else {
+ toggle_select($self, 'n');
+ }
+ } elsif ($key eq 'k' || $keysym == 0xff52) {
+ move_cursor($self, 'k');
+ } elsif ($key eq 'j' || $keysym == 0xff54) {
+ move_cursor($self, 'j');
+ } elsif ($key eq 'h' || $keysym == 0xff51) {
+ move_cursor($self, 'h');
+ } elsif ($key eq 'l' || $keysym == 0xff53) {
+ move_cursor($self, 'l');
+ } elsif ('gG0^$HML' =~ m/\Q$key\E/ ||
+ ('fbdu' =~ m/\Q$key\E/ && $event->{state} & urxvt::ControlMask)) {
+ move_cursor($self, $key);
+ } elsif (lc($key) eq 'f') {
+ $self->{move_to} = 1;
+ $self->{move_dir} = $key eq 'F' ? -1 : 1;
+ status_area($self, $key);
+ } elsif (';,wWbBeE' =~ m/\Q$key\E/) {
+ move_to($self, $key);
+ } elsif ($key eq '/' || $key eq '?') {
+ $self->{search} = $key;
+ $self->{search_dir} = $key eq '?' ? -1 : 1;
+ status_area($self);
+ } elsif (lc($key) eq 'n') {
+ find_next($self, $self->{search_dir} * ($key eq 'N' ? -1 : 1));
+ }
+
+ return 1;
+}
+
+
+sub move_cursor {
+ my ($self, $key) = @_;
+ my ($cr, $cc) = $self->screen_cur();
+ my $line = $self->line($cr);
+
+ if ($key eq 'k' && $line->beg > $self->top_row) {
+ $cr = $line->beg - 1;
+ } elsif ($key eq 'j' && $line->end < $self->nrow - 1) {
+ $cr = $line->end + 1;
+ } elsif ($key eq 'h' && $self->{offset} > 0) {
+ $self->{offset} = $line->offset_of($cr, $cc) - 1;
+ $self->{dollar} = 0;
+ } elsif ($key eq 'l' && $self->{offset} < $line->l - 1) {
+ ++$self->{offset};
+ } elsif ($key eq 'f' || $key eq 'd') {
+ my $vs = $self->view_start() +
+ ($key eq 'd' ? $self->nrow / 2 : $self->nrow - 1);
+ $vs = 0 if $vs > 0;
+ $cr += $vs - $self->view_start($vs);
+ } elsif ($key eq 'b' || $key eq 'u') {
+ my $vs = $self->view_start() -
+ ($key eq 'u' ? $self->nrow / 2 : $self->nrow - 1);
+ $vs = $self->top_row if $vs < $self->top_row;
+ $cr += $vs - $self->view_start($vs);
+ } elsif ($key eq 'g') {
+ ($cr, $self->{offset}) = ($self->top_row, 0);
+ $self->{dollar} = 0;
+ } elsif ($key eq 'G') {
+ ($cr, $self->{offset}) = ($self->nrow - 1, 0);
+ $self->{dollar} = 0;
+ } elsif ($key eq '0') {
+ $self->{offset} = 0;
+ $self->{dollar} = 0;
+ } elsif ($key eq '^') {
+ my $ltxt = $self->special_decode($line->t);
+ while ($ltxt =~ s/^( *)\t/$1 . " " x (8 - length($1) % 8)/e) {}
+ $self->{offset} = $ltxt =~ m/^ +/ ? $+[0] : 0;
+ $self->{dollar} = 0;
+ } elsif ($key eq '$') {
+ my $co = $line->offset_of($cr, $cc);
+ $self->{dollar} = $co + 1;
+ $self->{offset} = $line->l - 1;
+ } elsif ($key eq 'H') {
+ $cr = $self->view_start();
+ } elsif ($key eq 'M') {
+ $cr = $self->view_start() + $self->nrow / 2;
+ } elsif ($key eq 'L') {
+ $cr = $self->view_start() + $self->nrow - 1;
+ }
+
+ $line = $self->line($cr);
+ $cc = $self->{dollar} || $self->{offset} >= $line->l ? $line->l - 1 :
+ $self->{offset};
+ $self->screen_cur($line->coord_of($cc));
+
+ status_area($self);
+ $self->want_refresh();
+
+ ()
+}
+
+
+sub move_to {
+ my ($self, $key) = @_;
+ my ($cr, $cc) = $self->screen_cur();
+ my $line = $self->line($cr);
+ my $offset = $self->{offset};
+ my ($dir, $pattern);
+ my ($wrap, $found) = (0, 0);
+
+ if ($key eq ';' || $key eq ',') {
+ $dir = $self->{move_dir} * ($key eq ',' ? -1 : 1);
+ $pattern = $self->{patterns}{sprintf('f%+d', $dir)};
+ return if not $pattern;
+ } else {
+ if (lc($key) eq 'b') {
+ $dir = -1;
+ } else {
+ $dir = 1;
+ ++$offset if lc($key) eq 'e';
+ }
+ $pattern = $self->{patterns}{$key};
+ $wrap = 1;
+ }
+
+ if ($dir > 0) {
+ NEXTDOWN: my $text = substr($line->t, $offset);
+ if ($text =~ m/$pattern/) {
+ $offset += $+[0] - 1;
+ $found = 1;
+ } elsif ($wrap && $line->end + 1 < $self->nrow) {
+ $cr = $line->end + 1;
+ $line = $self->line($cr);
+ $offset = 0;
+ if (lc($key) eq 'e') {
+ goto NEXTDOWN;
+ } else {
+ $found = 1;
+ }
+ }
+ } elsif ($dir < 0) {
+ NEXTUP: my $text = substr($line->t, 0, $offset);
+ if ($text =~ m/$pattern/) {
+ $offset += $+[0] - length($text) - 1;
+ $found = 1;
+ } elsif ($wrap) {
+ if ($offset > 0) {
+ $offset = 0;
+ $found = 1;
+ } elsif ($line->beg > $self->top_row) {
+ $cr = $line->beg - 1;
+ $line = $self->line($cr);
+ $offset = $line->l;
+ goto NEXTUP;
+ }
+ }
+ }
+
+ if ($found) {
+ $self->{dollar} = 0;
+ $self->{offset} = $offset;
+ $self->screen_cur($line->coord_of($offset));
+ $self->want_refresh();
+ }
+
+ ()
+}
+
+
+sub find_next {
+ my ($self, $dir) = @_;
+
+ return if not $self->{pattern};
+ $dir = $self->{search_dir} if not $dir;
+
+ my ($cr, $cc) = $self->screen_cur();
+ my $line = $self->line($cr);
+ my $offset = $line->offset_of($cr, $cc);
+ my $text;
+ my $found = 0;
+
+ ++$offset if $dir > 0;
+
+ while (not $found) {
+ if ($dir > 0) {
+ $text = substr($line->t, $offset);
+ if ($text =~ m/$self->{pattern}/) {
+ $found = 1;
+ $offset += $-[0];
+ } else {
+ last if $line->end >= $self->nrow;
+ $line = $self->line($line->end + 1);
+ $offset = 0;
+ }
+ } else {
+ $text = substr($line->t, 0, $offset);
+ if ($text =~ m/$self->{pattern}/) {
+ $found = 1;
+ $offset = $-[0] while $text =~ m/$self->{pattern}/g;
+ } else {
+ last if $line->beg <= $self->top_row;
+ $line = $self->line($line->beg - 1);
+ $offset = $line->l;
+ }
+ }
+ }
+
+ if ($found) {
+ $self->{dollar} = 0;
+ $self->{offset} = $offset;
+ $self->screen_cur($line->coord_of($offset));
+ status_area($self);
+ $self->want_refresh();
+ }
+
+ return $found;
+}
+
+
+sub tt_write {
+ return 1;
+}
+
+
+sub refresh {
+ my ($self) = @_;
+ my $reverse_cursor = $self->{select} ne 'l';
+ my ($cr, $cc) = $self->screen_cur();
+
+ if ($self->{select}) {
+ my ($br, $bc, $er, $ec) = calc_span($self);
+
+ if ($self->{select} eq 'b') {
+ delete $self->{selection} if $self->{selection};
+ my $co = $self->line($cr)->offset_of($cr, $cc);
+ my $dollar = $self->{dollar} && $co >= $self->{dollar} - 1;
+
+ my $r = $br;
+ while ($r <= $er) {
+ my $line = $self->line($r);
+ if ($bc < $line->l) {
+ $ec = $line->l if $dollar;
+ $self->{selection} .= substr($line->t, $bc, $ec - $bc);
+ my ($br, $bc) = $line->coord_of($bc);
+ my ($er, $ec) = $line->coord_of($ec <= $line->l ? $ec : $line->l);
+ $self->scr_xor_span($br, $bc, $er, $ec, urxvt::RS_RVid);
+ } elsif ($r == $cr) {
+ $reverse_cursor = 0;
+ }
+ $self->{selection} .= "\n" if $line->end < $er;
+ $r = $line->end + 1;
+ }
+ } else {
+ $self->scr_xor_span($br, $bc, $er, $ec, urxvt::RS_RVid);
+ }
+
+ if ($reverse_cursor) {
+ # make the cursor visible again
+ $self->scr_xor_span($cr, $cc, $cr, $cc + 1, urxvt::RS_RVid);
+ }
+ }
+
+ # scroll the current cursor position into visible area
+ if ($cr < $self->view_start()) {
+ $self->view_start($cr);
+ } elsif ($cr >= $self->view_start() + $self->nrow) {
+ $self->view_start($cr - $self->nrow + 1);
+ }
+
+ ()
+}
+
+
+sub activate {
+ my ($self, $search) = @_;
+
+ $self->{active} = 1;
+
+ $self->{select} = '';
+ $self->{dollar} = 0;
+ $self->{move_to} = 0;
+
+ if ($search) {
+ $self->{search} = '?';
+ $self->{search_dir} = -1;
+ $self->{search_mode} = 1;
+ } else {
+ $self->{search} = '';
+ $self->{search_mode} = 0;
+ }
+
+ ($self->{oldcr}, $self->{oldcc}) = $self->screen_cur();
+ $self->{old_view_start} = $self->view_start();
+ $self->{old_pty_ev_events} = $self->pty_ev_events(urxvt::EV_NONE);
+
+ my $line = $self->line($self->{oldcr});
+ $self->{offset} = $line->offset_of($self->{oldcr}, $self->{oldcc});
+
+ $self->selection_beg(1, 0);
+ $self->selection_end(1, 0);
+
+ $self->enable(
+ key_press => \&key_press,
+ refresh_begin => \&refresh,
+ refresh_end => \&refresh,
+ tt_write => \&tt_write,
+ );
+
+ if ($self->{offset} >= $line->l) {
+ $self->{offset} = $line->l > 0 ? $line->l - 1 : 0;
+ $self->screen_cur($line->coord_of($self->{offset}));
+ $self->want_refresh();
+ }
+
+ $self->{overlay_len} = 0;
+ status_area($self);
+
+ ()
+}
+
+
+sub deactivate {
+ my ($self) = @_;
+
+ $self->selection_beg(1, 0);
+ $self->selection_end(1, 0);
+
+ delete $self->{overlay} if $self->{overlay};
+ delete $self->{selection} if $self->{selection};
+
+ $self->disable("key_press", "refresh_begin", "refresh_end", "tt_write");
+ $self->screen_cur($self->{oldcr}, $self->{oldcc});
+ $self->view_start($self->{old_view_start});
+ $self->pty_ev_events($self->{old_pty_ev_events});
+
+ $self->want_refresh();
+
+ $self->{active} = 0;
+
+ ()
+}
+
+
+sub status_area {
+ my ($self, $extra) = @_;
+ my ($stat, $stat_len);
+
+ if ($self->{search}) {
+ $stat_len = $self->ncol;
+ $stat = $self->{search} . ' ' x ($stat_len - length($self->{search}));
+ } else {
+ if ($self->{select}) {
+ $stat = "-V" . ($self->{select} ne 'n' ? uc($self->{select}) : "") . "- ";
+ }
+
+ if ($self->top_row == 0) {
+ $stat .= "All";
+ } elsif ($self->view_start() == $self->top_row) {
+ $stat .= "Top";
+ } elsif ($self->view_start() == 0) {
+ $stat .= "Bot";
+ } else {
+ $stat .= sprintf("%2d%%",
+ ($self->top_row - $self->view_start) * 100 / $self->top_row);
+ }
+
+ $stat = "$extra $stat" if $extra;
+ $stat_len = length($stat);
+ }
+
+ if (!$self->{overlay} || $self->{overlay_len} != $stat_len) {
+ delete $self->{overlay} if $self->{overlay};
+ $self->{overlay} = $self->overlay(-1, -1, $stat_len, 1,
+ urxvt::OVERLAY_RSTYLE, 0);
+ $self->{overlay_len} = $stat_len;
+ }
+
+ $self->{overlay}->set(0, 0, $self->special_encode($stat));
+ $self->{overlay}->show();
+
+ ()
+}
+
+
+sub toggle_select {
+ my ($self, $mode) = @_;
+
+ if ($self->{select} eq $mode) {
+ $self->{select} = '';
+ } else {
+ if (not $self->{select}) {
+ ($self->{ar}, $self->{ac}) = $self->screen_cur();
+ }
+ $self->{select} = $mode;
+ }
+
+ status_area($self);
+ $self->want_refresh();
+
+ ()
+}
+
+
+sub calc_span {
+ my ($self) = @_;
+ my ($cr, $cc) = $self->screen_cur();
+ my ($br, $bc, $er, $ec);
+
+ if ($self->{select} eq 'b') {
+ $br = $self->line($cr)->beg;
+ $bc = $self->line($cr)->offset_of($cr, $cc);
+ $er = $self->line($self->{ar})->beg;
+ $ec = $self->line($self->{ar})->offset_of($self->{ar}, $self->{ac});
+ ($br, $er) = ($er, $br) if $br > $er;
+ ($bc, $ec) = ($ec, $bc) if $bc > $ec;
+ } else {
+ if ($cr < $self->{ar}) {
+ ($br, $bc, $er, $ec) = ($cr, $cc, $self->{ar}, $self->{ac});
+ } elsif ($cr > $self->{ar}) {
+ ($br, $bc, $er, $ec) = ($self->{ar}, $self->{ac}, $cr, $cc);
+ } else {
+ ($br, $er) = ($cr, $cr);
+ ($bc, $ec) = $cc < $self->{ac} ? ($cc, $self->{ac}) : ($self->{ac}, $cc);
+ }
+ }
+
+ if ($self->{select} eq 'l') {
+ ($br, $er) = ($self->line($br)->beg, $self->line($er)->end);
+ ($bc, $ec) = (0, $self->ncol);
+ } else {
+ ++$ec;
+ }
+
+ return ($br, $bc, $er, $ec);
+}
diff --git a/.urxvt/ext/url-select b/.urxvt/ext/url-select
new file mode 100644
index 0000000..f4ddda8
--- /dev/null
+++ b/.urxvt/ext/url-select
@@ -0,0 +1,375 @@
+#! perl -w
+# Author: Bert Muennich
+# Website: http://www.github.com/muennich/urxvt-perls
+# Based on: http://www.jukie.net/~bart/blog/urxvt-url-yank
+# License: GPLv2
+
+# Use keyboard shortcuts to select URLs.
+# This should be used as a replacement for the default matcher extension,
+# it also makes URLs clickable with the middle mouse button.
+
+# Usage: put the following lines in your .Xdefaults/.Xresources:
+# URxvt.perl-ext-common: ...,url-select
+# URxvt.keysym.M-u: perl:url-select:select_next
+
+# Use Meta-u to activate URL selection mode, then use the following keys:
+# j/k: Select next downward/upward URL (also with arrow keys)
+# g/G: Select first/last URL (also with home/end key)
+# o/Return: Open selected URL in browser, Return: deactivate afterwards
+# y: Copy (yank) selected URL and deactivate selection mode
+# q/Escape: Deactivate URL selection mode
+
+# Options:
+# URxvt.url-select.autocopy: If true, selected URLs are copied to PRIMARY
+# URvxt.url-select.button: Mouse button to click-open URLs (default: 2)
+# URxvt.url-select.launcher: Browser/command to open selected URL with
+# URxvt.url-select.underline: If set to true, all URLs get underlined
+
+use strict;
+
+sub on_start {
+ my ($self) = @_;
+
+ # read resource settings
+ if ($self->x_resource('url-select.launcher')) {
+ @{$self->{browser}} = split /\s+/, $self->x_resource('url-select.launcher');
+ } else {
+ @{$self->{browser}} = ('x-www-browser');
+ }
+ if ($self->x_resource('url-select.underline') eq 'true') {
+ $self->enable(line_update => \&line_update);
+ }
+ if ($self->x_resource('url-select.autocopy') eq 'true') {
+ $self->{autocopy} = 1;
+ }
+
+ $self->{state} = 0;
+
+ for my $mod (split '', $self->x_resource("url-select.button") ||
+ $self->x_resource("matcher.button") || 2) {
+ if ($mod =~ /^\d+$/) {
+ $self->{button} = $mod;
+ } elsif ($mod eq "C") {
+ $self->{state} |= urxvt::ControlMask;
+ } elsif ($mod eq "S") {
+ $self->{state} |= urxvt::ShiftMask;
+ } elsif ($mod eq "M") {
+ $self->{state} |= $self->ModMetaMask;
+ } elsif ($mod ne "-" && $mod ne " ") {
+ warn("invalid button/modifier in $self->{_name}<$self->{argv}[0]>: $mod\n");
+ }
+ }
+
+ if ($self->x_resource('matcher.pattern')) {
+ @{$self->{pattern}} = ($self->x_resource('matcher.pattern'));
+ } elsif ($self->x_resource('matcher.pattern.1')) {
+ my $current = 1;
+
+ while ($self->x_resource("matcher.pattern.$current")) {
+ push @{$self->{pattern}}, $self->x_resource("matcher.pattern.$current");
+ $current++;
+ }
+ } else {
+ @{$self->{pattern}} = qr{
+ (?:https?://|ftp://|news://|mailto:|file://|\bwww\.)
+ [\w\-\@;\/?:&=%\$.+!*\x27,~#]*
+ (
+ \([\w\-\@;\/?:&=%\$.+!*\x27,~#]*\) # Allow a pair of matched parentheses
+ | #
+ [\w\-\@;\/?:&=%\$+*~] # exclude some trailing characters (heuristic)
+ )+
+ }x;
+ }
+
+ ()
+}
+
+
+sub line_update {
+ my ($self, $row) = @_;
+
+ my $line = $self->line($row);
+ my $text = $line->t;
+ my $rend = $line->r;
+
+ for my $pattern (@{$self->{pattern}}) {
+ while ($text =~ /$pattern/g) {
+ my $url = $&;
+ my ($beg, $end) = ($-[0], $+[0] - 1);
+
+ for (@{$rend}[$beg .. $end]) {
+ $_ |= urxvt::RS_Uline;
+ }
+ $line->r($rend);
+ }
+ }
+
+ ()
+}
+
+
+sub on_user_command {
+ my ($self, $cmd) = @_;
+
+ if ($cmd eq 'url-select:select_next') {
+ if (not $self->{active}) {
+ activate($self);
+ }
+ select_next($self, -1);
+ }
+
+ ()
+}
+
+
+sub key_press {
+ my ($self, $event, $keysym) = @_;
+ my $char = chr($keysym);
+
+ if ($keysym == 0xff1b || lc($char) eq 'q' ||
+ (lc($char) eq 'c' && $event->{state} & urxvt::ControlMask)) {
+ deactivate($self);
+ } elsif ($keysym == 0xff0d || $char eq 'o') {
+ $self->exec_async(@{$self->{browser}}, ${$self->{found}[$self->{n}]}[4]);
+ deactivate($self) unless $char eq 'o';
+ } elsif ($char eq 'y') {
+ my $found = $self->{found}[$self->{n}];
+ $self->selection_beg(${$found}[0], ${$found}[1]);
+ $self->selection_end(${$found}[2], ${$found}[3]);
+ $self->selection_make($event->{time});
+ $self->selection_beg(1, 0);
+ $self->selection_end(1, 0);
+ deactivate($self);
+ } elsif ($char eq 'k' || $keysym == 0xff52 || $keysym == 0xff51) {
+ select_next($self, -1, $event);
+ } elsif ($char eq 'j' || $keysym == 0xff54 || $keysym == 0xff53) {
+ select_next($self, 1, $event);
+ } elsif ($char eq 'g' || $keysym == 0xff50) {
+ $self->{row} = $self->top_row - 1;
+ delete $self->{found};
+ select_next($self, 1, $event);
+ } elsif ($char eq 'G' || $keysym == 0xff57) {
+ $self->{row} = $self->nrow;
+ delete $self->{found};
+ select_next($self, -1, $event);
+ }
+
+ return 1;
+}
+
+
+sub on_button_press {
+ my ($self, $event) = @_;
+
+ my $mask = $self->ModLevel3Mask | $self->ModMetaMask |
+ urxvt::ShiftMask | urxvt::ControlMask;
+
+ if ($event->{button} == $self->{button} && ($event->{state} & $mask) == $self->{state}) {
+ $self->{button_pressed} = 1;
+ $self->{button_col} = $event->{col};
+ $self->{button_row} = $event->{row};
+ }
+
+ ()
+}
+
+sub on_button_release {
+ my ($self, $event) = @_;
+
+ if ($self->{button_pressed} && $event->{button} == $self->{button}) {
+ my $col = $event->{col};
+ my $row = $event->{row};
+
+ $self->{button_pressed} = 0;
+
+ if ($col == $self->{button_col} && $row == $self->{button_row}) {
+ my $line = $self->line($row);
+ my $text = $line->t;
+
+ for my $pattern (@{$self->{pattern}}) {
+ while ($text =~ /$pattern/g) {
+ my ($url, $beg, $end) = ($&, $-[0], $+[0]);
+ --$end if $url =~ s/["')]$//;
+
+ if ($col >= $beg && $col <= $end) {
+ $self->exec_async(@{$self->{browser}}, $url);
+ return 1;
+ }
+ }
+ }
+ }
+ }
+
+ ()
+}
+
+
+sub select_next {
+ # $dir < 0: up, > 0: down
+ my ($self, $dir, $event) = @_;
+ my $row = $self->{row};
+
+ if (($dir < 0 && $self->{n} > 0) ||
+ ($dir > 0 && $self->{n} < $#{ $self->{found} })) {
+ # another url on current line
+ $self->{n} += $dir;
+ hilight($self);
+ if ($self->{autocopy}) {
+ my $found = $self->{found}[$self->{n}];
+ $self->selection_beg(${$found}[0], ${$found}[1]);
+ $self->selection_end(${$found}[2], ${$found}[3]);
+ $self->selection_make($event->{time});
+ $self->selection_beg(1, 0);
+ $self->selection_end(1, 0);
+ }
+ return;
+ }
+
+ while (($dir < 0 && $row > $self->top_row) ||
+ ($dir > 0 && $row < $self->nrow - 1)) {
+ my $line = $self->line($row);
+ $row = ($dir < 0 ? $line->beg : $line->end) + $dir;
+ $line = $self->line($row);
+ my $text = $line->t;
+
+ for my $pattern (@{$self->{pattern}}) {
+ if ($text =~ /$pattern/g) {
+ delete $self->{found};
+
+ do {
+ my ($beg, $end) = ($-[0], $+[0]);
+ push @{$self->{found}}, [$line->coord_of($beg),
+ $line->coord_of($end), substr($text, $beg, $end - $beg)];
+ } while ($text =~ /$pattern/g);
+
+ $self->{row} = $row;
+ $self->{n} = $dir < 0 ? $#{$self->{found}} : 0;
+ hilight($self);
+ if ($self->{autocopy}) {
+ my $found = $self->{found}[$self->{n}];
+ $self->selection_beg(${$found}[0], ${$found}[1]);
+ $self->selection_end(${$found}[2], ${$found}[3]);
+ $self->selection_make($event->{time});
+ $self->selection_beg(1, 0);
+ $self->selection_end(1, 0);
+ }
+ return;
+ }
+ }
+ }
+
+ deactivate($self) unless $self->{found};
+
+ ()
+}
+
+
+sub hilight {
+ my ($self) = @_;
+
+ if ($self->{found}) {
+ if ($self->{row} < $self->view_start() ||
+ $self->{row} >= $self->view_start() + $self->nrow) {
+ # scroll selected url into visible area
+ my $top = $self->{row} - ($self->nrow >> 1);
+ $self->view_start($top < 0 ? $top : 0);
+ }
+
+ status_area($self);
+ $self->want_refresh();
+ }
+
+ ()
+}
+
+
+sub refresh {
+ my ($self) = @_;
+
+ if ($self->{found}) {
+ $self->scr_xor_span(@{$self->{found}[$self->{n}]}[0 .. 3], urxvt::RS_RVid);
+ }
+
+ ()
+}
+
+
+sub status_area {
+ my ($self) = @_;
+
+ my $row = $self->{row} < 0 ?
+ $self->{row} - $self->top_row : abs($self->top_row) + $self->{row};
+ my $text = sprintf("%d,%d ", $row + 1, $self->{n} + 1);
+
+ if ($self->top_row == 0) {
+ $text .= "All";
+ } elsif ($self->view_start() == $self->top_row) {
+ $text .= "Top";
+ } elsif ($self->view_start() == 0) {
+ $text .= "Bot";
+ } else {
+ $text .= sprintf("%2d%",
+ ($self->top_row - $self->view_start) * 100 / $self->top_row);
+ }
+
+ my $text_len = length($text);
+
+ if ($self->{overlay_len} != $text_len) {
+ delete $self->{overlay} if $self->{overlay};
+ $self->{overlay} = $self->overlay(-1, -1, $text_len, 1,
+ urxvt::OVERLAY_RSTYLE, 0);
+ $self->{overlay_len} = $text_len;
+ }
+
+ $self->{overlay}->set(0, 0, $self->special_encode($text));
+ $self->{overlay}->show();
+
+ ()
+}
+
+
+sub tt_write {
+ return 1;
+}
+
+
+sub activate {
+ my ($self) = @_;
+
+ $self->{active} = 1;
+
+ $self->{row} = $self->view_start() + $self->nrow;
+ $self->{n} = 0;
+ $self->{overlay_len} = 0;
+ $self->{button_pressed} = 0;
+
+ $self->{view_start} = $self->view_start();
+ $self->{pty_ev_events} = $self->pty_ev_events(urxvt::EV_NONE);
+
+ $self->enable(
+ key_press => \&key_press,
+ refresh_begin => \&refresh,
+ refresh_end => \&refresh,
+ tt_write => \&tt_write,
+ );
+
+ ()
+}
+
+
+sub deactivate {
+ my ($self) = @_;
+
+ $self->disable("key_press", "refresh_begin", "refresh_end", "tt_write");
+ $self->view_start($self->{view_start});
+ $self->pty_ev_events($self->{pty_ev_events});
+
+ delete $self->{overlay} if $self->{overlay};
+ delete $self->{found} if $self->{found};
+
+ $self->want_refresh();
+
+ $self->{active} = 0;
+
+ ()
+}
diff --git a/.vifm/colors/Default b/.vifm/colors/Default
new file mode 100644
index 0000000..c3c72dd
--- /dev/null
+++ b/.vifm/colors/Default
@@ -0,0 +1,52 @@
+" You can edit this file by hand.
+" The " character at the beginning of a line comments out the line.
+" Blank lines are ignored.
+
+" The Default color scheme is used for any directory that does not have
+" a specified scheme and for parts of user interface like menus. A
+" color scheme set for a base directory will also
+" be used for the sub directories.
+
+" The standard ncurses colors are:
+" Default = -1 = None, can be used for transparency or default color
+" Black = 0
+" Red = 1
+" Green = 2
+" Yellow = 3
+" Blue = 4
+" Magenta = 5
+" Cyan = 6
+" White = 7
+
+" Available style values (some of them can be combined):
+" bold
+" underline
+" reverse or inverse
+" standout
+" none
+
+" Vifm supports 256 colors you can use color numbers 0-255
+" (requires properly set up terminal: set your TERM environment variable
+" (directly or using resources) to some color terminal name (e.g.
+" xterm-256color) from /usr/lib/terminfo/; you can check current number
+" of colors in your terminal with tput colors command)
+
+" highlight group cterm=style ctermfg=foreground_color ctermbg=background_color
+
+highlight Win cterm=none ctermfg=white ctermbg=black
+highlight Directory cterm=bold ctermfg=cyan ctermbg=default
+highlight Link cterm=bold ctermfg=yellow ctermbg=default
+highlight BrokenLink cterm=bold ctermfg=red ctermbg=default
+highlight Socket cterm=bold ctermfg=magenta ctermbg=default
+highlight Device cterm=bold ctermfg=red ctermbg=default
+highlight Fifo cterm=bold ctermfg=cyan ctermbg=default
+highlight Executable cterm=bold ctermfg=green ctermbg=default
+highlight Selected cterm=bold ctermfg=magenta ctermbg=default
+highlight CurrLine cterm=bold ctermfg=default ctermbg=blue
+highlight TopLine cterm=none ctermfg=black ctermbg=white
+highlight TopLineSel cterm=bold ctermfg=black ctermbg=default
+highlight StatusLine cterm=bold ctermfg=black ctermbg=white
+highlight WildMenu cterm=underline,reverse ctermfg=white ctermbg=black
+highlight CmdLine cterm=none ctermfg=white ctermbg=black
+highlight ErrorMsg cterm=none ctermfg=red ctermbg=black
+highlight Border cterm=none ctermfg=black ctermbg=white
diff --git a/.vifm/colors/alycolors b/.vifm/colors/alycolors
new file mode 100644
index 0000000..ddaacd6
--- /dev/null
+++ b/.vifm/colors/alycolors
@@ -0,0 +1,60 @@
+""
+"" vifm colorscheme
+"" based on 'Default' & 'istib-solarized-dark' & 'juef-zenburn'
+""
+"" Weitian LI <liweitianux@gmail.com>
+"" 2014/05/12
+""
+
+
+"" The standard ncurses colors are:
+" Default = -1 = None (can be used for transparency or default color)
+" Black = 0
+" Red = 1
+" Green = 2
+" Yellow = 3
+" Blue = 4
+" Magenta = 5
+" Cyan = 6
+" White = 7
+
+"" Available style values (some of them can be combined):
+" bold
+" underline
+" reverse/inverse
+" standout
+" none
+
+"" Vifm supports 256 colors you can use color numbers 0-255
+" (requires properly set up terminal: set your TERM environment variable
+" (directly or using resources) to some color terminal name (e.g.
+" xterm-256color) from /usr/lib/terminfo/; you can check current number
+" of colors in your terminal with tput colors command)
+
+"" Syntax:
+" highlight group cterm=style ctermfg=fg_color ctermbg=bg_color
+
+
+highlight Win cterm=none ctermfg=default ctermbg=none
+
+highlight TopLine cterm=none ctermfg=yellow ctermbg=none
+highlight TopLineSel cterm=bold ctermfg=magenta ctermbg=none
+highlight StatusLine cterm=bold ctermfg=yellow ctermbg=none
+highlight Border cterm=none ctermfg=default ctermbg=none
+
+highlight Selected cterm=bold ctermfg=magenta ctermbg=black
+highlight CurrLine cterm=bold ctermfg=yellow ctermbg=blue
+
+highlight WildMenu cterm=bold,reverse ctermfg=yellow ctermbg=black
+highlight CmdLine cterm=none ctermfg=white ctermbg=black
+highlight ErrorMsg cterm=bold ctermfg=magenta ctermbg=black
+
+highlight Directory cterm=bold ctermfg=blue ctermbg=default
+highlight Executable cterm=bold ctermfg=green ctermbg=default
+highlight Link cterm=bold ctermfg=cyan ctermbg=default
+highlight BrokenLink cterm=bold ctermfg=yellow ctermbg=red
+highlight Device cterm=bold ctermfg=yellow ctermbg=default
+highlight Socket cterm=bold ctermfg=magenta ctermbg=default
+highlight Fifo cterm=none ctermfg=red ctermbg=default
+
+" vim: set ts=8 sw=4 tw=78 fenc=utf-8 ft=vifm: "
diff --git a/.vifm/colors/dmilith-root b/.vifm/colors/dmilith-root
new file mode 100644
index 0000000..393d02a
--- /dev/null
+++ b/.vifm/colors/dmilith-root
@@ -0,0 +1,21 @@
+" vim: filetype=vifm :
+
+" Author: Daniel Dettlaff (a.k.a. dmilith)
+
+highlight Win cterm=none ctermfg=white ctermbg=black
+highlight Directory cterm=bold ctermfg=cyan ctermbg=black
+highlight Link cterm=bold ctermfg=yellow ctermbg=black
+highlight BrokenLink cterm=bold ctermfg=red ctermbg=none
+highlight Socket cterm=bold ctermfg=magenta ctermbg=black
+highlight Device cterm=bold ctermfg=red ctermbg=black
+highlight Fifo cterm=bold ctermfg=cyan ctermbg=none
+highlight Executable cterm=bold ctermfg=green ctermbg=black
+highlight Selected cterm=bold ctermfg=magenta ctermbg=black
+highlight CurrLine cterm=bold ctermfg=white ctermbg=30
+highlight TopLine cterm=bold ctermfg=white ctermbg=red
+highlight TopLineSel cterm=bold ctermfg=yellow ctermbg=red
+highlight StatusLine cterm=bold ctermfg=white ctermbg=red
+highlight WildMenu cterm=underline,reverse ctermfg=white ctermbg=black
+highlight CmdLine cterm=none ctermfg=white ctermbg=black
+highlight ErrorMsg cterm=none ctermfg=red ctermbg=black
+highlight Border cterm=none ctermfg=black ctermbg=red
diff --git a/.vifm/colors/dmilith-user b/.vifm/colors/dmilith-user
new file mode 100644
index 0000000..06473fc
--- /dev/null
+++ b/.vifm/colors/dmilith-user
@@ -0,0 +1,21 @@
+" vim: filetype=vifm :
+
+" Author: Daniel Dettlaff (a.k.a. dmilith)
+
+highlight Win cterm=none ctermfg=white ctermbg=black
+highlight Directory cterm=bold ctermfg=cyan ctermbg=black
+highlight Link cterm=bold ctermfg=yellow ctermbg=black
+highlight BrokenLink cterm=bold ctermfg=red ctermbg=none
+highlight Socket cterm=bold ctermfg=magenta ctermbg=black
+highlight Device cterm=bold ctermfg=red ctermbg=black
+highlight Fifo cterm=bold ctermfg=cyan ctermbg=none
+highlight Executable cterm=bold ctermfg=green ctermbg=black
+highlight Selected cterm=bold ctermfg=magenta ctermbg=black
+highlight CurrLine cterm=bold ctermfg=white ctermbg=30
+highlight TopLine cterm=bold ctermfg=white ctermbg=blue
+highlight TopLineSel cterm=bold ctermfg=yellow ctermbg=blue
+highlight StatusLine cterm=bold ctermfg=white ctermbg=blue
+highlight WildMenu cterm=underline,reverse ctermfg=white ctermbg=black
+highlight CmdLine cterm=none ctermfg=white ctermbg=black
+highlight ErrorMsg cterm=none ctermfg=red ctermbg=black
+highlight Border cterm=none ctermfg=black ctermbg=blue
diff --git a/.vifm/colors/istib-solarized-dark b/.vifm/colors/istib-solarized-dark
new file mode 100644
index 0000000..b81415f
--- /dev/null
+++ b/.vifm/colors/istib-solarized-dark
@@ -0,0 +1,25 @@
+" vim: filetype=vifm :
+
+" Author: Stéphane (a.k.a. istib)
+
+highlight Win cterm=none ctermfg=default ctermbg=none
+
+highlight TopLine cterm=none ctermfg=blue ctermbg=none
+highlight TopLineSel cterm=none ctermfg=blue ctermbg=none
+highlight StatusLine cterm=none ctermfg=blue ctermbg=none
+highlight Border cterm=none ctermfg=blue ctermbg=none
+
+highlight Selected cterm=bold ctermfg=magenta ctermbg=default
+highlight CurrLine cterm=bold ctermfg=default ctermbg=blue
+
+highlight WildMenu cterm=underline,reverse ctermfg=white ctermbg=black
+highlight CmdLine cterm=none ctermfg=white ctermbg=black
+highlight ErrorMsg cterm=none ctermfg=red ctermbg=black
+
+highlight Directory cterm=none ctermfg=cyan ctermbg=default
+highlight Link cterm=none ctermfg=yellow ctermbg=default
+highlight BrokenLink cterm=none ctermfg=red ctermbg=default
+highlight Socket cterm=none ctermfg=magenta ctermbg=default
+highlight Device cterm=none ctermfg=red ctermbg=default
+highlight Fifo cterm=none ctermfg=cyan ctermbg=default
+highlight Executable cterm=none ctermfg=green ctermbg=default
diff --git a/.vifm/colors/juef-zenburn b/.vifm/colors/juef-zenburn
new file mode 100644
index 0000000..d777c10
--- /dev/null
+++ b/.vifm/colors/juef-zenburn
@@ -0,0 +1,21 @@
+" vim: filetype=vifm :
+
+" Author: Svyatoslav Mishyn (a.k.a. juef)
+
+highlight Win cterm=none ctermfg=188 ctermbg=237
+highlight Directory cterm=none ctermfg=108 ctermbg=default
+highlight CmdLine cterm=none ctermfg=188 ctermbg=237
+highlight ErrorMsg cterm=bold ctermfg=115 ctermbg=default
+highlight TopLine cterm=none ctermfg=174 ctermbg=235
+highlight TopLineSel cterm=bold ctermfg=174 ctermbg=235
+highlight StatusLine cterm=bold ctermfg=144 ctermbg=235
+highlight Executable cterm=none ctermfg=172 ctermbg=default
+highlight Selected cterm=none ctermfg=116 ctermbg=238
+highlight Border cterm=none ctermfg=default ctermbg=235
+highlight CurrLine cterm=none ctermfg=223 ctermbg=235
+highlight WildMenu cterm=bold,reverse ctermfg=144 ctermbg=235
+highlight Link cterm=none ctermfg=142 ctermbg=default
+highlight BrokenLink cterm=none ctermfg=181 ctermbg=default
+highlight Device cterm=none ctermfg=174 ctermbg=default
+highlight Fifo cterm=none ctermfg=109 ctermbg=default
+highlight Socket cterm=none ctermfg=magenta ctermbg=default
diff --git a/.vifm/colors/reicheltd-light b/.vifm/colors/reicheltd-light
new file mode 100644
index 0000000..6d633ff
--- /dev/null
+++ b/.vifm/colors/reicheltd-light
@@ -0,0 +1,26 @@
+" vim: filetype=vifm :
+
+" Author: Daniel R. (a.k.a. reicheltd)
+
+highlight Win cterm=none ctermfg=236 ctermbg=255
+highlight Directory cterm=bold ctermfg=21 ctermbg=255
+highlight Link cterm=bold ctermfg=39 ctermbg=default
+
+highlight BrokenLink cterm=bold ctermfg=red ctermbg=default
+highlight Socket cterm=bold ctermfg=magenta ctermbg=default
+highlight Device cterm=bold ctermfg=blue ctermbg=default
+
+highlight Fifo cterm=bold ctermfg=cyan ctermbg=default
+highlight Executable cterm=bold ctermfg=red ctermbg=default
+highlight Selected cterm=bold ctermfg=200 ctermbg=default
+
+highlight CurrLine cterm=bold ctermfg=255 ctermbg=27
+highlight TopLine cterm=none ctermfg=236 ctermbg=255
+highlight TopLineSel cterm=bold ctermfg=236 ctermbg=255
+
+highlight StatusLine cterm=bold ctermfg=236 ctermbg=255
+highlight WildMenu cterm=underline,reverse ctermfg=236 ctermbg=255
+highlight CmdLine cterm=none ctermfg=236 ctermbg=255
+
+highlight ErrorMsg cterm=none ctermfg=red ctermbg=236
+highlight Border cterm=none ctermfg=236 ctermbg=255
diff --git a/.vifm/vifm-help.txt b/.vifm/vifm-help.txt
new file mode 100644
index 0000000..61b50aa
--- /dev/null
+++ b/.vifm/vifm-help.txt
@@ -0,0 +1,3099 @@
+vifm(1) Vifm vifm(1)
+
+
+
+NAME
+ vifm - vi file manager
+
+SYNOPSIS
+ vifm [OPTION]...
+ vifm [OPTION]... LWIN_DIR
+ vifm [OPTION]... LWIN_DIR RWIN_DIR
+
+DESCRIPTION
+ Vifm is a ncurses based file manager with vi like keybindings. If you
+ use vi, vifm gives you complete keyboard control over your files with‐
+ out having to learn a new set of commands.
+
+OPTIONS
+ The vifm executable will start vifm in the current directory unless it
+ is given a different directory on the command line.
+
+ <lwinpath>
+ Starts Vifm in the specified path.
+
+ <lwinpath> <rwinpath>
+ Starts Vifm in the specified paths.
+
+ Specifying two directories triggers split view even when vifm was in
+ single-view mode on finishing previous session. To suppress this be‐
+ haviour :only command can be put in the vifmrc file.
+
+ When only one path argument is found on command-line, the left/top pane
+ is automatically set as the current view.
+
+ Paths to files are also allowed in case you want vifm to start with
+ some archive opened. If you want to select file, prepend its path with
+ --select.
+
+ -f only used from the vifm.vim script. The selected files are
+ written to $VIFM/vimfiles and vifm exits.
+
+ --logging
+ Log some errors to $VIFM/log. Also /var/log/vifm-startup-log
+ (on *nix) and startup-log in the directory of executable (on
+ Windows) is used to log startup process (when configuration
+ directory isn't determined).
+
+ --remote
+ Sends the rest of command line to the active vifm server (one of
+ already running instances if any). When there is no server,
+ quits silently. There is no limit on how many arguments can be
+ processed. One can combine --remote with -c <command> or +<com‐
+ mand> to execute command in already running instance of vifm.
+ See also "Client-Server" section below.
+
+ -c <command> or +<command>
+ Run command-line mode <command> on startup. Commands in such
+ arguments are executed in the order they appear in command line.
+ Commands with spaces or special symbols must be enclosed in dou‐
+ ble or single quotes or all special symbols should be escaped
+ (the exact syntax strongly depends on shell).
+
+ --help, -h
+ Show an overview of the commandline options.
+
+ --version, -v
+ Show version information and quit.
+
+ --no-configs
+ Don't read vifmrc and vifminfo.
+
+
+ See Startup section below for the explanations on $VIFM.
+
+General keys
+ Ctrl-C or Escape
+ cancel most operations.
+
+ Ctrl-C or Escape
+ clear all selected files.
+
+ Ctrl-L clear and redraw the screen.
+
+Basic Movement
+ The basic vi key bindings are used to move through the files and popup
+ windows.
+
+ k, gk, or Ctrl-P
+ moves cursor up one line.
+
+ j, gj or Ctrl-N
+ moves cursor down one line.
+
+ h when 'lsview' is off moves up one directory, otherwise moves
+ left one file.
+
+ l when 'lsview' is off moves into a directory or launches a file,
+ otherwise moves left one file.
+
+ gg move to the top of the file list.
+
+ gh moves up one directory.
+
+ gl or Enter
+ moves into a directory or launches a file.
+
+ G move to the bottom of the file list.
+
+ H move to the first file in the window.
+
+ M move to the file in the middle of the window.
+
+ L move to the last file in the window.
+
+ Ctrl-F or Page Down
+ move forward one page.
+
+ Ctrl-B or Page Up
+ move back one page.
+
+ Ctrl-D jump back one half page.
+
+ Ctrl-U jump forward one half page.
+
+ n% move to the file that is n percent from the top of the list (for
+ example 25%).
+
+ 0 or ^ move cursor to the first column. See 'lsview' option descrip‐
+ tion.
+
+ $ move cursor to the last column. See 'lsview' option descrip‐
+ tion.
+
+ Space Bar
+ toggles between the two file lists.
+
+Movement with Count
+ Most movement commands also accept a count, 12j would move down 12
+ files.
+
+ [count]%
+ move to percent of the file list.
+
+ [count]j
+ move down count files.
+
+ [count]k
+ move up count files.
+
+ [count]G or [count]gg
+ move to list position count.
+
+Scrolling panes
+ zt redraw pane with file in top of list.
+
+ zz redraw pane with file in center of list.
+
+ zb redraw pane with file in bottom of list.
+
+ Ctrl-E scroll pane one line down.
+
+ Ctrl-Y scroll pane one line up.
+
+Pane manipulation
+ Second character can be entered with or without Control key.
+
+ Ctrl-W H
+ move the pane to the far left.
+
+ Ctrl-W J
+ move the pane to the very bottom.
+
+ Ctrl-W K
+ move the pane to the very top.
+
+ Ctrl-W L
+ move the pane to the far right.
+
+ Ctrl-W b
+ switch to bottom-right window.
+
+ Ctrl-W h
+ switch to the left pane.
+
+ Ctrl-W j
+ switch to the pane below.
+
+ Ctrl-W k
+ switch to the pane above.
+
+ Ctrl-W l
+ switch to the right pane.
+
+ Ctrl-W o
+ shortcut for :only
+
+ Ctrl-W p
+ switch to previous window.
+
+ Ctrl-W s
+ shortcut for :split
+
+ Ctrl-W t
+ switch to top-left window.
+
+ Ctrl-W v
+ shortcut for :vsplit
+
+ Ctrl-W w
+ switch to other pane.
+
+ Ctrl-W x
+ exchange panes.
+
+ [count1]Ctrl-W[count2]+
+ increase size of the view by count1*count2.
+
+ [count1]Ctrl-W[count2]-
+ decrease size of the view by count1*count2..
+
+ [count1]Ctrl-W[count2]<
+ increase size of the view by count1*count2..
+
+ [count1]Ctrl-W[count2]>
+ decrease size of the view by count1*count2..
+
+ Ctrl-W |
+ maximize current view.
+
+ Ctrl-W _
+ maximize current view.
+
+ Ctrl-W =
+ make size of two views equal.
+
+Marks
+ Marks are set the same way as they are in vi.
+
+ You can use this characters for marks [a-z][A-Z][0-9].
+
+ m[a-z][A-Z][0-9]
+ to set a mark for the current file.
+
+ '[a-z][A-Z][0-9]
+ moves to the file set for the mark.
+
+Searching
+ /regular expression pattern[Return]
+ will highlight all files matching the pattern and go to the next
+ match.
+
+ ?regular expression pattern[Return]
+ will highlight all files matching the pattern and go to the pre‐
+ vious match.
+
+ [count]n
+ find the next match of / or ?.
+
+ [count]N
+ find the previous match of / or ?.
+
+ If 'hlsearch' option is set, hitting n/N to perform search and go to
+ the first matching item resets current selection in normal mode. It is
+ not the case if search was already performed on files in the directory,
+ thus selection is not reset after clearing selection with escape key
+ and hitting n/N key again.
+
+ [count]f[character]
+ search forward for file with [character] as first character in
+ name. Search wraps around the end of the list.
+
+ [count]F[character]
+ search backward for file with [character] as first character in
+ name. Search wraps around the end of the list.
+
+ [count];
+ find the next match of f or F.
+
+ [count],
+ find the previous match of f or F.
+
+ Note: f, F, ; and , wrap around list beginning and end when they are
+ used alone and they don't wrap when they are used as selectors.
+
+File Filters
+ There are three basic file filters:
+
+ - dot files filter (excluding "." and ".." special directories, which
+ appearance is controlled by the 'dotdirs' option)
+
+ - manual filter for file names
+
+ - automatic filter for file names
+
+ - local filter for file names (see description of the "=" normal mode
+ command)
+
+ Performing operations on manual filter for file names automatically
+ does the same on automatic one. The file name filter is separated
+ mainly for convenience purpose and to get more deterministic behaviour.
+
+ The basic vim folding key bindings are used for filtering files.
+
+ Each file list has its own copy of each filter.
+
+ Filtered files are not checked in / search or :commands.
+
+ Files and directories are filtered separately. For this a slash is
+ appended to a directory name before testing whether it matches the fil‐
+ ter. Examples:
+
+ " filter directories which names end with '.files'
+ :filter /^.*\.files\/$/
+
+ " filter files which names end with '.d'
+ :filter /^.*\.d$/
+
+ " filter files and directories which names end with '.o'
+ :filter /^.*\.o\/?$/
+
+ zo Show all of the dot files.
+
+ zf Filter all of the selected files.
+
+ za Toggle the showing and hiding of dot files.
+
+ zm Filter all of the dot files.
+
+ zO Show the files filtered out by filename filter.
+
+ zM Filter the files matching the filename filter.
+
+ zR Remove all filters.
+
+ =regular expression pattern[Return]
+ filter out files that don't match regular expression. This kind
+ of filter is automatically reset when directory is changed.
+
+Other Normal Mode Keys
+ [count]:
+ enter command line mode. Count will add range.
+
+ q: open external editor to prompt for command-line command. See
+ "Command line editing" section for details.
+
+ q/ open external editor to prompt for search pattern to be searched
+ in forward direction. See "Command line editing" section for
+ details.
+
+ q? open external editor to prompt for search pattern to be searched
+ in backward direction. See "Command line editing" section for
+ details.
+
+ q= open external editor to prompt for filter pattern. See "Command
+ line editing" section for details. Unlike other q{x} commands
+ this one doesn't work in Visual mode.
+
+ [count]!! and [count]!<selector>
+ enter command line mode with entered ! command. Count will mod‐
+ ify range.
+
+ Ctrl-O go backward through history.
+
+ Ctrl-I if 'cpoptions' contains "t" flag, <tab> and <c-i> switch active
+ pane just like <space> does, otherwise it goes forward through
+ directory history of the current view.
+
+ Ctrl-G creates a window showing detailed information about the current
+ file.
+
+ Shift-Tab
+ enters view mode (works only after activating view pane with
+ :view command).
+
+ ga calculate directory size.
+
+ gA like ga, but force update.
+
+ gf find link destination (like l with 'followlinks' off, but also
+ finds directories).
+
+ gr only for MS-Windows
+ same as l key, but tries to run program with administrative
+ privileges.
+
+ gv go to visual mode restoring last selection.
+
+ gs restore last t selection, like gv for visual mode selection.
+
+ gu<selector>
+ make names of selected files lowercase.
+
+ [count]guu and [count]gugu
+ make names of [count] files starting from the current one lower‐
+ case. Without [count] only current file is affected.
+
+ gU<selector>
+ make names of selected files uppercase.
+
+ [count]gUU and [count]gUgU
+ make names of [count] files starting from the current one upper‐
+ case. Without [count] only current file is affected.
+
+ e explore file in the current pane.
+
+ i opens file with associated program even if it's an executable.
+
+ cw rename a file or files.
+
+ cW change only name of file (without extension).
+
+ cl change link target.
+
+ co only for *nix
+ change file owner.
+
+ cg only for *nix
+ change file group.
+
+ cp change file attributes (permission on *nix and properties on
+ Windows).
+
+ [count]C
+ clone file [count] times.
+
+ [count]dd or d[count]selector
+ moves the selected files to trash directory (if 'trash' option
+ is set, otherwise delete). See "Trash directory" section below.
+
+ [count]DD or D[count]selector
+ removes the selected files.
+
+ Y, [count]yy or y[count]selector
+ yanks the selected files.
+
+ Y same as yy.
+
+ p will copy the yanked files to the current directory or move the
+ files to the current directory if they were deleted with dd or
+ :d[elete] or if the files were yanked from trash directory. See
+ "Trash directory" section below.
+
+ P moves the last yanked files. The advantage of using P instead
+ of d followed by p is that P moves files only once. This isn't
+ important in case you're moving files in the same file system
+ where your home directory is, but using P to move files on some
+ other file system (or file systems, in case you want to move
+ files from fs1 to fs2 and your home is on fs3) can save your
+ time.
+
+ al puts symbolic links with absolute paths.
+
+ rl puts symbolic links with relative paths.
+
+ t select or unselect (tag) the current file.
+
+ u undo last change.
+
+ Ctrl-R redo last change.
+
+ v enter visual mode.
+
+ V enter visual mode.
+
+ [count]Ctrl-A
+ increment first number in file name by count (1 by default).
+
+ [count]Ctrl-X
+ decrement first number in file name by count (1 by default).
+
+ ZQ same as :quit!
+
+ ZZ same as :quit
+
+ . repeat last command line command (not normal mode command) of
+ this session (does nothing right after startup or :restart com‐
+ mand). The command doesn't depend on command-line history and
+ can be used with completely disabled history.
+
+ ( goto previous group. Groups are defined by primary sorting key.
+ For name and iname members of each group have same first letter,
+ for all other sorting keys vifm uses size, uid, ...
+
+ ) goto next group. See ( key description above.
+
+Using Count
+ You can use count with commands like yy.
+
+ [count]yy
+ yank count files starting from current cursor position downward.
+
+ Or you can use count with motions passed to y, d or D.
+
+ d[count]j
+ delete (count + 1) files starting from current cursor position
+ upward.
+
+Registers
+ vifm supports multiple registers for temporary storing list of yanked
+ or deleted files.
+
+ Registers should be specified with hitting double quite key followed by
+ a register name. Count is specified after register name. By default
+ commands use unnamed register, which has double quote as its name.
+
+ Though all commands accept registers, most of commands ignores them
+ (for example H or Ctrl-U). Other commands can fill register or append
+ new files to it.
+
+ Presently vifm supports ", _, a-z and A-Z characters as register names.
+
+ As mentioned above " is unnamed register and has special meaning of the
+ default register. Every time when you use named registers (a-z and A-
+ Z) unnamed register is updated to contain same list of files as the
+ last used register.
+
+ _ is black hole register. It can be used for writing, but its list is
+ always empty.
+
+ Registers with names from a to z and from A to Z are named ones. Low‐
+ ercase registers are cleared before adding new files, while uppercase
+ aren't and should be used to append new files to the existing file list
+ of appropriate lowercase register (A for a, B for b, ...).
+
+ Registers can be changed on :empty command if they contain files under
+ trash directory (see "Trash directory" section below).
+
+ Registers do not contain one file more than once.
+
+ Example:
+
+ "a2yy
+
+ will put names of two files to register a (and to the unnamed regis‐
+ ter),
+
+ "Ad
+
+ will remove one file and append its name to register a (and to the
+ unnamed register),
+
+ p or "ap or "Ap
+
+ will insert previously yanked and deleted files into current directory.
+
+Selectors
+ y, d, D, !, gu and gU commands accept selectors. You can combine them
+ with any of selectors below to quickly remove or yank several files.
+
+ Most of selectors are like vi motions: j, k, gg, G, H, L, M, %, f, F,
+ ;, comma, ', ^, 0 and $. But there are some additional ones.
+
+ a all files in current view.
+
+ s selected files.
+
+ S all files except selected.
+
+ Examples:
+ dj - delete file under cursor and one below.
+ d2j - delete file under cursor and two below.
+ y6gg - yank all files from cursor position to 6th file in the list.
+
+ When you pass a count to whole command and its selector they are multi‐
+ plied. So:
+ 2d2j - delete file under cursor and four below.
+ 2dj - delete file under cursor and two below.
+ 2y6gg - yank all files from cursor position to 12th file in the list.
+
+Visual Mode
+ In visual mode work almost all normal mode keys, but they do not accept
+ selectors.
+
+ Enter save selection and go back to normal mode.
+
+ gv restore previous visual selection.
+
+ v leave visual mode.
+
+ V leave visual mode.
+
+ : enter command line mode. When you leave it selection will be
+ cleared.
+
+ o switch active selection bound.
+
+ O switch active selection bound.
+
+ gu, u make names of selected files lowercase.
+
+ gU, U make names of selected files uppercase.
+
+View Mode
+ This mode tries to imitate the less program. List of builtin shortcuts
+ can be found below. Shortcuts can be customized using :qmap, :qnoremap
+ and :qunmap command-line commands.
+
+ Shift-Tab, Tab, q, Q, ZZ
+ go back to normal mode.
+
+ [count]e, [count]Ctrl-E, [count]j, [count]Ctrl-N, [count]Enter
+ forward one line (or [count] lines).
+
+ [count]y, [count]Ctrl-Y, [count]k, [count]Ctrl-K, [count]Ctrl-P
+ backward one line (or [count] lines).
+
+ [count]f, [count]Ctrl-F, [count]Ctrl-V, [count]Space Bar
+ forward one window (or [count] lines).
+
+ [count]b, [count]Ctrl-B, [count]Alt-V
+ backward one window (or [count] lines).
+
+ [count]z
+ forward one window (and set window to [count]).
+
+ [count]w
+ backward one window (and set window to [count]).
+
+ [count]Alt-Space
+ forward one window, but don't stop at end-of-file.
+
+ [count]d, [count]Ctrl-D
+ forward one half-window (and set half-window to [count]).
+
+ [count]u, [count]Ctrl-U
+ backward one half-window (and set half-window to [count]).
+
+ r, Ctrl-R, Ctrl-L
+ repaint screen.
+
+ R reload view preserving scroll position.
+
+ [count]/pattern
+ search forward for ([count]‐th) matching line.
+
+ [count]?pattern
+ search backward for ([count]‐th) matching line.
+
+ [count]n
+ repeat previous search (for [count]‐th occurrence).
+
+ [count]N
+ repeat previous search in reverse direction.
+
+ [count]g, [count]<, [count]Alt-<
+ go to first line in file (or line [count]).
+
+ [count]G, [count]>, [count]Alt->
+ go to last line in file (or line [count]).
+
+ [count]p, [count]%
+ go to beginning of file (or N percent into file).
+
+ v edit the current file with vim.
+
+
+ Ctrl-W H
+ move the pane to the far left.
+
+ Ctrl-W J
+ move the pane to the very bottom.
+
+ Ctrl-W K
+ move the pane to the very top.
+
+ Ctrl-W L
+ move the pane to the far right.
+
+
+ Ctrl-W h
+ switch to left pane.
+
+ Ctrl-W j
+ switch to pane below.
+
+ Ctrl-W k
+ switch to pane above.
+
+ Ctrl-W l
+ switch to right pane.
+
+
+ Ctrl-W b
+ switch to bottom-right window.
+
+ Ctrl-W t
+ switch to top-left window.
+
+
+ Ctrl-W p
+ switch to previous window.
+
+ Ctrl-W w
+ switch to other pane.
+
+
+ Ctrl-W o
+ leave only one pane.
+
+ Ctrl-W s
+ split window horizontally.
+
+ Ctrl-W v
+ split window vertically.
+
+
+ Ctrl-W x
+ exchange panes.
+
+
+ Ctrl-W +
+ increase size of the view.
+
+ Ctrl-W -
+ decrease size of the view.
+
+ Ctrl-W <
+ increase size of the view.
+
+ Ctrl-W >
+ decrease size of the view.
+
+ Ctrl-W |
+ maximize current view.
+
+ Ctrl-W _
+ maximize current view.
+
+ Ctrl-W =
+ make size of two views equal.
+
+
+ In general, all "Ctrl-W x" keys above work the same was as in Normal
+ mode. Active mode is automatically changed on navigating among win‐
+ dows. When less-like mode activated on file preview is left using one
+ by "Ctrl-W x" keys, its state is stored until another file is showed
+ using preview (it's possible to leave the mode, hide preview pane, do
+ something else, then get back to the file and show preview pane again
+ with previously stored state in it).
+
+Command line Mode
+ This keys apply to all submodes of the command line mode: command,
+ prompt and search.
+
+ Down, Up, Left, Right, Home, End and Delete are extended keys and they
+ are not available if vifm is compiled with --disable-extended-keys
+ option.
+
+ Esc, Ctrl-C
+ leave command line mode, cancels input. Cancelled input is
+ saved into appropriate history and can be recalled later.
+
+ Ctrl-M, Enter
+ execute command and leave command line mode.
+
+ Ctrl-I, Tab
+ complete command or its argument.
+
+ Shift-Tab
+ complete in reverse order.
+
+ Ctrl-_ stop completion and return original input.
+
+ Ctrl-K remove characters from cursor position till the end of line.
+
+ Ctrl-U remove characters from cursor position till the beginning of
+ line.
+
+ Ctrl-H, Backspace
+ remove character before the cursor.
+
+ Ctrl-D, Delete
+ remove character under the cursor.
+
+ Ctrl-B, Left
+ move cursor to the left.
+
+ Ctrl-F, Right
+ move cursor to the right.
+
+ Ctrl-A, Home
+ go to line beginning.
+
+ Ctrl-E, End
+ go to line end
+
+ Alt-B go to the beginning of previous word.
+
+ Alt-F go to the end of next word.
+
+ Ctrl-W remove characters from cursor position till the beginning of
+ previous word.
+
+ Alt-D remove characters from cursor position till the beginning of
+ next word.
+
+ Ctrl-T swap the order of current and previous character and move cursor
+ forward or, if cursor past the end of line, swap the order of
+ two last characters in the line.
+
+ Alt-. insert last part of previous command to current cursor position.
+ Each next call will insert last part of older command.
+
+ Ctrl-G edit command-line content in external editor. See "Command line
+ editing" section for details.
+
+ Ctrl-N recall more recent command-line from history.
+
+ Ctrl-P recall older command-line from history.
+
+ Up recall more recent command-line from history, that begins as the
+ current command-line.
+
+ Down recall older command-line from history, that begins as the cur‐
+ rent command-line.
+
+Command line editing
+ vifm provides a facility to edit several kinds of data, that is usually
+ edited in command-line mode, in external editor (using command speci‐
+ fied by ´vicmd' or 'vixcmd' option). This has at least two advantages
+ over built-in command-line mode:
+ - one can use full power of Vim to edit text;
+ - finding and reusing history entries becomes possible.
+
+ The facility is supported by four input submodes of the command-line:
+ - command;
+ - forward search;
+ - backward search;
+ - file rename (see description of cw and cW normal mode keys).
+
+ Editing command-line using external editor is activated by the c_CTRL-G
+ shortcut. It's also possible to do almost the same from Normal and
+ Visual modes using q:, q/ and q? commands.
+
+ Temporary file created for the purpose of editing the line has the fol‐
+ lowing structure:
+
+ 1. First line, which is either empty or contains text already entered
+ in command-line.
+
+ 2. 2nd and all other lines with history items starting with the most
+ recent one. Altering this lines in any way won't change history
+ items stored by vifm.
+
+ After editing application is finished the first line of the file is
+ taken as the result of operation, when the application returns zero
+ exit code. If the application returns an error (see :cquit command in
+ Vim), all the edits made to the file are ignored, but the initial value
+ of the first line is saved in appropriate history.
+
+Commands
+ Commands are executed with :command_name<Return>
+
+ Commented out lines should start with the double quote symbol, which
+ may be preceded by whitespace characters.
+
+ ´|' can be used to separate commands, so you can give multiple commands
+ in one line. If you want to use '|' in an argument, precede it with
+ '\'.
+
+ These commands see '|' as part of their arguments even when it's
+ escaped:
+
+ :[range]!
+ :cmap
+ :cnoremap
+ :command
+ :filetype
+ :fileviewer
+ :filextype
+ :map
+ :mmap
+ :mnoremap
+ :nmap
+ :nnoremap
+ :noremap
+ :normal
+ :qmap
+ :qnoremap
+ :vmap
+ :vnoremap
+ :windo
+ :winrun
+
+ To be able to use another command after one of these, wrap it with the
+ :execute command. An example:
+ if filetype('.') == 'reg' | execute '!!echo regular file' | endif
+
+ :[count]
+
+ :number
+ move to the file number.
+ :12 would move to the 12th file in the list.
+ :0 move to the top of the list.
+ :$ move to the bottom of the list.
+
+ :[count]command
+ The only builtin :[count]command are :[count]d[elete] and
+ :[count]y[ank].
+
+ :d3 would delete three files starting at the current file position
+ moving down.
+
+ :3d would delete one file at the third line in the list.
+
+ :command [args]
+
+ :[range]!program
+ will execute the program in a shell
+
+ :[range]!command &
+
+ will run the process in the background using vifm's means.
+
+ Programs that write to stdout like ls will create an error message
+ showing partial output of the command.
+
+ Take note of the space before ampersand symbol, if you omit it, command
+ will be run in the background using job control of your shell.
+
+ Accepts macros.
+
+ :[range]!! <program>
+ is the same as :! but will pause the screen before returning to
+ Vifm.
+
+ :!! will execute the last command.
+
+ :[range]alink[!?]
+ creates absolute symbolic links of files in directory of other
+ view. With "?" vifm will open vi to edit filenames. "!"
+ forces overwrite.
+
+ :[range]alink[!] path
+ creates absolute symbolic links of files in directory specified
+ with the path (absolute or relative to directory of other view).
+ "!" forces overwrite.
+
+ :[range]alink[!] name1 name2...
+ creates absolute symbolic links of files in directory of other
+ view giving each next link a corresponding name from the argu‐
+ ment list. "!" forces overwrite.
+
+ :apropos manpage
+ will create a menu of items returned by the apropos command.
+ Selecting an item in the menu will open the corresponding man‐
+ page. By default the command relies on the external "apropos"
+ utility, which can be customized by altering value of the 'apro‐
+ posprg' option.
+
+ :apropos
+ repeats last :apropos command.
+
+ :cd or :cd ~ or :cd $HOME
+ change to your home directory.
+
+ :cd - go to previous directory.
+
+ :cd ~/dir
+ change directory to ~/dir.
+
+ :cd /curr/dir /other/dir
+ change directory of the current pane to /curr/dir and directory
+ of the other pane to /other/dir. When using relative paths vifm
+ assumes that both of them are relative to current directory of
+ current view. Command will not fail if one of directories is
+ invalid. Accepts macros.
+
+ :cd! /dir
+ same as :cd /dir /dir.
+
+ :c[hange]
+ create a menu window to alter a files properties.
+
+ :[range]chmod
+ shows file attributes (permission on *nix and properties on Win‐
+ dows) change dialog.
+
+ :[range]chmod[!] arg...
+ only for *nix
+ changes permissions for files. See 'man chmod' for arg format.
+ "!" means set permissions recursively.
+
+ :[range]chown
+ only for *nix
+ same as co key in normal mode.
+
+ :[range]chown [user][:][group]
+ only for *nix
+ changes owner and/or group of files. Operates on directories
+ recursively.
+
+ :[range]clone[!?]
+ clones files in current directory. With "?" vifm will open vi
+ to edit filenames. "!" forces overwrite. Macros are expanded.
+
+ :[range]clone[!] path
+ clones files to directory specified with the path (absolute or
+ relative to current directory). "!" forces overwrite. Macros
+ are expanded.
+
+ :[range]clone[!] name1 name2...
+ clones files in current directory giving each next clone a cor‐
+ responding name from the argument list. "!" forces overwrite.
+ Macros are expanded.
+
+ :colo[rscheme]?
+ prints current color scheme name in the status bar.
+
+ :colo[rscheme]
+ gives a menu with a list of available color schemes. You can
+ choose default color scheme here. It will be used for view if
+ no DIRECTORY in colorscheme file fits current path. It's also
+ used to set border color (except view titles) and colors in the
+ menus and dialogs.
+
+ :colo[rscheme] color_scheme_name
+ changes default color scheme to color_scheme_name.
+
+ :colo[rscheme] color_scheme_name directory
+ associates directory with the color scheme. The directory argu‐
+ ment can be both absolute or relative path when :colorscheme
+ command is executed from command line, but mandatory should be
+ an absolute path when the command is executed in scripts loaded
+ at startup (until vifm is completely loaded).
+
+ :comc[lear]
+ removes all user defined commands.
+
+ :com[mand]
+ gives a menu of user commands.
+
+ :com[mand] beginning
+ shows user defined commands that start with the beginning.
+
+ :com[mand] name action
+ sets a new user command.
+ Trying to use a reserved command name will result in an error
+ message.
+ Use :com[mand]! to overwrite a previously set command.
+ Unlike vim user commands do not have to start with a capital
+ letter. User commands are run in a shell by default. To run a
+ command in the background you must set it as a background com‐
+ mand with & at the end of the commands action (:com rm rm %f &).
+ Command name cannot contain numbers or special symbols (except
+ '?' and '!').
+
+ :com[mand] name /pattern
+ will set search pattern.
+
+ :com[mand] name filter pattern
+ will set file name filter.
+
+ :com[mand] cmd :commands
+ will set kind of alias for internal command (like in a shell).
+ Will pass range given to alias to an aliased command, so running
+ :%cp after
+ :command cp :copy %a
+ equals
+ :%copy
+
+ :[range]co[py][!?][ &]
+ copies files to directory of other view. With "?" vifm will
+ open vi to edit filenames. "!" forces overwrite.
+
+ :[range]co[py][!] path[ &]
+ copies files to directory specified with the path (absolute or
+ relative to directory of other view). "!" forces overwrite.
+
+ :[range]co[py][!] name1 name2...[ &]
+ copies files to directory of other view giving each next file a
+ corresponding name from the argument list. "!" forces over‐
+ write.
+
+ :[range]d[elete][!][ &]
+ delete selected file or files. "!" means completely remove
+ file.
+
+ :[range]d[elete][!] [reg] [count][ &]
+ will delete files to the reg register. "!" means completely
+ remove file.
+
+ :delc[ommand] command_name
+ will remove the command_name user command.
+
+ :delm[arks]!
+ will delete all marks.
+
+ :delm[arks] marks ...
+ will delete specified marks, each argument is treated as a set
+ of marks.
+
+ :di[splay]
+ popup menu with registers content.
+
+ :di[splay] list ...
+ display the contents of the numbered and named registers that
+ are mentioned in list (for example "az to display "", "a and "z
+ content).
+
+ :dirs display directory stack.
+
+ :ec[ho] [<expr>...]
+ evaluates each argument as an expression and outputs them sepa‐
+ rated by a space. See help on :let command for a definition of
+ <expr>.
+
+ :[range]e[dit] [file...]
+ will load the selected or passed file or files into vi. Accepts
+ macros.
+
+ :el[se]
+ executes commands until next matching :endif if they previously
+ were not being executed. See also help on :if and :endif com‐
+ mands.
+
+ :empty will permanently remove 'rm -fr' files from trash directory. It
+ will also remove all operations from undolist that have no sense
+ after :empty and remove all records about files in trash direc‐
+ tory from all registers. See "Trash directory" section below.
+
+ :en[dif]
+ ends conditional block. See also help on :if and :else com‐
+ mands.
+
+ :exe[cute] [<expr>...]
+ evaluates each argument as an expression and joins results sepa‐
+ rated by a space to get a single string, which is then executed
+ as a command-line command. See help on :let command for a defi‐
+ nition of <expr>.
+
+ :exi[t][!]
+ same as :quit.
+
+ :f[ile]
+ popup menu of programs set for the file type of the current
+ file. Add ' &' at the end of command to run program in back‐
+ ground.
+
+ :f[ile] arg
+ run associated command that begins with the arg without opening
+ menu.
+
+ :filet[ype] pat1,pat2,... [{descr}]def_prog[ &],[{descr}]prog2[ &],...
+ will associate given program list to each of the patterns.
+ Associated program (command) is used by handlers of l and Enter
+ keys (and also in the :file menu). If you need to insert comma
+ into command just double it (",,"). Space followed by an amper‐
+ sand as two last characters of a command means running of the
+ command in the background. Optional description can be given to
+ each command to ease understanding of what command will do in
+ the :file menu. Vifm will try the rest of the programs for an
+ association when the default isn't found. When program entry
+ doesn't contain any of vifm macros, name of current file is
+ appended as if program entry ended with %c macro. On Windows
+ path to executables containing spaces can (and should be for
+ correct work with such paths) be double quoted. See "Globs"
+ section below for pattern definition. See also "Automatic FUSE
+ mounts" section below. Example for zip archives and several
+ actions:
+
+ filetype *.zip,*.jar,*.war,*.ear
+ \ {Mount with fuse-zip}
+ \ FUSE_MOUNT|fuse-zip %SOURCE_FILE %DESTINATION_DIR,
+ \ {View contents}
+ \ zip -sf %c | less,
+ \ {Extract here}
+ \ tar -xf %c,
+
+ :filex[type] pat1,pat2,... [{ description }] def_program,program2,...
+ same as :filetype, but vifm will ignore this command if it's not running in X.
+ In X :filextype is equal to :filetype. See "Globs" section below for pattern
+ definition. See also "Automatic FUSE mounts" section below.
+
+ :filev[iewer] pat1,pat2,... command
+ will associate given command as a viewer to each of the patterns. Viewer is a
+ command which output is captured and showed in the second pane of vifm after
+ running :view command. When the command doesn't contain any of vifm macros,
+ name of current file is appended as if command ended with %c macro. See
+ "Globs" section below for pattern definition. Example for zip archives:
+
+ fileviewer *.zip,*.jar,*.war,*.ear zip -sf %c
+
+ :filter[!] regular_expression_pattern
+ :filter[!] /regular_expression_pattern/
+ will filter all the files out of the directory listing that match the regular
+ expression. Using second variant you can use the bar ('|') symbol without
+ escaping. Empty regular expression (specified by //, "" or '') means using of
+ the last search pattern. Use '!' to control state of filter inversion after
+ updating filter value (also see 'cpoptions' description). Filter is matched
+ case sensitively on *nix and case insensitively on Windows.
+ :filter /.o$ would filter all files ending in .o from the filelist.
+ Note: vifm uses extended regular expressions.
+
+ :filter
+ reset filter (set it to empty string) and show all files.
+
+ :filter!
+ same as :invert.
+
+ :filter?
+ show current value of name and auto filters.
+
+ :[range]fin[d] pattern
+ will show results of find command in the menu. Searches among selected files if
+ any. Accepts macros. By default the command relies on the external "find"
+ utility, which can be customized by altering value of the 'findprg' option.
+
+ :[range]fin[d] -opt...
+ same as :find above, but user defines all find arguments. Searches among
+ selected files if any.
+
+ :[range]fin[d] path -opt...
+ same as :find above, but user defines all find arguments. Ignores selection and
+ range.
+
+ :[range]fin[d]
+ repeats last :find command.
+
+ :fini[sh]
+ Stop sourcing a script. Can only be used in a vifm script file. This is a quick
+ way to skip the rest of the file.
+
+ :[range]gr[ep][!] pattern
+ will show results of grep command in the menu. Add "!" to request inversion of
+ search (look for lines that do not match pattern). Searches among selected
+ files if any and no range given. Ignores binary files by default. By default
+ the command relies on the external "grep" utility, which can be customized by
+ altering value of the 'grepprg' option.
+
+ :[range]gr[ep][!] -opt...
+ same as :grep above, but user defines all find arguments, which are not escaped.
+ Searches among selected files if any.
+
+ :[range]gr[ep][!]
+ repeats last :grep command. "!" of this command inverts "!" in repeated
+ command.
+
+ :h[elp]
+ show the help file.
+
+ :h[elp] argument
+ is the same as using ':h argument' in vim. Use vifm-<something> to get help
+ on vifm (tab completion works). This form of the command doesn't work when
+ ´vimhelp' option is off.
+
+ :hi[ghlight]
+ will show information about all highlight groups in the current directory.
+
+ :hi[ghlight] group-name
+ will show information on given highlight group of the default color scheme.
+
+ :hi[ghlight] group-name cterm=style | ctermfg=color | ctermbg=color
+ sets style (cterm), foreground (ctermfg) or/and background (ctermbg) parameters
+ of highlight groups of the current default color scheme.
+
+ Available style values (some of them can be combined):
+ - bold
+ - underline
+ - reverse or inverse
+ - standout
+ - none
+
+ Available group-name values:
+ - Win - color of all windows (views, dialogs, menus)
+ - Border - color of vertical parts of the border
+ - TopLineSel - top line color of the current pane
+ - TopLine - top line color of the other pane
+ - CmdLine - the command line/status bar color
+ - ErrorMsg - color of error messages in the status bar
+ - StatusLine - color of the line above the status bar
+ - WildMenu - color of the wild menu items
+ - CurrLine - line at cursor position in the view
+ - Selected - color of selected files
+ - Directory - color of directories
+ - Link - color of symbolic links in the views
+ - BrokenLink - color of broken symbolic links
+ - Socket - color of sockets
+ - Device - color of block and character devices
+ - Executable - color of executable files
+ - Fifo - color of fifo pipes
+
+ Available colors:
+ - -1 or default or none - default or transparent
+ - black
+ - red
+ - green
+ - yellow
+ - blue
+ - magenta
+ - cyan
+ - white
+
+ Light versions of colors are regular colors with bold attribute set. So order
+ of arguments of :highlight command is important and it's better to put "cterm"
+ in front of others to prevent it from overwriting attributes set by "ctermfg" or
+ "ctermbg" arguments.
+
+ Since there are two colors and only one bold attribute it affects both colors
+ when "reverse" attribute is used when running vifm in terminal emulator. While
+ linux native console can handle boldness of foreground and background colors
+ independently, which is for consistency with terminal emulators accessible from
+ vifm only implicitly by using light versions of colors.
+
+ Here is the hierarchy of highlight groups, which you need to know for using
+ transparency:
+ StatusLine
+ WildMenu
+ Border
+ CmdLine
+ ErrorMsg
+ Win
+ Directory
+ Link
+ BrokenLink
+ Socket
+ Device
+ Fifo
+ Executable
+ Selected
+ CurrLine
+ TopLine
+ TopLineSel
+
+ "none" means default terminal color for highlight groups at the first level of
+ the hierarchy and transparency for all others.
+
+ :his[tory]
+ creates a popup menu of directories visited.
+
+ :his[tory] x
+ x can be:
+ d[ir] or . show directory history.
+ c[md] or : show command line history.
+ s[earch] or / show search history and search forward on l key.
+ f[search] or / show search history and search forward on l key.
+ b[search] or ? show search history and search backward on l key.
+ i[nput] or @ show prompt history (e.g. on one file renaming).
+ fi[lter] or = show filter history (see description of the "=" normal mode command).
+
+ :if {expr1}
+ starts conditional block. Commands are executed until next matching :else of
+ :endif command if {expr1} evaluates to non-zero, otherwise they are ignored.
+ See also help on :else and :endif commands.
+
+ :invert [f]
+ invert file name filter.
+
+ :invert? [f]
+ show current filter state.
+
+ :invert s
+ invert selection.
+
+ :invert o
+ invert sorting order of the primary sorting key.
+
+ :invert? o
+ show sorting order of the primary sorting key.
+
+ :jobs shows menu of current backgrounded processes.
+
+ :let $ENV_VAR = <expr>
+ sets environment variable. Warning: setting environment variable to an empty
+ string on Windows removes it.
+
+ :let $ENV_VAR .= <expr>
+ append value to environment variable.
+
+ Where <expr> could be a single-quoted string, double-quoted string, an environment variable, function call or a concatanation of any of them in any order using the '.' operator. Any whitespace is ignored.
+
+ :locate filename
+ uses the locate command to create a menu of filenames
+ Selecting a file from the menu will reload the current file list in vifm
+ to show the selected file. By default the command relies on the external
+ "locate" utility (it's assumed that its database is already built), which can be
+ customized by altering value of the 'locateprg' option.
+
+ :locate
+ repeats last :locate command.
+
+ :[range]ma[rk][?] x [/full/path] [filename]
+ Set mark x (a-zA-Z0-9) at /full/path and filename. By default current directory
+ is being used. If no filename was given and /full/path is current directory
+ then last file in [range] is used. Using of macros is allowed. Question mark
+ will stop command from overwriting existing marks.
+
+ :marks create a popup menu of bookmarks.
+
+ :marks list ...
+ display the contents of the marks that are mentioned in list.
+
+ :mes[sages]
+ shows previously given messages (up to 50).
+
+ :mkdir[!] dir ...
+ creates directories with given names. "!" means make parent directories as
+ needed. Macros are expanded.
+
+ :[range]m[ove][!?][ &]
+ moves files to directory of other view. With "?" vifm will open vi to edit
+ filenames. "!" forces overwrite.
+
+ :[range]m[ove][!] path[ &]
+ moves files to directory specified with the path (absolute or relative to
+ directory of other view). "!" forces overwrite.
+
+ :[range]m[ove][!] name1 name2...[ &]
+ moves files to directory of other view giving each next file a corresponding
+ name from the argument list. "!" forces overwrite.
+
+ :noh[lsearch]
+ clear selection in current pane.
+
+ :norm[al][!] commands
+ executes normal mode commands. If "!" is used, mappings will not be used. If
+ the last command is unfinished it will be aborted as if <esc> or <c-c> was
+ typed. A ":" should be completed as well. Commands can't start with a space,
+ so put a count of 1 (one) before it.
+
+ :on[ly]
+ changes the window to show only the current file directory.
+
+ :popd remove pane directories from stack.
+
+ :pushd[!] /curr/dir [/other/dir]
+ add pane directories to stack and process arguments like :cd command.
+
+ :pushd exchanges the top two items of the directory stack.
+
+ :pw[d] show the present working directory.
+
+ :q[uit][!]
+ will exit vifm (add ! if you don't want to save changes or check if there are
+ any of backgrounded commands still running).
+
+ :[range]y[ank] [reg] [count]
+ will yank files to the reg register.
+
+ :ls lists windows of active terminal multiplexer (only when terminal multiplexer is
+ used). This is achieved by issuing proper command for active terminal
+ multiplexer, thus the list is not handled by vifm.
+
+ :reg[isters]
+ popup menu with registers content.
+
+ :reg[isters] list ...
+ display the contents of the numbered and named registers that are mentioned in
+ list (for example "az to display "", "a and "z content).
+
+ :[range]rename[!]
+ rename files using vi to edit names. ! means go recursively through directories.
+
+ :[range]rename name1 name2...
+ rename each of selected files to a corresponding name.
+
+ :restart
+ will free a lot of things (histories, commands, etc.), reread vifminfo and
+ vifmrc files and run startup commands passed in the argument list, thus losing
+ all unsaved changes (e.g. recent history or keys mapped in current session).
+
+ :[range]restore
+ will restore file from trash directory, doesn't work in any other directory.
+ See "Trash directory" section below.
+
+ :[range]rlink[!?]
+ creates relative symbolic links of files in directory of other view. With "?"
+ vifm will open vi to edit filenames. "!" forces overwrite.
+
+ :[range]rlink[!] path
+ creates relative symbolic links of files in directory specified with the path
+ (absolute or relative to directory of other view). "!" forces overwrite.
+
+ :[range]rlink[!] name1 name2...
+ creates relative symbolic links of files in directory of other view giving each
+ next link a corresponding name from the argument list. "!" forces overwrite.
+
+ :screen
+ toggles whether to use the terminal multiplexer or not.
+ A terminal multiplexer uses pseudo terminals to allow multiple windows to be
+ used in the console or in a single xterm. Starting vifm from terminal
+ multiplexer with appropriate support turned on will cause vifm to open a new
+ terminal multiplexer window for each new file edited or program launched from
+ vifm.
+ This requires screen version 3.9.9 or newer for the screen -X argument or tmux
+ (version or newer 1.8 is recommented).
+
+ :screen?
+ shows whether integration with terminal multiplexers is enabled.
+
+ Note: the command is called screen for historical reasons (when tmux wasn't yet
+ supported) and might be changed in future releases, or get an alias.
+
+ :se[t] shows all options that differ from their default value.
+
+ :se[t] all
+ shows all options.
+
+ :se[t] opt1=val1 opt2='val2' opt3="val3" ...
+ will set options to given values.
+ You can use following syntax:
+ - for all options - option, option? and option&
+ - for boolean options - nooption, invoption and option!
+ - for integer options - option=x, option+=x and option-=x
+ - for string options - option=x
+ - for string list options - option=x, option+=x and option-=x
+ - for enumeration options - option=x, option+=x and option-=x
+ - for enumeration options - option=x
+ - for set options - option=x, option+=x and option-=x
+ - for charset options - option=x, option+=x and option-=x
+
+ the meaning:
+ - option - turn option on (for boolean) or print its value (for all others)
+ - nooption - turn option off
+ - invoption - invert option state
+ - option! - invert option state
+ - option? - print option value
+ - option& - reset option to its default value
+ - option=x or option:x - set option to x
+ - option+=x - add x to option
+ - option-=x - remove (or subtract) x from option
+
+ Option name can be prepended and appended by any number of whitespace
+ characters.
+
+ :sh[ell]
+ will start a shell.
+
+ :sor[t]
+ creates a popup menu of different sorting methods, when one can select primary
+ sorting key. When 'viewcolumns' options is empty and 'lsview' is off, changing
+ primary sorting key will also affect view look (in particular the second column
+ of the view will be changed).
+
+ :so[urce] file
+ reads command-line commands from the file.
+
+ :sp[lit]
+ switch to a two window horizontal view.
+
+ :sp[lit]!
+ toggles window horizontal splitting.
+
+ :sp[lit] path
+ splits the window horizontally to show both file directories. And changes other
+ pane to path (absolute or relative to current directory of active pane).
+
+ :[range]s[ubstitite]/pattern/string/[flags]
+ for each file in range replace a match of pattern with string.
+
+ String can contain \0...\9 to link to capture groups (\0 - all match, \1 -
+ first group, etc.).
+
+ Available flags:
+
+ - i - ignore case (the 'ignorecase' and 'smartcase' options are not used)
+
+ - I - don't ignore case (the 'ignorecase' and 'smartcase' options are not used)
+
+ - g - substitute all matches in each file name (each g toggles this)
+
+ :[range]s[ubstitute]//string/[flags]
+ will use previous pattern.
+
+ :[range]s[ubstitute]
+ will repeat previous substitution command.
+
+ :sync [relative path]
+ change the other panel to the current panel directory or to some path relative
+ to the current directory. Using macros is allowed.
+
+ :sync!
+ change the other panel to the current panel directory and synchronize cursor
+ position.
+
+ :touch file...
+ will create files. Aborts on errors and won't update time of existing files.
+ Macros are expanded.
+
+ :[range]tr/pattern/string/
+ for each file in range transliterate the characters which appear in pattern to
+ the corresponding character in string. When string is shorter than pattern,
+ it's padded with its last character.
+
+ String can contain ...9 to link to capture groups (0 - all match, 1 - first
+ group, etc.).
+
+ :undol[ist]
+ show list of latest changes. Add ! to see commands.
+
+ :unl[et][!] $ENV_VAR1 $ENV_VAR2 ...
+ remove environment variables. Add ! to omit displaying of warnings about
+ nonexistent variables.
+
+ :ve[rsion]
+ show menu with version information.
+
+ :vifm same as :version.
+
+ :vie[w]
+ toggle on and off the quick file view.
+
+ :vie[w]!
+ turns on quick file view if it's off.
+
+ :volumes
+ only for MS-Windows
+ will popup menu with volume list. Hitting l (or Enter) key will open
+ appropriate volume in the current pane.
+
+ :vs[plit]
+ switch to a two window vertical view.
+
+ :vs[plit]!
+ toggles window vertical splitting.
+
+ :vs[plit] path
+ splits the window vertically to show both file directories. And changes other
+ pane to path (absolute or relative to current directory of active pane).
+
+ :windo [command...]
+ Execute command for each pane (same as :winrun % command).
+
+ :winrun type [command...]
+ Execute command for pane(s), which is determined by type argument:
+ - ^ - top-left pane
+ - $ - bottom-right pane
+ - % - all panes
+ - . - current pane
+ - , - other pane
+
+ :w[rite]
+ write vifminfo file (add ! to force write even if settings weren't changed).
+
+ :wq[!] same as :quit, but ! only disables check of backgrounded commands.
+
+ :x[it][!]
+ will exit Vifm (add ! if you don't want to save changes).
+
+
+ :map lhs rhs
+ map lhs key sequence to rhs in normal and visual modes.
+
+ :map! lhs rhs
+ map lhs key sequence to rhs in command line mode.
+
+
+ :cm[ap] lhs rhs
+ map lhs to rhs in command line mode.
+
+ :mm[ap] lhs rhs
+ map lhs to rhs in menu mode.
+
+ :nm[ap] lhs rhs
+ map lhs to rhs in normal mode.
+
+ :qm[ap] lhs rhs
+ map lhs to rhs in view mode.
+
+ :vm[ap] lhs rhs
+ map lhs to rhs in visual mode.
+
+
+ :cm[ap]
+ lists all maps in command line mode.
+
+ :mm[ap]
+ lists all maps in menu mode.
+
+ :nm[ap]
+ lists all maps in normal mode.
+
+ :qm[ap]
+ lists all maps in view mode.
+
+ :vm[ap]
+ lists all maps in visual mode.
+
+
+ :cm[ap] beginning
+ lists all maps in command line mode that start with the beginning.
+
+ :mm[ap] beginning
+ lists all maps in menu mode that start with the beginning.
+
+ :nm[ap] beginning
+ lists all maps in normal mode that start with the beginning.
+
+ :qm[ap] beginning
+ lists all maps in view mode that start with the beginning.
+
+ :vm[ap] beginning
+ lists all maps in visual mode that start with the beginning.
+
+
+ :no[remap] lhs rhs
+ map the key sequence lhs to {rhs} for normal and visual modes, but disallow
+ mapping of rhs.
+
+ :no[remap]! lhs rhs
+ map the key sequence lhs to {rhs} for command line mode, but disallow mapping of
+ rhs.
+
+
+ :cno[remap] lhs rhs
+ map the key sequence lhs to {rhs} for command line mode, but disallow mapping of
+ rhs.
+
+ :mn[oremap] lhs rhs
+ map the key sequence lhs to {rhs} for menu mode, but disallow mapping of rhs.
+
+ :nn[oremap] lhs rhs
+ map the key sequence lhs to {rhs} for normal mode, but disallow mapping of rhs.
+
+ :qn[oremap] lhs rhs
+ map the key sequence lhs to {rhs} for view mode, but disallow mapping of rhs.
+
+ :vn[oremap] lhs rhs
+ map the key sequence lhs to {rhs} for visual mode, but disallow mapping of rhs.
+
+
+ :unm[ap] lhs
+ remove the mapping of lhs from normal and visual modes.
+
+ :unm[ap]! lhs
+ remove the mapping of lhs from command line mode.
+
+
+ :cu[nmap] lhs
+ remove the mapping of lhs from command line mode.
+
+ :mu[nmap] lhs
+ remove the mapping of lhs from menu mode.
+
+ :nun[map] lhs
+ remove the mapping of lhs from normal mode.
+
+ :qun[map] lhs
+ remove the mapping of lhs from view mode.
+
+ :vu[nmap] lhs
+ remove the mapping of lhs from visual mode.
+
+Ranges
+ The ranges implemented include:
+ 2,3 - from second to third file in the list (including it)
+ % - the entire directory.
+ . - the current position in the filelist.
+ $ - the end of the filelist.
+ 't - the mark position t.
+
+ Examples:
+
+ :%delete
+
+ would delete all files in the directory.
+
+ :2,4delete
+
+ would delete the files in the list positions 2 through 4.
+
+ :.,$delete
+
+ would delete the files from the current position to the end of the
+ filelist.
+
+ :3delete4
+
+ would delete the files in the list positions 3, 4, 5, 6.
+
+ If a backward range is given :4,2delete - an query message is given and
+ user can chose what to do next.
+
+ The builtin commands that accept a range are :d[elete] and :y[ank].
+
+Command macros
+ The command macros may be used in user commands.
+
+ %a User arguments. When user arguments contain macros, they are
+ expanded before preforming substitution of %a.
+
+ %c %"c The current file under the cursor.
+
+ %C %"C The current file under the cursor in the other directory.
+
+ %f %"f All of the selected files.
+
+ %F %"F All of the selected files in the other directory list.
+
+ %b %"b Same as %f %F.
+
+ %d %"d Full path to current directory.
+
+ %D %"D Full path to other file list directory.
+
+ %rx %"rx
+ Full paths to files in the register {x}. In case of invalid
+ symbol in place of {x}, it's processed with the rest of the line
+ and default register is used.
+
+ %m Show command output in a menu.
+
+ %M Same as %m, but l (or Enter) key is handled like for :locate and
+ :find commands.
+
+ %S Show command output in the status bar.
+
+ %s Execute command in split window of active terminal multiplexer
+ (ignored if not running inside one).
+
+ %i Completely ignore command output.
+
+ Use %% if you need to put a percent sign in your command.
+
+ Note that %m, %M, %s, %S and %i macros are mutually exclusive. Only the
+ last one of them in the command will take effect.
+
+ You can use filename modifiers after %c, %C, %f, %F, %b, %d and %D
+ macros. Supported modifiers are:
+
+ - :p - full path
+
+ - :u - UNC name of path (e.g. "\\server" in
+ "\\server\share"), Windows only. Expands to current computer name
+ for not UNC paths.
+
+ - :~ - relative to the home directory
+
+ - :. - relative to current directory
+
+ - :h - head of the filename
+
+ - :t - tail of the filename
+
+ - :r - root of the filename (without last extension)
+
+ - :e - extension of the filename (last one)
+
+ - :s?pat?sub? - substitute the first occurrence of pat with sub. You
+ can use any character for '?', but it must not occur in pat or sub.
+
+ - :gs?pat?sub? - like :s, but substitutes all occurrences of pat with
+ sub.
+
+ See ':h filename-modifiers' in Vim's documentation for the detailed
+ description.
+
+ Using %x means expand corresponding macro escaping all characters
+ that have special meaning. And %"x means using of double quotes and
+ escape only backslash and double quote characters, which is more use‐
+ ful on Windows systems.
+
+ Position and quantity (if there is any) of %m, %M, %S or %s macros in
+ the command is unimportant. All their occurrences will be removed
+ from the resulting command.
+
+ %c and %f macros are expanded to file names only, when %C and %F are
+ expanded to full paths. %f and %F follow this in %b too.
+
+ :com move mv %f %D
+ would set the :move command to move all of the files selected in the
+ current directory to the other directory.
+
+ The %a macro will substitute any arguments given in a command into the
+ command. All arguments are considered optional. ":com lsl !!ls -l %a"
+ will set the lsl command to execute ls -l with or without an argument.
+
+ :lsl<Return>
+ will list the directory contents of the current directory.
+
+ :lsl filename<Return>
+ will list only the given filename.
+
+ The macros can also be used in directly executing commands. ":!mv %f
+ %D" would move the current directory selected files to the other direc‐
+ tory.
+
+ Appending & to the end of a command will cause it to be executed in the
+ background.Typically you want to run two kinds of external commands in
+ thebackground:
+ - GUI applications that doesn't fork thus block vifm (:!sxiv %f &);
+ - console tools that do not work with terminal (:!mv %f %D &).
+
+ You don't want to run terminal commands, which require terminal input
+ oroutput something because they will mess up vifm's TUI. Anyway, if you
+ did runsuch a command, you can use Ctrl-L key to update vifm's TUI.
+
+ Rewriting the example command with macros given above with background‐
+ ing:
+
+ :!mv %f %D &
+
+ Note that %m, %M, %s, %S and %i macros have bigger priority than &. So
+ command containing at least one of them can't be backgrounded and " &"
+ at the end will be just silently ignored.
+
+Command backgrounding
+ Copy and move operation can take a lot of time to proceed. That's why
+ vifm supports backgrounding of this two operations. To run :copy,
+ :move or :delete command in the background just add " &" at the end of
+ a command.
+
+ For each background operation a new thread will be created. Currently
+ job cannot be stopped or paused.
+
+ You can see if command is still running in the :jobs menu. Back‐
+ grounded commands have progress instead of process id at the line
+ beginning.
+
+ Background operations cannot be undone.
+
+Globs
+ :filetype, :filextype and :fileviewer commands support globs to match
+ file names. Here is a short overview of globs and some important
+ points that one needs to know about them.
+
+ Only names of files are matched by the globs, not full paths. E.g.
+ :filetype Makefile make %c
+ will match files with name "Makefile" regardless whether it's in root
+ or home directory.
+
+ *, ?, [ and ] are treated as special symbols in the pattern. E.g.
+ :filetype * less %c
+ matches all files. One can use character classes for escaping, so
+ :filetype [*] less %c
+ matches only one file name, the one which contains only asterisk sym‐
+ bol.
+
+ * means any number of any characters (possibly an empty substring),
+ with one exception: asterisk at the pattern beginning doesn't match dot
+ in the first position. E.g.
+ :fileviewer *.zip,*.jar zip -sf %c
+ associates using of zip program to preview all files with zip or jar
+ extensions as listing of their content.
+
+ ? means any character at this position. E.g.
+ :fileviewer ?.out file %c
+ calls file tool for all files which has exactly one character before
+ their extension (e.g. a.out, b.out).
+
+ Square brackets designate character class, which means that whole char‐
+ acter class matches against any of characters listed in it. For exam‐
+ ple
+ :fileviewer *.[ch] highlight -O xterm256 -s dante --syntax c %c
+ makes vifm call highlight program to colorize source and header files
+ in C language for a 256-color terminal. Equal command would be
+ :fileviewer *.c,*.h highlight -O xterm256 -s dante --syntax c %c
+
+ Inside square brackets ^ or ! can be used for symbol class negotiation
+ and the - symbol to set a range. ^ and ! should appear right after the
+ opening square bracket. For example
+ :filetype *.[!d]/ inspect_dir
+ associates inspect_dir as additional handler for all directories that
+ have one character extension unless it's "d" letter. And
+ :filetype [0-9].jpg sxiv
+ associates sxiv picture viewer only for JPEG-files that contain single
+ digit in their name.
+
+:set options
+ Local options
+ These are kind of options that are local to a specific view. So
+ you can set ascending sorting order for left pane and descending
+ order for right pane.
+
+ aproposprg
+ type: string
+ default: "apropos %a"
+ Specifies format for an external command to be invoked by the
+ :apropos command. The format supports expanding of macros, spe‐
+ cific for a particular *prg option, and %% sequence for insert‐
+ ing percent sign literally. This option should include the %a
+ macro to specify placement of arguments passed to the :apropos
+ command. If the macro is not used, it will be implicitly added
+ after a space to the value of this option.
+
+ autochpos
+ type: boolean
+ default: true
+ When disabled vifm will set cursor to the first line in the view
+ after :cd and :pushd commands instead of saved cursor position.
+ Disabling this will also make vifm clear information about cur‐
+ sor position in the view history on :cd and :pushd commands (and
+ on startup if autochpos is disabled in the vifmrc). l key in
+ the :history . menu is treated like :cd command. This option
+ affects bookmarks, file position will not preserved.
+
+ columns co
+ type: int
+ default: terminal width on startup
+ Terminal width in characters.
+
+ classify
+ type: string list
+ default: ":dir:/"
+ Specifies file name prefixes and suffixes depending on file
+ types. The format is: [{prefix}]:{filetype}:[{suffix}]. Either
+ {prefix} or {suffix} or both of them can be omitted (which is
+ the default for all unspecified file types), this means empty
+ {prefix} and/or {suffix}. {prefix} and {suffix} should consist
+ exactly of one character. Elements are separated by commas.
+ Neither prefixes nor suffixes are part of file names, so they
+ don't affect commands which operate on file names in any way.
+ Comma (',') character should not be used. List of file type
+ names can be found in the description of filetype() function.
+
+ confirm cf
+ type: boolean
+ default: true
+ Ask about permanent deletion of files (on D or :delete! command
+ or on undo/redo operation).
+
+ cpoptions cpo
+ type: charset
+ default: "fst"
+ Contains a sequence of single-character flags. Each flag
+ enables behaviour of older versions of vifm. Flags:
+ f - when included, running :filter command results in not
+ inverted (matching files are filtered out) and :filter! in
+ inverted (matching files are left) filter, when omitted, meaning
+ of the exclamation mark changes to the opposite;
+ s - when included, yy, dd and DD normal mode commands act on
+ selection, otherwise they operate on current file only;
+ t - when included, <tab> (thus <c-i>) behave as <space> and
+ switch active pane, otherwise <tab> and <c-i> go forward in the
+ view history.
+
+ dotdirs
+ type: set
+ default: nonrootparent
+ Controls displaying of dot directories. The following values
+ are possible:
+ - rootparent - show "../" in root directory of file system
+ - nonrootparent - show "../" in non-root directories of file
+ system
+ Note that empty directories will always contain "../" entry
+ regardless of value of this option. "../" will disappear at the
+ moment at least one file is created inside the directory.
+
+ fastrun
+ type: boolean
+ default: false
+ With this option turned on you can run partially entered com‐
+ mands with unambiguous beginning using :! (e.g. :!Te instead of
+ :!Terminal or :!Te<tab>).
+
+ findprg
+ type: string
+ default: "find %s %a -print , -type d \( ! -readable -o ! -exe‐
+ cutable \) -prune"
+ Specifies format for an external command to be invoked by the
+ :find command. The format supports expanding of macros, spe‐
+ cific for a particular *prg option, and %% sequence for insert‐
+ ing percent sign literally. This option should include the %s
+ macro to specify placement of list of paths to search in and the
+ %a macro to specify placement of arguments passed to the :find
+ command. If some of the macros are not used, they will be
+ implicitly added after a space to the value of the option in the
+ following order: %s, %a.
+
+ %s and %a macro can slightly change their meaning depending on
+ :find command arguments. When the first argument points to an
+ existing directory, %s is assigned all arguments and %a is left
+ empty. Otherwise, %s is assigned a dot (".") meaning current
+ directory or list of selected filenames if any. %a is assigned
+ arguments when first argument starts with a dash ("-"), other‐
+ wise an escaped version of arguments, prepended by "-name" (on
+ *nix) or "-iname" (on Windows) predicate.
+
+ followlinks
+ type: boolean
+ default: true
+ Follow links on l or Enter.
+
+ fusehome
+ type: string
+ default: "($TMPDIR | $TEMP | $TEMPDIR | $TMP)/vifm_FUSE/"
+ Directory to be used as a root dir for FUSE mounts. Value of
+ the option can contain environment variables (in form
+ "$envname"), which will be expanded (prepend it with a slash to
+ prevent expansion). The value should expand to an absolute
+ path.
+
+ If you change this option, vifm won't remount anything. It
+ affects future mounts only. See "Automatic FUSE mounts" section
+ below for more information.
+
+ gdefault gd
+ type: boolean
+ default: false
+ When on, 'g' flag is on for :substitute by default.
+
+ grepprg
+ type: string
+ default: "grep -n -H -I -r %i %a %s"
+ Specifies format for an external command to be invoked by the
+ :grep command. The format supports expanding of macros, spe‐
+ cific for a particular *prg option, and %% sequence for insert‐
+ ing percent sign literally. This option should include the %i
+ macro to specify placement of "-v" string when inversion of
+ results is requested, the %a macro to specify placement of argu‐
+ ments passed to the :grep command and the %s macro to specify
+ placement of list of files to search in. If some of the macros
+ are not used, they will be implicitly added after a space to the
+ value of the 'grepprg' option in the following order: %i, %a,
+ %s.
+
+ Example of setup to use ack (http://beyondgrep.com/) instead of
+ grep:
+ set grepprg=ack\ -H\ -r\ %i\ %a\ %s
+ or The Silver Searcher (https://github.com/ggreer/the_sil‐
+ ver_searcher):
+ set grepprg=ag\ --line-numbers\ %i\ %a\ %s
+
+
+ history hi
+ type: integer
+ default: 15
+ Maximum number of directories in the view history and lines in
+ the prompt, command line and search histories.
+
+ hlsearch hls
+ type: bool
+ default: true
+ Highlight all matches of search pattern.
+
+ iec type: boolean
+ default: false
+ Use KiB, MiB, ... instead of KB, MB, ...
+
+ ignorecase ic
+ type: boolean
+ default: false
+ Ignore case in search patterns (:substitute, / and ? commands)
+ and characters after f and F commands. It doesn't affect file
+ filtering.
+
+ incsearch is
+ type: boolean
+ default: false
+ When this option is set, search will be performed starting from
+ initial cursor position each time search pattern is changed.
+
+ laststatus ls
+ type: boolean
+ default: true
+ Controls if status bar is visible.
+
+ lines type: int
+ default: terminal height on startup
+ Terminal height in lines.
+
+ locateprg
+ type: string
+ default: "locate %a"
+ Specifies format for an external command to be invoked by the
+ :locate command. The format supports expanding of macros, spe‐
+ cific for a particular *prg option, and %% sequence for insert‐
+ ing percent sign literally. This option should include the %a
+ macro to specify placement of arguments passed to the :locate
+ command. If the macro is not used, it will be implicitly added
+ after a space to the value of this option.
+
+ lsview type: boolean
+ default: false
+ type: local
+ When this option is set, directory view will be displayed in
+ multiple columns with filenames similar to output of `ls -x`
+ command. See ls-like view section below for format description.
+
+ rulerformat ruf
+ type: string
+ default: "%=%l-%S "
+ Determines the content of the ruler. Its width is 13 characters
+ and it's right aligned. Following macros are supported:
+ %l - file number
+ %L - total number of files in view (including filtered)
+ %- - number of filtered files
+ %S - number of showed files
+ %= - separation point between left and right align items
+ %% - percent sign
+
+ Percent sign can be followed by optional minimum field width.
+ Add '-' before minimum field width if you want field to be right
+ aligned. Example:
+
+ set rulerformat="%=%2l-%S [%L] "
+
+ runexec
+ type: boolean
+ default: false
+ Run executable file on Enter or l.
+
+ scrollbind scb
+ type: boolean
+ default: false
+ When this option is set, vifm will try to keep difference of
+ scrolling positions of two windows constant.
+
+ scrolloff so
+ type: int
+ default: 0
+ Minimal number of screen lines to keep above and below the cur‐
+ sor. If you want cursor line to always be in the middle of the
+ view (except at the beginning or end of the file list), set this
+ option to some large value (e.g. 999).
+
+ shell sh
+ type: string
+ default: $SHELL or "sh" or "cmd" (on MS-Windows)
+ Full path to the shell to use to run external commands.
+
+ shortmess shm
+ type: charset
+ default: ""
+ Contains a sequence of single-character flags. Each flag
+ enables shortening of some message displayed by vifm in the TUI.
+ Flags:
+ T - truncate status-bar messages in the middle if they are too
+ long to fit on the command line. "..." will appear in the mid‐
+ dle.
+
+ slowfs type: string list
+ default: ""
+ only for *nix
+ A list of mounter fs name beginnings (first column in /etc/mtab
+ or /proc/mounts) that work too slow for you. This option can be
+ used to stop vifm from making some requests to particular kinds
+ of file systems that can slow down file browsing. Currently
+ this means don't check if directory has changed and do not check
+ if target of symbolic links exists.
+
+ smartcase scs
+ type: boolean
+ default: false
+ Overrides the ignorecase option if the search pattern contains
+ at least one upper case character. Only used when ignorecase
+ option is enabled. It doesn't affect file filtering.
+
+ sort type: string list
+ default: +name on *nix and +iname on Windows
+ type: local
+ Sets list of sorting keys (first item is primary key, second is
+ secondary key, etc.):
+ [+-]ext - sort by extension
+ [+-]name - sort by name (including extension)
+ [+-]iname - sort by name (including extension, ignores case)
+ [+-]gid - sort by group id (*nix only)
+ [+-]gname - sort by group name (*nix only)
+ [+-]mode - sort by mode (*nix only)
+ [+-]perms - sort by permissions string (*nix only)
+ [+-]uid - sort by owner id (*nix only)
+ [+-]uname - sort by owner name (*nix only)
+ [+-]size - sort by size
+ [+-]atime - sort by time accessed
+ [+-]ctime - sort by time changed
+ [+-]mtime - sort by time modified
+
+ ´+' means ascending sort for this key, and '-' means descending sort.
+
+ In case name (iname on Windoes) is skipped, it will be added at the end
+ automatically.
+
+ This option also changes view columns according to primary sorting key
+ set, unless 'viewcolumns' option is not empty.
+
+ sortnumbers
+ type: boolean
+ default: false
+ type: local
+ Natural sort of (version) numbers within text.
+
+ statusline stl
+ type: string
+ default: ""
+ Determines the content of the status line (the line right above
+ command-line). Empty string means use same format like in pre‐
+ vious versions. Following macros are supported:
+
+ - %t - file name (considering value of the 'classify' option)
+
+ - %A - file attributes (permissions on *nix or properties on
+ Windows)
+
+ - %u - user name or uid (if it cannot be resolved)
+
+ - %g - group name or gid (if it cannot be resolved)
+
+ - %s - file size in human readable format
+
+ - %E - size of selected files in human readable format, same as
+ %s when no files are selected, except that it will never
+ show size of ../ in visual mode, since it cannot be
+ selected
+
+ - %d - file modification date (uses 'timefmt' option)
+
+ - all 'rulerformat' macros
+
+ Percent sign can be followed by optional minimum field width.
+ Add '-' before minimum field width if you want field to be right
+ aligned. Example:
+
+ set statusline=" %t%= %A %10u:%-7g %15s %20d "
+
+ On Windows file properties include next flags (upper case means
+ flag is on):
+ A - archive
+ H - hidden
+ I - content isn't indexed
+ R - readonly
+ S - system
+ C - compressed
+ D - directory
+ E - encrypted
+ P - reparse point (e.g. symbolic link)
+ Z - sparse file
+
+ sortorder
+ type: enumeration
+ default: ascending
+ Sets sort order for primary key: ascending, descending.
+
+ tabstop ts
+ type: integer
+ default: value from curses library
+ Number of spaces that a Tab in the file counts for.
+
+ timefmt
+ type: string
+ default: " %m/%d %H:%M"
+ Format of time in file list. See man date or man strf‐
+ time for details.
+
+ timeoutlen tm
+ type: integer
+ default: 1000
+ The time in milliseconds that is waited for a mapped key
+ in case of already typed key sequence is ambiguous.
+
+ trash type: boolean
+ default: true
+ Use trash directory. See "Trash directory" section
+ below.
+
+ trashdir
+ type: string
+ default: "$HOME/.vifm/Trash"
+ Sets path to trash directory. Value of the option can
+ contain environment variables (in form "$envname"), which
+ will be expanded (prepend it with a slash to prevent
+ expansion). The value should expand to an absolute path.
+
+ Will attempt to create the directory if it does not
+ exist. See "Trash directory" section below.
+
+ undolevels ul
+ type: integer
+ default: 100
+ Maximum number of changes that can be undone.
+
+ vicmd type: string
+ default: "vim"
+ The actual command used to start vi. Ampersand sign at
+ the end (regardless whether it's preceded by space or
+ not) means backgrounding of command.
+
+ viewcolumns
+ type: string
+ default: ""
+ type: local
+ Format string containing list of columns in the view.
+ When this option is empty view columns to show are chosen
+ automatically using sorting keys (see 'sort') as a base.
+ Value of this option is ignored if 'lsview' is set. See
+ Column view section below for format description.
+
+ An example of setting the options for both panes (note
+ vifm-windo command):
+ windo set viewcolumns=-{name}..,6{size},11{perms}
+
+ vixcmd type: string
+ default: value of vicmd
+ The command used to start vi when in X. Ampersand sign
+ at the end (regardless whether it's preceded by space or
+ not) means backgrounding of command.
+
+ vifminfo
+ type: set
+ default: bookmarks
+
+ Controls what will be saved in the $VIFM/vifminfo file.
+ options - all options that can be set with the :set command
+ filetypes - associated programs and viewers
+ commands - user defined commands (see :command description)
+ bookmarks - bookmarks, except special ones like '< and '>
+ tui - state of the user interface (sorting, number of
+ windows, quick
+ view state, active view)
+ dhistory - directory history
+ state - file name and dot filters and terminal multiplex‐
+ ers integration
+ state
+ cs - default color scheme
+ savedirs - save last visited directory (needs dhistory)
+ chistory - command line history
+ shistory - search history (/ and ? commands)
+ phistory - prompt history
+ fhistory - filter history (see description of the "=" normal
+ mode command)
+ dirstack - directory stack overwrites previous stack, unless
+ stack of
+ current session is empty
+ registers - registers content
+
+ vimhelp
+ type: boolean
+ default: false
+ Use vim help format.
+
+ wildmenu wmnu
+ type: boolean
+ default: false
+ Controls whether possible matches of completion will be
+ shown above the command line.
+
+ wrap type: boolean
+ default: true
+ Controls whether to wrap text in quick view.
+
+ wrapscan ws
+ type: boolean
+ default: true
+ Searches wrap around end of the list.
+
+Mappings
+ Since it's not easy to enter special characters there are several spe‐
+ cial sequences that can be used in place of them. They are:
+
+ <cr> Enter key
+
+ <bs> Backspace key
+
+ <tab> <s-tab>
+ Tabulation and Shift+Tabulation keys
+
+ <esc> <space> <home> <end> <left> <right> <up> <down> <pageup> <page‐
+ down>
+ Keys with obvious names.
+
+ <del> <delete>
+ Delete key. <del> and <delete> mean different codes, but
+ <delete> is more common.
+
+ <c-a>,<c-b>,...,<c-z>,<c-[>,<c->,<c-]>,<c-^>,<c-_>
+ Control + some key.
+
+ <a-a>,<a-b>,...,<a-z>
+ <m-a>,<m-b>,...,<m-z> Alt + some key.
+
+ <a-c-a>,<a-c-b>,...,<a-c-z>
+ <m-c-a>,<m-c-b>,...,<m-c-z> only for *nix
+ Alt + Ctrl + some key.
+
+ <f0> - <f63>
+ Functional keys
+
+ <c-f1> - <c-f12>
+ only for MS-Windows
+ Functional keys with Control key pressed.
+
+ <a-f1> - <a-f12>
+ only for MS-Windows
+ Functional keys with Alt key pressed.
+
+ <s-f1> - <s-f12>
+ only for MS-Windows
+ Functional keys with Shift key pressed.
+
+ vifm removes whitespace characters at the beginning and end of com‐
+ mands. That's why you may want to use <space> at the end of rhs in
+ mappings. For example:
+
+ cmap <f1> man<space>
+
+ will put "man " in line when you hit the <f1> key in the command line
+ mode.
+
+Expression syntax
+ Supported expressions is a subset of what VimL provides.
+
+ Expression syntax summary, from least to most significant:
+
+ vifm-expr1 expr2 == expr2 equal
+ expr2 != expr2 not equal
+
+ vifm-expr2 expr3 . expr3 .. string concatenation
+
+ vifm-expr3 "string" string constant, \ is special
+ 'string' string constant, ' is doubled
+ $VAR environment variable
+ function(expr1, ...) function call
+
+ ".." indicates that the operations in this level can be concatenated.
+
+ expr1
+ -----
+ expr2 {cmp} expr2
+
+ Compare two expr2 expressions, resulting in a 0 if it evaluates to
+ false or 1 if it evaluates to true.
+
+ equal ==
+ notequal !=
+
+ Examples:
+ 'a' == 'a' evaluates to 1
+ 'a' == 'b' evaluates to 0
+
+ expr2
+ -----
+ expr3 . expr3 .. string concatenation
+
+ Examples:
+ 'a' . 'b' = 'ab'
+ 'aaa' . '' . 'c' = 'aaac'
+
+ expr3
+ -----
+
+ string
+ ------
+ "string" string constant
+
+ Note that double quotes are used.
+
+ A string constant accepts these special characters:
+ \b backspace <bs>
+ \e escape <esc>
+ \n newline
+ \r return <cr>
+ \t tab <tab>
+ \\ backslash
+ \" double quote
+
+ Examples:
+ "\"Hello,\tWorld!\""
+ "Hi,\nthere!"
+
+ literal-string
+ --------------
+ ´string' string constant
+
+ Note that single quotes are used.
+
+ This string is taken as it is. No backslashes are removed or have a
+ special meaning. The only exception is that two quotes stand for one
+ quote.
+
+ Examples:
+ 'All\slashes\are\saved.'
+ 'This string contains doubled single quotes ''here'''
+
+ environment variable
+ --------------------
+ $VAR environment variable
+
+ The String value of any environment variable. When it is not defined,
+ the result is an empty string.
+
+ Examples:
+ 'This is my $PATH env: ' . $PATH
+ 'vifmrc at ' . $MYVIFMRC . ' is used.'
+
+ function call
+ -------------
+ function(expr1, ...) function call
+
+ See Functions section below.
+
+ Examples:
+ "'" . filetype('.') . "'"
+ filetype('.') == 'reg'
+
+Functions
+ USAGE RESULT DESCRIPTION
+
+ expand({expr}) String Expand macros in {expr}.
+ filetype({fnum}) String Returns file type from position.
+
+ expand({expr})
+ Expands macros in {expr} just like it's done for command-line commands.
+ Returns a string. See "Command macros" section above. Examples:
+ " percent sign
+ :echo expand('%%')
+ " the last part of directory name of the other pane
+ :echo expand('%D:t')
+
+ filetype({fnum})
+ The result is a string, which represents file type and is one of the
+ list:
+ exe executables
+ reg regular files
+ link symbolic links
+ dir directories
+ char character devices
+ block block devices
+ fifo pipes
+ sock *nix domain sockets
+ ? unknown file type (should never appear)
+ Parameter {fnum} can have following values:
+ - '.' to get type of file under the cursor in the active pane
+
+Menus and dialogs
+ General
+
+ j, k - move.
+ <Escape>, Ctrl-C, ZZ, ZQ - quit.
+ <Return>, l - select and exit the menu.
+ Ctrl-L - redraw the menu.
+
+ Escape, Ctrl-C, ZZ, ZQ, q - quit.
+
+ In all menus
+
+ Ctrl-B/Ctrl-F
+ Ctrl-D/Ctrl-U
+ Ctrl-E/Ctrl-Y
+ / and ?, n/N
+ [num]G/[num]gg
+ H/M/L
+ zb/zt/zz
+ zh - scroll menu items [count] characters to the right.
+ zl - scroll menu items [count] characters to the left.
+ zH - scroll menu items half of screen width characters to the right.
+ zL - scroll menu items half of screen width characters to the left.
+
+ All these keys have the same meaning as in normal mode (but not L in
+ filetype menu).
+
+ : - enter command line mode for menus (currently only :exi[t], :q[uit],
+ :x[it] and :{range} are supported).
+
+ Apropos menu
+
+ l key won't close the menu allowing user to pick another man page, use
+ :q to close the menu.
+
+ Commands menu
+
+ dd on a command to remove.
+
+ Bookmarks menu
+
+ Escape or Ctrl-C to abort j and k to move through.
+ dd on a bookmark to remove.
+
+ Directory stack menu
+
+ Pressing l or Enter on directory name will rotate stack to place
+ selected directory pair at the top of the stack.
+
+ Filetype menu
+
+ Commands from vifmrc or typed in command-line are displayed above empty
+ line. All commands below empty line are from .desktop files.
+
+ Fileinfo dialog
+
+ Enter - close dialog
+ q - close dialog
+
+ Sort dialog
+
+ h - switch ascending/descending.
+ Space - switch ascending/descending.
+ q - close dialog
+
+ Attributes (permissions or properties) dialog
+
+ h - check/uncheck.
+ Space - check/uncheck.
+ q - close dialog
+
+ Item states:
+
+ - * - checked flag.
+
+ - X - means that it has different value for files in selection.
+
+ - d (*nix only) - (only for execute flags) means u-x+X, g-x+X or o-x+X
+ argument for the chmod program. If you want to remove execute right
+ from all files, but preserve it for directories, set all execute
+ flags to 'd' and check ´Set Recursively' flag.
+
+Startup
+ On startup vifm determines several variables that are used during the
+ session. They are determined in the order they appear below.
+
+ On *nix systems $HOME is normally present and used as is. On Windows
+ systems vifm tries to find correct home directory in the following
+ order:
+ - $HOME variable;
+ - $USERPROFILE variable;
+ - a combination of $HOMEDRIVE and $HOMEPATH variables.
+
+ vifm tries to find correct configuration directory by checking the fol‐
+ lowing places:
+ - $VIFM variable;
+ - parent directory of the executable file (on Windows only);
+ - $HOME/.vifm directory;
+ - $APPDATA/Vifm directory (on Windows only).
+
+ vifm tries to find correct configuration file by checking the following
+ places:
+ - $MYVIFMRC variable;
+ - vifmrc in parent directory of the executable file (on Windows only);
+ - $VIFM/vifmrc file.
+
+Configure
+ See Startup section above for the explanations on $VIFM and $MYVIFMRC.
+
+ The vifmrc file contains commands that will be executed on vifm
+ startup. See $MYVIFMRC variable description for search algorithm used
+ to find vifmrc. Use it to set settings, mappings, filetypes etc. To
+ use multi line commands precede each next line with a slash (whitespace
+ before slash is ignored, but all spaces at the end of the lines are
+ saved). For example:
+ set
+ \smartcase
+ equals "setsmartcase". When
+ set<space here>
+ \ smartcase
+ equals "set smartcase".
+
+ The $VIFM/vifminfo file contains session settings. You may edit it by
+ hand to change the settings, but it's not recommended to do that, edit
+ vifmrc instead. You can control what settings will be saved in
+ vifminfo by setting ´vifminfo' option. Vifm always writes this file on
+ exit unless 'vifminfo' option is empty. Bookmarks, commands, directory
+ history, filetypes, fileviewers and registers in the file are merged
+ with vifm configuration (which has bigger priority).
+
+ The $VIFM/scripts directory can contain shell scripts. vifm modifies
+ it's PATH environment variable to let user run those scripts without
+ specifying full path. All subdirectories of the $VIFM/scripts will be
+ added to PATH too. Script in a subdirectory overlaps script with the
+ same name in all its parent directories.
+
+ The $VIFM/colors directory contains color schemes.
+
+Automatic FUSE mounts
+ vifm has a builtin support of automated FUSE file system mounts. It is
+ implemented using file associations mechanism. To enable automated
+ mounts, one needs to use a specially formated program line in filetype
+ or filextype commands. Currently two formats are supported:
+
+ 1) FUSE_MOUNT This format should be used in case when all information
+ needed for mounting all files of a particular type is the same. E.g.
+ mounting of tar files don't require any file specific options.
+
+ Format line:
+ FUSE_MOUNT|mounter %SOURCE_FILE %DESTINATION_DIR [%CLEAR]
+
+ Example filetype command:
+ :filetype FUSE_MOUNT|fuse-zip %SOURCE_FILE %DESTINATION_DIR
+
+ 2) FUSE_MOUNT2 This format allows one to use specially formatted files
+ to perform mounting and is useful for mounting remotes, for example
+ remote file systems over ftp or ssh.
+
+ Format line:
+ FUSE_MOUNT2|mounter %PARAM %DESTINATION_DIR [%CLEAR]
+
+ Example filetype command:
+ :filetype FUSE_MOUNT2|sshfs %PARAM %DESTINATION_DIR
+
+ Example file content:
+ root@127.0.0.1:/
+
+ All % macros are expanded by vifm at runtime and have the following
+ meaning:
+ - %SOURCE_FILE is replaced by full path to selected file
+ - %DESTINATION_DIR is replaced by full path to mount directory, which
+ is created by vifm basing on the value of 'fusehome' option.
+ - %PARAM value is filled from the first line of file (whole line),
+ though in the future it can be changed to whole file content
+ - %CLEAR means that you want to clear screen before running mount
+ command.
+
+ %CLEAR is an optional macro. Other macros are not mandatory, but mount
+ commands likely won't work without them.
+
+ The mounted FUSE file systems will be automatically unmounted in two
+ cases:
+
+ - when vifm quits (with ZZ, :q, etc. or when killed by signal)
+
+ - when you explicitly leave mount point going up to its parent direc‐
+ tory (with h, Enter on "../" or ":cd ..") and other pane is not in
+ the same directory or its child directories.
+
+View look
+ vifm supports displaying of file list view in two different ways:
+
+ - in a table mode, when multiple columns can be set using 'viewcolumns'
+ option (see Column view section below for details);
+
+ - in a multicolumn list manner which looks almost like `ls -x` command
+ output (see ls-like view section below for details).
+
+ The look is local for each view and can be chosen by changing value of
+ the ´lsview' boolean option.
+
+ Depending on view look some of keys change their meaning to allow more
+ natural cursor moving. This concerns mainly h, j, k, l and other simi‐
+ lar navigation keys.
+
+ Also some of options can be ignored if they don't affect view display‐
+ ing in selected look. For example value of 'viewcolumns' when 'lsview'
+ is set.
+
+ls-like view
+ When this view look is enabled by setting 'lsview' option on, vifm will
+ display files in multiple columns. Number of columns depends on the
+ length of the longest file name present in current directory of the
+ view. Whole file list is automatically reflowed on directory change,
+ terminal or view resize.
+
+ View looks close to output of `ls -x` command, so files are listed left
+ to right in rows.
+
+ In this mode file manipulation commands (e.g. d) don't work line-wise
+ like they do in Vim, since such operations would be uncommon for file
+ manipulating tasks. Thus, for example, dd will remove only current
+ file.
+
+Column view
+ View columns are described by a comma-separated list of column descrip‐
+ tions, each of which has the following format
+ [ '-' ] [ fw ( [ '.' tw ] | '%' ) ] '{' type '}' '.'{0,3}
+ where fw stands for full width and tw stands for text width.
+
+ So it basically consists of four parts:
+ 1. Optional alignment specifier
+ 2. Optional width specifier
+ 3. Mandatory column name
+ 4. Optional cropping specifier
+
+ Alignment specifier
+
+ It's an optional minus sign as the first symbol of the string.
+
+ Specifies type of text alignment within a column. Two types are sup‐
+ ported:
+
+ - left align
+ set viewcolumns=-{name}
+
+ - right align (default)
+ set viewcolumns={name}
+
+ Width specifier
+
+ It's a number followed by a percent sign, two numbers (second one
+ should be less than or equal to the first one) separated with a dot or
+ a single number.
+
+ Specifies column width and its units. There are tree size types:
+
+ - absolute size - column width is specified in characters
+ set viewcolumns=-100{name},20.15{ext}
+ results in two columns with lengths of 100 and 20 and a reserved
+ space of five characters on the left of second column.
+
+ - relative (percent) size - column width is specified in percents of
+ view width
+ set viewcolumns=-80%{name},15%{ext},5%{mtime}
+ results in three columns with lengths of 80/100, 15/100 and 5/100 of
+ view width.
+
+ - auto size (default) - column width is automatically determined
+ set viewcolumns=-{name},{ext},{mtime}
+ results in three columns with length of one third of view width.
+ There is no size adjustment to content, since it will slow down ren‐
+ dering.
+
+ Columns of different sizing types can be freely mixed in one view.
+ Though sometimes some of columns can be seen partly or be completely
+ invisible if there is not enough space to display them.
+
+ Column name
+
+ This is just a sort key surrounded with curly braces, e.g.
+ {name},{ext},{mtime}
+ {name} and {iname} keys are the same and present both for consistency
+ with ´sort' option.
+
+ Empty curly braces ({}) are replaced with the default secondary column
+ for primary sort key. So after the next command view will be displayed
+ almost as if 'viewcolumns' is empty, but adding ellipsis for long file
+ names:
+ set viewcolumns=-{name}..,6{}.
+
+ Cropping specifier
+
+ It's from one to three dots after closing curly brace in column format.
+
+ Specifies type of text truncation if it doesn't fix in the column. Cur‐
+ rently tree types are supported:
+
+ - truncation - text is truncated
+ set viewcolumns=-{name}.
+ results in truncation of names that are too long too fit in the view.
+
+ - adding of ellipsis - ellipsis on the left or right are added when
+ needed
+ set viewcolumns=-{name}..
+ results in that ellipsis are added at the end of too long file names.
+
+ - none (default) - text can pass column boundaries
+ set viewcolumns=-{name}...,{ext}
+ results in that long file names can partially be written on the ext
+ column.
+
+Color schemes
+ The color schemes in vifm can be applied in two different ways:
+
+ - as the default (or main) color scheme
+
+ - as local to a panel color scheme
+
+ Both types are set using |vifm-:colorscheme| command, but of different
+ forms:
+
+ - :colorscheme color_scheme_name - for the default color scheme
+
+ - :colorscheme color_scheme_name directory - for local color schemes
+
+ Look of different parts of the TUI (Text User Interface) is determined
+ in this way:
+
+ - Border, TopLineSel, TopLine, CmdLine, ErrorMsg, StatusLine and Wild‐
+ Menu are always determined by the default color scheme
+
+ - CurrLine, Selected, Directory, Link, BrokenLink, Socket, Device, Exe‐
+ cutable, Fifo and Win are determined by default color scheme and a
+ set of local colorschemes, which can be empty
+
+ There might be a set of local color schemes because they are structured
+ hierarchically according to file system structure. For example, having
+ the following piece of file system:
+
+ ~
+ `-- bin
+ |
+ `-- my
+
+ Two color schemes:
+
+ # ~/.vifm/colors/for_bin
+ highlight Win cterm=none ctermfg=white ctermbg=red
+ highlight CurrLine cterm=none ctermfg=red ctermbg=black
+
+ # ~/.vifm/colors/for_bin_my
+ highlight CurrLine cterm=none ctermfg=green ctermbg=black
+
+ And these three commands in the vifmrc file:
+
+ colorscheme Default
+ colorscheme for_bin ~/bin
+ colorscheme for_bin_my ~/bin/my
+
+ File list will look in the following way for each level:
+
+ - ~/ - Default color scheme
+ black background
+ cursor with blue background
+
+ - ~/bin/ - mix of Default and for_bin color schemes
+ red background
+ cursor with black background and red foreground
+
+ - ~/bin/my/ - mix of Default, for_bin and for_bin_my color schemes
+ red background
+ cursor with black background and green foreground
+
+Trash directory
+ vifm has support of trash directory, which is used as temporary storage
+ for deleted files or files that were cut. Using trash is controlled by
+ the ´trash' option, and exact path to the trash can be set with
+ 'trashdir' option. Trash directory in vifm differs from the system-
+ wide one by default, because of possible incompatibilities of storing
+ deleted files among different file managers. But one can set
+ 'trashdir' to "~/.local/share/Trash" to use a "standard" trash direc‐
+ tory.
+
+ There are two scenarios of using trash in vifm:
+
+ 1. As a place for storing files that were cut by "d" and may be
+ inserted to some other place in file system.
+
+ 2. As a storage of files, that are deleted but not purged yet.
+
+ The first scenario uses deletion ("d") operations to put files to trash
+ and put ("p") operations to restore files from trash directory. Note
+ that such operations move files to and from trash directory, which can
+ be long term operations in case of different partitions or remote
+ drives mounted locally.
+
+ The second scenario uses deletion ("d") operations for moving files to
+ trash directory and :empty command-line command to purge all previously
+ deleted files.
+
+ Deletion and put operations depend on registers, which can point to
+ files in trash directory. Normally, there are no nonexistent files in
+ registers, but vifm doesn't keep track of modifications under trash
+ directory, so one shouldn't expect value of registers to be absolutely
+ correct if trash directory was modified not by operation that are meant
+ for it. But this won't lead to any issues with operations, since they
+ ignore nonexistent files.
+
+Client-Server
+ vifm supports remote execution of command-line mode commands as well as
+ remote changing of directories. This is possible using --remote com‐
+ mand-line argument.
+
+ To execute a command remotely combine --remote argument with -c <com‐
+ mand> or +<command>. For example:
+ vifm --remote -c 'cd /'
+ vifm --remote '+cd /'
+
+ To change directory not using command-line mode commands one can spec‐
+ ify paths right after --remote argument, like this:
+ vifm --remote /
+ vifm --remote ~
+ vifm --remote /usr/bin /tmp
+
+ At the moment there is no way of specifying, which instance of vifm
+ should arguments be sent. The main purpose of --remote argument is to
+ provide support of using vifm as a single-instance application.
+
+Plugin
+ Plugin for using vifm in vim as a file selector.
+
+ Commands:
+
+ :EditVifm select a file or files to open in the current buffer.
+ :SplitVifm split buffer and select a file or files to open.
+ :VsplitVifm vertically split buffer and select a file or files to
+ open.
+ :DiffVifm select a file or files to compare to the current file
+ with
+ :vert diffsplit.
+ :TabVifm select a file or files to open in tabs.
+
+ Each command accepts up to two arguments: left pane directory and right
+ pane directory. After arguments are checked, vifm process is spawned
+ in a special "file-picker" mode. To pick files just open them either
+ by pressing l, i or Enter keys, or by running :edit command. If no
+ files are selected, file under the cursor is opened, otherwise whole
+ selection is passed to the plugin and opened in vim.
+
+ The plugin have only two settings. It's a string variable named
+ g:vifm_term to let user specify command to run gui terminal. By
+ default it's equal to ´xterm -e'. And another string variable named
+ g:vifm_exec, which equals "vifm" by default and specifies path to
+ vifm's executable. To pass arguments to vifm use g:vifm_exec_args,
+ which is empty by default.
+
+ To use the plugin copy the vifm.vim file to either the system wide
+ vim/plugin directory or into ~/.vim/plugin.
+
+ If you would prefer not to use the plugin and it is in the system wide
+ plugin directory add
+
+ let loaded_vifm=1
+
+ to your ~/.vimrc file.
+
+Reserved
+ The following command names are reserved and shouldn't be used for user
+ commands.
+
+ g[lobal]
+ v[global]
+
+SEE ALSO
+ Website: http://vifm.sourceforge.net/
+
+ Esperanto translation of the documentation by Sebastian Cyprych:
+ http://cyprych.neostrada.pl/tekstoj/komputiloj/vifm-help.eo.html
+
+AUTHOR
+ Vifm was written by ksteen <ksteen@users.sourceforge.net>
+ And currently is developed by xaizek <xaizek@openmailbox.org>
+
+
+
+ Oct 19, 2013 vifm(1)
diff --git a/.vifm/vifmrc b/.vifm/vifmrc
new file mode 100644
index 0000000..3b4a1be
--- /dev/null
+++ b/.vifm/vifmrc
@@ -0,0 +1,314 @@
+""
+"" ~/.vifm/vifmrc
+""
+"" Weitian LI <liweitianux@gmail.com>
+"" 2014/05/12
+""
+
+""" general settings {{{
+" This is the actual command used to start vi. The default is vim.
+" If you would like to use another vi clone such Elvis or Vile
+" you will need to change this setting.
+set vicmd=vim
+" set vicmd=elvis\ -G\ termcap
+" set vicmd=vile
+
+" Trash Directory
+" The default is to move files that are deleted with dd or :d to
+" the trash directory. If you change this you will not be able to move
+" files by deleting them and then using p to put the file in the new location.
+" I recommend not changing this until you are familiar with vifm.
+" This probably shouldn't be an option.
+set trash
+
+" This is how many directories to store in the directory history.
+set history=100
+
+" Follow links on l or Enter.
+set followlinks
+
+" With this option turned on you can run partially entered commands with
+" unambiguous beginning using :! (e.g. :!Te instead of :!Terminal or :!Te<tab>).
+set fastrun
+
+" Natural sort of (version) numbers within text.
+set sortnumbers
+
+" Maximum number of changes that can be undone.
+set undolevels=100
+
+" If you installed the vifm.txt help file set vimhelp.
+" If would rather use a plain text help file set novimhelp.
+set novimhelp
+
+" If you would like to run an executable file when you
+" press return on the file name set this.
+set norunexec
+
+" Use KiB, MiB, ... instead of KB, MB, ...
+set iec
+
+" Selected color scheme
+"colorscheme Default
+colorscheme alycolors
+
+" The FUSE_HOME directory will be used as a root dir for all FUSE mounts.
+" Unless it exists with write/exec permissions set, vifm will attempt to
+" create it.
+set fusehome=/tmp/vifm_FUSE
+
+" Format for displaying time in file list. For example:
+" TIME_STAMP_FORMAT=%m/%d-%H:%M
+" See man date or man strftime for details.
+set timefmt=%m/%d\ %H:%M
+
+" Show list of matches on tab complition in command-line mode
+set wildmenu
+
+" Ignore case search unless it contains at least one uppercase letter
+set ignorecase
+set smartcase
+
+" Use increment searching (search while typing)
+set incsearch
+
+" Don't highlight search results automatically
+"set nohlsearch
+
+" Try to leave some space from cursor to upper/lower border in lists
+set scrolloff=4
+
+" Don't do to much requests to slow file systems
+set slowfs=curlftpfs
+
+" Set custom status line look
+set statusline=" %t%= %A %10u:%-7g %15s %20d "
+
+" What should be saved automatically between vifm runs
+" Like in previous versions of vifm
+" set vifminfo=options,filetypes,commands,bookmarks,dhistory,state,cs
+" Like in vi
+set vifminfo=dhistory,savedirs,chistory,state,tui,shistory,
+ \phistory,fhistory,dirstack,registers,bookmarks
+""" settings }}}
+
+""" marks {{{
+" :mark mark /full/directory/path [filename]
+mark h ~/
+mark b ~/bin/
+mark d ~/documents/
+mark m ~/music/
+mark o ~/office/
+mark p ~/pictures/
+mark u ~/unix/
+mark x ~/private/
+""" marks }}}
+
+""" mappings {{{
+" to speed up
+nmap ; :
+
+nmap s :shell<cr>
+nmap S :sort<cr>
+nmap w :view<cr>
+nmap o :!gvim --remote-tab-silent %f<cr>
+nmap O :!gvim %f<cr>
+" open file in the background using its default program
+nmap gb :file &<cr>l
+
+" Yank current directory path into the clipboard
+nmap yd :!echo %d | xclip %i<cr>
+
+" Yank current file path into the clipboard
+nmap yf :!echo %c:p | xclip %i<cr>
+
+" Mappings for faster renaming
+nmap I cw<c-a>
+nmap cc cw<c-u>
+nmap A cw<c-w>
+
+" Opening console in current directory
+nmap ,t :!xterm &<cr>
+
+" Opening vim to edit .vifmrc
+nmap ,c :execute ':!vim $MYVIFMRC' | restart<cr>
+" Opening gvim to edit .vifmrc
+nmap ,C :!gvim --remote-tab-silent $MYVIFMRC &<cr>
+
+" Toggle wrap setting on ,w key
+nmap ,w :set wrap!<cr>
+
+nmap <f3> :!less %f<cr>
+nmap <f4> :edit<cr>
+nmap <f5> :copy<cr>
+nmap <f6> :move<cr>
+nmap <f7> :mkdir<space>
+nmap <f8> :delete<cr>
+""" mappings }}}
+
+""" command {{{
+" :com[mand] command_name action
+" The following macros can be used in a command
+" %a is replaced with the user arguments.
+" %c the current file under the cursor.
+" %C the current file under the cursor in the other directory.
+" %f the current selected file, or files.
+" %F the current selected file, or files in the other directory.
+" %b same as %f %F.
+" %d the current directory name.
+" %D the other window directory name.
+" %m run the command in a menu window
+command df df -h %m 2> /dev/null
+command diff vim -d %f %F
+command zip zip -r %f.zip %f
+command run !! ./%f
+command make !!make
+command vgrep vim "+grep %a"
+""" command }}}
+
+""" filetype & fileview {{{
+" The file type is for the default programs to be used with
+" a file extension.
+" :filetype pattern1,pattern2 [{desc}]defaultprogram[ &],[{desc}]program2
+" :fileviewer pattern1,pattern2 consoleviewer
+" The other programs for the file type can be accessed with the :file command
+" The command macros %f, %F, %d, %F may be used in the commands.
+" The % macro is ignored. To use a % you must put %%.
+
+" For automated FUSE mounts, you must register an extension with :file[x]type
+" in one of following formats:
+"
+" :filetype extensions FUSE_MOUNT|some_mount_command using %SOURCE_FILE and %DESTINATION_DIR variables
+" %SOURCE_FILE and %DESTINATION_DIR are filled in by vifm at runtime.
+" A sample line might look like this:
+" :filetype *.zip,*.jar,*.war,*.ear FUSE_MOUNT|fuse-zip %SOURCE_FILE %DESTINATION_DIR
+"
+" :filetype extensions FUSE_MOUNT2|some_mount_command using %PARAM and %DESTINATION_DIR variables
+" %PARAM and %DESTINATION_DIR are filled in by vifm at runtime.
+" A sample line might look like this:
+" :filetype *.ssh FUSE_MOUNT2|sshfs %PARAM %DESTINATION_DIR
+" %PARAM value is filled from the first line of file (whole line).
+" Example first line for SshMount filetype: root@127.0.0.1:/
+"
+" You can also add %CLEAR if you want to clear screen before running FUSE
+" program.
+
+" Pdf
+filetype *.pdf zathura %f,apvlv %f,xpdf %f
+fileview *.pdf pdftotext -nopgbrk %c -
+
+" PostScript
+filextype *.ps,*.ps.gz gv %c %i &
+
+" Djvu
+filextype *.djvu apvlv %f
+
+" Audio
+filetype *.wav,*.mp3,*.flac,*.ogg,*.m4a
+ \ {Play using ffplay}
+ \ ffplay %c,
+ \ {Play using MPlayer}
+ \ mplayer %f,
+fileviewer *.mp3 mp3info
+
+" Video
+filextype *.avi,*.mp4,*.wmv,*.dat,*.3gp,*.ogv,*.mkv,*.mpg,*.vob,*.flv
+ \ {View using ffplay}
+ \ ffplay -fs %c,
+ \ {View using Dragon}
+ \ dragon %f,
+ \ {View using mplayer}
+ \ mplayer %f,
+fileviewer *.avi,*.mp4,*.wmv,*.dat,*.3gp,*.ogv,*.mkv,*.mpg,*.vob
+ \ ffprobe -pretty %c 2>&1
+
+" Web
+filetype *.html,*.htm links,mozilla,uzbl-browser %f %i &
+
+" Object
+filetype *.o nm %f | less
+
+" Image
+filextype *.bmp,*.jpg,*.jpeg,*.png,*.gif,*.xpm
+ \ {View in feh}
+ \ feh -FZ %d --start-at %d/%c 2>/dev/null &,
+ \ {View in sxiv}
+ \ sxiv,
+ \ {View in gpicview}
+ \ gpicview %c,
+fileviewer *.bmp,*.jpg,*.jpeg,*.png,*.gif,*.xpm
+ \ convert -identify %f -verbose /dev/null
+
+" MD5
+filetype *.md5
+ \ {Check MD5 hash sum}
+ \ md5sum -c %f,
+
+" FuseZipMount
+filetype *.zip,*.jar,*.war,*.ear
+ \ {Mount with fuse-zip}
+ \ FUSE_MOUNT|fuse-zip %SOURCE_FILE %DESTINATION_DIR,
+ \ {View contents}
+ \ zip -sf %c | less,
+ \ tar -xf %c,
+fileviewer *.zip,*.jar,*.war,*.ear zip -sf %c
+
+" ArchiveMount
+filetype *.tar.bz2,*.tbz2,*.tgz,*.tar.gz
+ \ {Mount with archivemount}
+ \ FUSE_MOUNT|archivemount %SOURCE_FILE %DESTINATION_DIR,
+fileviewer *.tgz,*.tar.gz tar -tzf %c
+fileviewer *.tar.bz2,*.tbz2 tar -tjf %c
+
+" Rar2FsMount
+filetype *.rar
+ \ {Mount with rar2fs}
+ \ FUSE_MOUNT|rar2fs %SOURCE_FILE %DESTINATION_DIR,
+
+" IsoMount
+filetype *.iso
+ \ {Mount with fuseiso}
+ \ FUSE_MOUNT|fuseiso %SOURCE_FILE %DESTINATION_DIR,
+
+" SshMount
+filetype *.ssh
+ \ {Mount with sshfs}
+ \ FUSE_MOUNT2|sshfs %PARAM %DESTINATION_DIR,
+
+" FtpMount
+filetype *.ftp
+ \ {Mount with curlftpfs}
+ \ FUSE_MOUNT2|curlftpfs -o ftp_port=-,,disable_eprt %PARAM %DESTINATION_DIR,
+
+" Fuse7z
+filetype *.7z
+ \ {Mount with fuse-7z}
+ \ FUSE_MOUNT|fuse-7z %SOURCE_FILE %DESTINATION_DIR,
+
+" Office files
+filextype *.doc,*.docx,*.xls,*.xlsx libreoffice %f &
+fileview *.docx, docx2txt.pl %f -
+
+" Qt projects
+filextype *.pro qtcreator %f &
+
+" Directories
+filextype */
+ \ {View in thunar}
+ \ Thunar %f &,
+fileview .*/,*/ tree %f
+
+" Open all other files with default system programs (you can also remove all
+" :file[x]type commands above to ensure they don't interfere with system-wide
+" settings). By default all unknown files are opened with 'vi[x]cmd'
+" uncommenting one of lines below will result in ignoring 'vi[x]cmd' option
+" for unknown file types.
+" For *nix:
+" filetype * xdg-open
+" For OS X:
+" filetype * open
+" For Windows:
+" filetype * start, explorer
+""" filetype & fileview }}}
+
+" vim: set ts=8 sw=4 tw=78 fenc=utf-8 ft=vifm: "
diff --git a/.xbindkeysrc b/.xbindkeysrc
new file mode 100644
index 0000000..ef89ab1
--- /dev/null
+++ b/.xbindkeysrc
@@ -0,0 +1,104 @@
+# For the benefit of emacs users: -*- shell-script -*-
+###########################
+# xbindkeys configuration #
+###########################
+#
+# Version: 1.8.4
+#
+# If you edit this file, do not forget to uncomment any lines
+# that you change.
+# The pound(#) symbol may be used anywhere for comments.
+#
+# To specify a key, you can use 'xbindkeys --key' or
+# 'xbindkeys --multikey' and put one of the two lines in this file.
+#
+# The format of a command line is:
+# "command to start"
+# associated key
+#
+#
+# A list of keys is in /usr/include/X11/keysym.h and in
+# /usr/include/X11/keysymdef.h
+# The XK_ is not needed.
+#
+# List of modifier:
+# Release, Control, Shift, Mod1 (Alt), Mod2 (NumLock),
+# Mod3 (CapsLock), Mod4, Mod5 (Scroll).
+#
+
+# The release modifier is not a standard X modifier, but you can
+# use it if you want to catch release events instead of press events
+
+# By defaults, xbindkeys does not pay attention with the modifiers
+# NumLock, CapsLock and ScrollLock.
+# Uncomment the lines above if you want to pay attention to them.
+
+#keystate_numlock = enable
+#keystate_capslock = enable
+#keystate_scrolllock= enable
+
+#"xbindkeys_show"
+# control+shift + q
+
+###### music control ###### {{{
+"mpc toggle"
+ m:0x0 + c:172
+ XF86AudioPlay
+
+"mpc stop"
+ m:0x0 + c:174
+ XF86AudioStop
+
+"mpc prev"
+ m:0x0 + c:173
+ XF86AudioPrev
+
+"mpc next"
+ m:0x0 + c:171
+ XF86AudioNext
+###### music }}}
+
+###### volume control ###### {{{
+"amixer sset Master '5%+' unmute"
+ m:0x0 + c:123
+ XF86AudioRaiseVolume
+
+"amixer sset Master '5%-' unmute"
+ m:0x0 + c:122
+ XF86AudioLowerVolume
+
+"amixer sset Master toggle"
+ m:0x0 + c:121
+ XF86AudioMute
+###### volume }}}
+
+###### thinkpad ###### {{{
+## thinkpad special keys require 'thinkpad_acpi' module
+
+# ThinkVantage button
+"dmenu_run"
+ m:0x0 + c:156
+ XF86Launch1
+
+"~/bin/i3lock_exit.sh lock"
+ m:0x10 + c:160
+ Mod2 + XF86ScreenSaver
+
+#"(Scheme function)"
+# m:0x10 + c:220
+# Mod2 + XF86WebCam
+
+"arandr"
+ m:0x10 + c:235
+ Mod2 + XF86Display
+
+# TouchPadToggle
+"synclient TouchpadOff=`synclient -l | grep -c 'TouchpadOff.*=.*0'`"
+ m:0x10 + c:199
+ Mod2 + XF86TouchpadToggle
+
+###### thinkpad ###### }}}
+
+##################################
+# End of xbindkeys configuration #
+##################################
diff --git a/.xinitrc b/.xinitrc
new file mode 100644
index 0000000..bfeb0a2
--- /dev/null
+++ b/.xinitrc
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+# Run all system xinitrc shell scripts.
+xinitdir="/etc/X11/xinit/xinitrc.d"
+if [ -d "$xinitdir" ]; then
+ for script in $xinitdir/*; do
+ echo "Loading xinit script $script"
+ if [ -x "$script" -a ! -d "$script" ]; then
+ . "$script"
+ fi
+ done
+fi
+
+[ -f ~/.Xresources ] && xrdb -merge ~/.Xresources
+
diff --git a/.xprofile b/.xprofile
new file mode 100644
index 0000000..de18e9a
--- /dev/null
+++ b/.xprofile
@@ -0,0 +1,7 @@
+#
+# ~/.xprofile
+#
+
+[ -f ~/.profile ] && . ~/.profile
+
+# vim: set ts=8 sw=4 tw=0 fenc=utf-8 ft=sh: #