diff options
| author | Weitian LI <liweitianux@gmail.com> | 2014-06-13 21:12:21 +0800 | 
|---|---|---|
| committer | Weitian LI <liweitianux@gmail.com> | 2014-06-13 21:12:21 +0800 | 
| commit | 78f7be4e4b6501b15b5fefc9f7824bbadf0daf2a (patch) | |
| tree | b761e28709e4a6f45458c323b8870150827ef831 | |
| parent | e1ce158f65c472b7c8d14c04fce94c85bc881a6c (diff) | |
| download | dotfiles-78f7be4e4b6501b15b5fefc9f7824bbadf0daf2a.tar.bz2 | |
Added various dotfiles.
* Xresources
* profile, xprofile, xinitrc
* bash (aliases, logout, profile, rc, completion)
* gitconfig
* gtkrc and gtk-bookmarks
* i3 configs (with py3status configs)
* i3status.conf
* lftp/rc
* tmux.conf
* xbindkeysrc
* mpdconf
* ncmpcpp (config and keys)
* sbclrc
* vifm (vifmrc, colors)
* urxvt (perl extensions)
* conkyrc (and conky/cronograph configs)
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 @@ -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/°/\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ñol</option>
 +<option value="fr">Français</option>
 +<option value="da">Dansk</option>
 +<option value="pt">Portuguê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ñol (Argentina)</option>
 +<option value="es-mx">Españ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à</option>
 +<option value="pt-br">Portuguê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ÜRKÇE</option>
 +<option value="fr-ca">Franç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>°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>°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>           </span>, °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 ></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>°</span></strong><span class="low"><span>Lo</span> 19<span>°</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>°</span></strong><span class="low"><span>Lo</span> 17<span>°</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>°</span></strong><span class="low"><span>Lo</span> 16<span>°</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>°</span></strong><span class="low"><span>Lo</span> 18<span>°</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>°</span></strong><span class="low"><span>Lo</span> 18<span>°</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>°</span></span> <span class="realfeel">RealFeel® 20<span>°</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° 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 ></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> </th>
 +                            <th>Temp (°C)</th>
 +                          </tr>
 +                        </thead>
 +                        <tbody>
 +                          <tr class="pre">
 +                            <th scope="row">Now</th>
 +                            <td>19°</td>
 +                          </tr>
 +                          <tr class="pre">
 +                            <th scope="row">Yesterday</th>
 +                                <td>21°</td>
 +                          </tr>
 +                          <tr class="pre">
 +                            <th scope="row">RealFeel®</th>
 +                            <td>20°</td>
 +                          </tr>
 +                          <tr class="pre">
 +                            <th scope="row">RealFeel® Shade</th>
 +                            <td>18°</td>
 +                          </tr>
 +                          <tr class="pre">
 +                            <th scope="row">Wind Chill</th>
 +                            <td>19°</td>
 +                          </tr>
 +                          <tr class="last pre">
 +                            <th scope="row">Dew Point</th>
 +                            <td>17°</td>
 +                          </tr>
 +                        </tbody>
 +                      </table>
 +                    </div>
 +                    <div class="rt" style="width:290px;">
 +                      <table cellspacing="0" class="stats">
 +                        <thead>
 +                          <tr>
 +                            <th> </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°</td>
 +                          </tr>
 +                          <tr class="lo">
 +                            <th scope="row"> </th>
 +                            <td>18°</td>
 +                          </tr>
 +                          <tr class="hi">
 +                            <th scope="row" style="border-bottom:2px solid transparent;">Previous 12 Hours</th>
 +                            <td>20°</td>
 +                          </tr>
 +                          <tr class="lo">
 +                            <th scope="row"> </th>
 +                            <td>17°</td>
 +                          </tr>
 +                          <tr class="hi">
 +                            <th scope="row" style="border-bottom:2px solid transparent;">Previous 24 Hours</th>
 +                            <td>22°</td>
 +                          </tr>
 +                          <tr class="lo">
 +                            <th scope="row"> </th>
 +                            <td>17°</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 ></a>
 +            <!-- /.rt -->
 +          </div>
 +
 +          <table cellspacing="0" class="stats">
 +          <thead>
 +          <tr>
 +            <th> </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°</td>
 +
 +				<td class="high">23°</td> 
 +
 +	            <td>N/A</td> 			
 +
 +				    <td>24°</td> 
 +          </tr>
 +
 +          <tr class="last lo">
 +            <th scope="row">Low</th>
 +           <td>19°</td>
 +
 +				<td class="high">16°</td> 
 +
 +	            <td>N/A</td> 			
 +
 +				    <td>18°</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> </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 ></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?&utm_source=adc&utm_medium=ExtraAd&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's Superior Accuracy'}" href="http://enterprisesolutions.accuweather.com/success-stories?utm_source=adc&utm_medium=ExtraAd&utm_content=accuweatheradvantage&utm_campaign=SuccessStories" target="_blank">AccuWeather'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&utm_medium=ExtraAd&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&utm_medium=ExtraAd&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?&utm_source=adc&utm_medium=ExtraAd&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#&panel1-2?&utm_source=adc&utm_medium=ExtraAd&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&utm_medium=ExtraAd&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&utm_medium=ExtraAd&utm_content=skyguardonline&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&utm_medium=ExtraAd&utm_content=longrangeforecasts&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 & 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"> © 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 & 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&cg=0&cc=1&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>°</span></strong><span class="low"><span>Lo</span> 17<span>°</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>°</span></strong><span class="low"><span>Lo</span> 18<span>°</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>°</span></strong><span class="low"><span>Lo</span> 15<span>°</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>°</span></strong><span class="low"><span>Lo</span> 16<span>°</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>°</span></strong><span class="low"><span>Lo</span> 17<span>°</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>°</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>°</span></strong><span class="low"><span>Lo</span> 18<span>°</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>°</span></strong><span class="low"><span>Lo</span> 16<span>°</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>°</span></strong><span class="low"><span>Lo</span> 16<span>°</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>°</span></strong><span class="low"><span>Lo</span> 17<span>°</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.pngBinary files differ new file mode 100644 index 0000000..a8adf65 --- /dev/null +++ b/.conky/cronograph/images/Blank.png diff --git a/.conky/cronograph/images/Blue.png b/.conky/cronograph/images/Blue.pngBinary files differ new file mode 100644 index 0000000..2407cbe --- /dev/null +++ b/.conky/cronograph/images/Blue.png diff --git a/.conky/cronograph/images/Dark_Green.png b/.conky/cronograph/images/Dark_Green.pngBinary files differ new file mode 100644 index 0000000..d40bcc4 --- /dev/null +++ b/.conky/cronograph/images/Dark_Green.png diff --git a/.conky/cronograph/images/Dark_Purple.png b/.conky/cronograph/images/Dark_Purple.pngBinary files differ new file mode 100644 index 0000000..bb5da19 --- /dev/null +++ b/.conky/cronograph/images/Dark_Purple.png diff --git a/.conky/cronograph/images/Green.png b/.conky/cronograph/images/Green.pngBinary files differ new file mode 100644 index 0000000..602ad43 --- /dev/null +++ b/.conky/cronograph/images/Green.png diff --git a/.conky/cronograph/images/Orange.png b/.conky/cronograph/images/Orange.pngBinary files differ new file mode 100644 index 0000000..7574f9c --- /dev/null +++ b/.conky/cronograph/images/Orange.png diff --git a/.conky/cronograph/images/Pink.png b/.conky/cronograph/images/Pink.pngBinary files differ new file mode 100644 index 0000000..6d2d973 --- /dev/null +++ b/.conky/cronograph/images/Pink.png diff --git a/.conky/cronograph/images/Purple.png b/.conky/cronograph/images/Purple.pngBinary files differ new file mode 100644 index 0000000..e8c58e7 --- /dev/null +++ b/.conky/cronograph/images/Purple.png diff --git a/.conky/cronograph/images/Red.png b/.conky/cronograph/images/Red.pngBinary files differ new file mode 100644 index 0000000..d2673e6 --- /dev/null +++ b/.conky/cronograph/images/Red.png diff --git a/.conky/cronograph/images/Yellow.png b/.conky/cronograph/images/Yellow.pngBinary files differ new file mode 100644 index 0000000..8e2f62c --- /dev/null +++ b/.conky/cronograph/images/Yellow.png 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.pngBinary files differ new file mode 100644 index 0000000..468b1a9 --- /dev/null +++ b/.i3/images/wallpaper.png 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: # @@ -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: # | 
