aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Runge <david.runge@frqrec.com>2013-11-03 12:30:45 +0100
committerDavid Runge <david.runge@frqrec.com>2013-11-03 12:30:45 +0100
commit67b0ec5741d327d27afe88783d85fcf2c4c4f204 (patch)
tree4ea47807c5e775927b96eb79933c09fbfcd0468e
downloaddotfiles-67b0ec5741d327d27afe88783d85fcf2c4c4f204.tar.gz
dotfiles-67b0ec5741d327d27afe88783d85fcf2c4c4f204.tar.bz2
dotfiles-67b0ec5741d327d27afe88783d85fcf2c4c4f204.tar.xz
dotfiles-67b0ec5741d327d27afe88783d85fcf2c4c4f204.zip
First commit
-rw-r--r--.Xresources151
-rw-r--r--.inputrc3
-rw-r--r--.octaverc18
-rw-r--r--.scvimrc67
-rw-r--r--.tmux.conf117
-rw-r--r--.vimrc.after15
-rwxr-xr-x.xinitrc22
-rw-r--r--.zsh.after/aliases.sh36
-rw-r--r--.zsh.after/aliases.zsh68
-rw-r--r--.zsh.after/export.zsh6
-rw-r--r--.zsh.after/functions.zsh182
-rw-r--r--.zsh.after/key-bindings.zsh22
-rw-r--r--.zsh.after/prompt.zsh1
-rw-r--r--.zsh.after/unixpool.sh116
-rw-r--r--.zsh.after/unixpool.zsh5
-rw-r--r--.zsh.before/aliases.zsh1
-rw-r--r--.zsh.before/functions.zsh4
-rw-r--r--.zsh.before/keychain.zsh.off4
-rw-r--r--.zsh.before/path.zsh16
-rw-r--r--.zshrc16
-rwxr-xr-xbin/androidbackup.sh143
-rwxr-xr-xbin/atmux122
-rwxr-xr-xbin/autostart4
-rw-r--r--bin/backup-profiles10
-rwxr-xr-xbin/functions.sh176
-rwxr-xr-xbin/helloworld.sh2
-rw-r--r--bin/letter71
-rwxr-xr-xbin/mirssi12
-rw-r--r--bin/mpc38
-rwxr-xr-xbin/notify_irssi_server.pl62
-rwxr-xr-xbin/notify_mpd45
-rwxr-xr-xbin/run_once4
-rwxr-xr-xbin/scvim-test7
-rwxr-xr-xbin/set_volume50
-rw-r--r--bin/stikked115
-rw-r--r--bin/supercollider.vim347
-rw-r--r--bin/syncmpdpl209
-rwxr-xr-xbin/tmux-test53
-rw-r--r--bin/torrentSort.py220
39 files changed, 2560 insertions, 0 deletions
diff --git a/.Xresources b/.Xresources
new file mode 100644
index 0000000..64d8949
--- /dev/null
+++ b/.Xresources
@@ -0,0 +1,151 @@
+! .Xresources - konni 2012-11-30
+!!=====================================================================
+!! * uses rxvt-unicode
+!! * themed for solarized
+!! * includes font settings for powerline
+!! * some xscreensaver theming
+
+!! SOLARIZED COLORS ----------------------------------------------------
+!! http://github.com/altercation/solarized
+
+! black dark/light
+*color0 : #073642
+*color8 : #002b36
+
+! red dark/light
+*color1 : #dc322f
+*color9 : #cb4b16
+
+! green dark/light
+*color2 : #859900
+*color10 : #b3cd01
+
+! yellow dark/light
+*color3 : #b58900
+*color11 : #f4c32f
+
+! blue dark/light
+*color4 : #268bd2
+*color12 : #30a6f8
+
+! magenta dark/light
+*color5 : #d33682
+*color13 : #6c71c4
+
+! cyan dark/light
+!*color6 : #2aa198
+*color6 : #00afff
+*color14 : #69b3ad
+
+! white dark/light
+*color7 : #eee8d5
+*color15 : #fdf6e3
+!! ---------------------------------------------------------------------
+
+
+!! Xft -----------------------------------------------------------------
+Xft.antialias : true
+Xft.autohint : true
+Xft.hinting : true
+Xft.hintstyle : hintslight
+Xft.dpi : 96
+Xft.rgba : rgb
+Xft.lcdfilter : lcddefault
+!! ---------------------------------------------------------------------
+
+!! URxvt FONT ----------------------------------------------------------
+!! Anonymous Pro - very small dots
+URxvt*font : xft:Anonymous Pro for Powerline:regular:size=11
+URxvt*imFont : xft:Anonymous Pro for Powerline:regular:size=11
+URxvt*boldFont : xft:Anonymous Pro for Powerline:bold:size=11
+URxvt*italicFont : xft:Anonymous Pro for Powerline:italic:size=11
+URxvt*boldItalicFont : xft:Anonymous Pro for Powerline:bold:italic:size=11
+
+!! Inconsolata
+!URxvt*font : xft:Inconsolata for Powerline:regular:size=12
+!URxvt*imFont : xft:Inconsolata for Powerline:regular:size=12
+!URxvt*boldFont : xft:Inconsolata for Powerline:bold:size=12
+!URxvt*italicFont : xft:Inconsolata for Powerline:italic:size=12
+!URxvt*boldItalicFont : xft:Inconsolata for Powerline:bold:italic:size=12
+
+!! Monaco
+!URxvt*font : xft:Monaco for Powerline:regular:size=10
+!URxvt*imFont : xft:Monaco for Powerline:regular:size=10
+!URxvt*boldFont : xft:Monaco for Powerline:bold:size=10
+!URxvt*italicFont : xft:Monaco for Powerline:italic:size=10
+!URxvt*boldItalicFont : xft:Monaco for Powerline:bold:italic:size=10
+
+!! URxvt COLORS---------------------------------------------------------
+URxvt*depth : 32
+URxvt.foreground : #a4b6bd
+URxvt*background : rgba:0000/0000/0000/bbbb
+URxvt.fading : 15
+URxvt.fadeColor : #121212
+URxvt.scrollBar : false
+URxvt*visualBell : false
+
+!! URxvt HIGHLIGHTING --------------------------------------------------
+URxvt.perl-ext-common : default,matcher
+URxvt.matcher.button : 1
+URxvt.url-launcher : firefox
+URxvt.colorUL : #268bd2
+
+!! BUFFER AND SCROLLING ------------------------------------------------
+URxvt.saveLines : 65536
+URxvt*scrollTtyOutput : false
+URxvt*scrollWithBuffer : true
+URxvt*scrollTtyKeypress : true
+
+!! CURSOR AND POINTER --------------------------------------------------
+URxvt.cursorBlink : false
+URxvt.cursorColor : #268bd2
+URxvt.cursorColor2 : #4e4e4e
+URxvt.cursorUnderline : false
+URxvt.pointerColorBackground : #586e75
+URxvt.pointerColorForeground : #93a1a1
+URxvt.pointerBlank : false
+!! ---------------------------------------------------------------------
+
+
+!! xscreensaver FONT ---------------------------------------------------
+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-*-*-*-*-*-*-*
+
+!! xscreensaver DIALOG BOX ---------------------------------------------
+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
+
+!! xscreensaver INPUT BOX ----------------------------------------------
+xscreensaver.Dialog.text.foreground : #666666
+xscreensaver.Dialog.text.background : #ffffff
+xscreensaver.Dialog.internalBorderWidth : 24
+xscreensaver.Dialog.borderWidth : 20
+xscreensaver.Dialog.shadowThickness : 2
+
+!! xscreensaver TIMEOUT BAR --------------------------------------------
+xscreensaver.passwd.thermometer.foreground : #ff0000
+xscreensaver.passwd.thermometer.background : #000000
+xscreensaver.passwd.thermometer.width : 8
+
+!! xscreensaver DATESTAMP FORMAT ---------------------------------------
+xscreensaver.dateFormat : %I:%M%P %a %b %d, %Y
+
+!! xscreensaver LIGHTDM COMPATIBILITY ----------------------------------
+xscreensaver.newLoginCommand : dm-tool switch-to-greeter
+
+!! XTERM KEY CODES
+!URxvt.keysym.Control-Up : [1;5A]
+!URxvt.keysym.Control-Down : [1;5B]
+!URxvt.keysym.Control-Left : [1;5D]
+!URxvt.keysym.Control-Right : [1;5C]
+URxvt.keysym.Control-Shift-C : perl:clipboard:copy
+URxvt.keysym.Control-Shift-V : perl:clipboard:paste
diff --git a/.inputrc b/.inputrc
new file mode 100644
index 0000000..b08c839
--- /dev/null
+++ b/.inputrc
@@ -0,0 +1,3 @@
+#set editing-mode vi
+"\C-p": previous-history
+"\C-n": next-history
diff --git a/.octaverc b/.octaverc
new file mode 100644
index 0000000..2b57141
--- /dev/null
+++ b/.octaverc
@@ -0,0 +1,18 @@
+# Set up a prettier prompt
+PS1('\[\e[0;32m\]\u\[\e[m\]\[\e[1;37m\]@\[\e[m\]\[\e[1;35m\]octave\[\e[m\] \[\e[1;34m\]\W\[\e[m\] \[\e[1;32m\]\$ \[\e[m\]')
+# Editor settings
+edit author "David Runge"
+edit email "<david.runge@campus.tu-berlin.de>"
+edit license "GPL"
+edit editor "urxvt -e vim %s"
+# don't wait for the editor to return
+edit mode async
+# Load packages
+pkg load general
+pkg load signal
+pkg load data-smoothing
+pkg load communications
+# Java settings
+javaaddpath('/usr/local/lib/java/jOpenDocument-1.3b1.jar');
+javaaddpath('/usr/local/lib/java/odfdom-java-0.8.7.jar');
+javaaddpath('/usr/local/lib/java/xercesImpl.jar');
diff --git a/.scvimrc b/.scvimrc
new file mode 100644
index 0000000..b172bdf
--- /dev/null
+++ b/.scvimrc
@@ -0,0 +1,67 @@
+let g:sclangKillOnExit = 1
+let g:sclangTerm = "urxvt -e"
+"let g:sclangTerm = "tmux send-keys -t 1"
+let g:sclangPipeLoc = "/tmp/sclang-pipe"
+let g:sclangPipeAppPidLoc = "/tmp/sclangpipe_app-pid"
+
+au BufWinEnter,BufNewFile,BufRead *.sc set filetype=supercollider
+au BufWinEnter,BufNewFile,BufRead *.sc let &iskeyword="@,48-57,_,192-255" | runtime ftplugin/supercollider.vim
+au BufWinEnter,BufNewFile,BufRead *.sc set sw=2 ts=2 autoindent "this line can be changed however you like
+
+"sc help files
+au BufWinEnter,BufNewFile,BufRead *.scd set filetype=supercollider
+au BufWinEnter,BufNewFile,BufRead *.scd let &iskeyword="@,48-57,_,192-255,-,|" | runtime ftplugin/supercollider.vim
+au BufWinEnter,BufNewFile,BufRead *.scd set sw=2 ts=2 autoindent "this line can be changed however you like
+
+" ================ Indentation ======================
+
+set autoindent
+set smartindent
+set smarttab
+set shiftwidth=2
+set softtabstop=2
+set tabstop=2
+set expandtab
+
+filetype plugin on
+filetype indent on
+
+" Display tabs and trailing spaces visually
+set list listchars=tab:\ \ ,trail:·
+
+set nowrap "Don't wrap lines
+set linebreak "Wrap lines at convenient points
+
+
+"required for matching
+au Filetype supercollider,supercollider_help let b:match_skip = 's:scComment\|scString\|scSymbol'
+au Filetype supercollider,supercollider_help let b:match_words = '(:),[:],{:}'
+
+"indenting if you want it
+"au BufEnter,BufWinEnter,BufNewFile,BufRead *.sc runtime indent/sc_indent.vim
+
+
+"supercollider vim keybindings
+"expand('<cword>') gives current word under cursor without having to yank
+
+au Filetype supercollider,supercollider_help nmap <buffer> K :call SChelp(expand('<cword>'))<CR>
+au Filetype supercollider,supercollider_help imap <buffer>  :call SChelp(expand('<cword>'))<CR>
+au Filetype supercollider,supercollider_help nmap <buffer> :call SCdef(expand('<cword>'))<CR>
+au Filetype supercollider,supercollider_help imap <buffer> :call SCdef(expand('<cword>'))<CR>
+au Filetype supercollider,supercollider_help nmap <buffer> <F1> :call HelpBrowser(expand('<cword>'))<CR>
+au Filetype supercollider,supercollider_help imap <buffer> <F1> :call HelpBrowser(expand('<cword>'))<CR>a
+au Filetype supercollider,supercollider_help vmap <buffer> <F1> :call HelpBrowser(expand('<cword>'))<CR>
+au Filetype supercollider,supercollider_help nmap <buffer> <F5> :call SClang_block()<CR>
+au Filetype supercollider,supercollider_help imap <buffer> <F5> :call SClang_block()<CR>a
+au Filetype supercollider,supercollider_help vmap <buffer> <F5> :call SClang_send()<CR>
+au Filetype supercollider,supercollider_help vmap <buffer> <F6> :call SClang_send()<CR>
+au Filetype supercollider,supercollider_help nmap <buffer> <F6> :call SClang_send()<CR>
+au Filetype supercollider,supercollider_help imap <buffer> <F6> :call SClang_send()<CR>a
+au Filetype supercollider,supercollider_help nmap <buffer> <F7> :call SClang_TempoClock_clear()<CR>
+au Filetype supercollider,supercollider_help imap <buffer> <F7> :call SClang_TempoClock_clear()<CR>a
+au Filetype supercollider,supercollider_help nmap <buffer> <F8> :call SClang_free("s")<CR>
+au Filetype supercollider,supercollider_help imap <buffer> <F8> :call SClang_free("s")<CR>a
+au Filetype supercollider,supercollider_help nmap <buffer> <F12> :call SClang_thisProcess_stop()<CR>
+au Filetype supercollider,supercollider_help imap <buffer> <F12> :call SClang_thisProcess_stop()<CR>a
+
+"end of scvim (supercollider vim)
diff --git a/.tmux.conf b/.tmux.conf
new file mode 100644
index 0000000..eb33da1
--- /dev/null
+++ b/.tmux.conf
@@ -0,0 +1,117 @@
+# Ring the bell if any background window rang a bell
+set -g bell-action any
+
+# Default termtype. If the rcfile sets $TERM, that overrides this value.
+set -g default-terminal "screen-256color"
+
+# split windows like vim
+# vim's definition of a horizontal/vertical split is reversed from tmux's
+bind s split-window -v
+bind v split-window -h
+
+# move around panes with hjkl, as one would in vim after pressing ctrl-w
+bind h select-pane -L
+bind j select-pane -D
+bind k select-pane -U
+bind l select-pane -R
+
+# Create splits and vertical splits
+bind-key v split-window -h
+bind-key s split-window
+
+# Pane resize in all four directions using vi bindings.
+# Can use these raw but I map them to shift-ctrl-<h,j,k,l> in iTerm.
+bind-key J resize-pane -D
+bind-key K resize-pane -U
+bind-key H resize-pane -L
+bind-key L resize-pane -R
+# Fix ctrl + L/R
+#bind-key -n C-Right send-keys w
+#bind-key -n C-Left send-keys b
+
+# setting titles on
+set -g set-titles on
+set -g set-titles-string "#T"
+
+set base-index 1
+set -g history-limit 10000
+set-window-option -g xterm-keys on #pass xterminal keys to tmux terminals
+setw -g mode-mouse on
+
+#new -n Irssi irssi
+#neww -n Serv htop
+#neww -n Shell
+
+#Help
+# c Create a new window
+# n Change to next window
+# p Change to previous window
+# " Split pane horizontally
+# % Split pane vertically
+# , Rename current window
+# o Move to next pane
+# unbind C-b Unbind Control-Key
+# set -g prefix C-a Bind to new Control-Key
+# Ctrl-b l (Move to the previously selected window)
+# Ctrl-b w (List all windows / window numbers)
+# Ctrl-b <window number> (Move to the specified window number, the default bindings are from 0 – 9)
+# Ctrl-b q (Show pane numbers, when the numbers show up type the key to goto that pane)
+# Ctrl-b f <window name> (Search for window name)
+# Ctrl-b w (Select from interactive list of windows)
+
+
+
+
+# Keep your finger on ctrl, or don't
+bind-key ^D detach-client
+
+# Use vi keybindings for tmux commandline input.
+# Note that to get command mode you need to hit ESC twice...
+set -g status-keys vi
+
+# Use vi keybindings in copy and choice modes
+setw -g mode-keys vi
+
+# set first window to index 1 (not 0) to map more to the keyboard layout...
+set -g base-index 1
+
+# color scheme (styled as vim-powerline)
+set -g status-left-length 52
+set -g status-right-length 451
+set -g status-fg white
+set -g status-bg colour234
+set -g pane-border-fg colour245
+set -g pane-active-border-fg colour39
+set -g message-fg colour16
+set -g message-bg colour221
+set -g message-attr bold
+set -g status-left '#[fg=colour235,bg=colour252,bold] #S #[fg=colour252,bg=colour238,nobold]⮀#[fg=colour245,bg=colour238,bold] #(whoami) #[fg=colour238,bg=colour234,nobold]⮀'
+set -g status-right '#[fg=colour234,bg=colour39]⮀#[fg=colour234,bg=colour39] #(tmux-mem-cpu-load 2 0) #[fg=colour39,bg=colour234]⮀#[fg=colour39,bg=colour234] %H:%M ⮂'
+set -g window-status-format "#[fg=colour235,bg=colour252,bold] #I #W "
+set -g window-status-current-format "#[fg=colour234,bg=colour39]⮀#[fg=black,bg=colour39,noreverse,bold] #I: #W #[fg=colour39,bg=colour234,nobold]⮀"
+
+# No escape time for vi mode
+set -sg escape-time 0
+
+# next/prev window
+bind-key -n M-k next-window
+bind-key -n M-j previous-window
+
+# select windows
+bind-key -n M-1 select-window -t 1
+bind-key -n M-2 select-window -t 2
+bind-key -n M-3 select-window -t 3
+bind-key -n M-4 select-window -t 4
+bind-key -n M-5 select-window -t 5
+bind-key -n M-6 select-window -t 6
+bind-key -n M-7 select-window -t 7
+bind-key -n M-8 select-window -t 8
+bind-key -n M-9 select-window -t 9
+bind-key -n M-0 select-window -t 0
+
+# Reload config
+bind r source-file ~/.tmux.conf
+
+# Swap windows
+bind-key m command-prompt -p "move window to:" "swap-window -t '%%'"
+
diff --git a/.vimrc.after b/.vimrc.after
new file mode 100644
index 0000000..d28562b
--- /dev/null
+++ b/.vimrc.after
@@ -0,0 +1,15 @@
+"" SEEMS IRRELEVANT
+"" always show modeline
+"set ls=2
+
+" show cursorline
+set cursorline
+
+" colorscheme
+let g:solarized_termcolors=256
+let g:solarized_termtrans=1
+set background=dark
+"colorscheme solarized
+
+"dont show the error list automatically
+"let g:syntastic_auto_loc_list=0
diff --git a/.xinitrc b/.xinitrc
new file mode 100755
index 0000000..ee125fc
--- /dev/null
+++ b/.xinitrc
@@ -0,0 +1,22 @@
+#!/bin/sh
+# Start a D-Bus session
+#source /etc/X11/xinit/xinitrc.d/30-dbus
+#Start GNOME Keyring
+#val $(/usr/bin/gnome-keyring-daemon --start --components=gpg,pkcs11,secrets,ssh)
+ #You probably need to do this too:
+ # export GNOME_KEYRING_CONTROL GNOME_KEYRING_PID GPG_AGENT_INFO SSH_AUTH_SOCK
+
+
+ #X11 keyboard maps
+ setxkbmap -layout de
+ setxkbmap -option ''
+ setxkbmap -option 'grp:alt_space_toggle'
+ setxkbmap -option 'grp:shift_toggle'
+ setxkbmap -option 'grp_led:caps'
+ setxkbmap -option 'caps:escape'
+ #setxkbmap -option 'ctrl:swapcaps'
+ #setxkbmap -option 'ctrl:nocaps'
+
+ #if [ -f $HOME/.Xmodmap ]; then
+ # /usr/bin/xmodmap $HOME/.Xmodmap
+ #fi
diff --git a/.zsh.after/aliases.sh b/.zsh.after/aliases.sh
new file mode 100644
index 0000000..d6946c7
--- /dev/null
+++ b/.zsh.after/aliases.sh
@@ -0,0 +1,36 @@
+# < ALIASES
+## ANDROID
+ alias logcats='adb logcat QMI-RIL:S QMI_FW:S QC-QDI:S QC-NETMGR:S QC-time-services:S LocSvc_api_v02:S LocSvc_utils_q:S LocSvc_utils_ll:S LocSvc_eng:S LocSvc_adapter:S GpsLocationProvider:S AK8975:S dalvikvm:S dalvikvm-heap:S alsa_ucm:S rmt_storage:S ALSAModule:S Adreno200-EGLSUB:S NetworkManagementSocketTagger:S LocationManagerService:S Sensors:S AudioStreamOutALSA:S'
+ alias fastbootx="fastboot -i 0x0fce"
+ alias vlog="vim \$(ls -1tr *.log | tail -n 1)"
+
+## CUSTOM COMMANDS
+ alias lsmnt='mount | grep \/dev\/sd'
+
+## HELP
+ alias helpdd='echo dd if=bla | pv -s 10M | dd of=blob'
+
+## PACMAN/APT-GET
+ alias Syu='sudo pacman -Syu'
+ alias S='sudo pacman -S $@'
+ alias apt-get='sudo apt-get -o Acquire::http::Pipeline-Depth=0'
+
+## SHELL
+ alias .='source'
+ alias ls='ls --group-directories-first --color=auto'
+ alias l='ls'
+ alias lt='ls -tr'
+ alias ll='ls -l'
+ alias llh='ls -lh'
+ alias llt='ls -ltr'
+ alias la='ls -A'
+ alias lla='ls -lA'
+ alias grep='grep --color=auto --exclude-dir=.git'
+ alias psgrep='ps xa | grep $1'
+
+ alias beep="xset b 100 400 50; echo -e '\a'; xset b off"
+
+## SHORTCUTS
+ alias ncm=ncmpcpp
+ alias cu_omnomnom='cu -s 115200 -l ttyUSB0'
+# ALIASES >
diff --git a/.zsh.after/aliases.zsh b/.zsh.after/aliases.zsh
new file mode 100644
index 0000000..afed6ff
--- /dev/null
+++ b/.zsh.after/aliases.zsh
@@ -0,0 +1,68 @@
+# < ZSH ALIASES
+## SOURCE ALIASES
+#[ -e $HOME/.zsh.after/aliases.sh ] && source $HOME/.zsh.after/aliases.sh
+## EXTENSIONS
+alias -s pdf='mupdf'
+alias -s ps='mupdf'
+alias -s jpg='feh'
+alias -s png='feh'
+alias -s gif='viewnior'
+alias -s gz='tar xvfz'
+alias -s tgz='tar xvfz'
+alias -s bz2='tar xvfj'
+alias -s tbz='tar xvfj'
+alias -s tlz='tar --lzma -xvf'
+alias -s rar='unrar x'
+alias -s tex='mkpdf'
+
+[ -e ~/Dropbox/sync/archlinux ] && source ~/Dropbox/sync/archlinux/handies.bashrc && source ~/Dropbox/sync/archlinux/color.bashrc && source ~/Dropbox/sync/archlinux/pacman.bashrc && source ~/Dropbox/sync/archlinux/systemd.bashrc
+
+alias cpx="xclip -selection clipboard"
+
+#load bluetooth headphone module for pulseaudio
+alias bthp="pactl load-module module-bluetooth-device address='00:1B:66:01:6C:D1'"
+#dir aliases
+alias cd.sdu="cd /etc/systemd/system"
+alias cd.sds="cd /usr/lib/systemd/system"
+alias cd.courses="cd /home/dave/Dropbox/tu-berlin/courses"
+alias cd.cks="cd /home/dave/Dropbox/tu-berlin/courses/SE\ Klanganalyse\ und\ Synthese/project"
+alias cd.cksp="cd /home/dave/Dropbox/tu-berlin/courses/SE\ Klanganalyse\ und\ Synthese/paper"
+alias cd.atlab="cd /home/dave/Dropbox/tu-berlin/courses/PR\ Audiotechnik"
+alias cd.atue="cd /home/dave/Dropbox/tu-berlin/courses/UE\ Audiotechnik\ 2"
+alias cd.semin="cd /home/dave/Dropbox/tu-berlin/courses/SE\ Minimal\ music\ and\ art"
+alias cd.sere="cd /home/dave/Dropbox/tu-berlin/courses/SE\ Digital\ reenactments\ of\ scores\ originally\ requiring\ analog\ electronics"
+alias cd.seti="cd /home/dave/Dropbox/tu-berlin/courses/SE\ Time\ and\ space\ perceptions\ in\ sound\ installations"
+alias cd.archlinux="cd /home/dave/Dropbox/software/archlinux"
+alias cd.syncarchlinux="cd /home/dave/Dropbox/sync/archlinux"
+alias cd.scpref="cd /home/dave/.config/SuperCollider"
+
+#program aliases
+alias octave="octave --silent --braindead"
+alias matlabc="matlab -nodesktop -nosplash"
+alias "dropbox restart"="dropbox stop && dropbox start"
+
+#nmcli aliases
+alias nmup="sudo nmcli con up id"
+
+#ssh aliases
+alias pool='ssh pool -Y'
+alias sshtunnel="ssh -ND 44350 -v -p 46399 dave@frqb.zapto.org" # tunnel through home
+alias frqtun="ssh -ND 44350 -v frq"
+alias scp=scp
+
+#wake on lan aliases
+alias woldave_in='wol -i dave 00:15:f2:e0:e0:c6'
+alias woldave_ex='wol -p X -i frqb.zapto.org 00:15:f2:e0:e0:c6'
+
+#truecrypt mount aliases
+alias tc.fav='truecrypt -t --protect-hidden=no -k="" --auto-mount=favorites'
+alias tc.v='truecrypt -t --mount --fs-options=users,uid=$(id -u),gid=$(id -g),fmask=0113,dmask=0002 --protect-hidden=no -k="" /dev/disk/by-id/ata-ST9500325AS_6VE457TN /mnt/photos'
+alias tc.m='truecrypt -t --mount --fs-options=users,uid=$(id -u),gid=$(id -g),fmask=0113,dmask=0002 --protect-hidden=no -k="" /dev/disk/by-id/ata-ST9500325AS_6VE152RS /mnt/music'
+alias tc.d='truecrypt -t -d'
+
+## OVERRIDES
+ alias du='du -h'
+ unalias vim
+ unalias brew
+# unalias scp
+# ZSH ALIASES >
diff --git a/.zsh.after/export.zsh b/.zsh.after/export.zsh
new file mode 100644
index 0000000..81f117c
--- /dev/null
+++ b/.zsh.after/export.zsh
@@ -0,0 +1,6 @@
+export REPORTTIME=30
+export PAGER="less -j4"
+
+## let RVM ignore global ruby
+export rvm_ignore_gemrc_issues=1
+
diff --git a/.zsh.after/functions.zsh b/.zsh.after/functions.zsh
new file mode 100644
index 0000000..1a87ab5
--- /dev/null
+++ b/.zsh.after/functions.zsh
@@ -0,0 +1,182 @@
+# < FUNCTIONS
+
+## BACKUP
+ function etcbackup() {
+ BACKUPDIR=$HOME/dropbox/backup
+ HOSTNAME=$(hostname)
+ FILE=$1
+
+ if [ -f $FILE ]
+ then
+ FILENAME=$(echo $FILE | sed 's/\///' | sed 's/\//_/g')
+ cp -v $FILE $BACKUPDIR/$HOSTNAME/$FILENAME
+ else
+ echo $FILE does not exist
+ fi
+ }
+
+## COMPRESSION
+ function tar_tgz {
+ tar cvfz $1.tgz $1
+ }
+ function tar_tbz {
+ tar cvfj $1.tbz $1
+ }
+ function tar_tlz {
+ tar --lzma -cvf $1.tlz $1
+ }
+
+## DOTFILES
+ function update_dot() {
+ for i in $HOME/dropbox/dot/[a-zA-Z]*;
+ do
+ if [ -f $i ];
+ then
+ echo file $i
+ base=`basename $i`
+ dst=$HOME/.$base
+ bak=$HOME/.${base}_bak
+
+ case $base in
+ vimrc|zshrc|*tgz)
+ echo nothing $i
+ ;;
+ *)
+ if [ -L $dst ];
+ then
+ rm $dst
+ else
+ mv $dst $bak
+ fi
+ ln -s $i $dst
+ ;;
+ esac
+
+ else
+ if [ -d $i ];
+ then
+ echo dir $i
+ base=`basename $i | sed 's/_/\//'`
+ dst=$HOME/.$base
+ bak=$HOME/.${base}_bak
+
+ case $base in
+ "vim")
+ echo nothing $i
+ ;;
+ *)
+ if [ -e $dst ];
+ then
+ if [ -L $dst ];
+ then
+ rm $dst
+ else
+ mv $dst $bak
+ fi
+ fi
+ ln -s $i $dst
+ ;;
+ esac
+ else
+ echo unknown $i
+ fi
+ fi
+ done
+ }
+
+## PDF/LATEX
+ function mkpdf()
+ {
+ pdflatex -shell-escape $1
+ # latex --output-format=pdf $1
+ name=`echo $1 | sed 's/.tex//'`
+ EXT=(aux log)
+ for i in $EXT;
+ do
+ rm -v $name.$i
+ done
+ }
+
+ function gsmerge()
+ {
+ target=$1
+ echo "target: $target"
+ sleep 1
+ shift
+
+ /usr/bin/gs \
+ -sDEVICE=pdfwrite \
+ -dCompatibilityLevel=1.4 \
+ -dNOPAUSE \
+ -dBATCH \
+ -sPAPERSIZE=a4 \
+ -sOUTPUTFILE=$target $*
+ }
+
+ function gsmerge_medium()
+ {
+ target=$1
+ echo "target: $target"
+ sleep 1
+ shift
+
+ /usr/bin/gs \
+ -sDEVICE=pdfwrite \
+ -dPDFSETTINGS=/ebook \
+ -dCompatibilityLevel=1.4 \
+ -dNOPAUSE \
+ -dBATCH \
+ -sPAPERSIZE=a4 \
+ -sOutputFile=$target $*
+ }
+
+## USABILITY
+ function lvim()
+ {
+ noglob vim $(echo $1 | awk -F":" '{ print $1" +"$2 }' )
+ }
+
+ function mkcd()
+ {
+ mkdir $1
+ cd $1
+ }
+
+ function cpwd()
+ {
+ pwd >! /tmp/pwd
+ }
+
+ function ppwd()
+ {
+ cd "`cat /tmp/pwd`"
+ }
+
+ function cp2wd()
+ {
+ cp $@ "`cat /tmp/pwd`"
+ }
+
+function publish() {
+ [ -f $1 ] || return
+
+ DIR=`dirname $1`
+ FILE=`basename $1`
+ mute pushd $DIR
+ scp $FILE pool:public_html/
+ echo "http://www-pool.math.tu-berlin.de/~runge/$FILE"
+ echo "http://www-pool.math.tu-berlin.de/~runge/$FILE"|xcp
+ mute popd
+}
+
+function securium {
+ port=44350
+ chromium --proxy-server="socks://localhost:$port" &
+ exit
+}
+
+## ZSH
+ refresh() {
+ source $HOME/.zshrc
+ }
+# FUNCTIONS >
diff --git a/.zsh.after/key-bindings.zsh b/.zsh.after/key-bindings.zsh
new file mode 100644
index 0000000..300b3c7
--- /dev/null
+++ b/.zsh.after/key-bindings.zsh
@@ -0,0 +1,22 @@
+## OVERRIDE KEY-BINDINGS
+bindkey -s '\e,' '..\n' # [Esc-,] - run command: .. (up directory)
+bindkey '\e.' insert-last-word # [Esc-.] - insert last word
+#bindkey '^[Oc' forward-word # [Ctrl-RightArrow] - move forward one word
+#bindkey '^[OC' forward-word # [Ctrl-RightArrow] - move forward one word
+#bindkey '^[Od' backward-word # [Ctrl-LeftArrow] - move backward one word
+#bindkey '^[OD' backward-word # [Ctrl-LeftArrow] - move backward one word
+
+## URXVT & TMUX
+case $TERM in
+ rxvt-unicode-256color)
+ bindkey '^[Oc' forward-word # [Ctrl-RightArrow] - move forward one word
+ bindkey '^[Od' backward-word # [Ctrl-LeftArrow] - move backward one word
+ ;;
+ screen-256color)
+ bindkey '^[[1;5C' forward-word # [Ctrl-RightArrow] - tmux: move forward one word
+ bindkey '^[[1;5D' backward-word # [Ctrl-LeftArrow] - tmux: move backward one word
+ ;;
+esac
+
+## NEW KEY-BINDINGS
+bindkey '^K' kill-line
diff --git a/.zsh.after/prompt.zsh b/.zsh.after/prompt.zsh
new file mode 100644
index 0000000..2efeb64
--- /dev/null
+++ b/.zsh.after/prompt.zsh
@@ -0,0 +1 @@
+PROMPT="${__PROMPT_SKWP_COLORS[3]}%n%f@${__PROMPT_SKWP_COLORS[2]}%m%f ${__PROMPT_SKWP_COLORS[5]}%2c%f "'${vcs_info_msg_0_}'"$ "
diff --git a/.zsh.after/unixpool.sh b/.zsh.after/unixpool.sh
new file mode 100644
index 0000000..0a171bd
--- /dev/null
+++ b/.zsh.after/unixpool.sh
@@ -0,0 +1,116 @@
+# host based zshrc
+# unixpool
+
+#HISTFILE=$HOME/.zhistory
+
+# set pulseaudio server to s4
+if [ -f "`which pax11publish`" ];
+then
+ if [ ! $SSH_CLIENT ];
+ then
+ if [ `pax11publish | grep -c s4` -eq 0 ];
+ then
+ echo pulseaudio server set
+ pax11publish -S s4 -e
+ else
+ echo pulseaudio active
+ fi
+ fi
+fi
+
+#export MATLAB_JAVA=/usr/lib/jvm/java-6-sun-1.6.0.16/jre
+
+alias synergys='synergys -c .synergy-$HOST.conf'
+
+function music_update() {
+ echo "updating zip files"
+ for i in */*;
+ do
+ name=`echo $i | sed 's/\ /_/g' | sed 's/\//-/g'`
+ if [ ! -e $name.zip ];
+ then
+ echo "packing $i as $name.zip"
+ zip -r $name.zip $i
+ fi
+ done
+ echo "done"
+}
+
+PATH=${PATH}:/net/local64/bin
+PATH=${PATH}:/net/adm/bin
+PATH=${PATH}:/net/adm/scripts
+PATH=${PATH}:/net/adm/xadm
+
+PATH=${PATH}:/homes/wheel/wheel/bin
+
+#PATH=/store/s4/android/android-sdk-linux_86/tools:$PATH
+#PATH=/store/s4/android/android-sdk-linux_86/platform-tools:$PATH
+
+function makantine() {
+ wget http://personalkantine.personalabteilung.tu-berlin.de/pdf/MA-aktuell.pdf -O /tmp/makantine.$$.pdf >&/dev/null
+ xpdf -cont -z page /tmp/makantine.$$.pdf
+ rm -f /tmp/makantine.$$.pdf
+}
+
+function pxeln() {
+ local instmode host oldumask bopts="" isrc=""
+ while [ -n "$1" ]; do
+ if [[ "$1" == -o* ]]; then
+ [ -z "$bopts" ] && bopts="bootopts=${1:2}" || bopts="${bopts},${1:2}";
+ else
+ if [ -z "$instmode" ]; then instmode="$1";
+ elif [ -z "$host" ]; then host="$1";
+ else echo "Ignoring superfluous argument \"$1\".";
+ fi
+ fi
+
+ shift
+ done
+ if [[ -z "$instmode" || -z "$host" ]]; then
+ echo -e "Missing argument!\nSyntax: pxeln {mode} {host}\n(use tab completion for available modes)" >/dev/stderr
+ return 1
+ fi
+ local IP=$(egrep "^[^,]*,${host}," /net/adm/access/HWlist |cut -d, -f1|cut -d. -f4)
+ local M="01-$(egrep " $IP " /net/adm/access/MAClist 2>/dev/null|sed -e "s/^|[^|]*| \([0-9a-f:]*\) |/\1/" -e "y/:/-/")"
+ if [[ ${#M} -ne 20 ]]; then
+ echo "Unknown host." >/dev/stderr
+ return 1
+ fi
+ shift 2
+ oldumask=$(umask -p)
+ umask 0022
+ local instmodetl=$(tr [:upper:] [:lower:]<<<$instmode)
+ if [ -s /homes/ext15a/tftpboot/pxelinux.cfg/${instmode}.sed ]; then
+ if [ -e /homes/ext15a/tftpboot/pxelinux.cfg/$M ]; then
+ rm -f /homes/ext15a/tftpboot/pxelinux.cfg/$M
+ echo "$host: former PXE diversion removed."
+ fi
+ sed /homes/ext15a/tftpboot/pxelinux.cfg/_template \
+ -f /homes/ext15a/tftpboot/pxelinux.cfg/${instmode}.sed \
+ > /homes/ext15a/tftpboot/pxelinux.cfg/$M
+ echo -n "$host: elected for ${instmode}"
+ if [ -n "$bopts" ]; then
+ sed -i -e "/bootmode=${instmodetl}/ s/$/ ${bopts}/" /homes/ext15a/tftpboot/pxelinux.cfg/$M
+ echo -n " (with extra boot options: \"$bopts\")"
+ fi
+ echo "."
+ elif [ "$instmode" == "remove" ]; then
+ rm -f /homes/ext15a/tftpboot/pxelinux.cfg/$M
+ echo "$host: PXE diversion removed."
+ else
+ echo "Unknown PXE mode." >/dev/stderr
+ fi
+ $oldumask
+ return 0
+}
+
+function mailhighscore() {
+ for i in /homes/wheel/*; do n=`basename $i`; echo `grep $n /var/spool/mail/konni | grep -c From` $n; done | sort -nr
+}
+alias lp_ps1_100='lp -q 100 -d ps1'
+alias lp_ps2_100='lp -q 100 -d ps2'
+alias QW='xterm -geometry 84x41-0+0 -T '\''QWatch'\'' -fn 5x8 -e /homes/misc/lpviewer/lpdisp'
+alias QWbig='xterm -geometry 84x41-0+0 -T '\''QWatch'\'' -e /homes/misc/lpviewer/lpdisp'
+alias QWbighere='/homes/misc/lpviewer/lpdisp'
+alias QWdisplay="watch 'for n in {1..3}; do scli -c \"show printer display\" ps\$n-pool; done'"
+
diff --git a/.zsh.after/unixpool.zsh b/.zsh.after/unixpool.zsh
new file mode 100644
index 0000000..592abb0
--- /dev/null
+++ b/.zsh.after/unixpool.zsh
@@ -0,0 +1,5 @@
+case "$HOST" in
+ s4|s5|c*)
+ . $HOME/.zsh.after/unixpool.sh
+ ;;
+esac
diff --git a/.zsh.before/aliases.zsh b/.zsh.before/aliases.zsh
new file mode 100644
index 0000000..b38dc53
--- /dev/null
+++ b/.zsh.before/aliases.zsh
@@ -0,0 +1 @@
+alias brew='echo'
diff --git a/.zsh.before/functions.zsh b/.zsh.before/functions.zsh
new file mode 100644
index 0000000..01bc224
--- /dev/null
+++ b/.zsh.before/functions.zsh
@@ -0,0 +1,4 @@
+if [ -e $HOME/bin/functions.sh ]
+then
+ . $HOME/bin/functions.sh
+fi
diff --git a/.zsh.before/keychain.zsh.off b/.zsh.before/keychain.zsh.off
new file mode 100644
index 0000000..372a5bb
--- /dev/null
+++ b/.zsh.before/keychain.zsh.off
@@ -0,0 +1,4 @@
+if [ -f /usr/bin/keychain ]
+then
+ eval $(keychain --eval --agents ssh -Q --quiet ~/.ssh/id_rsa.*)
+fi
diff --git a/.zsh.before/path.zsh b/.zsh.before/path.zsh
new file mode 100644
index 0000000..bd27781
--- /dev/null
+++ b/.zsh.before/path.zsh
@@ -0,0 +1,16 @@
+# < BEFORE $PATH
+PATH=$HOME/bin:$PATH
+# > BEFORE
+
+# < AFTER $PATH
+#PATH=$PATH:"/opt/scilab-4.1.2/bin"
+#PATH=$PATH:"/opt/java6/bin":"/opt/java6/jre/bin"
+#PATH=$PATH:/extra/DF3120/minifs/toolchain/arm-v4t-linux-uclibcgnueabi/bin
+# ANDROID
+#PATH=$PATH:"/opt/android-sdk/tools"
+#PATH=$PATH:"/opt/android-sdk/platform-tools"
+#PATH=$PATH:"/extra/android/cyanogenmod/out/host/linux-x86/bin"
+
+## RVM
+PATH=$PATH:$HOME/.rvm/bin # Add RVM to PATH for scripting
+# > AFTER
diff --git a/.zshrc b/.zshrc
new file mode 100644
index 0000000..804c7ba
--- /dev/null
+++ b/.zshrc
@@ -0,0 +1,16 @@
+#
+# Executes commands at the start of an interactive session.
+#
+# Authors:
+# Sorin Ionescu <sorin.ionescu@gmail.com>
+#
+
+# Source Prezto.
+if [[ -s "${ZDOTDIR:-$HOME}/.zprezto/init.zsh" ]]; then
+ source "${ZDOTDIR:-$HOME}/.zprezto/init.zsh"
+fi
+
+# Customize to your needs...
+
+for config_file ($HOME/.yadr/zsh/*.zsh) source $config_file
+
diff --git a/bin/androidbackup.sh b/bin/androidbackup.sh
new file mode 100755
index 0000000..ee95f01
--- /dev/null
+++ b/bin/androidbackup.sh
@@ -0,0 +1,143 @@
+#!/bin/bash
+
+if [ -e $HOME/bin/functions.sh ]
+then
+ . $HOME/bin/functions.sh
+else
+ exit 0
+fi
+
+## CONFIGURATION
+ADB=adb
+
+function help()
+{
+ echo "Android data backup/restore"
+ echo "Usage:"
+ echo -e "\t [backup|restoredata|restoreapk] [device]"
+ exit 0
+}
+
+function _backup()
+{
+ adb -s $DEVICE pull /data/system/packages.list .
+ cat packages.list | while read line
+ do
+ read name dir <<< $(echo $line | awk '{ print $1 " " $4 }')
+ #echo $dir
+ apk=$($ADB shell bash -c "ls /data/app/${name}* 2> /dev/null")
+ if [ -n $exists ]
+ then
+ echo $name $apk
+ else
+ echo LALALALALAAA $name
+ fi
+ echo ""
+ done
+}
+
+function _restoreapk() {
+ mkdir -p done skipped
+ apps=$(ls -1 | grep -c apk)
+ num=1
+ for i in *.apk
+ do
+ if [ $i = "done" -o $i = "skipped" ]
+ then
+ continue
+ fi
+ echo_green "Application $i ($num/$apps)"
+
+ name=$(echo $i | sed 's/-[0-9].apk//')
+ existing=$($ADB shell sh -c "ls /data/app*/${name}* 2> /dev/null")
+ echo $existing
+ if [ -n "$existing" ]
+ then
+ echo $i already installed
+ mv $i skipped
+ continue
+ fi
+ echo " Restore apk? [1|0] (default 1)"
+ echo -en " "
+ read inst
+ inst=${inst:=1}
+
+ if [ $inst -eq 1 ]
+ then
+ $ADB install $i
+ mv $i done
+ else
+ echo -e " Skipping...\n\n"
+ mv $i skipped
+ fi
+ let num=num+1
+ done
+}
+
+function _restoredata()
+{
+ mkdir -p done skipped
+ apps=$(ls -l | grep -v skipped | grep -v done | grep -c '^d')
+ num=1
+ for i in *
+ do
+ if [ $i = "done" -o $i = "skipped" ]
+ then
+ continue
+ fi
+
+ echo_green "Application $i ($num/$apps)"
+ if [ $(adb shell ls -l /data/data | grep -c $i) -lt 1 ]
+ then
+ echo_red " not installed, skipping.\n\n"
+ mv $i skipped
+ continue
+ fi
+
+ echo " Restore data? [1|0] (default 0)"
+ echo -en " "
+ read inst
+ inst=${inst:=0}
+
+ if [ $inst -eq 1 ]
+ then
+ if [ $i = "com.android.providers.telephony" ]
+ then
+ echo -e "SMS/CALLS"
+ $ADB push $i/databases/mmssms.db /data/data/$i/databases
+ $ADB shell chmod 660 /data/data/$i/databases/mmssms.db
+ $ADB shell toolbox chown 1001:1001 /data/data/$i/databases/mmssms.db
+ $ADB shell killall system_server
+ mv $i done
+ else
+ own=$($ADB shell ls -l /data/data/ | grep $i | head -n 1 | awk '{ print $3}')
+ echo -e " User $own\n\n"
+ mute $ADB push $i /data/data/$i
+ mute $ADB shell chown $own:$own /data/data/$i/*
+ mute $ADB shell chown $own:$own /data/data/$i/*/*
+ mute $ADB shell chown $own:$own /data/data/$i/*/*/*
+ mv $i done
+ fi
+ else
+ echo -e " Skipping...\n\n"
+ mv $i skipped
+ fi
+ let num=num+1
+ done
+}
+
+case $1 in
+ backup)
+ _backup
+ ;;
+ restoredata)
+ _restoredata
+ ;;
+ restoreapk)
+ _restoreapk
+ ;;
+ *)
+ help
+ exit 0
+ ;;
+esac
diff --git a/bin/atmux b/bin/atmux
new file mode 100755
index 0000000..7601693
--- /dev/null
+++ b/bin/atmux
@@ -0,0 +1,122 @@
+#!/bin/bash
+
+if [ -e $HOME/bin/functions.sh ]
+then
+ . $HOME/bin/functions.sh
+else
+ echo "functions.sh not found"
+ exit 0
+fi
+
+# override tmux
+tmux='tmux'
+
+## CONFIGURATION
+# session name
+sn=${1:-atmux}
+
+# try to attach earlier session
+tmux attach-session -t $sn && exit 0
+#or continue
+
+# default path
+case $sn in
+ # window definitions
+ # path:command:custom-name
+ "thesis")
+ dpath=/home/konni/dropbox/documents/uni/12ss/BA/breite-quellen/thesis
+ windows="-:-"
+ windows+="matlab:echo bla"
+ ;;
+ "mako")
+ dpath=/extra/src/cyanogenmod-10.1
+ dcmd=". environment_mako"
+ windows="-:-"
+ windows+="-:-"
+ windows+=" device/lge/mako:-"
+ windows+=" out/target/product/mako:-"
+ ;;
+ "ville_dev")
+ dpath=/extra/src/cyanogenmod-10.1
+ dcmd=". environment_ville"
+ windows="-:-"
+ windows+=" -:-"
+ windows+=" device/htc/ville:-"
+ windows+=" device/htc/msm8960-common:-"
+ windows+=" kernel/htc/msm8960:-"
+ windows+=" vendor/htc:-"
+ windows+=" out/target/product/ville:-"
+ ;;
+ "ville")
+ dpath=/extra/src/cyanogenmod-jellybean
+ dcmd=". environment_ville"
+ windows="-:-"
+ windows+=" -:-"
+ windows+=" device/htc/ville:-"
+ windows+=" device/htc/msm8960-common:-"
+ windows+=" kernel/htc/msm8960:-"
+ windows+=" vendor/htc:-"
+ windows+=" out/target/product/ville:-"
+ ;;
+ *)
+ dpath=$HOME
+ windows="-:-"
+esac
+
+
+# enter default path
+mute pushd $dpath
+
+# prepare windows
+num=1
+for window in $windows
+do
+ # parse configuration
+ read wpath wcmd <<< $(echo $window | sed 's/:/\ /g')
+
+ # set path
+ unset tpath
+ if [ $wpath != "-" ]
+ then
+ tpath=$wpath
+ fi
+
+
+ if [ $num -eq 1 ]
+ then
+ # start new session
+ $tmux new-session -d -s "$sn" $tname
+ # set default path for new windows
+ $tmux set-option -t "$sn" default-path $dpath
+ else
+ # create new window in session
+ $tmux new-window -t "$sn:$num" $tname
+ fi
+
+ # execute default command
+ if [ -n "$dcmd" ]
+ then
+ $tmux send-keys -t "$n:$num" "$dcmd" C-m
+ fi
+
+ # change path
+ if [ -n "$tpath" ]
+ then
+ $tmux send-keys -t "$n:$num" "cd $tpath" C-m
+ fi
+
+ # execute custom command
+ unset tcmd
+ if [ "$wcmd" != "-" ]
+ then
+ tcmd=$wcmd
+ $tmux send-keys -t "$n:$num" "$tcmd" C-m
+ fi
+
+ let num=num+1
+done
+
+# select window #1 and attach to session
+$tmux select-window -t "$sn:1"
+$tmux attach-session -t "$sn"
+
diff --git a/bin/autostart b/bin/autostart
new file mode 100755
index 0000000..f341864
--- /dev/null
+++ b/bin/autostart
@@ -0,0 +1,4 @@
+#!/bin/bash
+dropbox start &
+owncloud &
+compton --config ~/.config/compton.conf -b
diff --git a/bin/backup-profiles b/bin/backup-profiles
new file mode 100644
index 0000000..2f87701
--- /dev/null
+++ b/bin/backup-profiles
@@ -0,0 +1,10 @@
+#!/bin/bash
+
+cd /tmp
+tar cvfz firefox.tgz $1/.mozilla/firefox/david.runge-backup
+gpg -e -r 'David Runge <david.runge@frqrec.com>' firefox.tgz
+mv -f firefox.tgz.gpg $1/Dropbox/sync
+
+tar cvfz thunderbird.tgz $1/.thunderbird/david.runge
+gpg -e -r 'David Runge <david.runge@frqrec.com>' thunderbird.tgz
+mv -f thunderbird.tgz.gpg $1/Dropbox/sync
diff --git a/bin/functions.sh b/bin/functions.sh
new file mode 100755
index 0000000..951def5
--- /dev/null
+++ b/bin/functions.sh
@@ -0,0 +1,176 @@
+#!/bin/bash
+# some functions
+
+# zsh color output
+# echo "$FG[46]$FX[blink]Hello, World"
+
+function echo_green() {
+ echo -e '\E[1;32m'$*'\E[0m'
+}
+
+function echo_red() {
+ echo -e '\E[1;31m'$*'\E[0m'
+}
+
+function echo_magenta() {
+ echo -e '\E[1;35m'$*'\E[0m'
+}
+
+function echo_cyan() {
+ echo -e '\E[1;36m'$*'\E[0m'
+}
+
+# log text ...
+function log() {
+ date=`date "+%Y-%m-%d %H:%M:%S"`
+ if [ -n $VERBOSE ]
+ then
+ echo $date $@ | tee -a $LOGFILE
+ fi
+ [ -n $LOGFILE ] && echo $date $@ >> $LOGFILE
+}
+
+function log_green() {
+ date=`date "+%Y-%m-%d %H:%M:%S"`
+ if [ -n $VERBOSE ]
+ then
+ echo_green $date $@
+ fi
+ [ -n $LOGFILE ] && echo $date $@ >> $LOGFILE
+}
+
+function log_red() {
+ date=`date "+%Y-%m-%d %H:%M:%S"`
+ if [ -n $VERBOSE ]
+ then
+ echo_red $date $@
+ fi
+ [ -n $LOGFILE ] && echo $date $@ >> $LOGFILE
+}
+
+function log_magenta() {
+ date=`date "+%Y-%m-%d %H:%M:%S"`
+ if [ -n $VERBOSE ]
+ then
+ echo_magenta $date $@
+ fi
+ [ -n $LOGFILE ] && echo $date $@ >> $LOGFILE
+}
+
+function log_cyan() {
+ date=`date "+%Y-%m-%d %H:%M:%S"`
+ if [ -n $VERBOSE ]
+ then
+ echo_cyan $date $@
+ fi
+ [ -n $LOGFILE ] && echo $date $@ >> $LOGFILE
+}
+
+function notify() {
+ title="$1"
+ text="$2"
+ echo 'naughty.notify({title = "'$title'", text = "'$text'"})' | awesome-client
+}
+
+# mute command
+function mute() {
+ $@ > /dev/null 2> /dev/null
+}
+
+# run pidfile command
+function run() {
+ pidfile=$1
+ shift
+ command=$@
+
+ exec $command > /dev/null 2> /dev/null &
+ pid=$!
+ sleep 0.25
+ npid=$(pidof -s $1)
+ if [ -n "$npid" ] && [ $npid -ne $pid ]
+ then
+ pid=$npid
+ fi
+ echo $pid > $pidfile
+ log_green executed $command"\n"
+}
+
+# run_once $pidfile $command[]
+function run_once() {
+ pidfile=/tmp/run/lock/$1
+ shift
+ command=$@
+
+ mkdir -p $(dirname $pidfile)
+
+ if [ -f $pidfile ];
+ then
+ pid=`head -n 1 $pidfile`
+ running=$(ps -u $(whoami) -p $pid | grep '^[ ]*'$pid)
+ if [ -z "$running" ]
+ then
+ log_cyan stale pidfile found
+ rm -f $pidfile
+
+ npid=$(pidof -s $1)
+ if [ -n "$npid" ]
+ then
+ log_green "pidfile updated\n"
+ echo $npid > $pidfile
+ else
+ run $pidfile $command
+ fi
+
+ else
+ log_cyan "active pidfile found\n"
+ fi
+ else
+ pid=`ps | grep "$command" | grep -v grep | head -n 1 | awk '{ print $1 }'`
+ if [ -z "$pid" ]
+ then
+ log_green not running
+ run $pidfile $command
+ else
+ log_cyan "pidfile updated\n"
+ echo $pid > $pidfile
+ fi
+ fi
+}
+
+# run_auto $file
+function run_auto() {
+ file=$1
+ . $file
+
+ cur_host=`hostname`
+ case $cur_host in
+ annoyance|silence|remembrance)
+ cur_area=private
+ ;;
+ c*|s*)
+ cur_area=unixpool
+ ;;
+ esac
+
+ if [ $area != $cur_area -a $area != "any" ]
+ then
+ log_magenta invalid_area $(basename $file)"\n"
+ return
+ fi
+
+ if [ $host != $cur_host -a $host != "any" ]
+ then
+ log_magenta invalid_host $(basename $file)"\n"
+ return
+ fi
+
+ if [ $allow_multiple -eq 1 ]
+ then
+ log_green run $(basename $file)
+ run /dev/null $command
+ else
+ log_green run_once $(basename $file)
+ run_once `basename $file` $command
+ fi
+}
+
diff --git a/bin/helloworld.sh b/bin/helloworld.sh
new file mode 100755
index 0000000..7ee4df0
--- /dev/null
+++ b/bin/helloworld.sh
@@ -0,0 +1,2 @@
+#!/bin/bash
+notify-send 'Hello world!' 'This is an example notification.' --icon=dialog-information
diff --git a/bin/letter b/bin/letter
new file mode 100644
index 0000000..87e2c34
--- /dev/null
+++ b/bin/letter
@@ -0,0 +1,71 @@
+#!/bin/bash
+# Create a letter
+
+# Configuration
+template=~/documents/letter_template.tex
+dir=~/documents/`date +%Y`
+texdir=$dir/tex
+editor=/usr/bin/vim
+reader=/usr/bin/mupdf
+
+function mkpdf () {
+ pdflatex -shell-escape $1.tex
+ EXT=(aux log)
+ for i in ${EXT[*]}
+ do
+rm -v $1.$i
+ done
+}
+
+# Preparation
+mkdir -p $dir
+mkdir -p $texdir
+
+named=0
+while [ $named -eq 0 ]
+do
+read -p "Enter document name: " REPLY
+ docname=`echo $REPLY | sed 's/\ /_/g'`
+ docdate="`date +%Y-%m-%d`"
+ doc=$dir/${docdate}_${docname}
+ tex=$dir/${docdate}_${docname}.tex
+ pdf=$dir/${docdate}_${docname}.pdf
+ if [ -e $pdf ]
+ then
+read -p "Document already exists. Overwrite? (y/N) " REPLY
+ [ "$REPLY" == "y" ] || continue
+fi
+
+read -p "Create document \"$pdf\"? (Y/n) " REPLY
+ [ "$REPLY" == "y" -o x"$REPLY" == x ] && named=1
+done
+
+cd $dir
+cp $template $tex
+
+$editor $tex
+mkpdf $doc
+$reader $pdf
+
+finished=0
+while [ $finished -eq 0 ]
+do
+read -p "Finished editing? (Y/n) " REPLY
+ if [ "$REPLY" == "y" -o x"$REPLY" == x ]
+ then
+finished=1
+ else
+ $editor $tex
+ mkpdf $doc
+ $reader $pdf
+ fi
+done
+
+read -p "Keep a copy of the .tex file? (Y/n) " REPLY
+if [ "$REPLY" == "y" -o x"$REPLY" == x ]
+then
+mv $tex $texdir
+else
+rm $tex
+fi
+
diff --git a/bin/mirssi b/bin/mirssi
new file mode 100755
index 0000000..7ce8257
--- /dev/null
+++ b/bin/mirssi
@@ -0,0 +1,12 @@
+#!/bin/bash
+# start notification daemon
+# connect to server and open port
+# kill notification daemon
+
+PATH=$HOME/bin/:$PATH
+notify_irssi_server.pl &> /dev/null &
+pid=$!
+
+ssh -R 7090:localhost:7090 frq
+
+kill $pid
diff --git a/bin/mpc b/bin/mpc
new file mode 100644
index 0000000..cc85fd4
--- /dev/null
+++ b/bin/mpc
@@ -0,0 +1,38 @@
+#!/bin/bash
+file=/tmp/mpdhost
+
+if [ -e $file ]
+then
+ mpdhost=$(cat $file)
+else
+ case $(hostname) in
+ "dvzrv")
+ mpdhost=dvzrv
+ ;;
+ *)
+ mpdhost=homey
+ ;;
+ esac
+fi
+
+case $1 in
+ "switch")
+ case "$mpdhost" in
+ "dvzrv")
+ mpdhost=homey
+ ;;
+ *)
+ mpdhost=dvzrv
+ ;;
+ esac
+ echo $mpdhost > $file
+ echo switched to $mpdhost
+ shift
+ ;;
+ "host")
+ echo $mpdhost
+ exit 0
+ ;;
+esac
+
+/usr/bin/mpc -h $mpdhost "$@"
diff --git a/bin/notify_irssi_server.pl b/bin/notify_irssi_server.pl
new file mode 100755
index 0000000..e1c7b80
--- /dev/null
+++ b/bin/notify_irssi_server.pl
@@ -0,0 +1,62 @@
+#!/usr/bin/perl
+#
+use IO::Socket;
+my $sock = new IO::Socket::INET (
+ LocalHost => '127.0.0.1',
+ LocalPort => '7090',
+ Proto => 'tcp',
+ Listen => 1,
+ Reuse => 1,
+);
+die "Could not create socket: $!\n" unless $sock;
+
+while(true) {
+ my $new_sock = $sock->accept();
+ while(<$new_sock>) {
+ my ($server, $channel, $text, $active) = split(/:::/);
+ #print "$_\n";
+ my ($second, $minute, $hour, $dayOfMonth, $month, $yearOffset, $dayOfWeek, $dayOfYear, $daylightSavings) = localtime();
+ # zero padding
+ if ($hour < 10) {
+ $hour = "0$hour";
+ }
+ if ($minute < 10) {
+ $minute = "0$minute";
+ }
+ if ($channel =~ m/#/ ) {
+ $timeout = 10;
+ }
+ else {
+ if ($channel =~ m/bitlbee/ ) {
+ $timeout = 10;
+ }
+ else {
+ $timeout = 5;
+ }
+ }
+
+ ## filter invalid chars
+ # allowed: [#x1-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
+ $text =~ s/[^\x01-\x{D7FF}\x{E000}-\x{FFFD}\x{10000}-\x{10FFFF}]//go;
+ # # restricted:[#x1-#x8][#xB-#xC][#xE-#x1F][#x7F-#x84][#x86-#x9F]
+ $text =~ s/[\x01-\x08\x0B-\x0C\x0E-\x1F\x7F-\x84\x86-\x9F]//go;
+
+ ## replace otr information
+ $text =~ s/^03/OTR:\ /;
+
+ ## remove '
+ $text =~ s/\'//g;
+
+ ## remove "
+ $text =~ s/\"//g;
+
+ print "message({action=\"new\", timeout=$timeout, active=$active, title=\"$hour:$minute $channel\", text=\"$text\"})\n";
+ ## AWESOME custom function
+ system("echo 'message({action=\"new\", timeout=$timeout, active=$active, title=\"$hour:$minute $channel\", text=\"$text\"})' | awesome-client");
+ ## AWESOME
+ # system("echo 'notify_irssi=naughty.notify({timeout = $timeout, title = \"$hour:$minute $channel\", text = \"$text\"})' | awesome-client");
+ ## NOTIFY-SEND timeout in ms
+ # system("notify-send -t $timeout*1000 \"$hour:$minute $channel\" \"$text\"");
+ }
+}
+close($sock);
diff --git a/bin/notify_mpd b/bin/notify_mpd
new file mode 100755
index 0000000..36d8345
--- /dev/null
+++ b/bin/notify_mpd
@@ -0,0 +1,45 @@
+#!/bin/bash
+mpc "$@" > /dev/null
+lines=`mpc | wc -l`
+
+if [ $lines -gt 1 ];
+then
+ line1="`mpc | head -n 1`"
+ line2="`mpc | head -n 3 | tail -n 2 | sed 's/[a-z]*\:\ off//g'`"
+
+ status="`echo $line2 | awk '{ print $1 }'`"
+ position="`echo $line2 | awk '{ print $3 }'`"
+ position="($position)"
+ volume="[`echo $line2 | awk '{ print $5 $6 }' | sed 's/volume\://' | sed 's/repeat\://'`]"
+
+ repeat="`echo $line2 | grep -c 'repeat: on' | sed 's/1/r/' | sed 's/0//'`"
+ random="`echo $line2 | grep -c 'random: on' | sed 's/1/z/' | sed 's/0//'`"
+ single="`echo $line2 | grep -c 'single: on' | sed 's/1/s/' | sed 's/0//'`"
+ consume="`echo $line2 | grep -c 'consume: on' | sed 's/1/c/' | sed 's/0//'`"
+ flags="[$repeat$random$single$consume]"
+
+ title="$line1"
+ text="$status $position $flags $volume"
+
+else
+ line="`mpc | sed 's/[a-z]*\:\ off//g'`"
+
+ volume="[`echo $line | awk '{ print $2 }'`]"
+
+ repeat="`echo $line | grep -c 'repeat: on' | sed 's/1/r/' | sed 's/0//'`"
+ random="`echo $line | grep -c 'random: on' | sed 's/1/z/' | sed 's/0//'`"
+ single="`echo $line | grep -c 'single: on' | sed 's/1/s/' | sed 's/0//'`"
+ consume="`echo $line | grep -c 'consume: on' | sed 's/1/c/' | sed 's/0//'`"
+ flags="[$repeat$random$single$consume]"
+
+ title="not playing"
+ text="$flags $volume"
+fi
+
+## AWESOME
+#echo 'naughty.destroy(notify_mpc)' | awesome-client
+#echo 'notify_mpc=naughty.notify({title = "'$title'", text = "'$text'"})' | awesome-client
+
+## NOTIFY-SEND
+notify-send -t 2000 "$title" "$text"
+
diff --git a/bin/run_once b/bin/run_once
new file mode 100755
index 0000000..3829f7e
--- /dev/null
+++ b/bin/run_once
@@ -0,0 +1,4 @@
+#!/bin/bash
+#Alternative
+pgrep $@ > /dev/null || ($@ &)
+
diff --git a/bin/scvim-test b/bin/scvim-test
new file mode 100755
index 0000000..fc3d18b
--- /dev/null
+++ b/bin/scvim-test
@@ -0,0 +1,7 @@
+#!/bin/sh
+
+tmux new-session -d -s SuperCollider -A
+tmux split-window -t SuperCollider:1 -h -p 25
+tmux send-keys -t SuperCollider:1.1 dmesg C-m
+tmux att -t SuperCollider
+
diff --git a/bin/set_volume b/bin/set_volume
new file mode 100755
index 0000000..3168870
--- /dev/null
+++ b/bin/set_volume
@@ -0,0 +1,50 @@
+#!/bin/bash
+
+FUNCTIONS=$HOME/bin/functions.sh
+[ -e $FUNCTIONS ] || exit 1
+. $FUNCTIONS
+
+LED=/sys/class/leds/0003:17EF:6009.0004:amber:mute/brightness
+
+function increase_volume()
+{
+ mute amixer sset Master 10%+
+}
+
+function decrease_volume()
+{
+ mute amixer sset Master 10%-
+}
+
+function toggle_volume()
+{
+ state=$(amixer sget Master | grep -o '\[o[n|f]*\]' | head -n 1)
+ case "$state" in
+ "[on]")
+ mute amixer sset Master mute
+ mute amixer sset Headphone mute
+ mute amixer sset Speaker mute
+ echo 1 > $LED
+ ;;
+ "[off]")
+ mute amixer sset Master unmute
+ mute amixer sset Headphone unmute
+ mute amixer sset Speaker unmute
+ echo 0 > $LED
+ ;;
+ esac
+}
+
+case "$1" in
+ increase)
+ increase_volume
+ ;;
+ decrease)
+ decrease_volume
+ ;;
+ toggle)
+ toggle_volume
+ ;;
+ *)
+ ;;
+esac
diff --git a/bin/stikked b/bin/stikked
new file mode 100644
index 0000000..b209208
--- /dev/null
+++ b/bin/stikked
@@ -0,0 +1,115 @@
+#! /usr/bin/env python2
+
+import argparse
+import os
+import sys
+import pycurl
+import StringIO
+import subprocess
+import urllib
+
+## CONFIGURATION {
+user='example-user'
+apiurl='http://paste.giev.de/api/create'
+## }
+
+
+def main():
+ global verbose
+
+ # parse arguments
+ parser = argparse.ArgumentParser(prog='stikked')
+ parser.add_argument('-V', '--version', action='version', version='%(prog)s 0.1')
+ parser.add_argument('-v', '--verbose', action='store_true', dest='verbose', help='verbose mode', default=False)
+ parser.add_argument('-s', dest='syntax', action='store', help='syntax to highlight', default='text')
+ parser.add_argument('-p', dest='private', action='store_true', help='set paste to private', default=False)
+ parser.add_argument('-t', dest='title', action='store', help='set title of paste')
+ parser.add_argument('fname', metavar='FILE|-', help='file to paste or - for stdin')
+ args = parser.parse_args()
+ if args.verbose:
+ verbose = args.verbose
+ print args
+
+ # private
+ private = '1' if args.private else '0'
+
+ # from stdin
+ if args.fname == '-':
+ title = args.title if args.title else 'stdin'
+ text=sys.stdin.read()
+ syntax=args.syntax
+
+ # from file
+ else:
+ fname = args.fname
+
+ if not os.path.isfile(fname):
+ print "No such file: {0}".format(fname)
+ sys.exit(1)
+ else:
+ title = args.title if args.title else os.path.split(fname)[1]
+
+ if args.syntax == 'text':
+ ext = os.path.splitext(fname)[1][1:]
+ syntax = _detect_syntax(ext)
+ else:
+ syntax = args.syntax
+
+ fopen = file(fname, 'r')
+ text = fopen.read()
+
+ _paste(text, title, syntax, private)
+
+
+# send paste to server
+def _paste(text, title, syntax, private):
+ postparams = [
+ ('text', text),
+ ('name', user),
+ ('title', title),
+ ('lang', syntax),
+ ('private', private)]
+
+ postfields=urllib.urlencode(postparams)
+
+ curl = pycurl.Curl()
+ curl.setopt(pycurl.URL, apiurl)
+ curl.setopt(pycurl.POST, True)
+ curl.setopt(pycurl.POSTFIELDS, postfields)
+ # Fixes the HTTP/1.1 417 Expectation Failed Bug
+ header = []
+ header.append("Expect: ")
+ curl.setopt(pycurl.HTTPHEADER, header)
+ curl.setopt(pycurl.NOPROGRESS, True)
+ b = StringIO.StringIO()
+ curl.setopt(pycurl.WRITEFUNCTION, b.write)
+ curl.perform()
+ print b.getvalue();
+
+ # copy to primary clipboard
+ xsel_proc = xsel_proc = subprocess.Popen(['xsel', '-pi'], stdin=subprocess.PIPE)
+ xsel_proc.communicate(b.getvalue())
+
+
+# more possible of course
+def _detect_syntax(ext):
+ if ext == 'h':
+ syntax='c'
+ elif ext == 'log':
+ syntax='logcat'
+ elif ext == "py":
+ syntax = 'python'
+ elif ext == "pl":
+ syntax = 'perl'
+ elif ext == "patch":
+ syntax = 'diff'
+ elif ext == 'c' or ext == 'cpp' or ext == 'java' or ext == 'sh':
+ syntax=ext
+ else:
+ syntax='text'
+
+ return syntax
+
+
+if __name__ == '__main__':
+ main()
diff --git a/bin/supercollider.vim b/bin/supercollider.vim
new file mode 100644
index 0000000..92b2512
--- /dev/null
+++ b/bin/supercollider.vim
@@ -0,0 +1,347 @@
+"SuperCollider/Vim interaction scripts
+"Copyright 2007 Alex Norman
+"
+"This file is part of SCVIM.
+"
+"SCVIM 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.
+"
+"SCVIM 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 SCVIM. If not, see <http://www.gnu.org/licenses/>.
+
+"au VimLeave
+
+"if exists("$SCVIM_DIR") == 0
+" echo "$SCVIM_DIR must be defined for SCVIM to work"
+" finish
+"endif
+
+
+"source the syntax file as it can change
+"so $SCVIM_DIR/syntax/supercollider.vim
+runtime! syntax/supercollider.vim
+
+if exists("loaded_scvim") || &cp
+ finish
+endif
+let loaded_scvim = 1
+
+"first if SCVIM_CACHE_DIR is defined, use that,
+"otherwise use ~/.scvim
+if exists("$SCVIM_CACHE_DIR")
+ let s:scvim_cache_dir = $SCVIM_CACHE_DIR
+else
+ let s:scvim_cache_dir = $HOME . "/.scvim"
+ let $SCVIM_CACHE_DIR = s:scvim_cache_dir
+endif
+
+"source the scvimrc file if it exists
+if filereadable($HOME . "/.scvimrc")
+ source $HOME/.scvimrc
+end
+
+"add the cache dir to
+set runtimepath+=$SCVIM_CACHE_DIR
+
+if exists("g:sclangKillOnExit")
+ let s:sclangKillOnExit = g:sclangKillOnExit
+else
+ let s:sclangKillOnExit = 1
+endif
+
+if exists("g:sclangPipeLoc")
+ let s:sclangPipeLoc = g:sclangPipeLoc
+else
+ let s:sclangPipeLoc = "/tmp/sclang-pipe"
+endif
+let $SCVIM_PIPE_LOC = s:sclangPipeLoc
+
+if exists("g:sclangPipeAppPidLoc")
+ let s:sclangPipeAppPidLoc = g:sclangPipeAppPidLoc
+else
+ let s:sclangPipeAppPidLoc = "/tmp/sclangpipe_app-pid"
+endif
+let $SCVIM_PIPE_PID_LOC = s:sclangPipeAppPidLoc
+
+if exists("g:sclangTerm")
+ let s:sclangTerm = g:sclangTerm
+else
+ let s:sclangTerm = "xterm -e"
+endif
+
+if exists("g:sclangPipeApp")
+ let s:sclangPipeApp = g:sclangPipeApp
+else
+ let s:sclangPipeApp = "sclangpipe_app"
+endif
+
+"function SClangRunning()
+" if s:sclang_pid != 0 && `pidof "#{$sclangsclangPipeApp_no_quotes}"`.chomp != ""
+" return true
+" else
+" $sclang_pid = 0
+" return false
+" end
+"end
+
+
+function! FindOuterMostBlock()
+ "search backwards for parens dont wrap
+ let l:search_expression_up = "call searchpair('(', '', ')', 'bW'," .
+ \"'synIDattr(synID(line(\".\"), col(\".\"), 0), \"name\") =~? \"scComment\" || " .
+ \"synIDattr(synID(line(\".\"), col(\".\"), 0), \"name\") =~? \"scString\" || " .
+ \"synIDattr(synID(line(\".\"), col(\".\"), 0), \"name\") =~? \"scSymbol\"')"
+ "search forward for parens, don't wrap
+ let l:search_expression_down = "call searchpair('(', '', ')', 'W'," .
+ \"'synIDattr(synID(line(\".\"), col(\".\"), 0), \"name\") =~? \"scComment\" || " .
+ \"synIDattr(synID(line(\".\"), col(\".\"), 0), \"name\") =~? \"scString\" || " .
+ \"synIDattr(synID(line(\".\"), col(\".\"), 0), \"name\") =~? \"scSymbol\"')"
+
+ "save our current cursor position
+ let l:returnline = line(".")
+ let l:returncol = col(".")
+
+ "if we're on an opening paren then we should actually go to the closing one to start the search
+ "if buf[l:returnline][l:returncol-1,1] == "("
+ if strpart(getline(line(".")),col(".") - 1,1) == "("
+ exe l:search_expression_down
+ endif
+
+ let l:origline = line(".")
+ let l:origcol = col(".")
+
+ "these numbers will define our range, first init them to illegal values
+ let l:range_e = [-1, -1]
+ let l:range_s = [-1, -1]
+
+ "this is the last line in our search
+ let l:lastline = line(".")
+ let l:lastcol = col(".")
+
+ exe l:search_expression_up
+
+ while line(".") != l:lastline || (line(".") == l:lastline && col(".") != l:lastcol)
+ "keep track of the last line/col we were on
+ let l:lastline = line(".")
+ let l:lastcol = col(".")
+ "go to the matching paren
+ exe l:search_expression_down
+
+ "if there isn't a match print an error
+ if l:lastline == line(".") && l:lastcol == col(".")
+ call cursor(l:returnline,l:returncol)
+ throw "UnmachedParen at line:" . l:lastline . ", col: " . l:lastcol
+ endif
+
+ "if this is equal to or later than our original cursor position
+ if line(".") > l:origline || (line(".") == l:origline && col(".") >= l:origcol)
+ let l:range_e = [line("."), col(".")]
+ "go back to opening paren
+ exe l:search_expression_up
+ let l:range_s = [line("."), col(".")]
+ else
+ "go back to opening paren
+ exe l:search_expression_up
+ endif
+ "find next paren (if there is one)
+ exe l:search_expression_up
+ endwhile
+
+ "restore the settings
+ call cursor(l:returnline,l:returncol)
+
+ if l:range_s[0] == -1 || l:range_s[1] == -1
+ throw "OutsideOfParens"
+ endif
+
+ "return the ranges
+ return [l:range_s, l:range_e]
+endfunction
+
+
+"this causes the sclang pipe / terminal app to be killed when you exit vim, if you don't
+"want that to happen then just comment this out
+if !exists("loaded_kill_sclang")
+ if s:sclangKillOnExit
+ au VimLeave * call SClangKill()
+ endif
+ let loaded_kill_sclang = 1
+endif
+
+"the vim version of SendToSC
+function SendToSC(text)
+ let l:text = substitute(a:text, '\', '\\\\', 'g')
+ let l:text = substitute(l:text, '"', '\\"', 'g')
+ let l:cmd = system('echo "' . l:text . '" >> ' . s:sclangPipeLoc)
+ "let l:cmd = system('echo "' . l:text . '" >> /tmp/test')
+endfunction
+
+function SendLineToSC(linenum)
+ let cmd = a:linenum . "w! >> " . s:sclangPipeLoc
+ silent exe cmd
+ "let cmd = a:linenum . "w! >> /tmp/test"
+ "silent exe cmd
+endfunction
+
+function! SClang_send()
+ let cmd = ".w! >> " . s:sclangPipeLoc
+ exe cmd
+ if line(".") == a:lastline
+ call SendToSC(' ')
+ "redraw!
+ endif
+endfunction
+
+function SClangStart()
+ if !filewritable(s:sclangPipeAppPidLoc)
+ call system("tmux splitw -h -p 25; tmux send-keys " . s:sclangPipeApp . " C-m; tmux selectp -L; sleep 1; tmux renamew scvim")
+ else
+ throw s:sclangPipeAppPidLoc . " exists, is " . s:sclangPipeApp . " running? If not try deleting " . s:sclangPipeAppPidLoc
+ endif
+endfunction
+
+function SClangKill()
+ if filewritable(s:sclangPipeAppPidLoc)
+ call system("tmux selectp -R; tmux send-keys C-c; tmux killp -t scvim.1")
+ call SendToSC("Server.quitAll; ")
+ :sleep 10m
+ call system("kill `cat " . s:sclangPipeAppPidLoc . "` && rm " . s:sclangPipeAppPidLoc . " && rm " . s:sclangPipeLoc)
+ end
+endfunction
+
+function SClangRestart()
+ if filewritable(s:sclangPipeAppPidLoc)
+ call system("kill -HUP `cat " . s:sclangPipeAppPidLoc . "`")
+ else
+ call SClangStart()
+ end
+endfunction
+
+function SClang_free(server)
+ call SendToSC('s.freeAll; ')
+ redraw!
+endfunction
+
+function SClang_thisProcess_stop()
+ call SendToSC('thisProcess.stop; ')
+ redraw!
+endfunction
+
+function SClang_TempoClock_clear()
+ call SendToSC('TempoClock.default.clear; ')
+ redraw!
+endfunction
+
+function! SClang_block()
+ let [blkstart,blkend] = FindOuterMostBlock()
+ "blkstart[0],blkend[0] call SClang_send()
+ "these next lines are just a hack, how can i do the above??
+ let cmd = blkstart[0] . "," . blkend[0] . " call SClang_send()"
+ let l:origline = line(".")
+ let l:origcol = col(".")
+ exe cmd
+ call cursor(l:origline,l:origcol)
+
+ ""if the range is just one line
+ "if blkstart[0] == blkend[0]
+ " "XXX call SendToSC(strpart(getline(blkstart[0]),blkstart[1] - 1, (blkend[1] - blkstart[1] + 1)))
+ " call SendLineToSC(blkstart[0])
+ "else
+ " let linen = blkstart[0] - 1
+ " "send the first line as it might not be a full line
+ " "XXX let line = getline(linen)
+ " "XXX call SendToSC(strpart(line, blkstart[1] - 1))
+ " call SendLineToSC(linen)
+ " let linen += 1
+ " let endlinen = blkend[0]
+ " while linen < endlinen
+ " "XXX call SendToSC(getline(linen))
+ " call SendLineToSC(linen)
+ " let linen += 1
+ " endwhile
+ " "send the last line as it might not be a full line
+ " "XXX let line = getline(endlinen)
+ " "XXX call SendToSC(strpart(line,0,blkend[1]))
+ " call SendLineToSC(endlinen)
+ "endif
+ "call SendToSC(' ')
+endfunction
+
+function SCdef(subject)
+ let l:tagfile = s:scvim_cache_dir . "/TAGS_SCDEF"
+ let l:tagdest = s:scvim_cache_dir . "/doc/tags"
+
+ if !filereadable(l:tagfile)
+ echo "definition tag cache does not exist, you must run SCVim.updateCaches in supercollider"
+ let l:dontcare = system("echo 'SC:SCVim SCVim.scd /^' > " . l:tagdest)
+ exe "help SC:SCVim"
+ else
+ let l:dontcare = system("grep SCdef:" . a:subject . " " . l:tagfile . " > " . l:tagdest)
+ exe "help SCdef:" . a:subject
+ end
+endfun
+
+function SChelp(subject)
+ let l:tagfile = s:scvim_cache_dir . "/doc/TAGS_HELP"
+ let l:tagdest = s:scvim_cache_dir . "/doc/tags"
+ if !filereadable(l:tagfile)
+ echo "help tag cache does not exist, you must run SCVim.updateHelpCache in supercollider in order have help docs"
+ let l:dontcare = system("echo 'SC:SCVim SCVim.scd /^' > $SCVIM_CACHE_DIR/doc/tags")
+ exe "help SC:SCVim"
+ return
+ end
+
+ "the keybindings won't find * but will find ** for some reason
+ if a:subject == ""
+ let l:dontcare = system("grep \"SC:Help\" " . l:tagfile . " > " . l:tagdest)
+ exe "help SC:Help"
+ elseif a:subject == "*"
+ let l:dontcare = system("grep \"SC:\\*\" " . l:tagfile . " > " . l:tagdest)
+ exe "help SC:\*" . a:subject
+ elseif a:subject == "**"
+ let l:dontcare = system("grep \"SC:\\*\\*\" " . l:tagfile . " > " . l:tagdest)
+ exe "help SC:\*\*" . a:subject
+ else
+ let l:dontcare = system("grep SC:\"" . a:subject . "\" " . l:tagfile . " > " . l:tagdest)
+ exe "help SC:" . a:subject
+ endif
+endfun
+
+" search help files for word under the cursor
+" or open the HelpBrowser front page
+function! HelpBrowser(subject)
+ if strlen(a:subject) > 0 && a:subject!~" " && a:subject!~"\t"
+ let string= "HelpBrowser.openHelpFor"
+ let format= "(\"" . a:subject . "\"); "
+ let string= string . format
+ call SendToSC(string)
+ else
+ call SendToSC('Help.gui; ')
+ endif
+endfunction
+
+function ListSCObjects(A,L,P)
+ return system("cat $SCVIM_CACHE_DIR/sc_object_completion")
+endfun
+
+function ListSCHelpItems(A,L,P)
+ return system("cat $SCVIM_CACHE_DIR/doc/sc_help_completion")
+endfun
+
+
+"custom commands (SChelp,SCdef,SClangfree)
+com -complete=custom,ListSCHelpItems -nargs=? SChelp call SChelp("<args>")
+com -complete=custom,ListSCObjects -nargs=1 SCdef call SCdef("<args>")
+com -nargs=1 SClangfree call SClang_free("<args>")
+com -nargs=0 SClangStart call SClangStart()
+com -nargs=0 SClangKill call SClangKill()
+com -nargs=0 SClangRestart call SClangRestart()
+
+" end supercollider.vim
diff --git a/bin/syncmpdpl b/bin/syncmpdpl
new file mode 100644
index 0000000..85cf723
--- /dev/null
+++ b/bin/syncmpdpl
@@ -0,0 +1,209 @@
+#! /usr/bin/env python2
+# -*- coding: utf-8 -*-
+#
+# script to sync a mpd playlist to a mass storage audio player
+#
+# needs
+# - python-sqlite2
+# - eyed3
+# - python-argparser
+# - python-mpd
+
+import argparse
+import os
+import sys
+import hashlib
+import subprocess
+
+#from time import time
+import time
+from mpd import (MPDClient, CommandError)
+
+import shutil
+
+# set encoding to utf-8
+reload(sys)
+sys.setdefaultencoding( "utf-8" )
+
+config_dir = '/home/konni/.config/pmsync'
+music = '/net/media/music'
+playlist = 'sync'
+mpdhost = 'innocence'
+destination = '/run/media/konni/ville/music'
+verbose = False
+
+def _recode(string):
+ string = string.replace('"','')
+ # byte2utf8
+ # string = unicode( string, "utf-8", errors="ignore" )
+ # utf2byte
+ string = string.encode('utf-8')
+ return string
+
+def main():
+ global verbose, playlist, mpdhost, destination
+ parser = argparse.ArgumentParser(prog='pmsync')
+
+ parser.add_argument('--version', action='version', version='%(prog)s 0.1')
+ parser.add_argument('-v', '--verbose', action='store_true', dest='verbose', help='verbose mode', default=False)
+
+ parser.add_argument('action', metavar='sync | list | import')
+
+ parser.add_argument('-m', dest='host', metavar='mpdhost', action='store', help='mpd host', default=mpdhost)
+ parser.add_argument('-p', dest='pl', metavar='playlist', action='store', help='playlist to use', default=playlist)
+ parser.add_argument('-d', dest='dest', metavar='destination', action='store', help='destination', default=destination)
+ parser.add_argument('-e', dest='exact', action='store_true', help='exact checking (slow)', default=False)
+
+ args = parser.parse_args()
+ if args.verbose:
+ verbose = args.verbose
+ print args
+
+ ## action sync
+ if args.action == 'sync':
+ print '>> syncing \"{0}/{1}\"to \"{2}\"'.format(args.host, args.pl, args.dest)
+ _sync(args.host, args.pl, args.dest, args.exact)
+
+ ## action list
+ elif args.action == 'list':
+ print '>> listing from \"{0}/{1}\"'.format(args.host, args.pl)
+ _list(args.host, args.pl)
+
+ ## action import
+ elif args.action == 'import':
+ print '>> importing from \"{0}\" to playlist \"{1}/{2}\"'.format(args.dest, args.host, args.pl)
+ port='6600'
+ CON_ID = {'host':args.host, 'port':port}
+ client = MPDClient()
+ mpdConnect(client, CON_ID)
+ playlistinfo = client.listplaylistinfo(playlist)
+ for dirname, dirnames, filenames in os.walk(args.dest):
+ for filename in filenames:
+ destfile = os.path.join(dirname, filename)
+ path=destfile.replace(args.dest+"/","")
+ found = False
+ for item in playlistinfo:
+ if item['file'] == path:
+ found = True
+ if not found:
+ print '[x] {0}'.format(path)
+ client.add(path)
+ client.rm(args.pl)
+ client.save(args.pl)
+
+ ## show help if no action called
+ else:
+ parser.print_help()
+
+def _sync(host, pl, dest, exact):
+ _checkdir(dest)
+ port='6600'
+ CON_ID = {'host':host, 'port':port}
+ client = MPDClient()
+ mpdConnect(client, CON_ID)
+ playlistinfo = client.listplaylistinfo(pl)
+
+ ## copy files
+ print '> copy files'
+ for item in playlistinfo:
+ path = item['file']
+ srcfile=os.path.join(music, path)
+ destfile=os.path.join(dest, path)
+ destdir=os.path.dirname(destfile)
+
+ if not os.path.isdir(destdir):
+ print '[^] {0}'.format(destdir)
+ os.makedirs(destdir)
+ if not os.path.isfile(destfile):
+ shutil.copyfile(srcfile,destfile)
+ print '[+] {0}'.format(path)
+ else:
+ ## hash based on md5sum or just file size
+ if exact:
+ srchash = hashlib.md5(open(srcfile, 'rb').read()).hexdigest()
+ desthash = hashlib.md5(open(destfile, 'rb').read()).hexdigest()
+ else:
+ srchash = os.path.getsize(srcfile)
+ desthash = os.path.getsize(destfile)
+
+ if srchash != desthash:
+ shutil.copyfile(srcfile,destfile)
+ print '[o] {0}'.format(path)
+ else:
+ if verbose:
+ print '[ ] {0}'.format(path)
+
+ print 'done'
+
+ ## clean files
+ print '> clean files and directories'
+ for dirname, dirnames, filenames in os.walk(dest):
+ for filename in filenames:
+ destfile = os.path.join(dirname, filename)
+ path=destfile.replace(dest+"/","")
+ found = False
+ for item in playlistinfo:
+ if item['file'] == path:
+ found = True;
+
+ if not found:
+ try:
+ os.remove(destfile)
+ print '[-] {0}'.format(path)
+ except OSError:
+ print 'error removing {0}'.format(destfile)
+
+ ## clean directories
+ for dirname, dirnames, filenames in os.walk(dest,topdown=False):
+ if os.listdir(dirname) == [] and dirname != dest:
+ try:
+ os.rmdir(dirname)
+ print '[v] {0}'.format(destdir)
+ except OSError:
+ print 'error removing {0} '.format(dirname)
+ print 'done'
+
+ print '> writing filesystem changes'
+ subprocess.call("/bin/sync")
+
+
+def _list(host, pl):
+ port='6600'
+ CON_ID = {'host':host, 'port':port}
+ client = MPDClient()
+ mpdConnect(client, CON_ID)
+ playlistinfo = client.listplaylistinfo(pl)
+
+ ## output
+ print '> copy files'
+ prev_album = ''
+ for item in playlistinfo:
+ artist = item['artist']
+ album = item['album']
+
+ if album != prev_album:
+ print '{0}/{1}'.format(artist, album)
+ prev_album = album
+
+def _output(artist, album, track, title, symbol='', extra=''):
+ output_format = '{symbol:4}{artist:20.20} :: {album:20.20} :: {track:2d} - {title:25.25} {extra}'
+ print output_format.format(symbol=symbol, artist=artist, album=album, track=track, title=title, extra=extra)
+
+
+def mpdConnect(client, con_id):
+ """
+Simple wrapper to connect MPD.
+"""
+ try:
+ client.connect(**con_id)
+ except SocketError:
+ return False
+ return True
+
+def _checkdir(dir):
+ if not os.path.isdir(dir):
+ print "destination not mounted"
+ sys.exit(1)
+
+if __name__ == '__main__':
+ main()
diff --git a/bin/tmux-test b/bin/tmux-test
new file mode 100755
index 0000000..ba0e5c6
--- /dev/null
+++ b/bin/tmux-test
@@ -0,0 +1,53 @@
+#!/bin/bash
+
+###this is going to split the pane into four
+###even horizontal panes
+tmux split-window -v
+sleep 1
+tmux send-keys -t 0 "clear" C-m
+tmux select-pane -t 0
+
+tmux split-window -v
+sleep 1
+tmux select-pane -t 3
+
+tmux split-window -v
+sleep 1
+tmux select-pane -t 5
+
+tmux split-window -v
+tmux select-layout even-vertical
+
+
+###this will split each of the four panes
+###vertically, resulting in eight seperate
+###panes
+
+for i in 0 2 4 6
+do
+tmux select-pane -t $i
+tmux split-window -h
+sleep 1
+done
+
+
+#this goes to each pane and sends a command, in this case - just identifies the pane.
+
+tmux select-pane -t 0
+tmux send-keys -t 0 "This is pane 0" C-m
+tmux select-pane -t 1
+tmux send-keys -t 1 "This is pane 1" C-m
+tmux select-pane -t 2
+tmux send-keys -t 2 "This is pane 2" C-m
+tmux select-pane -t 3
+tmux send-keys -t 3 echo "This is pane 3" C-m
+tmux select-pane -t 4
+tmux send-keys -t 4 "This is pane 4" C-m
+tmux select-pane -t 5
+tmux send-keys -t 5 "This is pane 5" C-m
+tmux select-pane -t 6
+tmux send-keys -t 6 "This is pane 6" C-m
+tmux select-pane -t 7
+tmux send-keys -t 7 "This is pane 7" C-m
+tmux select-pane -t 8
+tmux send-keys -t 8 "This is pane 8" C-m
diff --git a/bin/torrentSort.py b/bin/torrentSort.py
new file mode 100644
index 0000000..e284a88
--- /dev/null
+++ b/bin/torrentSort.py
@@ -0,0 +1,220 @@
+#! /usr/bin/python
+# simple python script to sort torrents
+# modifications by xkonni
+# - added folder sorting
+# - added htdigest authorisation
+# - fixed some minor glitches
+#
+# original version by jonassw from
+# http://forum.xbmc.org/showthread.php?t=60749
+
+# << DOCUMENTATION
+#
+# i) lighttpd configuration for htdigest
+# server.modules += ( "mod_auth" )
+# auth.backend = "htdigest"
+# auth.backend.htdigest.userfile = "/etc/lighttpd/auth"
+# auth.debug = 2
+# auth.require = ( "/RPC2" =>
+# (
+# "method" => "digest",
+# "realm" => "REALM",
+# "require" => "valid-user"
+# )
+# )
+# ii) i recommend starting this with a basic cron job you may find other
+# suggestions like when rtorrent finishes hashing, but for me this caused
+# lockups when starting rtorrent (as all downloads return hash_ok)
+#
+# */5 * * * * for i in /mnt/torrent/tv/*; do torrentSort.py $i > /dev/null; done
+#
+# DOCUMENTATION >>
+
+
+import xmlrpclib, os, sys, re, shutil
+
+
+class HTTPSDigestTransport(xmlrpclib.SafeTransport):
+ """
+Transport that uses urllib2 so that we can do Digest authentication.
+Based upon code at http://bytes.com/topic/python/answers/509382-solution-xml-rpc-over-proxy
+"""
+
+ def __init__(self, username, pw, realm, verbose = None, use_datetime=0):
+ self.__username = username
+ self.__pw = pw
+ self.__realm = realm
+ self.verbose = verbose
+ self._use_datetime = use_datetime
+
+ def request(self, host, handler, request_body, verbose):
+ import urllib2
+
+ url='https://'+host+handler
+ if verbose or self.verbose:
+ print "ProxyTransport URL: [%s]"%url
+
+ request = urllib2.Request(url)
+ request.add_data(request_body)
+ # Note: 'Host' and 'Content-Length' are added automatically
+ request.add_header("User-Agent", self.user_agent)
+ request.add_header("Content-Type", "text/xml") # Important
+
+ # setup digest authentication
+ authhandler = urllib2.HTTPDigestAuthHandler()
+ authhandler.add_password(self.__realm, url, self.__username, self.__pw)
+ opener = urllib2.build_opener(authhandler)
+
+ #proxy_handler=urllib2.ProxyHandler()
+ #opener=urllib2.build_opener(proxy_handler)
+ f=opener.open(request)
+ return(self.parse_response(f))
+
+
+def adoptionCandidates(basedir, filename):
+ dirs = filter(lambda x : os.path.isdir(os.path.join(basedir, x)), os.listdir(basedir))
+
+ #set filename to lowercase for string comparisons
+ filename=filename.lower()
+
+ ignoredPhrases = ['-','_']
+
+ candidates = []
+ for dir in dirs:
+ dirParts = dir.split()
+ score = 0
+ requiredScore = 0
+
+ for part in dirParts:
+ if ignoredPhrases.count(part) > 0:
+ continue
+ requiredScore = requiredScore + 1
+
+ #force lower case for string comparison.
+ part=part.lower()
+ # replace "'" with "" and add word to list
+ repPart = part.replace('\'','')
+ if repPart != part:
+ dirParts.append(repPart)
+ requiredScore -= 1
+ if filename.find(part) >= 0:
+ score = score + 1
+ if score == requiredScore:
+ candidates.append( (os.path.join(basedir, dir), score) )
+
+ return candidates
+
+def getSeasonNumber(filename):
+ patterns = [
+ '.*S(\d+)E(\d+).*',
+ '.*S(\d+)(\.)?E(\d+).*', # hopefully matches series.s01.e05.avi
+ '(\d+)x(\d+).*',
+ '(\d+)(\d+)(\d+).*'
+ # commented out regex thought below Season was '4' not 14. Def better way of doing that
+ #top_gear.14x04.720p_hdtv_x264-fov.mkv
+ #'.*(\d+)x(\d+).*'
+ ]
+
+ for pattern in patterns:
+ p = re.compile(pattern, re.I)
+ g = p.findall(orphanFile)
+ if len(g) > 0:
+ season = int(g[0][0])
+ return season
+ return None
+
+
+def getRtorrentId(filename):
+ downloads = rtorrent.download_list('')
+ for dl in downloads:
+ rfile = rtorrent.d.get_base_filename(dl)
+ if rfile == filename:
+ return dl
+
+# << CONFIGURATION
+# i) FOLDER SETTINGS
+showLocations = ['/mnt/media/tv']
+allowedSourceLocation = '/mnt/media/torrent/complete/tv'
+
+# ii) CONNECTION SETTINGS
+# - using htdigest authorisation
+digestTransport = HTTPSDigestTransport("username", "password", "realm")
+rtorrent = xmlrpclib.ServerProxy('http://localhost',transport=digestTransport)
+# - not using authorisation
+# rtorrent = xmlrpclib.ServerProxy('http://localhost')
+
+# CONFIGURATION >>
+
+print '--------------- BEGIN ---------------'
+orphanFile = sys.argv[1]
+if os.path.isdir(orphanFile):
+ (fpath, fname) = os.path.split(orphanFile)
+ fname = os.path.relpath(orphanFile, allowedSourceLocation)
+
+else:
+ (fpath, fname) = os.path.split(orphanFile)
+print 'File path: %s' % fpath
+print 'File name: %s' % fname
+
+candidates = []
+
+if not orphanFile.startswith(allowedSourceLocation):
+ print 'STOP! This file is not located in %s' % allowedSourceLocation
+ exit()
+
+print 'Attempting to find a home for file %s' % orphanFile
+
+for location in showLocations:
+ candidates.extend(adoptionCandidates(location, fname))
+
+candidates.sort(lambda (da, sa), (db, sb): sb-sa)
+
+if len(candidates) <= 0:
+ print 'No one wanted this file :('
+ exit()
+
+for (dir, score) in candidates:
+ print 'Candidate: %s with score %i' % (dir, score)
+
+print 'Winner is %s with score %i' % candidates[0]
+
+if os.path.isdir(orphanFile):
+ finaldir = candidates[0][0]
+
+else:
+ # Determine Season and Episode number
+ season = getSeasonNumber(fname)
+ if not season:
+ print 'STOP! Season could not be determined.'
+ exit()
+
+ print 'Season was determined to be %i' % season
+ finaldir = os.path.join(candidates[0][0], 'Season %s' % season)
+
+ # Check if season folder is present
+ if not os.path.isdir(finaldir):
+ print 'Season dir doesn\'t exist. Creating now'
+ os.mkdir(finaldir)
+
+ if os.path.isfile(os.path.join(finaldir, fname)):
+ print 'error: file already exists, exiting'
+ sys.exit(1)
+
+ print 'Will move file to %s' % finaldir
+
+
+print 'Requesting id from rtorrent'
+rid = getRtorrentId(fname)
+print '%s was resolved to rtorrent id: %s' % (fname, rid)
+
+print 'Pausing rtorrent'
+rtorrent.d.pause(rid)
+
+print 'Updating rtorrent'
+rtorrent.d.set_directory(rid, finaldir)
+
+print 'Moving file'
+shutil.move(orphanFile, finaldir)
+
+print 'Resuming rtorrent'
+rtorrent.d.resume(rid)