commit 7956b900d981ecd14507e5ca0ba0f0215cc14428 parent 3aae75af93510d96ac16ef590694800f8538b982 Author: dudley <pyratebeard@gmail.com> Date: Sat, 13 Aug 2016 01:22:09 +0100 initial commit Diffstat:
571 files changed, 33092 insertions(+), 2 deletions(-)
diff --git a/README.md b/README.md @@ -1 +1,174 @@ -# dotfiles -\ No newline at end of file +``` + ██ ██ ████ ██ ██ + ░██ ░██ ░██░ ░░ ░██ + ░██ ██████ ██████ ██████ ██ ░██ █████ ██████ + ██████ ██░░░░██░░░██░ ░░░██░ ░██ ░██ ██░░░██ ██░░░░ + ██░░░██░██ ░██ ░██ ░██ ░██ ░██░███████░░█████ +░██ ░██░██ ░██ ░██ ░██ ░██ ░██░██░░░░ ░░░░░██ +░░██████░░██████ ░░██ ░██ ░██ ███░░██████ ██████ + ░░░░░░ ░░░░░░ ░░ ░░ ░░ ░░░ ░░░░░░ ░░░░░░ + + ▓▓▓▓▓▓▓▓▓▓ + ░▓ about ▓ custom linux config files + ░▓ author ▓ pyratebeard <root@pyratebeard.net> + ░▓ code ▓ http://code.pyratebeard.net/dotfiles + ░▓▓▓▓▓▓▓▓▓▓ + ░░░░░░░░░░ + + awesome > awesome wm config and pyratebeard theme + bash > bash settings, aliases, and functions + dwb > dynamic web browser settings + gtk > mod of mist theme for gtk + irssi > nixers irc theme + moc > music on console custom theme and settings + mpd > music player daemon setup + mutt > minimal mutt setup + ncmpcpp > ncurses mpc++ ui/color settings + ranger > file manager with image previews and z3bra theme + sublime > sublime text 2 with greybeard, monokai, and gohu + tmux > terminal multiplexer with custom status bar + urxvt > sourcerer terminal colors and keyboard settings + vim > wizard status bar and sourcerer color scheme + zsh > zshell settings, aliases, and custom prompts + +``` + +##table of contents + - [introduction](#dotfiles) + - [managing](#managing) + - [installing](#installing) + - [how it works](#how-it-works) + - [tl;dr](#tldr) + - [my shell](#my-shell) + - [vim](#vim) + - [previews](#previews) + +#dotfiles +in the unix world programs are commonly configured in two different ways, via shell arguments or text based configuration files. programs with many options like window managers or text editors are configured on a per-user basis with files in your home directory `~`. in unix like operating systems any file or directory name that starts with a period or full stop character is considered hidden, and in a default view will not be displayed. thus the name dotfiles. + +it's been said of every console user: +> _"you are your dotfiles"_. + +since they dictate how your system will look and function. to many users (see [ricers](http://unixporn.net) and [beaners](http://nixers.net)) these files are very important, and need to be backed up and shared. people who create custom themes have the added challenge of managing multiple versions of them. i have tried many organization techniques. and just take my word for it when i say, keeping a git repo in the root of your home directory is a bad idea. i've written custom shell scripts for moving or symlinking files into place. there are even a few dotfile managers, but they all seem to have lots of dependencies. i knew there had to be a simple tool to help me. + +#managing +i manage mine with [gnu stow](http://www.gnu.org/software/stow/), a free, portable, lightweight symlink farm manager. this allows me to keep a versioned directory of all my config files that are virtually linked into place via a single command. this makes sharing these files among many users (root) and computers super simple. and does not clutter your home directory with version control files. + +#installing +stow is available for all linux and most other unix like distributions via your package manager. + +- `sudo pacman -S stow` +- `sudo apt-get install stow` +- `brew install stow` + +or clone it [from source](https://savannah.gnu.org/git/?group=stow) and [build it](http://git.savannah.gnu.org/cgit/stow.git/tree/INSTALL) yourself. + +#how it works +by default the stow command will create symlinks for files in the parent directory of where you execute the command. so my dotfiles setup assumes this repo is located in the root of your home directory `~/dotfiles`. and all stow commands should be executed in that directory. otherwise you'll need to use the `-d` flag with the repo directory location. + +to install most of my configs you execute the stow command with the folder name as the only argument. + +to install my **herbstluft** theme _greybeard_ use the command: + +`stow herbstluftwm` + +this will symlink files to `~/.config/herbstluftwm` and various other places. + +but you can override the default behavior and symlink files to another location with the `-t` (target) argument flag. + +to install the **ryu-login** you need to execute the command: + +`stow -t / ryu-login` + +this will symlink the file to `/etc/issue`. + +**note:** stow can only create a symlink if a config file does not already exist. if a default file was created upon program installation you must delete it first before you can install a new one with stow. this does not apply to directories, only files. + +#tl;dr +navigate to your home directory + +`cd ~` + +clone the repo: + +`git clone http://git.xero.nu/dotfiles.git` + +enter the dotfiles directory + +`cd dotfiles` + +install the zsh settings + +`stow zsh` + +install zsh settings for the root user + +`sudo stow zsh -t /root` + +install awesomewm theme + +`stow awesome` + +uninstall awesome theme + +`stow -D awesome` + +install herbstluftwm + +`stow herbstluftwm` + +etc, etc, etc... + +#my shell +i prefer a minimal setup, and choose to interact with my operating system via the so-called "terminal" or "command line", (read that quoting sarcastically) over a gui interface 2 times out of 3. with the web browser and video player among the noted outliers. in my opinion, using your computer should be a very personal experience. your colors, aliases, key-bindings, etc meticulously crafted to your exacting specifications. so for me, the unix shell is the most important part of my environment. + +![](https://raw.githubusercontent.com/xero/dotfiles/master/previews/xero_shell.gif) + +my terminal emulator of choice is the lightweight, unicode, 256 color [urxvt](http://linux.die.net/man/1/urxvt). i use [zsh](http://linux.die.net/man/1/zsh) as my interactive shell. it's an extensible, bash like shell with awesome completion and correction engines. i manage multiple shell sessions with [tmux](http://linux.die.net/man/1/tmux). it's a feature packed terminal multiplexer with support for buffers, split windows, detached local and remote sessions, etc. i'm a member of the cult of [vim](http://linux.die.net/man/1/vim). sing phrases to the third reincarnation of the glorious ed! lel. [mpd](http://linux.die.net/man/1/mpd) is my music server and i use [ncmpcpp](http://ncmpcpp.rybczak.net/) as it's frontend. my configs for [urxvt](http://git.io/.urxvt), [zsh](http://git.io/.zsh), [tmux](http://git.io/.tmux), [vim](http://git.io/.vim), [mpd](http://git.io/.mpd) and [ncmpcpp](http://git.io/.ncmpcpp) shown above feature my [sourcerer](http://sourcerer.xero.nu) color scheme. + +#vim +with it's tight integration to the unix shell, [vim](http://www.vim.org) has quickly become my editor of choice. once you start to master the movements and operators you quickly begin manipulating, not just editing source code files. + +when you learn vim it's best to use a more vanilla config. if helps you focus on learning the editor and not the plugins. these are also great for [remote machines](http://git.io/.vimrc-min). but for your local dev environment, vim's vast and powerful plugin system can add many great features. i try to keep my editor slim and fast, but i find myself loving these plugins: + +- [vundle](https://github.com/gmarik/vundle.vim) - to manage other plugins +- [you complete me](https://github.com/Valloric/YouCompleteMe) - the best completion system +- [php complete](https://github.com/shawncplus/phpcomplete.vim) - extended php completions +- [syntastic](https://github.com/scrooloose/syntastic) - syntax linting +- [git gutter](https://github.com/airblade/vim-gitgutter) - git diff in the gutter +- [match it](https://github.com/isa/vim-matchit) - extended word and regex matching +- [lightline](https://github.com/itchyny/lightline.vim) - custom status line (for much rice) +- [fugitive](https://github.com/tpope/vim-fugitive) - fast git integration + +#previews +![](https://raw.githubusercontent.com/xero/dotfiles/master/previews/coils.png) +- [herbstluftwm](http://git.io/.herbstluftwm) +- [urxvt](http://git.io/.urxvt) +- [zsh](http://git.io/.zsh) +- [tmux](http://git.io/.tmux) +- [vim](http://git.io/.vim) +- [ncmpcpp](http://git.io/.ncmpcpp) + +![](https://raw.githubusercontent.com/xero/dotfiles/master/previews/blizzard-orb.png) +- [blizzard orb xcolors](https://github.com/xero/dotfiles/blob/master/urxvt/blizzard-orb.Xcolors) + +![](https://raw.githubusercontent.com/xero/dotfiles/master/previews/sysinfo.png) +- [sysinfo](http://git.io/v4aH5) + +![](https://raw.githubusercontent.com/xero/dotfiles/master/previews/neongold.png) +- [irssi](http://git.io/.irssi) + +![](https://raw.githubusercontent.com/xero/dotfiles/master/previews/scrot_converge.png) + +![](https://raw.githubusercontent.com/xero/dotfiles/master/previews/scrot_nightcity-1.png) +- [sysinfo](http://git.io/.sysinfo) + +![](https://raw.githubusercontent.com/xero/dotfiles/master/previews/scrot_nightcity-2.png) +- [sublime greybeard theme](http://git.io/sublimegreybeard) + +![](https://raw.githubusercontent.com/xero/dotfiles/master/previews/scrot_nightcity-3.png) +- [chroimum with cathexis gtk](http://git.io/cathexis) & [greybeard devtools](http://git.io/greybeard-devtools) +- figlet [-f 3d](http://git.io/3d) webdev | lolcat + +![](https://raw.githubusercontent.com/xero/dotfiles/master/previews/scrot_nightcity-5.png) +- [color scripts](http://git.io/.fun) diff --git a/awesome/.config/awesome/lain/README.rst b/awesome/.config/awesome/lain/README.rst @@ -0,0 +1,47 @@ +Lain +==== + +-------------------------------------------------- +Layouts, widgets and utilities for Awesome WM 3.5+ +-------------------------------------------------- + +:Author: Luke Bonham <dada [at] archlinux [dot] info> +:Version: git +:License: GNU-GPL2_ +:Source: https://github.com/copycat-killer/lain + +Description +----------- + +Successor of awesome-vain_, this module provides new layouts, a set of widgets and utility functions, in order to improve Awesome_ usability and configurability. + +Read the wiki_ for all the info. + +Contributions +------------- + +Any contribution is welcome! Feel free to make a pull request. + +Just make sure that: + +- Your code fits with the general style of the module. In particular, you should use the same indentation pattern that the code uses, and also avoid adding space at the ends of lines. + +- Your code its easy to understand, maintainable, and modularized. You should also avoid code duplication wherever possible by adding functions or using ``lain.helpers``. If something is unclear, and you can't write it in such a way that it will be clear, explain it with a comment. + +- You test your changes before submitting to make sure that not only your code works, but did not break other parts of the module too! + +- You eventually update ``wiki`` submodule with a thorough section. + +Contributed widgets have to be put in ``lain/widgets/contrib``. + +Screenshots +----------- + +.. image:: http://i.imgur.com/8D9A7lW.png +.. image:: http://i.imgur.com/9Iv3OR3.png +.. image:: http://i.imgur.com/STCPcaJ.png + +.. _GNU-GPL2: http://www.gnu.org/licenses/gpl-2.0.html +.. _awesome-vain: https://github.com/vain/awesome-vain +.. _Awesome: http://awesome.naquadah.org/ +.. _wiki: https://github.com/copycat-killer/lain/wiki diff --git a/awesome/.config/awesome/lain/asyncshell.lua b/awesome/.config/awesome/lain/asyncshell.lua @@ -0,0 +1,79 @@ + +--[[ + + Licensed under GNU General Public License v2 + * (c) 2015, worron + * (c) 2013, Alexander Yakushev + +--]] + +-- Asynchronous io.popen for Awesome WM. +-- How to use: +-- asyncshell.request('wscript -Kiev', function(output) wwidget.text = output end) + +-- Grab environment +local awful = require('awful') + +-- Avoid discrepancies across multiple shells +awful.util.shell = '/bin/sh' + +-- Initialize tables for module +asyncshell = { request_table = {}, id_counter = 0 } + +-- Request counter +local function next_id() + asyncshell.id_counter = (asyncshell.id_counter + 1) % 10000 + return asyncshell.id_counter +end + +-- Remove given request +function asyncshell.clear(id) + if asyncshell.request_table[id] then + if asyncshell.request_table[id].timer then + asyncshell.request_table[id].timer:stop() + asyncshell.request_table[id].timer = nil + end + asyncshell.request_table[id] = nil + end +end + +-- Sends an asynchronous request for an output of the shell command +-- @param command Command to be executed and taken output from +-- @param callback Function to be called when the command finishes +-- @param timeout Maximum amount of time to wait for the result (optional) +function asyncshell.request(command, callback, timeout) + local id = next_id() + asyncshell.request_table[id] = { callback = callback } + + local formatted_command = string.gsub(command, '"','\"') + + local req = string.format( + "echo \"asyncshell.deliver(%s, [[\\\"$(%s)\\\"]])\" | awesome-client &", + id, formatted_command + ) + + if type(awful.spawn) == 'table' then + awful.spawn.with_shell(req) + else + awful.util.spawn_with_shell(req) + end + + if timeout then + asyncshell.request_table[id].timer = timer({ timeout = timeout }) + asyncshell.request_table[id].timer:connect_signal("timeout", function() asyncshell.clear(id) end) + asyncshell.request_table[id].timer:start() + end +end + +-- Calls the remembered callback function on the output of the shell command +-- @param id Request ID +-- @param output Shell command output to be delievered +function asyncshell.deliver(id, output) + local output = string.sub(output, 2, -2) + if asyncshell.request_table[id] then + asyncshell.request_table[id].callback(output) + asyncshell.clear(id) + end +end + +return asyncshell diff --git a/awesome/.config/awesome/lain/helpers.lua b/awesome/.config/awesome/lain/helpers.lua @@ -0,0 +1,151 @@ + +--[[ + + Licensed under GNU General Public License v2 + * (c) 2013, Luke Bonham + +--]] + +local debug = require("debug") + +local capi = { timer = (type(timer) == 'table' and timer or require ("gears.timer")) } +local io = { open = io.open, + lines = io.lines, + popen = io.popen } +local rawget = rawget +local table = { sort = table.sort } + +-- Lain helper functions for internal use +-- lain.helpers +local helpers = {} + +helpers.lain_dir = debug.getinfo(1, 'S').source:match[[^@(.*/).*$]] +helpers.icons_dir = helpers.lain_dir .. 'icons/' +helpers.scripts_dir = helpers.lain_dir .. 'scripts/' + +-- {{{ Modules loader + +function helpers.wrequire(table, key) + local module = rawget(table, key) + return module or require(table._NAME .. '.' .. key) +end + +-- }}} + +-- {{{ File operations + +-- see if the file exists and is readable +function helpers.file_exists(file) + local f = io.open(file) + if f then + local s = f:read() + f:close() + f = s + end + return f ~= nil +end + +-- get all lines from a file, returns an empty +-- list/table if the file does not exist +function helpers.lines_from(file) + if not helpers.file_exists(file) then return {} end + local lines = {} + for line in io.lines(file) do + lines[#lines + 1] = line + end + return lines +end + +-- match all lines from a file, returns an empty +-- list/table if the file or match does not exist +function helpers.lines_match(regexp, file) + local lines = {} + for index,line in pairs(helpers.lines_from(file)) do + if string.match(line, regexp) then + lines[index] = line + end + end + return lines +end + +-- get first line of a file, return nil if +-- the file does not exist +function helpers.first_line(file) + return helpers.lines_from(file)[1] +end + +-- get first non empty line from a file, +-- returns nil otherwise +function helpers.first_nonempty_line(file) + for k,v in pairs(helpers.lines_from(file)) do + if #v then return v end + end + return nil +end + +-- }}} + +-- {{{ Timer maker + +helpers.timer_table = {} + +function helpers.newtimer(_name, timeout, fun, nostart) + local name = timeout + if not helpers.timer_table[name] then + helpers.timer_table[name] = capi.timer({ timeout = timeout }) + end + helpers.timer_table[name]:connect_signal("timeout", fun) + helpers.timer_table[name]:start() + if not nostart then + helpers.timer_table[name]:emit_signal("timeout") + end +end + +-- }}} + +-- {{{ Pipe operations + +-- read the full output of a pipe (command) +function helpers.read_pipe(cmd) + local f = assert(io.popen(cmd)) + local output = f:read("*all") + f:close() + return output +end + +-- }}} + +-- {{{ A map utility + +helpers.map_table = {} + +function helpers.set_map(element, value) + helpers.map_table[element] = value +end + +function helpers.get_map(element) + return helpers.map_table[element] +end + +-- }}} + +--{{{ Iterate over table of records sorted by keys +function helpers.spairs(t) + -- collect the keys + local keys = {} + for k in pairs(t) do keys[#keys+1] = k end + + table.sort(keys) + + -- return the iterator function + local i = 0 + return function() + i = i + 1 + if keys[i] then + return keys[i], t[keys[i]] + end + end +end +--}}} + +return helpers diff --git a/awesome/.config/awesome/lain/icons/cal/white/1.png b/awesome/.config/awesome/lain/icons/cal/white/1.png Binary files differ. diff --git a/awesome/.config/awesome/lain/icons/cal/white/10.png b/awesome/.config/awesome/lain/icons/cal/white/10.png Binary files differ. diff --git a/awesome/.config/awesome/lain/icons/cal/white/11.png b/awesome/.config/awesome/lain/icons/cal/white/11.png Binary files differ. diff --git a/awesome/.config/awesome/lain/icons/cal/white/12.png b/awesome/.config/awesome/lain/icons/cal/white/12.png Binary files differ. diff --git a/awesome/.config/awesome/lain/icons/cal/white/13.png b/awesome/.config/awesome/lain/icons/cal/white/13.png Binary files differ. diff --git a/awesome/.config/awesome/lain/icons/cal/white/14.png b/awesome/.config/awesome/lain/icons/cal/white/14.png Binary files differ. diff --git a/awesome/.config/awesome/lain/icons/cal/white/15.png b/awesome/.config/awesome/lain/icons/cal/white/15.png Binary files differ. diff --git a/awesome/.config/awesome/lain/icons/cal/white/16.png b/awesome/.config/awesome/lain/icons/cal/white/16.png Binary files differ. diff --git a/awesome/.config/awesome/lain/icons/cal/white/17.png b/awesome/.config/awesome/lain/icons/cal/white/17.png Binary files differ. diff --git a/awesome/.config/awesome/lain/icons/cal/white/18.png b/awesome/.config/awesome/lain/icons/cal/white/18.png Binary files differ. diff --git a/awesome/.config/awesome/lain/icons/cal/white/19.png b/awesome/.config/awesome/lain/icons/cal/white/19.png Binary files differ. diff --git a/awesome/.config/awesome/lain/icons/cal/white/2.png b/awesome/.config/awesome/lain/icons/cal/white/2.png Binary files differ. diff --git a/awesome/.config/awesome/lain/icons/cal/white/20.png b/awesome/.config/awesome/lain/icons/cal/white/20.png Binary files differ. diff --git a/awesome/.config/awesome/lain/icons/cal/white/21.png b/awesome/.config/awesome/lain/icons/cal/white/21.png Binary files differ. diff --git a/awesome/.config/awesome/lain/icons/cal/white/22.png b/awesome/.config/awesome/lain/icons/cal/white/22.png Binary files differ. diff --git a/awesome/.config/awesome/lain/icons/cal/white/23.png b/awesome/.config/awesome/lain/icons/cal/white/23.png Binary files differ. diff --git a/awesome/.config/awesome/lain/icons/cal/white/24.png b/awesome/.config/awesome/lain/icons/cal/white/24.png Binary files differ. diff --git a/awesome/.config/awesome/lain/icons/cal/white/25.png b/awesome/.config/awesome/lain/icons/cal/white/25.png Binary files differ. diff --git a/awesome/.config/awesome/lain/icons/cal/white/26.png b/awesome/.config/awesome/lain/icons/cal/white/26.png Binary files differ. diff --git a/awesome/.config/awesome/lain/icons/cal/white/27.png b/awesome/.config/awesome/lain/icons/cal/white/27.png Binary files differ. diff --git a/awesome/.config/awesome/lain/icons/cal/white/28.png b/awesome/.config/awesome/lain/icons/cal/white/28.png Binary files differ. diff --git a/awesome/.config/awesome/lain/icons/cal/white/29.png b/awesome/.config/awesome/lain/icons/cal/white/29.png Binary files differ. diff --git a/awesome/.config/awesome/lain/icons/cal/white/3.png b/awesome/.config/awesome/lain/icons/cal/white/3.png Binary files differ. diff --git a/awesome/.config/awesome/lain/icons/cal/white/30.png b/awesome/.config/awesome/lain/icons/cal/white/30.png Binary files differ. diff --git a/awesome/.config/awesome/lain/icons/cal/white/31.png b/awesome/.config/awesome/lain/icons/cal/white/31.png Binary files differ. diff --git a/awesome/.config/awesome/lain/icons/cal/white/4.png b/awesome/.config/awesome/lain/icons/cal/white/4.png Binary files differ. diff --git a/awesome/.config/awesome/lain/icons/cal/white/5.png b/awesome/.config/awesome/lain/icons/cal/white/5.png Binary files differ. diff --git a/awesome/.config/awesome/lain/icons/cal/white/6.png b/awesome/.config/awesome/lain/icons/cal/white/6.png Binary files differ. diff --git a/awesome/.config/awesome/lain/icons/cal/white/7.png b/awesome/.config/awesome/lain/icons/cal/white/7.png Binary files differ. diff --git a/awesome/.config/awesome/lain/icons/cal/white/8.png b/awesome/.config/awesome/lain/icons/cal/white/8.png Binary files differ. diff --git a/awesome/.config/awesome/lain/icons/cal/white/9.png b/awesome/.config/awesome/lain/icons/cal/white/9.png Binary files differ. diff --git a/awesome/.config/awesome/lain/icons/layout/default/cascade.png b/awesome/.config/awesome/lain/icons/layout/default/cascade.png Binary files differ. diff --git a/awesome/.config/awesome/lain/icons/layout/default/cascadebrowse.png b/awesome/.config/awesome/lain/icons/layout/default/cascadebrowse.png Binary files differ. diff --git a/awesome/.config/awesome/lain/icons/layout/default/cascadebrowsew.png b/awesome/.config/awesome/lain/icons/layout/default/cascadebrowsew.png Binary files differ. diff --git a/awesome/.config/awesome/lain/icons/layout/default/cascadew.png b/awesome/.config/awesome/lain/icons/layout/default/cascadew.png Binary files differ. diff --git a/awesome/.config/awesome/lain/icons/layout/default/centerfair.png b/awesome/.config/awesome/lain/icons/layout/default/centerfair.png Binary files differ. diff --git a/awesome/.config/awesome/lain/icons/layout/default/centerfairw.png b/awesome/.config/awesome/lain/icons/layout/default/centerfairw.png Binary files differ. diff --git a/awesome/.config/awesome/lain/icons/layout/default/centerhwork.png b/awesome/.config/awesome/lain/icons/layout/default/centerhwork.png Binary files differ. diff --git a/awesome/.config/awesome/lain/icons/layout/default/centerhworkw.png b/awesome/.config/awesome/lain/icons/layout/default/centerhworkw.png Binary files differ. diff --git a/awesome/.config/awesome/lain/icons/layout/default/centerwork.png b/awesome/.config/awesome/lain/icons/layout/default/centerwork.png Binary files differ. diff --git a/awesome/.config/awesome/lain/icons/layout/default/centerworkw.png b/awesome/.config/awesome/lain/icons/layout/default/centerworkw.png Binary files differ. diff --git a/awesome/.config/awesome/lain/icons/layout/default/termfair.png b/awesome/.config/awesome/lain/icons/layout/default/termfair.png Binary files differ. diff --git a/awesome/.config/awesome/lain/icons/layout/default/termfairw.png b/awesome/.config/awesome/lain/icons/layout/default/termfairw.png Binary files differ. diff --git a/awesome/.config/awesome/lain/icons/layout/zenburn/cascade.png b/awesome/.config/awesome/lain/icons/layout/zenburn/cascade.png Binary files differ. diff --git a/awesome/.config/awesome/lain/icons/layout/zenburn/cascadebrowse.png b/awesome/.config/awesome/lain/icons/layout/zenburn/cascadebrowse.png Binary files differ. diff --git a/awesome/.config/awesome/lain/icons/layout/zenburn/centerfair.png b/awesome/.config/awesome/lain/icons/layout/zenburn/centerfair.png Binary files differ. diff --git a/awesome/.config/awesome/lain/icons/layout/zenburn/centerwork.png b/awesome/.config/awesome/lain/icons/layout/zenburn/centerwork.png Binary files differ. diff --git a/awesome/.config/awesome/lain/icons/layout/zenburn/termfair.png b/awesome/.config/awesome/lain/icons/layout/zenburn/termfair.png Binary files differ. diff --git a/awesome/.config/awesome/lain/icons/mail.png b/awesome/.config/awesome/lain/icons/mail.png Binary files differ. diff --git a/awesome/.config/awesome/lain/icons/no_net.png b/awesome/.config/awesome/lain/icons/no_net.png Binary files differ. diff --git a/awesome/.config/awesome/lain/icons/openweathermap/01d.png b/awesome/.config/awesome/lain/icons/openweathermap/01d.png Binary files differ. diff --git a/awesome/.config/awesome/lain/icons/openweathermap/01n.png b/awesome/.config/awesome/lain/icons/openweathermap/01n.png Binary files differ. diff --git a/awesome/.config/awesome/lain/icons/openweathermap/02d.png b/awesome/.config/awesome/lain/icons/openweathermap/02d.png Binary files differ. diff --git a/awesome/.config/awesome/lain/icons/openweathermap/02n.png b/awesome/.config/awesome/lain/icons/openweathermap/02n.png Binary files differ. diff --git a/awesome/.config/awesome/lain/icons/openweathermap/03d.png b/awesome/.config/awesome/lain/icons/openweathermap/03d.png Binary files differ. diff --git a/awesome/.config/awesome/lain/icons/openweathermap/03n.png b/awesome/.config/awesome/lain/icons/openweathermap/03n.png Binary files differ. diff --git a/awesome/.config/awesome/lain/icons/openweathermap/04d.png b/awesome/.config/awesome/lain/icons/openweathermap/04d.png Binary files differ. diff --git a/awesome/.config/awesome/lain/icons/openweathermap/04n.png b/awesome/.config/awesome/lain/icons/openweathermap/04n.png @@ -0,0 +1 @@ +04d.png +\ No newline at end of file diff --git a/awesome/.config/awesome/lain/icons/openweathermap/09d.png b/awesome/.config/awesome/lain/icons/openweathermap/09d.png Binary files differ. diff --git a/awesome/.config/awesome/lain/icons/openweathermap/09n.png b/awesome/.config/awesome/lain/icons/openweathermap/09n.png @@ -0,0 +1 @@ +09d.png +\ No newline at end of file diff --git a/awesome/.config/awesome/lain/icons/openweathermap/10d.png b/awesome/.config/awesome/lain/icons/openweathermap/10d.png Binary files differ. diff --git a/awesome/.config/awesome/lain/icons/openweathermap/10n.png b/awesome/.config/awesome/lain/icons/openweathermap/10n.png @@ -0,0 +1 @@ +10d.png +\ No newline at end of file diff --git a/awesome/.config/awesome/lain/icons/openweathermap/11d.png b/awesome/.config/awesome/lain/icons/openweathermap/11d.png Binary files differ. diff --git a/awesome/.config/awesome/lain/icons/openweathermap/11n.png b/awesome/.config/awesome/lain/icons/openweathermap/11n.png @@ -0,0 +1 @@ +11d.png +\ No newline at end of file diff --git a/awesome/.config/awesome/lain/icons/openweathermap/13d.png b/awesome/.config/awesome/lain/icons/openweathermap/13d.png Binary files differ. diff --git a/awesome/.config/awesome/lain/icons/openweathermap/13n.png b/awesome/.config/awesome/lain/icons/openweathermap/13n.png @@ -0,0 +1 @@ +13d.png +\ No newline at end of file diff --git a/awesome/.config/awesome/lain/icons/openweathermap/50d.png b/awesome/.config/awesome/lain/icons/openweathermap/50d.png Binary files differ. diff --git a/awesome/.config/awesome/lain/icons/openweathermap/50n.png b/awesome/.config/awesome/lain/icons/openweathermap/50n.png @@ -0,0 +1 @@ +50d.png +\ No newline at end of file diff --git a/awesome/.config/awesome/lain/icons/openweathermap/README.md b/awesome/.config/awesome/lain/icons/openweathermap/README.md @@ -0,0 +1,3 @@ +[Plain Weather Icons](http://merlinthered.deviantart.com/art/plain-weather-icons-157162192), created by [MerlinTheRed](http://merlinthered.deviantart.com/). + +<a href="http://creativecommons.org/licenses/by-nc-sa/2.5/"><img src="http://i.creativecommons.org/l/by-nc-sa/2.5/80x15.png" align="right"></a> diff --git a/awesome/.config/awesome/lain/icons/openweathermap/na.png b/awesome/.config/awesome/lain/icons/openweathermap/na.png Binary files differ. diff --git a/awesome/.config/awesome/lain/icons/redshift/redshift_off.png b/awesome/.config/awesome/lain/icons/redshift/redshift_off.png Binary files differ. diff --git a/awesome/.config/awesome/lain/icons/redshift/redshift_on.png b/awesome/.config/awesome/lain/icons/redshift/redshift_on.png Binary files differ. diff --git a/awesome/.config/awesome/lain/icons/taskwarrior/task.png b/awesome/.config/awesome/lain/icons/taskwarrior/task.png Binary files differ. diff --git a/awesome/.config/awesome/lain/icons/taskwarrior/tasksmall.png b/awesome/.config/awesome/lain/icons/taskwarrior/tasksmall.png Binary files differ. diff --git a/awesome/.config/awesome/lain/init.lua b/awesome/.config/awesome/lain/init.lua @@ -0,0 +1,21 @@ + +--[[ + + Lain + Layouts, widgets and utilities for Awesome WM + + Licensed under GNU General Public License v2 + * (c) 2013, Luke Bonham + +--]] + +package.loaded.lain = nil + +local lain = +{ + layout = require("lain.layout"), + util = require("lain.util"), + widgets = require("lain.widgets") +} + +return lain diff --git a/awesome/.config/awesome/lain/layout/cascade.lua b/awesome/.config/awesome/lain/layout/cascade.lua @@ -0,0 +1,79 @@ + +--[[ + + Licensed under GNU General Public License v2 + * (c) 2014, projektile + * (c) 2013, Luke Bonham + * (c) 2010-2012, Peter Hofmann + +--]] + +local tag = require("awful.tag") +local beautiful = require("beautiful") + +local cascade = +{ + name = "cascade", + nmaster = 0, + offset_x = 32, + offset_y = 8 +} + +function cascade.arrange(p) + + -- Cascade windows. + + -- A global border can be defined with + -- beautiful.global_border_width. + local global_border = tonumber(beautiful.global_border_width) or 0 + if global_border < 0 then global_border = 0 end + + -- Screen. + local wa = p.workarea + local cls = p.clients + + wa.height = wa.height - (global_border * 2) + wa.width = wa.width - (global_border * 2) + wa.x = wa.x + global_border + wa.y = wa.y + global_border + + -- Opening a new window will usually force all existing windows to + -- get resized. This wastes a lot of CPU time. So let's set a lower + -- bound to "how_many": This wastes a little screen space but you'll + -- get a much better user experience. + local t = tag.selected(p.screen) + local num_c + if cascade.nmaster > 0 + then + num_c = cascade.nmaster + else + num_c = tag.getnmaster(t) + end + + local how_many = #cls + if how_many < num_c + then + how_many = num_c + end + + local current_offset_x = cascade.offset_x * (how_many - 1) + local current_offset_y = cascade.offset_y * (how_many - 1) + + -- Iterate. + for i = 1,#cls,1 + do + local c = cls[i] + local g = {} + + g.x = wa.x + (how_many - i) * cascade.offset_x + g.y = wa.y + (i - 1) * cascade.offset_y + g.width = wa.width - current_offset_x - 2*c.border_width + g.height = wa.height - current_offset_y - 2*c.border_width + if g.width < 1 then g.width = 1 end + if g.height < 1 then g.height = 1 end + + c:geometry(g) + end +end + +return cascade diff --git a/awesome/.config/awesome/lain/layout/cascadetile.lua b/awesome/.config/awesome/lain/layout/cascadetile.lua @@ -0,0 +1,174 @@ + +--[[ + + Licensed under GNU General Public License v2 + * (c) 2014, projektile + * (c) 2013, Luke Bonham + * (c) 2010-2012, Peter Hofmann + +--]] + +local tag = require("awful.tag") +local beautiful = require("beautiful") +local tonumber = tonumber + +local cascadetile = +{ + name = "cascadetile", + nmaster = 0, + ncol = 0, + mwfact = 0, + offset_x = 5, + offset_y = 32, + extra_padding = 0 +} + +function cascadetile.arrange(p) + + -- Layout with one fixed column meant for a master window. Its + -- width is calculated according to mwfact. Other clients are + -- cascaded or "tabbed" in a slave column on the right. + + -- It's a bit hard to demonstrate the behaviour with ASCII-images... + -- + -- (1) (2) (3) (4) + -- +----------+---+ +----------+---+ +----------+---+ +----------+---+ + -- | | | | | 3 | | | 4 | | +---+| + -- | | | -> | | | -> | +---++ -> | +---+|+ + -- | 1 | 2 | | 1 +---++ | 1 | 3 || | 1 +---+|+| + -- | | | | | 2 || | +---++| | +---+|+ | + -- | | | | | || | | 2 | | | | 2 |+ | + -- +----------+---+ +---------+---++ +--------+---+-+ +------+---+---+ + + -- A useless gap (like the dwm patch) can be defined with + -- beautiful.useless_gap_width. + local useless_gap = tonumber(beautiful.useless_gap_width) or 0 + if useless_gap < 0 then useless_gap = 0 end + + -- A global border can be defined with + -- beautiful.global_border_width + local global_border = tonumber(beautiful.global_border_width) or 0 + if global_border < 0 then global_border = 0 end + + -- Screen. + local wa = p.workarea + local cls = p.clients + + -- Borders are factored in. + wa.height = wa.height - (global_border * 2) + wa.width = wa.width - (global_border * 2) + wa.x = wa.x + global_border + wa.y = wa.y + global_border + + -- Width of main column? + local t = tag.selected(p.screen) + local mwfact + if cascadetile.mwfact > 0 + then + mwfact = cascadetile.mwfact + else + mwfact = tag.getmwfact(t) + end + + -- Make slave windows overlap main window? Do this if ncol is 1. + local overlap_main + if cascadetile.ncol > 0 + then + overlap_main = cascadetile.ncol + else + overlap_main = tag.getncol(t) + end + + -- Minimum space for slave windows? See cascade.lua. + local num_c + if cascadetile.nmaster > 0 + then + num_c = cascadetile.nmaster + else + num_c = tag.getnmaster(t) + end + + local how_many = #cls - 1 + if how_many < num_c + then + how_many = num_c + end + local current_offset_x = cascadetile.offset_x * (how_many - 1) + local current_offset_y = cascadetile.offset_y * (how_many - 1) + + if #cls > 0 + then + -- Main column, fixed width and height. + local c = cls[1] + local g = {} + -- Subtracting the useless_gap width from the work area width here + -- makes this mwfact calculation work the same as in uselesstile. + -- Rounding is necessary to prevent the rendered size of slavewid + -- from being 1 pixel off when the result is not an integer. + local mainwid = math.floor((wa.width - useless_gap) * mwfact) + local slavewid = wa.width - mainwid + + if overlap_main == 1 + then + g.width = wa.width - 2*c.border_width + + -- The size of the main window may be reduced a little bit. + -- This allows you to see if there are any windows below the + -- main window. + -- This only makes sense, though, if the main window is + -- overlapping everything else. + g.width = g.width - cascadetile.extra_padding + else + g.width = mainwid - 2*c.border_width + end + + g.height = wa.height - 2*c.border_width + g.x = wa.x + g.y = wa.y + if useless_gap > 0 + then + -- Reduce width once and move window to the right. Reduce + -- height twice, however. + g.width = g.width - useless_gap + g.height = g.height - 2 * useless_gap + g.x = g.x + useless_gap + g.y = g.y + useless_gap + + -- When there's no window to the right, add an additional + -- gap. + if overlap_main == 1 + then + g.width = g.width - useless_gap + end + end + if g.width < 1 then g.width = 1 end + if g.height < 1 then g.height = 1 end + c:geometry(g) + + -- Remaining clients stacked in slave column, new ones on top. + if #cls > 1 + then + for i = 2,#cls + do + c = cls[i] + g = {} + g.width = slavewid - current_offset_x - 2*c.border_width + g.height = wa.height - current_offset_y - 2*c.border_width + g.x = wa.x + mainwid + (how_many - (i - 1)) * cascadetile.offset_x + g.y = wa.y + (i - 2) * cascadetile.offset_y + if useless_gap > 0 + then + g.width = g.width - 2 * useless_gap + g.height = g.height - 2 * useless_gap + g.x = g.x + useless_gap + g.y = g.y + useless_gap + end + if g.width < 1 then g.width = 1 end + if g.height < 1 then g.height = 1 end + c:geometry(g) + end + end + end +end + +return cascadetile diff --git a/awesome/.config/awesome/lain/layout/centerfair.lua b/awesome/.config/awesome/lain/layout/centerfair.lua @@ -0,0 +1,164 @@ + +--[[ + + Licensed under GNU General Public License v2 + * (c) 2014, projektile + * (c) 2013, Luke Bonham + * (c) 2010, Nicolas Estibals + * (c) 2010-2012, Peter Hofmann + +--]] + +local tag = require("awful.tag") +local beautiful = require("beautiful") +local math = { ceil = math.ceil, + floor = math.floor, + max = math.max } +local tonumber = tonumber + +local centerfair = { name = "centerfair" } + +function centerfair.arrange(p) + -- Layout with fixed number of vertical columns (read from nmaster). + -- Cols are centerded until there is nmaster columns, then windows + -- are stacked in the slave columns, with at most ncol clients per + -- column if possible. + + -- with nmaster=3 and ncol=1 you'll have + -- (1) (2) (3) + -- +---+---+---+ +-+---+---+-+ +---+---+---+ + -- | | | | | | | | | | | | | + -- | | 1 | | -> | | 1 | 2 | | -> | 1 | 2 | 3 | -> + -- | | | | | | | | | | | | | + -- +---+---+---+ +-+---+---+-+ +---+---+---+ + + -- (4) (5) + -- +---+---+---+ +---+---+---+ + -- | | | 3 | | | 2 | 4 | + -- + 1 + 2 +---+ -> + 1 +---+---+ + -- | | | 4 | | | 3 | 5 | + -- +---+---+---+ +---+---+---+ + + -- A useless gap (like the dwm patch) can be defined with + -- beautiful.useless_gap_width . + local useless_gap = tonumber(beautiful.useless_gap_width) or 0 + if useless_gap < 0 then useless_gap = 0 end + + -- A global border can be defined with + -- beautiful.global_border_width + local global_border = tonumber(beautiful.global_border_width) or 0 + if global_border < 0 then global_border = 0 end + + -- Screen. + local wa = p.workarea + local cls = p.clients + + -- Borders are factored in. + wa.height = wa.height - (global_border * 2) + wa.width = wa.width - (global_border * 2) + wa.x = wa.x + global_border + wa.y = wa.y + global_border + + -- How many vertical columns? Read from nmaster on the tag. + local t = tag.selected(p.screen) + local num_x = centerfair.nmaster or tag.getnmaster(t) + local ncol = centerfair.ncol or tag.getncol(t) + if num_x <= 2 then num_x = 2 end + + local width = math.floor((wa.width - (num_x + 1)*useless_gap) / num_x) + + if #cls < num_x + then + -- Less clients than the number of columns, let's center it! + local offset_x = wa.x + (wa.width - #cls*width - (#cls - 1)*useless_gap) / 2 + local g = {} + g.y = wa.y + useless_gap + for i = 1, #cls do + local c = cls[i] + g.width = width - 2*c.border_width + g.height = wa.height - 2*useless_gap - 2*c.border_width + if g.width < 1 then g.width = 1 end + if g.height < 1 then g.height = 1 end + g.x = offset_x + (i - 1) * (width + useless_gap) + c:geometry(g) + end + else + -- More clients than the number of columns, let's arrange it! + -- Master client deserves a special treatement + local c = cls[1] + local g = {} + g.width = wa.width - (num_x - 1)*width - (num_x + 1)*useless_gap - 2*c.border_width + g.height = wa.height - 2*useless_gap - 2*c.border_width + if g.width < 1 then g.width = 1 end + if g.height < 1 then g.height = 1 end + g.x = wa.x + useless_gap + g.y = wa.y + useless_gap + + c:geometry(g) + + -- Treat the other clients + + -- Compute distribution of clients among columns + local num_y ={} + do + local remaining_clients = #cls-1 + local ncol_min = math.ceil(remaining_clients/(num_x-1)) + if ncol >= ncol_min + then + for i = (num_x-1), 1, -1 do + if (remaining_clients-i+1) < ncol + then + num_y[i] = remaining_clients-i + 1 + else + num_y[i] = ncol + end + remaining_clients = remaining_clients - num_y[i] + end + else + local rem = remaining_clients % (num_x-1) + if rem ==0 + then + for i = 1, num_x-1 do + num_y[i] = ncol_min + end + else + for i = 1, num_x-1 do + num_y[i] = ncol_min - 1 + end + for i = 0, rem-1 do + num_y[num_x-1-i] = num_y[num_x-1-i] + 1 + end + end + end + end + + -- Compute geometry of the other clients + local nclient = 2 -- we start with the 2nd client + g.x = g.x + g.width + useless_gap + 2*c.border_width + + for i = 1, (num_x-1) do + local height = math.floor((wa.height - (num_y[i] + 1)*useless_gap) / num_y[i]) + g.y = wa.y + useless_gap + for j = 0, (num_y[i]-2) do + local c = cls[nclient] + g.height = height - 2*c.border_width + g.width = width - 2*c.border_width + if g.width < 1 then g.width = 1 end + if g.height < 1 then g.height = 1 end + c:geometry(g) + nclient = nclient + 1 + g.y = g.y + height + useless_gap + end + local c = cls[nclient] + g.height = wa.height - (num_y[i] + 1)*useless_gap - (num_y[i] - 1)*height - 2*c.border_width + g.width = width - 2*c.border_width + if g.width < 1 then g.width = 1 end + if g.height < 1 then g.height = 1 end + c:geometry(g) + nclient = nclient + 1 + g.x = g.x + width + useless_gap + end + end +end + +return centerfair diff --git a/awesome/.config/awesome/lain/layout/centerhwork.lua b/awesome/.config/awesome/lain/layout/centerhwork.lua @@ -0,0 +1,136 @@ + +--[[ + + Licensed under GNU General Public License v2 + * (c) 2015, Joerg Jaspert + * (c) 2014, projektile + * (c) 2013, Luke Bonham + * (c) 2010-2012, Peter Hofmann + +--]] + +local awful = require("awful") +local beautiful = require("beautiful") +local tonumber = tonumber + +local centerhwork = +{ + name = "centerhwork", + top_left = 0, + top_right = 1, + bottom_left = 2, + bottom_right = 3 +} + +function centerhwork.arrange(p) + -- A useless gap (like the dwm patch) can be defined with + -- beautiful.useless_gap_width . + local useless_gap = tonumber(beautiful.useless_gap_width) or 0 + + -- A global border can be defined with + -- beautiful.global_border_width + local global_border = tonumber(beautiful.global_border_width) or 0 + if global_border < 0 then global_border = 0 end + + -- Screen. + local wa = p.workarea + local cls = p.clients + + -- Borders are factored in. + wa.height = wa.height - (global_border * 2) + wa.width = wa.width - (global_border * 2) + wa.x = wa.x + global_border + wa.y = wa.y + global_border + + -- Width of main column? + local t = awful.tag.selected(p.screen) + local mwfact = awful.tag.getmwfact(t) + + if #cls > 0 + then + -- Main column, fixed width and height. + local c = cls[1] + local g = {} + local mainhei = math.floor(wa.height * mwfact) + local slaveLwid = math.floor(wa.width / 2 ) + local slaveRwid = wa.width - slaveLwid + local slavehei = wa.height - mainhei + local slaveThei = math.floor(slavehei / 2) + local slaveBhei = slavehei - slaveThei + local Lhalfgap = math.floor(useless_gap / 2) + local Rhalfgap = useless_gap - Lhalfgap + + g.height = mainhei - 2*c.border_width + g.width = wa.width - 2*useless_gap - 2*c.border_width + g.x = wa.x + useless_gap + g.y = wa.y + slaveThei + + if g.width < 1 then g.width = 1 end + if g.height < 1 then g.height = 1 end + c:geometry(g) + + -- Auxiliary windows. + if #cls > 1 + then + local at = 0 + for i = 2,#cls + do + -- It's all fixed. If there are more than 5 clients, + -- those additional clients will float. This is + -- intentional. + if at == 4 + then + break + end + + c = cls[i] + g = {} + + if i - 2 == centerhwork.top_left + then + -- top left + g.x = wa.x + useless_gap + g.y = wa.y + useless_gap + g.width = slaveLwid - useless_gap - Lhalfgap - 2*c.border_width + g.height = slaveThei - 2*useless_gap - 2*c.border_width + elseif i - 2 == centerhwork.top_right + then + -- top right + g.x = wa.x + slaveLwid + Rhalfgap + g.y = wa.y + useless_gap + g.width = slaveRwid - useless_gap - Rhalfgap - 2*c.border_width + g.height = slaveThei - 2*useless_gap - 2*c.border_width + elseif i - 2 == centerhwork.bottom_left + then + -- bottom left + g.x = wa.x + useless_gap + g.y = wa.y + mainhei + slaveThei + useless_gap + g.width = slaveLwid - useless_gap - Lhalfgap - 2*c.border_width + g.height = slaveBhei - 2*useless_gap - 2*c.border_width + elseif i - 2 == centerhwork.bottom_right + then + -- bottom right + g.x = wa.x + slaveLwid + Rhalfgap + g.y = wa.y + mainhei + slaveThei + useless_gap + g.width = slaveRwid - useless_gap - Rhalfgap - 2*c.border_width + g.height = slaveBhei - 2*useless_gap - 2*c.border_width + end + + if g.width < 1 then g.width = 1 end + if g.height < 1 then g.height = 1 end + c:geometry(g) + + at = at + 1 + end + + -- Set remaining clients to floating. + for i = (#cls - 1 - 4),1,-1 + do + c = cls[i] + awful.client.floating.set(c, true) + end + end + end +end + +return centerhwork diff --git a/awesome/.config/awesome/lain/layout/centerwork.lua b/awesome/.config/awesome/lain/layout/centerwork.lua @@ -0,0 +1,136 @@ + +--[[ + + Licensed under GNU General Public License v2 + * (c) 2014, projektile + * (c) 2013, Luke Bonham + * (c) 2010-2012, Peter Hofmann + +--]] + +local awful = require("awful") +local beautiful = require("beautiful") +local tonumber = tonumber +local math = { floor = math.floor } + +local centerwork = +{ + name = "centerwork", + top_right = 0, + bottom_right = 1, + bottom_left = 2, + top_left = 3 +} + +function centerwork.arrange(p) + -- A useless gap (like the dwm patch) can be defined with + -- beautiful.useless_gap_width . + local useless_gap = tonumber(beautiful.useless_gap_width) or 0 + + -- A global border can be defined with + -- beautiful.global_border_width + local global_border = tonumber(beautiful.global_border_width) or 0 + if global_border < 0 then global_border = 0 end + + -- Screen. + local wa = p.workarea + local cls = p.clients + + -- Borders are factored in. + wa.height = wa.height - (global_border * 2) + wa.width = wa.width - (global_border * 2) + wa.x = wa.x + global_border + wa.y = wa.y + global_border + + -- Width of main column? + local t = awful.tag.selected(p.screen) + local mwfact = awful.tag.getmwfact(t) + + if #cls > 0 + then + -- Main column, fixed width and height. + local c = cls[1] + local g = {} + local mainwid = math.floor(wa.width * mwfact) + local slavewid = wa.width - mainwid + local slaveLwid = math.floor(slavewid / 2) + local slaveRwid = slavewid - slaveLwid + local slaveThei = math.floor(wa.height / 2) + local slaveBhei = wa.height - slaveThei + local Thalfgap = math.floor(useless_gap / 2) + local Bhalfgap = useless_gap - Thalfgap + + g.height = wa.height - 2*useless_gap - 2*c.border_width + g.width = mainwid - 2*c.border_width + g.x = wa.x + slaveLwid + g.y = wa.y + useless_gap + + if g.width < 1 then g.width = 1 end + if g.height < 1 then g.height = 1 end + c:geometry(g) + + -- Auxiliary windows. + if #cls > 1 + then + local at = 0 + for i = 2,#cls + do + -- It's all fixed. If there are more than 5 clients, + -- those additional clients will float. This is + -- intentional. + if at == 4 + then + break + end + + c = cls[i] + g = {} + + if i - 2 == centerwork.top_left + then + -- top left + g.x = wa.x + useless_gap + g.y = wa.y + useless_gap + g.width = slaveLwid - 2*useless_gap - 2*c.border_width + g.height = slaveThei - useless_gap - Thalfgap - 2*c.border_width + elseif i - 2 == centerwork.top_right + then + -- top right + g.x = wa.x + slaveLwid + mainwid + useless_gap + g.y = wa.y + useless_gap + g.width = slaveRwid - 2*useless_gap - 2*c.border_width + g.height = slaveThei - useless_gap - Thalfgap - 2*c.border_width + elseif i - 2 == centerwork.bottom_left + then + -- bottom left + g.x = wa.x + useless_gap + g.y = wa.y + slaveThei + Bhalfgap + g.width = slaveLwid - 2*useless_gap - 2*c.border_width + g.height = slaveBhei - useless_gap - Bhalfgap - 2*c.border_width + elseif i - 2 == centerwork.bottom_right + then + -- bottom right + g.x = wa.x + slaveLwid + mainwid + useless_gap + g.y = wa.y + slaveThei + Bhalfgap + g.width = slaveRwid - 2*useless_gap - 2*c.border_width + g.height = slaveBhei - useless_gap - Bhalfgap - 2*c.border_width + end + + if g.width < 1 then g.width = 1 end + if g.height < 1 then g.height = 1 end + c:geometry(g) + + at = at + 1 + end + + -- Set remaining clients to floating. + for i = (#cls - 1 - 4),1,-1 + do + c = cls[i] + awful.client.floating.set(c, true) + end + end + end +end + +return centerwork diff --git a/awesome/.config/awesome/lain/layout/centerworkd.lua b/awesome/.config/awesome/lain/layout/centerworkd.lua @@ -0,0 +1,123 @@ + +--[[ + + Licensed under GNU General Public License v2 + * (c) 2016, Henrik Antonsson + * (c) 2014, projektile + * (c) 2013, Luke Bonham + * (c) 2010-2012, Peter Hofmann + + Based on centerwork.lua +--]] + +local awful = require("awful") +local beautiful = require("beautiful") +local tonumber = tonumber +local math = { floor = math.floor } + +local centerworkd = +{ + name = "centerworkd", +} + +function centerworkd.arrange(p) + -- A useless gap (like the dwm patch) can be defined with + -- beautiful.useless_gap_width . + local useless_gap = tonumber(beautiful.useless_gap_width) or 0 + + -- A global border can be defined with + -- beautiful.global_border_width + local global_border = tonumber(beautiful.global_border_width) or 0 + if global_border < 0 then global_border = 0 end + + -- Screen. + local wa = p.workarea + local cls = p.clients + + -- Borders are factored in. + wa.height = wa.height - (global_border * 2) + wa.width = wa.width - (global_border * 2) + wa.x = wa.x + global_border + wa.y = wa.y + global_border + + -- Width of main column? + local t = awful.tag.selected(p.screen) + local mwfact = awful.tag.getmwfact(t) + + if #cls > 0 + then + -- Main column, fixed width and height. + local c = cls[1] + local g = {} + local mainwid = math.floor(wa.width * mwfact) + local slavewid = wa.width - mainwid + local slaveLwid = math.floor(slavewid / 2) + local slaveRwid = slavewid - slaveLwid + local nbrLeftSlaves = math.floor(#cls / 2) + local nbrRightSlaves = math.floor((#cls - 1) / 2) + + local slaveLeftHeight = 0 + if nbrLeftSlaves > 0 then slaveLeftHeight = math.floor(wa.height / nbrLeftSlaves) end + if nbrRightSlaves > 0 then slaveRightHeight = math.floor(wa.height / nbrRightSlaves) end + + g.height = wa.height - 2*useless_gap - 2*c.border_width + g.width = mainwid - 2*c.border_width + g.x = wa.x + slaveLwid + g.y = wa.y + useless_gap + + if g.width < 1 then g.width = 1 end + if g.height < 1 then g.height = 1 end + c:geometry(g) + + -- Auxiliary windows. + if #cls > 1 + then + for i = 2,#cls + do + c = cls[i] + g = {} + + local rowIndex = math.floor(i/2) + + -- If i is even it should be placed on the left side + if i % 2 == 0 + then + -- left slave + g.x = wa.x + useless_gap + g.y = wa.y + useless_gap + (rowIndex-1)*slaveLeftHeight + + g.width = slaveLwid - 2*useless_gap - 2*c.border_width + + -- if last slave in left row use remaining space for that slave + if rowIndex == nbrLeftSlaves + then + g.height = wa.y + wa.height - g.y - useless_gap - 2*c.border_width + else + g.height = slaveLeftHeight - useless_gap - 2*c.border_width + end + else + -- right slave + g.x = wa.x + slaveLwid + mainwid + useless_gap + g.y = wa.y + useless_gap + (rowIndex-1)*slaveRightHeight + + g.width = slaveRwid - 2*useless_gap - 2*c.border_width + + -- if last slave in right row use remaining space for that slave + if rowIndex == nbrRightSlaves + then + g.height = wa.y + wa.height - g.y - useless_gap - 2*c.border_width + else + g.height = slaveRightHeight - useless_gap - 2*c.border_width + end + + end + + if g.width < 1 then g.width = 1 end + if g.height < 1 then g.height = 1 end + c:geometry(g) + end + end + end +end + +return centerworkd diff --git a/awesome/.config/awesome/lain/layout/init.lua b/awesome/.config/awesome/lain/layout/init.lua @@ -0,0 +1,20 @@ + +--[[ + + Lain + Layouts, widgets and utilities for Awesome WM + + Layouts section + + Licensed under GNU General Public License v2 + * (c) 2013, Luke Bonham + * (c) 2010-2012, Peter Hofmann + +--]] + +local wrequire = require("lain.helpers").wrequire +local setmetatable = setmetatable + +local layout = { _NAME = "lain.layout" } + +return setmetatable(layout, { __index = wrequire }) diff --git a/awesome/.config/awesome/lain/layout/termfair.lua b/awesome/.config/awesome/lain/layout/termfair.lua @@ -0,0 +1,139 @@ + +--[[ + + Licensed under GNU General Public License v2 + * (c) 2014, projektile + * (c) 2013, Luke Bonham + * (c) 2010-2012, Peter Hofmann + +--]] + +local tag = require("awful.tag") +local beautiful = require("beautiful") +local math = { ceil = math.ceil, + floor = math.floor, + max = math.max } +local tonumber = tonumber + +local termfair = { name = "termfair" } + +function termfair.arrange(p) + -- Layout with fixed number of vertical columns (read from nmaster). + -- New windows align from left to right. When a row is full, a now + -- one above it is created. Like this: + + -- (1) (2) (3) + -- +---+---+---+ +---+---+---+ +---+---+---+ + -- | | | | | | | | | | | | + -- | 1 | | | -> | 2 | 1 | | -> | 3 | 2 | 1 | -> + -- | | | | | | | | | | | | + -- +---+---+---+ +---+---+---+ +---+---+---+ + + -- (4) (5) (6) + -- +---+---+---+ +---+---+---+ +---+---+---+ + -- | 4 | | | | 5 | 4 | | | 6 | 5 | 4 | + -- +---+---+---+ -> +---+---+---+ -> +---+---+---+ + -- | 3 | 2 | 1 | | 3 | 2 | 1 | | 3 | 2 | 1 | + -- +---+---+---+ +---+---+---+ +---+---+---+ + + -- A useless gap (like the dwm patch) can be defined with + -- beautiful.useless_gap_width. + local useless_gap = tonumber(beautiful.useless_gap_width) or 0 + if useless_gap < 0 then useless_gap = 0 end + + -- A global border can be defined with + -- beautiful.global_border_width + local global_border = tonumber(beautiful.global_border_width) or 0 + if global_border < 0 then global_border = 0 end + + -- Screen. + local wa = p.workarea + local cls = p.clients + + -- Borders are factored in. + wa.height = wa.height - (global_border * 2) + wa.width = wa.width - (global_border * 2) + wa.x = wa.x + global_border + wa.y = wa.y + global_border + + -- How many vertical columns? + local t = tag.selected(p.screen) + local num_x = termfair.nmaster or tag.getnmaster(t) + + -- Do at least "desired_y" rows. + local desired_y = termfair.ncol or tag.getncol(t) + + if #cls > 0 + then + local num_y = math.max(math.ceil(#cls / num_x), desired_y) + local cur_num_x = num_x + local at_x = 0 + local at_y = 0 + local remaining_clients = #cls + local width = math.floor((wa.width - (num_x + 1)*useless_gap) / num_x) + local height = math.floor((wa.height - (num_y + 1)*useless_gap) / num_y) + + -- We start the first row. Left-align by limiting the number of + -- available slots. + if remaining_clients < num_x + then + cur_num_x = remaining_clients + end + + -- Iterate in reversed order. + for i = #cls,1,-1 + do + -- Get x and y position. + local c = cls[i] + local this_x = cur_num_x - at_x - 1 + local this_y = num_y - at_y - 1 + + -- Calc geometry. + local g = {} + if this_x == (num_x - 1) + then + g.width = wa.width - (num_x - 1)*width - (num_x + 1)*useless_gap - 2*c.border_width + else + g.width = width - 2*c.border_width + end + if this_y == (num_y - 1) + then + g.height = wa.height - (num_y - 1)*height - (num_y + 1)*useless_gap - 2*c.border_width + else + g.height = height - 2*c.border_width + end + + g.x = wa.x + this_x*width + g.y = wa.y + this_y*height + + if useless_gap > 0 + then + -- All clients tile evenly. + g.x = g.x + (this_x + 1)*useless_gap + g.y = g.y + (this_y + 1)*useless_gap + + end + if g.width < 1 then g.width = 1 end + if g.height < 1 then g.height = 1 end + c:geometry(g) + remaining_clients = remaining_clients - 1 + + -- Next grid position. + at_x = at_x + 1 + if at_x == num_x + then + -- Row full, create a new one above it. + at_x = 0 + at_y = at_y + 1 + + -- We start a new row. Left-align. + if remaining_clients < num_x + then + cur_num_x = remaining_clients + end + end + end + end +end + +return termfair diff --git a/awesome/.config/awesome/lain/layout/uselessfair.lua b/awesome/.config/awesome/lain/layout/uselessfair.lua @@ -0,0 +1,108 @@ + +--[[ + + Licensed under GNU General Public License v2 + * (c) 2014, projektile, worron + * (c) 2013, Luke Bonham + * (c) 2012, Josh Komoroske + * (c) 2010-2012, Peter Hofmann + +--]] + +local beautiful = require("beautiful") +local ipairs = ipairs +local math = { ceil = math.ceil, sqrt = math.sqrt, floor = math.floor, max = math.max } +local tonumber = tonumber + +local uselessfair = {} + +-- Transformation functions +local function swap(geometry) + return { x = geometry.y, y = geometry.x, width = geometry.height, height = geometry.width } +end + +-- Client geometry correction depending on useless gap and window border +local function size_correction(c, geometry, useless_gap) + geometry.width = math.max(geometry.width - 2 * c.border_width - useless_gap, 1) + geometry.height = math.max(geometry.height - 2 * c.border_width - useless_gap, 1) + geometry.x = geometry.x + useless_gap / 2 + geometry.y = geometry.y + useless_gap / 2 +end + +-- Main tiling function +local function fair(p, orientation) + + -- Theme vars + local useless_gap = beautiful.useless_gap_width or 0 + local global_border = beautiful.global_border_width or 0 + + -- Aliases + local wa = p.workarea + local cls = p.clients + + -- Nothing to tile here + if #cls == 0 then return end + + -- Workarea size correction depending on useless gap and global border + wa.height = wa.height - 2 * global_border - useless_gap + wa.width = wa.width - 2 * global_border - useless_gap + wa.x = wa.x + useless_gap / 2 + global_border + wa.y = wa.y + useless_gap / 2 + global_border + + -- Geometry calculation + local row, col = 0, 0 + + local rows = math.ceil(math.sqrt(#cls)) + local cols = math.ceil(#cls / rows) + + for i, c in ipairs(cls) do + local g = {} + + -- find tile orientation for current client and swap geometry if need + local need_swap = (orientation == "east" and #cls <= 2) or (orientation == "south" and #cls > 2) + local area = need_swap and swap(wa) or wa + + -- calculate geometry + if #cls < (cols * rows) and row == cols - 1 then + g.width = area.width / (rows - ((cols * rows) - #cls)) + else + g.width = area.width / rows + end + + g.height = area.height / cols + g.x = area.x + col * g.width + g.y = area.y + row * g.height + + -- turn back to real if geometry was swapped + if need_swap then g = swap(g) end + + -- window size correction depending on useless gap and window border + size_correction(c, g, useless_gap) + + -- set geometry + c:geometry(g) + + -- update tile grid coordinates + col = i % rows + row = math.floor(i / rows) + end +end + +-- Layout constructor +local function construct_layout(name, direction) + return { + name = name, + -- @p screen The screen number to tile + arrange = function(p) return fair(p, direction) end + } +end + +-- Build layouts with different tile direction +uselessfair.vertical = construct_layout("uselessfair", "south") +uselessfair.horizontal = construct_layout("uselessfairh", "east") + +-- Module aliase +uselessfair.arrange = uselessfair.vertical.arrange +uselessfair.name = uselessfair.vertical.name + +return uselessfair diff --git a/awesome/.config/awesome/lain/layout/uselesspiral.lua b/awesome/.config/awesome/lain/layout/uselesspiral.lua @@ -0,0 +1,123 @@ + +--[[ + + Licensed under GNU General Public License v2 + * (c) 2014, projektile + * (c) 2013, Luke Bonham + * (c) 2009, Uli Schlachter + * (c) 2008, Julien Danjolu + +--]] + +local beautiful = require("beautiful") +local ipairs = ipairs +local tonumber = tonumber +local math = require("math") + +local uselesspiral = {} + +local function spiral(p, spiral) + -- A useless gap (like the dwm patch) can be defined with + -- beautiful.useless_gap_width. + local useless_gap = tonumber(beautiful.useless_gap_width) or 0 + if useless_gap < 0 then useless_gap = 0 end + + -- A global border can be defined with + -- beautiful.global_border_width + local global_border = tonumber(beautiful.global_border_width) or 0 + if global_border < 0 then global_border = 0 end + + -- Themes border width requires an offset + local bw = tonumber(beautiful.border_width) or 0 + + -- get our orientation right + local wa = p.workarea + local cls = p.clients + local n = #cls -- number of windows total; k = which window number + + wa.height = wa.height - ((global_border * 2) + (bw * 2)) + wa.width = wa.width - ((global_border * 2) + (bw * 2)) + + local static_wa = wa + + for k, c in ipairs(cls) do + if k < n then + if k % 2 == 0 then + wa.height = (wa.height / 2) + else + wa.width = (wa.width / 2) + end + end + + if k % 4 == 0 and spiral then + wa.x = wa.x - wa.width + elseif k % 2 == 0 or + (k % 4 == 3 and k < n and spiral) then + wa.x = wa.x + wa.width + end + + if k % 4 == 1 and k ~= 1 and spiral then + wa.y = wa.y - wa.height + elseif k % 2 == 1 and k ~= 1 or + (k % 4 == 0 and k < n and spiral) then + wa.y = wa.y + wa.height + end + + local wa2 = {} + wa2.x = wa.x + (useless_gap / 2) + global_border + wa2.y = wa.y + (useless_gap / 2) + global_border + wa2.height = wa.height - (useless_gap / 2) + wa2.width = wa.width - (useless_gap / 2) + + -- Useless gap. + if useless_gap > 0 + then + -- Top and left clients are shrinked by two steps and + -- get moved away from the border. Other clients just + -- get shrinked in one direction. + + top = false + left = false + + if wa2.y == static_wa.y then + top = true + end + + if wa2.x == static_wa.x then + left = true + end + + if top then + wa2.height = wa2.height - useless_gap + wa2.y = wa2.y - (useless_gap / 2) + else + wa2.height = wa2.height - (useless_gap / 2) + end + + if left then + wa2.width = wa2.width - useless_gap + wa2.x = wa2.x - (useless_gap / 2) + else + wa2.width = wa2.width - (useless_gap / 2) + end + end + -- End of useless gap. + + c:geometry(wa2) + end +end + +--- Dwindle layout +uselesspiral.dwindle = {} +uselesspiral.dwindle.name = "uselessdwindle" +function uselesspiral.dwindle.arrange(p) + return spiral(p, false) +end + +--- Spiral layout +uselesspiral.name = "uselesspiral" +function uselesspiral.arrange(p) + return spiral(p, true) +end + +return uselesspiral diff --git a/awesome/.config/awesome/lain/layout/uselesstile.lua b/awesome/.config/awesome/lain/layout/uselesstile.lua @@ -0,0 +1,231 @@ + +--[[ + + Licensed under GNU General Public License v2 + * (c) 2014, projektile, worron + * (c) 2013, Luke Bonham + * (c) 2009, Donald Ephraim Curtis + * (c) 2008, Julien Danjolu + +--]] + +local tag = require("awful.tag") +local beautiful = require("beautiful") +local ipairs = ipairs +local math = { floor = math.floor, + ceil = math.ceil, + max = math.max, + min = math.min } +local tonumber = tonumber + +local uselesstile = {} + +-- Transformation functions +local function flip(canvas, geometry) + return { + -- vertical only + x = 2 * canvas.x + canvas.width - geometry.x - geometry.width, + y = geometry.y, + width = geometry.width, + height = geometry.height + } +end + +local function swap(geometry) + return { x = geometry.y, y = geometry.x, width = geometry.height, height = geometry.width } +end + +-- Find geometry for secondary windows column +local function cut_column(wa, n, index) + local width = math.floor(wa.width / n) + local area = { x = wa.x + (index - 1) * width, y = wa.y, width = width, height = wa.height } + + return area +end + +-- Find geometry for certain window in column +local function cut_row(wa, factor, index, used) + local height = math.floor(wa.height * factor.window[index] / factor.total) + local area = { x = wa.x, y = wa.y + used, width = wa.width, height = height } + + return area +end + +-- Client geometry correction depending on useless gap and window border +local function size_correction(c, geometry, useless_gap) + geometry.width = math.max(geometry.width - 2 * c.border_width - useless_gap, 1) + geometry.height = math.max(geometry.height - 2 * c.border_width - useless_gap, 1) + geometry.x = geometry.x + useless_gap / 2 + geometry.y = geometry.y + useless_gap / 2 +end + +-- Check size factor for group of clients and calculate total +local function calc_factor(n, winfactors) + local factor = { window = winfactors, total = 0, min = 1 } + + for i = 1, n do + if not factor.window[i] then + factor.window[i] = factor.min + else + factor.min = math.min(factor.window[i], factor.min) + if factor.window[i] < 0.05 then factor.window[i] = 0.05 end + end + factor.total = factor.total + factor.window[i] + end + + return factor +end + +-- Tile group of clients in given area +-- @canvas need for proper transformation only +-- @winfactors table with clients size factors +local function tile_column(canvas, area, list, useless_gap, transformation, winfactors) + local used = 0 + local factor = calc_factor(#list, winfactors) + + for i, c in ipairs(list) do + local g = cut_row(area, factor, i, used) + if i == #list then g.height = area.height - used end + used = used + g.height + + -- swap workarea dimensions + if transformation.flip then g = flip(canvas, g) end + if transformation.swap then g = swap(g) end + + -- useless gap and border correction + size_correction(c, g, useless_gap) + + + c:geometry(g) + end +end + +--Main tile function +local function tile(p, orientation) + + -- Theme vars + local useless_gap = beautiful.useless_gap_width or 0 + local global_border = beautiful.global_border_width or 0 + + -- Aliases + local wa = p.workarea + local cls = p.clients + local t = tag.selected(p.screen) + + -- Nothing to tile here + if #cls == 0 then return end + + -- Get tag prop + local nmaster = math.min(tag.getnmaster(t), #cls) + local mwfact = tag.getmwfact(t) + + if nmaster == 0 then + mwfact = 0 + elseif nmaster == #cls then + mwfact = 1 + end + + -- clients size factor + local data = tag.getdata(t).windowfact + + if not data then + data = {} + tag.getdata(t).windowfact = data + end + + -- Workarea size correction depending on useless gap and global border + wa.height = wa.height - 2 * global_border - useless_gap + wa.width = wa.width - 2 * global_border - useless_gap + wa.x = wa.x + useless_gap / 2 + global_border + wa.y = wa.y + useless_gap / 2 + global_border + + -- Find which transformation we need for given orientation + local transformation = { + swap = orientation == 'top' or orientation == 'bottom', + flip = orientation == 'left' or orientation == 'top' + } + + -- Swap workarea dimensions if orientation vertical + if transformation.swap then wa = swap(wa) end + + -- Split master and other windows + local cls_master, cls_other = {}, {} + + for i, c in ipairs(cls) do + if i <= nmaster then + table.insert(cls_master, c) + else + table.insert(cls_other, c) + end + end + + -- Tile master windows + local master_area = { + x = wa.x, + y = wa.y, + width = nmaster > 0 and math.floor(wa.width * mwfact) or 0, + height = wa.height + } + + if not data[0] then data[0] = {} end + tile_column(wa, master_area, cls_master, useless_gap, transformation, data[0]) + + -- Tile other windows + local other_area = { + x = wa.x + master_area.width, + y = wa.y, + width = wa.width - master_area.width, + height = wa.height + } + + -- get column number for other windows + local ncol = math.min(tag.getncol(t), #cls_other) + + if ncol == 0 then ncol = 1 end + + -- split other windows to column groups + local last_small_column = ncol - #cls_other % ncol + local rows_min = math.floor(#cls_other / ncol) + + local client_index = 1 + local used = 0 + for i = 1, ncol do + local position = transformation.flip and ncol - i + 1 or i + local rows = i <= last_small_column and rows_min or rows_min + 1 + local column = {} + + for j = 1, rows do + table.insert(column, cls_other[client_index]) + client_index = client_index + 1 + end + + -- and tile + local column_area = cut_column(other_area, ncol, position) + if i == ncol then column_area.width = other_area.width - used end + used = used + column_area.width + + if not data[i] then data[i] = {} end + tile_column(wa, column_area, column, useless_gap, transformation, data[i]) + end +end + +-- Layout constructor +local function construct_layout(name, orientation) + return { + name = name, + -- @p screen number to tile + arrange = function(p) return tile(p, orientation) end + } +end + +-- Build layouts with different tile direction +uselesstile.right = construct_layout("uselesstile", "right") +uselesstile.left = construct_layout("uselesstileleft", "left") +uselesstile.bottom = construct_layout("uselesstilebottom", "bottom") +uselesstile.top = construct_layout("uselesstiletop", "top") + +-- Module aliase +uselesstile.arrange = uselesstile.right.arrange +uselesstile.name = uselesstile.right.name + +return uselesstile diff --git a/awesome/.config/awesome/lain/scripts/dfs b/awesome/.config/awesome/lain/scripts/dfs @@ -0,0 +1,387 @@ +#!/bin/bash +# +# Adapted from Eridan's "fs" (cleanup, enhancements and switch to bash/Linux) +# JM, 10/12/2004 +# +# Integrated into Lain in september 2013 +# https://github.com/copycat-killer/lain + +# Requires gawk + +# ------------------------------------------------------------------------- +# Decoding options +# ------------------------------------------------------------------------- +USAGE="Usage: $0 [-h(elp)] | [-n(arrow mode)] | [-w(eb output)]" + +NARROW_MODE=0 +WEB_OUTPUT=0 + +while [ $# -gt 0 ]; do +case "$1" in +"-h" ) +echo $USAGE +exit +;; +"-d" ) +DEBUG=1 +;; +"-n" ) +NARROW_MODE=1 +;; +"-w" ) +WEB_OUTPUT=1 +;; +* ) +echo $USAGE +exit +;; +esac +shift +done + +# ------------------------------------------------------------------------- +# Preparations +# ------------------------------------------------------------------------- +SYSTEM=`uname -s` +PATTERN="/" + +case "$SYSTEM" in +"Linux" ) +DF_COMMAND="/usr/bin/env df -k" +SORT_COMMAND="/usr/bin/env sort -k6" +AWK_COMMAND="/usr/bin/env awk" +;; +* ) +DF_COMMAND="/bin/df -k" +SORT_COMMAND="/usr/bin/sort -k6" +AWK_COMMAND="/usr/bin/env gawk" +;; +esac + +# ------------------------------------------------------------------------- +# Grabbing "df" result +# ------------------------------------------------------------------------- +DF_RESULT=`$DF_COMMAND` +if [ ! -z $DEBUG ]; then +echo "--> DF_RESULT:" +echo "$DF_RESULT" +echo "" +fi + +# ------------------------------------------------------------------------- +# Preprocessing "df" result, to join split logical lines +# ------------------------------------------------------------------------- +PREPROCESSING_RESULT=` \ + echo "$DF_RESULT" | $AWK_COMMAND -v PATTERN=$PATTERN \ + ' + NF == 1 { + printf ("%s", $0) + } + +NF == 5 { + printf ("%s\n", $0) +} + +NF > 6 { +} + +NF == 6 { + printf ("%s\n", $0) +}' +` +if [ ! -z $DEBUG ]; then +echo "--> PREPROCESSING_RESULT:" +echo "$PREPROCESSING_RESULT" +echo "" +fi + +SORTED_FILE_SYSTEMS_INFO=`echo "$PREPROCESSING_RESULT" | $SORT_COMMAND` + +if [ ! -z $DEBUG ]; then +echo "--> SORTED_FILE_SYSTEMS_INFO:" +echo "$SORTED_FILE_SYSTEMS_INFO" +echo "" +fi + +# ------------------------------------------------------------------------- +# Computing mount point max length +# ------------------------------------------------------------------------- +MOUNT_POINT_MAX_LENGTH=` \ + echo "$SORTED_FILE_SYSTEMS_INFO" | $AWK_COMMAND -v PATTERN=$PATTERN \ + ' + BEGIN { + mount_point_length_max = 15; + } + +END { + printf ("%d", mount_point_length_max); +} + +$0 ~ PATTERN { +# printf ("$6 = %s\n", $6); + + mount_point = $6; +# printf ("mount_point = %s\n", mount_point); + + mount_point_length = length (mount_point); +# printf ("mount_point_length = %d\n", mount_point_length); + + if (mount_point_length > mount_point_length_max) + mount_point_length_max = mount_point_length; +}' +` +if [ ! -z $DEBUG ]; then +echo "MOUNT_POINT_MAX_LENGTH: $MOUNT_POINT_MAX_LENGTH" +fi + +# ------------------------------------------------------------------------- +# Computing mount point data max size +# ------------------------------------------------------------------------- +MOUNT_POINT_MAX_SIZE=` \ + echo "$SORTED_FILE_SYSTEMS_INFO" | $AWK_COMMAND -v PATTERN=$PATTERN \ + ' + BEGIN { + mount_point_size_max = 0; + } + +END { + printf ("%d", mount_point_size_max); +} + +$0 ~ PATTERN { +# df -k shows k_bytes! +# printf ("$2 = %s\n", $2); + + mount_point_size = $2 * 1024; +# printf ("mount_point_size = %d\n", mount_point_size); + + if (mount_point_size > mount_point_size_max) + mount_point_size_max = mount_point_size; +}' +` +if [ ! -z $DEBUG ]; then +echo "MOUNT_POINT_MAX_SIZE: $MOUNT_POINT_MAX_SIZE" +fi + +# ------------------------------------------------------------------------- +# Let's go! +# ------------------------------------------------------------------------- +echo "$SORTED_FILE_SYSTEMS_INFO" | $AWK_COMMAND -v DEBUG=$DEBUG -v PATTERN=$PATTERN -v NARROW_MODE=$NARROW_MODE -v LEFT_COLUMN=$MOUNT_POINT_MAX_LENGTH -v MAX_SIZE=$MOUNT_POINT_MAX_SIZE -v SCALE=$SCALE -v WEB_OUTPUT=$WEB_OUTPUT \ + ' +# {printf ("$0 = %s\n", $0);} +# {printf ("$1 = %s\n", $1);} +# {printf ("PATTERN = %s\n", PATTERN);} +# {printf ("LEFT_COLUMN = %s\n", LEFT_COLUMN);} + + BEGIN { + k_bytes = 1024.0; + m_bytes = 1024.0 * k_bytes; + g_bytes = 1024.0 * m_bytes; + t_bytes = 1024.0 * g_bytes; + + if (WEB_OUTPUT) + { + all_stars = "**************************************************"; + current_date = strftime ("%d-%m-%Y @ %H:%M:%S", localtime (systime ())); + free_threshold = 10; # % + + printf ("<!-- DEBUT CONTENU -->\n"); + + printf ( \ + "<A NAME=\"top\"></A>\n" \ + "<P ALIGN=CENTER><SPAN CLASS=\"titleblue\">%s</SPAN><SPAN CLASS=\"textbold\"> -- STATUS OF <SPAN CLASS=\"titlered\">ALCOR</SPAN> FILE SYSTEMS</SPAN></P><BR>\n", + current_date ) + + printf ("<TABLE WIDTH=\"100%%\" BORDER=1>\n"); + + printf ( \ + "<TR>\n" \ + "<TD ALIGN=LEFT><STRONG>Mount point</STRONG></TD>\n" \ + "<TD ALIGN=CENTER><STRONG>%% Usato (<SPAN CLASS=\"titleblue\">*</SPAN>)" \ + " - %% Free (<SPAN CLASS=\"titlegreen\">*</SPAN>)</STRONG></TD>\n" \ + "<TD ALIGN=CENTER><STRONG>%% Used</STRONG></TD>\n" \ + "<TD ALIGN=CENTER><STRONG>Free</STRONG></TD>\n" \ + "<TD ALIGN=CENTER><STRONG>Total</STRONG></TD>\n" \ + "</TR>\n" ); + } + else + { + narrow_margin = " "; +# printf ("%-*s", LEFT_COLUMN + 2, "Mount point"); + if (NARROW_MODE) + printf ("\n%s", narrow_margin); + else + printf ("%-*s", LEFT_COLUMN + 2, ""); + print " Used Free Total "; + if (! NARROW_MODE) + print ""; + } + } + +END { + if (WEB_OUTPUT) + { + printf ("</TABLE>\n"); + + printf ("<!-- FIN CONTENU -->\n"); + } + else + { + if (NARROW_MODE) + printf ("%s", narrow_margin); + else + printf ("%-*s", LEFT_COLUMN + 2, ""); + print "|----|----|----|----|----|----|----|----|----|----|" + if (NARROW_MODE) + printf ("\n%s", narrow_margin); + else + printf ("%-*s", LEFT_COLUMN + 2, ""); + print "0 10 20 30 40 50 60 70 80 90 100"; + print ""; + } +} + +$0 ~ PATTERN { + + if (index ($0, "members") == 0 && index ($0, "Download") == 0 && index ($0, "admin") == 0) + { +# df -k shows k_bytes! + + total_size = $2 * k_bytes; + free_size = $4 * k_bytes; + percentage_occupied = substr($5, 0, 3); + mount_point = $6; + + percentage_free = int (100 - percentage_occupied); + +# reduction_factor: 2 + stars_number = int (percentage_occupied / 2); + + if (WEB_OUTPUT) + { + posGroup = index (mount_point, "scratch"); + if (posGroup == 0) + posGroup = index (mount_point, "u1"); + if (posGroup == 0) + posGroup = index (mount_point, "u2"); + if (posGroup == 0) + posGroup = index (mount_point, "u4"); + if (posGroup == 0) + posGroup = index (mount_point, "u5"); + + printf ("<TR>\n"); + + if (posGroup > 0 || percentage_free < free_threshold) + { + if (percentage_free < free_threshold) + { + class = "titlered"; + if (posGroup == 0) + posGroup = 1; # to display the whole mount_point in this color anyway + } + else if ((index (mount_point, "scratch") != 0) || (index (mount_point, "u1") != 0) || (index (mount_point, "u2") != 0)) + { + class = "titleorange"; + posGroup = 1; # to display the whole mount_point in this color + } + else if ((index (mount_point, "u4") != 0) || (index (mount_point, "u5") != 0)) + { + class = "titlebrown"; + posGroup = 1; # to display the whole mount_point in this color + } + + printf ( \ + "<TD ALIGN=LEFT>%s<SPAN CLASS=\"%s\">%s</SPAN></TD>\n", + substr (mount_point, 1, posGroup - 1), + class, + substr (mount_point, posGroup) ); + } + else + { + printf ("<TD ALIGN=LEFT>%s</TD>\n", mount_point); + } + + printf ( \ + "<TD ALIGN=CENTER><SPAN CLASS=\"titleblue\">%s</SPAN><SPAN CLASS=\"titlegreen\">%s</SPAN></TD>\n", + substr (all_stars, 1, stars_number), substr (all_stars, stars_number + 1, 49) ); + + if (percentage_free < free_threshold) + { + color_beginning = "<SPAN CLASS=\"titlered\">"; + color_end = "</SPAN>" + } + else + { + color_beginning = ""; + color_end = "" + } + + if (total_size > 1 * t_bytes) + printf ( \ + "<TD ALIGN=RIGHT>%s%3d%%%s</TD><TD ALIGN=RIGHT>%5.1f Tb</TD><TD ALIGN=RIGHT>%5.1f Tb</TD>\n", \ + color_beginning, percentage_occupied, color_end, free_size / t_bytes, total_size / t_bytes \ + ); + else if (total_size > 1 * g_bytes) + printf ( \ + "<TD ALIGN=RIGHT>%s%3d%%%s</TD><TD ALIGN=RIGHT>%5.1f Gb</TD><TD ALIGN=RIGHT>%5.1f Gb</TD>\n", \ + color_beginning, percentage_occupied, color_end, free_size / g_bytes, total_size / g_bytes \ + ); + else if (total_size > 1 * m_byptes) + printf ( \ + "<TD ALIGN=RIGHT>%s%3d%%%s</TD><TD ALIGN=RIGHT>%5.1f Mb</TD><TD ALIGN=RIGHT>%5.1f Mb</TD>\n", \ + color_beginning, percentage_occupied, color_end, free_size / m_bytes, total_size / m_bytes \ + ); + else + printf ( \ + "<TD ALIGN=RIGHT>%s%3d%%%s</TD><TD ALIGN=RIGHT>%5.1f Kb</TD><TD ALIGN=RIGHT>%5.1f Kb</TD>\n", \ + color_beginning, percentage_occupied, color_end, free_size / k_bytes, total_size / k_bytes \ + ); + + printf ("</TR>\n"); + } + + else + { +# printf ("percentage_occupied = %d\n", percentage_occupied); +# printf ("percentage_free = %d\n", percentage_free); + + printf ("%-*s", LEFT_COLUMN + 2, mount_point); + if (NARROW_MODE) + printf ("\n%s", narrow_margin); + +# printf ("stars_number = %d\n", stars_number); + + printf ("|"); + for (i = 1; i <= stars_number && i <= 49; i++) + { + printf ("%s", "*"); + } + for (i = stars_number + 1; i <= 49; i++) + { + printf ("%s", "-"); + } + + + if (total_size > 1 * t_bytes) + printf ( \ + "| %3d%% %6.1f %6.1f Tb\n", \ + percentage_occupied, free_size / t_bytes, total_size / t_bytes \ + ); + else if (total_size > 1 * g_bytes) + printf ( \ + "| %3d%% %6.1f %6.1f Gb\n", \ + percentage_occupied, free_size / g_bytes, total_size / g_bytes \ + ); + else if (total_size > 1 * m_byptes) + printf ( \ + "| %3d%% %6.1f %6.1f Mb\n", \ + percentage_occupied, free_size / m_bytes, total_size / m_bytes \ + ); + else + printf ( \ + "| %3d%% %6.1f %6.1f Kb\n", \ + percentage_occupied, free_size / k_bytes, total_size / k_bytes \ + ); + } + } # if +}' diff --git a/awesome/.config/awesome/lain/scripts/mpdcover b/awesome/.config/awesome/lain/scripts/mpdcover @@ -0,0 +1,68 @@ +#!/bin/bash +# +# A simple cover fetcher script for current playing song on mpd. +# +# Original author: Wolfgang Mueller +# +# Adapted for Lain internal use. +# https://github.com/copycat-killer/lain +# +# You can use, edit and redistribute this script in any way you like. +# +# Dependencies: imagemagick. +# +# Usage: mpdcover <music_directory> <song_file> <cover_resize> <default_art> + +# Configuration------------------------------------------------------- + +# Music directory +MUSIC_DIR=$1 + +# Song file +file=$2 + +# Regex expression used for image search +IMG_REG="(Front|front|Cover|cover|Art|art|Folder|folder)\.(jpg|jpeg|png|gif)$" + +# Path of temporary resized cover +TEMP_PATH="/tmp/mpdcover.png" + +# Resize cover +COVER_RESIZE="$3x$3" + +if [ $COVER_RESIZE == "x" ]; then + COVER_RESIZE="100x100" +fi + +# The default cover to use (optional) +DEFAULT_ART=$4 + +# Thumbnail background (transparent) +COVER_BACKGROUND="none" + +#-------------------------------------------------------------------- + +# check if anything is playing at all +[[ -z $file ]] && exit 1 + +# Art directory +art="$MUSIC_DIR/${file%/*}" + +# find every file that matches IMG_REG set the first matching file to be the +# cover. +cover="$(find "$art/" -maxdepth 1 -type f | egrep -i -m1 "$IMG_REG")" + +# when no cover is found, use DEFAULT_ART as cover +cover="${cover:=$DEFAULT_ART}" + +# check if art is available +if [[ -n $cover ]]; then + if [[ -n $COVER_RESIZE ]]; then + convert "$cover" -scale $COVER_RESIZE -gravity "center" -background "$COVER_BACKGROUND" "$TEMP_PATH" + cover="$TEMP_PATH" + fi +else + rm $TEMP_PATH +fi + +exit 0 diff --git a/awesome/.config/awesome/lain/util/dkjson.lua b/awesome/.config/awesome/lain/util/dkjson.lua @@ -0,0 +1,713 @@ +-- Module options: +local always_try_using_lpeg = true +local register_global_module_table = false +local global_module_name = 'json' + +--[==[ + +David Kolf's JSON module for Lua 5.1/5.2 + +Version 2.5 + + +For the documentation see the corresponding readme.txt or visit +<http://dkolf.de/src/dkjson-lua.fsl/>. + +You can contact the author by sending an e-mail to 'david' at the +domain 'dkolf.de'. + + +Copyright (C) 2010-2013 David Heiko Kolf + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +--]==] + +-- global dependencies: +local pairs, type, tostring, tonumber, getmetatable, setmetatable, rawset = + pairs, type, tostring, tonumber, getmetatable, setmetatable, rawset +local error, require, pcall, select = error, require, pcall, select +local floor, huge = math.floor, math.huge +local strrep, gsub, strsub, strbyte, strchar, strfind, strlen, strformat = + string.rep, string.gsub, string.sub, string.byte, string.char, + string.find, string.len, string.format +local strmatch = string.match +local concat = table.concat + +local json = { version = "dkjson 2.5" } + +if register_global_module_table then + _G[global_module_name] = json +end + +local _ENV = nil -- blocking globals in Lua 5.2 + +pcall (function() + -- Enable access to blocked metatables. + -- Don't worry, this module doesn't change anything in them. + local debmeta = require "debug".getmetatable + if debmeta then getmetatable = debmeta end +end) + +json.null = setmetatable ({}, { + __tojson = function () return "null" end +}) + +local function isarray (tbl) + local max, n, arraylen = 0, 0, 0 + for k,v in pairs (tbl) do + if k == 'n' and type(v) == 'number' then + arraylen = v + if v > max then + max = v + end + else + if type(k) ~= 'number' or k < 1 or floor(k) ~= k then + return false + end + if k > max then + max = k + end + n = n + 1 + end + end + if max > 10 and max > arraylen and max > n * 2 then + return false -- don't create an array with too many holes + end + return true, max +end + +local escapecodes = { + ["\""] = "\\\"", ["\\"] = "\\\\", ["\b"] = "\\b", ["\f"] = "\\f", + ["\n"] = "\\n", ["\r"] = "\\r", ["\t"] = "\\t" +} + +local function escapeutf8 (uchar) + local value = escapecodes[uchar] + if value then + return value + end + local a, b, c, d = strbyte (uchar, 1, 4) + a, b, c, d = a or 0, b or 0, c or 0, d or 0 + if a <= 0x7f then + value = a + elseif 0xc0 <= a and a <= 0xdf and b >= 0x80 then + value = (a - 0xc0) * 0x40 + b - 0x80 + elseif 0xe0 <= a and a <= 0xef and b >= 0x80 and c >= 0x80 then + value = ((a - 0xe0) * 0x40 + b - 0x80) * 0x40 + c - 0x80 + elseif 0xf0 <= a and a <= 0xf7 and b >= 0x80 and c >= 0x80 and d >= 0x80 then + value = (((a - 0xf0) * 0x40 + b - 0x80) * 0x40 + c - 0x80) * 0x40 + d - 0x80 + else + return "" + end + if value <= 0xffff then + return strformat ("\\u%.4x", value) + elseif value <= 0x10ffff then + -- encode as UTF-16 surrogate pair + value = value - 0x10000 + local highsur, lowsur = 0xD800 + floor (value/0x400), 0xDC00 + (value % 0x400) + return strformat ("\\u%.4x\\u%.4x", highsur, lowsur) + else + return "" + end +end + +local function fsub (str, pattern, repl) + -- gsub always builds a new string in a buffer, even when no match + -- exists. First using find should be more efficient when most strings + -- don't contain the pattern. + if strfind (str, pattern) then + return gsub (str, pattern, repl) + else + return str + end +end + +local function quotestring (value) + -- based on the regexp "escapable" in https://github.com/douglascrockford/JSON-js + value = fsub (value, "[%z\1-\31\"\\\127]", escapeutf8) + if strfind (value, "[\194\216\220\225\226\239]") then + value = fsub (value, "\194[\128-\159\173]", escapeutf8) + value = fsub (value, "\216[\128-\132]", escapeutf8) + value = fsub (value, "\220\143", escapeutf8) + value = fsub (value, "\225\158[\180\181]", escapeutf8) + value = fsub (value, "\226\128[\140-\143\168-\175]", escapeutf8) + value = fsub (value, "\226\129[\160-\175]", escapeutf8) + value = fsub (value, "\239\187\191", escapeutf8) + value = fsub (value, "\239\191[\176-\191]", escapeutf8) + end + return "\"" .. value .. "\"" +end +json.quotestring = quotestring + +local function replace(str, o, n) + local i, j = strfind (str, o, 1, true) + if i then + return strsub(str, 1, i-1) .. n .. strsub(str, j+1, -1) + else + return str + end +end + +-- locale independent num2str and str2num functions +local decpoint, numfilter + +local function updatedecpoint () + decpoint = strmatch(tostring(0.5), "([^05+])") + -- build a filter that can be used to remove group separators + numfilter = "[^0-9%-%+eE" .. gsub(decpoint, "[%^%$%(%)%%%.%[%]%*%+%-%?]", "%%%0") .. "]+" +end + +updatedecpoint() + +local function num2str (num) + return replace(fsub(tostring(num), numfilter, ""), decpoint, ".") +end + +local function str2num (str) + local num = tonumber(replace(str, ".", decpoint)) + if not num then + updatedecpoint() + num = tonumber(replace(str, ".", decpoint)) + end + return num +end + +local function addnewline2 (level, buffer, buflen) + buffer[buflen+1] = "\n" + buffer[buflen+2] = strrep (" ", level) + buflen = buflen + 2 + return buflen +end + +function json.addnewline (state) + if state.indent then + state.bufferlen = addnewline2 (state.level or 0, + state.buffer, state.bufferlen or #(state.buffer)) + end +end + +local encode2 -- forward declaration + +local function addpair (key, value, prev, indent, level, buffer, buflen, tables, globalorder, state) + local kt = type (key) + if kt ~= 'string' and kt ~= 'number' then + return nil, "type '" .. kt .. "' is not supported as a key by JSON." + end + if prev then + buflen = buflen + 1 + buffer[buflen] = "," + end + if indent then + buflen = addnewline2 (level, buffer, buflen) + end + buffer[buflen+1] = quotestring (key) + buffer[buflen+2] = ":" + return encode2 (value, indent, level, buffer, buflen + 2, tables, globalorder, state) +end + +local function appendcustom(res, buffer, state) + local buflen = state.bufferlen + if type (res) == 'string' then + buflen = buflen + 1 + buffer[buflen] = res + end + return buflen +end + +local function exception(reason, value, state, buffer, buflen, defaultmessage) + defaultmessage = defaultmessage or reason + local handler = state.exception + if not handler then + return nil, defaultmessage + else + state.bufferlen = buflen + local ret, msg = handler (reason, value, state, defaultmessage) + if not ret then return nil, msg or defaultmessage end + return appendcustom(ret, buffer, state) + end +end + +function json.encodeexception(reason, value, state, defaultmessage) + return quotestring("<" .. defaultmessage .. ">") +end + +encode2 = function (value, indent, level, buffer, buflen, tables, globalorder, state) + local valtype = type (value) + local valmeta = getmetatable (value) + valmeta = type (valmeta) == 'table' and valmeta -- only tables + local valtojson = valmeta and valmeta.__tojson + if valtojson then + if tables[value] then + return exception('reference cycle', value, state, buffer, buflen) + end + tables[value] = true + state.bufferlen = buflen + local ret, msg = valtojson (value, state) + if not ret then return exception('custom encoder failed', value, state, buffer, buflen, msg) end + tables[value] = nil + buflen = appendcustom(ret, buffer, state) + elseif value == nil then + buflen = buflen + 1 + buffer[buflen] = "null" + elseif valtype == 'number' then + local s + if value ~= value or value >= huge or -value >= huge then + -- This is the behaviour of the original JSON implementation. + s = "null" + else + s = num2str (value) + end + buflen = buflen + 1 + buffer[buflen] = s + elseif valtype == 'boolean' then + buflen = buflen + 1 + buffer[buflen] = value and "true" or "false" + elseif valtype == 'string' then + buflen = buflen + 1 + buffer[buflen] = quotestring (value) + elseif valtype == 'table' then + if tables[value] then + return exception('reference cycle', value, state, buffer, buflen) + end + tables[value] = true + level = level + 1 + local isa, n = isarray (value) + if n == 0 and valmeta and valmeta.__jsontype == 'object' then + isa = false + end + local msg + if isa then -- JSON array + buflen = buflen + 1 + buffer[buflen] = "[" + for i = 1, n do + buflen, msg = encode2 (value[i], indent, level, buffer, buflen, tables, globalorder, state) + if not buflen then return nil, msg end + if i < n then + buflen = buflen + 1 + buffer[buflen] = "," + end + end + buflen = buflen + 1 + buffer[buflen] = "]" + else -- JSON object + local prev = false + buflen = buflen + 1 + buffer[buflen] = "{" + local order = valmeta and valmeta.__jsonorder or globalorder + if order then + local used = {} + n = #order + for i = 1, n do + local k = order[i] + local v = value[k] + if v then + used[k] = true + buflen, msg = addpair (k, v, prev, indent, level, buffer, buflen, tables, globalorder, state) + prev = true -- add a seperator before the next element + end + end + for k,v in pairs (value) do + if not used[k] then + buflen, msg = addpair (k, v, prev, indent, level, buffer, buflen, tables, globalorder, state) + if not buflen then return nil, msg end + prev = true -- add a seperator before the next element + end + end + else -- unordered + for k,v in pairs (value) do + buflen, msg = addpair (k, v, prev, indent, level, buffer, buflen, tables, globalorder, state) + if not buflen then return nil, msg end + prev = true -- add a seperator before the next element + end + end + if indent then + buflen = addnewline2 (level - 1, buffer, buflen) + end + buflen = buflen + 1 + buffer[buflen] = "}" + end + tables[value] = nil + else + return exception ('unsupported type', value, state, buffer, buflen, + "type '" .. valtype .. "' is not supported by JSON.") + end + return buflen +end + +function json.encode (value, state) + state = state or {} + local oldbuffer = state.buffer + local buffer = oldbuffer or {} + state.buffer = buffer + updatedecpoint() + local ret, msg = encode2 (value, state.indent, state.level or 0, + buffer, state.bufferlen or 0, state.tables or {}, state.keyorder, state) + if not ret then + error (msg, 2) + elseif oldbuffer == buffer then + state.bufferlen = ret + return true + else + state.bufferlen = nil + state.buffer = nil + return concat (buffer) + end +end + +local function loc (str, where) + local line, pos, linepos = 1, 1, 0 + while true do + pos = strfind (str, "\n", pos, true) + if pos and pos < where then + line = line + 1 + linepos = pos + pos = pos + 1 + else + break + end + end + return "line " .. line .. ", column " .. (where - linepos) +end + +local function unterminated (str, what, where) + return nil, strlen (str) + 1, "unterminated " .. what .. " at " .. loc (str, where) +end + +local function scanwhite (str, pos) + while true do + pos = strfind (str, "%S", pos) + if not pos then return nil end + local sub2 = strsub (str, pos, pos + 1) + if sub2 == "\239\187" and strsub (str, pos + 2, pos + 2) == "\191" then + -- UTF-8 Byte Order Mark + pos = pos + 3 + elseif sub2 == "//" then + pos = strfind (str, "[\n\r]", pos + 2) + if not pos then return nil end + elseif sub2 == "/*" then + pos = strfind (str, "*/", pos + 2) + if not pos then return nil end + pos = pos + 2 + else + return pos + end + end +end + +local escapechars = { + ["\""] = "\"", ["\\"] = "\\", ["/"] = "/", ["b"] = "\b", ["f"] = "\f", + ["n"] = "\n", ["r"] = "\r", ["t"] = "\t" +} + +local function unichar (value) + if value < 0 then + return nil + elseif value <= 0x007f then + return strchar (value) + elseif value <= 0x07ff then + return strchar (0xc0 + floor(value/0x40), + 0x80 + (floor(value) % 0x40)) + elseif value <= 0xffff then + return strchar (0xe0 + floor(value/0x1000), + 0x80 + (floor(value/0x40) % 0x40), + 0x80 + (floor(value) % 0x40)) + elseif value <= 0x10ffff then + return strchar (0xf0 + floor(value/0x40000), + 0x80 + (floor(value/0x1000) % 0x40), + 0x80 + (floor(value/0x40) % 0x40), + 0x80 + (floor(value) % 0x40)) + else + return nil + end +end + +local function scanstring (str, pos) + local lastpos = pos + 1 + local buffer, n = {}, 0 + while true do + local nextpos = strfind (str, "[\"\\]", lastpos) + if not nextpos then + return unterminated (str, "string", pos) + end + if nextpos > lastpos then + n = n + 1 + buffer[n] = strsub (str, lastpos, nextpos - 1) + end + if strsub (str, nextpos, nextpos) == "\"" then + lastpos = nextpos + 1 + break + else + local escchar = strsub (str, nextpos + 1, nextpos + 1) + local value + if escchar == "u" then + value = tonumber (strsub (str, nextpos + 2, nextpos + 5), 16) + if value then + local value2 + if 0xD800 <= value and value <= 0xDBff then + -- we have the high surrogate of UTF-16. Check if there is a + -- low surrogate escaped nearby to combine them. + if strsub (str, nextpos + 6, nextpos + 7) == "\\u" then + value2 = tonumber (strsub (str, nextpos + 8, nextpos + 11), 16) + if value2 and 0xDC00 <= value2 and value2 <= 0xDFFF then + value = (value - 0xD800) * 0x400 + (value2 - 0xDC00) + 0x10000 + else + value2 = nil -- in case it was out of range for a low surrogate + end + end + end + value = value and unichar (value) + if value then + if value2 then + lastpos = nextpos + 12 + else + lastpos = nextpos + 6 + end + end + end + end + if not value then + value = escapechars[escchar] or escchar + lastpos = nextpos + 2 + end + n = n + 1 + buffer[n] = value + end + end + if n == 1 then + return buffer[1], lastpos + elseif n > 1 then + return concat (buffer), lastpos + else + return "", lastpos + end +end + +local scanvalue -- forward declaration + +local function scantable (what, closechar, str, startpos, nullval, objectmeta, arraymeta) + local len = strlen (str) + local tbl, n = {}, 0 + local pos = startpos + 1 + if what == 'object' then + setmetatable (tbl, objectmeta) + else + setmetatable (tbl, arraymeta) + end + while true do + pos = scanwhite (str, pos) + if not pos then return unterminated (str, what, startpos) end + local char = strsub (str, pos, pos) + if char == closechar then + return tbl, pos + 1 + end + local val1, err + val1, pos, err = scanvalue (str, pos, nullval, objectmeta, arraymeta) + if err then return nil, pos, err end + pos = scanwhite (str, pos) + if not pos then return unterminated (str, what, startpos) end + char = strsub (str, pos, pos) + if char == ":" then + if val1 == nil then + return nil, pos, "cannot use nil as table index (at " .. loc (str, pos) .. ")" + end + pos = scanwhite (str, pos + 1) + if not pos then return unterminated (str, what, startpos) end + local val2 + val2, pos, err = scanvalue (str, pos, nullval, objectmeta, arraymeta) + if err then return nil, pos, err end + tbl[val1] = val2 + pos = scanwhite (str, pos) + if not pos then return unterminated (str, what, startpos) end + char = strsub (str, pos, pos) + else + n = n + 1 + tbl[n] = val1 + end + if char == "," then + pos = pos + 1 + end + end +end + +scanvalue = function (str, pos, nullval, objectmeta, arraymeta) + pos = pos or 1 + pos = scanwhite (str, pos) + if not pos then + return nil, strlen (str) + 1, "no valid JSON value (reached the end)" + end + local char = strsub (str, pos, pos) + if char == "{" then + return scantable ('object', "}", str, pos, nullval, objectmeta, arraymeta) + elseif char == "[" then + return scantable ('array', "]", str, pos, nullval, objectmeta, arraymeta) + elseif char == "\"" then + return scanstring (str, pos) + else + local pstart, pend = strfind (str, "^%-?[%d%.]+[eE]?[%+%-]?%d*", pos) + if pstart then + local number = str2num (strsub (str, pstart, pend)) + if number then + return number, pend + 1 + end + end + pstart, pend = strfind (str, "^%a%w*", pos) + if pstart then + local name = strsub (str, pstart, pend) + if name == "true" then + return true, pend + 1 + elseif name == "false" then + return false, pend + 1 + elseif name == "null" then + return nullval, pend + 1 + end + end + return nil, pos, "no valid JSON value at " .. loc (str, pos) + end +end + +local function optionalmetatables(...) + if select("#", ...) > 0 then + return ... + else + return {__jsontype = 'object'}, {__jsontype = 'array'} + end +end + +function json.decode (str, pos, nullval, ...) + local objectmeta, arraymeta = optionalmetatables(...) + return scanvalue (str, pos, nullval, objectmeta, arraymeta) +end + +function json.use_lpeg () + local g = require ("lpeg") + + if g.version() == "0.11" then + error "due to a bug in LPeg 0.11, it cannot be used for JSON matching" + end + + local pegmatch = g.match + local P, S, R = g.P, g.S, g.R + + local function ErrorCall (str, pos, msg, state) + if not state.msg then + state.msg = msg .. " at " .. loc (str, pos) + state.pos = pos + end + return false + end + + local function Err (msg) + return g.Cmt (g.Cc (msg) * g.Carg (2), ErrorCall) + end + + local SingleLineComment = P"//" * (1 - S"\n\r")^0 + local MultiLineComment = P"/*" * (1 - P"*/")^0 * P"*/" + local Space = (S" \n\r\t" + P"\239\187\191" + SingleLineComment + MultiLineComment)^0 + + local PlainChar = 1 - S"\"\\\n\r" + local EscapeSequence = (P"\\" * g.C (S"\"\\/bfnrt" + Err "unsupported escape sequence")) / escapechars + local HexDigit = R("09", "af", "AF") + local function UTF16Surrogate (match, pos, high, low) + high, low = tonumber (high, 16), tonumber (low, 16) + if 0xD800 <= high and high <= 0xDBff and 0xDC00 <= low and low <= 0xDFFF then + return true, unichar ((high - 0xD800) * 0x400 + (low - 0xDC00) + 0x10000) + else + return false + end + end + local function UTF16BMP (hex) + return unichar (tonumber (hex, 16)) + end + local U16Sequence = (P"\\u" * g.C (HexDigit * HexDigit * HexDigit * HexDigit)) + local UnicodeEscape = g.Cmt (U16Sequence * U16Sequence, UTF16Surrogate) + U16Sequence/UTF16BMP + local Char = UnicodeEscape + EscapeSequence + PlainChar + local String = P"\"" * g.Cs (Char ^ 0) * (P"\"" + Err "unterminated string") + local Integer = P"-"^(-1) * (P"0" + (R"19" * R"09"^0)) + local Fractal = P"." * R"09"^0 + local Exponent = (S"eE") * (S"+-")^(-1) * R"09"^1 + local Number = (Integer * Fractal^(-1) * Exponent^(-1))/str2num + local Constant = P"true" * g.Cc (true) + P"false" * g.Cc (false) + P"null" * g.Carg (1) + local SimpleValue = Number + String + Constant + local ArrayContent, ObjectContent + + -- The functions parsearray and parseobject parse only a single value/pair + -- at a time and store them directly to avoid hitting the LPeg limits. + local function parsearray (str, pos, nullval, state) + local obj, cont + local npos + local t, nt = {}, 0 + repeat + obj, cont, npos = pegmatch (ArrayContent, str, pos, nullval, state) + if not npos then break end + pos = npos + nt = nt + 1 + t[nt] = obj + until cont == 'last' + return pos, setmetatable (t, state.arraymeta) + end + + local function parseobject (str, pos, nullval, state) + local obj, key, cont + local npos + local t = {} + repeat + key, obj, cont, npos = pegmatch (ObjectContent, str, pos, nullval, state) + if not npos then break end + pos = npos + t[key] = obj + until cont == 'last' + return pos, setmetatable (t, state.objectmeta) + end + + local Array = P"[" * g.Cmt (g.Carg(1) * g.Carg(2), parsearray) * Space * (P"]" + Err "']' expected") + local Object = P"{" * g.Cmt (g.Carg(1) * g.Carg(2), parseobject) * Space * (P"}" + Err "'}' expected") + local Value = Space * (Array + Object + SimpleValue) + local ExpectedValue = Value + Space * Err "value expected" + ArrayContent = Value * Space * (P"," * g.Cc'cont' + g.Cc'last') * g.Cp() + local Pair = g.Cg (Space * String * Space * (P":" + Err "colon expected") * ExpectedValue) + ObjectContent = Pair * Space * (P"," * g.Cc'cont' + g.Cc'last') * g.Cp() + local DecodeValue = ExpectedValue * g.Cp () + + function json.decode (str, pos, nullval, ...) + local state = {} + state.objectmeta, state.arraymeta = optionalmetatables(...) + local obj, retpos = pegmatch (DecodeValue, str, pos, nullval, state) + if state.msg then + return nil, state.pos, state.msg + else + return obj, retpos + end + end + + -- use this function only once: + json.use_lpeg = function () return json end + + json.using_lpeg = true + + return json -- so you can get the module using json = require "dkjson".use_lpeg() +end + +if always_try_using_lpeg then + pcall (json.use_lpeg) +end + +return json diff --git a/awesome/.config/awesome/lain/util/init.lua b/awesome/.config/awesome/lain/util/init.lua @@ -0,0 +1,229 @@ + +--[[ + + Lain + Layouts, widgets and utilities for Awesome WM + + Utilities section + + Licensed under GNU General Public License v2 + * (c) 2013, Luke Bonham + * (c) 2010-2012, Peter Hofmann + +--]] + +local awful = require("awful") +local beautiful = require("beautiful") +local math = { sqrt = math.sqrt } +local mouse = mouse +local pairs = pairs +local string = { gsub = string.gsub } +local client = client +local screen = screen +local tonumber = tonumber + +local wrequire = require("lain.helpers").wrequire +local setmetatable = setmetatable + +-- Lain utilities submodule +-- lain.util +local util = { _NAME = "lain.util" } + +-- Like awful.menu.clients, but only show clients of currently selected +-- tags. +function util.menu_clients_current_tags(menu, args) + -- List of currently selected tags. + local cls_tags = awful.tag.selectedlist(mouse.screen) + + -- Final list of menu items. + local cls_t = {} + + if cls_tags == nil then return nil end + + -- For each selected tag get all clients of that tag and add them to + -- the menu. A click on a menu item will raise that client. + for i = 1,#cls_tags + do + local t = cls_tags[i] + local cls = t:clients() + + for k, c in pairs(cls) + do + cls_t[#cls_t + 1] = { awful.util.escape(c.name) or "", + function () + c.minimized = false + client.focus = c + c:raise() + end, + c.icon } + end + end + + -- No clients? Then quit. + if #cls_t <= 0 then return nil end + + -- menu may contain some predefined values, otherwise start with a + -- fresh menu. + if not menu then menu = {} end + + -- Set the list of items and show the menu. + menu.items = cls_t + local m = awful.menu.new(menu) + m:show(args) + return m +end + +-- Magnify a client: Set it to "float" and resize it. +function util.magnify_client(c) + if not awful.client.floating.get(c) then + awful.client.floating.set(c, true) + + local mg = screen[mouse.screen].geometry + local tag = awful.tag.selected(mouse.screen) + local mwfact = awful.tag.getmwfact(tag) + local g = {} + g.width = math.sqrt(mwfact) * mg.width + g.height = math.sqrt(mwfact) * mg.height + g.x = mg.x + (mg.width - g.width) / 2 + g.y = mg.y + (mg.height - g.height) / 2 + c:geometry(g) + else + awful.client.floating.set(c, false) + end +end + +-- Read the nice value of pid from /proc. +local function get_nice_value(pid) + local n = first_line('/proc/' .. pid .. '/stat') + if n == nil + then + -- This should not happen. But I don't want to crash, either. + return 0 + end + + -- Remove pid and tcomm. This is necessary because tcomm may contain + -- nasty stuff such as whitespace or additional parentheses... + n = string.gsub(n, '.*%) ', '') + + -- Field number 17 now is the nice value. + fields = split(n, ' ') + return tonumber(fields[17]) +end + +-- To be used as a signal handler for "focus" +-- This requires beautiful.border_focus{,_highprio,_lowprio}. +function util.niceborder_focus(c) + local n = get_nice_value(c.pid) + if n == 0 + then + c.border_color = beautiful.border_focus + elseif n < 0 + then + c.border_color = beautiful.border_focus_highprio + else + c.border_color = beautiful.border_focus_lowprio + end +end + +-- To be used as a signal handler for "unfocus" +-- This requires beautiful.border_normal{,_highprio,_lowprio}. +function util.niceborder_unfocus(c) + local n = get_nice_value(c.pid) + if n == 0 + then + c.border_color = beautiful.border_normal + elseif n < 0 + then + c.border_color = beautiful.border_normal_highprio + else + c.border_color = beautiful.border_normal_lowprio + end +end + +-- Non-empty tag browsing +-- direction in {-1, 1} <-> {previous, next} non-empty tag +function util.tag_view_nonempty(direction, sc) + local s = sc or mouse.screen or 1 + local scr = screen[s] + + for i = 1, #awful.tag.gettags(s) do + awful.tag.viewidx(direction,s) + if #awful.client.visible(s) > 0 then + return + end + end +end + +-- {{{ Dynamic tagging +-- +-- Add a new tag +function util.add_tag(mypromptbox) + awful.prompt.run({prompt="New tag name: "}, mypromptbox[mouse.screen].widget, + function(text) + if text:len() > 0 then + props = { selected = true } + tag = awful.tag.add(new_name, props) + tag.name = text + tag:emit_signal("property::name") + end + end) +end + +-- Rename current tag +-- @author: minism +function util.rename_tag(mypromptbox) + local tag = awful.tag.selected(mouse.screen) + awful.prompt.run({prompt="Rename tag: "}, mypromptbox[mouse.screen].widget, + function(text) + if text:len() > 0 then + tag.name = text + tag:emit_signal("property::name") + end + end) +end + +-- Move current tag +-- pos in {-1, 1} <-> {previous, next} tag position +function util.move_tag(pos) + local tag = awful.tag.selected(mouse.screen) + local idx = awful.tag.getidx(tag) + if tonumber(pos) <= -1 then + awful.tag.move(idx - 1, tag) + else + awful.tag.move(idx + 1, tag) + end +end + +-- Remove current tag (if empty) +-- Any rule set on the tag shall be broken +function util.remove_tag() + local tag = awful.tag.selected(mouse.screen) + local prevtag = awful.tag.gettags(mouse.screen)[awful.tag.getidx(tag) - 1] + awful.tag.delete(tag, prevtag) +end +-- +-- }}} + +-- On the fly useless gaps change +function util.useless_gaps_resize(thatmuch) + beautiful.useless_gap_width = tonumber(beautiful.useless_gap_width) + thatmuch + awful.layout.arrange(mouse.screen) +end + +-- On the fly global border change +function util.global_border_resize(thatmuch) + beautiful.global_border_width = tonumber(beautiful.global_border_width) + thatmuch + awful.layout.arrange(mouse.screen) +end + +-- Check if an element exist on a table +function util.element_in_table(element, tbl) + for _, i in pairs(tbl) do + if i == element then + return true + end + end + return false +end + +return setmetatable(util, { __index = wrequire }) diff --git a/awesome/.config/awesome/lain/util/markup.lua b/awesome/.config/awesome/lain/util/markup.lua @@ -0,0 +1,69 @@ + +--[[ + + Licensed under MIT License + * (c) 2013, Luke Bonham + * (c) 2009, Uli Schlachter + * (c) 2009, Majic + +--]] + +local beautiful = require("beautiful") +local tostring = tostring +local setmetatable = setmetatable + +-- Lain markup util submodule +-- lain.util.markup +local markup = {} + +local fg = {} +local bg = {} + +-- Convenience tags. +function markup.bold(text) return '<b>' .. tostring(text) .. '</b>' end +function markup.italic(text) return '<i>' .. tostring(text) .. '</i>' end +function markup.strike(text) return '<s>' .. tostring(text) .. '</s>' end +function markup.underline(text) return '<u>' .. tostring(text) .. '</u>' end +function markup.monospace(text) return '<tt>' .. tostring(text) .. '</tt>' end +function markup.big(text) return '<big>' .. tostring(text) .. '</big>' end +function markup.small(text) return '<small>' .. tostring(text) .. '</small>' end + +-- Set the font. +function markup.font(font, text) + return '<span font="' .. tostring(font) .. '">' .. tostring(text) ..'</span>' +end + +-- Set the foreground. +function fg.color(color, text) + return '<span foreground="' .. tostring(color) .. '">' .. tostring(text) .. '</span>' +end + +-- Set the background. +function bg.color(color, text) + return '<span background="' .. tostring(color) .. '">' .. tostring(text) .. '</span>' +end + +-- Context: focus +function fg.focus(text) return fg.color(beautiful.fg_focus, text) end +function bg.focus(text) return bg.color(beautiful.bg_focus, text) end +function markup.focus(text) return bg.focus(fg.focus(text)) end + +-- Context: normal +function fg.normal(text) return fg.color(beautiful.fg_normal, text) end +function bg.normal(text) return bg.color(beautiful.bg_normal, text) end +function markup.normal(text) return bg.normal(fg.normal(text)) end + +-- Context: urgent +function fg.urgent(text) return fg.color(beautiful.fg_urgent, text) end +function bg.urgent(text) return bg.color(beautiful.bg_urgent, text) end +function markup.urgent(text) return bg.urgent(fg.urgent(text)) end + +markup.fg = fg +markup.bg = bg + +-- link markup.{fg,bg}(...) calls to markup.{fg,bg}.color(...) +setmetatable(markup.fg, { __call = function(_, ...) return markup.fg.color(...) end }) +setmetatable(markup.bg, { __call = function(_, ...) return markup.bg.color(...) end }) + +-- link markup(...) calls to markup.fg.color(...) +return setmetatable(markup, { __call = function(_, ...) return markup.fg.color(...) end }) diff --git a/awesome/.config/awesome/lain/util/separators.lua b/awesome/.config/awesome/lain/util/separators.lua @@ -0,0 +1,102 @@ + +--[[ + + Licensed under GNU General Public License v2 + * (c) 2015, Luke Bonham + * (c) 2015, plotnikovanton + +--]] + +local wibox = require("wibox") +local beautiful = require("beautiful") +local gears = require("gears") + +-- Lain Cairo separators util submodule +-- lain.util.separators +local separators = {} + +local height = beautiful.awful_widget_height or 0 +local width = beautiful.separators_width or 9 + +-- [[ Arrow + +-- Right +function separators.arrow_right(col1, col2) + local widget = wibox.widget.base.make_widget() + + widget.fit = function(m, w, h) return width, height end + + widget.draw = function(mycross, wibox, cr, width, height) + if col2 ~= "alpha" then + cr:set_source_rgb(gears.color.parse_color(col2)) + cr:new_path() + cr:move_to(0, 0) + cr:line_to(width, height/2) + cr:line_to(width, 0) + cr:close_path() + cr:fill() + + cr:new_path() + cr:move_to(0, height) + cr:line_to(width, height/2) + cr:line_to(width, height) + cr:close_path() + cr:fill() + end + + if col1 ~= "alpha" then + cr:set_source_rgb(gears.color.parse_color(col1)) + cr:new_path() + cr:move_to(0, 0) + cr:line_to(width, height/2) + cr:line_to(0, height) + cr:close_path() + cr:fill() + end + end + + return widget +end + +-- Left +function separators.arrow_left(col1, col2) + local widget = wibox.widget.base.make_widget() + + widget.fit = function(m, w, h) return width, height end + + widget.draw = function(mycross, wibox, cr, width, height) + if col1 ~= "alpha" then + cr:set_source_rgb(gears.color.parse_color(col1)) + cr:new_path() + cr:move_to(width, 0) + cr:line_to(0, height/2) + cr:line_to(0, 0) + cr:close_path() + cr:fill() + + cr:new_path() + cr:move_to(width, height) + cr:line_to(0, height/2) + cr:line_to(0, height) + cr:close_path() + cr:fill() + end + + if col2 ~= "alpha" then + cr:new_path() + cr:move_to(width, 0) + cr:line_to(0, height/2) + cr:line_to(width, height) + cr:close_path() + + cr:set_source_rgb(gears.color.parse_color(col2)) + cr:fill() + end + end + + return widget +end + +-- ]] + +return separators diff --git a/awesome/.config/awesome/lain/widgets/abase.lua b/awesome/.config/awesome/lain/widgets/abase.lua @@ -0,0 +1,44 @@ + +--[[ + + Licensed under GNU General Public License v2 + * (c) 2014, Luke Bonham + +--]] + +local newtimer = require("lain.helpers").newtimer +local async = require("lain.asyncshell") +local wibox = require("wibox") + +local setmetatable = setmetatable + +-- Basic template for custom widgets +-- Asynchronous version +-- lain.widgets.abase + +local function worker(args) + local abase = {} + local args = args or {} + local timeout = args.timeout or 5 + local cmd = args.cmd or "" + local settings = args.settings or function() end + + abase.widget = wibox.widget.textbox('') + + function abase.update() + async.request(cmd, function(f) + output = f + if output ~= abase.prev then + widget = abase.widget + settings() + abase.prev = output + end + end) + end + + newtimer(cmd, timeout, abase.update) + + return setmetatable(abase, { __index = abase.widget }) +end + +return setmetatable({}, { __call = function(_, ...) return worker(...) end }) diff --git a/awesome/.config/awesome/lain/widgets/alsa.lua b/awesome/.config/awesome/lain/widgets/alsa.lua @@ -0,0 +1,53 @@ + +--[[ + + Licensed under GNU General Public License v2 + * (c) 2013, Luke Bonham + * (c) 2010, Adrian C. <anrxc@sysphere.org> + +--]] + +local newtimer = require("lain.helpers").newtimer +local read_pipe = require("lain.helpers").read_pipe + +local wibox = require("wibox") + +local string = { match = string.match, + format = string.format } + +local setmetatable = setmetatable + +-- ALSA volume +-- lain.widgets.alsa +local alsa = { last_level = "0", last_status = "" } + +local function worker(args) + local args = args or {} + local timeout = args.timeout or 5 + local settings = args.settings or function() end + + alsa.cmd = args.cmd or "amixer" + alsa.channel = args.channel or "Master" + alsa.widget = wibox.widget.textbox('') + + function alsa.update() + mixer = read_pipe(string.format("%s get %s", alsa.cmd, alsa.channel)) + l,s = string.match(mixer, "([%d]+)%%.*%[([%l]*)") + + if alsa.last_level ~= l or alsa.last_status ~= s then + volume_now = { level = l, status = s } + alsa.last_level = l + alsa.last_status = s + + widget = alsa.widget + settings() + end + end + + timer_id = string.format("alsa-%s-%s", alsa.cmd, alsa.channel) + newtimer(timer_id, timeout, alsa.update) + + return setmetatable(alsa, { __index = alsa.widget }) +end + +return setmetatable(alsa, { __call = function(_, ...) return worker(...) end }) diff --git a/awesome/.config/awesome/lain/widgets/alsabar.lua b/awesome/.config/awesome/lain/widgets/alsabar.lua @@ -0,0 +1,177 @@ + +--[[ + + Licensed under GNU General Public License v2 + * (c) 2013, Luke Bonham + * (c) 2013, Rman + +--]] + +local newtimer = require("lain.helpers").newtimer +local read_pipe = require("lain.helpers").read_pipe + +local awful = require("awful") +local beautiful = require("beautiful") +local naughty = require("naughty") + +local math = { modf = math.modf } +local mouse = mouse +local string = { format = string.format, + match = string.match, + rep = string.rep } +local tonumber = tonumber + +local setmetatable = setmetatable + +-- ALSA volume bar +-- lain.widgets.alsabar +local alsabar = { + channel = "Master", + step = "2%", + + colors = { + background = beautiful.bg_normal, + mute = "#EB8F8F", + unmute = "#A4CE8A" + }, + + terminal = terminal or "xterm", + mixer = terminal .. " -e alsamixer", + + notifications = { + font = beautiful.font:sub(beautiful.font:find(""), beautiful.font:find(" ")), + font_size = "11", + color = beautiful.fg_normal, + bar_size = 18, + screen = 1 + }, + + _current_level = 0, + _muted = false +} + +function alsabar.notify() + alsabar.update() + + local preset = { + title = "", + text = "", + timeout = 5, + screen = alsabar.notifications.screen, + font = alsabar.notifications.font .. " " .. + alsabar.notifications.font_size, + fg = alsabar.notifications.color + } + + if alsabar._muted + then + preset.title = alsabar.channel .. " - Muted" + else + preset.title = alsabar.channel .. " - " .. alsabar._current_level .. "%" + end + + int = math.modf((alsabar._current_level / 100) * alsabar.notifications.bar_size) + preset.text = "[" + .. string.rep("|", int) + .. string.rep(" ", alsabar.notifications.bar_size - int) + .. "]" + + if alsabar.followmouse then + preset.screen = mouse.screen + end + + if alsabar._notify ~= nil then + alsabar._notify = naughty.notify ({ + replaces_id = alsabar._notify.id, + preset = preset, + }) + else + alsabar._notify = naughty.notify ({ + preset = preset, + }) + end +end + +local function worker(args) + local args = args or {} + local timeout = args.timeout or 5 + local settings = args.settings or function() end + local width = args.width or 63 + local height = args.heigth or 1 + local ticks = args.ticks or false + local ticks_size = args.ticks_size or 7 + local vertical = args.vertical or false + + alsabar.cmd = args.cmd or "amixer" + alsabar.channel = args.channel or alsabar.channel + alsabar.step = args.step or alsabar.step + alsabar.colors = args.colors or alsabar.colors + alsabar.notifications = args.notifications or alsabar.notifications + alsabar.followmouse = args.followmouse or false + + alsabar.bar = awful.widget.progressbar() + + alsabar.bar:set_background_color(alsabar.colors.background) + alsabar.bar:set_color(alsabar.colors.unmute) + alsabar.tooltip = awful.tooltip({ objects = { alsabar.bar } }) + alsabar.bar:set_width(width) + alsabar.bar:set_height(height) + alsabar.bar:set_ticks(ticks) + alsabar.bar:set_ticks_size(ticks_size) + alsabar.bar:set_vertical(vertical) + + function alsabar.update() + -- Get mixer control contents + local mixer = read_pipe(string.format("%s get %s", alsabar.cmd, alsabar.channel)) + + -- Capture mixer control state: [5%] ... ... [on] + local volu, mute = string.match(mixer, "([%d]+)%%.*%[([%l]*)") + + if (volu and tonumber(volu) ~= alsabar._current_level) or (mute and string.match(mute, "on") ~= alsabar._muted) + then + alsabar._current_level = tonumber(volu) + alsabar.bar:set_value(alsabar._current_level / 100) + if not mute and tonumber(volu) == 0 or mute == "off" + then + alsabar._muted = true + alsabar.tooltip:set_text (" [Muted] ") + alsabar.bar:set_color(alsabar.colors.mute) + else + alsabar._muted = false + alsabar.tooltip:set_text(string.format(" %s:%s ", alsabar.channel, volu)) + alsabar.bar:set_color(alsabar.colors.unmute) + end + + volume_now = {} + volume_now.level = tonumber(volu) + volume_now.status = mute + settings() + end + end + + alsabar.bar:buttons (awful.util.table.join ( + awful.button ({}, 1, function() + awful.util.spawn(alsabar.mixer) + end), + awful.button ({}, 3, function() + awful.util.spawn(string.format("%s set %s toggle", alsabar.cmd, alsabar.channel)) + alsabar.update() + end), + awful.button ({}, 4, function() + awful.util.spawn(string.format("%s set %s %s+", alsabar.cmd, alsabar.channel, alsabar.step)) + alsabar.update() + end), + awful.button ({}, 5, function() + awful.util.spawn(string.format("%s set %s %s-", alsabar.cmd, alsabar.channel, alsabar.step)) + alsabar.update() + end) + )) + + timer_id = string.format("alsabar-%s-%s", alsabar.cmd, alsabar.channel) + + newtimer(timer_id, timeout, alsabar.update) + + return alsabar +end + +return setmetatable(alsabar, { __call = function(_, ...) return worker(...) end }) diff --git a/awesome/.config/awesome/lain/widgets/base.lua b/awesome/.config/awesome/lain/widgets/base.lua @@ -0,0 +1,42 @@ + +--[[ + + Licensed under GNU General Public License v2 + * (c) 2014, Luke Bonham + +--]] + +local newtimer = require("lain.helpers").newtimer +local read_pipe = require("lain.helpers").read_pipe + +local wibox = require("wibox") + +local setmetatable = setmetatable + +-- Basic template for custom widgets +-- lain.widgets.base + +local function worker(args) + local base = {} + local args = args or {} + local timeout = args.timeout or 5 + local cmd = args.cmd or "" + local settings = args.settings or function() end + + base.widget = wibox.widget.textbox('') + + function base.update() + if output ~= base.prev then + output = read_pipe(cmd) + widget = base.widget + settings() + base.prev = output + end + end + + newtimer(cmd, timeout, base.update) + + return setmetatable(base, { __index = base.widget }) +end + +return setmetatable({}, { __call = function(_, ...) return worker(...) end }) diff --git a/awesome/.config/awesome/lain/widgets/bat.lua b/awesome/.config/awesome/lain/widgets/bat.lua @@ -0,0 +1,136 @@ + +--[[ + + Licensed under GNU General Public License v2 + * (c) 2013, Luke Bonham + * (c) 2010-2012, Peter Hofmann + +--]] + +local newtimer = require("lain.helpers").newtimer +local first_line = require("lain.helpers").first_line + +local naughty = require("naughty") +local wibox = require("wibox") + +local math = { floor = math.floor } +local string = { format = string.format } +local tonumber = tonumber + +local setmetatable = setmetatable + +-- Battery infos +-- lain.widgets.bat + +local function worker(args) + local bat = {} + local args = args or {} + local timeout = args.timeout or 30 + local battery = args.battery or "BAT0" + local ac = args.ac or "AC0" + local notify = args.notify or "on" + local settings = args.settings or function() end + + bat.widget = wibox.widget.textbox('') + + bat_notification_low_preset = { + title = "Battery low", + text = "Plug the cable!", + timeout = 15, + fg = "#202020", + bg = "#CDCDCD" + } + + bat_notification_critical_preset = { + title = "Battery exhausted", + text = "Shutdown imminent", + timeout = 15, + fg = "#000000", + bg = "#FFFFFF" + } + + function update() + bat_now = { + status = "Not present", + ac_status = "N/A", + perc = "N/A", + time = "N/A", + watt = "N/A" + } + + local bstr = "/sys/class/power_supply/" .. battery + local astr = "/sys/class/power_supply/" .. ac + local present = first_line(bstr .. "/present") + + if present == "1" + then + -- current_now(I)[uA], voltage_now(U)[uV], power_now(P)[uW] + local rate_current = tonumber(first_line(bstr .. "/current_now")) + local rate_voltage = tonumber(first_line(bstr .. "/voltage_now")) + local rate_power = tonumber(first_line(bstr .. "/power_now")) + + -- energy_now(P)[uWh], charge_now(I)[uAh] + local energy_now = tonumber(first_line(bstr .. "/energy_now") or + first_line(bstr .. "/charge_now")) + + -- energy_full(P)[uWh], charge_full(I)[uAh], + local energy_full = tonumber(first_line(bstr .. "/energy_full") or + first_line(bstr .. "/charge_full")) + + + local energy_percentage = tonumber(first_line(bstr .. "/capacity")) or + math.floor((energy_now / energy_full) * 100) + + bat_now.status = first_line(bstr .. "/status") or "N/A" + bat_now.ac_status = first_line(astr .. "/online") or "N/A" + + -- if rate = 0 or rate not defined skip the round + if not (rate_power and rate_power > 0) and + not (rate_current and rate_current > 0) and + not (bat_now.status == "Full") + then + return + end + + local rate_time = 0 + if bat_now.status == "Charging" then + rate_time = (energy_full - energy_now) / (rate_power or rate_current) + elseif bat_now.status == "Discharging" then + rate_time = energy_now / (rate_power or rate_current) + end + + local hours = math.floor(rate_time) + local minutes = math.floor((rate_time - hours) * 60) + local watt = rate_power and (rate_power / 1e6) or (rate_voltage * rate_current) / 1e12 + + bat_now.perc = string.format("%d", energy_percentage) + bat_now.time = string.format("%02d:%02d", hours, minutes) + bat_now.watt = string.format("%.2fW", watt) + end + + widget = bat.widget + settings() + + -- notifications for low and critical states + if bat_now.status == "Discharging" and notify == "on" and bat_now.perc then + local nperc = tonumber(bat_now.perc) or 100 + if nperc <= 5 then + bat.id = naughty.notify({ + preset = bat_notification_critical_preset, + replaces_id = bat.id, + }).id + elseif nperc <= 15 then + bat.id = naughty.notify({ + preset = bat_notification_low_preset, + replaces_id = bat.id, + }).id + end + end + end + + newtimer(battery, timeout, update) + + return setmetatable(bat, { __index = bat.widget }) +end + +return setmetatable({}, { __call = function(_, ...) return worker(...) end }) diff --git a/awesome/.config/awesome/lain/widgets/borderbox.lua b/awesome/.config/awesome/lain/widgets/borderbox.lua @@ -0,0 +1,61 @@ + +--[[ + + Licensed under GNU General Public License v2 + * (c) 2013, Luke Bonham + * (c) 2010-2012, Peter Hofmann + +--]] + +local wibox = require("awful.wibox") +local setmetatable = setmetatable + +-- Creates a thin wibox at a position relative to another wibox +-- lain.widgets.borderbox +local borderbox = {} + +local function worker(relbox, s, args) + local where = args.position or 'top' + local color = args.color or '#FFFFFF' + local size = args.size or 1 + local box = nil + local wiboxarg = { + position = nil, + bg = color + } + + if where == 'top' + then + wiboxarg.width = relbox.width + wiboxarg.height = size + box = wibox(wiboxarg) + box.x = relbox.x + box.y = relbox.y - size + elseif where == 'bottom' + then + wiboxarg.width = relbox.width + wiboxarg.height = size + box = wibox(wiboxarg) + box.x = relbox.x + box.y = relbox.y + relbox.height + elseif where == 'left' + then + wiboxarg.width = size + wiboxarg.height = relbox.height + box = wibox(wiboxarg) + box.x = relbox.x - size + box.y = relbox.y + elseif where == 'right' + then + wiboxarg.width = size + wiboxarg.height = relbox.height + box = wibox(wiboxarg) + box.x = relbox.x + relbox.width + box.y = relbox.y + end + + box.screen = s + return box +end + +return setmetatable(borderbox, { __call = function(_, ...) return worker(...) end }) diff --git a/awesome/.config/awesome/lain/widgets/calendar.lua b/awesome/.config/awesome/lain/widgets/calendar.lua @@ -0,0 +1,132 @@ + +--[[ + + Licensed under GNU General Public License v2 + * (c) 2013, Luke Bonham + +--]] + +local icons_dir = require("lain.helpers").icons_dir + +local awful = require("awful") +local beautiful = require("beautiful") +local naughty = require("naughty") + +local io = { popen = io.popen } +local os = { date = os.date } +local mouse = mouse +local string = { format = string.format, + sub = string.sub, + gsub = string.gsub } +local tonumber = tonumber + +local setmetatable = setmetatable + +-- Calendar notification +-- lain.widgets.calendar +local calendar = {} +local cal_notification = nil + +function calendar:hide() + if cal_notification ~= nil then + naughty.destroy(cal_notification) + cal_notification = nil + end +end + +function calendar:show(t_out, inc_offset, scr) + calendar:hide() + + local f, c_text + local offs = inc_offset or 0 + local tims = t_out or 0 + local today = tonumber(os.date('%d')) + + calendar.offset = calendar.offset + offs + + if offs == 0 or calendar.offset == 0 + then -- current month showing, today highlighted + calendar.offset = 0 + calendar.notify_icon = calendar.icons .. today .. ".png" + + -- bg and fg inverted to highlight today + f = io.popen(string.format("%s | sed -r -e 's/_\\x08//g' -e '0,/(^| )%d($| )/ s/(^| )%d($| )/\\1<b><span foreground=\"%s\" background=\"%s\">%d<\\/span><\\/b>\\2/'", + calendar.cal, today, today, calendar.bg, calendar.fg, today)) + + else -- no current month showing, no day to highlight + local month = tonumber(os.date('%m')) + local year = tonumber(os.date('%Y')) + + month = month + calendar.offset + + while month > 12 do + month = month - 12 + year = year + 1 + end + + while month < 1 do + month = month + 12 + year = year - 1 + end + + calendar.notify_icon = nil + f = io.popen(string.format('%s %s %s', calendar.cal, month, year)) + end + + c_text = "<tt><span font='" .. calendar.font .. " " + .. calendar.font_size .. "'><b>" + .. f:read() .. "</b>\n\n" + .. f:read() .. "\n" + .. f:read("*all"):gsub("\n*$", "") + .. "</span></tt>" + f:close() + + if calendar.followmouse then + scrp = mouse.screen + else + scrp = scr or calendar.scr_pos + end + + cal_notification = naughty.notify({ + text = c_text, + icon = calendar.notify_icon, + position = calendar.position, + fg = calendar.fg, + bg = calendar.bg, + timeout = tims, + screen = scrp + }) +end + +function calendar:attach(widget, args) + local args = args or {} + + calendar.cal = args.cal or "/usr/bin/cal" + calendar.icons = args.icons or icons_dir .. "cal/white/" + calendar.font = args.font or beautiful.font:gsub(" %d.*", "") + calendar.font_size = tonumber(args.font_size) or 11 + calendar.fg = args.fg or beautiful.fg_normal or "#FFFFFF" + calendar.bg = args.bg or beautiful.bg_normal or "#000000" + calendar.position = args.position or "top_right" + calendar.scr_pos = args.scr_pos or 1 + calendar.followmouse = args.followmouse or false + + calendar.fg = string.sub(calendar.fg, 1, 7) + calendar.bg = string.sub(calendar.bg, 1, 7) + + calendar.offset = 0 + calendar.notify_icon = nil + + widget:connect_signal("mouse::enter", function () calendar:show(0, 0, calendar.scr_pos) end) + widget:connect_signal("mouse::leave", function () calendar:hide() end) + widget:buttons(awful.util.table.join(awful.button({ }, 1, function () + calendar:show(0, -1, calendar.scr_pos) end), + awful.button({ }, 3, function () + calendar:show(0, 1, calendar.scr_pos) end), + awful.button({ }, 4, function () + calendar:show(0, -1, calendar.scr_pos) end), + awful.button({ }, 5, function () + calendar:show(0, 1, calendar.scr_pos) end))) +end + +return setmetatable(calendar, { __call = function(_, ...) return create(...) end }) diff --git a/awesome/.config/awesome/lain/widgets/contrib/ccurr.lua b/awesome/.config/awesome/lain/widgets/contrib/ccurr.lua @@ -0,0 +1,82 @@ + +--[[ + + Licensed under GNU General Public License v2 + * (c) 2014, Aaron Lebo + +--]] + +local newtimer = require("lain.helpers").newtimer +local json = require("lain.util").dkjson + +local wibox = require("wibox") + +local string = { format = string.format } +local tonumber = tonumber + +-- Crypto currencies widget +-- lain.widgets.contrib.ccurr +local ccurr = {} + +-- Currently gets +-- * BTC/USD +-- * DOGE/USD +-- using Coinbase and Cryptsy APIs. + +-- requires http://dkolf.de/src/dkjson-lua.fsl/home +-- based upon http://awesome.naquadah.org/wiki/Bitcoin_Price_Widget + +local function get(url) + local f = io.popen('curl -m 5 -s "' .. url .. '"') + if not f then + return 0 + else + local s = f:read("*all") + f:close() + return s + end +end + +local function parse(j) + local obj, pos, err = json.decode(j, 1, nil) + if err then + return nil + else + return obj + end +end + +local function worker(args) + local args = args or {} + local timeout = args.timeout or 600 + local btc_url = args.btc_url or "https://coinbase.com/api/v1/prices/buy" + local doge_url = args.doge_url or "http://pubapi.cryptsy.com/api.php?method=singlemarketdata&marketid=132" + local settings = args.settings or function() end + + ccurr.widget = wibox.widget.textbox('') + + local function update() + price_now = { + btc = "N/A", + doge = "N/A" + } + + btc = parse(get(btc_url)) + doge = parse(get(doge_url)) + + if btc and doge then + price_now.btc = tonumber(btc["subtotal"]["amount"]) + price_now.doge = tonumber(doge["return"]["markets"]["DOGE"]["lasttradeprice"]) + price_now.doge = string.format("%.4f", price_now.btc * price_now.doge) + end + + widget = ccurr.widget + settings() + end + + newtimer("ccurr", timeout, update) + + return ccurr.widget +end + +return setmetatable(ccurr, { __call = function(_, ...) return worker(...) end }) diff --git a/awesome/.config/awesome/lain/widgets/contrib/init.lua b/awesome/.config/awesome/lain/widgets/contrib/init.lua @@ -0,0 +1,19 @@ + +--[[ + + Lain + Layouts, widgets and utilities for Awesome WM + + Users contributed widgets section + + Licensed under GNU General Public License v2 + * (c) 2013, Luke Bonham + +--]] + +local wrequire = require("lain.helpers").wrequire +local setmetatable = setmetatable + +local widgets = { _NAME = "lain.widgets.contrib" } + +return setmetatable(widgets, { __index = wrequire }) diff --git a/awesome/.config/awesome/lain/widgets/contrib/kbdlayout.lua b/awesome/.config/awesome/lain/widgets/contrib/kbdlayout.lua @@ -0,0 +1,82 @@ + +--[[ + + Licensed under GNU General Public License v2 + * (c) 2015, Dario Gjorgjevski + +--]] + +local newtimer = require("lain.helpers").newtimer +local read_pipe = require("lain.helpers").read_pipe + +local wibox = require("wibox") +local awful = require("awful") + +local string = { match = string.match } + +local setmetatable = setmetatable + +-- Keyboard layout switcher +-- lain.widgets.contrib.kblayout + +local function worker (args) + local kbdlayout = {} + kbdlayout.widget = wibox.widget.textbox('') + + local layouts = args.layouts + local settings = args.settings or function () end + local add_us_secondary = true + local timeout = args.timeout or 5 + local idx = 1 + + if args.add_us_secondary == false then add_us_secondary = false end + + -- Mouse bindings + kbdlayout.widget:buttons(awful.util.table.join( + awful.button({ }, 1, function () kbdlayout.next() end), + awful.button({ }, 3, function () kbdlayout.prev() end))) + + local function run_settings (layout, variant) + widget = kbdlayout.widget + kbdlayout_now = { layout=string.match(layout, "[^,]+"), -- Make sure to match the primary layout only. + variant=variant } + settings() + end + + function kbdlayout.update () + local status = read_pipe('setxkbmap -query') + + run_settings(string.match(status, "layout:%s*([^\n]*)"), + string.match(status, "variant:%s*([^\n]*)")) + end + + function kbdlayout.set (i) + idx = ((i - 1) % #layouts) + 1 -- Make sure to wrap around as needed. + local to_execute = 'setxkbmap ' .. layouts[idx].layout + + if add_us_secondary and not string.match(layouts[idx].layout, ",?us,?") then + to_execute = to_execute .. ",us" + end + + if layouts[idx].variant then + to_execute = to_execute .. ' ' .. layouts[idx].variant + end + + if os.execute(to_execute) then + run_settings(layouts[idx].layout, layouts[idx].variant) + end + end + + function kbdlayout.next () + kbdlayout.set(idx + 1) + end + + function kbdlayout.prev () + kbdlayout.set(idx - 1) + end + + newtimer("kbdlayout", timeout, kbdlayout.update) + return setmetatable(kbdlayout, { __index = kbdlayout.widget }) +end + +return setmetatable({}, { __call = function (_, ...) return worker(...) end }) diff --git a/awesome/.config/awesome/lain/widgets/contrib/moc.lua b/awesome/.config/awesome/lain/widgets/contrib/moc.lua @@ -0,0 +1,109 @@ + +--[[ + + Licensed under GNU General Public License v2 + * (c) 2014, anticlockwise <http://github.com/anticlockwise> + +--]] + +local helpers = require("lain.helpers") +local async = require("lain.asyncshell") + +local escape_f = require("awful.util").escape +local naughty = require("naughty") +local wibox = require("wibox") + +local io = { popen = io.popen } +local os = { execute = os.execute, + getenv = os.getenv } +local string = { format = string.format, + gmatch = string.gmatch } + +local setmetatable = setmetatable + +-- MOC audio player +-- lain.widgets.contrib.moc +local moc = {} + +local function worker(args) + local args = args or {} + local timeout = args.timeout or 2 + local music_dir = args.music_dir or os.getenv("HOME") .. "/Music" + local cover_size = args.cover_size or 100 + local default_art = args.default_art or "" + local followmouse = args.followmouse or false + local settings = args.settings or function() end + + local mpdcover = helpers.scripts_dir .. "mpdcover" + + moc.widget = wibox.widget.textbox('') + + moc_notification_preset = { + title = "Now playing", + timeout = 6 + } + + helpers.set_map("current moc track", nil) + + function moc.update() + -- mocp -i will produce output like: + -- Artist: Travis + -- Album: The Man Who + -- etc. + async.request("mocp -i", function(f) + moc_now = { + state = "N/A", + file = "N/A", + artist = "N/A", + title = "N/A", + album = "N/A", + elapsed = "N/A", + total = "N/A" + } + + for line in string.gmatch(f, "[^\n]+") do + for k, v in string.gmatch(line, "([%w]+):[%s](.*)$") do + if k == "State" then moc_now.state = v + elseif k == "File" then moc_now.file = v + elseif k == "Artist" then moc_now.artist = escape_f(v) + elseif k == "SongTitle" then moc_now.title = escape_f(v) + elseif k == "Album" then moc_now.album = escape_f(v) + elseif k == "CurrentTime" then moc_now.elapsed = escape_f(v) + elseif k == "TotalTime" then moc_now.total = escape_f(v) + end + end + end + + moc_notification_preset.text = string.format("%s (%s) - %s\n%s", moc_now.artist, + moc_now.album, moc_now.total, moc_now.title) + widget = moc.widget + settings() + + if moc_now.state == "PLAY" then + if moc_now.title ~= helpers.get_map("current moc track") then + helpers.set_map("current moc track", moc_now.title) + os.execute(string.format("%s %q %q %d %q", mpdcover, "", + moc_now.file, cover_size, default_art)) + + if followmouse then + moc_notification_preset.screen = mouse.screen + end + + moc.id = naughty.notify({ + preset = moc_notification_preset, + icon = "/tmp/mpdcover.png", + replaces_id = moc.id, + }).id + end + elseif moc_now.state ~= "PAUSE" then + helpers.set_map("current moc track", nil) + end + end) + end + + helpers.newtimer("moc", timeout, moc.update) + + return setmetatable(moc, { __index = moc.widget }) +end + +return setmetatable(moc, { __call = function(_, ...) return worker(...) end }) diff --git a/awesome/.config/awesome/lain/widgets/contrib/redshift.lua b/awesome/.config/awesome/lain/widgets/contrib/redshift.lua @@ -0,0 +1,79 @@ + +--[[ + + Licensed under GNU General Public License v2 + * (c) 2014, blueluke <http://github.com/blueluke> + +--]] + +local awful = require("awful") +local os = os +local spawn = awful.util.spawn_with_shell + +local setmetatable = setmetatable + +-- Redshift +-- lain.widgets.contrib.redshift +local redshift = {} + +local attached = false -- true if attached to a widget +local active = false -- true if redshift is active +local running = false -- true if redshift was initialized +local update_fnct = function() end -- Function that is run each time redshift is toggled. See redshift:attach(). + + +local function init() + -- As there is no way to determine if redshift was previously + -- toggled off (i.e Awesome on-the-fly restart), kill redshift to make sure + os.execute("pkill redshift") + -- Remove existing color adjustment + spawn("redshift -x") + -- (Re)start redshift + spawn("redshift") + running = true + active = true +end + +function redshift:toggle() + if running then + -- Sending -USR1 toggles redshift (See project website) + os.execute("pkill -USR1 redshift") + active = not active + else + init() + end + update_fnct() +end + +function redshift:off() + if running and active then + redshift:toggle() + end +end + +function redshift:on() + if not active then + redshift:toggle() + end +end + +function redshift:is_active() + return active +end + +-- Attach to a widget +-- Provides a button which toggles redshift on/off on click +-- @param widget: Widget to attach to. +-- @param fnct: Function to be run each time redshift is toggled (optional). +-- Use it to update widget text or icons on status change. +function redshift:attach(widget, fnct) + update_fnct = fnct or function() end + if not attached then + init() + attached = true + update_fnct() + end + widget:buttons(awful.util.table.join( awful.button({}, 1, function () redshift:toggle() end) )) +end + +return setmetatable(redshift, { _call = function(_, ...) return create(...) end }) diff --git a/awesome/.config/awesome/lain/widgets/contrib/task.lua b/awesome/.config/awesome/lain/widgets/contrib/task.lua @@ -0,0 +1,144 @@ + +--[[ + + Licensed under GNU General Public License v2 + * (c) 2013, Jan Xie + +--]] + +local icons_dir = require("lain.helpers").icons_dir + +local awful = require("awful") +local beautiful = require("beautiful") +local naughty = require("naughty") + +local mouse = mouse +local io = io +local string = { len = string.len } +local tonumber = tonumber + +local setmetatable = setmetatable + +-- Taskwarrior notification +-- lain.widgets.contrib.task +local task = {} + +local task_notification = nil + +function task:hide() + if task_notification ~= nil then + naughty.destroy(task_notification) + task_notification = nil + end +end + +function task:show(scr_pos) + task:hide() + + local f, c_text + + if task.followmouse then + local scrp = mouse.screen + else + local scrp = scr_pos or task.scr_pos + end + + f = io.popen('task') + c_text = "<span font='" + .. task.font .. " " + .. task.font_size .. "'>" + .. f:read("*all"):gsub("\n*$", "") + .. "</span>" + f:close() + + task_notification = naughty.notify({ title = "[task next]", + text = c_text, + icon = task.notify_icon, + position = task.position, + fg = task.fg, + bg = task.bg, + timeout = task.timeout, + screen = scrp + }) +end + +function task:prompt_add() + awful.prompt.run({ prompt = "Add task: " }, + mypromptbox[mouse.screen].widget, + function (...) + local f = io.popen("task add " .. ...) + c_text = "\n<span font='" + .. task.font .. " " + .. task.font_size .. "'>" + .. f:read("*all") + .. "</span>" + f:close() + + naughty.notify({ + text = c_text, + icon = task.notify_icon, + position = task.position, + fg = task.fg, + bg = task.bg, + timeout = task.timeout, + }) + end, + nil, + awful.util.getdir("cache") .. "/history_task_add") +end + +function task:prompt_search() + awful.prompt.run({ prompt = "Search task: " }, + mypromptbox[mouse.screen].widget, + function (...) + local f = io.popen("task " .. ...) + c_text = f:read("*all"):gsub(" \n*$", "") + f:close() + + if string.len(c_text) == 0 + then + c_text = "No results found." + else + c_text = "<span font='" + .. task.font .. " " + .. task.font_size .. "'>" + .. c_text + .. "</span>" + end + + naughty.notify({ + title = "[task next " .. ... .. "]", + text = c_text, + icon = task.notify_icon, + position = task.position, + fg = task.fg, + bg = task.bg, + timeout = task.timeout, + screen = mouse.screen + }) + end, + nil, + awful.util.getdir("cache") .. "/history_task") +end + +function task:attach(widget, args) + local args = args or {} + + task.font_size = tonumber(args.font_size) or 12 + task.font = beautiful.font:sub(beautiful.font:find(""), + beautiful.font:find(" ")) + task.fg = args.fg or beautiful.fg_normal or "#FFFFFF" + task.bg = args.bg or beautiful.bg_normal or "#FFFFFF" + task.position = args.position or "top_right" + task.timeout = args.timeout or 7 + task.scr_pos = args.scr_pos or 1 + task.followmouse = args.followmouse or false + + task.notify_icon = icons_dir .. "/taskwarrior/task.png" + task.notify_icon_small = icons_dir .. "/taskwarrior/tasksmall.png" + + widget:connect_signal("mouse::enter", function () task:show(task.scr_pos) end) + widget:connect_signal("mouse::leave", function () task:hide() end) +end + +return setmetatable(task, { __call = function(_, ...) return create(...) end }) diff --git a/awesome/.config/awesome/lain/widgets/contrib/tpbat/init.lua b/awesome/.config/awesome/lain/widgets/contrib/tpbat/init.lua @@ -0,0 +1,170 @@ + +--[[ + + tpbat.lua + Battery status widget for ThinkPad laptops that use SMAPI + lain.widgets.contrib.tpbat + + More on tp_smapi: http://www.thinkwiki.org/wiki/Tp_smapi + + Licensed under GNU General Public License v2 + * (c) 2013, Conor Heine + * (c) 2013, Luke Bonham + * (c) 2010-2012, Peter Hofmann + +--]] + +local debug = { getinfo = debug.getinfo } +local newtimer = require("lain.helpers").newtimer +local first_line = require("lain.helpers").first_line +local beautiful = require("beautiful") +local naughty = require("naughty") +local wibox = require("wibox") + +local string = { format = string.format } +local math = { floor = math.floor } +local tostring = tostring +local setmetatable = setmetatable + +package.path = debug.getinfo(1,"S").source:match[[^@?(.*[\/])[^\/]-$]] .. "?.lua;" .. package.path +local smapi = require("smapi") + +-- ThinkPad SMAPI-enabled battery info widget +-- lain.widgets.contrib.tpbat +local tpbat = { } +local tpbat_notification = nil + +function tpbat:hide() + if tpbat_notification ~= nil + then + naughty.destroy(tpbat_notification) + tpbat_notification = nil + end +end + +function tpbat:show(t_out) + tpbat:hide() + + local bat = self.bat + local t_out = t_out or 0 + + if bat == nil or not bat:installed() then return end + + local mfgr = bat:get('manufacturer') or "no_mfgr" + local model = bat:get('model') or "no_model" + local chem = bat:get('chemistry') or "no_chem" + local status = bat:get('state') or "nil" + local time = bat:remaining_time() + local msg = "\t" + + if status ~= "idle" and status ~= "nil" + then + if time == "N/A" + then + msg = "...Calculating time remaining..." + else + msg = time .. (status == "charging" and " until charged" or " remaining") + end + else + msg = "On AC Power" + end + + local str = string.format("%s : %s %s (%s)\n", bat.name, mfgr, model, chem) + .. string.format("\n%s \t\t\t %s", status:upper(), msg) + + tpbat_notification = naughty.notify({ + preset = { fg = beautiful.fg_normal }, + text = str, + timeout = t_out, + screen = client.focus and client.focus.screen or 1 + }) +end + +function tpbat.register(args) + local args = args or {} + local timeout = args.timeout or 30 + local battery = args.battery or "BAT0" + local settings = args.settings or function() end + + tpbat.bat = smapi:battery(battery) -- Create a new battery + local bat = tpbat.bat + + tpbat.widget = wibox.widget.textbox('') + + bat_notification_low_preset = { + title = "Battery low", + text = "Plug the cable!", + timeout = 15, + fg = "#202020", + bg = "#CDCDCD" + } + + bat_notification_critical_preset = { + title = "Battery exhausted", + text = "Shutdown imminent", + timeout = 15, + fg = "#000000", + bg = "#FFFFFF" + } + + if bat:get('state') == nil + then + local n = naughty.notify({ + preset = bat_notification_low_preset, + title = "SMAPI Battery Warning: Unable to read battery state!", + text = "This widget is intended for ThinkPads. Is tp_smapi installed? Check your configs & paths.", + screen = client.focus and client.focus.screen or 1 + }) + end + + function update() + bat_now = { + status = "Not present", + perc = "N/A", + time = "N/A", + watt = "N/A" + } + + if bat:installed() + then + bat_now.status = bat:status() or "N/A" + bat_now.perc = bat:percent() + bat_now.time = bat:remaining_time() + -- bat_now.watt = string.format("%.2fW", (VOLTS * AMPS) / 1e12) + + -- notifications for low and critical states (when discharging) + if bat_now.status == "discharging" + then + if bat_now.perc <= 5 + then + tpbat.id = naughty.notify({ + preset = bat_notification_critical_preset, + replaces_id = tpbat.id, + screen = client.focus and client.focus.screen or 1 + }).id + elseif bat_now.perc <= 15 + then + tpbat.id = naughty.notify({ + preset = bat_notification_low_preset, + replaces_id = tpbat.id, + screen = client.focus and client.focus.screen or 1 + }).id + end + end + + bat_now.perc = tostring(bat_now.perc) + end + + widget = tpbat.widget + settings() + end + + newtimer("tpbat-" .. bat.name, timeout, update) + + widget:connect_signal('mouse::enter', function () tpbat:show() end) + widget:connect_signal('mouse::leave', function () tpbat:hide() end) + + return tpbat.widget +end + +return setmetatable(tpbat, { __call = function(_, ...) return tpbat.register(...) end }) diff --git a/awesome/.config/awesome/lain/widgets/contrib/tpbat/smapi.lua b/awesome/.config/awesome/lain/widgets/contrib/tpbat/smapi.lua @@ -0,0 +1,102 @@ + +--[[ + + smapi.lua + Interface with thinkpad battery information + + Licensed under GNU General Public License v2 + * (c) 2013, Conor Heine + +--]] + +local first_line = require("lain.helpers").first_line + +local string = { format = string.format } +local tonumber = tonumber +local setmetatable = setmetatable + +local smapi = {} + +local apipath = "/sys/devices/platform/smapi" + +-- Most are readable values, but some can be written to (not implemented, yet?) +local readable = { + barcoding = true, + charging_max_current = true, + charging_max_voltage = true, + chemistry = true, + current_avg = true, + current_now = true, + cycle_count = true, + design_capacity = true, + design_voltage = true, + dump = true, + first_use_date = true, + force_discharge = false, + group0_voltage = true, + group1_voltage = true, + group2_voltage = true, + group3_voltage = true, + inhibit_charge_minutes = false, + installed = true, + last_full_capacity = true, + manufacture_date = true, + manufacturer = true, + model = true, + power_avg = true, + power_now = true, + remaining_capacity = true, + remaining_charging_time = true, + remaining_percent = true, + remaining_percent_error = true, + remaining_running_time = true, + remaining_running_time_now = true, + serial = true, + start_charge_thresh = false, + state = true, + stop_charge_thresh = false, + temperature = true, + voltage = true, +} + +function smapi:battery(name) + local bat = {} + + bat.name = name + bat.path = apipath .. "/" .. name + + function bat:get(item) + return self.path ~= nil and readable[item] and first_line(self.path .. "/" .. item) or nil + end + + function bat:installed() + return self:get("installed") == "1" + end + + function bat:status() + return self:get('state') + end + + -- Remaining time can either be time until battery dies or time until charging completes + function bat:remaining_time() + local time_val = bat_now.status == 'discharging' and 'remaining_running_time' or 'remaining_charging_time' + local mins_left = self:get(time_val) + + if mins_left:find("^%d+") == nil + then + return "N/A" + end + + local hrs = math.floor(mins_left / 60) + local min = mins_left % 60 + return string.format("%02d:%02d", hrs, min) + end + + function bat:percent() + return tonumber(self:get("remaining_percent")) + end + + return setmetatable(bat, {__metatable = false, __newindex = false}) +end + +return smapi diff --git a/awesome/.config/awesome/lain/widgets/cpu.lua b/awesome/.config/awesome/lain/widgets/cpu.lua @@ -0,0 +1,88 @@ + +--[[ + + Licensed under GNU General Public License v2 + * (c) 2013, Luke Bonham + * (c) 2010-2012, Peter Hofmann + +--]] + +local lines_match = require("lain.helpers").lines_match +local newtimer = require("lain.helpers").newtimer + +local wibox = require("wibox") + +local math = { ceil = math.ceil } +local string = { format = string.format, + gmatch = string.gmatch } +local tostring = tostring + +local setmetatable = setmetatable + +-- CPU usage +-- lain.widgets.cpu +local cpu = { core = {} } + +local function worker(args) + local args = args or {} + local timeout = args.timeout or 2 + local settings = args.settings or function() end + + cpu.widget = wibox.widget.textbox('') + + function update() + -- Read the amount of time the CPUs have spent performing + -- different kinds of work. Read the first line of /proc/stat + -- which is the sum of all CPUs. + local times = lines_match("cpu","/proc/stat") + + for index,time in pairs(times) + do + local coreid = index - 1 + local core = cpu.core[coreid] or + { last_active = 0 , last_total = 0, usage = 0 } + local at = 1 + local idle = 0 + local total = 0 + + for field in string.gmatch(time, "[%s]+([^%s]+)") + do + -- 4 = idle, 5 = ioWait. Essentially, the CPUs have done + -- nothing during these times. + if at == 4 or at == 5 then + idle = idle + field + end + total = total + field + at = at + 1 + end + + local active = total - idle + + if core.last_active ~= active or core.last_total ~= total then + -- Read current data and calculate relative values. + local dactive = active - core.last_active + local dtotal = total - core.last_total + + local usage = math.ceil((dactive / dtotal) * 100) + + core.last_active = active + core.last_total = total + core.usage = usage + + -- Save current data for the next run. + cpu.core[coreid] = core; + end + end + + widget = cpu.widget + cpu_now = cpu.core + cpu_now.usage = cpu_now[0].usage + + settings() + end + + newtimer("cpu", timeout, update) + return cpu.widget +end + +return setmetatable(cpu, { __call = function(_, ...) return worker(...) end }) diff --git a/awesome/.config/awesome/lain/widgets/fs.lua b/awesome/.config/awesome/lain/widgets/fs.lua @@ -0,0 +1,121 @@ + +--[[ + + Licensed under GNU General Public License v2 + * (c) 2013, Luke Bonham + * (c) 2010, Adrian C. <anrxc@sysphere.org> + * (c) 2009, Lucas de Vries <lucas@glacicle.com> + +--]] + +local helpers = require("lain.helpers") + +local beautiful = require("beautiful") +local wibox = require("wibox") +local naughty = require("naughty") + +local io = { popen = io.popen } +local pairs = pairs +local mouse = mouse +local string = { match = string.match, + format = string.format } +local tonumber = tonumber + +local setmetatable = setmetatable + +-- File system disk space usage +-- lain.widgets.fs +local fs = {} +local fs_notification = nil + +function fs:hide() + if fs_notification ~= nil then + naughty.destroy(fs_notification) + fs_notification = nil + end +end + +function fs:show(t_out) + fs:hide() + + local ws = helpers.read_pipe(helpers.scripts_dir .. "dfs"):gsub("\n*$", "") + + if fs.followmouse then + fs.notification_preset.screen = mouse.screen + end + + fs_notification = naughty.notify({ + preset = fs.notification_preset, + text = ws, + timeout = t_out + }) +end + +-- Unit definitions +local unit = { ["mb"] = 1024, ["gb"] = 1024^2 } + +local function worker(args) + local args = args or {} + local timeout = args.timeout or 600 + local partition = args.partition or "/" + local settings = args.settings or function() end + + fs.followmouse = args.followmouse or false + fs.notification_preset = args.notification_preset or { fg = beautiful.fg_normal } + + fs.widget = wibox.widget.textbox('') + + helpers.set_map(partition, false) + + function update() + fs_info = {} + fs_now = {} + local f = assert(io.popen("LC_ALL=C df -kP")) + + for line in f:lines() do -- Match: (size) (used)(avail)(use%) (mount) + local s = string.match(line, "^.-[%s]([%d]+)") + local u,a,p = string.match(line, "([%d]+)[%D]+([%d]+)[%D]+([%d]+)%%") + local m = string.match(line, "%%[%s]([%p%w]+)") + + if u and m then -- Handle 1st line and broken regexp + fs_info[m .. " size_mb"] = string.format("%.1f", tonumber(s) / unit["mb"]) + fs_info[m .. " size_gb"] = string.format("%.1f", tonumber(s) / unit["gb"]) + fs_info[m .. " used_p"] = tonumber(p) + fs_info[m .. " avail_p"] = 100 - tonumber(p) + end + end + + f:close() + + fs_now.used = tonumber(fs_info[partition .. " used_p"]) or 0 + fs_now.available = tonumber(fs_info[partition .. " avail_p"]) or 0 + fs_now.size_mb = tonumber(fs_info[partition .. " size_mb"]) or 0 + fs_now.size_gb = tonumber(fs_info[partition .. " size_gb"]) or 0 + + widget = fs.widget + settings() + + if fs_now.used >= 99 and not helpers.get_map(partition) + then + naughty.notify({ + title = "warning", + text = partition .. " ran out!\nmake some room", + timeout = 8, + fg = "#000000", + bg = "#FFFFFF", + }) + helpers.set_map(partition, true) + else + helpers.set_map(partition, false) + end + end + + fs.widget:connect_signal('mouse::enter', function () fs:show(0) end) + fs.widget:connect_signal('mouse::leave', function () fs:hide() end) + + helpers.newtimer(partition, timeout, update) + + return setmetatable(fs, { __index = fs.widget }) +end + +return setmetatable(fs, { __call = function(_, ...) return worker(...) end }) diff --git a/awesome/.config/awesome/lain/widgets/imap.lua b/awesome/.config/awesome/lain/widgets/imap.lua @@ -0,0 +1,94 @@ + +--[[ + + Licensed under GNU General Public License v2 + * (c) 2013, Luke Bonham + +--]] + +local helpers = require("lain.helpers") +local async = require("lain.asyncshell") + +local naughty = require("naughty") +local wibox = require("wibox") + +local mouse = mouse +local string = { format = string.format, + gsub = string.gsub } +local tonumber = tonumber + +local setmetatable = setmetatable + +-- Mail IMAP check +-- lain.widgets.imap + +local function worker(args) + local imap = {} + local args = args or {} + + local server = args.server + local mail = args.mail + local password = args.password + + local port = args.port or 993 + local timeout = args.timeout or 60 + local is_plain = args.is_plain or false + local followmouse = args.followmouse or false + local settings = args.settings or function() end + + local head_command = "curl --connect-timeout 3 -fsm 3" + local request = "-X 'SEARCH (UNSEEN)'" + + helpers.set_map(mail, 0) + + if not is_plain + then + password = helpers.read_pipe(password):gsub("\n", "") + end + + imap.widget = wibox.widget.textbox('') + + function update() + mail_notification_preset = { + icon = helpers.icons_dir .. "mail.png", + position = "top_left" + } + + if followmouse then + mail_notification_preset.screen = mouse.screen + end + + curl = string.format("%s --url imaps://%s:%s/INBOX -u %s:%q %s -k", + head_command, server, port, mail, password, request) + + async.request(curl, function(f) + _, mailcount = string.gsub(f, "%d+", "") + _ = nil + + widget = imap.widget + settings() + + if mailcount >= 1 and mailcount > helpers.get_map(mail) + then + if mailcount == 1 then + nt = mail .. " has one new message" + else + nt = mail .. " has <b>" .. mailcount .. "</b> new messages" + end + naughty.notify({ + preset = mail_notification_preset, + text = nt + }) + end + + helpers.set_map(mail, mailcount) + end) + + end + + helpers.newtimer(mail, timeout, update, true) + + return setmetatable(imap, { __index = imap.widget }) +end + +return setmetatable({}, { __call = function(_, ...) return worker(...) end }) diff --git a/awesome/.config/awesome/lain/widgets/init.lua b/awesome/.config/awesome/lain/widgets/init.lua @@ -0,0 +1,20 @@ + +--[[ + + Lain + Layouts, widgets and utilities for Awesome WM + + Widgets section + + Licensed under GNU General Public License v2 + * (c) 2013, Luke Bonham + * (c) 2010-2012, Peter Hofmann + +--]] + +local wrequire = require("lain.helpers").wrequire +local setmetatable = setmetatable + +local widgets = { _NAME = "lain.widgets" } + +return setmetatable(widgets, { __index = wrequire }) diff --git a/awesome/.config/awesome/lain/widgets/maildir.lua b/awesome/.config/awesome/lain/widgets/maildir.lua @@ -0,0 +1,105 @@ + +--[[ + + Licensed under GNU General Public License v2 + * (c) 2013, Luke Bonham + * (c) 2010-2012, Peter Hofmann + +--]] + +local newtimer = require("lain.helpers").newtimer +local read_pipe = require("lain.helpers").read_pipe +local spairs = require("lain.helpers").spairs + +local wibox = require("wibox") + +local awful = require("awful") +local util = require("lain.util") + +local io = { popen = io.popen } +local os = { getenv = os.getenv } +local pairs = pairs +local string = { len = string.len, + match = string.match } + +local setmetatable = setmetatable + +-- Maildir check +-- lain.widgets.maildir +local maildir = {} + +local function worker(args) + local args = args or {} + local timeout = args.timeout or 60 + local mailpath = args.mailpath or os.getenv("HOME") .. "/Mail" + local ignore_boxes = args.ignore_boxes or {} + local settings = args.settings or function() end + local ext_mail_cmd = args.external_mail_cmd + + maildir.widget = wibox.widget.textbox('') + + function update() + if ext_mail_cmd ~= nil + then + awful.util.spawn(ext_mail_cmd) + end + + -- Find pathes to mailboxes. + local p = io.popen("find " .. mailpath .. + " -mindepth 1 -maxdepth 2 -type d" .. + " -not -name .git") + local boxes = {} + repeat + line = p:read("*l") + if line ~= nil + then + -- Find all files in the "new" subdirectory. For each + -- file, print a single character (no newline). Don't + -- match files that begin with a dot. + -- Afterwards the length of this string is the number of + -- new mails in that box. + local mailstring = read_pipe("find " .. line .. + "/new -mindepth 1 -type f " .. + "-not -name '.*' -printf a") + + -- Strip off leading mailpath. + local box = string.match(line, mailpath .. "/(.*)") + local nummails = string.len(mailstring) + if nummails > 0 + then + boxes[box] = nummails + end + end + until line == nil + + p:close() + + newmail = "no mail" + -- Count the total number of mails irrespective of where it was found + total = 0 + + for box, number in spairs(boxes) + do + -- Add this box only if it's not to be ignored. + if not util.element_in_table(box, ignore_boxes) + then + total = total + number + if newmail == "no mail" + then + newmail = box .. "(" .. number .. ")" + else + newmail = newmail .. ", " .. + box .. "(" .. number .. ")" + end + end + end + + widget = maildir.widget + settings() + end + + newtimer(mailpath, timeout, update, true) + return maildir.widget +end + +return setmetatable(maildir, { __call = function(_, ...) return worker(...) end }) diff --git a/awesome/.config/awesome/lain/widgets/mem.lua b/awesome/.config/awesome/lain/widgets/mem.lua @@ -0,0 +1,59 @@ + +--[[ + + Licensed under GNU General Public License v2 + * (c) 2013, Luke Bonham + * (c) 2010-2012, Peter Hofmann + +--]] + +local newtimer = require("lain.helpers").newtimer + +local wibox = require("wibox") + +local io = { lines = io.lines } +local math = { floor = math.floor } +local string = { gmatch = string.gmatch } + +local setmetatable = setmetatable + +-- Memory usage (ignoring caches) +-- lain.widgets.mem +local mem = {} + +local function worker(args) + local args = args or {} + local timeout = args.timeout or 2 + local settings = args.settings or function() end + + mem.widget = wibox.widget.textbox('') + + function update() + mem_now = {} + for line in io.lines("/proc/meminfo") + do + for k, v in string.gmatch(line, "([%a]+):[%s]+([%d]+).+") + do + if k == "MemTotal" then mem_now.total = math.floor(v / 1024) + elseif k == "MemFree" then mem_now.free = math.floor(v / 1024) + elseif k == "Buffers" then mem_now.buf = math.floor(v / 1024) + elseif k == "Cached" then mem_now.cache = math.floor(v / 1024) + elseif k == "SwapTotal" then mem_now.swap = math.floor(v / 1024) + elseif k == "SwapFree" then mem_now.swapf = math.floor(v / 1024) + end + end + end + + mem_now.used = mem_now.total - (mem_now.free + mem_now.buf + mem_now.cache) + mem_now.swapused = mem_now.swap - mem_now.swapf + + widget = mem.widget + settings() + end + + newtimer("mem", timeout, update) + + return mem.widget +end + +return setmetatable(mem, { __call = function(_, ...) return worker(...) end }) diff --git a/awesome/.config/awesome/lain/widgets/mpd.lua b/awesome/.config/awesome/lain/widgets/mpd.lua @@ -0,0 +1,128 @@ + +--[[ + + Licensed under GNU General Public License v2 + * (c) 2013, Luke Bonham + * (c) 2010, Adrian C. <anrxc@sysphere.org> + +--]] + +local helpers = require("lain.helpers") +local async = require("lain.asyncshell") + +local escape_f = require("awful.util").escape +local naughty = require("naughty") +local wibox = require("wibox") + +local os = { execute = os.execute, + getenv = os.getenv } +local math = { floor = math.floor } +local mouse = mouse +local string = { format = string.format, + match = string.match, + gmatch = string.gmatch } + +local setmetatable = setmetatable + +-- MPD infos +-- lain.widgets.mpd +local mpd = {} + +local function worker(args) + local args = args or {} + local timeout = args.timeout or 2 + local password = args.password or "" + local host = args.host or "127.0.0.1" + local port = args.port or "6600" + local music_dir = args.music_dir or os.getenv("HOME") .. "/Music" + local cover_size = args.cover_size or 100 + local default_art = args.default_art or "" + local followmouse = args.followmouse or false + local echo_cmd = args.echo_cmd or "echo" + local settings = args.settings or function() end + + local mpdcover = helpers.scripts_dir .. "mpdcover" + local mpdh = "telnet://" .. host .. ":" .. port + local echo = echo_cmd .. " 'password " .. password .. "\nstatus\ncurrentsong\nclose'" + + mpd.widget = wibox.widget.textbox('') + + mpd_notification_preset = { + title = "Now playing", + timeout = 6 + } + + helpers.set_map("current mpd track", nil) + + function mpd.update() + async.request(echo .. " | curl --connect-timeout 1 -fsm 3 " .. mpdh, function (f) + mpd_now = { + state = "N/A", + file = "N/A", + name = "N/A", + artist = "N/A", + title = "N/A", + album = "N/A", + date = "N/A", + time = "N/A", + elapsed = "N/A" + } + + for line in string.gmatch(f, "[^\n]+") do + for k, v in string.gmatch(line, "([%w]+):[%s](.*)$") do + if k == "state" then mpd_now.state = v + elseif k == "file" then mpd_now.file = v + elseif k == "Name" then mpd_now.name = escape_f(v) + elseif k == "Artist" then mpd_now.artist = escape_f(v) + elseif k == "Title" then mpd_now.title = escape_f(v) + elseif k == "Album" then mpd_now.album = escape_f(v) + elseif k == "Date" then mpd_now.date = escape_f(v) + elseif k == "Time" then mpd_now.time = v + elseif k == "elapsed" then mpd_now.elapsed = string.match(v, "%d+") + end + end + end + + mpd_notification_preset.text = string.format("%s (%s) - %s\n%s", mpd_now.artist, + mpd_now.album, mpd_now.date, mpd_now.title) + widget = mpd.widget + settings() + + if mpd_now.state == "play" + then + if mpd_now.title ~= helpers.get_map("current mpd track") + then + helpers.set_map("current mpd track", mpd_now.title) + + if string.match(mpd_now.file, "http.*://") == nil + then -- local file + os.execute(string.format("%s %q %q %d %q", mpdcover, music_dir, + mpd_now.file, cover_size, default_art)) + current_icon = "/tmp/mpdcover.png" + else -- http stream + current_icon = default_art + end + + if followmouse then + mpd_notification_preset.screen = mouse.screen + end + + mpd.id = naughty.notify({ + preset = mpd_notification_preset, + icon = current_icon, + replaces_id = mpd.id, + }).id + end + elseif mpd_now.state ~= "pause" + then + helpers.set_map("current mpd track", nil) + end + end) + end + + helpers.newtimer("mpd", timeout, mpd.update) + + return setmetatable(mpd, { __index = mpd.widget }) +end + +return setmetatable(mpd, { __call = function(_, ...) return worker(...) end }) diff --git a/awesome/.config/awesome/lain/widgets/net.lua b/awesome/.config/awesome/lain/widgets/net.lua @@ -0,0 +1,94 @@ + +--[[ + + Licensed under GNU General Public License v2 + * (c) 2013, Luke Bonham + * (c) 2010-2012, Peter Hofmann + +--]] + +local helpers = require("lain.helpers") +local naughty = require("naughty") +local wibox = require("wibox") + +local string = { format = string.format, + gsub = string.gsub, + match = string.match } + +local setmetatable = setmetatable + +-- Network infos +-- lain.widgets.net + +local function worker(args) + local net = { last_t = 0, last_r = 0 } + + function net.get_device() + local ws = helpers.read_pipe("ip link show | cut -d' ' -f2,9") + ws = ws:match("%w+: UP") or ws:match("ppp%w+: UNKNOWN") + if ws then return ws:match("(%w+):") + else return "network off" end + end + + local args = args or {} + local timeout = args.timeout or 2 + local units = args.units or 1024 --kb + local notify = args.notify or "on" + local screen = args.screen or 1 + local settings = args.settings or function() end + local iface = args.iface or net.get_device() + + net.widget = wibox.widget.textbox('') + + helpers.set_map(iface, true) + + function update() + net_now = {} + + if iface == "" or string.match(iface, "network off") + then + iface = net.get_device() + end + + net_now.carrier = helpers.first_line(string.format('/sys/class/net/%s/carrier', iface)) or '0' + net_now.state = helpers.first_line(string.format('/sys/class/net/%s/operstate', iface)) or 'down' + + local now_t = helpers.first_line(string.format('/sys/class/net/%s/statistics/tx_bytes', iface)) or 0 + local now_r = helpers.first_line(string.format('/sys/class/net/%s/statistics/rx_bytes', iface)) or 0 + + if now_t ~= net.last_t or now_r ~= net.last_r then + net_now.sent = (now_t - net.last_t) / timeout / units + net_now.sent = string.gsub(string.format('%.1f', net_now.sent), ',', '.') + net_now.received = (now_r - net.last_r) / timeout / units + net_now.received = string.gsub(string.format('%.1f', net_now.received), ',', '.') + + widget = net.widget + settings() + + net.last_t = now_t + net.last_r = now_r + end + + if not string.match(net_now.carrier, "1") and notify == "on" + then + if helpers.get_map(iface) + then + naughty.notify({ + title = iface, + text = "no carrier", + icon = helpers.icons_dir .. "no_net.png", + screen = screen + }) + helpers.set_map(iface, false) + end + else + helpers.set_map(iface, true) + end + end + + helpers.newtimer(iface, timeout, update) + + return setmetatable(net, { __index = net.widget }) +end + +return setmetatable({}, { __call = function(_, ...) return worker(...) end }) diff --git a/awesome/.config/awesome/lain/widgets/pulseaudio.lua b/awesome/.config/awesome/lain/widgets/pulseaudio.lua @@ -0,0 +1,49 @@ + +--[[ + + Licensed under GNU General Public License v2 + * (c) 2016, Luke Bonham + +--]] + +local read_pipe = require("lain.helpers").read_pipe +local newtimer = require("lain.helpers").newtimer +local wibox = require("wibox") + +local string = { match = string.match, + format = string.format } + +local setmetatable = setmetatable + +-- PulseAudio volume +-- lain.widgets.pulseaudio +local pulseaudio = {} + +local function worker(args) + local args = args or {} + local timeout = args.timeout or 5 + local settings = args.settings or function() end + local scallback = args.scallback + + pulseaudio.cmd = args.cmd or string.format("pacmd list-sinks | sed -n -e '0,/*/d' -e '/base volume/d' -e '/volume:/p' -e '/muted:/p'") + pulseaudio.widget = wibox.widget.textbox('') + + function pulseaudio.update() + if scallback then pulseaudio.cmd = scallback() end + local s = read_pipe(pulseaudio.cmd) + + volume_now = {} + volume_now.left = tonumber(string.match(s, ":.-(%d+)%%")) + volume_now.right = tonumber(string.match(s, ":.-(%d+)%%")) + volume_now.muted = string.match(s, "muted: (%S+)") + + widget = pulseaudio.widget + settings() + end + + newtimer(string.format("pulseaudio-%s", timeout), timeout, pulseaudio.update) + + return setmetatable(pulseaudio, { __index = pulseaudio.widget }) +end + +return setmetatable(pulseaudio, { __call = function(_, ...) return worker(...) end }) diff --git a/awesome/.config/awesome/lain/widgets/sysload.lua b/awesome/.config/awesome/lain/widgets/sysload.lua @@ -0,0 +1,45 @@ + +--[[ + + Licensed under GNU General Public License v2 + * (c) 2013, Luke Bonham + * (c) 2010-2012, Peter Hofmann + +--]] + +local newtimer = require("lain.helpers").newtimer + +local wibox = require("wibox") + +local io = { open = io.open } +local string = { match = string.match } + +local setmetatable = setmetatable + +-- System load +-- lain.widgets.sysload +local sysload = {} + +local function worker(args) + local args = args or {} + local timeout = args.timeout or 2 + local settings = args.settings or function() end + + sysload.widget = wibox.widget.textbox('') + + function update() + local f = io.open("/proc/loadavg") + local ret = f:read("*all") + f:close() + + load_1, load_5, load_15 = string.match(ret, "([^%s]+) ([^%s]+) ([^%s]+)") + + widget = sysload.widget + settings() + end + + newtimer("sysload", timeout, update) + return sysload.widget +end + +return setmetatable(sysload, { __call = function(_, ...) return worker(...) end }) diff --git a/awesome/.config/awesome/lain/widgets/temp.lua b/awesome/.config/awesome/lain/widgets/temp.lua @@ -0,0 +1,49 @@ + +--[[ + + Licensed under GNU General Public License v2 + * (c) 2013, Luke Bonham + +--]] + +local newtimer = require("lain.helpers").newtimer + +local wibox = require("wibox") + +local io = { open = io.open } +local tonumber = tonumber + +local setmetatable = setmetatable + +-- coretemp +-- lain.widgets.temp +local temp = {} + +local function worker(args) + local args = args or {} + local timeout = args.timeout or 2 + local tempfile = args.tempfile or "/sys/class/thermal/thermal_zone0/temp" + local settings = args.settings or function() end + + temp.widget = wibox.widget.textbox('') + + function update() + local f = io.open(tempfile) + if f ~= nil + then + coretemp_now = tonumber(f:read("*all")) / 1000 + f:close() + else + coretemp_now = "N/A" + end + + widget = temp.widget + settings() + end + + newtimer("coretemp", timeout, update) + + return temp.widget +end + +return setmetatable(temp, { __call = function(_, ...) return worker(...) end }) diff --git a/awesome/.config/awesome/lain/widgets/weather.lua b/awesome/.config/awesome/lain/widgets/weather.lua @@ -0,0 +1,144 @@ + +--[[ + + Licensed under GNU General Public License v2 + * (c) 2015, Luke Bonham + +--]] + +local newtimer = require("lain.helpers").newtimer +local read_pipe = require("lain.helpers").read_pipe + +local async = require("lain.asyncshell") +local json = require("lain.util").dkjson +local lain_icons = require("lain.helpers").icons_dir + +local naughty = require("naughty") +local wibox = require("wibox") + +local math = { floor = math.floor } +local mouse = mouse +local string = { format = string.format, + gsub = string.gsub } + +local setmetatable = setmetatable + +-- OpenWeatherMap +-- current weather and X-days forecast +-- lain.widgets.weather + +local function worker(args) + local weather = {} + local args = args or {} + local APPID = args.APPID or "3e321f9414eaedbfab34983bda77a66e" -- lain default + local timeout = args.timeout or 900 -- 15 min + local timeout_forecast = args.timeout or 86400 -- 24 hrs + local current_call = args.current_call or "curl -s 'http://api.openweathermap.org/data/2.5/weather?id=%s&units=%s&lang=%s&APPID=%s'" + local forecast_call = args.forecast_call or "curl -s 'http://api.openweathermap.org/data/2.5/forecast/daily?id=%s&units=%s&lang=%s&cnt=%s&APPID=%s'" + local city_id = args.city_id or 0 -- placeholder + local units = args.units or "metric" + local lang = args.lang or "en" + local cnt = args.cnt or 5 + local date_cmd = args.date_cmd or "date -u -d @%d +'%%a %%d'" + local icons_path = args.icons_path or lain_icons .. "openweathermap/" + local notification_preset = args.notification_preset or {} + local notification_text_fun = args.notification_text_fun or + function (wn) + local day = string.gsub(read_pipe(string.format(date_cmd, wn["dt"])), "\n", "") + local tmin = math.floor(wn["temp"]["min"]) + local tmax = math.floor(wn["temp"]["max"]) + local desc = wn["weather"][1]["description"] + + return string.format("<b>%s</b>: %s, %d - %d ", day, desc, tmin, tmax) + end + local weather_na_markup = args.weather_na_markup or " N/A " + local followmouse = args.followmouse or false + local settings = args.settings or function() end + + weather.widget = wibox.widget.textbox(weather_na_markup) + weather.icon_path = icons_path .. "na.png" + weather.icon = wibox.widget.imagebox(weather.icon_path) + + function weather.show(t_out) + weather.hide() + + if followmouse then + notification_preset.screen = mouse.screen + end + + if not weather.notification_text then + weather.forecast_update() + end + + weather.notification = naughty.notify({ + text = weather.notification_text, + icon = weather.icon_path, + timeout = t_out, + preset = notification_preset + }) + end + + function weather.hide() + if weather.notification then + naughty.destroy(weather.notification) + weather.notification = nil + end + end + + function weather.attach(obj) + obj:connect_signal("mouse::enter", function() + weather.show(0) + end) + obj:connect_signal("mouse::leave", function() + weather.hide() + end) + end + + function weather.forecast_update() + local cmd = string.format(forecast_call, city_id, units, lang, cnt, APPID) + async.request(cmd, function(f) + local pos, err + weather_now, pos, err = json.decode(f, 1, nil) + + if not err and weather_now and tonumber(weather_now["cod"]) == 200 then + weather.notification_text = '' + for i = 1, weather_now["cnt"] do + weather.notification_text = weather.notification_text .. + notification_text_fun(weather_now["list"][i]) + + if i < weather_now["cnt"] then + weather.notification_text = weather.notification_text .. "\n" + end + end + end + end) + end + + function weather.update() + local cmd = string.format(current_call, city_id, units, lang, APPID) + async.request(cmd, function(f) + local pos, err + weather_now, pos, err = json.decode(f, 1, nil) + + if not err and weather_now and tonumber(weather_now["cod"]) == 200 then + weather.icon_path = icons_path .. weather_now["weather"][1]["icon"] .. ".png" + widget = weather.widget + settings() + else + weather.icon_path = icons_path .. "na.png" + weather.widget:set_markup(weather_na_markup) + end + + weather.icon:set_image(weather.icon_path) + end) + end + + weather.attach(weather.widget) + + newtimer("weather-" .. city_id, timeout, weather.update) + newtimer("weather_forecast-" .. city_id, timeout, weather.forecast_update) + + return setmetatable(weather, { __index = weather.widget }) +end + +return setmetatable({}, { __call = function(_, ...) return worker(...) end }) diff --git a/awesome/.config/awesome/lain/wiki/Home.md b/awesome/.config/awesome/lain/wiki/Home.md @@ -0,0 +1,34 @@ +Welcome to the Lain wiki! + +Dependencies +------------------ + +Package | Requested by | Reason of choice +--- | --- | --- +alsa-utils | ALSA widgets | / +curl | widgets accessing network resources | Simpler to install and use than LuaSocket. +imagemagick | album arts in [MPD](https://github.com/copycat-killer/lain/wiki/mpd) notifications | Cairo doesn't do high quality filtering. + +Installation +--------------- + +### Arch Linux + +[AUR package](https://aur.archlinux.org/packages/lain-git/) + +### Other distributions + + git clone https://github.com/copycat-killer/lain.git ~/.config/awesome/lain + +Usage +-------- + +First, include it into your `rc.lua`: + + local lain = require("lain") + +Then check out the submodules you want: + +- [Layouts](https://github.com/copycat-killer/lain/wiki/Layouts) +- [Widgets](https://github.com/copycat-killer/lain/wiki/Widgets) +- [Utilities](https://github.com/copycat-killer/lain/wiki/Utilities) +\ No newline at end of file diff --git a/awesome/.config/awesome/lain/wiki/Layouts.md b/awesome/.config/awesome/lain/wiki/Layouts.md @@ -0,0 +1,327 @@ + + lain/layout + . + |-- termfair + |-- centerfair + |-- cascade + |-- cascadetile + |-- centerwork + |-- centerhwork + |-- centerworkd + |-- uselessfair + |-- uselesspiral + `-- uselesstile + +Just add your favourites to ``layouts`` table: + + layouts = + { + ... + lain.layout.termfair, + lain.layout.uselesstile, + ... + } + +Or set them on specific tags like this: + + awful.layout.set(lain.layout.uselessfair, tags[1][7]) + +How do layouts work? +========================= + +termfair +-------- + +I do a lot of work on terminals. The common tiling algorithms usually +maximize windows, so you'll end up with a terminal that has about 200 +columns or more. That's way too much. Have you ever read a manpage in a +terminal of this size? + +This layout restricts the size of each window. Each window will have the +same width but is variable in height. Furthermore, windows are +left-aligned. The basic workflow is as follows (the number above the +screen is the number of open windows, the number in a cell is the fixed +number of a client): + + (1) (2) (3) + +---+---+---+ +---+---+---+ +---+---+---+ + | | | | | | | | | | | | + | 1 | | | -> | 2 | 1 | | -> | 3 | 2 | 1 | -> + | | | | | | | | | | | | + +---+---+---+ +---+---+---+ +---+---+---+ + + (4) (5) (6) + +---+---+---+ +---+---+---+ +---+---+---+ + | 4 | | | | 5 | 4 | | | 6 | 5 | 4 | + +---+---+---+ -> +---+---+---+ -> +---+---+---+ + | 3 | 2 | 1 | | 3 | 2 | 1 | | 3 | 2 | 1 | + +---+---+---+ +---+---+---+ +---+---+---+ + +The first client will be located in the left column. When opening +another window, this new window will be placed in the left column while +moving the first window into the middle column. Once a row is full, +another row above it will be created. + +Default number of columns and rows are respectively taken from `nmaster` +and `ncol` values in `awful.tag`, but you can set your own. + +For example, this sets `termfair` to 3 columns and at least 1 row: + + lain.layout.termfair.nmaster = 3 + lain.layout.termfair.ncol = 1 + +centerfair +---------- + +Similar to `termfair`, but with fixed number of vertical columns. Cols are centerded until there are `nmaster` columns, then windows are stacked as slaves, with possibly `ncol` clients per column at most. + + (1) (2) (3) + +---+---+---+ +-+---+---+-+ +---+---+---+ + | | | | | | | | | | | | | + | | 1 | | -> | | 1 | 2 | | -> | 1 | 2 | 3 | -> + | | | | | | | | | | | | | + +---+---+---+ +-+---+---+-+ +---+---+---+ + + (4) (5) + +---+---+---+ +---+---+---+ + | | | 3 | | | 2 | 4 | + + 1 + 2 +---+ -> + 1 +---+---+ + | | | 4 | | | 3 | 5 | + +---+---+---+ +---+---+---+ + +Like `termfair`, default number of columns and rows are respectively taken from `nmaster` +and `ncol` values in `awful.tag`, but you can set your own. + +For example: + + lain.layout.centerfair.nmaster = 3 + lain.layout.centerfair.ncol = 1 + +cascade +------- + +Cascade all windows of a tag. + +You can control the offsets by setting these two variables: + + lain.layout.cascade.cascade_offset_x = 64 + lain.layout.cascade.cascade_offset_y = 16 + +The following reserves space for 5 windows: + + lain.layout.cascade.nmaster = 5 + +That is, no window will get resized upon the creation of a new window, +unless there's more than 5 windows. + +cascadetile +----------- + +Similar to `awful.layout.suit.tile` layout, however, clients in the slave +column are cascaded instead of tiled. + +Left column size can be set, otherwise is controlled by `mwfact` of the +tag. Additional windows will be opened in another column on the right. +New windows are placed above old windows. + +Whether the slave column is placed on top of the master window or not is +controlled by the value of `ncol`. A value of 1 means "overlapping slave column" +and anything else means "don't overlap windows". + +Usage example: + + lain.layout.cascadetile.cascade_offset_x = 2 + lain.layout.cascadetile.cascade_offset_y = 32 + lain.layout.cascadetile.extra_padding = 5 + lain.layout.cascadetile.nmaster = 5 + lain.layout.cascadetile.ncol = 1 + +`extra_padding` reduces the size of the master window if "overlapping +slave column" is activated. This allows you to see if there are any +windows in your slave column. + +Setting `cascade_offset_x` to a very small value or even 0 is reccommended to avoid wasting space. + +centerwork +---------- + +You start with one window, centered horizontally: + + +--------------------------+ + | +----------+ | + | | | | + | | | | + | | | | + | | MAIN | | + | | | | + | | | | + | | | | + | | | | + | +----------+ | + +--------------------------+ + +This is your main working window. You do most of the work right here. +Sometimes, you may want to open up additional windows. They're put in +the following four slots: + + +--------------------------+ + | +---+ +----------+ +---+ | + | | | | | | | | + | | 0 | | | | 1 | | + | | | | | | | | + | +---+ | MAIN | +---+ | + | +---+ | | +---+ | + | | | | | | | | + | | 2 | | | | 3 | | + | | | | | | | | + | +---+ +----------+ +---+ | + +--------------------------+ + +Yes, the number "four" is fixed. In total, you can only have five open +windows with this layout. Additional windows are not managed and set to +floating mode. **This is intentional**. + +You can set the order of the four auxiliary windows. This is the default +configuration: + + lain.layout.centerwork.top_left = 0 + lain.layout.centerwork.top_right = 1 + lain.layout.centerwork.bottom_left = 2 + lain.layout.centerwork.bottom_right = 3 + +This means: The bottom left slot will be occupied by the third window +(not counting the main window). Suppose you want your windows to appear +in this order: + + +--------------------------+ + | +---+ +----------+ +---+ | + | | | | | | | | + | | 3 | | | | 0 | | + | | | | | | | | + | +---+ | MAIN | +---+ | + | +---+ | | +---+ | + | | | | | | | | + | | 2 | | | | 1 | | + | | | | | | | | + | +---+ +----------+ +---+ | + +--------------------------+ + +This would require you to use these settings: + + lain.layout.centerwork.top_left = 3 + lain.layout.centerwork.top_right = 0 + lain.layout.centerwork.bottom_left = 2 + lain.layout.centerwork.bottom_right = 1 + +*Please note:* If you use Awesome's default configuration, navigation in +this layout may be very confusing. How do you get from the main window +to satellite ones depends on the order in which the windows are opened. +Thus, use of `awful.client.focus.bydirection()` is suggested. +Here's an example: + + globalkeys = awful.util.table.join( + ... + awful.key({ modkey }, "j", + function() + awful.client.focus.bydirection("down") + if client.focus then client.focus:raise() end + end), + awful.key({ modkey }, "k", + function() + awful.client.focus.bydirection("up") + if client.focus then client.focus:raise() end + end), + awful.key({ modkey }, "h", + function() + awful.client.focus.bydirection("left") + if client.focus then client.focus:raise() end + end), + awful.key({ modkey }, "l", + function() + awful.client.focus.bydirection("right") + if client.focus then client.focus:raise() end + end), + ... + ) + +centerhwork +----------- + +Same as `centerwork`, except that the main +window expands horizontally, and the 4 additional windows +are put ontop/below it, thus using the huge vertical space +much better. Useful if you have a screen turned 90°. + +centerworkd +----------- + +Same as `centerwork`, except that this version fills the slave-columns regardless of how many slave-clients are present. + +uselessfair, uselesspiral & uselesstile +--------------------------------------- +These are duplicates of the stock `fair`, `spiral` and `tile` layouts. + +However, "useless gaps" (see below) have been added. + +Useless gaps +============ + +Useless gaps are gaps between windows. They are "useless" because they +serve no special purpose despite increasing overview. I find it easier +to recognize window boundaries if windows are set apart a little bit. + +The `uselessfair` layout, for example, looks like this: + + +================+ + # # + # +---+ +---+ # + # | 1 | | | # + # +---+ | | # + # | 3 | # + # +---+ | | # + # | 2 | | | # + # +---+ +---+ # + # # + +================+ + +All of lain layouts provide useless gaps. To set the width of the gaps, +you have to add an item called `useless_gap_width` in your `theme.lua`. +If it doesn't exist, the width will default to 0. +Example: + + theme.useless_gap_width = 10 + +`uselesstile` patches +===================== + +xmonad-like +----------- + +If you want to have uselesstile behave like xmonad, with internal gaps two times wider than external ones, replace `lain/layout/uselesstile` with [this](https://gist.github.com/copycat-killer/9e56dcfbe66bfe14967c). + +inverted master +--------------- + +Want to invert master window position? Use [this](https://gist.github.com/copycat-killer/c59dc59c9f99d98218eb) version. You can set `single_gap` with `width` and `height` in your `theme.lua`, in order to define the window geometry when there's only one client, otherwise it goes maximized. An example: + + theme.single_gap = { width = 600, height = 100 } + +What about layout icons? +======================== + +They are located in ``lain/icons/layout``. + +To use them, add lines to your ``theme.lua`` like this: + + theme.lain_icons = os.getenv("HOME") .. "/.config/awesome/lain/icons/layout/default/" + theme.layout_termfair = theme.lain_icons .. "termfairw.png" + theme.layout_cascade = theme.lain_icons .. "cascadew.png" + theme.layout_cascadetile = theme.lain_icons .. "cascadetilew.png" + theme.layout_centerwork = theme.lain_icons .. "centerworkw.png" + +Credits goes to [Nicolas Estibals](https://github.com/nestibal) for creating +layout icons for default theme. + +You can use them as a template for your custom versions. + +[<- home](https://github.com/copycat-killer/lain/wiki) diff --git a/awesome/.config/awesome/lain/wiki/Utilities.md b/awesome/.config/awesome/lain/wiki/Utilities.md @@ -0,0 +1,182 @@ +separators +---------- + +Adds Cairo separators. + + local separators = lain.util.separators + +A separator function `separators.separator` takes two color arguments, defined as strings. `"alpha"` argument is allowed. [Example](https://github.com/copycat-killer/awesome-copycats/blob/master/rc.lua.powerarrow-darker#L255-256). + +You can customize height and width by setting `awful_widget_height` and `separators_width` in your `theme.lua`. Default values are 0 and 9, respectively. + +List of functions: + + +-- separators + | + |`-- arrow_right() Draw a right arrow. + |`-- arrow_left() Draw a left arrow. + +markup +------ + +Mades markup easier. + + local markup = lain.util.markup + +List of functions: + + +-- markup + | + |`-- bold() Set bold. + |`-- italic() Set italicized text. + |`-- strike() Set strikethrough text. + |`-- underline() Set underlined text. + |`-- monospace() Set monospaced text. + |`-- big() Set bigger text. + |`-- small() Set smaller text. + |`-- font() Set the font of the text. + | + |`--+ bg + | | + | |`-- color() Set background color. + | |`-- focus() Set focus background color. + | |`-- normal() Set normal background color. + | `-- urgent() Set urgent background color. + | + |`--+ fg + | | + | |`-- color() Set foreground color. + | |`-- focus() Set focus foreground color. + | |`-- normal() Set normal foreground color. + | `-- urgent() Set urgent foreground color. + | + |`-- focus() Set both foreground and background focus colors. + |`-- normal() Set both foreground and background normal colors. + `-- urgent() Set both foreground and background urgent colors. + +they all take one argument, which is the text to markup, except `font`, `fg.color` and `bg.color`: + + markup.font(font, text) + markup.fg.color(color, text) + markup.bg.color(color, text) + +`focus`, `normal` and `urgent` use `beautiful` variables. + +dynamic tagging +--------------- + +That is: + +- add a new tag; +- rename current tag; +- move current tag; +- remove current tag. + +If you delete a tag, any rule set on it shall be broken, so be careful. + +Use it with key bindings like these: + + awful.key({ modkey, "Shift" }, "n", function () lain.util.add_tag(mypromptbox) end), + awful.key({ modkey, "Shift" }, "r", function () lain.util.rename_tag(mypromptbox) end), + awful.key({ modkey, "Shift" }, "Left", function () lain.util.move_tag(1) end), -- move to next tag + awful.key({ modkey, "Shift" }, "Right", function () lain.util.move_tag(-1) end), -- move to previous tag + awful.key({ modkey, "Shift" }, "d", function () lain.util.remove_tag() end), + +**Note** that these function won't work properly with [Copland theme](https://github.com/copycat-killer/awesome-copycats) or any other configuration that already uses a dynamic tagging module like [Eminent](https://github.com/copycat-killer/awesome-copycats/tree/master/eminent). + +useless\_gaps\_resize +--------------------- + +Changes `beautiful.useless_gaps_width` on the fly. + +The function takes an integer argument, being the amount of pixel to add/remove to gaps. + +You could use it with these keybindings: + + -- On the fly useless gaps change + awful.key({ altkey, "Control" }, "+", function () lain.util.useless_gaps_resize(1) end), + awful.key({ altkey, "Control" }, "-", function () lain.util.useless_gaps_resize(-1) end), + +where `altkey=Mod1`, or you could use it like this: + + mywidget:buttons(awful.util.table.join ( + awful.button({}, 4, function() lain.util.useless_gaps_resize(-1) end), + awful.button({}, 5, function() lain.util.useless_gaps_resize(1) end) + end) + )) + +so when hovering the mouse over `mywidget`, you can adjust useless gaps size by scrolling with the mouse wheel. + +tag\_view\_nonempty +------------------- + +This function lets you jump to the next/previous non-empty tag. +It takes two arguments: + +* `direction`: `1` for next non-empty tag, `-1` for previous. +* `sc`: Screen which the taglist is in. Default is `mouse.screen` or `1`. This + argument is optional. + +You can use it with key bindings like these: + + -- Non-empty tag browsing + awful.key({ altkey }, "Left", function () lain.util.tag_view_nonempty(-1) end), + awful.key({ altkey }, "Right", function () lain.util.tag_view_nonempty(1) end), + +where `altkey = "Mod1"`. + +menu\_clients\_current\_tags +---------------------------- + +Similar to `awful.menu.clients`, but this menu only shows the clients +of currently visible tags. Use it with a key binding like this: + + awful.key({ "Mod1" }, "Tab", + function() + awful.menu.menu_keys.down = { "Down", "Alt_L", "Tab", "j" } + awful.menu.menu_keys.up = { "Up", "k" } + lain.util.menu_clients_current_tags({ width = 350 }, { keygrabber = true }) + end), + +magnify\_client +--------------- + +Set a client to floating and resize it in the same way the "magnifier" +layout does it. Place it on the "current" screen (derived from the mouse +position). This allows you to magnify any client you wish, regardless of +the currently used layout. Use it with a client keybinding like this: + + clientkeys = awful.util.table.join( + ... + awful.key({ modkey, "Control" }, "m", lain.util.magnify_client), + ... + ) + +If you want to "de-magnify" it, just retype the keybinding. + +niceborder\_{focus, unfocus} +---------------------------- + +By default, your `rc.lua` contains something like this: + + client.connect_signal("focus", function(c) c.border_color = beautiful.border_focus end) + client.connect_signal("unfocus", function(c) c.border_color = beautiful.border_normal end) + +You can change it to this: + + client.connect_signal("focus", lain.util.niceborder_focus(c)) + client.connect_signal("unfocus", lain.util.niceborder_unfocus(c)) + +Now, when a client is focused or unfocused, Awesome will look up its +nice value in `/proc/<pid>/stat`. If it's less than 0, the client is +classified as "high priority"; if it's greater than 0, the client is +classified as "low priority". If it's equal to 0, nothing special +happens. + +This requires to define additional colors in your `theme.lua`. For example: + + theme.border_focus_highprio = "#FF0000" + theme.border_normal_highprio = "#A03333" + + theme.border_focus_lowprio = "#3333FF" + theme.border_normal_lowprio = "#333366" +\ No newline at end of file diff --git a/awesome/.config/awesome/lain/wiki/Widgets.md b/awesome/.config/awesome/lain/wiki/Widgets.md @@ -0,0 +1,63 @@ +General usage +------------- + +Every widget is output by a `function`. + +For some widgets, `function` returns a `wibox.widget.textbox`, for others a table to be used for notification and update purposes. + +Every widget may take either a table or a list of variables as argument. + +If it takes a table, you have to define a function variable called `settings` in it, in order to make your customizations. + +To markup the textbox, call `widget:set_markup(...)` within `settings`. + +You can feed `set_markup` with predefined arguments, see the sections for all the details. + +`widget` is a textbox, so you can treat it like any other `wibox.widget.textbox`. + +Here follows an example: + + mycpu = lain.widgets.cpu({ + settings = function() + widget:set_markup("Cpu " .. cpu_now.usage) + end + }) + +If you want to see more complex applications, check [awesome-copycats](https://github.com/copycat-killer/awesome-copycats). + +Note +---- + +Some widgets use [asyncshell](https://github.com/copycat-killer/lain/blob/master/asyncshell.lua), which is based on `/bin/sh`. If you use multiple shells and [experience problems](https://github.com/copycat-killer/lain/issues/145), try re-setting your shell [here](https://github.com/copycat-killer/lain/blob/master/asyncshell.lua#L18). + +Index +----- + +- [abase](https://github.com/copycat-killer/lain/wiki/abase) +- [alsa](https://github.com/copycat-killer/lain/wiki/alsa) +- [alsabar](https://github.com/copycat-killer/lain/wiki/alsabar) +- [base](https://github.com/copycat-killer/lain/wiki/base) +- [bat](https://github.com/copycat-killer/lain/wiki/bat) +- [borderbox](https://github.com/copycat-killer/lain/wiki/borderbox) +- [calendar](https://github.com/copycat-killer/lain/wiki/calendar) +- [cpu](https://github.com/copycat-killer/lain/wiki/cpu) +- [fs](https://github.com/copycat-killer/lain/wiki/fs) +- [imap](https://github.com/copycat-killer/lain/wiki/imap) +- [maildir](https://github.com/copycat-killer/lain/wiki/maildir) +- [mem](https://github.com/copycat-killer/lain/wiki/mem) +- [mpd](https://github.com/copycat-killer/lain/wiki/mpd) +- [net](https://github.com/copycat-killer/lain/wiki/net) +- [pulseaudio](https://github.com/copycat-killer/lain/wiki/pulseaudio) +- [sysload](https://github.com/copycat-killer/lain/wiki/sysload) +- [temp](https://github.com/copycat-killer/lain/wiki/temp) +- [weather](https://github.com/copycat-killer/lain/wiki/weather) + +Users contributed +---------------- + +- [ccurr](https://github.com/copycat-killer/lain/wiki/ccurr) +- [kbdlayout](https://github.com/copycat-killer/lain/wiki/kbdlayout) +- [moc](https://github.com/copycat-killer/lain/wiki/moc) +- [redshift](https://github.com/copycat-killer/lain/wiki/redshift) +- [task](https://github.com/copycat-killer/lain/wiki/task) +- [tpbat](https://github.com/copycat-killer/lain/wiki/tpbat) diff --git a/awesome/.config/awesome/lain/wiki/abase.md b/awesome/.config/awesome/lain/wiki/abase.md @@ -0,0 +1,36 @@ +[<- widgets](https://github.com/copycat-killer/lain/wiki/Widgets) + +The [asynchronous](https://github.com/copycat-killer/lain/issues/128) version of `base`: + + myasyncbase = lain.widgets.abase() + +Read [here](https://github.com/copycat-killer/lain/wiki/base) for the rest. + +Use case examples +======== +*Do you wrote a widget that could be useful to others as well? Feel free to add it here.* + +cmus +---- + +```lua +cmuswidget = lain.widgets.abase({ + cmd = "cmus-remote -Q", + settings = function() + cmus_now = { + state = "N/A", + artist = "N/A", + title = "N/A", + album = "N/A" + } + + for w in string.gmatch(output, "(.-)tag") do + a, b = w:match("(%w+) (.-)\n") + cmus_now[a] = b + end + + -- customize here + widget:set_text(cmus_now.artist .. " - " .. cmus_now.title) + end +}) +``` +\ No newline at end of file diff --git a/awesome/.config/awesome/lain/wiki/alsa.md b/awesome/.config/awesome/lain/wiki/alsa.md @@ -0,0 +1,64 @@ +[<- widgets](https://github.com/copycat-killer/lain/wiki/Widgets) + +Shows and controls ALSA volume with a textbox. + + volumewidget = lain.widgets.alsa() + +### input table + +Variable | Meaning | Type | Default +--- | --- | --- | --- +`timeout` | Refresh timeout seconds | int | 5 +`cmd` | Alsa mixer command | string | "amixer" +`channel` | Mixer channel | string | "Master" +`settings` | User settings | function | empty function + +`cmd` is useful if you need to pass additional arguments to amixer. For instance, users with multiple sound cards may define `cmd = "amixer -c X"` in order to set amixer with card `X`. + +`settings` can use the following variables: + +Variable | Meaning | Type | Values +--- | --- | --- | --- +`volume_now.level` | Volume level | int | 0-100 +`volume_now.status` | Device status | string | "on", "off" + +### output table + +Variable | Meaning | Type +--- | --- | --- +`widget` | The widget | `wibox.widget.textbox` +`channel` | Alsa channel | string +`update` | Update `widget` | function + +You can control the widget with key bindings like these: + +```lua + -- ALSA volume control + awful.key({ altkey }, "Up", + function () + os.execute(string.format("amixer set %s 1%%+", volumewidget.channel)) + volumewidget.update() + end), + awful.key({ altkey }, "Down", + function () + os.execute(string.format("amixer set %s 1%%-", volumewidget.channel)) + volumewidget.update() + end), + awful.key({ altkey }, "m", + function () + os.execute(string.format("amixer set %s toggle", volumewidget.channel)) + volumewidget.update() + end), + awful.key({ altkey, "Control" }, "m", + function () + os.execute(string.format("amixer set %s 100%%", volumewidget.channel)) + volumewidget.update() + end), +``` + +where `altkey = "Mod1"`. + +Toggle mute issue +----------------- + +Problems unmuting PCM? Check [here](https://github.com/copycat-killer/awesome-copycats/issues/95). +\ No newline at end of file diff --git a/awesome/.config/awesome/lain/wiki/alsabar.md b/awesome/.config/awesome/lain/wiki/alsabar.md @@ -0,0 +1,100 @@ +[<- widgets](https://github.com/copycat-killer/lain/wiki/Widgets) + +Shows and controls alsa volume with a progressbar; provides tooltips, notifications, and color changes at mute/unmute switch. + + volume = lain.widgets.alsabar() + +* Left click: Launch `alsamixer` in your `terminal`. +* Right click: Mute/unmute. +* Scroll wheel: Increase/decrase volume. + +The function takes a table as optional argument, which can contain: + +Variable | Meaning | Type | Default +--- | --- | --- | --- +`timeout` | Refresh timeout seconds | int | 5 +`settings` | User settings | function | empty function +`width` | Bar width | int | 63 +`height` | Bar height | int | 1 +`ticks` | Set bar ticks on | boolean | false +`ticks_size` | Ticks size | int | 7 +`vertical` | Set the bar vertical | boolean | false +`command` | ALSA mixer command | string | "amixer" +`channel` | Mixer channel | string | "Master" +`step` | Step at which volume is increased/decreased | string | "2%" +`colors` | Bar colors | table | see **colors** +`notifications` | Notifications settings | table | see **notifications** +`followmouse` | Notification behaviour | bool | false + +`command` is useful if you need to pass additional arguments to amixer. For instance, users with multiple sound cards may define `command = "amixer -c X"` in order to set amixer with card `X`. + +### colors + +Variable | Meaning | Type | Default +--- | --- | --- | --- +`background` | Bar backgrund color | string | `beautiful.bg_normal` +`mute` | Bar mute color | string | "#EB8F8F" +`unmute` | Bar unmute color | string | "#A4CE8A" + +### notifications + +Variable | Meaning | Type | Default +--- | --- | --- | --- +`font` | Notifications font | string | The one defined in `beautiful.font` +`font_size` | Notifications font size | string | "11" +`color` | Notifications color | string | `beautiful.fg_normal` +`bar_size` | Wibox height | int | 18 +`screen` | Notifications screen | int | 1 + +It's **crucial** to set `notifications.bar_size` to your `mywibox[s]` height. + +`settings` can use the following variables: + +Variable | Meaning | Type | Values +--- | --- | --- | --- +`volume_now.level` | Self explained | int | 0-100 +`volume_now.status` | Device status | string | "on", "off" +### output table + +Variable | Meaning | Type +--- | --- | --- +`bar` | The widget | `awful.widget.progressbar` +`channel` | Alsa channel | string +`card` | Alsa card | string +`step` | Increase/decrease step | string +`notify` | The notification | function + +In multiple screen setups, the default behaviour is to show a visual notification pop-up window on the first screen when the widget is hovered with the mouse. By setting `followmouse` to `true` it will be shown on the same screen containing the widget. + +You can control the widget with key bindings like these: + +```lua + -- ALSA volume control + awful.key({ altkey }, "Up", + function () + os.execute(string.format("amixer set %s %s+", volume.channel, volume.step)) + volume.update() + end), + awful.key({ altkey }, "Down", + function () + os.execute(string.format("amixer set %s %s-", volume.channel, volume.step)) + volume.update() + end), + awful.key({ altkey }, "m", + function () + os.execute(string.format("amixer set %s toggle", volume.channel)) + volume.update() + end), + awful.key({ altkey, "Control" }, "m", + function () + os.execute(string.format("amixer set %s 100%%", volume.channel)) + volume.update() + end), +``` + +where `altkey = "Mod1"`. + +Toggle mute issue +----------------- + +Problems unmuting PCM? Check [here](https://github.com/copycat-killer/awesome-copycats/issues/95). +\ No newline at end of file diff --git a/awesome/.config/awesome/lain/wiki/base.md b/awesome/.config/awesome/lain/wiki/base.md @@ -0,0 +1,26 @@ +[<- widgets](https://github.com/copycat-killer/lain/wiki/Widgets) + +This is a simple template widget. + +Basically, all it does is to execute an input `cmd`, and to fill its textbox with the output. + + mybase = lain.widgets.base() + +### input table + +Variable | Meaning | Type | Default +--- | --- | --- | --- +`timeout` | Refresh timeout seconds | int | 5 +`cmd` | The command to execute | string | empty string +`settings` | User settings | function | empty function + +`settings` can use the string `output`, which is the output of `cmd`. + +### output table + +Variable | Meaning | Type +--- | --- | --- +`widget` | The widget | `wibox.widget.textbox` +`update` | Update `widget` | function + +The `update` function can be used to refresh the widget before `timeout` expires. diff --git a/awesome/.config/awesome/lain/wiki/bat.md b/awesome/.config/awesome/lain/wiki/bat.md @@ -0,0 +1,71 @@ +[<- widgets](https://github.com/copycat-killer/lain/wiki/Widgets) + +Shows in a textbox the remaining time and percentage capacity of your laptop battery, as well as +the current wattage. + +Displays a notification when battery is low or critical. + + mybattery = lain.widgets.bat() + +### input table + +Variable | Meaning | Type | Default +--- | --- | --- | --- +`timeout` | Refresh timeout seconds | int | 30 +`battery` | Identifier of the battery | string | "BAT0" +`ac` | AC | string | "AC0" +`notify` | Enable notifications | string | "on" +`settings` | User settings | function | empty function + +To disable warning notifications, set `notify` to `"off"`. + +`settings` can use the `bat_now` table, which contains the following strings: + +- `status` ("Not present", "Charging", "Discharging"); +- `ac_status` (0 or 1, meaning absent/present); +- `perc`; +- `time`; +- `watt`. + +and can modify the following two tables, which will be the preset for the naughty notifications: +* `bat_notification_low_preset`(used if battery charge level <= 15) +* `bat_notification_critical_preset` (used if battery charge level <= 5) + +Check [here](http://awesome.naquadah.org/doc/api/modules/naughty.html#notify) for the list of variables they can contain. + +**Default definition:** +```lua +bat_notification_low_preset = { + title = "Battery low", + text = "Plug the cable!", + timeout = 15, + fg = "#202020", + bg = "#CDCDCD" +} +``` +```lua +bat_notification_critical_preset = { + title = "Battery exhausted", + text = "Shutdown imminent", + timeout = 15, + fg = "#000000", + bg = "#FFFFFF" +} +``` + +### output + +A textbox. + +### Notes +* Another common identifier for `ac` is `ACAD`. +* If your widget is always on "N/A" with default settings, then `BAT0` is not your battery file. Locate the right one in `/sys/class/power_supply/` and set `battery` properly. +For instance, with `BAT1`: + +```lua +batwidget = lain.widgets.bat({ + battery = "BAT1", + -- [...] +}) + +``` diff --git a/awesome/.config/awesome/lain/wiki/borderbox.md b/awesome/.config/awesome/lain/wiki/borderbox.md @@ -0,0 +1,49 @@ +[<- widgets](https://github.com/copycat-killer/lain/wiki/Widgets) + +Creates a thin wibox at a position relative to another wibox. + +This allows to create "borders" for your wiboxes. + + lain.widget.borderbox(relbox, s, args) + +`relbox` and `s` (an integer being screen number) are required arguments, `args` is an optional table +which can contain: + +Variable | Meaning | Type | Default +--- | --- | --- | --- +`position` | Position of the additional box | string | "above" +`color` | Color of the additional box | string | `#FFFFFF` +`size` | Size in pixels of the additional box | int | 1 + +Possible values for `.position`: `top`, `bottom`, `left` and `right`. + +### Example usage + +Think of this as a wibox: + + [======================] + +If `args.position = "above"`, then you'll get an additional wibox below +the existing one: + + ________________________ + [======================] + +It'll match position and size of the existing wibox. + +If your main wiboxes are stored in a table called `mywibox` (one wibox +for each screen) and are located at the bottom of your screen, then this +adds a borderbox on top of them: + + -- Layout section + for s = 1, screen.count() do + ... + + -- Most likely, you'll want to do this as well: + awful.screen.padding(screen[s], "bottom") + + -- Create the box and place it above the existing box. + lain.widgets.borderbox(mywibox[s], s ) + + ... + end +\ No newline at end of file diff --git a/awesome/.config/awesome/lain/wiki/calendar.md b/awesome/.config/awesome/lain/wiki/calendar.md @@ -0,0 +1,46 @@ +[<- widgets](https://github.com/copycat-killer/lain/wiki/Widgets) + +Attaches a calendar notification to a widget. + + lain.widgets.calendar:attach(widget, args) + +- Left click: switch to previous month. +- Right click: switch to next month. + +`args` is an optional table which can contain: + +Variable | Meaning | Type | Default +--- | --- | --- | --- +`cal` | custom call for `cal` \* | string | "/usr/bin/cal" +`icons` | Path to calendar icons | string | [lain/icons/cal/white](https://github.com/copycat-killer/lain/tree/master/icons/cal/white) +`font` | Calendar font | string | `beautiful.font` +`font_size` | Calendar font size | int | 12 +`fg` | Calendar foreground color | string | `beautiful.fg_normal` +`bg` | Calendar background color | string | `beautiful.bg_normal` +`position` | Calendar position | string | "top_right" +`scr_pos` | Notification screen | int | 1 +`followmouse` | Notification behaviour | boolean | false + +\* `cal` program options may vary depending on the operating system: you may need to set this variable properly (`/usr/bin/cal -h` [for instance](https://github.com/copycat-killer/lain/pull/34)) in order to display the current day highlighting. + +`position` possible values are defined [here](http://awesome.naquadah.org/doc/api/modules/naughty.html#notify). + +Notification will show an icon displaying current day, and formatted output +from ``cal`` with current day highlighted. + +You can call the notification with a key binding like this: + + awful.key({ altkey }, "c", function () lain.widgets.calendar:show(7) end), + +where ``altkey = "Mod1"`` and ``show`` argument is an optional integer, meaning timeout seconds. + +You can also call it defining a notification screen with a third argument like this: + + awful.key({ altkey }, "c", function () lain.widgets.calendar:show(7, 0, my_scr_number) end), + +In multiple screen setups, the default behaviour is to show a visual notification pop-up window on the first screen when the widget is hovered with the mouse. By setting `followmouse` to `true` it will be shown on the same screen containing the widget. + +### Note + +* Naughty notification requires `font` to be **monospaced**, in order to correctly display the output. +* If you have UTF-8 rendering issues in the popup, it's probably because `cal` always colors the output. Try setting `cal = "/usr/bin/cal --color=never"` diff --git a/awesome/.config/awesome/lain/wiki/ccurr.md b/awesome/.config/awesome/lain/wiki/ccurr.md @@ -0,0 +1,23 @@ +[<- widgets](https://github.com/copycat-killer/lain/wiki/Widgets) + +Shows in a textbox the current prices of Bitcoin to USD and Dogecoin to USD using Coinbase and Cryptsy's APIs. + + ccurrwidget = lain.widgets.contrib.ccurr() + +### input table + +Variable | Meaning | Type | Default +--- | --- | --- | --- +`timeout` | Refresh timeout seconds | int | 600 +`btc_url` | URL to Json Bitcoin data | string | Coinbase API +`doge_url` | URL to Json Dogecoin data | string | Cryptsy API +`settings` | User settings | function | empty function + +`settings` can use the `price_now` table, which contains the following strings: + +- `btc`; +- `doge`. + +### output + +A textbox. +\ No newline at end of file diff --git a/awesome/.config/awesome/lain/wiki/cpu.md b/awesome/.config/awesome/lain/wiki/cpu.md @@ -0,0 +1,21 @@ +[<- widgets](https://github.com/copycat-killer/lain/wiki/Widgets) + +Shows in a textbox the current CPU usage, both in general and per core. + + mycpuusage = lain.widgets.cpu() + +### input table + +Variable | Meaning | Type | Default +--- | --- | --- | --- +`timeout` | Refresh timeout seconds | int | 2 +`settings` | User settings | function | empty function + +`settings` can use these strings: + +* `cpu_now.usage`, the general use percentage; +* `cpu_now[i].usage`, the i-th core use percentage, with `i` starting from 1. + +### output + +A textbox. diff --git a/awesome/.config/awesome/lain/wiki/fs.md b/awesome/.config/awesome/lain/wiki/fs.md @@ -0,0 +1,52 @@ +[<- widgets](https://github.com/copycat-killer/lain/wiki/Widgets) + +Shows disk space usage for a set partition. + +Displays a notification when the partition is full or has low space. + + mypartition = lain.widgets.fs() + +### input table + +Variable | Meaning | Type | Default +--- | --- | --- | --- +`timeout` | Refresh timeout seconds -| int | 600 +`partition` | Partition to monitor | string | "/" +`notification_preset` | Notification preset | table | {fg = beautiful.fg_normal} +`followmouse` | Display the notification on mouse screen | boolean | false +`settings` | User settings | function | empty function + +`settings` can use the following `partition` related float values: `fs_now.used`, `fs_now.available`, `fs_now.size_mb`, `fs_now.size_gb`. + +Within `settings`, you can obtain other partition values from internal `fs_info` table. For each partition, there are four index: + +* `fs_info[other_partition .. " used_p"]` +* `fs_info[other_partition .. " avail_p"]` +* `fs_info[other_partition .. " size_mb"]` +* `fs_info[other_partition .. " size_gb"]` + +just like the variables of `fs_now`. See [here](https://github.com/copycat-killer/lain/issues/103) for an usage example. + +Also, `settings` can modify `fs_notification_preset` table. This table will be the preset for the naughty notifications. Check [here](http://awesome.naquadah.org/doc/api/modules/naughty.html#notify) for the list of variables it can contain. Default definition: + + fs_notification_preset = { fg = beautiful.fg_normal } + +In multiple screen setups, the default behaviour is to show a visual notification pop-up window on the first screen when the widget is hovered with the mouse. By setting `followmouse` to `true` it will be shown on the same screen containing the widget. + +### output table + +Variable | Meaning | Type +--- | --- | --- +`widget` | The widget | `wibox.widget.textbox` +`show` | The notification | function + +You can display the notification with a key binding like this: + + awful.key({ altkey }, "h", function () mypartition.show(seconds, scr) end), + +where ``altkey = "Mod1"`` and ``show`` arguments, both optional, are: + +* `seconds`, notification time in seconds; +* `screen`, screen in which display the notification. + +**Note that** naughty notification requires `beautiful.font` or `fs_notification_preset.font` to be monospaced, in order to correctly display the output. +\ No newline at end of file diff --git a/awesome/.config/awesome/lain/wiki/imap.md b/awesome/.config/awesome/lain/wiki/imap.md @@ -0,0 +1,73 @@ +[<- widgets](https://github.com/copycat-killer/lain/wiki/Widgets) + +Shows mail count in a textbox fetching over IMAP. + + myimapcheck = lain.widgets.imap(args) + +New mails are notified like this: + + +--------------------------------------------+ + | +---+ | + | |\ /| donald@disney.org has 3 new messages | + | +---+ | + +--------------------------------------------+ + +The function takes a table as argument. Required table parameters are: + +Variable | Meaning | Type +--- | --- | --- +`server` | Mail server | string +`mail` | User mail | string +`password` | User password | string + +while the optional are: + +Variable | Meaning | Type | Default +--- | --- | --- | --- +`port` | IMAP port | int | 993 +`timeout` | Refresh timeout seconds | int | 60 +`is_plain` | Define whether `password` is a plain password (true) or a function that retrieves it (false) | boolean | false +`followmouse` | Notification behaviour | boolean | false +`settings` | User settings | function | empty function + +Let's focus better on `is_plain`. + +The reason why it's false by default is to discourage the habit of storing passwords in plain. + +So you can set your password in plain like this: + + myimapcheck = lain.widgets.imap({ + is_plain = true, + password = "myplainpassword", + [...] + }) + +and you'll have the same security provided by `~/.netrc`. + +**Or** you can use a keyring, like [python keyring](https://pypi.python.org/pypi/keyring): + + myimapcheck = lain.widgets.imap({ + password = "keyring get mymail", + [...] + }) + +When `is_plain == false`, it *executes* `password` before using it, so you can also use whatever password fetching solution you want. + +`settings` can use the value `mailcount`, an integer greater or equal to zero, and can modify `mail_notification_preset` table, which will be the preset for the naughty notifications. Check [here](http://awesome.naquadah.org/doc/api/modules/naughty.html#notify) for the list of variables it can contain. + +Default definition: + + mail_notification _preset = { + icon = lain/icons/mail.png, + position = "top_left" + } + +Note that `mailcount` is 0 either if there are no new mails or credentials are invalid, so make sure you get the right settings. + +In multiple screen setups, the default behaviour is to show a visual notification pop-up window on the first screen. By setting `followmouse` to `true` it will be shown on the current mouse screen. + +***This widget is asynchronous***, so you can have multiple instances at the same time. + +### output + +A textbox. +\ No newline at end of file diff --git a/awesome/.config/awesome/lain/wiki/kbdlayout.md b/awesome/.config/awesome/lain/wiki/kbdlayout.md @@ -0,0 +1,70 @@ +[<- widgets](https://github.com/copycat-killer/lain/wiki/Widgets) + +Shows and controls keyboard layouts and variants using `setxkbmap`. + + mykbdlayout = lain.widgets.contrib.kbdlayout() + +### input table + +Variable | Meaning | Type | Default +--- | --- | --- | --- +`layouts` | Keyboard layouts and variants to switch between | table | **none** +`add_us_secondary` | Whether to add `us` as a secondary layout | boolean | true +`timeout` | Refresh timeout (in seconds) | int | 10 +`settings` | User settings | function | empty function + +- `layouts` + + A table (array) which contains tables with keys indicating layout and (optionally) variant. This argument is **mandatory**. + +- `add_us_secondary` + + A boolean controlling whether to add `us` as a secondary layout. This is needed in order for keyboard shortcuts to work in certain applications, i.e. Firefox, while using a non-US keyboard layout. + +- `timeout` + + An integer which determines the interval at which the widget will be updated, in case the keyboard layout was changed by other means. + +- `settings` + + A "callback" function in which the user is expected to set the text widget up. The widget itself is available as the global variable `widget`, while layout information is available as `kbdlayout_now`. `kbdlayout_now` contains two keys, `layout` containing the primary layout, and `variant`, containing the variant. If there is no variant, `variant` is `nil`. + +## output table + +Variable | Meaning | Type +--- | --- | --- +`widget` | The widget (textbox) | `awful.widget.textbox` +`update` | Function to update the widget and call `settings` | function +`set` | Function taking an index as an argument to manually set the layout given by that index | function +`next` | Change to the next layout | function +`prev` | Change to the prev layout | function + +## usage + +The textbox can be added to the layout via standard means: + + right_layout:add(mykbdlayout) + +By default, left-clicking the textbox calls `next`, and right-clicking calls `prev`. You can set up additional key- or mouse-bindings. See the example below. + +## example + + -- Switch between US Dvorak and DE layouts. + mykbdlayout = lain.widgets.contrib.kbdlayout({ + layouts = {{ layout="us", variant="dvorak" }, + { layout="de" }}, + settings = function () + if kbdlayout_now.variant then + widget:set_text(" " .. kbdlayout_now.layout .. "/" .. kbdlayout_now.variant .. " ") + else + widget:set_text(" " .. kbdlayout_now.layout .. " ") + end + end + }) + + -- Add to the layout. + right_layout:add(mykbdlayout) + + -- Add this key binding to your global keys to + -- add traditional Alt+Shift switching. + awful.key({ "Mod1" }, "Shift_L", function () mykbdlayout.next() end) diff --git a/awesome/.config/awesome/lain/wiki/maildir.md b/awesome/.config/awesome/lain/wiki/maildir.md @@ -0,0 +1,49 @@ +[<- widgets](https://github.com/copycat-killer/lain/wiki/Widgets) + +Shows maildirs status in a textbox. + +Maildirs are structured as follows: + + ~/Mail + . + |-- arch + | |-- cur + | |-- new + | `-- tmp + |-- gmail + | |-- cur + | |-- new + | `-- tmp + . + . + . + +therefore the widget checks whether there are files in the `new` directories. +If there's new mails, the textbox will say something like "mail: bugs(3), system(1)", otherwise it says +"no mail". + + mymaildir = lain.widgets.maildir(args) + +### input table + +Variable | Meaning | Type | Default +--- | --- | --- | --- +`timeout` | Refresh timeout seconds | int | 60 +`mailpath` | Path to your maildir | string | "~/Mail" +`ignore_boxes` | Boxes to ignore | table of strings | empty table +`external_mail_cmd` | External mail update command | string | empty string +`settings` | User settings | function | empty function + +`settings` can use the string `newmail`, which format will be something like defined above, or "no mail". +`external_mail_cmd` can be used to run a mail update command, for instance: + +```lua +mailwidget = lain.widgets.maildir({ + external_mail_cmd = "mbsync -q account1 account2 account3", + -- [...] +}) +``` + +### output + +A textbox. +\ No newline at end of file diff --git a/awesome/.config/awesome/lain/wiki/mem.md b/awesome/.config/awesome/lain/wiki/mem.md @@ -0,0 +1,18 @@ +[<- widgets](https://github.com/copycat-killer/lain/wiki/Widgets) + +Shows memory status (in MiB) in a textbox. + + mymem = lain.widgets.mem() + +### input table + +Variable | Meaning | Type | Default +--- | --- | --- | --- +`timeout` | Refresh timeout seconds | int | 2 +`settings` | User settings | function | empty function + +`settings` can use the strings `mem_now.used` (memory used MB) and `mem_now.swapused` (swap used MB). + +### output + +A textbox. diff --git a/awesome/.config/awesome/lain/wiki/moc.md b/awesome/.config/awesome/lain/wiki/moc.md @@ -0,0 +1,88 @@ +[<- widgets](https://github.com/copycat-killer/lain/wiki/Widgets) + +A widget for showing the current song track's information from MOC (Music On Console). Also provides next track notifications using naughty + + mocwidget = lain.widgets.contrib.moc() + +Now playing songs are notified like this: + + +--------------------------------------------------------+ + | +-------+ | + | |/^\_/^\| Now playing | + | |\ O O /| Cannibal Corpse (Hammer Smashed Face) - 1993 | + | | '.o.' | Hammer Smashed Face (Radio Disney Version) | + | +-------+ | + +--------------------------------------------------------+ + +You need a file like this + + (Front|front|Cover|cover|Art|art|Folder|folder)\.(jpg|jpeg|png|gif) + +in the album folder in order to show album art too. + +### input table + +Variable | Meaning | Type | Default +--- | --- | --- | --- +`timeout` | Refresh timeout seconds | int | 1 +`music_dir` | Music directory | string | "~/Music" +`cover_size` | Album art notification size | int | 100 +`default_art` | Default art | string | "" +`followmouse` | Notification behaviour | boolean | false +`settings` | User settings | function | empty function + +Pay attention to case sensitivity when defining `music_dir`. + +`settings` can use `moc_now` table, which contains the following string values: + +- state (possible values: "PLAY", "PAUSE", "STOP") +- file +- artist +- title +- album +- elapsed (Time elapsed for the current track) +- total (The current track's total time) + +and can modify `moc_notification_preset` table, which will be the preset for the naughty notifications. Check [here](http://awesome.naquadah.org/doc/api/modules/naughty.html#notify) for the list of variables it can contain. Default definition: + + moc_notification_preset = { + title = "Now playing", + timeout = 6, + text = string.format("%s (%s) - %s\n%s", moc_now.artist, + moc_now.album, moc_now.elapsed, moc_now.title) + } + +In multiple screen setups, the default behaviour is to show a visual notification pop-up window on the first screen. By setting `followmouse` to `true` it will be shown on the same screen containing the widget. + +### output table + +Variable | Meaning | Type +--- | --- | --- +`widget` | The textbox | `wibox.widget.textbox` +`update` | The notification | function + +You can control the widget with key bindings like these: + + -- MOC control + awful.key({ altkey, "Control" }, "Up", + function () + awful.util.spawn_with_shell("mocp -G") + mocwidget.update() + end), + awful.key({ altkey, "Control" }, "Down", + function () + awful.util.spawn_with_shell("mocp -s") + mocwidget.update() + end), + awful.key({ altkey, "Control" }, "Left", + function () + awful.util.spawn_with_shell("mocp -r") + mocwidget.update() + end), + awful.key({ altkey, "Control" }, "Right", + function () + awful.util.spawn_with_shell("mocp -f") + mocwidget.update() + end), + +where `altkey = "Mod1"`. +\ No newline at end of file diff --git a/awesome/.config/awesome/lain/wiki/mpd.md b/awesome/.config/awesome/lain/wiki/mpd.md @@ -0,0 +1,98 @@ +[<- widgets](https://github.com/copycat-killer/lain/wiki/Widgets) + +Shows MPD status in a textbox. + + mpdwidget = lain.widgets.mpd() + +Now playing songs are notified like this: + + +--------------------------------------------------------+ + | +-------+ | + | |/^\_/^\| Now playing | + | |\ O O /| Cannibal Corpse (Hammer Smashed Face) - 1993 | + | | '.o.' | Hammer Smashed Face (Radio Disney Version) | + | +-------+ | + +--------------------------------------------------------+ + +You need a file like this + + (Front|front|Cover|cover|Art|art|Folder|folder)\.(jpg|jpeg|png|gif) + +in the album folder in order to show album art too. + +**Note:** if MPD is turned off or not set correctly, the widget will constantly display "N/A N/A". + +### input table + +Variable | Meaning | Type | Default +--- | --- | --- | --- +`timeout` | Refresh timeout seconds | int | 2 +`password` | MPD password | string | "" +`host` | MPD server | string | "127.0.0.1" +`port` | MPD port | string | "6600" +`music_dir` | Music directory | string | "~/Music" +`cover_size` | Album art notification size | int | 100 +`default_art` | Default art | string | "" +`followmouse` | Notification behaviour | boolean | false +`echo_cmd` | custom call for `echo`* | string | "echo" +`settings` | User settings | function | empty function + +\* `echo` implementation is shell dependent, you may need to set this variable properly (`echo -e` [for instance](https://github.com/copycat-killer/lain/issues/112)) in order for the widget to fetch the data correctly. + +Pay attention to case sensitivity when defining `music_dir`. + +`settings` can use `mpd_now` table, which contains the following string values: + +- state (possible values: "play", "pause", "stop") +- file +- artist +- title +- [name](https://github.com/copycat-killer/lain/pull/142) +- album +- date +- [time](https://github.com/copycat-killer/lain/pull/90) +- [elapsed](https://github.com/copycat-killer/lain/pull/90) (seconds) + +and can modify `mpd_notification_preset` table, which will be the preset for the naughty notifications. Check [here](http://awesome.naquadah.org/doc/api/modules/naughty.html#notify) for the list of variables it can contain. Default definition: + + mpd_notification_preset = { + title = "Now playing", + timeout = 6, + text = string.format("%s (%s) - %s\n%s", mpd_now.artist, + mpd_now.album, mpd_now.date, mpd_now.title) + } + +In multiple screen setups, the default behaviour is to show a visual notification pop-up window on the first screen. By setting `followmouse` to `true` it will be shown on the current mouse screen. + +### output table + +Variable | Meaning | Type +--- | --- | --- +`widget` | The textbox | `wibox.widget.textbox` +`update` | The notification | function + +You can control the widget with key bindings like these: + + -- MPD control + awful.key({ altkey, "Control" }, "Up", + function () + awful.util.spawn_with_shell("mpc toggle || ncmpcpp toggle || ncmpc toggle || pms toggle") + mpdwidget.update() + end), + awful.key({ altkey, "Control" }, "Down", + function () + awful.util.spawn_with_shell("mpc stop || ncmpcpp stop || ncmpc stop || pms stop") + mpdwidget.update() + end), + awful.key({ altkey, "Control" }, "Left", + function () + awful.util.spawn_with_shell("mpc prev || ncmpcpp prev || ncmpc prev || pms prev") + mpdwidget.update() + end), + awful.key({ altkey, "Control" }, "Right", + function () + awful.util.spawn_with_shell("mpc next || ncmpcpp next || ncmpc next || pms next") + mpdwidget.update() + end), + +where `altkey = "Mod1"`. diff --git a/awesome/.config/awesome/lain/wiki/net.md b/awesome/.config/awesome/lain/wiki/net.md @@ -0,0 +1,42 @@ +[<- widgets](https://github.com/copycat-killer/lain/wiki/Widgets) + +Monitors network interfaces and shows current traffic in a textbox. + + mynet = lain.widgets.net() + +### input table + +Variable | Meaning | Type | Default +--- | --- | --- | --- +`timeout` | Refresh timeout seconds | int | 2 +`iface` | Network device | string | autodetected +`units` | Units | int | 1024 (kilobytes) +`notify` | Display "no carrier" notifications | string | "on" +`screen` | Notifications screen | int | 1 +`settings` | User settings | function | empty function + +Possible other values for `units` are 1 (byte) or multiple of 1024: 1024^2 (mb), 1024^3 (gb), and so on. + +If `notify = "off"` is set, the widget won't display a notification when there's no carrier. + +`settings` can use the following `iface` related strings: + +- `net_now.carrier` ("0", "1"); +- `net_now.state` ("up", "down"); +- `net_now.sent` and `net_now.received` (numbers). + +### output + +A textbox. + +### Setting `iface` manually + +If the widget [spawns a "no carrier" notification and you are sure to have an active network device](https://github.com/copycat-killer/lain/issues/102), then autodetection is probably not working. In this case you can set `iface` manually. You can see which device is **UP** with the following command: + +```shell +ip link show +``` + +### Two widgets for upload/download rates from the same `iface` + +[Read here](https://github.com/copycat-killer/lain/issues/61). +\ No newline at end of file diff --git a/awesome/.config/awesome/lain/wiki/pulseaudio.md b/awesome/.config/awesome/lain/wiki/pulseaudio.md @@ -0,0 +1,79 @@ +[<- widgets](https://github.com/copycat-killer/lain/wiki/Widgets) + +Shows and controls PulseAudio volume with a textbox. + + volumewidget = lain.widgets.pulseaudio() + +### input table + +Variable | Meaning | Type | Default +--- | --- | --- | --- +`timeout` | Refresh timeout seconds | int | 5 +`cmd` | PulseAudio command | string | ```pacmd list-sinks | sed -n -e '0,/*/d' -e '/base volume/d' -e '/volume:/p' -e '/muted:/p'``` +`scallback` | PulseAudio Sink callback | function | nil +`settings` | User settings | function | empty function + +`cmd` catch infos from current used sink. You can redefine it, being sure that the ouput is something like this: + +```shell + * index: 0 + volume: 0: 100% 1: 100% + muted: no +``` + +If `sed` doesn't work, you can try with `grep`: + +```shell +pacmd list-sinks | grep -e $(pactl info | grep -e 'ink' | cut -d' ' -f3) -e 'volume: front' -e 'muted' +``` + +`scallback` is a callback function to update `cmd`, in case you switch between audio channels and therefore PulseAudio sink changes. If default `cmd` works for you, you can tell `scallback` to work in the same way: + +```lua +scallback = function() + return "pacmd list-sinks | sed -n -e '0,/*/d' -e '/base volume/d' -e '/volume:/p' -e '/muted:/p'" +end +``` + +`settings` can use the following variables: + +Variable | Meaning | Type | Values +--- | --- | --- | --- +`volume_now.left` | Front left level | int | 0-100 +`volume_now.right` | Front right level | int | 0-100 +`volume_now.muted` | Sink mute status | string | "yes", "no" + +### output table + +Variable | Meaning | Type +--- | --- | --- +`widget` | The widget | `wibox.widget.textbox` +`sink` | PulseAudio sink | int +`update` | Update `widget` | function + +You can control the widget with key bindings like these: + +```lua +-- PulseAudio volume control +awful.key({ altkey }, "Up", + function () + os.execute(string.format("pactl set-sink-volume %d +1%%", volumewidget.sink)) + volumewidget.update() + end), +awful.key({ altkey }, "Down", + function () + os.execute(string.format("pactl set-sink-volume %d -1%%", volumewidget.sink)) + volumewidget.update() + end), +awful.key({ altkey }, "m", + function () + if volumewidget.muted == "yes" then + os.execute(string.format("pactl set-sink-mute %d no", volumewidget.sink)) + else + os.execute(string.format("pactl set-sink-mute %d yes", volumewidget.sink)) + end + volumewidget.update() + end), +``` + +where `altkey = "Mod1"`. +\ No newline at end of file diff --git a/awesome/.config/awesome/lain/wiki/redshift.md b/awesome/.config/awesome/lain/wiki/redshift.md @@ -0,0 +1,141 @@ +[<- widgets](https://github.com/copycat-killer/lain/wiki/Widgets) + +### What is Redshift? # + +[**Project homepage**](http://jonls.dk/redshift/) + +>**Redshift** is an application that adjusts the computer display's color temperature based upon the Sun's apparent position in relation to the user's location on Earth. + +>The program is free software, inspired by the proprietary f.lux, and can be used to reduce eye strain as well as insomnia and delayed sleep phase syndrome. + +>The computer display's color temperature transitions evenly from night to daytime temperature to allow the user's eyes to slowly adapt. At night, the color temperature is low and is typically 3000–4000 K (default is 3500 K), preferably matching the room's lighting temperature. Typical color temperature during the daytime is 5500–6500 K (default is 5500 K). + +**Source:** [Wikipedia](https://en.wikipedia.org/wiki/Redshift_%28software%29) + + + +### Preparations + +**Redshift must be installed** on your system if you want to use this widget. + +Packages should be available for most distributions (i.e. [Ubuntu](http://packages.ubuntu.com/search?keywords=redshift&searchon=names&suite=all§ion=all), [Arch](https://www.archlinux.org/packages/?q=redshift) or [Debian](https://packages.debian.org/jessie/redshift)). +Source code and build instructions can be found on Github [here](https://github.com/jonls/redshift). + +You also need a valid config file. Please see the [project homepage](http://jonls.dk/redshift/) for details. + +**An example redshift.conf file:** + + ; ~/.config/redshift.conf + ; Global settings for redshift + [redshift] + ; Set the day and night screen temperatures + temp-day=5700 + temp-night=3500 + + ; Enable/Disable a smooth transition between day and night + ; 0 will cause a direct change from day to night screen temperature. + ; 1 will gradually increase or decrease the screen temperature + transition=1 + + ; Set the screen brightness. Default is 1.0 + ;brightness=0.9 + ; It is also possible to use different settings for day and night since version 1.8. + ;brightness-day=0.7 + ;brightness-night=0.4 + ; Set the screen gamma (for all colors, or each color channel individually) + gamma=0.8 + ;gamma=0.8:0.7:0.8 + + ; Set the location-provider: 'geoclue', 'gnome-clock', 'manual' + ; type 'redshift -l list' to see possible values + ; The location provider settings are in a different section. + location-provider=manual + + ; Set the adjustment-method: 'randr', 'vidmode' + ; type 'redshift -m list' to see all possible values + ; 'randr' is the preferred method, 'vidmode' is an older API + ; but works in some cases when 'randr' does not. + ; The adjustment method settings are in a different section. + adjustment-method=randr + + ; Configuration of the location-provider: + ; type 'redshift -l PROVIDER:help' to see the settings + ; ex: 'redshift -l manual:help' + [manual] + lat=32.0 + lon=-40.0 + + ; Configuration of the adjustment-method + ; type 'redshift -m METHOD:help' to see the settings + ; ex: 'redshift -m randr:help' + ; In this example, vidmode is configured to adjust screen 1. + ; Note that the numbering starts from 0, so this is actually the second screen. + [vidmode] + screen=0 + +You have to match the location settings to your personal situation: +Adjust the `lat` and `lon` variables - You can use google maps or wikipedia to get the approximate coordinates. + +You might also want to modify the color temperatures to fit your preferences. + +### Using the widget + +This widget provides several functions that can be used to control Redshift: + +* `redshift:toggle()`: Toggles Redshift's color adjustments on or off. +* `redshift:on()`: Activates Redshift. +* `redshift:off()`: This will remove the current color adjustment. (It will not kill the redshift process, however!) +* `redshift:attach(widget, update_function)`: Attach to a (text or icon) widget. + Click on the widget to toggle redshift on or off. This will also auto-launch Redshift along with Awesome WM. + `update_function` can be used to modify the icon/text and will be triggered each time redshift changes its status. (See the examples below.) +* `redshift:is_active()`: Returns *true* if redshift is currently modifying the screen color. + +#### Usage examples + +##### imagebox status widget (with icon) +```lua +-- Redshift widget +icons_dir = require("lain.helpers").icons_dir +local rs_on = icons_dir .. "/redshift/redshift_on.png" +local rs_off = icons_dir .. "/redshift/redshift_off.png" + +myredshift = wibox.widget.imagebox(rs_on) +redshift:attach( + myredshift, + function () + if redshift:is_active() then + myredshift:set_image(rs_on) + else + myredshift:set_image(rs_off) + end + end +) +``` +Then add the `myredshift` widget to your panel. + +##### textbox status widget + +```lua +-- Redshift widget +myredshift = wibox.widget.textbox("RS") +redshift:attach( + myredshift, + function () + if redshift:is_active() then + myredshift:set_text("RS on") + else + myredshift:set_text("RS off") + end + end +) +``` +Then add the `myredshift` widget to your panel. + +##### keybinding + +Add this to the keybindings in your rc.lua: +```lua +-- Toggle redshift with Mod+Shift+t + awful.key({ modkey, "Shift" }, "t", function () redshift:toggle() end) , +``` + diff --git a/awesome/.config/awesome/lain/wiki/sysload.md b/awesome/.config/awesome/lain/wiki/sysload.md @@ -0,0 +1,18 @@ +[<- widgets](https://github.com/copycat-killer/lain/wiki/Widgets) + +Shows the current system load. + + mysysload = lain.widgets.sysload() + +### input table + +Variable | Meaning | Type | Default +--- | --- | --- | --- +`timeout` | Refresh timeout seconds | int | 2 +`settings` | User settings | function | empty function + +`settings` can use strings `load_1`, `load_5` and `load_15`, which are loadavg over 1, 5, and 15 minutes. + +### output + +A textbox. diff --git a/awesome/.config/awesome/lain/wiki/task.md b/awesome/.config/awesome/lain/wiki/task.md @@ -0,0 +1,40 @@ +[<- widgets](https://github.com/copycat-killer/lain/wiki/Widgets) + +Attaches a [taskwarrior](http://taskwarrior.org) notification to a widget, and lets to add/search tasks from the promptbox. + +```lua + lain.widgets.contrib.task:attach(widget, args) +``` + +`args` is an optional table which can contain: + +Variable | Meaning | Type | Default +--- | --- | --- | --- +`font_size` | Notifcation font size | int | 12 +`fg` | Notification popup foreground color | string | `beautiful.fg_normal` +`bg` | Notification popu background color | string | `beautiful.bg_normal` +`position` | Notification popup position | string | "top_right" +`timeout` | Notification timeout seconds | int | 7 +`scr_pos` | Notification screen | int | 1 +`followmouse` | Notification behaviour | boolean | false + +`position` possible values are defined [here](http://awesome.naquadah.org/doc/api/modules/naughty.html#notify). + +Notification will show the output of `task` command. + +In multiple screen setups, the default behaviour is to show a visual notification pop-up window on the first screen. By setting `followmouse` to `true` it will be shown on the same screen containing the widget. + +You can call the notification with a key binding like this: + +```lua +awful.key({ modkey, altkey }, "t", function () lain.widgets.contrib.task.show(scr) end), +``` + +where ``altkey = "Mod1"`` and `scr` indicates the screen which you want the notification in. + +And you can prompt to add/search a task with key bindings like these: + +```lua +awful.key({ modkey, }, "t", lain.widgets.contrib.task.prompt_add), +awful.key({ modkey, "Shift" }, "t", lain.widgets.contrib.task.prompt_search), +``` +\ No newline at end of file diff --git a/awesome/.config/awesome/lain/wiki/temp.md b/awesome/.config/awesome/lain/wiki/temp.md @@ -0,0 +1,25 @@ +[<- widgets](https://github.com/copycat-killer/lain/wiki/Widgets) + +Shows the current core temperature in a textbox. + +Reads from `/sys/class/thermal`, so value is expressed in Celsius. + + mytemp = lain.widgets.temp() + +### input table + +Variable | Meaning | Type | Default +--- | --- | --- | --- +`timeout` | Refresh timeout seconds | int | 2 +`tempfile` | Path of file which stores core temperature value | string | "/sys/class/thermal/thermal_zone0/temp" +`settings` | User settings | function | empty function + +`settings` can use the string `coretemp_now`, which means current core temperature, expressed in Celsius (linux standard). + +### output + +A textbox. + +### note + +Depending on the architecture, keep in mind that your temp files location [might change](https://github.com/copycat-killer/lain/issues/84#issuecomment-72751763). diff --git a/awesome/.config/awesome/lain/wiki/tpbat.md b/awesome/.config/awesome/lain/wiki/tpbat.md @@ -0,0 +1,9 @@ +[<- widgets](https://github.com/copycat-killer/lain/wiki/Widgets) + +A battery widget that works with Lenovo ThinkPad laptops using [tp_smapi](http://www.thinkwiki.org/wiki/Tp_smapi). + +Includes hover notification with more details. + + tpbatwidget = lain.widgets.contrib.tpbat() + +Configuration is identical to [standard battery widget's](https://github.com/copycat-killer/lain/wiki/bat). +\ No newline at end of file diff --git a/awesome/.config/awesome/lain/wiki/weather.md b/awesome/.config/awesome/lain/wiki/weather.md @@ -0,0 +1,141 @@ +[<- widgets](https://github.com/copycat-killer/lain/wiki/Widgets) + +Provides current weather status widgets and X-days forecast popup notifications. + +Uses [OpenWeatherMap](http://openweathermap.org/api) API. + +By default, it uses [current](http://openweathermap.org/current) for current weather data and [forecast16](http://openweathermap.org/forecast16) for forecasts. + +```lua +myweather = lain.widgets.weather() +``` + +## input table + +Variable | Meaning | Type | Default +--- | --- | --- | --- +`timeout` | Refresh timeout seconds for current weather status | int | 900 (15 min) +`timeout_forecast` | Refresh timeout seconds for forecast notification | int | 86400 (24 hrs) +`current_call` | Command to fetch weather status data from the API | string | see `default_current_call` +`forecast_call` | Command to fetch forecast data from the API | string | see `default_forecast_call` +`city_id` | API city code | int | not set +`units` | Temperature units system | string | "metric" +`lang` | API data localization | string | "en" +`cnt` | Forecast days interval | int | 5 +`date_cmd` | Forecast notification format style | string | "date -u -d @%d +'%%a %%d'" +`icons_path` | Icons path | string | `lain/icons/openweathermap` +`notification_preset` | Preset for notifications | table | empty table +`notification_text_fun` | Function to format forecast notifications | function | see `notification_text_fun` +`weather_na_markup` | Markup to be used when weather textbox is not available | text | " N/A " +`followmouse` | Notification behaviour | boolean | false +`settings` | User settings | function | empty function + +- ``default_current_call`` + + `"curl -s 'http://api.openweathermap.org/data/2.5/weather?id=%s&units=%s&lang=%s'"` + + You can rewrite it using any fetcher solution you like. + +- ``default_forecast_call`` + + `"curl -s 'http://api.openweathermap.org/data/2.5/forecast/daily?id=%s&units=%s&lang=%s&cnt=%s'"` + + Like above. + If you want to use [forecast5](http://openweathermap.org/forecast5), use this API call string: + `http://api.openweathermap.org/data/2.5/forecast?id=%s&units=%s&lang=%s&cnt=%s` + +- ``city_id`` + + An integer that defines the OpenWeatherMap ID code of your city. + To obtain it go to [OpenWeatherMap](http://openweathermap.org/) and query for your city in the top search bar. The link will look like this: + + http://openweathermap.org/city/2643743 + + your `city_id` is the number at the end. + +- ``units`` + + - For temperature in Fahrenheit use `units = "imperial"` + - For temperature in Celsius use `units = "metric"` (Lain default) + - For temperature in Kelvin use `units = "standard"` (OpenWeatherMap default) + +- ``lang`` + + See *Multilingual Support* section [here](http://openweathermap.org/current). + +- ``cnt`` + + Determines how many days to show in the forecast notification. Up to 16 if you use [forecast16](http://openweathermap.org/forecast16) (default), and up to 5 if you use [forecast5](http://openweathermap.org/forecast5). + +- ``date_cmd`` + + OpenWeatherMap time is in UNIX format, so this variable uses `date` to determine how each line in the forecast notification is formatted. Default looks like this: + + day #daynumber: forecast, temp_min - temp_max + + see `man date` for your customizations. + +- ``icons_path`` + + You can set your own icons path if you don't wish to use `lain/icons/openweathermap`. Just be sure that your icons are PNGs and named exactly like [OpenWeatherMap ones](http://openweathermap.org/weather-conditions). + +- ``notification_preset`` + + Notifications preset table. See [here](http://awesome.naquadah.org/doc/api/modules/naughty.html#notify) for the details. + +- ``notification_text_fun`` + ```lua + function (wn) + local day = string.gsub(read_pipe(string.format(date_cmd, wn["dt"])), "\n", "") + local tmin = math.floor(wn["temp"]["min"]) + local tmax = math.floor(wn["temp"]["max"]) + local desc = wn["weather"][1]["description"] + + return string.format("<b>%s</b>: %s, %d - %d ", day, desc, tmin, tmax) + end + ``` + See [here](https://github.com/copycat-killer/lain/issues/186#issuecomment-203400918) for a complete customization example. + +- ``followmouse`` + + In multiple screen setups, the default behaviour is to show a visual notification pop-up window on the first screen when the widget is hovered with the mouse. By setting followmouse to true it will be shown on the same screen containing the widget. + +- ``settings`` + + In your `settings` function, you can use `widget` variable to refer to the textbox, and the dictionary `weather_now` to refer to data retrieved by `current_call`. The dictionary is built with [dkjson library](http://dkolf.de/src/dkjson-lua.fsl/home), and its structure is defined [here](http://openweathermap.org/weather-data). + For instance, you can retrieve current weather status and temperature [in this way](https://github.com/copycat-killer/awesome-copycats/blob/master/rc.lua.multicolor#L139-140). + +In multiple screen setups, the default behaviour is to show a visual notification pop-up window on the first screen when the widget is hovered with the mouse. By setting `followmouse` to `true` it will be shown on the same screen containing the widget. + +## Usage +The module creates an imagebox icon and a textbox widget. Add them to you wibox like this: + + right_layout:add(myweather) + right_layout:add(myweather.icon) + +### attach +You can attach the forecast notification to any widget like this: + + myweather.attach(obj) + +Hovering over ``obj`` will display the notification. + +### update + + myweather.update() + +Force fetching of current weather status data. Useful when combined with other widgets workflow (for instance, it can be called from net widget when the internet connection is restored). + +### forecast_update + + myweather.forecast_update() + +Like above, but for the forecast notification. + +### popup shortcut + +You can also create a keybinding for the weather popup like this: + + awful.key( { "Mod1" }, "w", function () myweather.show(5) end ) + +where ``show`` argument is an integer defining timeout seconds. diff --git a/awesome/.config/awesome/rc.lua b/awesome/.config/awesome/rc.lua @@ -0,0 +1,535 @@ +--[[ + + pyratesoft awesomewm config + +--]] + +-- Standard awesome library +local gears = require("gears") +local awful = require("awful") +awful.rules = require("awful.rules") + require("awful.autofocus") + +-- Widget and layout library +local wibox = require("wibox") + +-- Theme handling library +local beautiful = require("beautiful") + +-- Notification library +local naughty = require("naughty") +local menubar = require("menubar") + +-- Dropdown terminal +local drop = require("scratchdrop") + +-- Extra layouts +local lain = require("lain") + +awful.util.spawn_with_shell("xcompmgr -cF &") + +vicious = require("vicious") + +-- {{{ Error handling +-- Check if awesome encountered an error during startup and fell back to +-- another config (This code will only ever execute for the fallback config) +if awesome.startup_errors then + naughty.notify({ preset = naughty.config.presets.critical, + title = "Oops, there were errors during startup!", + text = awesome.startup_errors }) +end + +-- Handle runtime errors after startup +do + local in_error = false + awesome.connect_signal("debug::error", function (err) + -- Make sure we don't go into an endless error loop + if in_error then return end + in_error = true + + naughty.notify({ preset = naughty.config.presets.critical, + title = "Oops, an error happened!", + text = err }) + in_error = false + end) +end +-- }}} + +-- {{{ Variable definitions +-- Themes define colours, icons, font and wallpapers. + -- My themes: pyratesoft, algersoft, otherideas + beautiful.init("/home/dudley/.config/awesome/themes/pyratesoft/theme.lua") + + -- This is used later as the default terminal and editor to run. + terminal = "urxvt" + -- terminal = "st -f Tamsyn:pixelsize=15" + editor = os.getenv("EDITOR") or "vi" + editor_cmd = terminal .. " -e " .. editor + + -- Default modkey. + -- Usually, Mod4 is the key with a logo between Control and Alt. + -- If you do not like this or do not have such a key, + -- I suggest you to remap Mod4 to another key using xmodmap or other tools. + -- However, you can use another modifier like Mod1, but it may interact with others. + modkey = "Mod4" + + -- Table of layouts to cover with awful.layout.inc, order matters. + local layouts = + { + awful.layout.suit.floating, + lain.layout.uselesstile, + awful.layout.suit.tile, + -- awful.layout.suit.magnifier + } + -- }}} + + -- {{{ Wallpaper + if beautiful.wallpaper then + for s = 1, screen.count() do + gears.wallpaper.maximized(beautiful.wallpaper, s, true) + end + end + -- }}} + + -- {{{ Tags + -- Define a tag table which hold all screen tags. + tags = {} + for s = 1, screen.count() do + -- Each screen has its own tag table. + tags[s] = awful.tag({" terminal ", " web ", " code ", " other"}, s, layouts[1]) + end + -- }}} + + -- {{{ Menu + -- Create a laucher widget and a main menu + myawesomemenu = { + { "manual", terminal .. " -e man awesome" }, + { "edit config", editor_cmd .. " " .. awesome.conffile }, + { "restart", awesome.restart }, + { "quit", awesome.quit } + } + + mymainmenu = awful.menu({ items = { { "awesome", myawesomemenu, beautiful.awesome_icon }, + { "open terminal", terminal } + } + }) + + mylauncher = awful.widget.launcher({ image = beautiful.awesome_icon, + menu = mymainmenu }) + + -- Menubar configuration + menubar.utils.terminal = terminal -- Set the terminal for applications that require it + -- menubar.set_icon_theme("/usr/share/fonts/HighContrast/index.theme") + -- }}} + + -- {{{ Wibox + -- seperator-widget + seperator = wibox.widget.textbox() + seperator:set_markup("|") + -- spacer-widget + spacer = wibox.widget.textbox() + spacer:set_markup(" ") + + -- cpuwidget + cpuwidget = wibox.widget.textbox() + vicious.register(cpuwidget, vicious.widgets.cpu, "c:$1%") + -- memwidget (every 10 seconds) + memwidget = wibox.widget.textbox() + vicious.register(memwidget, vicious.widgets.mem, "m:$1%", 10) + -- netwidget (#5eaefe = pale blue) + netwidget = wibox.widget.textbox() + vicious.register(netwidget, vicious.widgets.net, "u:${enp0s3 up_kb} d:${enp0s3 down_kb}", 3) + -- batwidget + batwidget = wibox.widget.textbox() + vicious.register(batwidget, vicious.widgets.bat, "$1$2", 32, "BAT0") + -- datewidget + datewidget = wibox.widget.textbox() + vicious.register(datewidget, vicious.widgets.date, "%a %F %R", 60) + + -- Create a textclock widget + -- mytextclock = awful.widget.textclock() + + -- Create a wibox for each screen and add it + mywibox = {} + mypromptbox = {} + mylayoutbox = {} + mytaglist = {} + mytaglist.buttons = awful.util.table.join( + awful.button({ }, 1, awful.tag.viewonly), + awful.button({ modkey }, 1, awful.client.movetotag), + awful.button({ }, 3, awful.tag.viewtoggle), + awful.button({ modkey }, 3, awful.client.toggletag), + awful.button({ }, 4, function(t) awful.tag.viewnext(awful.tag.getscreen(t)) end), + awful.button({ }, 5, function(t) awful.tag.viewprev(awful.tag.getscreen(t)) end) + ) + mytasklist = {} + mytasklist.buttons = awful.util.table.join( + awful.button({ }, 1, function (c) + if c == client.focus then + c.minimized = true + else + -- Without this, the following + -- :isvisible() makes no sense + c.minimized = false + if not c:isvisible() then + awful.tag.viewonly(c:tags()[1]) + end + -- This will also un-minimize + -- the client, if needed + client.focus = c + c:raise() + end + end), + awful.button({ }, 3, function () + if instance then + instance:hide() + instance = nil + else + instance = awful.menu.clients({ + theme = { width = 250 } + }) + end + end), + awful.button({ }, 4, function () + awful.client.focus.byidx(1) + if client.focus then client.focus:raise() end + end), + awful.button({ }, 5, function () + awful.client.focus.byidx(-1) + if client.focus then client.focus:raise() end + end)) + + for s = 1, screen.count() do + -- Create a promptbox for each screen + mypromptbox[s] = awful.widget.prompt() + -- Create an imagebox widget which will contains an icon indicating which layout we're using. + -- We need one layoutbox per screen. + mylayoutbox[s] = awful.widget.layoutbox(s) + mylayoutbox[s]:buttons(awful.util.table.join( + awful.button({ }, 1, function () awful.layout.inc(layouts, 1) end), + awful.button({ }, 3, function () awful.layout.inc(layouts, -1) end), + awful.button({ }, 4, function () awful.layout.inc(layouts, 1) end), + awful.button({ }, 5, function () awful.layout.inc(layouts, -1) end))) + -- Create a taglist widget + mytaglist[s] = awful.widget.taglist(s, awful.widget.taglist.filter.all, mytaglist.buttons) + + -- Create a tasklist widget + mytasklist[s] = awful.widget.tasklist(s, awful.widget.tasklist.filter.currenttags, mytasklist.buttons) + + -- Create the wibox + mywibox[s] = awful.wibox({ position = "top", screen = s }) + + -- Widgets that are aligned to the left + local left_layout = wibox.layout.fixed.horizontal() + -- left_layout:add(mylauncher) + left_layout:add(mytaglist[s]) + left_layout:add(seperator) + left_layout:add(mypromptbox[s]) + + -- Widgets that are aligned to the right + local right_layout = wibox.layout.fixed.horizontal() + if s == 1 then right_layout:add(wibox.widget.systray()) end + right_layout:add(spacer) + right_layout:add(cpuwidget) + right_layout:add(spacer) + right_layout:add(seperator) + right_layout:add(spacer) + right_layout:add(memwidget) + right_layout:add(spacer) + right_layout:add(seperator) + right_layout:add(spacer) + right_layout:add(netwidget) + right_layout:add(spacer) + right_layout:add(seperator) + right_layout:add(spacer) + right_layout:add(batwidget) + right_layout:add(spacer) + right_layout:add(seperator) + right_layout:add(spacer) + right_layout:add(datewidget) + right_layout:add(spacer) + -- right_layout:add(mytextclock) + -- right_layout:add(mylayoutbox[s]) + + -- Now bring it all together (with the tasklist in the middle) + local layout = wibox.layout.align.horizontal() + layout:set_left(left_layout) + layout:set_middle(mytasklist[s]) + layout:set_right(right_layout) + + mywibox[s]:set_widget(layout) + end + -- }}} + + -- {{{ Mouse bindings + root.buttons(awful.util.table.join( + awful.button({ }, 3, function () mymainmenu:toggle() end), + awful.button({ }, 4, awful.tag.viewnext), + awful.button({ }, 5, awful.tag.viewprev) + )) + -- }}} + + -- {{{ Key bindings + globalkeys = awful.util.table.join( + awful.key({ modkey, }, "Left", awful.tag.viewprev ), + awful.key({ modkey, }, "Right", awful.tag.viewnext ), + awful.key({ modkey, }, "Escape", awful.tag.history.restore), + + awful.key({ modkey, }, "j", + function () + awful.client.focus.byidx( 1) + if client.focus then client.focus:raise() end + end), + awful.key({ modkey, }, "k", + function () + awful.client.focus.byidx(-1) + if client.focus then client.focus:raise() end + end), + awful.key({ modkey, }, "w", function () mymainmenu:show() end), + + -- Layout manipulation + awful.key({ modkey, "Shift" }, "j", function () awful.client.swap.byidx( 1) end), + awful.key({ modkey, "Shift" }, "k", function () awful.client.swap.byidx( -1) end), + awful.key({ modkey, "Control" }, "j", function () awful.screen.focus_relative( 1) end), + awful.key({ modkey, "Control" }, "k", function () awful.screen.focus_relative(-1) end), + awful.key({ modkey, }, "u", awful.client.urgent.jumpto), + awful.key({ modkey, }, "Tab", + function () + awful.client.focus.history.previous() + if client.focus then + client.focus:raise() + end + end), + + -- Standard program + awful.key({ modkey, }, "Return", function () awful.util.spawn(terminal) end), + awful.key({ modkey, "Control" }, "r", awesome.restart), + awful.key({ modkey, "Shift" }, "q", awesome.quit), + + -- awful.key({ modkey, }, "l", function () awful.tag.incmwfact( 0.05) end), + -- awful.key({ modkey, }, "h", function () awful.tag.incmwfact(-0.05) end), + awful.key({ modkey, "Shift" }, "h", function () awful.tag.incnmaster( 1) end), + awful.key({ modkey, "Shift" }, "l", function () awful.tag.incnmaster(-1) end), + awful.key({ modkey, "Control" }, "h", function () awful.tag.incncol( 1) end), + awful.key({ modkey, "Control" }, "l", function () awful.tag.incncol(-1) end), + awful.key({ modkey, }, "space", function () awful.layout.inc(layouts, 1) end), + awful.key({ modkey, "Shift" }, "space", function () awful.layout.inc(layouts, -1) end), + + awful.key({ modkey, "Control" }, "n", awful.client.restore), + + -- Lock screen + awful.key({ modkey, }, "#94", function () awful.util.spawn("i3lock -u -c 000000") end), + + -- Audio + awful.key({ modkey, }, "#174", function () awful.util.spawn("mocp -P") end), -- Fn Stop (pauses) + awful.key({ modkey, }, "#172", function () awful.util.spawn("mocp -U") end), -- Fn Play (unpauses) + awful.key({ modkey, }, "#59", function () awful.util.spawn("mocp -v -5") end), -- comma (decrease vol by 5) + awful.key({ modkey, }, "#60", function () awful.util.spawn("mocp -P") end), -- perid (increase vol by 5) + + -- Brightness + awful.key({ modkey, }, "#232", function () awful.util.spawn("xrandr --output LVDS1 --brightness 0.8") end), -- brightness down + awful.key({ modkey, }, "#233", function () awful.util.spawn("xrandr --output LVDS1 --brightness 1") end), -- brightness up + + + -- Dropdown terminal + awful.key({ modkey, }, "`", function () drop(terminal) end), + -- Prompt + awful.key({ modkey }, "r", function () mypromptbox[mouse.screen]:run() end), + + awful.key({ modkey }, "x", + function () + awful.prompt.run({ prompt = "Run Lua code: " }, + mypromptbox[mouse.screen].widget, + awful.util.eval, nil, + awful.util.getdir("cache") .. "/history_eval") + end), + -- Menubar + awful.key({ modkey }, "p", function() menubar.show() end) + ) + + clientkeys = awful.util.table.join( + awful.key({ modkey, }, "f", function (c) c.fullscreen = not c.fullscreen end), + awful.key({ modkey, "Shift" }, "c", function (c) c:kill() end), + awful.key({ modkey, "Control" }, "space", awful.client.floating.toggle ), + awful.key({ modkey, "Control" }, "Return", function (c) c:swap(awful.client.getmaster()) end), + awful.key({ modkey, }, "o", awful.client.movetoscreen ), + awful.key({ modkey, }, "t", function (c) c.ontop = not c.ontop end), + awful.key({ modkey, }, "n", + function (c) + -- The client currently has the input focus, so it cannot be + -- minimized, since minimized clients can't have the focus. + c.minimized = true + end), + awful.key({ modkey, }, "m", + function (c) + c.maximized_horizontal = not c.maximized_horizontal + c.maximized_vertical = not c.maximized_vertical + end) + ) + + -- Bind all key numbers to tags. + -- Be careful: we use keycodes to make it works on any keyboard layout. + -- This should map on the top row of your keyboard, usually 1 to 9. + for i = 1, 9 do + globalkeys = awful.util.table.join(globalkeys, + -- View tag only. + awful.key({ modkey }, "#" .. i + 9, + function () + local screen = mouse.screen + local tag = awful.tag.gettags(screen)[i] + if tag then + awful.tag.viewonly(tag) + end + end), + -- Toggle tag. + awful.key({ modkey, "Control" }, "#" .. i + 9, + function () + local screen = mouse.screen + local tag = awful.tag.gettags(screen)[i] + if tag then + awful.tag.viewtoggle(tag) + end + end), + -- Move client to tag. + awful.key({ modkey, "Shift" }, "#" .. i + 9, + function () + if client.focus then + local tag = awful.tag.gettags(client.focus.screen)[i] + if tag then + awful.client.movetotag(tag) + end + end + end), + -- Toggle tag. + awful.key({ modkey, "Control", "Shift" }, "#" .. i + 9, + function () + if client.focus then + local tag = awful.tag.gettags(client.focus.screen)[i] + if tag then + awful.client.toggletag(tag) + end + end + end)) + end + + clientbuttons = awful.util.table.join( + awful.button({ }, 1, function (c) client.focus = c; c:raise() end), + awful.button({ modkey }, 1, awful.mouse.client.move), + awful.button({ modkey }, 3, awful.mouse.client.resize)) + + -- Set keys + root.keys(globalkeys) + -- }}} + + -- {{{ Rules + -- Rules to apply to new clients (through the "manage" signal). + awful.rules.rules = { + -- All clients will match this rule. + { rule = { }, + properties = { border_width = beautiful.border_width, + border_color = beautiful.border_normal, + focus = awful.client.focus.filter, + raise = true, + keys = clientkeys, + buttons = clientbuttons } }, + -- + -- use `xprop` to find WM_CLASS + -- + { rule = { class = "MPlayer" }, + properties = { floating = true } }, + { rule = { class = "mpv" }, + properties = { floating = true } }, + { rule = { class = "pinentry" }, + properties = { floating = true } }, + { rule = { class = "gimp" }, + properties = { floating = true } }, + { rule = { class = "sxiv" }, + properties = { floating = true } }, + { rule = { class = "Sxiv" }, + properties = { floating = true } }, + { rule = { class = "gifview" }, + properties = { floating = true } }, + { rule = { class = "Gifview" }, + properties = { floating = true } }, + -- Set Chrome to always map on tags number 2 of screen 1. + -- { rule = { class = "Chrome" }, + -- properties = { tag = tags[1][2] } }, + -- + -- Set Firefox to always map on tags number 2 of screen 1. + -- { rule = { class = "Firefox" }, + -- properties = { tag = tags[1][2] } }, + } + -- }}} + + -- {{{ Signals + -- Signal function to execute when a new client appears. + client.connect_signal("manage", function (c, startup) + -- Enable sloppy focus + c:connect_signal("mouse::exit", function(c) + if awful.layout.get(c.screen) ~= awful.layout.suit.magnifier + and awful.client.focus.filter(c) then + client.focus = c + end + end) + + if not startup then + -- Set the windows at the slave, + -- i.e. put it at the end of others instead of setting it master. + awful.client.setslave(c) + + -- Put windows in a smart way, only if they does not set an initial position. + if not c.size_hints.user_position and not c.size_hints.program_position then + awful.placement.no_overlap(c) + awful.placement.no_offscreen(c) + end + end + + local titlebars_enabled = false + if titlebars_enabled and (c.type == "normal" or c.type == "dialog") then + -- buttons for the titlebar + local buttons = awful.util.table.join( + awful.button({ }, 1, function() + client.focus = c + c:raise() + awful.mouse.client.move(c) + end), + awful.button({ }, 3, function() + client.focus = c + c:raise() + awful.mouse.client.resize(c) + end) + ) + + -- Widgets that are aligned to the left + local left_layout = wibox.layout.fixed.horizontal() + -- left_layout:add(awful.titlebar.widget.iconwidget(c)) + left_layout:buttons(buttons) + + -- Widgets that are aligned to the right + local right_layout = wibox.layout.fixed.horizontal() + -- right_layout:add(awful.titlebar.widget.floatingbutton(c)) + right_layout:add(awful.titlebar.widget.maximizedbutton(c)) + -- right_layout:add(awful.titlebar.widget.stickybutton(c)) + -- right_layout:add(awful.titlebar.widget.ontopbutton(c)) + right_layout:add(awful.titlebar.widget.closebutton(c)) + + -- The title goes in the middle + local middle_layout = wibox.layout.flex.horizontal() + local title = awful.titlebar.widget.titlewidget(c) + title:set_align("left") + middle_layout:add(title) + middle_layout:buttons(buttons) + + -- Now bring it all together + local layout = wibox.layout.align.horizontal() + layout:set_left(left_layout) + layout:set_right(right_layout) + layout:set_middle(middle_layout) + + awful.titlebar(c):set_widget(layout) + end +end) + +client.connect_signal("focus", function(c) c.border_color = beautiful.border_focus end) +client.connect_signal("unfocus", function(c) c.border_color = beautiful.border_normal end) +-- }}} diff --git a/awesome/.config/awesome/scratchdrop/init.lua b/awesome/.config/awesome/scratchdrop/init.lua @@ -0,0 +1,133 @@ +------------------------------------------------------------------- +-- Drop-down applications manager for the awesome window manager +------------------------------------------------------------------- +-- Coded by: * Lucas de Vries <lucas@glacicle.com> +-- Hacked by: * Adrian C. (anrxc) <anrxc@sysphere.org> +-- Licensed under the WTFPL version 2 +-- * http://sam.zoy.org/wtfpl/COPYING +------------------------------------------------------------------- +-- To use this module add: +-- local scratchdrop = require("scratchdrop") +-- to the top of your rc.lua, and call it from a keybinding: +-- scratchdrop(prog, vert, horiz, width, height, sticky, screen) +-- +-- Parameters: +-- prog - Program to run; "urxvt", "gmrun", "thunderbird" +-- vert - Vertical; "bottom", "center" or "top" (default) +-- horiz - Horizontal; "left", "right" or "center" (default) +-- width - Width in absolute pixels, or width percentage +-- when <= 1 (1 (100% of the screen) by default) +-- height - Height in absolute pixels, or height percentage +-- when <= 1 (0.25 (25% of the screen) by default) +-- sticky - Visible on all tags, false by default +-- screen - Screen (optional), mouse.screen by default +------------------------------------------------------------------- + +-- Grab environment +local pairs = pairs +local awful = require("awful") +local setmetatable = setmetatable +local capi = { + mouse = mouse, + client = client, + screen = screen +} + +-- Scratchdrop: drop-down applications manager for the awesome window manager +local scratchdrop = {} -- module scratch.drop + +local dropdown = {} + +-- Create a new window for the drop-down application when it doesn't +-- exist, or toggle between hidden and visible states when it does +function toggle(prog, vert, horiz, width, height, sticky, screen) + vert = vert or "top" + horiz = horiz or "center" + width = width or 1 + height = height or 0.5 + sticky = sticky or false + screen = screen or capi.mouse.screen + + -- Determine signal usage in this version of awesome + local attach_signal = capi.client.connect_signal or capi.client.add_signal + local detach_signal = capi.client.disconnect_signal or capi.client.remove_signal + + if not dropdown[prog] then + dropdown[prog] = {} + + -- Add unmanage signal for scratchdrop programs + attach_signal("unmanage", function (c) + for scr, cl in pairs(dropdown[prog]) do + if cl == c then + dropdown[prog][scr] = nil + end + end + end) + end + + if not dropdown[prog][screen] then + spawnw = function (c) + dropdown[prog][screen] = c + + -- Scratchdrop clients are floaters + awful.client.floating.set(c, true) + + -- Client geometry and placement + local screengeom = capi.screen[screen].workarea + + if width <= 1 then width = screengeom.width * width end + if height <= 1 then height = screengeom.height * height end + + if horiz == "left" then x = screengeom.x + elseif horiz == "right" then x = screengeom.width - width + else x = screengeom.x+(screengeom.width-width)/2 end + + if vert == "bottom" then y = screengeom.height + screengeom.y - height + elseif vert == "center" then y = screengeom.y+(screengeom.height-height)/2 + else y = screengeom.y - screengeom.y end + + -- Client properties + c:geometry({ x = x, y = y + mywibox[mouse.screen].height, width = width - 2, height = height }) + c.ontop = true + c.above = true + c.skip_taskbar = true + if sticky then c.sticky = true end + if c.titlebar then awful.titlebar.remove(c) end + + c:raise() + capi.client.focus = c + detach_signal("manage", spawnw) + end + + -- Add manage signal and spawn the program + attach_signal("manage", spawnw) + awful.util.spawn(prog, false) + else + -- Get a running client + c = dropdown[prog][screen] + + -- Switch the client to the current workspace + if c:isvisible() == false then c.hidden = true + awful.client.movetotag(awful.tag.selected(screen), c) + end + + -- Focus and raise if hidden + if c.hidden then + -- Make sure it is centered + --if vert == "center" then awful.placement.center_vertical(c) end + --if horiz == "center" then awful.placement.center_horizontal(c) end + c.hidden = false + c:raise() + capi.client.focus = c + else -- Hide and detach tags if not + c.hidden = true + local ctags = c:tags() + for i, t in pairs(ctags) do + ctags[i] = nil + end + c:tags(ctags) + end + end +end + +return setmetatable(scratchdrop, { __call = function(_, ...) return toggle(...) end }) diff --git a/awesome/.config/awesome/themes/algersoft/awesome14.png b/awesome/.config/awesome/themes/algersoft/awesome14.png Binary files differ. diff --git a/awesome/.config/awesome/themes/algersoft/awesome16.png b/awesome/.config/awesome/themes/algersoft/awesome16.png Binary files differ. diff --git a/awesome/.config/awesome/themes/algersoft/background.jpg b/awesome/.config/awesome/themes/algersoft/background.jpg Binary files differ. diff --git a/awesome/.config/awesome/themes/algersoft/background.png b/awesome/.config/awesome/themes/algersoft/background.png Binary files differ. diff --git a/awesome/.config/awesome/themes/algersoft/background/bg.png b/awesome/.config/awesome/themes/algersoft/background/bg.png Binary files differ. diff --git a/awesome/.config/awesome/themes/algersoft/background/bg2.png b/awesome/.config/awesome/themes/algersoft/background/bg2.png Binary files differ. diff --git a/awesome/.config/awesome/themes/algersoft/hero_twitter.jpg b/awesome/.config/awesome/themes/algersoft/hero_twitter.jpg Binary files differ. diff --git a/awesome/.config/awesome/themes/algersoft/layouts/dwindle.png b/awesome/.config/awesome/themes/algersoft/layouts/dwindle.png Binary files differ. diff --git a/awesome/.config/awesome/themes/algersoft/layouts/dwindlew.png b/awesome/.config/awesome/themes/algersoft/layouts/dwindlew.png Binary files differ. diff --git a/awesome/.config/awesome/themes/algersoft/layouts/fairh.png b/awesome/.config/awesome/themes/algersoft/layouts/fairh.png Binary files differ. diff --git a/awesome/.config/awesome/themes/algersoft/layouts/fairhw.png b/awesome/.config/awesome/themes/algersoft/layouts/fairhw.png Binary files differ. diff --git a/awesome/.config/awesome/themes/algersoft/layouts/fairv.png b/awesome/.config/awesome/themes/algersoft/layouts/fairv.png Binary files differ. diff --git a/awesome/.config/awesome/themes/algersoft/layouts/fairvw.png b/awesome/.config/awesome/themes/algersoft/layouts/fairvw.png Binary files differ. diff --git a/awesome/.config/awesome/themes/algersoft/layouts/floating.png b/awesome/.config/awesome/themes/algersoft/layouts/floating.png Binary files differ. diff --git a/awesome/.config/awesome/themes/algersoft/layouts/floatingw.png b/awesome/.config/awesome/themes/algersoft/layouts/floatingw.png Binary files differ. diff --git a/awesome/.config/awesome/themes/algersoft/layouts/fullscreen.png b/awesome/.config/awesome/themes/algersoft/layouts/fullscreen.png Binary files differ. diff --git a/awesome/.config/awesome/themes/algersoft/layouts/fullscreenw.png b/awesome/.config/awesome/themes/algersoft/layouts/fullscreenw.png Binary files differ. diff --git a/awesome/.config/awesome/themes/algersoft/layouts/magnifier.png b/awesome/.config/awesome/themes/algersoft/layouts/magnifier.png Binary files differ. diff --git a/awesome/.config/awesome/themes/algersoft/layouts/magnifierw.png b/awesome/.config/awesome/themes/algersoft/layouts/magnifierw.png Binary files differ. diff --git a/awesome/.config/awesome/themes/algersoft/layouts/max.png b/awesome/.config/awesome/themes/algersoft/layouts/max.png Binary files differ. diff --git a/awesome/.config/awesome/themes/algersoft/layouts/maxw.png b/awesome/.config/awesome/themes/algersoft/layouts/maxw.png Binary files differ. diff --git a/awesome/.config/awesome/themes/algersoft/layouts/spiral.png b/awesome/.config/awesome/themes/algersoft/layouts/spiral.png Binary files differ. diff --git a/awesome/.config/awesome/themes/algersoft/layouts/spiralw.png b/awesome/.config/awesome/themes/algersoft/layouts/spiralw.png Binary files differ. diff --git a/awesome/.config/awesome/themes/algersoft/layouts/tile.png b/awesome/.config/awesome/themes/algersoft/layouts/tile.png Binary files differ. diff --git a/awesome/.config/awesome/themes/algersoft/layouts/tilebottom.png b/awesome/.config/awesome/themes/algersoft/layouts/tilebottom.png Binary files differ. diff --git a/awesome/.config/awesome/themes/algersoft/layouts/tilebottomw.png b/awesome/.config/awesome/themes/algersoft/layouts/tilebottomw.png Binary files differ. diff --git a/awesome/.config/awesome/themes/algersoft/layouts/tileleft.png b/awesome/.config/awesome/themes/algersoft/layouts/tileleft.png Binary files differ. diff --git a/awesome/.config/awesome/themes/algersoft/layouts/tileleftw.png b/awesome/.config/awesome/themes/algersoft/layouts/tileleftw.png Binary files differ. diff --git a/awesome/.config/awesome/themes/algersoft/layouts/tiletop.png b/awesome/.config/awesome/themes/algersoft/layouts/tiletop.png Binary files differ. diff --git a/awesome/.config/awesome/themes/algersoft/layouts/tiletopw.png b/awesome/.config/awesome/themes/algersoft/layouts/tiletopw.png Binary files differ. diff --git a/awesome/.config/awesome/themes/algersoft/layouts/tilew.png b/awesome/.config/awesome/themes/algersoft/layouts/tilew.png Binary files differ. diff --git a/awesome/.config/awesome/themes/algersoft/layouts2/dwindle.png b/awesome/.config/awesome/themes/algersoft/layouts2/dwindle.png Binary files differ. diff --git a/awesome/.config/awesome/themes/algersoft/layouts2/fairh.png b/awesome/.config/awesome/themes/algersoft/layouts2/fairh.png Binary files differ. diff --git a/awesome/.config/awesome/themes/algersoft/layouts2/fairv.png b/awesome/.config/awesome/themes/algersoft/layouts2/fairv.png Binary files differ. diff --git a/awesome/.config/awesome/themes/algersoft/layouts2/floating.png b/awesome/.config/awesome/themes/algersoft/layouts2/floating.png Binary files differ. diff --git a/awesome/.config/awesome/themes/algersoft/layouts2/floating_a.png b/awesome/.config/awesome/themes/algersoft/layouts2/floating_a.png Binary files differ. diff --git a/awesome/.config/awesome/themes/algersoft/layouts2/fullscreen.png b/awesome/.config/awesome/themes/algersoft/layouts2/fullscreen.png Binary files differ. diff --git a/awesome/.config/awesome/themes/algersoft/layouts2/magnifier.png b/awesome/.config/awesome/themes/algersoft/layouts2/magnifier.png Binary files differ. diff --git a/awesome/.config/awesome/themes/algersoft/layouts2/max.png b/awesome/.config/awesome/themes/algersoft/layouts2/max.png Binary files differ. diff --git a/awesome/.config/awesome/themes/algersoft/layouts2/spiral.png b/awesome/.config/awesome/themes/algersoft/layouts2/spiral.png Binary files differ. diff --git a/awesome/.config/awesome/themes/algersoft/layouts2/tile.png b/awesome/.config/awesome/themes/algersoft/layouts2/tile.png Binary files differ. diff --git a/awesome/.config/awesome/themes/algersoft/layouts2/tilebottom.png b/awesome/.config/awesome/themes/algersoft/layouts2/tilebottom.png Binary files differ. diff --git a/awesome/.config/awesome/themes/algersoft/layouts2/tileleft.png b/awesome/.config/awesome/themes/algersoft/layouts2/tileleft.png Binary files differ. diff --git a/awesome/.config/awesome/themes/algersoft/layouts2/tiletop.png b/awesome/.config/awesome/themes/algersoft/layouts2/tiletop.png Binary files differ. diff --git a/awesome/.config/awesome/themes/algersoft/submenu.png b/awesome/.config/awesome/themes/algersoft/submenu.png Binary files differ. diff --git a/awesome/.config/awesome/themes/algersoft/taglist/squarefw.png b/awesome/.config/awesome/themes/algersoft/taglist/squarefw.png Binary files differ. diff --git a/awesome/.config/awesome/themes/algersoft/taglist/squarew.png b/awesome/.config/awesome/themes/algersoft/taglist/squarew.png Binary files differ. diff --git a/awesome/.config/awesome/themes/algersoft/tasklist/floating.png b/awesome/.config/awesome/themes/algersoft/tasklist/floating.png Binary files differ. diff --git a/awesome/.config/awesome/themes/algersoft/tasklist/floatingw.png b/awesome/.config/awesome/themes/algersoft/tasklist/floatingw.png Binary files differ. diff --git a/awesome/.config/awesome/themes/algersoft/tasklist/square.png b/awesome/.config/awesome/themes/algersoft/tasklist/square.png Binary files differ. diff --git a/awesome/.config/awesome/themes/algersoft/tasklist/square2.png b/awesome/.config/awesome/themes/algersoft/tasklist/square2.png Binary files differ. diff --git a/awesome/.config/awesome/themes/algersoft/theme.lua b/awesome/.config/awesome/themes/algersoft/theme.lua @@ -0,0 +1,133 @@ +-- grey-new, awesome3 theme, by Andreas Persson (greyscale, grey) + +--{{{ Main +local awful = require("awful") +awful.util = require("awful.util") + +theme = {} + +home = os.getenv("HOME") +config = awful.util.getdir("config") +shared = "/usr/share/awesome" +if not awful.util.file_readable(shared .. "/icons/awesome16.png") then + shared = "/usr/share/local/awesome" +end +sharedicons = shared .. "/icons" +sharedthemes = shared .. "/themes" +themes = config .. "/themes" +themename = "/algersoft" +if not awful.util.file_readable(themes .. themename .. "/theme.lua") then + themes = sharedthemes +end +themedir = themes .. themename + +wallpaper1 = themedir .. "/background.jpg" +wallpaper2 = themedir .. "/background.png" +wallpaper3 = sharedthemes .. "/zenburn/zenburn-background.png" +wallpaper4 = sharedthemes .. "/default/background.png" +wpscript = home .. "/.wallpaper" + +if awful.util.file_readable(wallpaper1) then + theme.wallpaper = wallpaper1 +elseif awful.util.file_readable(wallpaper2) then + theme.wallpaper = wallpaper2 +elseif awful.util.file_readable(wpscript) then + theme.wallpaper_cmd = { "sh " .. wpscript } +elseif awful.util.file_readable(wallpaper3) then + theme.wallpaper = wallpaper3 +else + theme.wallpaper = wallpaper4 +end +--}}} + +theme.font = "Tamsyn 10" +-- theme.font = "ProggyTinyTTSZ 12" + +theme.bg_normal = "#121212" +theme.bg_focus = "#212121" +theme.bg_urgent = "#212121" +theme.bg_minimize = "#121212" + +theme.fg_normal = "#5fafff" +theme.fg_focus = "#08ff07" +theme.fg_urgent = "#ff0056" +theme.fg_minimize = "#ababab" + +theme.border_width = "1" +theme.border_normal = "#515151" +theme.border_focus = "#08ff07" +theme.border_marked = "#ff0056" + +-- There are other variable sets +-- overriding the default one when +-- defined, the sets are: +-- [taglist|tasklist]_[bg|fg]_[focus|urgent] +-- titlebar_[bg|fg]_[normal|focus] +-- tooltip_[font|opacity|fg_color|bg_color|border_width|border_color] +-- mouse_finder_[color|timeout|animate_timeout|radius|factor] +-- Example: +--theme.taglist_bg_focus = "#ff0000" + +-- Display the taglist squares +theme.taglist_squares_sel = themedir .. "/taglist/squarefw.png" +theme.taglist_squares_unsel = themedir .. "/taglist/squarew.png" + +theme.tasklist_square = themedir .. "/tasklist/square2.png" +theme.tasklist_floating_icon = themedir .. "/tasklist/floatingw.png" + +-- Variables set for theming the menu: +-- menu_[bg|fg]_[normal|focus] +-- menu_[border_color|border_width] +theme.menu_submenu_icon = themedir .. "/submenu.png" +theme.menu_height = "15" +theme.menu_width = "100" + +-- You can add as many variables as +-- you wish and access them by using +-- beautiful.variable in your rc.lua +--theme.bg_widget = "#cc0000" + +-- Define the image to load +theme.titlebar_close_button_normal = themedir .. "/titlebar/close_normal.png" +theme.titlebar_close_button_focus = themedir .. "/titlebar/close_focus.png" + +theme.titlebar_ontop_button_normal_inactive = themedir .. "/titlebar/ontop_normal_inactive.png" +theme.titlebar_ontop_button_focus_inactive = themedir .. "/titlebar/ontop_focus_inactive.png" +theme.titlebar_ontop_button_normal_active = themedir .. "/titlebar/ontop_normal_active.png" +theme.titlebar_ontop_button_focus_active = themedir .. "/titlebar/ontop_focus_active.png" + +theme.titlebar_sticky_button_normal_inactive = themedir .. "/titlebar/sticky_normal_inactive.png" +theme.titlebar_sticky_button_focus_inactive = themedir .. "/titlebar/sticky_focus_inactive.png" +theme.titlebar_sticky_button_normal_active = themedir .. "/titlebar/sticky_normal_active.png" +theme.titlebar_sticky_button_focus_active = themedir .. "/titlebar/sticky_focus_active.png" + +theme.titlebar_floating_button_normal_inactive = themedir .. "/titlebar/floating_normal_inactive.png" +theme.titlebar_floating_button_focus_inactive = themedir .. "/titlebar/floating_focus_inactive.png" +theme.titlebar_floating_button_normal_active = themedir .. "/titlebar/floating_normal_active.png" +theme.titlebar_floating_button_focus_active = themedir .. "/titlebar/floating_focus_active.png" + +theme.titlebar_maximized_button_normal_inactive = themedir .. "/titlebar/maximized_normal_inactive.png" +theme.titlebar_maximized_button_focus_inactive = themedir .. "/titlebar/maximized_focus_inactive.png" +theme.titlebar_maximized_button_normal_active = themedir .. "/titlebar/maximized_normal_active.png" +theme.titlebar_maximized_button_focus_active = themedir .. "/titlebar/maximized_focus_active.png" + +-- You can use your own layout icons like this: +theme.layout_fairh = themedir .. "/layouts2/fairh.png" +theme.layout_fairv = themedir .. "/layouts2/fairv.png" +theme.layout_floating = themedir .. "/layouts2/floating.png" +theme.layout_magnifier = themedir .. "/layouts2/magnifier.png" +theme.layout_max = themedir .. "/layouts2/max.png" +theme.layout_fullscreen = themedir .. "/layouts2/fullscreen.png" +theme.layout_tilebottom = themedir .. "/layouts2/tilebottom.png" +theme.layout_tileleft = themedir .. "/layouts2/tileleft.png" +theme.layout_tile = themedir .. "/layouts2/tile.png" +theme.layout_tiletop = themedir .. "/layouts2/tiletop.png" +theme.layout_spiral = themedir .. "/layouts2/spiral.png" +theme.layout_dwindle = themedir .. "/layouts2/dwindle.png" + +theme.awesome_icon = themedir .. "/awesome14.png" + +-- lain related +theme.useless_gap_width = 10 + +return theme diff --git a/awesome/.config/awesome/themes/algersoft/titlebar/close_focus.png b/awesome/.config/awesome/themes/algersoft/titlebar/close_focus.png Binary files differ. diff --git a/awesome/.config/awesome/themes/algersoft/titlebar/close_normal.png b/awesome/.config/awesome/themes/algersoft/titlebar/close_normal.png Binary files differ. diff --git a/awesome/.config/awesome/themes/algersoft/titlebar/floating_focus_active.png b/awesome/.config/awesome/themes/algersoft/titlebar/floating_focus_active.png Binary files differ. diff --git a/awesome/.config/awesome/themes/algersoft/titlebar/floating_focus_inactive.png b/awesome/.config/awesome/themes/algersoft/titlebar/floating_focus_inactive.png Binary files differ. diff --git a/awesome/.config/awesome/themes/algersoft/titlebar/floating_normal_active.png b/awesome/.config/awesome/themes/algersoft/titlebar/floating_normal_active.png Binary files differ. diff --git a/awesome/.config/awesome/themes/algersoft/titlebar/floating_normal_inactive.png b/awesome/.config/awesome/themes/algersoft/titlebar/floating_normal_inactive.png Binary files differ. diff --git a/awesome/.config/awesome/themes/algersoft/titlebar/maximized_focus_active.png b/awesome/.config/awesome/themes/algersoft/titlebar/maximized_focus_active.png Binary files differ. diff --git a/awesome/.config/awesome/themes/algersoft/titlebar/maximized_focus_inactive.png b/awesome/.config/awesome/themes/algersoft/titlebar/maximized_focus_inactive.png Binary files differ. diff --git a/awesome/.config/awesome/themes/algersoft/titlebar/maximized_normal_active.png b/awesome/.config/awesome/themes/algersoft/titlebar/maximized_normal_active.png Binary files differ. diff --git a/awesome/.config/awesome/themes/algersoft/titlebar/maximized_normal_inactive.png b/awesome/.config/awesome/themes/algersoft/titlebar/maximized_normal_inactive.png Binary files differ. diff --git a/awesome/.config/awesome/themes/algersoft/titlebar/ontop_focus_active.png b/awesome/.config/awesome/themes/algersoft/titlebar/ontop_focus_active.png Binary files differ. diff --git a/awesome/.config/awesome/themes/algersoft/titlebar/ontop_focus_inactive.png b/awesome/.config/awesome/themes/algersoft/titlebar/ontop_focus_inactive.png Binary files differ. diff --git a/awesome/.config/awesome/themes/algersoft/titlebar/ontop_normal_active.png b/awesome/.config/awesome/themes/algersoft/titlebar/ontop_normal_active.png Binary files differ. diff --git a/awesome/.config/awesome/themes/algersoft/titlebar/ontop_normal_inactive.png b/awesome/.config/awesome/themes/algersoft/titlebar/ontop_normal_inactive.png Binary files differ. diff --git a/awesome/.config/awesome/themes/algersoft/titlebar/sticky_focus_active.png b/awesome/.config/awesome/themes/algersoft/titlebar/sticky_focus_active.png Binary files differ. diff --git a/awesome/.config/awesome/themes/algersoft/titlebar/sticky_focus_inactive.png b/awesome/.config/awesome/themes/algersoft/titlebar/sticky_focus_inactive.png Binary files differ. diff --git a/awesome/.config/awesome/themes/algersoft/titlebar/sticky_normal_active.png b/awesome/.config/awesome/themes/algersoft/titlebar/sticky_normal_active.png Binary files differ. diff --git a/awesome/.config/awesome/themes/algersoft/titlebar/sticky_normal_inactive.png b/awesome/.config/awesome/themes/algersoft/titlebar/sticky_normal_inactive.png Binary files differ. diff --git a/awesome/.config/awesome/themes/otherideas/awesome14.png b/awesome/.config/awesome/themes/otherideas/awesome14.png Binary files differ. diff --git a/awesome/.config/awesome/themes/otherideas/awesome16.png b/awesome/.config/awesome/themes/otherideas/awesome16.png Binary files differ. diff --git a/awesome/.config/awesome/themes/otherideas/background.jpg b/awesome/.config/awesome/themes/otherideas/background.jpg Binary files differ. diff --git a/awesome/.config/awesome/themes/otherideas/background.png b/awesome/.config/awesome/themes/otherideas/background.png Binary files differ. diff --git a/awesome/.config/awesome/themes/otherideas/background/bg.png b/awesome/.config/awesome/themes/otherideas/background/bg.png Binary files differ. diff --git a/awesome/.config/awesome/themes/otherideas/background/bg2.png b/awesome/.config/awesome/themes/otherideas/background/bg2.png Binary files differ. diff --git a/awesome/.config/awesome/themes/otherideas/layouts/dwindle.png b/awesome/.config/awesome/themes/otherideas/layouts/dwindle.png Binary files differ. diff --git a/awesome/.config/awesome/themes/otherideas/layouts/dwindlew.png b/awesome/.config/awesome/themes/otherideas/layouts/dwindlew.png Binary files differ. diff --git a/awesome/.config/awesome/themes/otherideas/layouts/fairh.png b/awesome/.config/awesome/themes/otherideas/layouts/fairh.png Binary files differ. diff --git a/awesome/.config/awesome/themes/otherideas/layouts/fairhw.png b/awesome/.config/awesome/themes/otherideas/layouts/fairhw.png Binary files differ. diff --git a/awesome/.config/awesome/themes/otherideas/layouts/fairv.png b/awesome/.config/awesome/themes/otherideas/layouts/fairv.png Binary files differ. diff --git a/awesome/.config/awesome/themes/otherideas/layouts/fairvw.png b/awesome/.config/awesome/themes/otherideas/layouts/fairvw.png Binary files differ. diff --git a/awesome/.config/awesome/themes/otherideas/layouts/floating.png b/awesome/.config/awesome/themes/otherideas/layouts/floating.png Binary files differ. diff --git a/awesome/.config/awesome/themes/otherideas/layouts/floatingw.png b/awesome/.config/awesome/themes/otherideas/layouts/floatingw.png Binary files differ. diff --git a/awesome/.config/awesome/themes/otherideas/layouts/fullscreen.png b/awesome/.config/awesome/themes/otherideas/layouts/fullscreen.png Binary files differ. diff --git a/awesome/.config/awesome/themes/otherideas/layouts/fullscreenw.png b/awesome/.config/awesome/themes/otherideas/layouts/fullscreenw.png Binary files differ. diff --git a/awesome/.config/awesome/themes/otherideas/layouts/magnifier.png b/awesome/.config/awesome/themes/otherideas/layouts/magnifier.png Binary files differ. diff --git a/awesome/.config/awesome/themes/otherideas/layouts/magnifierw.png b/awesome/.config/awesome/themes/otherideas/layouts/magnifierw.png Binary files differ. diff --git a/awesome/.config/awesome/themes/otherideas/layouts/max.png b/awesome/.config/awesome/themes/otherideas/layouts/max.png Binary files differ. diff --git a/awesome/.config/awesome/themes/otherideas/layouts/maxw.png b/awesome/.config/awesome/themes/otherideas/layouts/maxw.png Binary files differ. diff --git a/awesome/.config/awesome/themes/otherideas/layouts/spiral.png b/awesome/.config/awesome/themes/otherideas/layouts/spiral.png Binary files differ. diff --git a/awesome/.config/awesome/themes/otherideas/layouts/spiralw.png b/awesome/.config/awesome/themes/otherideas/layouts/spiralw.png Binary files differ. diff --git a/awesome/.config/awesome/themes/otherideas/layouts/tile.png b/awesome/.config/awesome/themes/otherideas/layouts/tile.png Binary files differ. diff --git a/awesome/.config/awesome/themes/otherideas/layouts/tilebottom.png b/awesome/.config/awesome/themes/otherideas/layouts/tilebottom.png Binary files differ. diff --git a/awesome/.config/awesome/themes/otherideas/layouts/tilebottomw.png b/awesome/.config/awesome/themes/otherideas/layouts/tilebottomw.png Binary files differ. diff --git a/awesome/.config/awesome/themes/otherideas/layouts/tileleft.png b/awesome/.config/awesome/themes/otherideas/layouts/tileleft.png Binary files differ. diff --git a/awesome/.config/awesome/themes/otherideas/layouts/tileleftw.png b/awesome/.config/awesome/themes/otherideas/layouts/tileleftw.png Binary files differ. diff --git a/awesome/.config/awesome/themes/otherideas/layouts/tiletop.png b/awesome/.config/awesome/themes/otherideas/layouts/tiletop.png Binary files differ. diff --git a/awesome/.config/awesome/themes/otherideas/layouts/tiletopw.png b/awesome/.config/awesome/themes/otherideas/layouts/tiletopw.png Binary files differ. diff --git a/awesome/.config/awesome/themes/otherideas/layouts/tilew.png b/awesome/.config/awesome/themes/otherideas/layouts/tilew.png Binary files differ. diff --git a/awesome/.config/awesome/themes/otherideas/layouts2/dwindle.png b/awesome/.config/awesome/themes/otherideas/layouts2/dwindle.png Binary files differ. diff --git a/awesome/.config/awesome/themes/otherideas/layouts2/fairh.png b/awesome/.config/awesome/themes/otherideas/layouts2/fairh.png Binary files differ. diff --git a/awesome/.config/awesome/themes/otherideas/layouts2/fairv.png b/awesome/.config/awesome/themes/otherideas/layouts2/fairv.png Binary files differ. diff --git a/awesome/.config/awesome/themes/otherideas/layouts2/floating.png b/awesome/.config/awesome/themes/otherideas/layouts2/floating.png Binary files differ. diff --git a/awesome/.config/awesome/themes/otherideas/layouts2/floating_a.png b/awesome/.config/awesome/themes/otherideas/layouts2/floating_a.png Binary files differ. diff --git a/awesome/.config/awesome/themes/otherideas/layouts2/fullscreen.png b/awesome/.config/awesome/themes/otherideas/layouts2/fullscreen.png Binary files differ. diff --git a/awesome/.config/awesome/themes/otherideas/layouts2/magnifier.png b/awesome/.config/awesome/themes/otherideas/layouts2/magnifier.png Binary files differ. diff --git a/awesome/.config/awesome/themes/otherideas/layouts2/max.png b/awesome/.config/awesome/themes/otherideas/layouts2/max.png Binary files differ. diff --git a/awesome/.config/awesome/themes/otherideas/layouts2/spiral.png b/awesome/.config/awesome/themes/otherideas/layouts2/spiral.png Binary files differ. diff --git a/awesome/.config/awesome/themes/otherideas/layouts2/tile.png b/awesome/.config/awesome/themes/otherideas/layouts2/tile.png Binary files differ. diff --git a/awesome/.config/awesome/themes/otherideas/layouts2/tilebottom.png b/awesome/.config/awesome/themes/otherideas/layouts2/tilebottom.png Binary files differ. diff --git a/awesome/.config/awesome/themes/otherideas/layouts2/tileleft.png b/awesome/.config/awesome/themes/otherideas/layouts2/tileleft.png Binary files differ. diff --git a/awesome/.config/awesome/themes/otherideas/layouts2/tiletop.png b/awesome/.config/awesome/themes/otherideas/layouts2/tiletop.png Binary files differ. diff --git a/awesome/.config/awesome/themes/otherideas/submenu.png b/awesome/.config/awesome/themes/otherideas/submenu.png Binary files differ. diff --git a/awesome/.config/awesome/themes/otherideas/taglist/squarefw.png b/awesome/.config/awesome/themes/otherideas/taglist/squarefw.png Binary files differ. diff --git a/awesome/.config/awesome/themes/otherideas/taglist/squarew.png b/awesome/.config/awesome/themes/otherideas/taglist/squarew.png Binary files differ. diff --git a/awesome/.config/awesome/themes/otherideas/tasklist/floating.png b/awesome/.config/awesome/themes/otherideas/tasklist/floating.png Binary files differ. diff --git a/awesome/.config/awesome/themes/otherideas/tasklist/floatingw.png b/awesome/.config/awesome/themes/otherideas/tasklist/floatingw.png Binary files differ. diff --git a/awesome/.config/awesome/themes/otherideas/tasklist/square.png b/awesome/.config/awesome/themes/otherideas/tasklist/square.png Binary files differ. diff --git a/awesome/.config/awesome/themes/otherideas/tasklist/square2.png b/awesome/.config/awesome/themes/otherideas/tasklist/square2.png Binary files differ. diff --git a/awesome/.config/awesome/themes/otherideas/theme.lua b/awesome/.config/awesome/themes/otherideas/theme.lua @@ -0,0 +1,133 @@ +-- otherideas, awesome3 theme, by Andreas Persson (greyscale, grey) + +--{{{ Main +local awful = require("awful") +awful.util = require("awful.util") + +theme = {} + +home = os.getenv("HOME") +config = awful.util.getdir("config") +shared = "/usr/share/awesome" +if not awful.util.file_readable(shared .. "/icons/awesome16.png") then + shared = "/usr/share/local/awesome" +end +sharedicons = shared .. "/icons" +sharedthemes = shared .. "/themes" +themes = config .. "/themes" +themename = "/otherideas" +if not awful.util.file_readable(themes .. themename .. "/theme.lua") then + themes = sharedthemes +end +themedir = themes .. themename + +wallpaper1 = themedir .. "/background.jpg" +wallpaper2 = themedir .. "/background.png" +wallpaper3 = sharedthemes .. "/zenburn/zenburn-background.png" +wallpaper4 = sharedthemes .. "/default/background.png" +wpscript = home .. "/.wallpaper" + +if awful.util.file_readable(wallpaper1) then + theme.wallpaper = wallpaper1 +elseif awful.util.file_readable(wallpaper2) then + theme.wallpaper = wallpaper2 +elseif awful.util.file_readable(wpscript) then + theme.wallpaper_cmd = { "sh " .. wpscript } +elseif awful.util.file_readable(wallpaper3) then + theme.wallpaper = wallpaper3 +else + theme.wallpaper = wallpaper4 +end +--}}} + +theme.font = "Tamsyn 11" +-- theme.font = "ProggyTinyTTSZ 12" + +theme.bg_normal = "#121212" +theme.bg_focus = "#212121" +theme.bg_urgent = "#212121" +theme.bg_minimize = "#121212" + +theme.fg_normal = "#5fafff" +theme.fg_focus = "#ff8700" +theme.fg_urgent = "#ff0056" +theme.fg_minimize = "#ababab" + +theme.border_width = "1" +theme.border_normal = "#515151" +theme.border_focus = "#ff8700" +theme.border_marked = "#ff0056" + +-- There are other variable sets +-- overriding the default one when +-- defined, the sets are: +-- [taglist|tasklist]_[bg|fg]_[focus|urgent] +-- titlebar_[bg|fg]_[normal|focus] +-- tooltip_[font|opacity|fg_color|bg_color|border_width|border_color] +-- mouse_finder_[color|timeout|animate_timeout|radius|factor] +-- Example: +--theme.taglist_bg_focus = "#ff0000" + +-- Display the taglist squares +theme.taglist_squares_sel = themedir .. "/taglist/squarefw.png" +theme.taglist_squares_unsel = themedir .. "/taglist/squarew.png" + +theme.tasklist_square = themedir .. "/tasklist/square2.png" +theme.tasklist_floating_icon = themedir .. "/tasklist/floatingw.png" + +-- Variables set for theming the menu: +-- menu_[bg|fg]_[normal|focus] +-- menu_[border_color|border_width] +theme.menu_submenu_icon = themedir .. "/submenu.png" +theme.menu_height = "15" +theme.menu_width = "100" + +-- You can add as many variables as +-- you wish and access them by using +-- beautiful.variable in your rc.lua +--theme.bg_widget = "#cc0000" + +-- Define the image to load +theme.titlebar_close_button_normal = themedir .. "/titlebar/close_normal.png" +theme.titlebar_close_button_focus = themedir .. "/titlebar/close_focus.png" + +theme.titlebar_ontop_button_normal_inactive = themedir .. "/titlebar/ontop_normal_inactive.png" +theme.titlebar_ontop_button_focus_inactive = themedir .. "/titlebar/ontop_focus_inactive.png" +theme.titlebar_ontop_button_normal_active = themedir .. "/titlebar/ontop_normal_active.png" +theme.titlebar_ontop_button_focus_active = themedir .. "/titlebar/ontop_focus_active.png" + +theme.titlebar_sticky_button_normal_inactive = themedir .. "/titlebar/sticky_normal_inactive.png" +theme.titlebar_sticky_button_focus_inactive = themedir .. "/titlebar/sticky_focus_inactive.png" +theme.titlebar_sticky_button_normal_active = themedir .. "/titlebar/sticky_normal_active.png" +theme.titlebar_sticky_button_focus_active = themedir .. "/titlebar/sticky_focus_active.png" + +theme.titlebar_floating_button_normal_inactive = themedir .. "/titlebar/floating_normal_inactive.png" +theme.titlebar_floating_button_focus_inactive = themedir .. "/titlebar/floating_focus_inactive.png" +theme.titlebar_floating_button_normal_active = themedir .. "/titlebar/floating_normal_active.png" +theme.titlebar_floating_button_focus_active = themedir .. "/titlebar/floating_focus_active.png" + +theme.titlebar_maximized_button_normal_inactive = themedir .. "/titlebar/maximized_normal_inactive.png" +theme.titlebar_maximized_button_focus_inactive = themedir .. "/titlebar/maximized_focus_inactive.png" +theme.titlebar_maximized_button_normal_active = themedir .. "/titlebar/maximized_normal_active.png" +theme.titlebar_maximized_button_focus_active = themedir .. "/titlebar/maximized_focus_active.png" + +-- You can use your own layout icons like this: +theme.layout_fairh = themedir .. "/layouts2/fairh.png" +theme.layout_fairv = themedir .. "/layouts2/fairv.png" +theme.layout_floating = themedir .. "/layouts2/floating.png" +theme.layout_magnifier = themedir .. "/layouts2/magnifier.png" +theme.layout_max = themedir .. "/layouts2/max.png" +theme.layout_fullscreen = themedir .. "/layouts2/fullscreen.png" +theme.layout_tilebottom = themedir .. "/layouts2/tilebottom.png" +theme.layout_tileleft = themedir .. "/layouts2/tileleft.png" +theme.layout_tile = themedir .. "/layouts2/tile.png" +theme.layout_tiletop = themedir .. "/layouts2/tiletop.png" +theme.layout_spiral = themedir .. "/layouts2/spiral.png" +theme.layout_dwindle = themedir .. "/layouts2/dwindle.png" + +theme.awesome_icon = themedir .. "/awesome14.png" + +-- lain related +theme.useless_gap_width = 10 + +return theme diff --git a/awesome/.config/awesome/themes/otherideas/titlebar/close_focus.png b/awesome/.config/awesome/themes/otherideas/titlebar/close_focus.png Binary files differ. diff --git a/awesome/.config/awesome/themes/otherideas/titlebar/close_normal.png b/awesome/.config/awesome/themes/otherideas/titlebar/close_normal.png Binary files differ. diff --git a/awesome/.config/awesome/themes/otherideas/titlebar/floating_focus_active.png b/awesome/.config/awesome/themes/otherideas/titlebar/floating_focus_active.png Binary files differ. diff --git a/awesome/.config/awesome/themes/otherideas/titlebar/floating_focus_inactive.png b/awesome/.config/awesome/themes/otherideas/titlebar/floating_focus_inactive.png Binary files differ. diff --git a/awesome/.config/awesome/themes/otherideas/titlebar/floating_normal_active.png b/awesome/.config/awesome/themes/otherideas/titlebar/floating_normal_active.png Binary files differ. diff --git a/awesome/.config/awesome/themes/otherideas/titlebar/floating_normal_inactive.png b/awesome/.config/awesome/themes/otherideas/titlebar/floating_normal_inactive.png Binary files differ. diff --git a/awesome/.config/awesome/themes/otherideas/titlebar/maximized_focus_active.png b/awesome/.config/awesome/themes/otherideas/titlebar/maximized_focus_active.png Binary files differ. diff --git a/awesome/.config/awesome/themes/otherideas/titlebar/maximized_focus_inactive.png b/awesome/.config/awesome/themes/otherideas/titlebar/maximized_focus_inactive.png Binary files differ. diff --git a/awesome/.config/awesome/themes/otherideas/titlebar/maximized_normal_active.png b/awesome/.config/awesome/themes/otherideas/titlebar/maximized_normal_active.png Binary files differ. diff --git a/awesome/.config/awesome/themes/otherideas/titlebar/maximized_normal_inactive.png b/awesome/.config/awesome/themes/otherideas/titlebar/maximized_normal_inactive.png Binary files differ. diff --git a/awesome/.config/awesome/themes/otherideas/titlebar/ontop_focus_active.png b/awesome/.config/awesome/themes/otherideas/titlebar/ontop_focus_active.png Binary files differ. diff --git a/awesome/.config/awesome/themes/otherideas/titlebar/ontop_focus_inactive.png b/awesome/.config/awesome/themes/otherideas/titlebar/ontop_focus_inactive.png Binary files differ. diff --git a/awesome/.config/awesome/themes/otherideas/titlebar/ontop_normal_active.png b/awesome/.config/awesome/themes/otherideas/titlebar/ontop_normal_active.png Binary files differ. diff --git a/awesome/.config/awesome/themes/otherideas/titlebar/ontop_normal_inactive.png b/awesome/.config/awesome/themes/otherideas/titlebar/ontop_normal_inactive.png Binary files differ. diff --git a/awesome/.config/awesome/themes/otherideas/titlebar/sticky_focus_active.png b/awesome/.config/awesome/themes/otherideas/titlebar/sticky_focus_active.png Binary files differ. diff --git a/awesome/.config/awesome/themes/otherideas/titlebar/sticky_focus_inactive.png b/awesome/.config/awesome/themes/otherideas/titlebar/sticky_focus_inactive.png Binary files differ. diff --git a/awesome/.config/awesome/themes/otherideas/titlebar/sticky_normal_active.png b/awesome/.config/awesome/themes/otherideas/titlebar/sticky_normal_active.png Binary files differ. diff --git a/awesome/.config/awesome/themes/otherideas/titlebar/sticky_normal_inactive.png b/awesome/.config/awesome/themes/otherideas/titlebar/sticky_normal_inactive.png Binary files differ. diff --git a/awesome/.config/awesome/themes/pyratesoft/awesome14.png b/awesome/.config/awesome/themes/pyratesoft/awesome14.png Binary files differ. diff --git a/awesome/.config/awesome/themes/pyratesoft/awesome16.png b/awesome/.config/awesome/themes/pyratesoft/awesome16.png Binary files differ. diff --git a/awesome/.config/awesome/themes/pyratesoft/background.jpg b/awesome/.config/awesome/themes/pyratesoft/background.jpg Binary files differ. diff --git a/awesome/.config/awesome/themes/pyratesoft/background.png b/awesome/.config/awesome/themes/pyratesoft/background.png Binary files differ. diff --git a/awesome/.config/awesome/themes/pyratesoft/background/bg.png b/awesome/.config/awesome/themes/pyratesoft/background/bg.png Binary files differ. diff --git a/awesome/.config/awesome/themes/pyratesoft/background/bg2.png b/awesome/.config/awesome/themes/pyratesoft/background/bg2.png Binary files differ. diff --git a/awesome/.config/awesome/themes/pyratesoft/layouts/dwindle.png b/awesome/.config/awesome/themes/pyratesoft/layouts/dwindle.png Binary files differ. diff --git a/awesome/.config/awesome/themes/pyratesoft/layouts/dwindlew.png b/awesome/.config/awesome/themes/pyratesoft/layouts/dwindlew.png Binary files differ. diff --git a/awesome/.config/awesome/themes/pyratesoft/layouts/fairh.png b/awesome/.config/awesome/themes/pyratesoft/layouts/fairh.png Binary files differ. diff --git a/awesome/.config/awesome/themes/pyratesoft/layouts/fairhw.png b/awesome/.config/awesome/themes/pyratesoft/layouts/fairhw.png Binary files differ. diff --git a/awesome/.config/awesome/themes/pyratesoft/layouts/fairv.png b/awesome/.config/awesome/themes/pyratesoft/layouts/fairv.png Binary files differ. diff --git a/awesome/.config/awesome/themes/pyratesoft/layouts/fairvw.png b/awesome/.config/awesome/themes/pyratesoft/layouts/fairvw.png Binary files differ. diff --git a/awesome/.config/awesome/themes/pyratesoft/layouts/floating.png b/awesome/.config/awesome/themes/pyratesoft/layouts/floating.png Binary files differ. diff --git a/awesome/.config/awesome/themes/pyratesoft/layouts/floatingw.png b/awesome/.config/awesome/themes/pyratesoft/layouts/floatingw.png Binary files differ. diff --git a/awesome/.config/awesome/themes/pyratesoft/layouts/fullscreen.png b/awesome/.config/awesome/themes/pyratesoft/layouts/fullscreen.png Binary files differ. diff --git a/awesome/.config/awesome/themes/pyratesoft/layouts/fullscreenw.png b/awesome/.config/awesome/themes/pyratesoft/layouts/fullscreenw.png Binary files differ. diff --git a/awesome/.config/awesome/themes/pyratesoft/layouts/magnifier.png b/awesome/.config/awesome/themes/pyratesoft/layouts/magnifier.png Binary files differ. diff --git a/awesome/.config/awesome/themes/pyratesoft/layouts/magnifierw.png b/awesome/.config/awesome/themes/pyratesoft/layouts/magnifierw.png Binary files differ. diff --git a/awesome/.config/awesome/themes/pyratesoft/layouts/max.png b/awesome/.config/awesome/themes/pyratesoft/layouts/max.png Binary files differ. diff --git a/awesome/.config/awesome/themes/pyratesoft/layouts/maxw.png b/awesome/.config/awesome/themes/pyratesoft/layouts/maxw.png Binary files differ. diff --git a/awesome/.config/awesome/themes/pyratesoft/layouts/spiral.png b/awesome/.config/awesome/themes/pyratesoft/layouts/spiral.png Binary files differ. diff --git a/awesome/.config/awesome/themes/pyratesoft/layouts/spiralw.png b/awesome/.config/awesome/themes/pyratesoft/layouts/spiralw.png Binary files differ. diff --git a/awesome/.config/awesome/themes/pyratesoft/layouts/tile.png b/awesome/.config/awesome/themes/pyratesoft/layouts/tile.png Binary files differ. diff --git a/awesome/.config/awesome/themes/pyratesoft/layouts/tilebottom.png b/awesome/.config/awesome/themes/pyratesoft/layouts/tilebottom.png Binary files differ. diff --git a/awesome/.config/awesome/themes/pyratesoft/layouts/tilebottomw.png b/awesome/.config/awesome/themes/pyratesoft/layouts/tilebottomw.png Binary files differ. diff --git a/awesome/.config/awesome/themes/pyratesoft/layouts/tileleft.png b/awesome/.config/awesome/themes/pyratesoft/layouts/tileleft.png Binary files differ. diff --git a/awesome/.config/awesome/themes/pyratesoft/layouts/tileleftw.png b/awesome/.config/awesome/themes/pyratesoft/layouts/tileleftw.png Binary files differ. diff --git a/awesome/.config/awesome/themes/pyratesoft/layouts/tiletop.png b/awesome/.config/awesome/themes/pyratesoft/layouts/tiletop.png Binary files differ. diff --git a/awesome/.config/awesome/themes/pyratesoft/layouts/tiletopw.png b/awesome/.config/awesome/themes/pyratesoft/layouts/tiletopw.png Binary files differ. diff --git a/awesome/.config/awesome/themes/pyratesoft/layouts/tilew.png b/awesome/.config/awesome/themes/pyratesoft/layouts/tilew.png Binary files differ. diff --git a/awesome/.config/awesome/themes/pyratesoft/layouts2/dwindle.png b/awesome/.config/awesome/themes/pyratesoft/layouts2/dwindle.png Binary files differ. diff --git a/awesome/.config/awesome/themes/pyratesoft/layouts2/fairh.png b/awesome/.config/awesome/themes/pyratesoft/layouts2/fairh.png Binary files differ. diff --git a/awesome/.config/awesome/themes/pyratesoft/layouts2/fairv.png b/awesome/.config/awesome/themes/pyratesoft/layouts2/fairv.png Binary files differ. diff --git a/awesome/.config/awesome/themes/pyratesoft/layouts2/floating.png b/awesome/.config/awesome/themes/pyratesoft/layouts2/floating.png Binary files differ. diff --git a/awesome/.config/awesome/themes/pyratesoft/layouts2/floating_a.png b/awesome/.config/awesome/themes/pyratesoft/layouts2/floating_a.png Binary files differ. diff --git a/awesome/.config/awesome/themes/pyratesoft/layouts2/fullscreen.png b/awesome/.config/awesome/themes/pyratesoft/layouts2/fullscreen.png Binary files differ. diff --git a/awesome/.config/awesome/themes/pyratesoft/layouts2/magnifier.png b/awesome/.config/awesome/themes/pyratesoft/layouts2/magnifier.png Binary files differ. diff --git a/awesome/.config/awesome/themes/pyratesoft/layouts2/max.png b/awesome/.config/awesome/themes/pyratesoft/layouts2/max.png Binary files differ. diff --git a/awesome/.config/awesome/themes/pyratesoft/layouts2/spiral.png b/awesome/.config/awesome/themes/pyratesoft/layouts2/spiral.png Binary files differ. diff --git a/awesome/.config/awesome/themes/pyratesoft/layouts2/tile.png b/awesome/.config/awesome/themes/pyratesoft/layouts2/tile.png Binary files differ. diff --git a/awesome/.config/awesome/themes/pyratesoft/layouts2/tilebottom.png b/awesome/.config/awesome/themes/pyratesoft/layouts2/tilebottom.png Binary files differ. diff --git a/awesome/.config/awesome/themes/pyratesoft/layouts2/tileleft.png b/awesome/.config/awesome/themes/pyratesoft/layouts2/tileleft.png Binary files differ. diff --git a/awesome/.config/awesome/themes/pyratesoft/layouts2/tiletop.png b/awesome/.config/awesome/themes/pyratesoft/layouts2/tiletop.png Binary files differ. diff --git a/awesome/.config/awesome/themes/pyratesoft/submenu.png b/awesome/.config/awesome/themes/pyratesoft/submenu.png Binary files differ. diff --git a/awesome/.config/awesome/themes/pyratesoft/taglist/squarefw.png b/awesome/.config/awesome/themes/pyratesoft/taglist/squarefw.png Binary files differ. diff --git a/awesome/.config/awesome/themes/pyratesoft/taglist/squarew.png b/awesome/.config/awesome/themes/pyratesoft/taglist/squarew.png Binary files differ. diff --git a/awesome/.config/awesome/themes/pyratesoft/tasklist/floating.png b/awesome/.config/awesome/themes/pyratesoft/tasklist/floating.png Binary files differ. diff --git a/awesome/.config/awesome/themes/pyratesoft/tasklist/floatingw.png b/awesome/.config/awesome/themes/pyratesoft/tasklist/floatingw.png Binary files differ. diff --git a/awesome/.config/awesome/themes/pyratesoft/tasklist/square.png b/awesome/.config/awesome/themes/pyratesoft/tasklist/square.png Binary files differ. diff --git a/awesome/.config/awesome/themes/pyratesoft/tasklist/square2.png b/awesome/.config/awesome/themes/pyratesoft/tasklist/square2.png Binary files differ. diff --git a/awesome/.config/awesome/themes/pyratesoft/theme.lua b/awesome/.config/awesome/themes/pyratesoft/theme.lua @@ -0,0 +1,134 @@ +-- futuremyth-min, awesome3 theme, by pyratebeard +-- A minimal theme + +--{{{ Main +local awful = require("awful") +awful.util = require("awful.util") + +theme = {} + +home = os.getenv("HOME") +config = awful.util.getdir("config") +shared = "/usr/share/awesome" +if not awful.util.file_readable(shared .. "/icons/awesome16.png") then + shared = "/usr/share/local/awesome" +end +sharedicons = shared .. "/icons" +sharedthemes = shared .. "/themes" +themes = config .. "/themes" +themename = "/pyratesoft" +if not awful.util.file_readable(themes .. themename .. "/theme.lua") then + themes = sharedthemes +end +themedir = themes .. themename + +wallpaper1 = themedir .. "/background.jpg" +wallpaper2 = themedir .. "/background.png" +wallpaper3 = sharedthemes .. "/zenburn/zenburn-background.png" +wallpaper4 = sharedthemes .. "/default/background.png" +wpscript = home .. "/.wallpaper" + +if awful.util.file_readable(wallpaper1) then + theme.wallpaper = wallpaper1 +elseif awful.util.file_readable(wallpaper2) then + theme.wallpaper = wallpaper2 +elseif awful.util.file_readable(wpscript) then + theme.wallpaper_cmd = { "sh " .. wpscript } +elseif awful.util.file_readable(wallpaper3) then + theme.wallpaper = wallpaper3 +else + theme.wallpaper = wallpaper4 +end +--}}} + +theme.font = "Tamsyn 11" +-- theme.font = "ProggyTinyTTSZ 12" + +theme.bg_normal = "#121212" +theme.bg_focus = "#212121" +theme.bg_urgent = "#212121" +theme.bg_minimize = "#121212" + +theme.fg_normal = "#d9d9d9" +theme.fg_focus = "#01c8e5" +theme.fg_urgent = "#ff0056" +theme.fg_minimize = "#ababab" + +theme.border_width = "2" +theme.border_normal = "#515151" +theme.border_focus = "#01c8e5" +theme.border_marked = "#ff0056" + +-- There are other variable sets +-- overriding the default one when +-- defined, the sets are: +-- [taglist|tasklist]_[bg|fg]_[focus|urgent] +-- titlebar_[bg|fg]_[normal|focus] +-- tooltip_[font|opacity|fg_color|bg_color|border_width|border_color] +-- mouse_finder_[color|timeout|animate_timeout|radius|factor] +-- Example: +--theme.taglist_bg_focus = "#ff0000" + +-- Display the taglist squares +theme.taglist_squares_sel = themedir .. "/taglist/squarefw.png" +theme.taglist_squares_unsel = themedir .. "/taglist/squarew.png" + +theme.tasklist_square = themedir .. "/tasklist/square2.png" +theme.tasklist_floating_icon = themedir .. "/tasklist/floatingw.png" + +-- Variables set for theming the menu: +-- menu_[bg|fg]_[normal|focus] +-- menu_[border_color|border_width] +theme.menu_submenu_icon = themedir .. "/submenu.png" +theme.menu_height = "15" +theme.menu_width = "100" + +-- You can add as many variables as +-- you wish and access them by using +-- beautiful.variable in your rc.lua +--theme.bg_widget = "#cc0000" + +-- Define the image to load +theme.titlebar_close_button_normal = themedir .. "/titlebar/close_normal.png" +theme.titlebar_close_button_focus = themedir .. "/titlebar/close_focus.png" + +theme.titlebar_ontop_button_normal_inactive = themedir .. "/titlebar/ontop_normal_inactive.png" +theme.titlebar_ontop_button_focus_inactive = themedir .. "/titlebar/ontop_focus_inactive.png" +theme.titlebar_ontop_button_normal_active = themedir .. "/titlebar/ontop_normal_active.png" +theme.titlebar_ontop_button_focus_active = themedir .. "/titlebar/ontop_focus_active.png" + +theme.titlebar_sticky_button_normal_inactive = themedir .. "/titlebar/sticky_normal_inactive.png" +theme.titlebar_sticky_button_focus_inactive = themedir .. "/titlebar/sticky_focus_inactive.png" +theme.titlebar_sticky_button_normal_active = themedir .. "/titlebar/sticky_normal_active.png" +theme.titlebar_sticky_button_focus_active = themedir .. "/titlebar/sticky_focus_active.png" + +theme.titlebar_floating_button_normal_inactive = themedir .. "/titlebar/floating_normal_inactive.png" +theme.titlebar_floating_button_focus_inactive = themedir .. "/titlebar/floating_focus_inactive.png" +theme.titlebar_floating_button_normal_active = themedir .. "/titlebar/floating_normal_active.png" +theme.titlebar_floating_button_focus_active = themedir .. "/titlebar/floating_focus_active.png" + +theme.titlebar_maximized_button_normal_inactive = themedir .. "/titlebar/maximized_normal_inactive.png" +theme.titlebar_maximized_button_focus_inactive = themedir .. "/titlebar/maximized_focus_inactive.png" +theme.titlebar_maximized_button_normal_active = themedir .. "/titlebar/maximized_normal_active.png" +theme.titlebar_maximized_button_focus_active = themedir .. "/titlebar/maximized_focus_active.png" + +-- You can use your own layout icons like this: +theme.layout_fairh = themedir .. "/layouts2/fairh.png" +theme.layout_fairv = themedir .. "/layouts2/fairv.png" +theme.layout_floating = themedir .. "/layouts2/floating.png" +theme.layout_magnifier = themedir .. "/layouts2/magnifier.png" +theme.layout_max = themedir .. "/layouts2/max.png" +theme.layout_fullscreen = themedir .. "/layouts2/fullscreen.png" +theme.layout_tilebottom = themedir .. "/layouts2/tilebottom.png" +theme.layout_tileleft = themedir .. "/layouts2/tileleft.png" +theme.layout_tile = themedir .. "/layouts2/tile.png" +theme.layout_tiletop = themedir .. "/layouts2/tiletop.png" +theme.layout_spiral = themedir .. "/layouts2/spiral.png" +theme.layout_dwindle = themedir .. "/layouts2/dwindle.png" + +theme.awesome_icon = themedir .. "/awesome14.png" + +-- lain related +theme.useless_gap_width = 10 + +return theme diff --git a/awesome/.config/awesome/themes/pyratesoft/titlebar/close_focus.png b/awesome/.config/awesome/themes/pyratesoft/titlebar/close_focus.png Binary files differ. diff --git a/awesome/.config/awesome/themes/pyratesoft/titlebar/close_normal.png b/awesome/.config/awesome/themes/pyratesoft/titlebar/close_normal.png Binary files differ. diff --git a/awesome/.config/awesome/themes/pyratesoft/titlebar/floating_focus_active.png b/awesome/.config/awesome/themes/pyratesoft/titlebar/floating_focus_active.png Binary files differ. diff --git a/awesome/.config/awesome/themes/pyratesoft/titlebar/floating_focus_inactive.png b/awesome/.config/awesome/themes/pyratesoft/titlebar/floating_focus_inactive.png Binary files differ. diff --git a/awesome/.config/awesome/themes/pyratesoft/titlebar/floating_normal_active.png b/awesome/.config/awesome/themes/pyratesoft/titlebar/floating_normal_active.png Binary files differ. diff --git a/awesome/.config/awesome/themes/pyratesoft/titlebar/floating_normal_inactive.png b/awesome/.config/awesome/themes/pyratesoft/titlebar/floating_normal_inactive.png Binary files differ. diff --git a/awesome/.config/awesome/themes/pyratesoft/titlebar/maximized_focus_active.png b/awesome/.config/awesome/themes/pyratesoft/titlebar/maximized_focus_active.png Binary files differ. diff --git a/awesome/.config/awesome/themes/pyratesoft/titlebar/maximized_focus_inactive.png b/awesome/.config/awesome/themes/pyratesoft/titlebar/maximized_focus_inactive.png Binary files differ. diff --git a/awesome/.config/awesome/themes/pyratesoft/titlebar/maximized_normal_active.png b/awesome/.config/awesome/themes/pyratesoft/titlebar/maximized_normal_active.png Binary files differ. diff --git a/awesome/.config/awesome/themes/pyratesoft/titlebar/maximized_normal_inactive.png b/awesome/.config/awesome/themes/pyratesoft/titlebar/maximized_normal_inactive.png Binary files differ. diff --git a/awesome/.config/awesome/themes/pyratesoft/titlebar/ontop_focus_active.png b/awesome/.config/awesome/themes/pyratesoft/titlebar/ontop_focus_active.png Binary files differ. diff --git a/awesome/.config/awesome/themes/pyratesoft/titlebar/ontop_focus_inactive.png b/awesome/.config/awesome/themes/pyratesoft/titlebar/ontop_focus_inactive.png Binary files differ. diff --git a/awesome/.config/awesome/themes/pyratesoft/titlebar/ontop_normal_active.png b/awesome/.config/awesome/themes/pyratesoft/titlebar/ontop_normal_active.png Binary files differ. diff --git a/awesome/.config/awesome/themes/pyratesoft/titlebar/ontop_normal_inactive.png b/awesome/.config/awesome/themes/pyratesoft/titlebar/ontop_normal_inactive.png Binary files differ. diff --git a/awesome/.config/awesome/themes/pyratesoft/titlebar/sticky_focus_active.png b/awesome/.config/awesome/themes/pyratesoft/titlebar/sticky_focus_active.png Binary files differ. diff --git a/awesome/.config/awesome/themes/pyratesoft/titlebar/sticky_focus_inactive.png b/awesome/.config/awesome/themes/pyratesoft/titlebar/sticky_focus_inactive.png Binary files differ. diff --git a/awesome/.config/awesome/themes/pyratesoft/titlebar/sticky_normal_active.png b/awesome/.config/awesome/themes/pyratesoft/titlebar/sticky_normal_active.png Binary files differ. diff --git a/awesome/.config/awesome/themes/pyratesoft/titlebar/sticky_normal_inactive.png b/awesome/.config/awesome/themes/pyratesoft/titlebar/sticky_normal_inactive.png Binary files differ. diff --git a/awesome/.config/awesome/themes/watchdog/awesome14.png b/awesome/.config/awesome/themes/watchdog/awesome14.png Binary files differ. diff --git a/awesome/.config/awesome/themes/watchdog/awesome16.png b/awesome/.config/awesome/themes/watchdog/awesome16.png Binary files differ. diff --git a/awesome/.config/awesome/themes/watchdog/background.jpg b/awesome/.config/awesome/themes/watchdog/background.jpg Binary files differ. diff --git a/awesome/.config/awesome/themes/watchdog/background.png b/awesome/.config/awesome/themes/watchdog/background.png Binary files differ. diff --git a/awesome/.config/awesome/themes/watchdog/background/bg.png b/awesome/.config/awesome/themes/watchdog/background/bg.png Binary files differ. diff --git a/awesome/.config/awesome/themes/watchdog/background/bg2.png b/awesome/.config/awesome/themes/watchdog/background/bg2.png Binary files differ. diff --git a/awesome/.config/awesome/themes/watchdog/layouts/dwindle.png b/awesome/.config/awesome/themes/watchdog/layouts/dwindle.png Binary files differ. diff --git a/awesome/.config/awesome/themes/watchdog/layouts/dwindlew.png b/awesome/.config/awesome/themes/watchdog/layouts/dwindlew.png Binary files differ. diff --git a/awesome/.config/awesome/themes/watchdog/layouts/fairh.png b/awesome/.config/awesome/themes/watchdog/layouts/fairh.png Binary files differ. diff --git a/awesome/.config/awesome/themes/watchdog/layouts/fairhw.png b/awesome/.config/awesome/themes/watchdog/layouts/fairhw.png Binary files differ. diff --git a/awesome/.config/awesome/themes/watchdog/layouts/fairv.png b/awesome/.config/awesome/themes/watchdog/layouts/fairv.png Binary files differ. diff --git a/awesome/.config/awesome/themes/watchdog/layouts/fairvw.png b/awesome/.config/awesome/themes/watchdog/layouts/fairvw.png Binary files differ. diff --git a/awesome/.config/awesome/themes/watchdog/layouts/floating.png b/awesome/.config/awesome/themes/watchdog/layouts/floating.png Binary files differ. diff --git a/awesome/.config/awesome/themes/watchdog/layouts/floatingw.png b/awesome/.config/awesome/themes/watchdog/layouts/floatingw.png Binary files differ. diff --git a/awesome/.config/awesome/themes/watchdog/layouts/fullscreen.png b/awesome/.config/awesome/themes/watchdog/layouts/fullscreen.png Binary files differ. diff --git a/awesome/.config/awesome/themes/watchdog/layouts/fullscreenw.png b/awesome/.config/awesome/themes/watchdog/layouts/fullscreenw.png Binary files differ. diff --git a/awesome/.config/awesome/themes/watchdog/layouts/magnifier.png b/awesome/.config/awesome/themes/watchdog/layouts/magnifier.png Binary files differ. diff --git a/awesome/.config/awesome/themes/watchdog/layouts/magnifierw.png b/awesome/.config/awesome/themes/watchdog/layouts/magnifierw.png Binary files differ. diff --git a/awesome/.config/awesome/themes/watchdog/layouts/max.png b/awesome/.config/awesome/themes/watchdog/layouts/max.png Binary files differ. diff --git a/awesome/.config/awesome/themes/watchdog/layouts/maxw.png b/awesome/.config/awesome/themes/watchdog/layouts/maxw.png Binary files differ. diff --git a/awesome/.config/awesome/themes/watchdog/layouts/spiral.png b/awesome/.config/awesome/themes/watchdog/layouts/spiral.png Binary files differ. diff --git a/awesome/.config/awesome/themes/watchdog/layouts/spiralw.png b/awesome/.config/awesome/themes/watchdog/layouts/spiralw.png Binary files differ. diff --git a/awesome/.config/awesome/themes/watchdog/layouts/tile.png b/awesome/.config/awesome/themes/watchdog/layouts/tile.png Binary files differ. diff --git a/awesome/.config/awesome/themes/watchdog/layouts/tilebottom.png b/awesome/.config/awesome/themes/watchdog/layouts/tilebottom.png Binary files differ. diff --git a/awesome/.config/awesome/themes/watchdog/layouts/tilebottomw.png b/awesome/.config/awesome/themes/watchdog/layouts/tilebottomw.png Binary files differ. diff --git a/awesome/.config/awesome/themes/watchdog/layouts/tileleft.png b/awesome/.config/awesome/themes/watchdog/layouts/tileleft.png Binary files differ. diff --git a/awesome/.config/awesome/themes/watchdog/layouts/tileleftw.png b/awesome/.config/awesome/themes/watchdog/layouts/tileleftw.png Binary files differ. diff --git a/awesome/.config/awesome/themes/watchdog/layouts/tiletop.png b/awesome/.config/awesome/themes/watchdog/layouts/tiletop.png Binary files differ. diff --git a/awesome/.config/awesome/themes/watchdog/layouts/tiletopw.png b/awesome/.config/awesome/themes/watchdog/layouts/tiletopw.png Binary files differ. diff --git a/awesome/.config/awesome/themes/watchdog/layouts/tilew.png b/awesome/.config/awesome/themes/watchdog/layouts/tilew.png Binary files differ. diff --git a/awesome/.config/awesome/themes/watchdog/layouts2/dwindle.png b/awesome/.config/awesome/themes/watchdog/layouts2/dwindle.png Binary files differ. diff --git a/awesome/.config/awesome/themes/watchdog/layouts2/fairh.png b/awesome/.config/awesome/themes/watchdog/layouts2/fairh.png Binary files differ. diff --git a/awesome/.config/awesome/themes/watchdog/layouts2/fairv.png b/awesome/.config/awesome/themes/watchdog/layouts2/fairv.png Binary files differ. diff --git a/awesome/.config/awesome/themes/watchdog/layouts2/floating.png b/awesome/.config/awesome/themes/watchdog/layouts2/floating.png Binary files differ. diff --git a/awesome/.config/awesome/themes/watchdog/layouts2/floating_a.png b/awesome/.config/awesome/themes/watchdog/layouts2/floating_a.png Binary files differ. diff --git a/awesome/.config/awesome/themes/watchdog/layouts2/fullscreen.png b/awesome/.config/awesome/themes/watchdog/layouts2/fullscreen.png Binary files differ. diff --git a/awesome/.config/awesome/themes/watchdog/layouts2/magnifier.png b/awesome/.config/awesome/themes/watchdog/layouts2/magnifier.png Binary files differ. diff --git a/awesome/.config/awesome/themes/watchdog/layouts2/max.png b/awesome/.config/awesome/themes/watchdog/layouts2/max.png Binary files differ. diff --git a/awesome/.config/awesome/themes/watchdog/layouts2/spiral.png b/awesome/.config/awesome/themes/watchdog/layouts2/spiral.png Binary files differ. diff --git a/awesome/.config/awesome/themes/watchdog/layouts2/tile.png b/awesome/.config/awesome/themes/watchdog/layouts2/tile.png Binary files differ. diff --git a/awesome/.config/awesome/themes/watchdog/layouts2/tilebottom.png b/awesome/.config/awesome/themes/watchdog/layouts2/tilebottom.png Binary files differ. diff --git a/awesome/.config/awesome/themes/watchdog/layouts2/tileleft.png b/awesome/.config/awesome/themes/watchdog/layouts2/tileleft.png Binary files differ. diff --git a/awesome/.config/awesome/themes/watchdog/layouts2/tiletop.png b/awesome/.config/awesome/themes/watchdog/layouts2/tiletop.png Binary files differ. diff --git a/awesome/.config/awesome/themes/watchdog/submenu.png b/awesome/.config/awesome/themes/watchdog/submenu.png Binary files differ. diff --git a/awesome/.config/awesome/themes/watchdog/taglist/squarefw.png b/awesome/.config/awesome/themes/watchdog/taglist/squarefw.png Binary files differ. diff --git a/awesome/.config/awesome/themes/watchdog/taglist/squarew.png b/awesome/.config/awesome/themes/watchdog/taglist/squarew.png Binary files differ. diff --git a/awesome/.config/awesome/themes/watchdog/tasklist/floating.png b/awesome/.config/awesome/themes/watchdog/tasklist/floating.png Binary files differ. diff --git a/awesome/.config/awesome/themes/watchdog/tasklist/floatingw.png b/awesome/.config/awesome/themes/watchdog/tasklist/floatingw.png Binary files differ. diff --git a/awesome/.config/awesome/themes/watchdog/tasklist/square.png b/awesome/.config/awesome/themes/watchdog/tasklist/square.png Binary files differ. diff --git a/awesome/.config/awesome/themes/watchdog/tasklist/square2.png b/awesome/.config/awesome/themes/watchdog/tasklist/square2.png Binary files differ. diff --git a/awesome/.config/awesome/themes/watchdog/theme.lua b/awesome/.config/awesome/themes/watchdog/theme.lua @@ -0,0 +1,134 @@ +-- futuremyth-min, awesome3 theme, by pyratebeard +-- A minimal theme + +--{{{ Main +local awful = require("awful") +awful.util = require("awful.util") + +theme = {} + +home = os.getenv("HOME") +config = awful.util.getdir("config") +shared = "/usr/share/awesome" +if not awful.util.file_readable(shared .. "/icons/awesome16.png") then + shared = "/usr/share/local/awesome" +end +sharedicons = shared .. "/icons" +sharedthemes = shared .. "/themes" +themes = config .. "/themes" +themename = "/watchdog" +if not awful.util.file_readable(themes .. themename .. "/theme.lua") then + themes = sharedthemes +end +themedir = themes .. themename + +wallpaper1 = themedir .. "/background.jpg" +wallpaper2 = themedir .. "/background.png" +wallpaper3 = sharedthemes .. "/zenburn/zenburn-background.png" +wallpaper4 = sharedthemes .. "/default/background.png" +wpscript = home .. "/.wallpaper" + +if awful.util.file_readable(wallpaper1) then + theme.wallpaper = wallpaper1 +elseif awful.util.file_readable(wallpaper2) then + theme.wallpaper = wallpaper2 +elseif awful.util.file_readable(wpscript) then + theme.wallpaper_cmd = { "sh " .. wpscript } +elseif awful.util.file_readable(wallpaper3) then + theme.wallpaper = wallpaper3 +else + theme.wallpaper = wallpaper4 +end +--}}} + +theme.font = "Tamsyn 11" +-- theme.font = "ProggyTinyTTSZ 12" + +theme.bg_normal = "#121212" +theme.bg_focus = "#212121" +theme.bg_urgent = "#212121" +theme.bg_minimize = "#121212" + +theme.fg_normal = "#d9d9d9" +theme.fg_focus = "#d9d9d9" +theme.fg_urgent = "#ff0056" +theme.fg_minimize = "#ababab" + +theme.border_width = "2" +theme.border_normal = "#515151" +theme.border_focus = "#d9d9d9" +theme.border_marked = "#ff0056" + +-- There are other variable sets +-- overriding the default one when +-- defined, the sets are: +-- [taglist|tasklist]_[bg|fg]_[focus|urgent] +-- titlebar_[bg|fg]_[normal|focus] +-- tooltip_[font|opacity|fg_color|bg_color|border_width|border_color] +-- mouse_finder_[color|timeout|animate_timeout|radius|factor] +-- Example: +--theme.taglist_bg_focus = "#ff0000" + +-- Display the taglist squares +theme.taglist_squares_sel = themedir .. "/taglist/squarefw.png" +theme.taglist_squares_unsel = themedir .. "/taglist/squarew.png" + +theme.tasklist_square = themedir .. "/tasklist/square2.png" +theme.tasklist_floating_icon = themedir .. "/tasklist/floatingw.png" + +-- Variables set for theming the menu: +-- menu_[bg|fg]_[normal|focus] +-- menu_[border_color|border_width] +theme.menu_submenu_icon = themedir .. "/submenu.png" +theme.menu_height = "15" +theme.menu_width = "100" + +-- You can add as many variables as +-- you wish and access them by using +-- beautiful.variable in your rc.lua +--theme.bg_widget = "#cc0000" + +-- Define the image to load +theme.titlebar_close_button_normal = themedir .. "/titlebar/close_normal.png" +theme.titlebar_close_button_focus = themedir .. "/titlebar/close_focus.png" + +theme.titlebar_ontop_button_normal_inactive = themedir .. "/titlebar/ontop_normal_inactive.png" +theme.titlebar_ontop_button_focus_inactive = themedir .. "/titlebar/ontop_focus_inactive.png" +theme.titlebar_ontop_button_normal_active = themedir .. "/titlebar/ontop_normal_active.png" +theme.titlebar_ontop_button_focus_active = themedir .. "/titlebar/ontop_focus_active.png" + +theme.titlebar_sticky_button_normal_inactive = themedir .. "/titlebar/sticky_normal_inactive.png" +theme.titlebar_sticky_button_focus_inactive = themedir .. "/titlebar/sticky_focus_inactive.png" +theme.titlebar_sticky_button_normal_active = themedir .. "/titlebar/sticky_normal_active.png" +theme.titlebar_sticky_button_focus_active = themedir .. "/titlebar/sticky_focus_active.png" + +theme.titlebar_floating_button_normal_inactive = themedir .. "/titlebar/floating_normal_inactive.png" +theme.titlebar_floating_button_focus_inactive = themedir .. "/titlebar/floating_focus_inactive.png" +theme.titlebar_floating_button_normal_active = themedir .. "/titlebar/floating_normal_active.png" +theme.titlebar_floating_button_focus_active = themedir .. "/titlebar/floating_focus_active.png" + +theme.titlebar_maximized_button_normal_inactive = themedir .. "/titlebar/maximized_normal_inactive.png" +theme.titlebar_maximized_button_focus_inactive = themedir .. "/titlebar/maximized_focus_inactive.png" +theme.titlebar_maximized_button_normal_active = themedir .. "/titlebar/maximized_normal_active.png" +theme.titlebar_maximized_button_focus_active = themedir .. "/titlebar/maximized_focus_active.png" + +-- You can use your own layout icons like this: +theme.layout_fairh = themedir .. "/layouts2/fairh.png" +theme.layout_fairv = themedir .. "/layouts2/fairv.png" +theme.layout_floating = themedir .. "/layouts2/floating.png" +theme.layout_magnifier = themedir .. "/layouts2/magnifier.png" +theme.layout_max = themedir .. "/layouts2/max.png" +theme.layout_fullscreen = themedir .. "/layouts2/fullscreen.png" +theme.layout_tilebottom = themedir .. "/layouts2/tilebottom.png" +theme.layout_tileleft = themedir .. "/layouts2/tileleft.png" +theme.layout_tile = themedir .. "/layouts2/tile.png" +theme.layout_tiletop = themedir .. "/layouts2/tiletop.png" +theme.layout_spiral = themedir .. "/layouts2/spiral.png" +theme.layout_dwindle = themedir .. "/layouts2/dwindle.png" + +theme.awesome_icon = themedir .. "/awesome14.png" + +-- lain related +theme.useless_gap_width = 10 + +return theme diff --git a/awesome/.config/awesome/themes/watchdog/titlebar/close_focus.png b/awesome/.config/awesome/themes/watchdog/titlebar/close_focus.png Binary files differ. diff --git a/awesome/.config/awesome/themes/watchdog/titlebar/close_normal.png b/awesome/.config/awesome/themes/watchdog/titlebar/close_normal.png Binary files differ. diff --git a/awesome/.config/awesome/themes/watchdog/titlebar/floating_focus_active.png b/awesome/.config/awesome/themes/watchdog/titlebar/floating_focus_active.png Binary files differ. diff --git a/awesome/.config/awesome/themes/watchdog/titlebar/floating_focus_inactive.png b/awesome/.config/awesome/themes/watchdog/titlebar/floating_focus_inactive.png Binary files differ. diff --git a/awesome/.config/awesome/themes/watchdog/titlebar/floating_normal_active.png b/awesome/.config/awesome/themes/watchdog/titlebar/floating_normal_active.png Binary files differ. diff --git a/awesome/.config/awesome/themes/watchdog/titlebar/floating_normal_inactive.png b/awesome/.config/awesome/themes/watchdog/titlebar/floating_normal_inactive.png Binary files differ. diff --git a/awesome/.config/awesome/themes/watchdog/titlebar/maximized_focus_active.png b/awesome/.config/awesome/themes/watchdog/titlebar/maximized_focus_active.png Binary files differ. diff --git a/awesome/.config/awesome/themes/watchdog/titlebar/maximized_focus_inactive.png b/awesome/.config/awesome/themes/watchdog/titlebar/maximized_focus_inactive.png Binary files differ. diff --git a/awesome/.config/awesome/themes/watchdog/titlebar/maximized_normal_active.png b/awesome/.config/awesome/themes/watchdog/titlebar/maximized_normal_active.png Binary files differ. diff --git a/awesome/.config/awesome/themes/watchdog/titlebar/maximized_normal_inactive.png b/awesome/.config/awesome/themes/watchdog/titlebar/maximized_normal_inactive.png Binary files differ. diff --git a/awesome/.config/awesome/themes/watchdog/titlebar/ontop_focus_active.png b/awesome/.config/awesome/themes/watchdog/titlebar/ontop_focus_active.png Binary files differ. diff --git a/awesome/.config/awesome/themes/watchdog/titlebar/ontop_focus_inactive.png b/awesome/.config/awesome/themes/watchdog/titlebar/ontop_focus_inactive.png Binary files differ. diff --git a/awesome/.config/awesome/themes/watchdog/titlebar/ontop_normal_active.png b/awesome/.config/awesome/themes/watchdog/titlebar/ontop_normal_active.png Binary files differ. diff --git a/awesome/.config/awesome/themes/watchdog/titlebar/ontop_normal_inactive.png b/awesome/.config/awesome/themes/watchdog/titlebar/ontop_normal_inactive.png Binary files differ. diff --git a/awesome/.config/awesome/themes/watchdog/titlebar/sticky_focus_active.png b/awesome/.config/awesome/themes/watchdog/titlebar/sticky_focus_active.png Binary files differ. diff --git a/awesome/.config/awesome/themes/watchdog/titlebar/sticky_focus_inactive.png b/awesome/.config/awesome/themes/watchdog/titlebar/sticky_focus_inactive.png Binary files differ. diff --git a/awesome/.config/awesome/themes/watchdog/titlebar/sticky_normal_active.png b/awesome/.config/awesome/themes/watchdog/titlebar/sticky_normal_active.png Binary files differ. diff --git a/awesome/.config/awesome/themes/watchdog/titlebar/sticky_normal_inactive.png b/awesome/.config/awesome/themes/watchdog/titlebar/sticky_normal_inactive.png Binary files differ. diff --git a/bash/.bash_profile b/bash/.bash_profile @@ -0,0 +1,16 @@ +# .bash_profile + +# Get the aliases and functions +if [ -f ~/.bashrc ]; then + . ~/.bashrc +fi + +# User specific environment and startup programs + +PATH=$PATH:$HOME/.local/bin:$HOME/bin + +export PATH + +export MEDIA='/media/data_01/' + +set -o vi diff --git a/bash/.bashrc b/bash/.bashrc @@ -0,0 +1,30 @@ +# .bashrc + +# Source global definitions +if [ -f /etc/bashrc ]; then + . /etc/bashrc +fi + +# Uncomment the following line if you don't like systemctl's auto-paging feature: +# export SYSTEMD_PAGER= + +# User specific aliases and functions + +# pipe commands to vh +# uses nc to send output to virtualhacker.net port 9999 +# returns a url for distribution. WARN:PLAIN TEXT +alias vh='nc virtualhacker.net 9999' +alias ls='ls -A --color=auto' +alias l='ls -1' +alias llfile='ls -l | grep -v ^d' +alias lldir='ls -l | grep ^d' + +function cd { + builtin cd "$@" && ls -l +} + + +# Bash doesn't like colors +# Writes over same line +# export PS1="\e[0;33m[\u@\h]\$ \e[m" +export PS1="[\u@\h \W]\$ " diff --git a/dwb/.config/dwb/default/bookmarks b/dwb/.config/dwb/default/bookmarks diff --git a/dwb/.config/dwb/default/commands.history b/dwb/.config/dwb/default/commands.history diff --git a/dwb/.config/dwb/default/cookies b/dwb/.config/dwb/default/cookies @@ -0,0 +1,5 @@ +# HTTP Cookie File +# http://www.netscape.com/newsref/std/cookie_spec.html +# This is a generated file! Do not edit. +# To delete cookies, use the Cookie Manager. + diff --git a/dwb/.config/dwb/default/cookies.allow b/dwb/.config/dwb/default/cookies.allow diff --git a/dwb/.config/dwb/default/cookies_session.allow b/dwb/.config/dwb/default/cookies_session.allow diff --git a/dwb/.config/dwb/default/custom_keys b/dwb/.config/dwb/default/custom_keys diff --git a/dwb/.config/dwb/default/history b/dwb/.config/dwb/default/history @@ -0,0 +1,221 @@ +https://github.com/pyratebeard?tab=repositories pyratebeard (Dudley) +https://github.com/pyratebeard pyratebeard (Dudley) +https://github.com/pyratebeard/scraper pyratebeard/scraper +https://github.com/settings/profile SSH and GPG keys +https://github.com/settings/keys SSH and GPG keys +https://github.com/settings/ssh SSH and GPG keys +http://sprunge.us/GNKT (null) +https://github.com/pyratebeard/ssh_scraper/settings pyratebeard/ssh_scraper +https://github.com/pyratebeard/ssh_scraper pyratebeard/ssh_scraper +https://duckduckgo.com/?t=hf DuckDuckGo +https://duckduckgo.com/?q=hack+the+planet+wallpaper&t=hf&iar=images&iax=1&ia=images hack the planet wallpaper at DuckDuckGo +https://duckduckgo.com/?q=hack+the+planet+wallpaper&t=hf&iar=images&iax=1&ia=images&iai=http%3A%2F%2Fwallpaperest.com%2Fwallpapers%2Ftechnology-hacker_307307.jpg hack the planet wallpaper at DuckDuckGo +https://github.com/ GitHub +https://github.com/sessions/two-factor GitHub · Where software is built +https://github.com/login Sign in to GitHub · GitHub +http://pre15.deviantart.net/9799/th/pre/i/2014/296/b/4/hack_the_planet_by_captjc-d83wzw1.png hack_the_planet_by_captjc-d83wzw1.png (670x1191 pixels) +http://r.duckduckgo.com/l/?kh=-1&uddg=http%3A%2F%2Fth04.deviantart.net%2Ffs71%2FPRE%2Fi%2F2014%2F296%2Fb%2F4%2Fhack_the_planet_by_captjc-d83wzw1.png (null) +https://duckduckgo.com/?q=hack+the+planet+wallpaper&t=hf&iar=images&iax=1&ia=images&iai=http%3A%2F%2Fth04.deviantart.net%2Ffs71%2FPRE%2Fi%2F2014%2F296%2Fb%2F4%2Fhack_the_planet_by_captjc-d83wzw1.png hack the planet wallpaper at DuckDuckGo +https://duckduckgo.com/?q=hack+the+planet+wallpaper&t=hf&iar=images&iax=1&ia=images&iai=https%3A%2F%2Fi.ytimg.com%2Fvi%2FoFN1N5r5BOA%2Fmaxresdefault.jpg hack the planet wallpaper at DuckDuckGo +http://img12.deviantart.net/06ff/i/2015/312/6/4/hack_the_planet_5k_wallpaper_by_captjc-d9g1p62.jpg hack_the_planet_5k_wallpaper_by_captjc-d9g1p62.jpg (1600x900 pixels) +http://r.duckduckgo.com/l/?kh=-1&uddg=http%3A%2F%2Fimg12.deviantart.net%2F06ff%2Fi%2F2015%2F312%2F6%2F4%2Fhack_the_planet_5k_wallpaper_by_captjc-d9g1p62.jpg (null) +https://duckduckgo.com/?q=hack+the+planet+wallpaper&t=hf&iar=images&iax=1&ia=images&iai=http%3A%2F%2Fimg12.deviantart.net%2F06ff%2Fi%2F2015%2F312%2F6%2F4%2Fhack_the_planet_5k_wallpaper_by_captjc-d9g1p62.jpg hack the planet wallpaper at DuckDuckGo +https://duckduckgo.com/?q=hack+the+planet+wallpaper&t=hf&iar=images&iax=1&ia=images&iai=http%3A%2F%2Fimg2.wikia.nocookie.net%2F__cb20130917194433%2Fsaintsrow%2Fimages%2F9%2F95%2FHack_the_Planet_Complete.png hack the planet wallpaper at DuckDuckGo +https://duckduckgo.com/?q=hack+the+planet+wallpaper&t=hf&iar=images hack the planet wallpaper at DuckDuckGo +https://duckduckgo.com/?q=dark+hacker+wallpaper&t=hf&iar=images dark hacker wallpaper at DuckDuckGo +https://duckduckgo.com/?q=cyber+dark+wallpaper&t=hf&iar=images cyber dark wallpaper at DuckDuckGo +https://duckduckgo.com/?q=tron+dark+wallpaper&t=hf&iax=1&ia=images tron dark wallpaper at DuckDuckGo +https://duckduckgo.com/?q=tron+dark+wallpaper&t=hf&iax=1 tron dark wallpaper at DuckDuckGo +https://duckduckgo.com/?q=tron+dark+wallpaper&t=hf tron dark wallpaper at DuckDuckGo +https://duckduckgo.com/?q=tron+dark+wallpaper&t=hf&ia=web tron dark wallpaper at DuckDuckGo +https://duckduckgo.com/?q=tron+the+grid+wallpaper&t=hf&iar=images&ia=images tron the grid wallpaper at DuckDuckGo +https://duckduckgo.com/?q=tron+the+grid+wallpaper&t=hf&iar=images tron the grid wallpaper at DuckDuckGo +https://duckduckgo.com/?q=tron+the+grid+wallpaper&t=hf tron the grid wallpaper at DuckDuckGo +https://duckduckgo.com/?q=tron+the+grid+wallpaper&t=hf&ia=web tron the grid wallpaper at DuckDuckGo +https://duckduckgo.com/?q=tron+the+grid+wallpaper&t=hf&iar=images&iax=1&ia=images tron the grid wallpaper at DuckDuckGo +https://duckduckgo.com/?q=tron+the+grid+wallpaper&t=hf&iar=images&iax=1&ia=images&iai=http%3A%2F%2Fimages4.fanpop.com%2Fimage%2Fphotos%2F20400000%2FTRON-Legacy-tron-legacy-20457578-1920-1080.jpg tron the grid wallpaper at DuckDuckGo +http://images4.fanpop.com/image/photos/20400000/TRON-Legacy-tron-legacy-20457578-1920-1080.jpg TRON-Legacy-tron-legacy-20457578-1920-1080.jpg (1920x1080 pixels) +http://r.duckduckgo.com/l/?kh=-1&uddg=http%3A%2F%2Fimages4.fanpop.com%2Fimage%2Fphotos%2F20400000%2FTRON-Legacy-tron-legacy-20457578-1920-1080.jpg (null) +https://duckduckgo.com/?q=tron+the+grid+wallpaper&t=hf&iar=images&iax=1&ia=images&iai=http%3A%2F%2Fimgs.abduzeedo.com%2Ffiles%2Ftutorials%2FTron_Logo_Tutorial%2FStep_28.jpg tron the grid wallpaper at DuckDuckGo +http://r.duckduckgo.com/l/?kh=-1&uddg=http%3A%2F%2Fwallpaperstock.net%2Ftron-legacy_wallpapers_15057_1280x800.jpg (null) +https://duckduckgo.com/?q=tron+the+grid+wallpaper&t=hf&iar=images&iax=1&ia=images&iai=http%3A%2F%2Fwallpaperstock.net%2Ftron-legacy_wallpapers_15057_1280x800.jpg tron the grid wallpaper at DuckDuckGo +https://duckduckgo.com/?q=tron+the+grid+wallpaper&t=hf&iar=images&iax=1&ia=images&iai=http%3A%2F%2Fuffenorde.com%2Fwp-content%2Fuploads%2F2011%2F01%2FandroidGridWallpaper1920x1080.jpg tron the grid wallpaper at DuckDuckGo +https://bplusmovieblog.files.wordpress.com/2011/04/tron-grid-2.jpg tron-grid-2.jpg (1201x677 pixels) +http://r.duckduckgo.com/l/?kh=-1&uddg=http%3A%2F%2Fbplusmovieblog.files.wordpress.com%2F2011%2F04%2Ftron-grid-2.jpg (null) +https://duckduckgo.com/?q=tron+the+grid+wallpaper&t=hf&iar=images&iax=1&ia=images&iai=http%3A%2F%2Fbplusmovieblog.files.wordpress.com%2F2011%2F04%2Ftron-grid-2.jpg tron the grid wallpaper at DuckDuckGo +https://cdn-images.xda-developers.com/direct/1/8/2/4/6/8/3/abstract-tron_00284201.jpg abstract-tron_00284201.jpg (1680x1050 pixels) +https://duckduckgo.com/l/?kh=-1&uddg=https%3A%2F%2Fcdn-images.xda-developers.com%2Fdirect%2F1%2F8%2F2%2F4%2F6%2F8%2F3%2Fabstract-tron_00284201.jpg (null) +https://duckduckgo.com/?q=tron+the+grid+wallpaper&t=hf&iar=images&iax=1&ia=images&iai=https%3A%2F%2Fcdn-images.xda-developers.com%2Fdirect%2F1%2F8%2F2%2F4%2F6%2F8%2F3%2Fabstract-tron_00284201.jpg tron the grid wallpaper at DuckDuckGo +https://duckduckgo.com/?q=tron+the+grid+wallpaper&t=hf&iar=images&iax=1&ia=images&iai=http%3A%2F%2Ffc06.deviantart.net%2Ffs70%2Ff%2F2012%2F140%2F7%2F1%2Fdebian_tron_back_on_the_grid_by_cra1g321-d50iyz3.png tron the grid wallpaper at DuckDuckGo +http://sherly.mobile9.com/download/media/549/trongrid_cRDJXy1d.jpg trongrid_cRDJXy1d.jpg (1440x1280 pixels) +http://r.duckduckgo.com/l/?kh=-1&uddg=http%3A%2F%2Fsherly.mobile9.com%2Fdownload%2Fmedia%2F549%2Ftrongrid_cRDJXy1d.jpg (null) +https://duckduckgo.com/?q=tron+the+grid+wallpaper&t=hf&iar=images&iax=1&ia=images&iai=http%3A%2F%2Fsherly.mobile9.com%2Fdownload%2Fmedia%2F549%2Ftrongrid_cRDJXy1d.jpg tron the grid wallpaper at DuckDuckGo +http://skins20.wincustomize.com/43/21/4321310/8/47940/preview-8-47940.jpg preview-8-47940.jpg (1920x1080 pixels) +http://r.duckduckgo.com/l/?kh=-1&uddg=http%3A%2F%2Fskins20.wincustomize.com%2F43%2F21%2F4321310%2F8%2F47940%2Fpreview-8-47940.jpg (null) +https://duckduckgo.com/?q=tron+the+grid+wallpaper&t=hf&iar=images&iax=1&ia=images&iai=http%3A%2F%2Fskins20.wincustomize.com%2F43%2F21%2F4321310%2F8%2F47940%2Fpreview-8-47940.jpg tron the grid wallpaper at DuckDuckGo +https://duckduckgo.com/?q=tron+the+grid+wallpaper&t=hf&iar=images&iax=1&ia=images&iai=http%3A%2F%2Fth04.deviantart.net%2Ffs70%2FPRE%2Fi%2F2011%2F010%2Ff%2Fd%2Fthe_grid__tron_wallpaper_by_jericokane-d36vwxt.jpg tron the grid wallpaper at DuckDuckGo +https://duckduckgo.com/?q=snow+crash+wallpaper&t=hf&iar=images snow crash wallpaper at DuckDuckGo +https://duckduckgo.com/?q=neuromancer+wallpaper&t=hf&iar=images&iax=1&ia=images neuromancer wallpaper at DuckDuckGo +https://duckduckgo.com/?q=neuromancer+wallpaper&t=hf&iar=images&iax=1&ia=images&iai=http%3A%2F%2Ffc02.deviantart.net%2Ffs71%2Ff%2F2012%2F036%2Fb%2F5%2Fneuromancer_internauts_by_mrudowski-d4oqbaw.jpg neuromancer wallpaper at DuckDuckGo +https://duckduckgo.com/?q=neuromancer+wallpaper&t=hf&iar=images neuromancer wallpaper at DuckDuckGo +https://duckduckgo.com/?q=%22high+tech+low+life%22+wallpaper&t=hf&iar=images "high tech low life" wallpaper at DuckDuckGo +https://duckduckgo.com/?q=high+tech+low+life+background&t=hf&iar=images high tech low life background at DuckDuckGo +https://duckduckgo.com/?q=high+tech+low+life+wallpaper&t=hf&iar=images high tech low life wallpaper at DuckDuckGo +https://duckduckgo.com/?q=high+tech+low+life&t=hf&iax=1&ia=images high tech low life at DuckDuckGo +https://duckduckgo.com/?q=high+tech+low+life&t=hf&iax=1 high tech low life at DuckDuckGo +https://duckduckgo.com/?q=high+tech+low+life&t=hf high tech low life at DuckDuckGo +https://duckduckgo.com/?q=high+tech+low+life&t=hf&ia=web high tech low life at DuckDuckGo +https://duckduckgo.com/about About DuckDuckGo +http://hqwallbase.online/images/big/black_background_cyberpunk_technology_typography_wallpaper-9595.jpg black_background_cyberpunk_technology_typography_wallpaper-9595.jpg (1280x800 pixels) +http://hqwallbase.online/174142-black-background-cyberpunk-technology-typography-wallpaper/ Black background cyberpunk technology typography wallpaper - (#174142) - High Quality and Resolution Wallpapers on hqwallbase.online +https://www.reddit.com/ reddit: the front page of the internet +http://r.duckduckgo.com/l/?kh=-1&uddg=http%3A%2F%2Fhqwallbase.com%2Fimages%2Fbig%2Fblack_background_cyberpunk_technology_typography_wallpaper-9595.jpg (null) +https://duckduckgo.com/?q=dark+cyberpunk+wallpaper&t=hf&iax=1&iai=http%3A%2F%2Fhqwallbase.com%2Fimages%2Fbig%2Fblack_background_cyberpunk_technology_typography_wallpaper-9595.jpg&ia=images dark cyberpunk wallpaper at DuckDuckGo +https://duckduckgo.com/?q=high+tech+low+life+wallpaper&t=hf&iar=images&iax=1&ia=images high tech low life wallpaper at DuckDuckGo +https://duckduckgo.com/?q=high+tech+low+life+wallpaper&t=hf&iar=images&iax=1&ia=images&iai=http%3A%2F%2Fwww.wallpapermay.com%2Fthumbnails%2Fdetail%2F20120607%2Flife%2520magazine%2520technology%2520cyberpunk%25201280x800%2520wallpaper_www.wallpapermay.com_79.jpg high tech low life wallpaper at DuckDuckGo +https://duckduckgo.com/?q=high+tech+low+life+wallpaper&t=hf&iar=images&iax=1&ia=images&iai=http%3A%2F%2F2.bp.blogspot.com%2F-y7jNrdsedZo%2FUvPBnoGY9DI%2FAAAAAAAAFeI%2FuvqSsJE5Jzc%2Fs1600%2FLow%2BBattery%2BWallpapers.jpg high tech low life wallpaper at DuckDuckGo +http://orig07.deviantart.net/98e8/f/2016/030/b/3/suicide_squad_logo_4k_wallpaper_by_dustinsilver-d9ptzgb.jpg suicide_squad_logo_4k_wallpaper_by_dustinsilver-d9ptzgb.jpg (3840x2160 pixels) +http://r.duckduckgo.com/l/?kh=-1&uddg=http%3A%2F%2Forig07.deviantart.net%2F98e8%2Ff%2F2016%2F030%2Fb%2F3%2Fsuicide_squad_logo_4k_wallpaper_by_dustinsilver-d9ptzgb.jpg (null) +https://duckduckgo.com/?q=suicide+squad+wallpaper&t=hf&iar=images&iax=1&ia=images&iai=http%3A%2F%2Forig07.deviantart.net%2F98e8%2Ff%2F2016%2F030%2Fb%2F3%2Fsuicide_squad_logo_4k_wallpaper_by_dustinsilver-d9ptzgb.jpg suicide squad wallpaper at DuckDuckGo +http://gallsource.com/hd-background/suicide-squad-logo-background-qhd-3200x1800-upscaled/attachment/wgrxbv1# wgrxbv1 - Gallsource.com +http://gallsource.com/hd-background/suicide-squad-logo-background-qhd-3200x1800-upscaled/attachment/wgrxbv1 wgrxbv1 - Gallsource.com +http://gallsource.com/hd-background/suicide-squad-logo-background-qhd-3200x1800-upscaled Suicide Squad Logo Background [QHD+ 3200x1800] (Upscaled), HQ Backgrounds | HD wallpapers Gallery | Gallsource.com +http://r.duckduckgo.com/l/?kh=-1&uddg=http%3A%2F%2Fgallsource.com%2Fhd-background%2Fsuicide-squad-logo-background-qhd-3200x1800-upscaled (null) +http://gallsource.com/wp-content/uploads/2016/04/wgrxbv1.jpg Access denied | gallsource.com used CloudFlare to restrict hotlinking +http://r.duckduckgo.com/l/?kh=-1&uddg=http%3A%2F%2Fgallsource.com%2Fwp-content%2Fuploads%2F2016%2F04%2Fwgrxbv1.jpg (null) +https://duckduckgo.com/?q=suicide+squad+wallpaper&t=hf&iar=images&iax=1&ia=images&iai=http%3A%2F%2Fgallsource.com%2Fwp-content%2Fuploads%2F2016%2F04%2Fwgrxbv1.jpg suicide squad wallpaper at DuckDuckGo +https://duckduckgo.com/?q=suicide+squad+wallpaper&t=hf&iar=images&iax=1&ia=images suicide squad wallpaper at DuckDuckGo +https://duckduckgo.com/settings DuckDuckGo Settings +http://pyratebeard.net/ pyratenet +https://www.reddit.com/r/mead/comments/4xeqqp/found_a_session_mead_in_the_pub/ Found a "session mead" in the pub. : mead +https://www.reddit.com/message/unread/ messages: unread +https://www.reddit.com/user/pyratebeard/ overview for pyratebeard +https://www.reddit.com/r/unixporn /r/unixporn - the home for *NIX customization! +https://duckduckgo.com/?q=dark+cyberpunk+wallpaper&t=hf&iax=1&iai=http%3A%2F%2Fhqwallbase.com%2Fimages%2Fbig%2Fblack_background_cyberpunk_technology_typography_wallpaper-9595.jpg dark cyberpunk wallpaper at DuckDuckGo +https://duckduckgo.com/?q=dark+cyberpunk+wallpaper&t=hf&iax=1 dark cyberpunk wallpaper at DuckDuckGo +https://duckduckgo.com/?q=dark+cyberpunk+wallpaper&t=hf dark cyberpunk wallpaper at DuckDuckGo +https://duckduckgo.com/?q=dark+cyberpunk+wallpaper&t=hf&ia=web dark cyberpunk wallpaper at DuckDuckGo +https://duckduckgo.com/?q=dark+cyberpunk+wallpaper&t=hf&iax=1&ia=images&iai=http%3A%2F%2Fhqwallbase.com%2Fimages%2Fbig%2Fblack_background_cyberpunk_technology_typography_wallpaper-9595.jpg dark cyberpunk wallpaper at DuckDuckGo +https://duckduckgo.com/?q=dark+cyberpunk+wallpaper&t=hf&iax=1&ia=images dark cyberpunk wallpaper at DuckDuckGo +https://duckduckgo.com/?q=suicide+squad+wallpaper&t=hf&iar=images suicide squad wallpaper at DuckDuckGo +https://duckduckgo.com/ DuckDuckGo +https://www.justwatch.com/us/provider/netflix# Netflix - Full list of Movies and TV Shows on JustWatch +https://duckduckgo.com/l/?kh=-1&uddg=https%3A%2F%2Fwww.justwatch.com%2Fus%2Fprovider%2Fnetflix%23! (null) +https://duckduckgo.com/?q=find+movies+on+netflix&t=he&ia=web find movies on netflix at DuckDuckGo +https://duckduckgo.com/?q=find+movies+on+netflix&t=he find movies on netflix at DuckDuckGo +https://protonmail.com/ Secure email: ProtonMail is free encrypted email. +https://www.reddit.com/r/Cyberpunk/comments/2tkks9/best_cyberpunk_showsmovies_on_netflix/ Best cyberpunk shows/movies on Netflix? : Cyberpunk +https://duckduckgo.com/?q=cyberpunk+movies+on+netflix&t=he&ia=web cyberpunk movies on netflix at DuckDuckGo +https://duckduckgo.com/?q=geek+coffee+wallpaper&iar=images&iax=1&ia=images geek coffee wallpaper at DuckDuckGo +https://duckduckgo.com/l/?kh=-1&uddg=https%3A%2F%2Fwww.reddit.com%2Fr%2FCyberpunk%2Fcomments%2F2tkks9%2Fbest_cyberpunk_showsmovies_on_netflix%2F (null) +https://www.yelp.co.uk/biz/umai-sushi-factory-london Umai Sushi Factory - 11 Photos - Japanese Restaurants - Soho - London - Reviews - Phone Number - Yelp +https://duckduckgo.com/l/?kh=-1&uddg=https%3A%2F%2Fwww.yelp.co.uk%2Fbiz%2Fumai-sushi-factory-london (null) +https://duckduckgo.com/?q=umai%20factory%20heating%20up%20bento%20box&t=he umai factory heating up bento box at DuckDuckGo +http://umaifactory.com/menus/3-bento-and-rice-dishes umai sushi factory +http://umaifactory.com/menus/1-sushi-sashimi umai sushi factory +http://umaifactory.com/menus umai sushi factory +http://umaifactory.com/products umai sushi factory +http://umaifactory.com/ umai sushi factory +https://www.japancentre.com/en/stores Japan Centre - STORE FINDER +https://www.japancentre.com/en/search?utf8=%E2%9C%93&kind=product&term=ginger+pork Japan Centre - search results +https://www.japancentre.com/en/search?utf8=%E2%9C%93&kind=product&term=bento+giner+pork Japan Centre - search results +https://www.japancentre.com/en/categories/861-chilled-food Japan Centre - Buy Fresh Japanese Food Online +https://www.japancentre.com/en/categories/10100-food Japan Centre - Japanese Supplier Of Premium Food In UK And Europe +https://www.japancentre.com/en/categories/865-food-kits Japan Centre - Buy Fresh Ingredients For Making Japanese Dishes +https://duckduckgo.com/?q=geek+coffee+wallpaper&iar=images geek coffee wallpaper at DuckDuckGo +https://www.japancentre.com/en/categories/10100-food/page/2?category_ids%5B%5D=10100&category_ids%5B%5D=689&category_ids%5B%5D=1681&category_ids%5B%5D=10902&category_ids%5B%5D=10102&category_ids%5B%5D=701&category_ids%5B%5D=10903&category_ids%5B%5D=697&category_ids%5B%5D=709&category_ids%5B%5D=705&category_ids%5B%5D=10913&category_ids%5B%5D=10915&category_ids%5B%5D=10914&category_ids%5B%5D=10916&category_ids%5B%5D=10906&category_ids%5B%5D=10908&category_ids%5B%5D=10910&category_ids%5B%5D=10907&category_ids%5B%5D=10917&category_ids%5B%5D=10912&category_ids%5B%5D=865&category_ids%5B%5D=861&category_ids%5B%5D=1409&category_ids%5B%5D=10103&category_ids%5B%5D=717&category_ids%5B%5D=725&category_ids%5B%5D=1693&category_ids%5B%5D=1689&category_ids%5B%5D=729&category_ids%5B%5D=721&category_ids%5B%5D=10104&category_ids%5B%5D=769&category_ids%5B%5D=761&category_ids%5B%5D=757&category_ids%5B%5D=765&category_ids%5B%5D=753&category_ids%5B%5D=10105&category_ids%5B%5D=785&category_ids%5B%5D=781&category_ids%5B%5D=777&category_ids%5B%5D=10107&category_ids%5B%5D=829&category_ids%5B%5D=10905&category_ids%5B%5D=825&category_ids%5B%5D=817&category_ids%5B%5D=10108&category_ids%5B%5D=1709&category_ids%5B%5D=857&category_ids%5B%5D=10919&category_ids%5B%5D=10918&category_ids%5B%5D=853&category_ids%5B%5D=845&category_ids%5B%5D=849&category_ids%5B%5D=869&category_ids%5B%5D=1685&category_ids%5B%5D=10981&category_ids%5B%5D=11000&per_page=24 Japan Centre - Japanese Supplier Of Premium Food In UK And Europe +https://duckduckgo.com/?q=cyberpunk+movies+on+netflix&t=he cyberpunk movies on netflix at DuckDuckGo +https://duckduckgo.com/?q=cyberpunk%20movies%20on%20netflix&t=he cyberpunk movies on netflix at DuckDuckGo +https://duckduckgo.com/?q=geek+wallpaper&iar=images geek wallpaper at DuckDuckGo +https://www.japancentre.com/en/categories/10981-japan-centre-products/page/2?category_ids%5B%5D=10981&per_page=24 Japan Centre - Japan Centre Products +https://www.japancentre.com/en/categories/10981-japan-centre-products Japan Centre - Japan Centre Products +https://www.japancentre.com/en/categories/929-bento?category_ids%5B%5D=929&per_page=24&tag_ids%5B%5D=168 Japan Centre - Buy Traditional Japanese Bento Boxes Online +https://www.japancentre.com/en/categories/929-bento Japan Centre - Buy Traditional Japanese Bento Boxes Online +https://duckduckgo.com/l/?kh=-1&uddg=https%3A%2F%2Fwww.japancentre.com%2Fen%2Fcategories%2F929-bento (null) +https://duckduckgo.com/?q=japan+centre+bento+boxes&t=he&ia=web japan centre bento boxes at DuckDuckGo +https://duckduckgo.com/?q=japan+centre+bento+boxes&t=he japan centre bento boxes at DuckDuckGo +https://duckduckgo.com/?q=japan%20centre%20bento%20boxes&t=he japan centre bento boxes at DuckDuckGo +https://duckduckgo.com/?q=gekk+wallpaper&iar=images gekk wallpaper at DuckDuckGo +https://duckduckgo.com/?q=8bit+wallpaper&iax=1&ia=images&iai=http%3A%2F%2Fwallup.net%2Fwp-content%2Fuploads%2F1413981376.jpg 8bit wallpaper at DuckDuckGo +http://orig05.deviantart.net/513f/f/2013/192/1/2/8_bit_city_wallpaper_background_1920x1280_by_nerdboarder-d6d0sq2.jpg 8_bit_city_wallpaper_background_1920x1280_by_nerdboarder-d6d0sq2.jpg (1920x1280 pixels) +http://r.duckduckgo.com/l/?kh=-1&uddg=http%3A%2F%2Ffc03.deviantart.net%2Ffs70%2Ff%2F2013%2F192%2F1%2F2%2F8_bit_city_wallpaper_background_1920x1280_by_nerdboarder-d6d0sq2.jpg (null) +https://duckduckgo.com/?q=8bit+wallpaper&iax=1&ia=images&iai=http%3A%2F%2Ffc03.deviantart.net%2Ffs70%2Ff%2F2013%2F192%2F1%2F2%2F8_bit_city_wallpaper_background_1920x1280_by_nerdboarder-d6d0sq2.jpg 8bit wallpaper at DuckDuckGo +https://duckduckgo.com/?q=8bit+wallpaper&iax=1&ia=images 8bit wallpaper at DuckDuckGo +https://duckduckgo.com/?q=8bit+wallpaper&iax=1 8bit wallpaper at DuckDuckGo +https://duckduckgo.com/?q=8bit+wallpaper 8bit wallpaper at DuckDuckGo +https://duckduckgo.com/?q=8bit+wallpaper&ia=web 8bit wallpaper at DuckDuckGo +https://duckduckgo.com/?q=8bit+cyberpunk+wallpaper&iar=images&ia=images 8bit cyberpunk wallpaper at DuckDuckGo +https://duckduckgo.com/?q=8bit+cyberpunk+wallpaper&iar=images 8bit cyberpunk wallpaper at DuckDuckGo +https://duckduckgo.com/?q=cyberpunk+pixel+wallpaper&iar=images&iax=1&ia=images&iai=http%3A%2F%2Fx3.cdn03.imgwykop.pl%2Fc3201142%2Fcomment_GZ78XP445BmQbD1QWx0dlqyab3eo7iBl.jpg cyberpunk pixel wallpaper at DuckDuckGo +https://duckduckgo.com/?q=cyberpunk+pixel+wallpaper&iar=images&iax=1&ia=images&iai=http%3A%2F%2Forig01.deviantart.net%2Fb8f3%2Ff%2F2015%2F033%2F5%2Fb%2Fcyberpunk_city_8_bit_version_by_kirokaze-d8gebj4.gif cyberpunk pixel wallpaper at DuckDuckGo +http://33.media.tumblr.com/d07fe7cab009ab15c44a68a7ba12271c/tumblr_inline_ndyef9N4DF1sm9nnd.gif tumblr_inline_ndyef9N4DF1sm9nnd.gif (500x267 pixels) +http://r.duckduckgo.com/l/?kh=-1&uddg=http%3A%2F%2F33.media.tumblr.com%2Fd07fe7cab009ab15c44a68a7ba12271c%2Ftumblr_inline_ndyef9N4DF1sm9nnd.gif (null) +https://duckduckgo.com/?q=cyberpunk+pixel+wallpaper&iar=images&iax=1&ia=images&iai=http%3A%2F%2F33.media.tumblr.com%2Fd07fe7cab009ab15c44a68a7ba12271c%2Ftumblr_inline_ndyef9N4DF1sm9nnd.gif cyberpunk pixel wallpaper at DuckDuckGo +https://duckduckgo.com/?q=cyberpunk+pixel+wallpaper&iar=images&iax=1&ia=images cyberpunk pixel wallpaper at DuckDuckGo +https://duckduckgo.com/?q=cyberpunk+pixel+wallpaper&iar=images cyberpunk pixel wallpaper at DuckDuckGo +https://duckduckgo.com/?q=neon+cyberpunk+wallpaper&iar=images neon cyberpunk wallpaper at DuckDuckGo +https://duckduckgo.com/?q=neon+wallpaper&iar=images neon wallpaper at DuckDuckGo +https://duckduckgo.com/?q=neon+map+wallpaper&iar=images neon map wallpaper at DuckDuckGo +https://duckduckgo.com/?q=cyberpunk+map+wallpaper&iar=images&iax=1&ia=images cyberpunk map wallpaper at DuckDuckGo +https://duckduckgo.com/?q=cyberpunk+map+wallpaper&iar=images cyberpunk map wallpaper at DuckDuckGo +https://duckduckgo.com/?q=cyberpunk%20map&ia=images&iax=1 cyberpunk map at DuckDuckGo +https://duckduckgo.com/l/?kh=-1&uddg=https%3A%2F%2Fduckduckgo.com%2F%3Fq%3Dcyberpunk%2520map%26ia%3Dimages%26iax%3D1 (null) +https://duckduckgo.com/?q=%21ddgi%20cyberpunk%20map&t=he (null) +http://imgur.com/D5rtBzF Imgur: The most awesome images on the Internet +https://duckduckgo.com/?q=black+hacker+wallpaper&iar=images&ia=images&iax=1&iai=http%3A%2F%2Fimages.anandtech.com%2Fdoci%2F5656%2FDSC_5696_575px.JPG black hacker wallpaper at DuckDuckGo +http://www.wallpaperup.com/uploads/wallpapers/2015/05/04/678571/658bc838369e730ad523a6726c0767dd.jpg 658bc838369e730ad523a6726c0767dd.jpg (1920x1080 pixels) +http://www.wallpaperup.com/uploads/wallpapers/2015/05/04/678546/a55546e2dd4259a2d18eca0ecb630177.jpg a55546e2dd4259a2d18eca0ecb630177.jpg (1920x1080 pixels) +http://r.duckduckgo.com/l/?kh=-1&uddg=http%3A%2F%2Fwww.wallpaperup.com%2Fuploads%2Fwallpapers%2F2015%2F05%2F04%2F678546%2Fa55546e2dd4259a2d18eca0ecb630177.jpg (null) +http://1.bp.blogspot.com/-A881IoUAsCI/T6SBD4j1HiI/AAAAAAAAATc/ew7KD2N92qI/s1600/hacker_.gif hacker_.gif (1039x785 pixels) +http://www.technobuffalo.com/wp-content/uploads/2013/10/Hacking-Glitching-Text-1280x720.jpg Hacking-Glitching-Text-1280x720.jpg (1280x720 pixels) +http://r.duckduckgo.com/l/?kh=-1&uddg=http%3A%2F%2Fwww.technobuffalo.com%2Fwp-content%2Fuploads%2F2013%2F10%2FHacking-Glitching-Text-1280x720.jpg (null) +https://duckduckgo.com/?q=black+hacker+wallpaper&iar=images&ia=images&iax=1&iai=http%3A%2F%2Fwww.technobuffalo.com%2Fwp-content%2Fuploads%2F2013%2F10%2FHacking-Glitching-Text-1280x720.jpg black hacker wallpaper at DuckDuckGo +https://duckduckgo.com/?q=black+hacker+wallpaper&iar=images&ia=images&iax=1&iai=http%3A%2F%2Fwww.wallpaperup.com%2Fuploads%2Fwallpapers%2F2015%2F05%2F04%2F678546%2Fa55546e2dd4259a2d18eca0ecb630177.jpg black hacker wallpaper at DuckDuckGo +https://duckduckgo.com/?q=black+hacker+wallpaper&iar=images&ia=images&iax=1&iai=http%3A%2F%2F1.bp.blogspot.com%2F-A881IoUAsCI%2FT6SBD4j1HiI%2FAAAAAAAAATc%2Few7KD2N92qI%2Fs1600%2Fhacker_.gif black hacker wallpaper at DuckDuckGo +http://r.duckduckgo.com/l/?kh=-1&uddg=http%3A%2F%2Fwww.wallpaperup.com%2Fuploads%2Fwallpapers%2F2015%2F05%2F04%2F678571%2F658bc838369e730ad523a6726c0767dd.jpg (null) +https://duckduckgo.com/?q=black+hacker+wallpaper&iar=images&ia=images&iax=1&iai=http%3A%2F%2Fwww.wallpaperup.com%2Fuploads%2Fwallpapers%2F2015%2F05%2F04%2F678571%2F658bc838369e730ad523a6726c0767dd.jpg black hacker wallpaper at DuckDuckGo +http://r.duckduckgo.com/l/?kh=-1&uddg=http%3A%2F%2Fi.imgur.com%2FD5rtBzF.jpg (null) +https://duckduckgo.com/?q=black+hacker+wallpaper&iar=images&ia=images&iax=1&iai=http%3A%2F%2Fi.imgur.com%2FD5rtBzF.jpg black hacker wallpaper at DuckDuckGo +https://duckduckgo.com/?q=black+hacker+wallpaper&iar=images&ia=images black hacker wallpaper at DuckDuckGo +https://duckduckgo.com/l/?kh=-1&uddg=https%3A%2F%2Fduckduckgo.com%2F%3Fq%3Dblack%2520wallpaper%26ia%3Dimages%26iax%3D1 (null) +https://duckduckgo.com/?q=%21ddgi%20black%20wallpaper&t=he (null) +http://ddg.gg/ Error +https://imgur.com/a/hcarv Who said BSPWM couldn't have 3 borders? - Album on Imgur +http://unix.stackexchange.com/questions/216925/nmi-received-for-unknown-reason-20-do-you-have-a-strange-power-saving-mode-ena linux - NMI received for unknown reason 20 — Do you have a strange power saving mode enabled? - Unix & Linux Stack Exchange +https://duckduckgo.com/?q=linux+syslogd+NMI+received+for+unknown+reason+20&t=hf linux syslogd NMI received for unknown reason 20 at DuckDuckGo +http://r.duckduckgo.com/l/?kh=-1&uddg=http%3A%2F%2Funix.stackexchange.com%2Fquestions%2F216925%2Fnmi-received-for-unknown-reason-20-do-you-have-a-strange-power-saving-mode-ena (null) +https://www.hightail.com/download/cUJVblRvQTZ6NE5FQmRVag Download - Hightail +http://scarygliders.net/2011/12/01/customize-xterm-the-original-and-best-terminal/ Customize Xterm, the original and best terminal... - Scarygliders +http://scarygliders.net/ Scarygliders - Hardware, Software & Life hacking, random everything. +https://gp.amer.csc.com/siteminderagent/forms/login5.fcc?TYPE=33554433&REALMOID=06-12a2fc84-51e3-1143-9e5f-83815e590000&GUID=&SMAUTHREASON=0&METHOD=GET&SMAGENTNAME=cscgplndc003_iis_agent&TARGET=-SM-HTTPS%3a%2f%2fgp%2eamer%2ecsc%2ecom%2fsiteminderagent%2fredirectjsp%2fredirectC3PHX%2ejsp%3fSPID%3durn-%3Ac3-%3Aprod%26RelayState%3dhttps-%3A-%2F-%2Fc3%2ecsc%2ecom-%2F-%252Findex%2ejspa%26SMPORTALURL%3dhttps-%3A-%2F-%2Fgp%2eamer%2ecsc%2ecom-%3A443-%2Faffwebservices-%2Fpublic-%2Fsaml2sso CSC Global Pass - Login +https://c3.csc.com/welcome Welcome | Home +https://gp.amer.csc.com/affwebservices/public/saml2sso?SMASSERTIONREF=QUERY&SPID=urn:c3:prod&RelayState=https://c3.csc.com//index.jspa (null) +https://gp.amer.csc.com/siteminderagent/forms/login_error5.fcc CSC Global Pass - Login +https://gp.amer.csc.com/siteminderagent/forms/login5.fcc?TYPE=33554433&REALMOID=06-12a2fc84-51e3-1143-9e5f-83815e590000&GUID=&SMAUTHREASON=0&METHOD=GET&SMAGENTNAME=cscgplndc008_iis_agent&TARGET=-SM-HTTPS%3a%2f%2fgp%2eamer%2ecsc%2ecom%2fsiteminderagent%2fredirectjsp%2fredirectC3PHX%2ejsp%3fSPID%3durn-%3Ac3-%3Aprod%26RelayState%3dhttps-%3A-%2F-%2Fc3%2ecsc%2ecom-%2F-%252Findex%2ejspa%26SMPORTALURL%3dhttps-%3A-%2F-%2Fgp%2eamer%2ecsc%2ecom-%3A443-%2Faffwebservices-%2Fpublic-%2Fsaml2sso CSC Global Pass - Login +https://www.google.co.uk/?gws_rd=ssl Error +https://duckduckgo.com/?q=jurassic+world+wave+logo&iax=1&ia=images jurassic world wave logo at DuckDuckGo +https://duckduckgo.com/?q=jurassic+world+wave+logo&iax=1 jurassic world wave logo at DuckDuckGo +https://duckduckgo.com/?q=jurassic+world+wave+logo jurassic world wave logo at DuckDuckGo +https://duckduckgo.com/?q=jurassic+world+wave+logo&ia=web jurassic world wave logo at DuckDuckGo +https://duckduckgo.com/?q=linux+device+eth0+does+not+seem+to+be+present linux device eth0 does not seem to be present at DuckDuckGo +http://www.linuxquestions.org/questions/linux-networking-3/cifs-mount-error-13-%3D-permission-denied-cifs-sucks-463271/ Cifs "mount error 13 = Permission denied" CIFS SUCKS +http://www.cyberciti.biz/faq/howto-linux-rename-ethernet-devices-named-using-udev/ Linux Rename Eth0 Network Interface Card Name [ Udev ] +http://microdevsys.com/wp/device-eth0-does-not-seem-to-be-present-delaying-initialization-linux-networking/ Device eth0 does not seem to be present, delaying initialization: Linux Networking | Thoughts and Scribbles | MicroDevSys.com +http://r.duckduckgo.com/l/?kh=-1&uddg=http%3A%2F%2Fmicrodevsys.com%2Fwp%2Fdevice-eth0-does-not-seem-to-be-present-delaying-initialization-linux-networking%2F (null) +http://r.duckduckgo.com/l/?kh=-1&uddg=http%3A%2F%2Fwww.cyberciti.biz%2Ffaq%2Fhowto-linux-rename-ethernet-devices-named-using-udev%2F (null) +https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/3/html/Reference_Guide/s1-networkscripts-interfaces.html Interface Configuration Files +https://duckduckgo.com/l/?kh=-1&uddg=https%3A%2F%2Faccess.redhat.com%2Fdocumentation%2Fen-US%2FRed_Hat_Enterprise_Linux%2F3%2Fhtml%2FReference_Guide%2Fs1-networkscripts-interfaces.html (null) +http://r.duckduckgo.com/l/?kh=-1&uddg=http%3A%2F%2Fkb.kristianreese.com%2Findex.php%3FView%3Dentry%26EntryID%3D64 (null) +https://duckduckgo.com/?q=linux+incorrect+eth+device+number linux incorrect eth device number at DuckDuckGo +http://www.linuxquestions.org/questions/fedora-35/unknown-filesystem-type-smbfs-512309/ unknown filesystem type smbfs +http://r.duckduckgo.com/l/?kh=-1&uddg=http%3A%2F%2Fwww.linuxquestions.org%2Fquestions%2Ffedora-35%2Funknown-filesystem-type-smbfs-512309%2F (null) +https://duckduckgo.com/?q=linux+smbfs+unknown+filesystem linux smbfs unknown filesystem at DuckDuckGo +http://r.duckduckgo.com/l/?kh=-1&uddg=http%3A%2F%2Fwww.linuxquestions.org%2Fquestions%2Flinux-networking-3%2Fcifs-mount-error-13-%253D-permission-denied-cifs-sucks-463271%2F (null) +https://duckduckgo.com/?q=linux+cifs+share+permission+denied linux cifs share permission denied at DuckDuckGo +http://pyratebeard.net/mcc/ pyratenet +http://pyratebeard.net/powerzone/ pyratenet +http://www.theregister.co.uk/ The Register: Sci/Tech News for the World +http://www.imdb.com/ IMDb - Movies, TV and Celebrities - IMDb +http://geektyrant.com/news/10-deadpool-jokes-that-didnt-make-the-final-cut-of-the-film 10 DEADPOOL Jokes That Didn't Make the Final Cut of the Film — GeekTyrant +https://duckduckgo.com/?q=linux+dwb+theme linux dwb theme at DuckDuckGo +http://geektyrant.com/ GeekTyrant – Geek Movie and Entertainment News diff --git a/dwb/.config/dwb/default/hsts b/dwb/.config/dwb/default/hsts diff --git a/dwb/.config/dwb/default/navigate.history b/dwb/.config/dwb/default/navigate.history @@ -0,0 +1,9 @@ +ddg umai factory heating up bento box +umaifactory.com +ddg !ddgi black wallpaper +ddg.gg +Sk +ddg +reddit.com/r/unixporn +https://www.hightail.com/download/cUJVblRvQTZ6NE5FQmRVag +http://scarygliders.net/2011/12/01/customize-xterm-the-original-and-best-terminal diff --git a/dwb/.config/dwb/default/plugindb b/dwb/.config/dwb/default/plugindb diff --git a/dwb/.config/dwb/default/plugins.allow b/dwb/.config/dwb/default/plugins.allow diff --git a/dwb/.config/dwb/default/quickmarks b/dwb/.config/dwb/default/quickmarks diff --git a/dwb/.config/dwb/default/scripts.allow b/dwb/.config/dwb/default/scripts.allow diff --git a/dwb/.config/dwb/default/search.history b/dwb/.config/dwb/default/search.history @@ -0,0 +1,3 @@ +setting +settin +search diff --git a/dwb/.config/dwb/default/session b/dwb/.config/dwb/default/session @@ -0,0 +1,42 @@ +g:*default +-23 https://duckduckgo.com/ DuckDuckGo +-22 https://duckduckgo.com/settings DuckDuckGo Settings +-21 https://duckduckgo.com/?q=ddg&t=he&ia=web +-20 https://duckduckgo.com/ DuckDuckGo +-19 https://duckduckgo.com/?q=Sk&t=he Sk at DuckDuckGo +-18 https://duckduckgo.com/ DuckDuckGo +-17 https://duckduckgo.com/settings DuckDuckGo Settings +-16 https://duckduckgo.com/ DuckDuckGo +-15 https://duckduckgo.com/settings DuckDuckGo Settings +-14 https://duckduckgo.com/ DuckDuckGo +-13 https://duckduckgo.com/?q=dark+cyberpunk+wallpaper&t=hf&iax=1&iai=http%3A%2F%2Fhqwallbase.com%2Fimages%2Fbig%2Fblack_background_cyberpunk_technology_typography_wallpaper-9595.jpg&ia=images +-12 https://duckduckgo.com/?t=hf DuckDuckGo +-11 https://duckduckgo.com/?q=high+tech+low+life&t=hf&iax=1&ia=images +-10 https://duckduckgo.com/?q=high+tech+low+life+wallpaper&t=hf&iar=images&iax=1&ia=images +-9 https://duckduckgo.com/?q=high+tech+low+life+background&t=hf&iar=images&iax=1&ia=images +-8 https://duckduckgo.com/?q=%22high+tech+low+life%22+wallpaper&t=hf&iar=images&iax=1&ia=images +-7 https://duckduckgo.com/?q=neuromancer+wallpaper&t=hf&iar=images&iax=1&ia=images +-6 https://duckduckgo.com/?q=snow+crash+wallpaper&t=hf&iar=images&iax=1&ia=images +-5 https://duckduckgo.com/?q=tron+the+grid+wallpaper&t=hf&iar=images&ia=images +-4 https://duckduckgo.com/?q=tron+dark+wallpaper&t=hf&iax=1&ia=images +-3 https://duckduckgo.com/?q=cyber+dark+wallpaper&t=hf&iar=images&iax=1&ia=images +-2 https://duckduckgo.com/?q=dark+hacker+wallpaper&t=hf&iar=images&iax=1&ia=images +-1 https://duckduckgo.com/?q=hack+the+planet+wallpaper&t=hf&iar=images&iax=1&ia=images +0|0 https://duckduckgo.com/?t=hf DuckDuckGo +-11 https://github.com/ How people build software · GitHub +-10 https://github.com/login Sign in to GitHub · GitHub +-9 https://github.com/sessions/two-factor GitHub · Where software is built +-8 https://github.com/sessions/two-factor GitHub · Where software is built +-7 https://github.com/ GitHub +-6 https://github.com/pyratebeard pyratebeard (Dudley) +-5 https://github.com/pyratebeard?tab=repositories pyratebeard (Dudley) +-4 https://github.com/pyratebeard/ssh_scraper pyratebeard/ssh_scraper +-3 https://github.com/pyratebeard/ssh_scraper/settings Options +-2 https://github.com/pyratebeard/scraper pyratebeard/scraper +-1 https://github.com/pyratebeard pyratebeard (Dudley) +0|0 https://github.com/pyratebeard?tab=repositories pyratebeard (Dudley) +-1 https://www.reddit.com/r/mead/comments/4xeqqp/found_a_session_mead_in_the_pub/ Found a "session mead" in the pub. : mead +0|0 https://www.reddit.com/ reddit: the front page of the internet +0|0 http://hqwallbase.online/images/big/black_background_cyberpunk_technology_typography_wallpaper-9595.jpg black_background_cyberpunk_technology_typography_wallpaper-9595.jpg (1280x800 pixels) +0|0 http://pyratebeard.net/ pyratenet +1 dwb:keys dwb - Keys diff --git a/dwb/.config/dwb/keys b/dwb/.config/dwb/keys @@ -0,0 +1,175 @@ +[default] +save_search_field= gs +tab_new= ga +allow_session_cookie_tmp= CT +allow_cookie= CC +allow_session_cookie= CS +bookmark= M +buffers= gt +cancel_download= ad +sanitize= +clear_tab= gc +only= co +close_tab= d +entry_escape=Control c +entry_confirm=Control g +entry_history_back=Control k +entry_history_forward=Control j +entry_delete_letter=Control h +entry_delete_active=Control d +entry_delete_line=Control u +entry_delete_line_end=Control e +entry_delete_word=Control w +entry_delete_word_forward=Control e +entry_word_back=Control b +entry_word_forward=Control f +complete_bookmarks=Control B +complete_history=Control H +complete_path=Control p +complete_searchengines=Control S +complete_userscript=Control U +download= gd +download_set_execute=Control x +command_mode= : +tabdo= +execute_javascript= +eval= +execute_userscript= eu +find_backward_ic= c? +find_backward= ? +find_forward_ic= c/ +find_forward= / +find_next= n +find_previous= N +tabgrep= +focus_input= gi +focus_next= J +focus_tab= T +focus_prev= K +win_hist_back= wh +tab_hist_back= th +history_back= H +win_hist_forward= wl +tab_hist_forward= tl +history_forward= L +insert_mode= i +jump= ' +show_keys= Sk +load_html= +load_html_tab= +lock_domain= xd +lock_uri= xu +mark= ` +tab_move_left= gl +tab_move_right= gr +tab_move= gm +normal_mode=Control n +open_editor=Control e +quickmark= b +tab_quickmark= B +win_quickmark= wb +start_page=Control h +web_inspector= wi +paste= pp +tab_paste= Pp +win_paste= wp +paste_primary= pP +win_paste_primary= wP +tab_paste_primary= PP +print=Control Mod1 p +protect=Control P +quit=Control q +adblock_reload_rules= +reload_bookmarks= +reload= r +reload_bypass_cache= R +reload_quickmarks= +reload_userscripts= +repeat= . +save= sf +save_session= ZZ +save_named_session= gZZ +save_quickmark= m +scroll_down= j +scroll_right= l +scroll_left= h +scroll_page_down=Control f +scroll_page_up=Control b +scroll_halfpage_down=Control d +scroll_halfpage_up=Control u +scroll_bottom= G +scroll_top= gg +scroll_up= k +local_set= +set= +set_key= sk +set_local_setting= sl +set_setting= ss +show_settings= Ss +print_preview= +show_bookmarks= Sb +show_downloads= Sd +show_history= Sh +show_quickmarks= Sq +stop_loading=Control s +toggle_local_setting= +toggle_setting= +toggle_tab=Control @Tab@ +toggle_plugins_host_tmp= pth +toggle_scripts_host= tsh +toggle_scripts_host_tmp= tth +toggle_scripts_uri= tsu +toggle_plugins_uri_tmp= ptu +toggle_scripts_uri_tmp= ttu +fullscreen= @F11@ +toggle_hidden_files= g. +toggle_plugins_host= ph +toggle_plugins_uri= pu +presentation_mode= @F12@ +proxy=Control p +visible= xv +toggle_bars= xx +toggle_statusbar= xb +toggle_tabbar= xt +undo= u +view_source= gf +visual_mode= v +dump= +yank_title= yt +yank_title_primary= yT +yank= yy +yank_primary= yY +zoom= = +zoom_in= + +zoom_out= - +hints_background= ;b +hints_images_background= ;Ib +hints_url_background= ;Ob +backopen_url= xO +backopen= xo +bookmarks= gb +hints_selector= +hints= f +hints_clipboard= ;y +hints_download= ;d +hints_editable= ;e +hints_images= ;i +hints_links= ;; +hints_primary= ;Y +hints_rapid= ;r +hints_url= ;o +new_tab=Control T +new_win= W +open_url= go +open= o +hints_tab= F +hints_images_tab= ;It +hints_url_tab= ;Ot +tab_bookmarks= gB +tabopen_url= gO +tabopen= O +hints_win= wf +hints_rapid_win= ;R +win_bookmarks= wB +winopen_url= wO +winopen= wo diff --git a/dwb/.config/dwb/mimetypes b/dwb/.config/dwb/mimetypes diff --git a/dwb/.config/dwb/searchengines b/dwb/.config/dwb/searchengines @@ -0,0 +1 @@ +duck https://duckduckgo.com/?q=_dwb_search_submit_&t=he diff --git a/dwb/.config/dwb/settings b/dwb/.config/dwb/settings @@ -0,0 +1,162 @@ +[default] +download-bg-color=#212121 +download-fg-color=#01c8e5 +startpage=dwb:keys +javascript-can-access-clipboard=false +hint-offset-top=0 +file-sync-interval=120 +download-gradient-end=#00aa00 +status-allowed-color=#00ff00 +tab-number-color=#7ac5cd +enable-default-context-menu=true +editable=false +background-tabs=false +enable-webgl=false +minimum-logical-font-size=5 +enable-page-cache=false +cache-model=webbrowser +sans-serif-font-family=sans-serif +prompt-color=#00ff00 +complete-searchengines=false +update-search-delay=200 +fantasy-font-family=serif +hint-fg-color=#000000 +sync-files=all +default-height=600 +javascript-api=automatic +scrollbars=false +hint-bg-color=#ffffff +show-single-tab=true +private-color=#505050 +enable-developer-extras=false +complete-bookmarks=true +zoom-level=1.00 +download-use-external-program=false +enable-xss-auditor=true +custom-encoding= +print-previewer= +normal-completion-fg-color=#eeeeee +close-tab-focus-policy=left +enable-dns-prefetching=true +new-tab-position-policy=right +mouse-cycles-through-tabs=true +auto-shrink-images=true +print-backgrounds=true +enable-caret-browsing=false +enable-scripts=true +adblocker-filterlist= +proxy=false +user-agent= +full-content-zoom=false +editor=xterm -e vim dwb_uri +hsts=false +enable-private-browsing=false +enable-favicon=true +hint-active-color=#00ff00 +resizable-text-areas=true +javascript-schemes=true +load-on-focus=false +adblocker-element-hider=true +download-gradient-start=#0000aa +hint-normal-color=#ffff99 +spell-checking-languages= +cookies-accept-policy=always +font-nofocus= +status-blocked-color=#ffffff +enable-plugins=true +tabbar-height=0 +enable-frame-flattening=false +statusbar-height=0 +ssl-use-system-ca-file=true +cookies-store-policy=session +bars-padding=0 +active-completion-fg-color=#53868b +hint-font=bold 10px monospace +progress-bar-full-color=#ffffff +tabbed-browsing=true +hint-highlight-links=false +active-completion-bg-color=#000000 +enable-spell-checking=false +font-hidden-statusbar=normal 10px helvetica +tab-normal-fg-color-2=#dddddd +tab-normal-fg-color-1=#cccccc +default-monospace-font-size=10 +save-session=true +enable-ipc=true +tabbar-visible=2.00 +auto-insert-mode=false +tab-normal-bg-color-2=#707070 +tab-normal-bg-color-1=#505050 +serif-font-family=serif +accept-language= +enable-html5-local-storage=true +tab-protected-color=#ff0000 +hint-letter-seq=FDSARTGBVECWXQYIOPMNHZULKJ +progress-bar-style=default +maximum-tabs=0 +passthrough-keys=webkit +enable-html5-database=true +hint-autofollow=true +enable-dom-paste=false +javascript-can-open-windows-automatically=false +max-visible-completions=11 +hint-border=1px solid #000000 +widget-packing=dtws +favicon-size=0 +ssl-trusted-color=#00ff00 +enable-java-applet=true +hints-key-lock=250 +navigation-history-max=500 +hint-style=letter +enable-site-specific-quirks=false +auto-resize-window=false +zoom-step=0.10 +default-font-family=sans-serif +ssl-untrusted-color=#ff0000 +plugin-blocker=true +normal-completion-bg-color=#151515 +cookie-expiration=0 +cursive-font-family=serif +default-encoding= +error-color=#ff0000 +searchengine-submit-pattern= +hint-opacity=0.80 +font-entry= +proxy-url= +font=Tamsyn 11 +monospace-font-family=Tamsyn +addressbar-dns-lookup=false +enable-universal-access-from-file-uris=true +background-color=#000000 +do-not-track=true +progress-bar-empty-color=#ffffff +default-width=800 +single-instance=true +auto-completion=false +minimum-font-size=11 +font-completion= +enable-spatial-navigation=false +block-insecure-content=false +download-directory=/media/data_01/downloads +adblocker=false +download-external-command=xterm -e wget dwb_uri -O dwb_output --load-cookies dwb_cookies +user-stylesheet-uri= +auto-load-images=true +tab-active-fg-color=#ffffff +hint-offset-left=0 +history-length=500 +tab-active-bg-color=#000000 +download-no-confirm=false +enable-file-access-from-file-uris=true +complete-history=true +close-last-tab-policy=ignore +tab-key-cycles-through-elements=true +enforce-96-dpi=false +ssl-strict=true +scroll-step=0.00 +complete-userscripts=false +foreground-color=#ffffff +message-delay=2 +scheme-handler= +default-font-size=12 +enable-offline-web-application-cache=true diff --git a/gtk/README b/gtk/README @@ -0,0 +1,4 @@ +## Config files to allow gtk theme in awesome + +# mv all files into /home/<user> +# Put theme name in .gtkrc.mine diff --git a/gtk/gtkrc-1.2-gnome2 b/gtk/gtkrc-1.2-gnome2 @@ -0,0 +1 @@ +include '/home/dudley/.gtkrc.mine' diff --git a/gtk/gtkrc-2.0 b/gtk/gtkrc-2.0 @@ -0,0 +1 @@ +include '/home/dudley/.gtkrc.mine' diff --git a/gtk/gtkrc.mine b/gtk/gtkrc.mine @@ -0,0 +1 @@ +gtk-theme-name = "Mist-warlock" diff --git a/irssi/.irssi/config b/irssi/.irssi/config @@ -0,0 +1,386 @@ +servers = ( + { address = "irc.dal.net"; chatnet = "DALnet"; port = "6667"; }, + { address = "irc.efnet.org"; chatnet = "EFNet"; port = "6667"; }, + { address = "irc.esper.net"; chatnet = "EsperNet"; port = "6667"; }, + { + address = "irc.freenode.net"; + chatnet = "Freenode"; + port = "6665"; + }, + { + address = "irc.gamesurge.net"; + chatnet = "GameSurge"; + port = "6667"; + }, + { address = "eu.irc6.net"; chatnet = "IRCnet"; port = "6667"; }, + { address = "open.ircnet.net"; chatnet = "IRCnet"; port = "6667"; }, + { + address = "irc.ircsource.net"; + chatnet = "IRCSource"; + port = "6667"; + }, + { address = "irc.netfuze.net"; chatnet = "NetFuze"; port = "6667"; }, + { address = "irc.oftc.net"; chatnet = "OFTC"; port = "6667"; }, + { + address = "irc.quakenet.org"; + chatnet = "QuakeNet"; + port = "6667"; + }, + { address = "irc.rizon.net"; chatnet = "Rizon"; port = "6667"; }, + { address = "silc.silcnet.org"; chatnet = "SILC"; port = "706"; }, + { + address = "irc.undernet.org"; + chatnet = "Undernet"; + port = "6667"; + } +); + +chatnets = { + DALnet = { + type = "IRC"; + max_kicks = "4"; + max_msgs = "20"; + max_whois = "30"; + }; + EFNet = { + type = "IRC"; + max_kicks = "1"; + max_msgs = "4"; + max_whois = "1"; + }; + EsperNet = { + type = "IRC"; + max_kicks = "1"; + max_msgs = "4"; + max_whois = "1"; + }; + Freenode = { + type = "IRC"; + max_kicks = "1"; + max_msgs = "4"; + max_whois = "1"; + }; + GameSurge = { + type = "IRC"; + max_kicks = "1"; + max_msgs = "1"; + max_whois = "1"; + }; + IRCnet = { + type = "IRC"; + max_kicks = "1"; + max_msgs = "1"; + max_whois = "1"; + }; + IRCSource = { + type = "IRC"; + max_kicks = "1"; + max_msgs = "4"; + max_whois = "1"; + }; + NetFuze = { + type = "IRC"; + max_kicks = "1"; + max_msgs = "1"; + max_whois = "1"; + }; + OFTC = { type = "IRC"; max_kicks = "1"; max_msgs = "1"; max_whois = "1"; }; + QuakeNet = { + type = "IRC"; + max_kicks = "1"; + max_msgs = "1"; + max_whois = "1"; + }; + Rizon = { + type = "IRC"; + max_kicks = "1"; + max_msgs = "1"; + max_whois = "1"; + }; + SILC = { type = "SILC"; }; + Undernet = { + type = "IRC"; + max_kicks = "1"; + max_msgs = "1"; + max_whois = "1"; + }; +}; + +channels = ( + { name = "#lobby"; chatnet = "EsperNet"; autojoin = "No"; }, + { name = "#freenode"; chatnet = "Freenode"; autojoin = "No"; }, + { name = "#irssi"; chatnet = "Freenode"; autojoin = "No"; }, + { name = "#gamesurge"; chatnet = "GameSurge"; autojoin = "No"; }, + { name = "#irssi"; chatnet = "IRCNet"; autojoin = "No"; }, + { name = "#ircsource"; chatnet = "IRCSource"; autojoin = "No"; }, + { name = "#netfuze"; chatnet = "NetFuze"; autojoin = "No"; }, + { name = "#oftc"; chatnet = "OFTC"; autojoin = "No"; }, + { name = "silc"; chatnet = "SILC"; autojoin = "No"; }, + { name = "##linux"; chatnet = "Freenode"; autojoin = "Yes"; } +); + +aliases = { + ATAG = "WINDOW SERVER"; + ADDALLCHANS = "SCRIPT EXEC foreach my \\$channel (Irssi::channels()) { Irssi::command(\"CHANNEL ADD -auto \\$channel->{name} \\$channel->{server}->{tag} \\$channel->{key}\")\\;}"; + B = "BAN"; + BACK = "AWAY"; + BANS = "BAN"; + BYE = "QUIT"; + C = "CLEAR"; + CALC = "EXEC - if command -v bc >/dev/null 2>&1\\; then printf '%s=' '$*'\\; echo '$*' | bc -l\\; else echo bc was not found\\; fi"; + CHAT = "DCC CHAT"; + CUBES = "SCRIPT EXEC Irssi::active_win->print(\"%_bases\", MSGLEVEL_CLIENTCRAP) \\; Irssi::active_win->print( do { join '', map { \"%x0\\${_}0\\$_\" } '0'..'9','A'..'F' }, MSGLEVEL_NEVER | MSGLEVEL_CLIENTCRAP) \\; Irssi::active_win->print(\"%_cubes\", MSGLEVEL_CLIENTCRAP) \\; Irssi::active_win->print( do { my \\$y = \\$_*6 \\; join '', map { my \\$x = \\$_ \\; map { \"%x\\$x\\$_\\$x\\$_\" } @{['0'..'9','A'..'Z']}[\\$y .. \\$y+5] } 1..6 }, MSGLEVEL_NEVER | MSGLEVEL_CLIENTCRAP) for 0..5 \\; Irssi::active_win->print(\"%_grays\", MSGLEVEL_CLIENTCRAP) \\; Irssi::active_win->print( do { join '', map { \"%x7\\${_}7\\$_\" } 'A'..'X' }, MSGLEVEL_NEVER | MSGLEVEL_CLIENTCRAP) \\; Irssi::active_win->print(\"%_mIRC extended colours\", MSGLEVEL_CLIENTCRAP) \\; my \\$x \\; \\$x .= sprintf \"\00399,%02d%02d\",\\$_,\\$_ for 0..15 \\; Irssi::active_win->print(\\$x, MSGLEVEL_NEVER | MSGLEVEL_CLIENTCRAP) \\; for my \\$z (0..6) { my \\$x \\; \\$x .= sprintf \"\00399,%02d%02d\",\\$_,\\$_ for 16+(\\$z*12)..16+(\\$z*12)+11 \\; Irssi::active_win->print(\\$x, MSGLEVEL_NEVER | MSGLEVEL_CLIENTCRAP) }"; + DATE = "TIME"; + DEHIGHLIGHT = "DEHILIGHT"; + DESCRIBE = "ACTION"; + DHL = "DEHILIGHT"; + EXEMPTLIST = "MODE $C +e"; + EXIT = "QUIT"; + GOTO = "SCROLLBACK GOTO"; + HIGHLIGHT = "HILIGHT"; + HL = "HILIGHT"; + HOST = "USERHOST"; + INVITELIST = "MODE $C +I"; + J = "JOIN"; + K = "KICK"; + KB = "KICKBAN"; + KN = "KNOCKOUT"; + LAST = "LASTLOG"; + LEAVE = "PART"; + M = "MSG"; + MUB = "UNBAN *"; + N = "NAMES"; + NMSG = "^MSG"; + P = "PART"; + Q = "QUERY"; + RESET = "SET -default"; + RUN = "SCRIPT LOAD"; + SAY = "MSG *"; + SB = "SCROLLBACK"; + SBAR = "STATUSBAR"; + SIGNOFF = "QUIT"; + SV = "MSG * Irssi $J ($V) - http://www.irssi.org"; + T = "TOPIC"; + UB = "UNBAN"; + UMODE = "MODE $N"; + UNSET = "SET -clear"; + W = "WHO"; + WC = "WINDOW CLOSE"; + WG = "WINDOW GOTO"; + WJOIN = "JOIN -window"; + WI = "WHOIS"; + WII = "WHOIS $0 $0"; + WL = "WINDOW LIST"; + WN = "WINDOW NEW HIDDEN"; + WQUERY = "QUERY -window"; + WW = "WHOWAS"; + 1 = "WINDOW GOTO 1"; + 2 = "WINDOW GOTO 2"; + 3 = "WINDOW GOTO 3"; + 4 = "WINDOW GOTO 4"; + 5 = "WINDOW GOTO 5"; + 6 = "WINDOW GOTO 6"; + 7 = "WINDOW GOTO 7"; + 8 = "WINDOW GOTO 8"; + 9 = "WINDOW GOTO 9"; + 10 = "WINDOW GOTO 10"; + 11 = "WINDOW GOTO 11"; + 12 = "WINDOW GOTO 12"; + 13 = "WINDOW GOTO 13"; + 14 = "WINDOW GOTO 14"; + 15 = "WINDOW GOTO 15"; + 16 = "WINDOW GOTO 16"; + 17 = "WINDOW GOTO 17"; + 18 = "WINDOW GOTO 18"; + 19 = "WINDOW GOTO 19"; + 20 = "WINDOW GOTO 20"; + 21 = "WINDOW GOTO 21"; + 22 = "WINDOW GOTO 22"; + 23 = "WINDOW GOTO 23"; + 24 = "WINDOW GOTO 24"; + 25 = "WINDOW GOTO 25"; + 26 = "WINDOW GOTO 26"; + 27 = "WINDOW GOTO 27"; + 28 = "WINDOW GOTO 28"; + 29 = "WINDOW GOTO 29"; + 30 = "WINDOW GOTO 30"; + 31 = "WINDOW GOTO 31"; + 32 = "WINDOW GOTO 32"; + 33 = "WINDOW GOTO 33"; + 34 = "WINDOW GOTO 34"; + 35 = "WINDOW GOTO 35"; + 36 = "WINDOW GOTO 36"; + 37 = "WINDOW GOTO 37"; + 38 = "WINDOW GOTO 38"; + 39 = "WINDOW GOTO 39"; + 40 = "WINDOW GOTO 40"; + 41 = "WINDOW GOTO 41"; + 42 = "WINDOW GOTO 42"; + 43 = "WINDOW GOTO 43"; + 44 = "WINDOW GOTO 44"; + 45 = "WINDOW GOTO 45"; + 46 = "WINDOW GOTO 46"; + 47 = "WINDOW GOTO 47"; + 48 = "WINDOW GOTO 48"; + 49 = "WINDOW GOTO 49"; + 50 = "WINDOW GOTO 50"; + 51 = "WINDOW GOTO 51"; + 52 = "WINDOW GOTO 52"; + 53 = "WINDOW GOTO 53"; + 54 = "WINDOW GOTO 54"; + 55 = "WINDOW GOTO 55"; + 56 = "WINDOW GOTO 56"; + 57 = "WINDOW GOTO 57"; + 58 = "WINDOW GOTO 58"; + 59 = "WINDOW GOTO 59"; + 60 = "WINDOW GOTO 60"; + 61 = "WINDOW GOTO 61"; + 62 = "WINDOW GOTO 62"; + 63 = "WINDOW GOTO 63"; + 64 = "WINDOW GOTO 64"; + 65 = "WINDOW GOTO 65"; + 66 = "WINDOW GOTO 66"; + 67 = "WINDOW GOTO 67"; + 68 = "WINDOW GOTO 68"; + 69 = "WINDOW GOTO 69"; + 70 = "WINDOW GOTO 70"; + 71 = "WINDOW GOTO 71"; + 72 = "WINDOW GOTO 72"; + 73 = "WINDOW GOTO 73"; + 74 = "WINDOW GOTO 74"; + 75 = "WINDOW GOTO 75"; + 76 = "WINDOW GOTO 76"; + 77 = "WINDOW GOTO 77"; + 78 = "WINDOW GOTO 78"; + 79 = "WINDOW GOTO 79"; + 80 = "WINDOW GOTO 80"; + 81 = "WINDOW GOTO 81"; + 82 = "WINDOW GOTO 82"; + 83 = "WINDOW GOTO 83"; + 84 = "WINDOW GOTO 84"; + 85 = "WINDOW GOTO 85"; + 86 = "WINDOW GOTO 86"; + 87 = "WINDOW GOTO 87"; + 88 = "WINDOW GOTO 88"; + 89 = "WINDOW GOTO 89"; + 90 = "WINDOW GOTO 90"; + 91 = "WINDOW GOTO 91"; + 92 = "WINDOW GOTO 92"; + 93 = "WINDOW GOTO 93"; + 94 = "WINDOW GOTO 94"; + 95 = "WINDOW GOTO 95"; + 96 = "WINDOW GOTO 96"; + 97 = "WINDOW GOTO 97"; + 98 = "WINDOW GOTO 98"; + 99 = "WINDOW GOTO 99"; +}; + +statusbar = { + + items = { + + barstart = "{sbstart}"; + barend = "{sbend}"; + + topicbarstart = "{topicsbstart}"; + topicbarend = "{topicsbend}"; + + time = "{sb $Z}"; + user = "{sb {sbnickmode $cumode}$N{sbmode $usermode}{sbaway $A}}"; + + window = "{sb $winref:$tag/$itemname{sbmode $M}}"; + window_empty = "{sb $winref{sbservertag $tag}}"; + + prompt = "{prompt $[.15]itemname}"; + prompt_empty = "{prompt $winname}"; + + topic = " $topic"; + topic_empty = " Irssi v$J - http://www.irssi.org"; + + lag = "{sb Lag: $0-}"; + act = "{sb Act: $0-}"; + more = "-- more --"; + }; + + default = { + + window = { + + disabled = "no"; + type = "window"; + placement = "bottom"; + position = "1"; + visible = "active"; + + items = { + barstart = { priority = "100"; }; + time = { }; + user = { }; + window = { }; + window_empty = { }; + lag = { priority = "-1"; }; + act = { priority = "10"; }; + more = { priority = "-1"; alignment = "right"; }; + barend = { priority = "100"; alignment = "right"; }; + }; + }; + + window_inact = { + + type = "window"; + placement = "bottom"; + position = "1"; + visible = "inactive"; + + items = { + barstart = { priority = "100"; }; + window = { }; + window_empty = { }; + more = { priority = "-1"; alignment = "right"; }; + barend = { priority = "100"; alignment = "right"; }; + }; + }; + + prompt = { + + type = "root"; + placement = "bottom"; + position = "100"; + visible = "always"; + + items = { + prompt = { priority = "-1"; }; + prompt_empty = { priority = "-1"; }; + input = { priority = "10"; }; + }; + }; + + topic = { + + type = "root"; + placement = "top"; + position = "1"; + visible = "always"; + + items = { + topicbarstart = { priority = "100"; }; + topic = { }; + topic_empty = { }; + topicbarend = { priority = "100"; alignment = "right"; }; + }; + }; + }; +}; +settings = { + core = { + real_name = "pyratebeard"; + user_name = "pyratebeard"; + nick = "pyratebeard"; + timestamp_format = "%H:%M"; + }; + "fe-text" = { actlist_sort = "refnum"; }; + "fe-common/core" = { theme = "pyratesoft"; }; +}; +ignores = ( + { level = "JOINS PARTS QUITS NICKS"; channels = ( "##linux" ); } +); diff --git a/irssi/.irssi/miromiro.theme b/irssi/.irssi/miromiro.theme @@ -0,0 +1,247 @@ +#------------------------------------------ +# file: ~/.irssi/miromiro.theme +# author: jason ryan http://jasonwryan.com/ +# vim:fenc=utf-8:nu:ai:si:et:ts=4:sw=4: +#------------------------------------------ +# Based on Pat Brisbin's theme + +# default foreground color (%N) - -1 is the "default terminal color" +default_color = "-1"; + +# print timestamp/servertag at the end of line, not at beginning +info_eol = "false"; + +# these characters are automatically replaced with specified color +# (dark grey by default) +replaces = { "[]" = "%g$*%n"; }; + +abstracts = { + + ############# generic ############################### + + # text to insert at the beginning of each non-message line + #line_start = "%g//%n "; + line_start = ""; + + # timestamp styling, nothing by default + timestamp = "%K$0-%n"; + + # any kind of text that needs hilighting, default is to bold + hilight = "%_$*%_"; + + # any kind of error message, default is bright red + error = "%R$*%n"; + + # channel name is printed + channel = "%_$*_%"; + + # nick is printed + nick = "%_$*%_"; + + # nick host is printed + nickhost = "%g$*"; + + # server name is printed + server = "%_$*%_"; + + # some kind of comment is printed + comment = "%n(%b\"$*\"%n);"; + + # reason for something is printed (part, quit, kick, ..) + reason = "{comment $*}"; + + # mode change is printed ([+o nick]) + mode = "{comment $*}"; + + ## channel specific messages + + # highlighted nick/host is printed (joins) + channick_hilight = "%g$*%N"; + chanhost_hilight = "{nickhost $*}"; + + # nick/host is printed (parts, quits, etc.) + channick = "%g$*"; + chanhost = "{nickhost $*}"; + + # highlighted channel name is printed + channelhilight = "%g$*%n"; + + # ban/ban exception/invite list mask is printed + ban = "$*"; + + ########### messages ################################# + + # the basic styling of how to print message, $0 = nick mode, $1 = nick + msgnick = "%K%n$0$1-%K%n: %|"; + + # $0 = nick mode, $1 = nick + ownmsgnick = "{msgnick $0 $1-}%M"; + ownnick = "%w$*%n"; + + # public message in channel, $0 = nick mode, $1 = nick + pubmsgnick = "{msgnick $0 $1-}"; + pubnick = "%N$*%n"; + + # public message in channel meant for me, $0 = nick mode, $1 = nick + pubmsgmenick = "{msgnick $0 $1-}"; + menick = "%M$*%n"; + + # public highlighted message in channel + # $0 = highlight color, $1 = nick mode, $2 = nick + pubmsghinick = "{msgnick $1 $0$2-%n}"; + + # channel name is printed with message + msgchannel = "%K:%m$*%n"; + + # private message, $0 = nick, $1 = host + privmsg = "$0=%b\"$1-\"%n "; + + # private message from you, $0 = "msg", $1 = target nick + ownprivmsg = "$0=%b\"$1-\"%n "; + + # own private message in query + ownprivmsgnick = "{msgnick $*}"; + ownprivnick = "$*"; + + # private message in query + privmsgnick = "{msgnick $*}"; + + ########## Actions (/ME stuff) ######################### + + # generic one that's used by most actions + action = " %g$* "; + + # own action, both private/public + ownaction = "{action $*}"; + + # own action with target, both private/public + ownaction_target = "{action $*}"; + + # private action sent by others + pvtaction = "{action $*}"; + pvtaction_query = "{action $*}"; + + # public action sent by others + pubaction = "{action $*}"; + + + ########## other IRC events ############################# + + # whois + whois = "%# $[8]0 = $1-;"; + + # notices + ownnotice = "%NNote n = %Mnew%n $0 ($1-) "; + notice = "%M$*%n "; + pubnotice_channel = " %N($*)"; + pvtnotice_host = " %N($*)"; + servernotice = " %N($*)"; + + # CTCPs + ownctcp = "%NCTCP c = %Mnew%n $0 ($1-) "; + ctcp = "%N$*%n"; + + # wallops + wallop = "%K$*%n: "; + wallop_nick = "%n$*"; + wallop_action = "%K * $*%n "; + + # netsplits + netsplit = "Netsplit nsplit = %b\"$*\"%n"; + netjoin = "Netjoin njoin = %b\"$*\"%n"; + + # /names list + names_prefix = ""; + names_nick = "%g[%n$0$1-%g]%n "; + names_nick_op = "{names_nick $*}"; + names_nick_halfop = "{names_nick $*}"; + names_nick_voice = "{names_nick $*}"; + names_users = "%Mthis%n.chan = %Mnew%N Channel($1%n);"; + names_channel = "\"%b$*\"%n"; + + # DCC + dcc = "%g$*%n"; + dccfile = "%_$*%_"; + + # DCC chat, own msg/action + dccownmsg = "%g /* $0 ($1-) */"; + dccownnick = "$*%n"; + dccownquerynick = "$*%n"; + dccownaction = "{action $*}"; + dccownaction_target = "{action $*}"; + + # DCC chat, others + dccmsg = "%g/* $1- ($0) */"; + dccquerynick = "%g$*%n"; + dccaction = "{action $*}"; + + ######## statusbar/topicbar ############################ + + # default background for all statusbars. You can also give + # the default foreground color for statusbar items. + sb_background = "%n%0"; + + # default backround for "default" statusbar group + #sb_default_bg = "%4"; + # background for prompt / input line + sb_prompt_bg = "%n"; + # background for info statusbar + #sb_info_bg = "%8"; + # background for topicbar (same default) + #sb_topic_bg = "%4"; + + # text at the beginning of statusbars. sb-item already puts + # space there,so we don't use anything by default. + sbstart = ""; + # text at the end of statusbars. Use space so that it's never + # used for anything. + sbend = " "; + + topicsbstart = "%BChannel: %b\"$*"; + topicsbend = "$*%b\""; + + prompt = "%c >> "; + + sb = "%w[$*]"; + sbmode = " mode=\"%g+%n$*\""; + sbaway = " %g/* zZzZ */%n"; + sbservertag = ":$0"; + sbnickmode = "$0"; + + # activity in statusbar + + # ',' separator + sb_act_sep = "%w$* "; + # normal text + sb_act_text = "%c$*"; + # public message + sb_act_msg = "%W$*"; + # hilight + sb_act_hilight = "%M$*"; + # hilight with specified color, $0 = color, $1 = text + sb_act_hilight_color = "$0$1-%n"; +}; + +######################################################## + +formats = { + "fe-common/core" = { + pubmsg = "{pubmsgnick {pubnick %Y$[-13]0}$2}$1"; + own_msg = "{ownmsgnick {ownnick %M$[-13]0$2}}$1"; + own_msg_channel = "{ownmsgnick {ownnick $[-13]0$3}{msgchannel $1}}$2"; + own_msg_private_query = "{ownprivmsgnick {ownprivnick $[-13]2}}$1"; + pubmsg_me = "{pubmsgmenick {menick $[-13]0}$2}$1"; + pubmsg_me_channel = "{pubmsgmenick {menick $[-13]0$3}{msgchannel $1}}$2"; + pubmsg_hilight = "{pubmsghinick $0 $0 $[-13]1$3%n}$2"; + pubmsg_hilight_channel = "{pubmsghinick $0 $[-13]1$4{msgchannel $2}}$3"; + pubmsg_channel = "{pubmsgnick {pubnick %M$[-13]0}$2}$1"; + msg_private_query = "{privmsgnick $[-13]0}$2"; + }; + "fe-common/irc" = { + own_action = "{ownaction $[-11]0} $1"; + action_private = "{pvtaction $[-11]0}$1"; + action_private_query = "{pvtaction_query $[-11]0} $2"; + action_public = "{pubaction $[-11]0}$1"; + }; +}; + diff --git a/irssi/.irssi/pyratesoft.theme b/irssi/.irssi/pyratesoft.theme @@ -0,0 +1,247 @@ +#------------------------------------------ +# file: ~/.irssi/miromiro.theme +# author: jason ryan http://jasonwryan.com/ +# vim:fenc=utf-8:nu:ai:si:et:ts=4:sw=4: +#------------------------------------------ +# Based on Pat Brisbin's theme + +# default foreground color (%N) - -1 is the "default terminal color" +default_color = "-1"; + +# print timestamp/servertag at the end of line, not at beginning +info_eol = "false"; + +# these characters are automatically replaced with specified color +# (dark grey by default) +replaces = { "[]" = "%g$*%n"; }; + +abstracts = { + + ############# generic ############################### + + # text to insert at the beginning of each non-message line + #line_start = "%g//%n "; + line_start = ""; + + # timestamp styling, nothing by default + timestamp = "%K$0-%n"; + + # any kind of text that needs hilighting, default is to bold + hilight = "%_$*%_"; + + # any kind of error message, default is bright red + error = "%R$*%n"; + + # channel name is printed + channel = "%_$*_%"; + + # nick is printed + nick = "%_$*%_"; + + # nick host is printed + nickhost = "%g$*"; + + # server name is printed + server = "%_$*%_"; + + # some kind of comment is printed + comment = "%n(%b\"$*\"%n);"; + + # reason for something is printed (part, quit, kick, ..) + reason = "{comment $*}"; + + # mode change is printed ([+o nick]) + mode = "{comment $*}"; + + ## channel specific messages + + # highlighted nick/host is printed (joins) + channick_hilight = "%g$*%N"; + chanhost_hilight = "{nickhost $*}"; + + # nick/host is printed (parts, quits, etc.) + channick = "%g$*"; + chanhost = "{nickhost $*}"; + + # highlighted channel name is printed + channelhilight = "%g$*%n"; + + # ban/ban exception/invite list mask is printed + ban = "$*"; + + ########### messages ################################# + + # the basic styling of how to print message, $0 = nick mode, $1 = nick + msgnick = "%K%n$0$1-%K%n: %|"; + + # $0 = nick mode, $1 = nick + ownmsgnick = "{msgnick $0 $1-}%M"; + ownnick = "%w$*%n"; + + # public message in channel, $0 = nick mode, $1 = nick + pubmsgnick = "{msgnick $0 $1-}"; + pubnick = "%N$*%n"; + + # public message in channel meant for me, $0 = nick mode, $1 = nick + pubmsgmenick = "{msgnick $0 $1-}"; + menick = "%M$*%n"; + + # public highlighted message in channel + # $0 = highlight color, $1 = nick mode, $2 = nick + pubmsghinick = "{msgnick $1 $0$2-%n}"; + + # channel name is printed with message + msgchannel = "%K:%m$*%n"; + + # private message, $0 = nick, $1 = host + privmsg = "$0=%b\"$1-\"%n "; + + # private message from you, $0 = "msg", $1 = target nick + ownprivmsg = "$0=%b\"$1-\"%n "; + + # own private message in query + ownprivmsgnick = "{msgnick $*}"; + ownprivnick = "$*"; + + # private message in query + privmsgnick = "{msgnick $*}"; + + ########## Actions (/ME stuff) ######################### + + # generic one that's used by most actions + action = " %g$* "; + + # own action, both private/public + ownaction = "{action $*}"; + + # own action with target, both private/public + ownaction_target = "{action $*}"; + + # private action sent by others + pvtaction = "{action $*}"; + pvtaction_query = "{action $*}"; + + # public action sent by others + pubaction = "{action $*}"; + + + ########## other IRC events ############################# + + # whois + whois = "%# $[8]0 = $1-;"; + + # notices + ownnotice = "%NNote n = %Mnew%n $0 ($1-) "; + notice = "%M$*%n "; + pubnotice_channel = " %N($*)"; + pvtnotice_host = " %N($*)"; + servernotice = " %N($*)"; + + # CTCPs + ownctcp = "%NCTCP c = %Mnew%n $0 ($1-) "; + ctcp = "%N$*%n"; + + # wallops + wallop = "%K$*%n: "; + wallop_nick = "%n$*"; + wallop_action = "%K * $*%n "; + + # netsplits + netsplit = "Netsplit nsplit = %b\"$*\"%n"; + netjoin = "Netjoin njoin = %b\"$*\"%n"; + + # /names list + names_prefix = ""; + names_nick = "%g[%n$0$1-%g]%n "; + names_nick_op = "{names_nick $*}"; + names_nick_halfop = "{names_nick $*}"; + names_nick_voice = "{names_nick $*}"; + names_users = "%Mthis%n.chan = %Mnew%N Channel($1%n);"; + names_channel = "\"%b$*\"%n"; + + # DCC + dcc = "%g$*%n"; + dccfile = "%_$*%_"; + + # DCC chat, own msg/action + dccownmsg = "%g /* $0 ($1-) */"; + dccownnick = "$*%n"; + dccownquerynick = "$*%n"; + dccownaction = "{action $*}"; + dccownaction_target = "{action $*}"; + + # DCC chat, others + dccmsg = "%g/* $1- ($0) */"; + dccquerynick = "%g$*%n"; + dccaction = "{action $*}"; + + ######## statusbar/topicbar ############################ + + # default background for all statusbars. You can also give + # the default foreground color for statusbar items. + sb_background = "%n%0"; + + # default backround for "default" statusbar group + #sb_default_bg = "%4"; + # background for prompt / input line + sb_prompt_bg = "%n"; + # background for info statusbar + #sb_info_bg = "%8"; + # background for topicbar (same default) + #sb_topic_bg = "%4"; + + # text at the beginning of statusbars. sb-item already puts + # space there,so we don't use anything by default. + sbstart = ""; + # text at the end of statusbars. Use space so that it's never + # used for anything. + sbend = " "; + + topicsbstart = "%BChannel: %b\"$*"; + topicsbend = "$*%b\""; + + prompt = "%n >> "; + + sb = "%w[$*]"; + sbmode = " mode=\"%g+%n$*\""; + sbaway = " %g/* zZzZ */%n"; + sbservertag = ":$0"; + sbnickmode = "$0"; + + # activity in statusbar + + # ',' separator + sb_act_sep = "%w$* "; + # normal text + sb_act_text = "%c$*"; + # public message + sb_act_msg = "%W$*"; + # hilight + sb_act_hilight = "%M$*"; + # hilight with specified color, $0 = color, $1 = text + sb_act_hilight_color = "$0$1-%n"; +}; + +######################################################## + +formats = { + "fe-common/core" = { + pubmsg = "{pubmsgnick {pubnick %Y$[-13]0}$2}$1"; + own_msg = "{ownmsgnick {ownnick %M$[-13]0$2}}$1"; + own_msg_channel = "{ownmsgnick {ownnick $[-13]0$3}{msgchannel $1}}$2"; + own_msg_private_query = "{ownprivmsgnick {ownprivnick $[-13]2}}$1"; + pubmsg_me = "{pubmsgmenick {menick $[-13]0}$2}$1"; + pubmsg_me_channel = "{pubmsgmenick {menick $[-13]0$3}{msgchannel $1}}$2"; + pubmsg_hilight = "{pubmsghinick $0 $0 $[-13]1$3%n}$2"; + pubmsg_hilight_channel = "{pubmsghinick $0 $[-13]1$4{msgchannel $2}}$3"; + pubmsg_channel = "{pubmsgnick {pubnick %M$[-13]0}$2}$1"; + msg_private_query = "{privmsgnick $[-13]0}$2"; + }; + "fe-common/irc" = { + own_action = "{ownaction $[-11]0} $1"; + action_private = "{pvtaction $[-11]0}$1"; + action_private_query = "{pvtaction_query $[-11]0} $2"; + action_public = "{pubaction $[-11]0}$1"; + }; +}; + diff --git a/irssi/.irssi/scripts/autorun/autorun b/irssi/.irssi/scripts/autorun/autorun @@ -0,0 +1 @@ +../twirssi.pl +\ No newline at end of file diff --git a/irssi/.irssi/scripts/twirssi.dump b/irssi/.irssi/scripts/twirssi.dump @@ -0,0 +1,11 @@ +$VAR1 = { + '__last_id' => {}, + '__channels' => {}, + '__lists' => { + 'pyratebeard@Twitter' => {} + }, + '__windows' => { + 'sender' => {}, + 'list' => {} + } +}; diff --git a/irssi/.irssi/scripts/twirssi.ids b/irssi/.irssi/scripts/twirssi.ids @@ -0,0 +1 @@ +{"764202084216352768":1471034972,"764197630649966596":1471034072,"764195510202662913":1471033467,"764198986659921921":1471034377,"764196360757219328":1471033767,"764200893889650688":1471034972,"764198095919849472":1471034072,"764203321229996032":1471035267,"764200609344024576":1471034667,"764197104952676352":1471034072,"764200159760687105":1471034667,"764196931195146240":1471033767,"764195490858618880":1471033467,"764196533327671296":1471033767,"764195357366464512":1471033467,"764196942465433600":1471033767,"764192073603952640":1471032867,"764200694698037248":1471034667,"764195749529870336":1471033467,"764202344145903618":1471035267,"764196096625160192":1471033767,"764197530670403584":1471034072,"764202025227870209":1471034972,"764198190333718529":1471034072,"764194031949778944":1471033182,"764197731992756224":1471034072,"764203358601162752":1471035267,"764202353436135424":1471035267,"764201541679054848":1471034972,"764195377230843904":1471033467,"764197318111404032":1471034072,"764195813295874049":1471033467,"764199556351418368":1471034377,"764192178457317376":1471032867,"764199037675286528":1471034377,"764198957773905922":1471034377,"764198529480859649":1471034377,"764203375176978432":1471035267,"764199537372192768":1471034377,"764199809632702465":1471034667,"764197333286395904":1471034072,"764201872169267200":1471034972,"764192425065656320":1471032867,"764199624295022592":1471034667,"764197445454757888":1471034072,"764195158929776640":1471033467,"764196938468163584":1471033767,"764193098813485056":1471032867,"764195261530898432":1471033467,"764197272540188672":1471034072,"764192838712188928":1471032867,"764194031475777536":1471033182,"764200812478341124":1471034667,"764192973491798016":1471032867,"764203161284378624":1471035267,"764197273739862016":1471034072,"764193502645354496":1471033182,"764192721384845312":1471032867,"764198083139870720":1471034072,"764203202472386561":1471035267,"764199874636025856":1471034667,"764194021044527108":1471033182,"764195247974821888":1471033467,"764196074546421761":1471033767} +\ No newline at end of file diff --git a/irssi/.irssi/scripts/twirssi.json b/irssi/.irssi/scripts/twirssi.json @@ -0,0 +1 @@ +{"__lists":{"pyratebeard@Twitter":{}},"__reply_to_ids":{"linuxfoundation":[null,null,null,null,"764126995290607618","764125106880802816","764125106880802816"],"stormbeard":[null,null,null,null,"764121333802426368",null,null,null,null,null,null,null,"761550056784850944"],"jenniegyllblad":[null,null,null,null,null,null,null,null,"756159048794472448",null,null,null,"764196938468163584",null,"764197273739862016","764198083139870720"],"tinkerknock":[null,"764171138327011329","761474875496235008"],"rikkuness":[null,"760094092827164672"],"thomasdcameron":[null,"763835819119357952"],"irssiproject":[null,null,null,null,null,null,null,null,"685581956940181505",null,null,"696441471466106880","702793490258743296",null,null,null,null,null,null,null,"761335085048143873"],"theregister":[null,null,null,null,null,null,null,null,null,null,null,null,null,"764157628654112772",null,null,null,null,"764179721105965056"],"redhatnews":[null,null,null,"764075597882544134"],"googleplay":[null,"756284023685644291"],"suseleap":[null,"764125914149945344"],"fedora":[null,"764053393354596353"],"poperichard":[null,null,null,null,null,"764084173032165376",null,null,null,null,null,null,null,"760915894918909952"],"startpagesearch":[null,null,null,"764081610681495554"],"natwest_help":[null,"762994657466908672"],"chesterbrewr":[null,"760506137171099650"],"robopike":[null,"764117794250260480"],"zeroxten":[null,null,null,"764189123254943744"],"wxl":[null,"761334249098244096"],"chilblane":[null,"763013685333950464"],"miyazakinoise":[null,"760915214418214916"],"wellmetalginge":[null,null,null,null,null,"762656257945825280","762664624474947584","763008602705625088"],"tktwr":[null,null,null,"764106910559797248","764109776858951680","764113291966681088",null,null,"764113291966681088","764119400647712769","764119989230206976",null,null,null,null,null,"764156389501566976","764156849948127232"],"greyhound001":[null,"763822254702469120"],"swiftonsecurity":[null,null,null,null,null,null,null,null,null,"764136122318368768","764136705687379970","764137049335091200","764137049335091200","764137049335091200","764139564801732608",null,"764140395773071360",null,null,null,null,null,null,"764188476212252673","764188694119010305","764189123254943744"],"moongoosedani":[null,"756278420057776128",null,"759782811339337729"],"starky_the_fox":[null,"763831197873102848"],"goatstory":[null,"763076154580471808"],"destructo9000":[null,null,null,null,"764124474086191105"],"apppowers":[null,"760984062307762176"],"nightbikeman":[null,"759782811339337729","760507396204658688"]},"__created_ats":{"jshstew":[null,1471006530,1471019956,1471020127,1471030249,1471030437],"hellyeahband":[null,1471008572,1471020804,1471030239],"goatstory":[null,1470917803],"linuxdotcom":[null,1471013362],"redhatgov":[null,1471007245,1471012080],"doctorow":[null,1471006828,1471008073,1471008104,1471008630,1471008687,1471009572,1471010432,1471012218,1471013127,1471014036,1471014353,1471015809,1471015841,1471015996,1471017469,1471017612,1471019428,1471021218,1471022495,1471023029,1471023524,1471023550,1471023649,1471024192,1471024536,1471024820,1471026608,1471026618,1471028345,1471028447,1471030206,1471032001,1471032807,1471033522,1471033721,1471033813,1471034422],"muriellavender":[null,1471019849,1471020053,1471029522,1471029628],"flappyhowserton":[null,1471028180],"youranonnews":[null,1471024405,1471025882,1471034204],"mikegarley":[null,1471014612,1471014615,1471014617,1471014621,1471024417,1471027122],"realkidpoker":[null,1471027902,1471030968],"blksails_starz":[null,1471020569],"boingboing":[null,1471007802,1471007942,1471009720,1471009727,1471009762,1471009779,1471009912,1471010341,1471012061,1471013403,1471013880,1471014054,1471014634,1471015166,1471016044,1471016434,1471016728,1471017450,1471018351,1471019161,1471019581,1471020723,1471020988,1471021143,1471021154,1471021507,1471021609,1471021994,1471022100,1471022549,1471023374,1471023600,1471023960,1471024130,1471024546,1471025078,1471025698,1471026458,1471026783,1471027659,1471027920,1471028102,1471028340,1471028468,1471029481,1471029759,1471030417,1471031196,1471031563,1471032903],"theregister":[null,1471007017,1471009032,1471010379,1471010681,1471011822,1471014462,1471015713,1471017565,1471017876,1471019560,1471023836,1471024350,1471024378,1471025281,1471025532,1471026708,1471029617,1471029721,1471033454],"eventslf":[null,1471009442,1471017781,1471027020],"krakenpodcast":[null,1471006306,1471020473,1471025403,1471025668,1471025891,1471026159,1471026596,1471028882],"matttomerlin":[null,1471016813,1471031678],"geekfeeddotcom":[null,1471011136,1471014913,1471018517,1471026426,1471030217,1471033762,1471033817],"scienceporn":[null,1471009762,1471009933,1471010284,1471022172,1471025881,1471033323],"offerman_shop":[null,1471020319],"gloryhammer":[null,1471012143],"captainfawcett":[null,1471007844,1471014939],"destructo9000":[null,1471012120,1471012295,1471014443,1471016634,1471016727,1471017448],"nixcraft":[null,1471016658,1471026856,1471027107,1471028173,1471031186],"tktwr":[null,1471012258,1471012360,1471012941,1471013780,1471013870,1471014027,1471014406,1471015236,1471015376,1471015587,1471015995,1471021091,1471021417,1471021652,1471023979,1471024165,1471024540],"geektyrant":[null,1471010286,1471011317,1471012517,1471012738,1471012775,1471013483,1471014413,1471015421,1471015815,1471017398,1471018465,1471019487,1471020509,1471021505,1471022488,1471023578,1471024594,1471024712,1471024714,1471025570,1471026492,1471028380,1471028614,1471029424,1471030388,1471031468,1471032423,1471032529,1471033382,1471035216,1471035253],"bleedingcool":[null,1471007198,1471007887,1471010533,1471010538,1471010539,1471011818,1471012030,1471012388,1471014972,1471017740,1471020536,1471020536,1471022290,1471022292,1471023315,1471023316,1471024929,1471024930,1471025470,1471025472,1471027208,1471027209,1471027866,1471028536,1471029074,1471029552,1471030748,1471032133,1471034211,1471034949],"glinner":[null,1471007509,1471007512,1471007763,1471012819,1471015339,1471015495,1471015832,1471016885,1471016928,1471017073,1471029777],"avicoder":[null,1471012130],"steam_games":[null,1471022603,1471022603],"blksailsbrethrn":[null,1471032438],"myproteincodes":[null,1471030169],"sethmacfarlane":[null,1471021792,1471021869],"chilblane":[null,1470755422],"discordapp":[null,1471017051,1471017779,1471018684,1471020666,1471035257],"disappearer":[null,1471020883],"pattonoswalt":[null,1471013758,1471015167,1471015798,1471020377,1471021630,1471031038,1471031267,1471031269,1471031273],"wxl":[null,1470351403],"blabbermouthnet":[null,1471006521,1471007706,1471009344,1471009817,1471010770,1471012429,1471013464,1471016985,1471017611,1471018701,1471019885,1471021548,1471022843,1471024015,1471026665,1471029134],"mwrinfosecurity":[null,1471020589],"leighalexander":[null,1471010836],"suseleap":[null,1471017047],"programmerslife":[null,1471032745],"sutterink":[null,1471028740],"popculturehound":[null,1471007558],"southpark":[null,1471020427],"starwars":[null,1471008601,1471021067,1471029032],"apppowers":[null,1470267851],"orbitalatk":[null,1471024810,1471027626],"thingiverse":[null,1471019929,1471020465,1471022402,1471024989,1471031172],"aws_uki":[null,1471008901,1471013527,1471017481,1471019104],"kumailn":[null,1471033626],"nick_offerman":[null,1471025108,1471029229,1471029564],"zakkwyldebls":[null,1471024856,1471034935],"chrisevans":[null,1471013605],"miyazakinoise":[null,1470251461],"hak5":[null,1471014306],"feistymoderate":[null,1471006226],"noshavelife":[null,1471019890],"bruces":[null,1471016803,1471018777,1471028172,1471029352,1471029417,1471029959,1471030189,1471032187],"startpagesearch":[null,1471012092,1471021829,1471022094,1471031112],"jenmajura":[null,1471022346],"linuxtoday":[null,1471010927,1471010927,1471010927,1471010927,1471010929,1471010929,1471010930,1471012705,1471012706,1471012706,1471014842,1471018531,1471021319,1471025126,1471029009,1471032717],"venkmanproject":[null,1471022895],"ixquick":[null,1471028497,1471032031],"bpnutrition":[null,1471006988,1471010585,1471026581,1471030225],"mephux":[null,1454879560],"bulletproofexec":[null,1471017911,1471022166,1471026594,1471028388,1471028461],"kimfcoates":[null,1471022252,1471023582,1471028046],"dccomics":[null,1471007646,1471013047,1471018507,1471021052,1471026320,1471029306,1471034646],"headgeek666":[null,1471025398,1471028586,1471029404,1471029672,1471033029,1471033029],"officialkat":[null,1471023064],"codeanywhere":[null,1471012506,1471027086],"xkcdcomic":[null,1471015923],"plex":[null,1471015456,1471027301],"missvanspronsen":[null,1471022640],"ibexwebex":[null,1471015164,1471015277,1471015892,1471016099,1471016525,1471019467,1471019745,1471019820],"protonmail":[null,1471017118],"jonlockcomics":[null,1471020809],"wellmetalginge":[null,1471013604,1471013718,1471020799,1471022166,1470667950,1470668421,1470751054,1471035206],"ders808":[null,1471018939,1471019135,1471033377],"natwest_help":[null,1470749045],"chesterbrewr":[null,1470154311],"sips_":[null,1471010631,1471012442,1471017784],"s0paranoid":[null,1471032563],"mcmcomiccon":[null,1471017341],"nathanfillion":[null,1471007195,1471025808,1471026125,1471026302],"twhiddleston":[null,1471027779,1471029250],"djsnm":[null,1471017739,1471029695,1471030838],"timminchin":[null,1471019451],"tweetdeck":[null,1471006820],"eff":[null,1471024202,1471027796],"sirpatstew":[null,1471014290],"neil_fifteen":[null,1471027571],"starky_the_fox":[null,1470946543],"thesimpsons":[null,1471018926],"greatdismal":[null,1471013243,1471014327],"puppetize":[null,1471014726,1471020335,1471021408,1471021682,1471026318,1471027148,1471029912],"torproject":[null,1471029255,1471034490],"awscloud":[null,1471008061,1471011308,1471014128,1471016592,1471021329,1471024801,1471027057,1471028527],"alancumming":[null,1471011143,1471027472],"kerbalspacep":[null,1471019603,1471024889],"cmdr_hadfield":[null,1471006487],"dailydot":[null,1471006376,1471007609,1471007726,1471008564,1471009136,1471009221,1471010922,1471011953,1471012303,1471012649,1471013202,1471013527,1471013916,1471014271,1471015014,1471015085,1471015388,1471016149,1471016766,1471017256,1471017588,1471017754,1471018189,1471018609,1471019034,1471019446,1471019876,1471019899,1471020697,1471021102,1471021517,1471021939,1471022567,1471023181,1471023605,1471024444,1471025441,1471025849,1471026306,1471027099,1471027463,1471027746,1471028106,1471028965,1471029246,1471029546,1471029783,1471029847,1471030209,1471030460,1471030925,1471031105,1471031525,1471031708,1471032428,1471033027,1471033912,1471034347,1471034598,1471035011,1471035244],"bloodstockfest":[null,1471008278,1471009512,1471011353,1471014052,1471015772,1471017824,1471018820,1471022355,1471024889,1471026076,1471030848,1471032068,1471032453,1471033843],"zacksnyder":[null,1471023175],"tcollen":[null,1470949521],"robopike":[null,1471015836],"qikipedia":[null,1471012458,1471017066],"apothecary87":[null,1471012795,1471022200,1471029995],"chelseaperetti":[null,1471017348,1471018690,1471027167],"robynbergeron":[null,1471014231,1471032446],"neiltyson":[null,1471012747,1471029893],"bloodypopcorn":[null,1471006572,1471014528,1471016333,1471018275,1471020561,1471021930,1471026277,1471028219,1471033439],"flashpointintel":[null,1471010503,1471021833,1471032093,1471033516],"theawesomepod":[null,1471031334,1471031407,1471031486,1471034021],"gitkraken":[null,1471007535,1471022798],"london_aquarium":[null,1471006621,1471012410,1471015947],"rikkuness":[null,1470055549],"_brendonsmall":[null,1471011633,1471026134,1471031286],"pyloris":[null,1471021916],"tinkerknock":[null,1471029211,1470384960],"blkstonecherry":[null,1471018805],"deandelray":[null,1471011086,1471012757,1471012848,1471013146,1471013254,1471013312,1471013741,1471014103,1471014121,1471014520,1471014559,1471014600,1471014734,1471014748,1471014905,1471015025,1471015183,1471015681,1471017402,1471017568,1471017642,1471026991,1471027196,1471027433,1471029113,1471030925,1471033319,1471033345,1471033585,1471034407,1471034665,1471035013],"dropbox":[null,1471019059],"garrynewman":[null,1471023472,1471023989,1471032006],"_rage":[null,1471023934],"rcpavlicek":[null,1470947625],"thenoisecartel":[null,1471013764,1471013801,1471013817],"cw_arrow":[null,1471031189,1471031225],"eddiemcclintock":[null,1471032646,1471032777,1471033998],"irssi_kittie":[null,1470946398],"bdisgusting":[null,1471006826,1471009775,1471011062,1471011175,1471012203,1471012848,1471014008,1471014166,1471014240,1471014934,1471016459,1471016783,1471017031,1471018179,1471020519,1471021275,1471021803,1471022072,1471025389,1471028079,1471028497,1471029206,1471029962],"511tactical":[null,1471025612,1471032115],"thenerdmachine":[null,1471033802],"jaymewes":[null,1471023511],"zeroxten":[null,1471013082,1471030009,1471031925,1471032116],"richardayoade":[null,1471010155,1471020334],"makerscafe":[null,1471009135,1471017575,1471023273],"iss_research":[null,1471012072,1471017001],"thatkevinsmith":[null,1471010287,1471018592,1471021441],"ogmaciel":[null,1452290450],"thekrakenrum_uk":[null,1471010631,1471010768,1471011105,1471011209,1471013343,1471016176,1471018486,1471019100,1471032278,1471033723],"irssiproject":[null,1450111113,1450776790,1450955225,1451080973,1451388168,1452072233,1452508210,1452508239,1453110228,1453804085,1454926165,1456395870,1456779824,1457610537,1458829391,1461519344,1461686454,1462990068,1467619460,1470405985],"openshift":[null,1471007258,1471012630,1471022712],"workaholicscc":[null,1471024980],"nightbikeman":[null,1470153834,1470154245],"collettejellis":[null,1471007614],"jwhitehurst":[null,1471011960,1471014960],"alantudyk":[null,1471017317],"amonamarthband":[null,1471031613],"greyhound001":[null,1470944489],"terrycrews":[null,1471028303],"jesterdiablo":[null,1471030965],"nickjfrost":[null,1471010847],"__freakyclown__":[null,1471008897,1471010266,1471010347,1471011928],"poperichard":[null,1471006299,1471006597,1471006781,1471006837,1471006848,1471010806,1471011611,1471017080,1471017343,1471017903,1471020963,1471025173,1470251633],"paradoxcmxgrp":[null,1471028467,1471030373,1471031123],"serafinowicz":[null,1471022625,1471030500],"docker":[null,1471006976,1471012523,1471014085,1471021525,1471028559,1471032040],"github":[null,1471025992],"openstack":[null,1471026673,1471033864],"thomasdcameron":[null,1471011861],"benhammersley":[null,1471009231,1471014195,1471020897,1471024343,1471034223],"bbmc2016":[null,1471025946],"brawbeardoil":[null,1471032001,1471032110],"hobgoblin_beer":[null,1471009085,1471014030,1471025125],"stormbeard":[null,1471012644,1471015646,1471015697,1471015960,1471016562,1471017070,1471023915,1471025551,1471025579,1471025795,1471028939,1470403233],"eastvillageldn":[null,1471008565,1471011345,1471016195],"swiftonsecurity":[null,1471010987,1471011200,1471013162,1471013192,1471013363,1471016006,1471016189,1471019223,1471019362,1471019444,1471019646,1471019983,1471020043,1471020242,1471020408,1471020658,1471022245,1471022252,1471027110,1471028746,1471031241,1471031705,1471031757,1471031859,1471032407],"kateysagal":[null,1471024634],"geeksaresexy":[null,1471007043,1471007045,1471007045,1471007045,1471013548,1471021266,1471024882,1471024884,1471032079],"thegrimfrost":[null,1471017550],"cities_pdx":[null,1471006588,1471007111],"moongoosedani":[null,1469174050,1469725142,1469983279],"insomniumband":[null,1471019367],"nickdoody":[null,1471016446],"_3dprinting":[null,1471029761],"nerdbastards":[null,1471013991,1471017828,1471026177,1471028156],"tumblr":[null,1471007101,1471014006,1471016641,1471024801,1471034342],"tgirlpromo1":[null,1470980821],"goromlagchee":[null,1456394000],"martinstarr":[null,1471014804],"nasa":[null,1471008440,1471010394,1471015406,1471021590,1471026150,1471029481],"defcon":[null,1471013345,1471013357,1471016302,1471016332,1471016369,1471016418,1471016582,1471016852,1471017232,1471019700,1471023018,1471024019,1471029305,1471032289],"geekswhoeat":[null,1471019595,1471026214,1471026267],"pnormand":[null,1471016596],"harvey_art":[null,1471012826,1471016555,1471016612,1471019174,1471027802,1471034820,1471034899],"scythiametal":[null,1471014122,1471029135],"boredelonmusk":[null,1471032095],"newsarama":[null,1471007847,1471008555,1471009040,1471013440,1471013683,1471014010,1471014158,1471014314,1471016850,1471018382,1471021073,1471027027,1471029052,1471030659],"redhatevents":[null,1471016438,1471016452,1471016524],"googleplay":[null,1469148783],"redhatnews":[null,1471009082,1471010124,1471010153,1471011302,1471013673,1471015807,1471020901,1471024374,1471026120,1471034102],"fedora":[null,1471004793],"robzombie":[null,1471033298],"nickazinas":[null,1471024913,1471030475],"wilw":[null,1471011918,1471014884,1471015078,1471016768,1471020003,1471024785,1471024991],"5fdpchriskael":[null,1471020118,1471023379,1471024958,1471025048],"stewedrat":[null,1471012459,1471014853],"kfalconspb":[null,1471006716,1471006819,1471007714,1471007745,1471008477,1471008517,1471008631,1471008830,1471021337,1471021564,1471021621,1471027418],"linuxfoundation":[null,1471016789,1471017204,1471017902,1471018848,1471020418,1471020454,1471024922,1471026539,1471029422,1471032588],"cyborgturkey":[null,1471034618],"jenniegyllblad":[null,1471009157,1471009333,1471018471,1471021208,1471021669,1471030661,1471030670,1469117440,1471031951,1471033350,1471033722,1471033802,1471033887,1471033995,1471034363]},"__reply_to_users":{"chilblane":[null,"pyratebeard"],"wellmetalginge":[null,null,null,null,null,"pyratebeard","pyratebeard","pyratebeard"],"miyazakinoise":[null,"PopeRichard"],"tktwr":[null,null,null,"TKtwr","TKtwr","TKtwr",null,null,"TKtwr","TKtwr","TKtwr",null,null,null,null,null,"joutsenvuori","TKtwr"],"greyhound001":[null,"irssi_kittie"],"moongoosedani":[null,"pyratebeard",null,"pyratebeard"],"starky_the_fox":[null,"Starky_the_fox"],"swiftonsecurity":[null,null,null,null,null,null,null,null,null,"SwiftOnSecurity","SwiftOnSecurity","SwiftOnSecurity","SwiftOnSecurity","SwiftOnSecurity","SwiftOnSecurity",null,"SwiftOnSecurity",null,null,null,null,null,null,"SwiftOnSecurity","SwiftOnSecurity","SwiftOnSecurity"],"nightbikeman":[null,"pyratebeard","pyratebeard"],"apppowers":[null,"pyratebeard"],"destructo9000":[null,null,null,null,"NickDoody"],"goatstory":[null,"pyratebeard"],"linuxfoundation":[null,null,null,null,"suseLEAP","pnormand","pnormand"],"tinkerknock":[null,"neil_fifteen","pyratebeard"],"stormbeard":[null,null,null,null,"stormbeard",null,null,null,null,null,null,null,"pyratebeard"],"jenniegyllblad":[null,null,null,null,null,null,null,null,"pyratebeard",null,null,null,"JennieGyllblad",null,"JennieGyllblad","JennieGyllblad"],"thomasdcameron":[null,"RCPavlicek"],"irssiproject":[null,null,null,null,null,null,null,null,"OgMaciel",null,null,"Mephux","gorOmLagcHee",null,null,null,null,null,null,null,"wxl"],"rikkuness":[null,"pyratebeard"],"theregister":[null,null,null,null,null,null,null,null,null,null,null,null,null,"TheRegister",null,null,null,null,"TheRegister"],"fedora":[null,"AkkiShipurkar"],"suseleap":[null,"linuxfoundation"],"googleplay":[null,"pyratebeard"],"redhatnews":[null,null,null,"fedora"],"chesterbrewr":[null,"pyratebeard"],"robopike":[null,"StewedRat"],"startpagesearch":[null,null,null,"FeistyModerate"],"natwest_help":[null,"pyratebeard"],"poperichard":[null,null,null,null,null,"PopeRichard",null,null,null,null,null,null,null,"MiyazakiNoise"],"zeroxten":[null,null,null,"SwiftOnSecurity"],"wxl":[null,"tsimonq2"]},"__windows":{"list":{},"sender":{}},"__usernames":{"thomasdcameron":[null,"pyratebeard@Twitter"],"benhammersley":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"openstack":[null,"pyratebeard@Twitter","pyratebeard@Twitter"],"hobgoblin_beer":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"brawbeardoil":[null,"pyratebeard@Twitter","pyratebeard@Twitter"],"bbmc2016":[null,"pyratebeard@Twitter"],"eastvillageldn":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"stormbeard":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"__freakyclown__":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"poperichard":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"paradoxcmxgrp":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"github":[null,"pyratebeard@Twitter"],"docker":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"serafinowicz":[null,"pyratebeard@Twitter","pyratebeard@Twitter"],"nickjfrost":[null,"pyratebeard@Twitter"],"jesterdiablo":[null,"pyratebeard@Twitter"],"nightbikeman":[null,"pyratebeard@Twitter","pyratebeard@Twitter"],"collettejellis":[null,"pyratebeard@Twitter"],"alantudyk":[null,"pyratebeard@Twitter"],"jwhitehurst":[null,"pyratebeard@Twitter","pyratebeard@Twitter"],"greyhound001":[null,"pyratebeard@Twitter"],"terrycrews":[null,"pyratebeard@Twitter"],"amonamarthband":[null,"pyratebeard@Twitter"],"wilw":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"5fdpchriskael":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"nickazinas":[null,"pyratebeard@Twitter","pyratebeard@Twitter"],"cyborgturkey":[null,"pyratebeard@Twitter"],"kfalconspb":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"linuxfoundation":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"stewedrat":[null,"pyratebeard@Twitter","pyratebeard@Twitter"],"jenniegyllblad":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"scythiametal":[null,"pyratebeard@Twitter","pyratebeard@Twitter"],"boredelonmusk":[null,"pyratebeard@Twitter"],"harvey_art":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"newsarama":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"redhatevents":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"fedora":[null,"pyratebeard@Twitter"],"robzombie":[null,"pyratebeard@Twitter"],"redhatnews":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"googleplay":[null,"pyratebeard@Twitter"],"tumblr":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"tgirlpromo1":[null,"pyratebeard@Twitter"],"goromlagchee":[null,"pyratebeard@Twitter"],"defcon":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"nasa":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"martinstarr":[null,"pyratebeard@Twitter"],"pnormand":[null,"pyratebeard@Twitter"],"geekswhoeat":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"moongoosedani":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"kateysagal":[null,"pyratebeard@Twitter"],"cities_pdx":[null,"pyratebeard@Twitter","pyratebeard@Twitter"],"thegrimfrost":[null,"pyratebeard@Twitter"],"swiftonsecurity":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"geeksaresexy":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"insomniumband":[null,"pyratebeard@Twitter"],"nickdoody":[null,"pyratebeard@Twitter"],"nerdbastards":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"_3dprinting":[null,"pyratebeard@Twitter"],"london_aquarium":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"gitkraken":[null,"pyratebeard@Twitter","pyratebeard@Twitter"],"pyloris":[null,"pyratebeard@Twitter"],"_brendonsmall":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"rikkuness":[null,"pyratebeard@Twitter"],"tinkerknock":[null,"pyratebeard@Twitter","pyratebeard@Twitter"],"blkstonecherry":[null,"pyratebeard@Twitter"],"apothecary87":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"qikipedia":[null,"pyratebeard@Twitter","pyratebeard@Twitter"],"robopike":[null,"pyratebeard@Twitter"],"tcollen":[null,"pyratebeard@Twitter"],"chelseaperetti":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"neiltyson":[null,"pyratebeard@Twitter","pyratebeard@Twitter"],"robynbergeron":[null,"pyratebeard@Twitter","pyratebeard@Twitter"],"theawesomepod":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"flashpointintel":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"bloodypopcorn":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"bloodstockfest":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"dailydot":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"zacksnyder":[null,"pyratebeard@Twitter"],"neil_fifteen":[null,"pyratebeard@Twitter"],"starky_the_fox":[null,"pyratebeard@Twitter"],"sirpatstew":[null,"pyratebeard@Twitter"],"puppetize":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"thesimpsons":[null,"pyratebeard@Twitter"],"greatdismal":[null,"pyratebeard@Twitter","pyratebeard@Twitter"],"alancumming":[null,"pyratebeard@Twitter","pyratebeard@Twitter"],"awscloud":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"torproject":[null,"pyratebeard@Twitter","pyratebeard@Twitter"],"cmdr_hadfield":[null,"pyratebeard@Twitter"],"kerbalspacep":[null,"pyratebeard@Twitter","pyratebeard@Twitter"],"ogmaciel":[null,"pyratebeard@Twitter"],"irssiproject":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"thekrakenrum_uk":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"openshift":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"workaholicscc":[null,"pyratebeard@Twitter"],"jaymewes":[null,"pyratebeard@Twitter"],"zeroxten":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"richardayoade":[null,"pyratebeard@Twitter","pyratebeard@Twitter"],"iss_research":[null,"pyratebeard@Twitter","pyratebeard@Twitter"],"thatkevinsmith":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"makerscafe":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"cw_arrow":[null,"pyratebeard@Twitter","pyratebeard@Twitter"],"thenoisecartel":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"rcpavlicek":[null,"pyratebeard@Twitter"],"511tactical":[null,"pyratebeard@Twitter","pyratebeard@Twitter"],"irssi_kittie":[null,"pyratebeard@Twitter"],"bdisgusting":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"eddiemcclintock":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"thenerdmachine":[null,"pyratebeard@Twitter"],"deandelray":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"dropbox":[null,"pyratebeard@Twitter"],"_rage":[null,"pyratebeard@Twitter"],"garrynewman":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"ixquick":[null,"pyratebeard@Twitter","pyratebeard@Twitter"],"venkmanproject":[null,"pyratebeard@Twitter"],"mephux":[null,"pyratebeard@Twitter"],"bpnutrition":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"dccomics":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"kimfcoates":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"bulletproofexec":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"headgeek666":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"jenmajura":[null,"pyratebeard@Twitter"],"startpagesearch":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"linuxtoday":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"chrisevans":[null,"pyratebeard@Twitter"],"miyazakinoise":[null,"pyratebeard@Twitter"],"noshavelife":[null,"pyratebeard@Twitter"],"bruces":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"feistymoderate":[null,"pyratebeard@Twitter"],"hak5":[null,"pyratebeard@Twitter"],"starwars":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"thingiverse":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"orbitalatk":[null,"pyratebeard@Twitter","pyratebeard@Twitter"],"apppowers":[null,"pyratebeard@Twitter"],"kumailn":[null,"pyratebeard@Twitter"],"aws_uki":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"zakkwyldebls":[null,"pyratebeard@Twitter","pyratebeard@Twitter"],"nick_offerman":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"nathanfillion":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"djsnm":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"timminchin":[null,"pyratebeard@Twitter"],"twhiddleston":[null,"pyratebeard@Twitter","pyratebeard@Twitter"],"tweetdeck":[null,"pyratebeard@Twitter"],"eff":[null,"pyratebeard@Twitter","pyratebeard@Twitter"],"chesterbrewr":[null,"pyratebeard@Twitter"],"natwest_help":[null,"pyratebeard@Twitter"],"sips_":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"s0paranoid":[null,"pyratebeard@Twitter"],"mcmcomiccon":[null,"pyratebeard@Twitter"],"jonlockcomics":[null,"pyratebeard@Twitter"],"ibexwebex":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"protonmail":[null,"pyratebeard@Twitter"],"wellmetalginge":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"ders808":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"officialkat":[null,"pyratebeard@Twitter"],"xkcdcomic":[null,"pyratebeard@Twitter"],"codeanywhere":[null,"pyratebeard@Twitter","pyratebeard@Twitter"],"plex":[null,"pyratebeard@Twitter","pyratebeard@Twitter"],"missvanspronsen":[null,"pyratebeard@Twitter"],"geekfeeddotcom":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"matttomerlin":[null,"pyratebeard@Twitter","pyratebeard@Twitter"],"offerman_shop":[null,"pyratebeard@Twitter"],"gloryhammer":[null,"pyratebeard@Twitter"],"scienceporn":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"captainfawcett":[null,"pyratebeard@Twitter","pyratebeard@Twitter"],"theregister":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"boingboing":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"blksails_starz":[null,"pyratebeard@Twitter"],"krakenpodcast":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"eventslf":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"mikegarley":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"youranonnews":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"realkidpoker":[null,"pyratebeard@Twitter","pyratebeard@Twitter"],"hellyeahband":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"jshstew":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"linuxdotcom":[null,"pyratebeard@Twitter"],"goatstory":[null,"pyratebeard@Twitter"],"muriellavender":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"redhatgov":[null,"pyratebeard@Twitter","pyratebeard@Twitter"],"doctorow":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"flappyhowserton":[null,"pyratebeard@Twitter"],"programmerslife":[null,"pyratebeard@Twitter"],"sutterink":[null,"pyratebeard@Twitter"],"popculturehound":[null,"pyratebeard@Twitter"],"southpark":[null,"pyratebeard@Twitter"],"disappearer":[null,"pyratebeard@Twitter"],"wxl":[null,"pyratebeard@Twitter"],"pattonoswalt":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"mwrinfosecurity":[null,"pyratebeard@Twitter"],"blabbermouthnet":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"leighalexander":[null,"pyratebeard@Twitter"],"suseleap":[null,"pyratebeard@Twitter"],"blksailsbrethrn":[null,"pyratebeard@Twitter"],"sethmacfarlane":[null,"pyratebeard@Twitter","pyratebeard@Twitter"],"myproteincodes":[null,"pyratebeard@Twitter"],"discordapp":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"chilblane":[null,"pyratebeard@Twitter"],"nixcraft":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"destructo9000":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"glinner":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"geektyrant":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"bleedingcool":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"tktwr":[null,"pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter","pyratebeard@Twitter"],"steam_games":[null,"pyratebeard@Twitter","pyratebeard@Twitter"],"avicoder":[null,"pyratebeard@Twitter"]},"__last_id":{"pyratebeard@Twitter":{"dm":"763029074713407491","__search":{},"reply":"763710737743241216","timeline":"764203375176978432"}},"__ids":{"mikegarley":[null,"764116785415196672","764116795745832960","764116806722289664","764116820156612608","764157908653379585","764169254845423617"],"youranonnews":[null,"764157858426519552","764164055204368384","764198957773905922"],"realkidpoker":[null,"764172525513289728","764185386406989824"],"hellyeahband":[null,"764091449545662464","764142752959311872","764182328025440262"],"jshstew":[null,"764082884156153856","764139198022418433","764139915810443264","764182371235049472","764183160116482048"],"linuxdotcom":[null,"764111540123410432"],"goatstory":[null,"763710737743241216"],"muriellavender":[null,"764138748812599297","764139605205643264","764179322093629440","764179766475980804"],"doctorow":[null,"764084133786062848","764089356923523078","764089487466962944","764091691712204800","764091930590392320","764095645061820420","764099249579692032","764106741743251456","764110554931736576","764114367487025152","764115696582221824","764121802360651776","764121938104942592","764122587416760320","764128768612904961","764129365068218369","764136981500727296","764144491590803457","764149846026522624","764152085730451456","764154163844395008","764154273861017600","764154688937664513","764156964083408896","764158408928874496","764159599805079552","764167097165283328","764167140190683137","764174385980829697","764174813871169541","764182191211511808","764189717290164224","764193098813485056","764196096625160192","764196931195146240","764197318111404032","764199874636025856"],"redhatgov":[null,"764085884450840576","764106165244399616"],"flappyhowserton":[null,"764173691320201217"],"geekfeeddotcom":[null,"764102204890484736","764118045262577664","764133162922438656","764166334607392768","764182235989893125","764197104952676352","764197333286395904"],"matttomerlin":[null,"764126016558161921","764188365079977985"],"scienceporn":[null,"764096440788365314","764097156751958016","764098629783150593","764148493778911232","764164048711802884","764195261530898432"],"gloryhammer":[null,"764106429326364676"],"offerman_shop":[null,"764140719007076353"],"captainfawcett":[null,"764088395362557956","764118156625477633"],"theregister":[null,"764084927805521925","764093379311378432","764099030045437952","764100295660011520","764105083156107265","764116152666714114","764121402425413632","764129168988725248","764130474843332608","764137536608464896","764155472169406464","764157628654112772","764157746279096320","764161534087958528","764162583553245188","764167519850618884","764179721105965056","764180154381766656","764195813295874049"],"blksails_starz":[null,"764141768379994113"],"boingboing":[null,"764088219394641920","764088808392368128","764096264321458176","764096294742740993","764096442092838914","764096513123332096","764097069808168960","764098870712340480","764106084407775232","764111711142019072","764113714463334400","764114443588497408","764116876796493824","764119108233359361","764122791851483136","764124425734221828","764125660700958720","764128685439983616","764132467502673920","764135862540050432","764137625498288129","764142417155153920","764143526124847104","764144175117901824","764144224275197952","764145702096211968","764146129428709376","764147744281915393","764148190744612869","764150074050043905","764153534057181184","764154482498363392","764155992422621184","764156704216977408","764158450511278081","764160680211648513","764163283586846725","764166468300931072","764167830774439936","764171505571856384","764172601212170241","764173363916988420","764174361704140800","764174898679930884","764179147463749638","764180314356912128","764183076666765312","764186340045053952","764187880633864192","764193502645354496"],"krakenpodcast":[null,"764081946305568768","764141367295610880","764162045868736512","764163157090762752","764164091887902720","764165215747538944","764167049342029825","764176636887662593"],"eventslf":[null,"764095097075937280","764130073985294336","764168827739398144"],"blksailsbrethrn":[null,"764191552021278720"],"sethmacfarlane":[null,"764146897007226880","764147221717667840"],"myproteincodes":[null,"764182032796749824"],"chilblane":[null,"763029661588729857"],"discordapp":[null,"764127012286062592","764130065458327553","764133864751202304","764142175462436864","764203375176978432"],"nixcraft":[null,"764125363559469057","764168138711642112","764169192450818048","764173662589071360","764186301935390721"],"destructo9000":[null,"764106332563791872","764107066269204480","764116076082987008","764125266381791232","764125654896050178","764128678188056576"],"glinner":[null,"764086989507264512","764087004816510976","764088056869642240","764109263723753476","764119834854559745","764120485617602560","764121898687037440","764126315976986624","764126498102079489","764127107165347840","764180390378627073"],"bleedingcool":[null,"764085687440191488","764088575558230018","764099675464998916","764099695203405825","764099700781817856","764105063459463168","764105956015808514","764107457392029696","764118293435121664","764129904132624384","764141630873927680","764141632585289732","764148985565024256","764148995195187200","764153285771005953","764153292280647680","764160056447205377","764160060490522625","764162327327277056","764162335346786304","764169616968994816","764169619884036096","764172373364838401","764175187294064640","764177443045335040","764179446018428928","764184462217261056","764190270497796096","764198986659921921","764202084216352768"],"geektyrant":[null,"764098638851125250","764102964591984644","764107997681373184","764108922122739712","764109078268305408","764112050075213824","764115951059083264","764120176149221376","764121828738465792","764128469600960512","764132944596180992","764137229698510848","764141518818938880","764145696970682368","764149815978528768","764154391720972290","764158650881486848","764159146530701312","764159152897654784","764162746577321984","764166613201321984","764174530252197890","764175512717504512","764178907994001408","764182953052078081","764187481994440704","764191488934752257","764191931735810048","764195510202662913","764203202472386561","764203358601162752"],"tktwr":[null,"764106910559797248","764107339091804161","764109776858951680","764113291966681088","764113670481801220","764114331407675392","764115921174749184","764119400647712769","764119989230206976","764120872051507205","764122585302990852","764143956800180225","764145327779696640","764146311092375553","764156072915570688","764156849948127232","764158426121433089"],"steam_games":[null,"764150301611798528","764150302333284352"],"avicoder":[null,"764106372581470209"],"programmerslife":[null,"764192838712188928"],"sutterink":[null,"764176039299969024"],"southpark":[null,"764141171966750720"],"popculturehound":[null,"764087195548266496"],"disappearer":[null,"764143086054346753"],"pattonoswalt":[null,"764113201009045505","764119109797683200","764121757544361984","764140963329482752","764146219534823424","764185680176046080","764186638335381504","764186648980500480","764186665766105088"],"wxl":[null,"761335085048143873"],"blabbermouthnet":[null,"764082847531474946","764087819287474178","764094687657332736","764096673895190528","764100670899097600","764107625675886593","764111970177982470","764126735713435648","764129361192624128","764133933470539776","764138902118539264","764145874528182273","764151308110573568","764156221146275840","764167336286756864","764177694556774401"],"leighalexander":[null,"764100944959242240"],"mwrinfosecurity":[null,"764141851594993664"],"suseleap":[null,"764126995290607618"],"chrisevans":[null,"764112560606023680"],"miyazakinoise":[null,"760915894918909952"],"noshavelife":[null,"764138920149979136"],"bruces":[null,"764125974833364992","764134254653636609","764173658696871936","764178608885727236","764178879481278464","764181153028988930","764182118842900481","764190499976712192"],"hak5":[null,"764115500540448770"],"feistymoderate":[null,"764081610681495554"],"starwars":[null,"764091573558583298","764143860004089861","764177266742063104"],"orbitalatk":[null,"764159556234731528","764171368518787072"],"thingiverse":[null,"764139082813411328","764141332650745856","764149457013379072","764160310068600832","764186242045075460"],"apppowers":[null,"760984642451144705"],"aws_uki":[null,"764092829802991617","764112233886515200","764128815341862913","764135624966336512"],"kumailn":[null,"764196533327671296"],"zakkwyldebls":[null,"764159749919219712","764202025227870209"],"nick_offerman":[null,"764160806602801153","764178092457877504","764179496606044161"],"ixquick":[null,"764175020725833728","764189844541173760"],"venkmanproject":[null,"764151525509922816"],"mephux":[null,"696441471466106880"],"bpnutrition":[null,"764084805830979585","764099891446616064","764166984212721664","764182271477817345"],"dccomics":[null,"764087564554731525","764110217776885760","764133119800868868","764143794199474177","764165888664805377","764178413712207872","764200812478341124"],"kimfcoates":[null,"764148829419544577","764154408200343552","764173130080276480"],"bulletproofexec":[null,"764130620486410241","764148465723142144","764167041104371716","764174565589344256","764174871047901184"],"headgeek666":[null,"764162021453471744","764175396547985408","764178826343612416","764179949976711168","764194031475777536","764194031949778944"],"jenmajura":[null,"764149223541661700"],"startpagesearch":[null,"764106211998441472","764147056097255424","764148164060471296","764185987891224577"],"linuxtoday":[null,"764101326963814400","764101327743954946","764101328704417793","764101329534844928","764101337357225984","764101338074447873","764101338829459457","764108786671886336","764108787384852481","764108788085370884","764117748687392768","764133219209883649","764144913730539520","764160882708361216","764177167278231552","764192721384845312"],"jonlockcomics":[null,"764142773792563200"],"protonmail":[null,"764127294176817152"],"ibexwebex":[null,"764119100381499392","764119572463050753","764122152610123777","764123021095206912","764124806111301633","764137146571628545","764138312852398080","764138626280153088"],"wellmetalginge":[null,"764112554293682177","764113035476819968","764142732533170177","764148466683707392","762662779241267201","762664752195768320","763011339400974336","764203161284378624"],"ders808":[null,"764134934147571713","764135756247863296","764195490858618880"],"officialkat":[null,"764152234485571585"],"xkcdcomic":[null,"764122283879170048"],"codeanywhere":[null,"764107950755422208","764169101698752512"],"plex":[null,"764120321733464064","764170006452068353"],"missvanspronsen":[null,"764150455941341185"],"nathanfillion":[null,"764085675138310145","764163741218906117","764165074663579648","764165816682033152"],"djsnm":[null,"764129899615518720","764180046034579456","764184840082075648"],"timminchin":[null,"764137081731973120"],"twhiddleston":[null,"764172010075238400","764178179355357184"],"eff":[null,"764157007716757504","764172081189654528"],"tweetdeck":[null,"764084101636771840"],"chesterbrewr":[null,"760508419711303684"],"natwest_help":[null,"763002915191656448"],"sips_":[null,"764100085013676032","764107680604708864","764130086593396737"],"s0paranoid":[null,"764192073603952640"],"mcmcomiccon":[null,"764128227946364928"],"bloodstockfest":[null,"764090219041652736","764095394686971905","764103115247329281","764114434562326528","764121650254254080","764130256353652736","764134433310052352","764149260988276736","764159889790885890","764164865908887552","764184881312202754","764189999726198784","764191614491299840","764197445454757888"],"dailydot":[null,"764082239978299392","764087409340518400","764087900686262276","764091417236951040","764093816475308035","764094173574144001","764101306625691649","764105630642741248","764107097185382400","764108548431306752","764110869538234368","764112234247315457","764113863218528256","764115351743463424","764118469365334016","764118765617483776","764120040010645504","764123228881158144","764125819044233218","764127873024331777","764129267001102337","764129961888325632","764131786049855488","764133548718718976","764135330769502208","764137056931024901","764138860980871168","764138959643475968","764142304722649088","764144006326542337","764145745360515074","764147516308946945","764150148624683008","764152723013005313","764154501297278976","764158020653879296","764162202941128704","764163915509075968","764165833115443200","764169157881585664","764170683387670528","764171871524941824","764173382883606534","764176982724767744","764178165040287744","764179420454252544","764180415934595073","764180684680335360","764182202313805824","764183256686268416","764185206274293760","764185960267538436","764187721636147200","764188490544345088","764191507825979393","764194021044527108","764197731992756224","764199556351418368","764200609344024576","764202344145903618","764203321229996032"],"zacksnyder":[null,"764152697784336385"],"neil_fifteen":[null,"764171138327011329"],"starky_the_fox":[null,"763831283520798720"],"sirpatstew":[null,"764115432294973441"],"puppetize":[null,"764117259895775232","764140787844120577","764145287824744448","764146439454732292","764165880452378624","764169364853493761","764180958283268097"],"greatdismal":[null,"764111043454873600","764115587286966272"],"thesimpsons":[null,"764134876920459264"],"alancumming":[null,"764102234380599296","764170721840996352"],"awscloud":[null,"764089307086725120","764102926671286272","764114752100454401","764125087142334464","764144957028311040","764159519350022146","764168982341439490","764175147435560961"],"torproject":[null,"764178202147205120","764200159760687105"],"cmdr_hadfield":[null,"764082704191107072"],"kerbalspacep":[null,"764137717047238657","764159889925038080"],"london_aquarium":[null,"764083266840178688","764107548555444224","764122381346537473"],"gitkraken":[null,"764087098907340801","764151118062505985"],"pyloris":[null,"764147420829585408"],"_brendonsmall":[null,"764104290831048704","764165109895823361","764186720627625984"],"rikkuness":[null,"760094180056174592"],"blkstonecherry":[null,"764134368654700544"],"tinkerknock":[null,"764178015576350720","761475830908325888"],"apothecary87":[null,"764109164075487233","764148610057601024","764181306649477125"],"qikipedia":[null,"764107748523008000","764127077411020800"],"robopike":[null,"764121916999340032"],"tcollen":[null,"763843772136431616"],"chelseaperetti":[null,"764128259667701760","764133888448868353","764169442615975937"],"neiltyson":[null,"764108960525799425","764180876804624384"],"robynbergeron":[null,"764115184839372800","764191585877659650"],"flashpointintel":[null,"764099548658569216","764147069917470720","764190104181243904","764196074546421761"],"theawesomepod":[null,"764186921803341824","764187225420627968","764187557882171393","764198190333718529"],"bloodypopcorn":[null,"764083059721277441","764116429796966400","764124003619536896","764132147733139456","764141736893480960","764147479529066496","764165709576466433","764173857536303105","764195749529870336"],"thenoisecartel":[null,"764113228041453568","764113382236708864","764113448540266496"],"cw_arrow":[null,"764186311192260608","764186462694748160"],"rcpavlicek":[null,"763835819119357952"],"511tactical":[null,"764162920909537280","764190198259331072"],"bdisgusting":[null,"764084126899015680","764096497348554752","764101893328994308","764102369776922626","764106678019108865","764109384788025348","764114251589914624","764114911634952192","764115221619150848","764118135095959552","764124531363426304","764125888497655809","764126928559181824","764131746132602880","764141559797444608","764144731936829441","764146945476534274","764148071437434880","764161985177018368","764173267955441664","764175023636557824","764177995250569216","764181166706548736"],"irssi_kittie":[null,"763830672309878784"],"eddiemcclintock":[null,"764192425065656320","764192973491798016","764198095919849472"],"thenerdmachine":[null,"764197272540188672"],"deandelray":[null,"764101996538269696","764109002443665408","764109386046246917","764110635181281281","764111088388419585","764111330898907136","764113132243423232","764114650271068162","764114723851816960","764116397035184129","764116561758072832","764116732499795969","764117297107611648","764117355689455616","764118013058568193","764118517645881344","764119178030657537","764121269109268480","764128486504079360","764129180128727041","764129490431643649","764168703239827456","764169564032643072","764170558783172608","764177605981458432","764185204135071744","764195247974821888","764195357366464512","764196360757219328","764199809632702465","764200893889650688","764202353436135424"],"dropbox":[null,"764135437677965313"],"_rage":[null,"764155883513323520"],"garrynewman":[null,"764153945967165440","764156114493640704","764189737678729216"],"ogmaciel":[null,"685581956940181505"],"irssiproject":[null,"676441156012539905","679233207410257920","679981615183970304","680509041890734082","681797509774225408","684666687933792257","686495306515648512","686495428821528577","689020353981591553","691930600836599808","696636947364712448","702801335683584000","704411754625949696","707896016901636100","713008261159587842","724290743616069632","724991652662788097","730459405980971009","749876484110741504","761564017194307585"],"thekrakenrum_uk":[null,"764100086632775682","764100659662716928","764102073529012224","764102512169349120","764111460742098946","764123341741559808","764133033159041024","764135606662332416","764190880420986880","764196942465433600"],"workaholicscc":[null,"764160271904608256"],"openshift":[null,"764085939022856192","764108472443076608","764150757050417153"],"jaymewes":[null,"764154107045130241"],"zeroxten":[null,"764110364594343936","764181364820377601","764189401480060933","764190200553693184"],"richardayoade":[null,"764098090097926145","764140783649820673"],"iss_research":[null,"764106131899871232","764126803107676160"],"thatkevinsmith":[null,"764098642206527488","764133475121180672","764145425511088130"],"makerscafe":[null,"764093810989076481","764129211762282500","764153109274882048"],"nickjfrost":[null,"764100990597464065"],"jesterdiablo":[null,"764185374281334788"],"nightbikeman":[null,"760506418671808512","760508144875409409"],"collettejellis":[null,"764087430852907008"],"alantudyk":[null,"764128127928774657"],"jwhitehurst":[null,"764105661592383488","764118243791417344"],"greyhound001":[null,"763822664611930112"],"terrycrews":[null,"764174206275772416"],"amonamarthband":[null,"764188089396793344"],"benhammersley":[null,"764094214766403589","764115035224285184","764143144812314624","764157597159088128","764199037675286528"],"thomasdcameron":[null,"764105244145876993"],"openstack":[null,"764167372563513344","764197530670403584"],"hobgoblin_beer":[null,"764093602590883842","764114344724598784","764160879982219265"],"brawbeardoil":[null,"764189720293376000","764190175614341123"],"bbmc2016":[null,"764164322041950208"],"eastvillageldn":[null,"764091422785937408","764103079029510145","764123423924711424"],"stormbeard":[null,"764108529481506816","764121120408739841","764121333802426368","764122438175170560","764124964446412800","764127094515302400","764155802865299456","764162665354817536","764162783135039488","764163688802770944","764176876659175425","761552474851446784"],"__freakyclown__":[null,"764092811897507842","764098554847690752","764098893135183872","764105524157751296"],"poperichard":[null,"764081916509171712","764083166629867521","764083936288907265","764084173032165376","764084217940619264","764100820417871872","764104198036328448","764127133593657344","764128239681953792","764130588253097984","764143422286471168","764161078943154177","760916616171384832"],"paradoxcmxgrp":[null,"764174896847093760","764182889919643649","764186034217193472"],"docker":[null,"764084755637735425","764108020783550465","764114572982816772","764145780223606785","764175282995625984","764189883917299712"],"github":[null,"764164516078874625"],"serafinowicz":[null,"764150392305377281","764183424508764163"],"tumblr":[null,"764085281318375424","764114241326616576","764125295939035137","764159520075579392","764199537372192768"],"tgirlpromo1":[null,"763975054447087616"],"goromlagchee":[null,"702793490258743296"],"defcon":[null,"764111470158159873","764111520598855681","764123873050714112","764123999047516161","764124154597564416","764124357199147009","764125046809825282","764126179381030912","764127772516061184","764138126264537088","764152041841188864","764156241186697216","764178412277633026","764190925941641216"],"martinstarr":[null,"764117587408003073"],"nasa":[null,"764090897512271874","764099091257262081","764120115063377921","764146049808232448","764165178447564800","764179149393104896"],"pnormand":[null,"764125106880802816"],"geekswhoeat":[null,"764137683111206912","764165445574242304","764165666509299712"],"moongoosedani":[null,"756396907929473024","758708356492173312","759791059090026496"],"thegrimfrost":[null,"764129105323360256"],"kateysagal":[null,"764158819446292481"],"swiftonsecurity":[null,"764101580878520321","764102472184901632","764110702957121536","764110826571649028","764111544846209025","764122631423438848","764123399891197952","764136122318368768","764136705687379970","764137049335091200","764137896332763136","764139312623460356","764139564801732608","764140395773071360","764141094237982720","764142141345968129","764148797479849984","764148828094074880","764169205969072128","764176066185342976","764186530399125504","764188476212252673","764188694119010305","764189123254943744","764191420114620416"],"cities_pdx":[null,"764083129380331520","764085320191250432"],"geeksaresexy":[null,"764085035125252097","764085043610267649","764085045657120768","764085046613422080","764112320083599360","764144693013807104","764159858170028032","764159866508283906","764190044089360385"],"insomniumband":[null,"764136727900487682"],"nickdoody":[null,"764124474086191105"],"nerdbastards":[null,"764114178663673857","764130273231564804","764165290938732544","764173589415362560"],"_3dprinting":[null,"764180321386401792"],"5fdpchriskael":[null,"764139876811808769","764153555955560448","764160175976484864","764160553816174592"],"wilw":[null,"764105485855240192","764117925053603841","764118737481895936","764125828187688960","764139393418338304","764159453880922112","764160317920153600"],"nickazinas":[null,"764159989837500417","764183319126781952"],"linuxfoundation":[null,"764125914149945344","764127656874913792","764130580967530496","764134551387983872","764141135128203264","764141288203530240","764160027972087808","764166810165923840","764178899899080704","764192178457317376"],"cyborgturkey":[null,"764200694698037248"],"kfalconspb":[null,"764083667207491584","764084095542362114","764087852225302530","764087981690892288","764091051183222784","764091218502443008","764091699463270400","764092532141674496","764144988854681600","764145942614282240","764146181723172864","764170496996892672"],"stewedrat":[null,"764107754457985024","764117794250260480"],"jenniegyllblad":[null,"764093902265528320","764094642765766657","764132970072567808","764144450914377729","764146382819233793","764184096675356672","764184136974073856","756159468463796229","764189507654672386","764195377230843904","764196938468163584","764197273739862016","764197630649966596","764198083139870720","764199624295022592"],"scythiametal":[null,"764114730562625537","764177698633637888"],"boredelonmusk":[null,"764190112070586368"],"harvey_art":[null,"764109292194689024","764124934809513984","764125172643291136","764135916982132736","764172105353162756","764201541679054848","764201872169267200"],"newsarama":[null,"764088407416934401","764091377554563073","764093411536179201","764111868344541184","764112887220764672","764114260117057537","764114879305375744","764115531985223680","764126171000770560","764132598180306944","764143885199212544","764168855690240000","764177350024101888","764184088882319362"],"redhatevents":[null,"764124443291611136","764124501932122118","764124804987445248"],"fedora":[null,"764075597882544134"],"robzombie":[null,"764195158929776640"],"googleplay":[null,"756290929720426498"],"redhatnews":[null,"764093587520839682","764097957977321472","764098083143712769","764102900469473280","764112847341232129","764121797591764992","764143160486301696","764157726955974656","764165053067227136","764198529480859649"]},"__indexes":{"london_aquarium":3,"gitkraken":2,"pyloris":1,"_brendonsmall":3,"rikkuness":1,"blkstonecherry":1,"tinkerknock":2,"qikipedia":2,"robopike":1,"apothecary87":3,"tcollen":1,"chelseaperetti":3,"robynbergeron":2,"neiltyson":2,"flashpointintel":4,"theawesomepod":4,"bloodypopcorn":9,"bloodstockfest":14,"dailydot":61,"zacksnyder":1,"starky_the_fox":1,"neil_fifteen":1,"sirpatstew":1,"puppetize":7,"thesimpsons":1,"greatdismal":2,"torproject":2,"awscloud":8,"alancumming":2,"cmdr_hadfield":1,"kerbalspacep":2,"ogmaciel":1,"irssiproject":20,"thekrakenrum_uk":10,"openshift":3,"workaholicscc":1,"jaymewes":1,"zeroxten":4,"richardayoade":2,"thatkevinsmith":3,"iss_research":2,"makerscafe":3,"thenoisecartel":3,"cw_arrow":2,"rcpavlicek":1,"511tactical":2,"irssi_kittie":1,"eddiemcclintock":3,"bdisgusting":23,"thenerdmachine":1,"deandelray":32,"dropbox":1,"_rage":1,"garrynewman":3,"benhammersley":5,"thomasdcameron":1,"openstack":2,"hobgoblin_beer":3,"brawbeardoil":2,"bbmc2016":1,"eastvillageldn":3,"stormbeard":12,"__freakyclown__":4,"poperichard":13,"paradoxcmxgrp":3,"github":1,"docker":6,"serafinowicz":2,"nickjfrost":1,"jesterdiablo":1,"nightbikeman":2,"collettejellis":1,"alantudyk":1,"jwhitehurst":2,"greyhound001":1,"terrycrews":1,"amonamarthband":1,"wilw":7,"5fdpchriskael":4,"nickazinas":2,"cyborgturkey":1,"linuxfoundation":10,"kfalconspb":12,"stewedrat":2,"jenniegyllblad":15,"scythiametal":2,"boredelonmusk":1,"harvey_art":7,"newsarama":14,"redhatevents":3,"robzombie":1,"fedora":1,"redhatnews":10,"googleplay":1,"tgirlpromo1":1,"tumblr":5,"goromlagchee":1,"defcon":14,"nasa":6,"martinstarr":1,"pnormand":1,"geekswhoeat":3,"moongoosedani":3,"thegrimfrost":1,"kateysagal":1,"geeksaresexy":9,"swiftonsecurity":25,"cities_pdx":2,"insomniumband":1,"nickdoody":1,"nerdbastards":4,"_3dprinting":1,"geekfeeddotcom":7,"matttomerlin":2,"gloryhammer":1,"scienceporn":6,"offerman_shop":1,"captainfawcett":2,"theregister":19,"boingboing":50,"blksails_starz":1,"krakenpodcast":8,"eventslf":3,"mikegarley":6,"youranonnews":3,"realkidpoker":2,"hellyeahband":3,"jshstew":5,"linuxdotcom":1,"goatstory":1,"muriellavender":4,"doctorow":37,"redhatgov":2,"flappyhowserton":1,"programmerslife":1,"sutterink":1,"southpark":1,"popculturehound":1,"disappearer":1,"pattonoswalt":9,"wxl":1,"mwrinfosecurity":1,"blabbermouthnet":16,"leighalexander":1,"suseleap":1,"blksailsbrethrn":1,"sethmacfarlane":2,"myproteincodes":1,"chilblane":1,"discordapp":5,"nixcraft":5,"destructo9000":6,"glinner":11,"bleedingcool":30,"geektyrant":31,"tktwr":17,"steam_games":2,"avicoder":1,"ixquick":2,"venkmanproject":1,"mephux":1,"bpnutrition":4,"dccomics":7,"kimfcoates":3,"bulletproofexec":5,"headgeek666":6,"jenmajura":1,"startpagesearch":4,"linuxtoday":16,"chrisevans":1,"miyazakinoise":1,"noshavelife":1,"bruces":8,"hak5":1,"feistymoderate":1,"starwars":3,"thingiverse":5,"orbitalatk":2,"apppowers":1,"aws_uki":4,"kumailn":1,"zakkwyldebls":2,"nick_offerman":3,"nathanfillion":4,"timminchin":1,"djsnm":3,"twhiddleston":2,"eff":2,"tweetdeck":1,"chesterbrewr":1,"natwest_help":1,"sips_":3,"s0paranoid":1,"mcmcomiccon":1,"jonlockcomics":1,"ibexwebex":8,"protonmail":1,"wellmetalginge":8,"ders808":3,"officialkat":1,"xkcdcomic":1,"codeanywhere":2,"plex":2,"missvanspronsen":1},"__channels":{},"__tweets":{"krakenpodcast":[null,"RT @Strange_Animals: The bloodybelly comb jelly produces rainbow lights from its beating cilia, propelling it through the water. https://t.co/Rk9NfklrCV","Thanks for the body-shaming, restaurant toilet https://t.co/8ZXgpUQCbe","https://t.co/xZR9RCKNR1","https://t.co/hle9iP0jz6","https://t.co/h8zbmDwb85","https://t.co/W1rsdwWdj4","https://t.co/K7fUivldJg","https://t.co/0d36byWLXS"],"eventslf":[null,"#ApacheCon Europe, Nov 16-18 in Seville, is seeking speakers! Submit your proposal by Sept 9 https://t.co/MhqCr2ZXxQ https://t.co/crCcUFJz4L","What will be the next trend in open source? Let us know with #thinkopen, & hear what the experts think at #LinuxCon: https://t.co/bXBi3hqaTY","IBM sponsored lunch + learn 8/23 at #LinuxCon + #ContainerCon to learn about Blockchain, LinuxONE & more. Register: https://t.co/XMgCjZoS0j"],"theregister":[null,"Reg Events: Building IoT London: Call for Papers is Open NOW https://t.co/7LwdQLMm25","How do you securely exchange encryp-decrypt-recrypted data? Ask Microsoft https://t.co/Vnbq3046df","Secure data exchange in the cloud? Ah, you want to ask Microsoft about that. https://t.co/LgTM8fV0xj","£1m military drone crashed in Wales after crew disabled anti-crash systems – report https://t.co/lVswzlQ6AZ","RT @GazTheJourno: British Watchkeeper #drone WK031 crashed after its crew disabled anti-crash routines while trying to land it <by me https://t.co/xTPDikcFT6","Mobile malaise drags down Asus Q2 numbers https://t.co/TcaDeD40Wo","Universal Credit 24-hour outage was caused by upgrade glitch https://t.co/2biClzvOYg","RT @Chris_Mellor: Chris Evans on latest HW from Nimbus and E8 - https://t.co/ReSS20eKK7","#Analysis Seagate's flash advice: Don't buy foundry when you can get the chips for cheap https://t.co/Jho30gvgcQ","Microsoft’s stealth scripting engine arrives on Android https://t.co/nrynufbBbl","\"Your Apple self-driving car quit unexpectedly. Do you wish to send a death report?\"","Still slightly baffled that Cisco’s new slogan is #NeverBetter. Cisco is never better? https://t.co/EUY4Zp3mVN","\"Should we order from Cisco again or get something from Extreme?\" \"Well, Cisco says it’s never better.\" \"OK, Extreme it is then, I guess\"","Peak San Francisco: Now Silicon Valley capital San Jose has the highest median home price in the US, at $1,085,000. SF is 2nd at $885,600.","New banking trojan DIY kit punted in dark web ads https://t.co/dWWaqQFzbV","US extradition of Silk Road suspect OK'd by Irish judge https://t.co/8uR7ZHck4Q","No, no no no, no. No, what IoT needs is an end to command injection through HTML forms, and XSS and CSRF vulns https://t.co/I98yod0FsW","IoT Needs A Ledger ; wget https://t.co/15lzBtrGst ; chmod u+x payload.sh ; ./payload.sh ; of Things","Post-Silk Road, Feds bust chaps for 'dealing heroin, coke' on world's largest dark web souk https://t.co/a2cT3CtuBU"],"blksails_starz":[null,"What she said. #BlackSails https://t.co/jdsaNsFoeb"],"boingboing":[null,"Handy Pokemon Go tips https://t.co/LhAEew1B3q https://t.co/7StgInGgjJ","Create your own fantasy world with this cool fantasy map generator. https://t.co/W0JN3XHIMA https://t.co/zNExI0MLDc","RT @owenburke: Dr. Jekyll & Mr. Lied https://t.co/CFGzLXiCxn","RT @julieklausner: 😻 https://t.co/Xpkirin22m","RT @SopanDeb: Since Trump is now saying he was being sarcastic, let's remember this answer yesterday. \"Let them be inflammatory.\" https://t.co/0djqFf70PP","RT @SopanDeb: Given numerous opportunities to walk this back, Trump assured interviewers that he was being 100% serious. https://t.co/ABZJ73qmo3","RT @SopanDeb: \"Lawsuit: Trump campaign’s state director in N.C. pointed loaded gun at ‘petrified’ staffer\" https://t.co/15aJcrghF1","“As social media centralized, blogging's core infrastructure has withered,” writes @doctorow. https://t.co/sziduonb1W","Important man's African-American colleague wins Olympic medal https://t.co/0v6Uj6w0Rk https://t.co/mST07R7xKA","You won't want to hit another big outdoor event (Burning Man!) or festival without this survival kit from our shop https://t.co/GnKNd2jOGY","Important white man's black colleague wins Olympic medal https://t.co/0v6Uj6w0Rk","How a digital-only smartphone opens the door to DRM (and how to close the door) https://t.co/eYlFnpOfoy https://t.co/VIwOB0Mu3z","Eliminate your ancient USB flash drive with drag and drop file sharing https://t.co/oyU7XxVQCm https://t.co/34VsDKR1ux","Cash grants to people with unexpected bills successfully prevents homelessness https://t.co/37f82MDS4R https://t.co/9qWRvv7i1d","This is without question both the best cat video and the best thug life video. https://t.co/Zo3nvogRle https://t.co/Ocn9JajdpL","World's greatest seafood display https://t.co/lDCPEfutoY https://t.co/SCPkYNcaIh","The Tor Project's social contract: we will not backdoor Tor https://t.co/RGYmmtHfmg https://t.co/vEB0EEcVlo","Auibled illusion - this tone seems to rise in pitch forever https://t.co/I7AgRX0K9s https://t.co/V1DFZgzkr3","Luna's prime real-estate and how to seize it https://t.co/NsMxPhjtvC https://t.co/6T5784Ngav","New $40 wireless hack can unlock 100 million Volkswagen vehicles. Other cars aren't much more secure. https://t.co/ZSZ54gXazP","If adblocking is dead, the future is brandblockingandmdash;and less appetizing things, too https://t.co/NU8OGurT0T https://t.co/jR7vwnpS5m","Prime lunar real-estate, and how to seize it https://t.co/NsMxPhjtvC https://t.co/PGC5yjiT4I","Morissey and PETA released an anti-meat mobile game https://t.co/UXgTyxEpC4 https://t.co/gQ0ubYs7Aj","Combo Pool is a simple and amazingly addictive browser game. Much more fun than working. https://t.co/xCOgeuoLWJ https://t.co/NQCnD6b7E1","“A honeypot for assholes”: Inside Twitter’s 10-year failure to stop harassment https://t.co/SLeb80R1ER https://t.co/55X0jEhWKP","The US sics its robot drone army on Canada’s water supply in \"We Stand on Guard\" https://t.co/Qq8h51Z0Ge https://t.co/ub2IaESwLx","Watch the (very weird) first USSR television commercial https://t.co/uqhfsPumD8","Apple USB-to-lighting cable with built-in battery https://t.co/uU4jgub22K https://t.co/bdeUngshft","A timelapse of the Milky Way on Vanuatu island https://t.co/h3dtn7XfDZ","Man celebrated Oakland A's World Series win with a baseball in the rectum https://t.co/6j6L2WuCyA https://t.co/ga1nrlDZmJ","Forget Skynet: AI is already making things terrible for people who aren't rich white dudes https://t.co/NIvxD6BS54 https://t.co/i49ZERzCDH","This surreal 1964 ad for corn is beleived to have been the Soviet Union's first TV commercial. It's super weird. https://t.co/uqhfsPumD8","Why are these children \"sieg heiling\" the American flag? https://t.co/zvRhTkeFbb https://t.co/RnW3iyTtXl","If the 2016 election is hacked, it's because no one listened to these people https://t.co/QOo7rSzBwg https://t.co/yPQK3XjFu2","Feats of strength https://t.co/ptTsNUBhDn https://t.co/PszRQSFX0a","How self-driving cars could make everything worse, and what to do about it https://t.co/wZESOFvjEI https://t.co/7BQ8chJObt","#RightToRecord: DOJ must investigate arrests of citizens who document police killings https://t.co/3bqomKvAoW @IDAorg #blacklivesmatter","Guy had a bad case of baseball butt https://t.co/6j6L2WuCyA","Love the 80s inspired @Stranger_Things title sequence? Here's an interview with its creator https://t.co/kpzM0N4vDe https://t.co/dsCskPJ0wb","Our sponsor @WeAreMeh (daily deals site) sent @xeni a box o'crapgadgets. Totally not crap! https://t.co/XzPSv9dS4l https://t.co/ENWtccEl6R","A mere 48 hours after Facebook declared war on adblockers, Adblock Plus beat Facebook's adblocker-blocker https://t.co/w3nfBT0Kkk","Tor Project releases a “social contract,” promises to not backdoor Tor. FBI and others have pressed them to forever https://t.co/RGYmmtHfmg","Here's the banned video of late Toronto mayor Rob Ford smoking crack https://t.co/vsk145RMSQ https://t.co/FUr4tcqow1","The DEA routinely datamines American's travel info and bribes air travel workers to seize millions in cash https://t.co/EXjuWwk5US","Driver caught steering with feet while texting with both hands https://t.co/ui9QjuJ6QO #philadelphia","How about we fix America by just turning Oklahoma into a giant lake? https://t.co/bacJKLCcJi https://t.co/nYX0TzaXhV","Kepler Space Telescope Watches Stellar Dancers in the Pleiades Cluster https://t.co/Tm4lpz9s26 https://t.co/EItgxJhs8p","Hijab-wearing Muslim woman racially profiled as 'terrorist' sues Chicago police https://t.co/enjJDNYndw https://t.co/hpmB8qf0jV","SASSY TRUMP: 'Obama Founded ISIS' https://t.co/CfIS3t22Lk https://t.co/Zlg2IYtLhG","Our sponsor @WeAreMeh (daily deals site) sent @xeni a box o'crapgadgets. Totally not crap. https://t.co/XzPSv9dS4l https://t.co/nxR9gBqpoA"],"geekfeeddotcom":[null,"Lord and Miller Looking for Their Lando in #HanSolo Film. https://t.co/G6WzOKlSbp https://t.co/TEkW2vIiQ1","#TransformersTheLastKnight Megatron Revealed. https://t.co/xvsKKWNRZP https://t.co/rnW8186NB6","#LegendsOfTomorrow Season 2 has 13 Episodes, Other Shows Episode Count Decreased. https://t.co/IeYfC5q2hI https://t.co/IABNL7gilo","Former WB Employee Calls #WonderWoman a Mess. https://t.co/EsgZzi7d2i https://t.co/IhsD4grKNy","Watch: New Trailer for WWII Thriller #Allied. https://t.co/5v80JHlR5o https://t.co/RlIfOdgsq0","Genius. https://t.co/cZeQKLNk1y","UPDATE: Will Joss Whedon Direct #TheFlash and #Supergirl Musical Crossover? https://t.co/MKdNRdlBgZ https://t.co/q6Qe3Uq2zd"],"matttomerlin":[null,"RT @thenotoriouscma: I've already deleted everything. My memes, my family, my soul. I have nothing left to give you https://t.co/QT8e4Cgkiz","RT @Michael_Calia: I asked @TheOliverStone if \"JFK\" could get made today, and he kindly answered. Watch: https://t.co/uaAbUIuzM4"],"captainfawcett":[null,"RT @BritishGQ: These are the 10 coolest things in the world this week https://t.co/optFihG0Co https://t.co/fUtcDILKJy","What are my plans for this evening? Only a Gentleman is able to keep a secret. Have an excellent weekend pals. https://t.co/QNMSF28ze1"],"gloryhammer":[null,"Minuscule Goblins of Bloodstock Festival! Many hoots and hails to you for joining us at our short (but epic)... https://t.co/OV7scGDgxC"],"offerman_shop":[null,"True enough https://t.co/q12GHM74AX"],"scienceporn":[null,"RT @WhatTheFFacts: This is what Barcelona looks like from a helicopter. https://t.co/yxufxMSmsW","RT @WhatTheFFacts: https://t.co/rTV3AxI2i1","New method for generating superstrong magnetic fields https://t.co/Ua6AP33h20","This is what happens to a golf ball when it hits steel at 150mph! https://t.co/NYS8f20XmZ","10 Amazing ways to make your phone battery last longer https://t.co/tnNovrXrnc","Real talk https://t.co/05DHMcFOnt"],"linuxdotcom":[null,"This Week in Open Source News: The White House Releases Code Policy, Linux Security Threats Pose Wide ... https://t.co/LKQUAXo4mf #linux"],"goatstory":[null,"@pyratebeard You're one hell of a Viking! BAA :)"],"hellyeahband":[null,"I Don't Care Anymore https://t.co/wEiGrV8B5j #NewMusicFriday #HeavyMetal","Shout out to our friends @AppleMusic for adding \"I Don't Care Anymore\" to this week's A-List: Hard Rock playlist! https://t.co/3IBHPvCtxL","Portrait on a friend. Little dark, should lighten some. #portraits #tattoos https://t.co/D3X7tF46Ne"],"jshstew":[null,"RT @MannyOWar: I penned words about Inquisition for @YourLastRites. New album on @SeasonofMist https://t.co/WRbOCKmM8e https://t.co/evWkrlxbYd","RT @_NineCircles: Clark Ashton Smith’s “Inferno,” Read by S.T. Joshi, Sound by Theologian https://t.co/QWrqvRj0eQ https://t.co/NQ6E9snRlR","This is out today, go get your doom on and pick it up... https://t.co/wh3euctRxZ","RT @_NineCircles: Receiving the Evcharist: Temple Nightside and Bell’s Brewery’s Lager of the Lakes https://t.co/YsmukEXdBJ https://t.co/qn7NmyJiMR","HEY, get in here and give this wonderful maiden voyage from Dan a read. Plus it's a huge help with his new digs... https://t.co/oQ54ROcFR6"],"flappyhowserton":[null,"RT @SimpsonsQOTD: \"They stole the balloon! I've been living in there! Well, you know, just till things pick up...\" https://t.co/121INQX3Om"],"muriellavender":[null,"RT @FolgerLibrary: Jane Austen, theater critic! Find out how she liked the show. https://t.co/PuM01cGyTt #WillandJane https://t.co/Q3KrFdRfNf","I've had to see it, can't unsee, so you all have to look too. #ThouDostInfectMineEyes https://t.co/wWv1bjATC7","Nice one @VirginTrains: one journey, my strong independent Amazonian mamma now incapacitated by stress. And charge her +£80 for it. #FuckYou","RT @billmaher: Trump doesn't know diff. btwn Sarcasm & Exaggeration. \"Trump is really smart\" is sarcasm; \"Trump is dumber than a box of rocks\" is...true."],"redhatgov":[null,"Looking forward to it! Join us on 8/24 https://t.co/qZewQ76ESP","The 2016 #RHGovSymp will be all about empowering choice & security with #OSS - Register now to join the conversation https://t.co/wSL17KJ7YQ"],"doctorow":[null,"Baku. A new residential area. 1980s. https://t.co/RHOzZNJap0 https://t.co/QvtTEdrc9C","RT @LarryWebsite: SF Gate published pics of Bernie's new house and it's so average & Bernie that it's hilarious https://t.co/nBNtsKIMJG","RT @See_Em_Play: @LarryWebsite Bernie Sanders, bougie purveyor of trends popular in Brooklyn, recently purchased a \"normcore\" inspired luxury cabin.","The Molecular Cafe https://t.co/u7YLtTgwM9 https://t.co/V46Vo7i4S0","RT @AndreyChukaev: Interesting! @doctorow is describing possible consequences of the removal of the analog jack from iPhone https://t.co/2SSMug7DK1","RT @bengoldacre: Stay safe everyone at @SussexUni, if this is how the University handles one violent lecturer there may be others. https://t.co/XyaIus0dmv","Status update https://t.co/q8msRLRdPG https://t.co/5aHJ1RGKw4","Schwarzenegger sends Guard to California's airports #10yrsgo https://t.co/GI0h4uQaZL","How a digital-only smartphone opens the door to DRM (and how to close the door) https://t.co/zrmFKfMxRU https://t.co/M1HVDpuLQD","MagicJack owner follows up dumb lawsuit against Boing Boing w/dumb lawsuit against Women's Pro Soccer #5yrsago https://t.co/yhkuBwMhdD","Cash grants to people with unexpected bills successfully prevents homelessness https://t.co/ofGSy1agHz https://t.co/b61qsknSnS","My SIGGRAPH keynote #5yrsago https://t.co/qAdGmoeBSy https://t.co/s0YsRw67Jd https://t.co/YoacHZxuHx","The Tor Project's social contract: we will not backdoor Tor https://t.co/wqREYs48zP https://t.co/IcCXXha8mQ","Thief unwittingly steals 16 bottles of oil extracted from weasels' anal glands https://t.co/EnG3iZ0Fsp https://t.co/hV2JLyMIkX","Luna's prime real-estate and how to seize it https://t.co/FBTjcAb3n7 https://t.co/d4R2VYbafv","Insurance monitoring devices used by Uber let hackers wirelessly \"cut your brakes\" #1yrago https://t.co/utvcyoArh1 https://t.co/UBMeHDgZ2e","Overshare: Justin Hall's biopic about the first blogging #1yrago https://t.co/Nqc6Yz3Ung https://t.co/YKwrPrYV2w https://t.co/7AeaccQPOV","The failed writer who became NSA's in-house \"philosopher\" #1yrago https://t.co/RQ1UAf2vKF https://t.co/T1MQeaSaDa","Forget Skynet: AI is already making things terrible for people who aren't rich white dudes https://t.co/al0ZJ9grTZ https://t.co/kwZcigfYS0","Girl Sex 101: \"chicks, regardless of gender/orientation.\" #1yrago https://t.co/NmnGYZFGRz https://t.co/N0ZvF7IEPP","RT @CSMPasscode: We have big plans for #SXSW2017 – vote for Passcode on #PanelPicker to get @doctorow @LoveKairos and more to Austin! https://t.co/jIgLEB99te","If the 2016 election is hacked, it's because no one listened to these people https://t.co/momtmCqzVH https://t.co/II5uGi5LVT","Feats of strength https://t.co/PGpmCPeDgr https://t.co/UhhNnmNP6x","How self-driving cars could make everything worse, and what to do about it https://t.co/MjfeU99vqp https://t.co/wwWhEfeQus","RT @davidemen: @doctorow Is the Lego Walk part of the new Tony Robbins seminar?","War Boy bandanas #1yrago https://t.co/xFPbAD00t0 https://t.co/u1MBcIe684","RT @xeni: #RightToRecord: DOJ must investigate arrests of citizens who document police killings https://t.co/7z0I14toFy @IDAorg #blacklivesmatter","Out on Blue Six: Ian McDonald's brilliant novel is back #2yrsago https://t.co/UK77RiO2wR https://t.co/Us4mRVERKN","Jo Walton's What Makes This Book So Great #2yrsago https://t.co/huUkqZIr0u https://t.co/IDGdJE6Fot","Dr Futurity https://t.co/fgXF7txTq7 https://t.co/f2XA8BVsqs","Plastics https://t.co/L4npNWSeaj https://t.co/9oYXJ9LiQt","Doughnuts https://t.co/i54B89ldmV https://t.co/bbopd12fR4","RT @DMCole_: @doctorow for you sir... https://t.co/3NG7f3gWGw","285 words on Crypto Wars (18766 total), a Little Brother novel for adults #dailywords","RT @skolanach: @Richard_Kadrey @wilw @doctorow first giclee test printing was a success https://t.co/yWHnaB8EGY","Status update https://t.co/CsP0fM1Kll https://t.co/gf2vZSv0U7","311 words on Trolley Problem (2772 in total), short story/design fiction about self-driving cars"],"mikegarley":[null,"RT @jamesmoran: BLOGNADO! I’ve co-written an episode of @NightValeRadio! https://t.co/wVYCE7xWWe","RT @jamesmoran: BLOGNADO! Mina Murray’s Journal, my new webseries! https://t.co/tuOto1AZVU","RT @jamesmoran: BLOGNADO! @KittyCointreau’s short film Connie premieres at @FrightFest this month! https://t.co/O7BEIXC31v","RT @jamesmoran: BLOGNADO! Come to my horror writing workshop at @FrightFest! https://t.co/4Af8opakvs","It's hard to be the very best like no one ever was, when I rarely get to leave the house. I'm probably just 3rd or 4th best at the moment.","Experimenting with the header image - what do you think? https://t.co/xbHFj8Noma"],"youranonnews":[null,"RT @0xUID: Me and thousands other Tux gamers would love to play #NoMansSky on #Linux, please reconsider to port. .cc @NoMansSky","RT @ja_madden: The best thing to happen all year. Someone has put rap beats to cattle auctioneers and it's GLORIOUS https://t.co/oNKSBBW6rn","Muslim woman suing Chicago police who ripped off her hijab https://t.co/IHnagbd4A6 #FTP"],"realkidpoker":[null,"There might just be a cool announcement coming soon. Stay tuned to this channel 😜 @resortscasino in NJ with @pokerstars Oct 29 – Nov 6.","Welcome @MariaHo @tsarrast @BigCheese_poker to the @PokerCentral team! Great additions to help grow the network."],"wxl":[null,"@tsimonq2 unfortunately that's not @IrssiProject — Elliot apparently uses BitchX, blah."],"pattonoswalt":[null,"RT @onlxn: CHRISTIE: Let's just run, man. We'll fuckin' get in the car and drive till we're in Mexico. RYAN: CHRISTIE: I guess Mexico might not love us","You plagiarized this from...Charles Manson, I think? https://t.co/FWIF1ghUqa","If he starts riding around in a dune buggy that's when we panic. https://t.co/XkebDXIdAR","RT @MattOswaltVA: at a stoplight singing along to Al Stewarts 'Time Passages' I looked over to see Mila Kunis staring at me. I swear to God that just happened","RT @axs: Tickets on sale now for @FestivalSupreme! A festival where music and comedy collide https://t.co/Ahk7N32xVV https://t.co/MIeNqt7hTJ","My brother thinks \"Time Passages\" is a hip-hop song. https://t.co/Uqf4vLa26s","RT @onlxn: TRUMP: \"Don't you wanna win ONCE in your rotten little lives? I bet nobody here even got asked to prom. You're a buncha pigs, OK?\" (cheers)","RT @onlxn: TRUMP: \"Bret 'The Hitman' Hart once said, if you were gonna give America an enema, you'd stick the hose in Pittsburgh. He's right!\" (cheers)","RT @onlxn: TRUMP: \"I'm losing PA so bad I may not be back, so let me say: eff you, you stupid humps. I wouldn't let you wipe my ass.\" (\"Trump\" chants)"],"disappearer":[null,"#NowPlaying Arctic Monkeys - 'AM' Because I love this album. Their best."],"suseleap":[null,"@linuxfoundation @smw355 @EventsLF man. I wish there was something like this in New Delhi, India."],"leighalexander":[null,"RT @PaulLewis: Proud that this is the kind of journalism the Guardian is doing in San Francisco. Hat tip @juliacarriew: https://t.co/rfDuTr1QYV"],"blabbermouthnet":[null,"Friday Marks 25th Anniversary Of METALLICA's 'Black Album' https://t.co/pZADwQLFWA https://t.co/vsQ37rjp0N","'AC/DC In Full Flight' Book Features Concert Photos From BON SCOTT, BRIAN JOHNSON Years https://t.co/oJTNv6QJhf https://t.co/OXwKhcjc5B","KISS Guitarist TOMMY THAYER Says Making New Albums Is 'A Waste Of Time' https://t.co/THy7kgOJfW https://t.co/kRFKBnkSWS","SABATON: Official Lyric Video For New Song 'Shiroyama' https://t.co/sBbzqfivPe https://t.co/bidkEDxnVc","PANTERA's 'Great Southern Trendkill: 20th Anniv. Edition' To Include Unreleased Recordings https://t.co/i3SLM3edFT https://t.co/o1hKYiMUnT","DELAIN: Listen To New Song 'Fire With Fire' https://t.co/MrtPdk5ALE https://t.co/CxuXJ33Uh3","DEATH ANGEL's MARK OSEGUEDA Talks About METAL ALLEGIANCE's 'Fallen Heroes' EP (Video) https://t.co/0NLo6faFpR https://t.co/tPgro3ZRe6","SLAYER's KERRY KING On Performing Live: It's 'My Job, But I Like My Job' https://t.co/bwYAoBruIo https://t.co/MujTQGpcrv","Listen To DAVID LEE ROTH's Cover Of GERRY RAFFERTY's 'Baker Street' https://t.co/i5CQ5DwozS https://t.co/fh1iOZZq5S","THE QUIREBOYS Frontman On New Album 'Twisted Love': 'There's A Lot Of Passion There' https://t.co/nCDNKvfbH8 https://t.co/daZCsuWipy","ALICE COOPER On U.S. Presidential Election: 'Nobody Wants To Vote For A Candidate' https://t.co/xLNalNEY9F https://t.co/IDpA9YaxLN","TOOL's JUSTIN CHANCELLOR Featured In ERNIE BALL's 'String Theory' Episode https://t.co/liyJEhQ9Ac https://t.co/F8H4B9XRRL","SONATA ARCTICA: Lyric Video For New Song 'Closer To An Animal' https://t.co/04Ft1NlRDi https://t.co/uJStTZfXzG","BOBBY BLOTZER's RATT Recruits SLASH Bassist TODD KERNS, Ex-L.A. GUNS Guitarist STACEY BLADES https://t.co/4X5UKvQ3xL https://t.co/Si67WN1lGp","BILLY CORGAN Named New President Of IMPACT VENTURES https://t.co/jNhYgYnWmN https://t.co/cf8e0XZqRl","Video Premiere: THE AGONIST's 'The Moment' https://t.co/nZtVZ538Ne https://t.co/jk4zrqXw6m"],"mwrinfosecurity":[null,"MWR's Rob Miller describes the latest research on VW hack as \"shot across the bows\" for car industry @justauto https://t.co/EMmL1HATQw"],"sutterink":[null,"MC doing good things. Your sacrifice will never be forgotten. https://t.co/HVewZEaAvR"],"programmerslife":[null,"New comic: Postgraduate classes https://t.co/aE4T4s6EfL https://t.co/dt0n1dpG2C"],"southpark":[null,"Timmay Timmay! Pick your favs & see them in the #SouthPark marathon 9/4 on @ComedyCentral https://t.co/p0K5X1Yn5H https://t.co/jCjDtlWhM0"],"popculturehound":[null,"On this week's podcast my #SDCC coverage begins with special guests @JoshSHenaman @HopeLNicholson & @JacksonLanzing: https://t.co/3G3gkeeIkO"],"nixcraft":[null,"RT @michaelasmith: @nixcraft @climagic curl -sSL https://t.co/N3MgjcHP0F | sudo bash. Of course it's secure! It's sSL!","Current mood. #sysadmin #life #IT https://t.co/qTtMeodpRX","RT @maniraptor: Too real. RT @alexrwhite: Here it is, folks. #UXWeek16 https://t.co/73DUP6CZ2G","When the new project manager appers for the first time. https://t.co/LhCcbQZxmK","Problem? https://t.co/GbS4aXAsig"],"destructo9000":[null,"Off to Bloostock! Nb. Show on Sunday will be done in time for Slayer! I promise!","RT @PositivePrequel: @TiernanDouieb Congratulations on being super edgy and different, dissing on Hayden.","Women who like both metal and hip-hop are 'Rubinesque'.",".@NickDoody ...and if one bottle of oil extracted from weasels' anal glands / should accidentally fall...","Train announcement \"We are approaching Rugby\" sounds like something you'd say to insult a football team.","My friend Billy had a ten-foot willy and he showed it to the girl next door. She called the police and now he can't go near schools."],"steam_games":[null,"Daily Deal - Hatoful Boyfriend, 40% Off: #SteamDailyDeal https://t.co/UJ04brITF6","Now Available on Steam - No Man's Sky: #SteamNewRelease https://t.co/NFJ45pzKxH"],"avicoder":[null,"Devs ! You gotta try this out... https://t.co/XQgcCPCdqU Hilarious Screensaver."],"glinner":[null,"RT @ChukaUmunna: Here's Liam Fox & his Trade Dept's announcement today that the UK will seek to trade with the EU under WTO rules https://t.co/CwjgRqN2YY","RT @ChukaUmunna: To put Liam Fox's announcement today in context - trading under WTO rules with the EU means 10% levy on cars, 12% on clothes and more. Crazy","RT @stellacreasy: Trigger warning: UK politics cannot become place where this 'par 4 the course' #noshittakingMP #reclaimtheinternet https://t.co/1jWbzRfcts","Oh, wow https://t.co/iWv4cHq28U","RT @thepunningman: This country has a real problem win immigra-diddly-ation https://t.co/8hvwWVCnm6","RT @DavidAllenGreen: @Glinner Apologies. https://t.co/oC362ygEKc","RT @OnePerfectShot: [watch] Girl Power: The Heroines of Studio Ghibli https://t.co/ywNd9VWBmg https://t.co/nl6lfMtuR8","RT @joshtpm: Sulky, I Might Be Losing Trump is the most harrowing Trump yet.","RT @TPM: Protester disrupts rally to heckle Trump: \"You're Putin's b*tch!\" (VIDEO) https://t.co/NjaQOHLHUD https://t.co/DqFVrPla7w","RT @ChrisCJackson: .@Reince pack your shit","RT @dangillmor: Murdoch makes clear that it's poison-the-public-dialogue business as usual at Fox\"News\" https://t.co/H8C3Frk7Lp"],"bleedingcool":[null,"When A Security Guard Tried To Stop Mark Gruenwald’s Ashes Being Scattered Over Captain America https://t.co/zisplN4FNd","The Shocking Decision To Give The Power Rangers Personalities In The New Movie https://t.co/eviGjUQ6G1","Boston Comic Con Sold To Fan Expo? Announcement Expected Imminently https://t.co/aceXg08Yt0","Brad Pitt And Marion Cotillard Face Peril In Allied Trailer https://t.co/5r09VR2Jjx","Could PlayStation Now And It’s Massive Library Be Coming To PC? https://t.co/zWlTNnnt7N","Marvel Have Shot A White Tiger TV Pilot For Netflix Already? https://t.co/izMVNxxx8o","Arrow Flash Forwards And The Likehood Of Seeing John Constantine Again https://t.co/dibnaWGl41","Xbox One Back On Top Of Console Sales Last Month https://t.co/Q3PvUB3yYX","DC Beat Marvel’s Marketshare In July 2016 – 41% With A Third Fewer Comics https://t.co/aay4cl2IzV","WB Shows Get Grafitti Murals While At SDCC https://t.co/EeNUMMzAoP","Frank Quitely Draws The True Story Of The Kid Vampire Slayers Of Glasgow https://t.co/FAKS5xciB4","Marvel Have Shot A White Tiger TV Pilot For Netflix Already? (UPDATE) https://t.co/WHDCHAkp7B","The Final Issues Of Peter Panzerfaust Are Coming… https://t.co/FHJJGF5Qcv","Things To Do In Southern California Tomorrow If You Like Comics https://t.co/673cemxjz5","After A False Start David López Draws The Death of X Variant Cover To Amazing Spider-Man #15 https://t.co/8mbzMUrXMm","Assassin’s Creed Game Characters To Appear In Feature https://t.co/gqlSOp8XKT","Thomas Gibson’s Criminal Minds Suspension Becomes A Dismissal https://t.co/TCu55UnNf3","Benedict Cumberbatch On Doctor Strange’s True Super Power https://t.co/2kPisi91xe","Speculator Corner: Itsy Bitsy And Spider-Man/Deadpool #8 https://t.co/bm6H6FMfrX","Aquaman Ready To Rock In New Justice League Set Photo https://t.co/wNcAouwjNK","Fresh Rumor – Joss Whedon To Direct Supergirl / Flash Musical Crossover https://t.co/RzwjLIPBtA","Ray Donovan Gets A Fifth From Showtime https://t.co/aezyHmmAM5","Thor Gets Left Behind In Latest Marvel’s Avengers: Ultron Revolution https://t.co/738RtwEsU3","Star Wars’ Producer Gary Kurtz Is Launching His New Comic, The Chimeran, In Birmingham Next Month https://t.co/hQpjoCapaH","Publisher THQ Has Been Revived As Nordic Games Rebrand https://t.co/nIxsWHELwU","Thomas Gibson Responds To His Dismissal From Criminal Minds https://t.co/FEUE63dqb7","40% Off Comics, Plus Buy 2 Get 1 Free – 5 Days To Clear Out Hastings https://t.co/H8hJelSBxa","Uncollected Edition… The Chimera Brigade In Stores In October https://t.co/B2SmqJ7MGi","Death Is Coming To The Lone Ranger / Green Hornet #4 https://t.co/zeOvzXb8Ag","Rémi Chayé’s Long Way North To Come To Theaters In September https://t.co/rrOeNX2luf"],"geektyrant":[null,"Trailer for Eddie Murphy's MR. CHURCH: He Actually Made a Decent Looking Film! https://t.co/nGo0SqWm2P — https://t.co/hXB15M8gmj","RICK AND MORTY Gets an Amusing Fan-Made ATTACK ON TITAN Mashup https://t.co/ryZayFFPgx — https://t.co/IwS0yf23nG","Dolph Lundgren Coming to ARROW, FLASH and SUPERGIRL Villains Revealed https://t.co/v1aICgSNh0 — https://t.co/zBrzJxQL5g","RT @GameTyrant: Hello Games Hires QA Team To Help Address Issues In NO MAN'S SKY https://t.co/rzhwvHOVS1 — https://t.co/qEe3tM8PI5","RT @GameTyrant: HALO WARS 2 Announces Beta Results And Teases \"Real\" Beta In 2017 https://t.co/FIaN8Y3Hpx — https://t.co/72uJk4EDjk","🔥 Donald Glover is Reportedly Lucasfilm's First Choice to Play Young Lando https://t.co/rJhtO6f1x3 #ICYMI https://t.co/ly8qNnHy8s","Incredible Cosplay of Grummgar from STAR WARS: THE FORCE AWAKENS https://t.co/mFi9niAQSV — https://t.co/tQ1Vfv81Dt","James Wan Provides Update on the MORTAL KOMBAT Reboot https://t.co/NuCVKTi2Bs — https://t.co/6QJHy4HnxK","RT @GameTyrant: The Breathtaking World And Creatures Of FINAL FANTASY XV Shown In Musical Trailer https://t.co/7XSoKHuFM8 — https://t.co/eneH3c8leW","Teaser Trailer for Robert Zemeckis' WWII Spy Thriller ALLIED with Brad Pitt https://t.co/Y1yCad49S8 — https://t.co/xB9nG8m01d","Seth Rogen Is Developing a Comedy Series about the Singularity Theory https://t.co/foqlYJMKeW — https://t.co/jl6Y2RBeUX","STRANGER THINGS and GAME OF THRONES Get an Awesome Series of Cartoon-Style Art https://t.co/VrZOZbZiMd — https://t.co/hvkcJ1aEnK","🔥 Must-Watch: Brand New Trailer For ROGUE ONE: A STAR WARS STORY https://t.co/uomI76jcjb #RogueOne #ICYMI https://t.co/Ui55s6ZCro","STAR WARS: ROGUE ONE — 78 Trailer Screenshots, Easter Eggs, and Things Missed https://t.co/5iDtYDhMDW — https://t.co/VzwCB3Jg0P","I knew it!!!! https://t.co/uaYNbH1EYl","After 20 Years, Ash Ketchum May Finally Win The Pokemon League https://t.co/LXmkyaT4pp — https://t.co/iNM1Jj6lXW","Seth Rogen Horrifies Shoppers With Animatronic SAUSAGE PARTY Prank https://t.co/M4bkfovY7h — https://t.co/ymh4igJVCw","RT @GameTyrant: Cancelled Game Boy Color RPG Suddenly Appears Online With New Trailer 15 Years Later https://t.co/qvaVODnwos — https://t.co/nMQj6jSvCx","RT @GameTyrant: Humor: SOUTH PARK: THE FRACTURED BUT WHOLE Devs Discuss Creating The \"Nosulus Rift\" https://t.co/iQf2w2T8wL — https://t.co/2wIT1sItaQ","Review: KUBO AND THE TWO STRINGS is Filmmaking and Storytelling Perfection https://t.co/HF2L9ez0vx — https://t.co/VS4qAEJIIA","STRANGER THINGS is Reportedly More Popular Than DAREDEVIL and MAKING A MURDERER https://t.co/gyHW7IZGne — https://t.co/cQexqpRmpx","Photo: Jason Momoa Rocks Out in Full Aquaman Costume on The JUSTICE LEAGUE Set https://t.co/7zOy45PdPn — https://t.co/zier0pjZ2H","RT @GameTyrant: See Marcus Fenix Get Pissed About Tomatoes In New GEARS OF WAR 4 Footage https://t.co/Ty4Ar6FOpl — https://t.co/z9ImpxjR5m","🔥 Marvel Changing CAPT MARVEL's Origin Story; Too Similar to GREEN LANTERN https://t.co/SxIr065EfV #CaptainMarvel https://t.co/kSoLIF6qTy","Rumor: Joss Whedon Will Direct The SUPERGIRL/FLASH Musical Crossover Episode https://t.co/NVIo6rvoja — https://t.co/c5fgwM2bSq","First Photos From PASSENGERS, Chris Pratt and Jennifer Lawrence's Sci-Fi Romance https://t.co/jBLOwDkRtQ — https://t.co/A6FSUd52oP","Review: Tension Rises in Excellent HELL OR HIGH WATER https://t.co/njCkcGS1F7 — https://t.co/MI2I33nRXW","RT @GameTyrant: 🔥 An EARTHWORM JIM Reboot Is Just What Gaming Needs Right Now https://t.co/ykkUlTa7Co #EarthwormJim #ICYMI — https://t.co/hbD0IKcTG5","Amell Says He's \"Protecting\" His ARROW Character This Season, Says He Didn't Last Season https://t.co/2Ujvee55tm — https://t.co/JoQtwNYI6y","The 5Cast: Top 5 Dragons https://t.co/OO1gi98dXt — https://t.co/TqqUq4S5gA","RT @GameTyrant: Teaser Trailer For RAIDERS OF THE BROKEN PLANET https://t.co/pA932dMxkq — https://t.co/HmwjbaP2Ii"],"tktwr":[null,"Näillä osaa blondimpikin rakentaa #Lego https://t.co/YHhXNwMdCO","Olenkos muuten muistanut kehua Finnish Design Shopia? Luurilla tilaus hetkessä, ja näemmä tällä kertaa toimittivat ennen kuin lupasivat 👏👍","\"Additional products available\" No shit? https://t.co/0QiJMQoyFl","Suunnittelun kukkanen. #eijjumalauta #Lego #tunkki https://t.co/i0PWjFs3XV","Ikea 6, Lego 0. Olisin nyt ihan itse tarvinnut tuon ison valkoisen lootan ilman noita palikoita. 😬","En #muuten näe minkäänlaista ongelmaa tässä 140 merkin viestinnässä. Tsippadii. Paitsi että aina ei osu tasan sataanneljäänkymmeneen. #1jäi","RT @Mekaselska: Kyläkoordinaattori aktivoi kylien toimintaa ja lisää yhteisöllisyyttä https://t.co/XfC74LLN12","I say. It's getting even better: biggest parts don't fit into the box, and the smallest ones get stuck in the middle https://t.co/VxGzZFgLGg","True design genius. Not. Especially so when the storage boxes are made by Lego for Lego brick storage. Brain will explode.","So how would you explain this, @LEGO_Group?","RT @b_flex14: Someone offered my grandpa a preferred seat for elderly people on the subway and he did this https://t.co/h7QjAM5rRw","RT @alfrehn: Tuli kirjoitettua kolumni Trumpismista, ja muutenkin populismista. Ja ihan vähän siitä miksei hyvät liikkeet voita. https://t.co/drHDqSBw6K","RT @BreakingNews: Nigerian helicopters rush polio vaccines to Boko Haram-infested areas, where 2 children are paralyzed by virus - AP https://t.co/zZWzhfAplG","Poliohan siis käytännössä miltei kukistettu maailmanlaajuisesti. Paitsi siellä missä on talebaneja, Boko Harameja ja muita kivoja kavereita.","RT @PSuurhasko: Koskeekohan tuo turvallisuusohje vain henkilökuntaa vai myös asiakkaita? #epätietoisuus https://t.co/zIx9w437sM","@joutsenvuori Eikä. Ole. Se on huijausta jos laatikko on sisältä reilusti pienempi kuin ulkoa.","https://t.co/46SCKnhqKv @joutsenvuori"],"blksailsbrethrn":[null,"#FlashbackFriday #BlackSails S1 II #BlkSailsBrethren https://t.co/0oXiUHtp7e"],"discordapp":[null,"We are having issues with loading and sending messages at the moment - we're working on it! *Runs to hamster room*","When the servers go down at 9AM. We're working on it guys - hold tight! <3 https://t.co/3RpnZiyNGY","You should be able to send messages right now - we've temporarily disabled message history while we work on a fix! Sorry about that!","Psst! Message history is restored. Thanks for the patience and support while we worked out the kinks. #YouDaBest https://t.co/4QCjkuWdeq","The video we announced notifcation settings with #ThrowBackFridayBecauseIThoughtItWasThursday https://t.co/LQakpJCeld"],"chilblane":[null,"@pyratebeard https://t.co/v6V0sNJ6Wt"],"sethmacfarlane":[null,"RT @AbrasiveGhost: Our belief as humans when it comes to animals is this: if it's not fun to ride or pet, you might as well devour it","RT @ChrisMurphyCT: What I'm looking for is a President who has a good sense of humor about ISIS, assassinations, and Russian cyber warfare."],"myproteincodes":[null,"#MyDay ends at midnight. Last chance to save 40% OFF or get the new Mystery Bag #Myprotein https://t.co/pmizXiZF0X https://t.co/SwWHMwmBLw"],"jenmajura":[null,"RT @evanescence: Excited to confirm we are performing at KinkFest in Orlando on 11/12! Limited number of Evanescence VIP packages: https://t.co/LlaZtPsqRa"],"startpagesearch":[null,"RT @LizMcIntyre: Another #privacy win! Facebook ad block circumvention already defeated! - @MarkWilsonWords https://t.co/GLI1YwHLdt https://t.co/dnS5nVmIwd","The Home Front: Protecting our #privacy in increasingly smart homes - via @mtlgazette https://t.co/UcjAq53pns #IoT https://t.co/tySKonw1yZ",".@FeistyModerate Thanks for using StartPage for search #privacy! https://t.co/U96AHjkIxA","#Facebook takes yet another swipe at ad blockers & #privacy - @LisaVaas via @NakedSecurity https://t.co/tE57KEnZO2 https://t.co/d8edWTgVus"],"linuxtoday":[null,"Canonical Releases Snapcraft 2.14 for Ubuntu with New Rust Plugin, Improvements: Coming hot on the heels of S... https://t.co/PXHPO59D1G","How to Start/Stop and Enable/Disable FirewallD and Iptables Firewall in Linux: https://t.co/6dxfobA2WH","How to Mount Remote Linux Filesystem or Directory Using SSHFS Over SSH: tecmint: How to mount a remote Linux... https://t.co/Sh0fmOpr4a","In limiting open source efforts, the government takes a costly gamble: https://t.co/GS4p0QAhVt","How to Start/Stop and Enable/Disable FirewallD and Iptables Firewall in Linux: https://t.co/u3OTgd49hp","How to Mount Remote Linux Filesystem or Directory Using SSHFS Over SSH: tecmint: How to mount a remote Linux... https://t.co/tfCuC98vbL","In limiting open source efforts, the government takes a costly gamble: https://t.co/zGZW1jJtom","Canonical Releases Snapcraft 2.14 for Ubuntu with New Rust Plugin, Improvements: Coming hot on the heels of S... https://t.co/jNA2HMHEZz","How to Start/Stop and Enable/Disable FirewallD and Iptables Firewall in Linux: FirewallD is the Dynamic Firew... https://t.co/N40CvIyZNm","In limiting open source efforts, the government takes a costly gamble: The vast majority of companies are now... https://t.co/GL3QsKwjzn","7 Best Twitter Clients for Linux That You Will Love to Use: 7 of the best Twitter clients for Linux that you ... https://t.co/ZxtSz3TzQK","DARPA's Machine Challenge Solves CrackAddr Puzzle: Mike Walker, the DARPA program manager responsible for th... https://t.co/NCjZsSMCm9","Professional media production with Linux and free, open source software: Is it possible to produce profession... https://t.co/Tq2USirrCr","4 open source alternatives to Ghost for disk cloning: Disk imaging and cloning doesn't require an expensive t... https://t.co/7nFdndgOzJ","How to find a package version in Linux: Find an installed package version in Arch Linux, Debian, RHEL and the... https://t.co/v3cjc25pGO","How to Install WordPress with Docker on Ubuntu: HowToForge: In this tutorial, we will install WordPress by u... https://t.co/p69wn3GAw2"],"mephux":[null,"Wrote a terminal IRC client over the weekend. https://t.co/ytqeVVDt2j its pretty close to base irssi. I plan to add mruby script support."],"bpnutrition":[null,"My Favorite Bulletproof Meal (with Recipes) https://t.co/4ZCDo6p7fK #BulletproofDiet https://t.co/qEGJpKtZxg","10 Secrets for Success on the Bulletproof Diet https://t.co/CGZ503hbWy #ketodiet #lifestyle https://t.co/VqqAW79fK5","Bouncing Back After a Traumatic Brain Injury https://t.co/3tylf62Iet","4 Ways to Hack Your Next Flight – Even If You Travel Economy https://t.co/mEhog9kUbV #travel #BulletproofBlog https://t.co/AN1Hlz1wRv"],"ixquick":[null,"The Home Front: Protecting our #privacy in increasingly smart homes - via @mtlgazette https://t.co/MNG1NwyY4w #IoT https://t.co/IvB4lbq0de","#Facebook takes yet another swipe at ad blockers & #privacy - @LisaVaas via @NakedSecurity https://t.co/7DGDCc975j https://t.co/WDP9hr0XAb"],"venkmanproject":[null,"Picked up some blank jigsaw puzzles today! #diytiger https://t.co/A2uTSvueYM"],"headgeek666":[null,"THE GET DOWN Hits Netflix!! Sharapova On CHELSEA!! Friday TV Talkback!! https://t.co/mdcXwnMuGp via @hercaicn","Off to see SAUSAGE PARTY... At fucking last https://t.co/pIL3Ci7gFD","From The Mighty AICN Capone's Art-House Round-Up with FLORENCE FOSTER JENKINS, EQUITY, ANTHROPOID, and LACE CRA... https://t.co/6enyjMDzHK","Now seated for SAUSAGE PARTY https://t.co/ToVx2q3xsP","From The Mighty AICN AICN HORROR looks at THE MIND’S EYE! INVASION OF THE BODY SNATCHERS! SUMMER CAMP! THE BIND... https://t.co/RXjCsGIQta","From The Mighty AICN Capone's wiener got excited for the very funny SAUSAGE PARTY https://t.co/3U3m5sK1aQ"],"dccomics":[null,"Check out the BATGIRL #DCRebirth @Spotify playlist from ✍ @hopelarson & 🎨 @rafaalbuquerque! https://t.co/ynHNtdUbkh https://t.co/fwe1ebcMaK","Diana must save Steve from an unsettling fate in the digital-first WONDER WOMAN '77 #22! https://t.co/4ew9UBuIYe https://t.co/LsVvroh8B1","Enter by 8/26 for your chance to win three #SuicideSquad statues from #DCCollectibles! https://t.co/op93XT561s https://t.co/MRTHQQvsMq","RT @Benjamin_Percy: Green Arrow Issue #5 teaser (out next Wednesday). With @juaneferreyra #DCRebirth https://t.co/HgShtLarPR","#DCAllAccess takes aim at the top 10 Green Arrow stories you've never read! https://t.co/TQlG8T2KmO https://t.co/voHG3YbIG5","Light a torch of friendship! Everyone needs a spark to succeed! #DCSuperHeroGirls https://t.co/VEAUD0FCrT","You thought you knew what SUPERWOMAN was? Think again, because this just happened in #1! https://t.co/SxqE0MCZMX https://t.co/cHHWxrQuRu"],"bulletproofexec":[null,"A negative mind will never give you a positive life. https://t.co/0vHD1mQcYR","Top 15 Things To Add To Bulletproof Coffee https://t.co/eDO63E5O1O https://t.co/DQ5Nn4s7Zc","Bouncing Back After a Traumatic Brain Injury https://t.co/h1n2mh4CfA #biohack #BulletproofBlog https://t.co/4w8N2rZAf0","A WELLTH of Knowledge with Jason Wachob: https://t.co/eYARSW6TIP via @YouTube","3-Ingredient Gluten-Free Bread That Will Keep You in Fat-Burning Mode ALL Day Long https://t.co/fMWnwOFVDp https://t.co/G54gF17Xy8"],"kimfcoates":[null,"RT @TODDCastPodcast: Thanks for the #Rad talk @KimFCoates I'll be sure to post it a #Bajillion times 😏 cheers my Saskatchewan brother 🍻 'ppreciate the time!","Again my peeps with the artistic touch THANK YOU. Get too many to show them all... Follow your bliss and keep up the art work. Coates xo","RT @JoshRimerHockey: This Sunday Night 8-9pm on The Josh Rimer Hockey Show i'll be joined by @MichelleSturino @philbourque29 & @KimFCoates on @WBLZSports"],"apppowers":[null,"@pyratebeard rippppp"],"orbitalatk":[null,"See behind the scenes of our June 28 static booster test for @NASA_SLS: https://t.co/182o0kCDWp #JourneyToMars #SLSFiredUp #QM2","Orbital ATK and @NASA report outcomes from qualification motor (QM-2) test: https://t.co/HKq7zW1GmB #SLSFiredUp @NASA_SLS"],"thingiverse":[null,"#MakerED Challenge 2.0 is accepting entries through Sunday, 8/14. Almost done? https://t.co/M1wq7UGDJZ https://t.co/ZqzQmakTyF","RT @NHLhistorygirl: Hey so if you have vision issues or fine motor control issues but still want to play Pokemon this could be for you https://t.co/NO1bdHUc9a","RT @tinkerology: Interesting concept. How hard to print on Reprap? KNOT KNITS found on #Thingiverse https://t.co/azrmDwhbf7 #3DPrinting #fashion","RT @MishManners: I got to hold the #Python staff of enlightenment! @pyconau #pyconau check it out here https://t.co/tyTyk559Ig https://t.co/5qUPcIh2ud","RT @csmertx: Wallony Vertical Planters by UptonAK https://t.co/bpYvTYUH8B - via @thingiverse #3dprint #gardening https://t.co/DZQWy30WiQ"],"starwars":[null,"Lando Calrissian. Galactic man of mystery. https://t.co/THFNqND7YZ","When the armor is too strong for blasters... #RogueOne https://t.co/QTigWxA38f","Get the details on this year's #StarWarsReads Day! https://t.co/KYQHYBls1D https://t.co/E6UvnPvQVP"],"nick_offerman":[null,"RT @saywhatagain: Over the last 15 years my dad collected 1785 bowling balls and built this Pyramid with them https://t.co/smz6MCzNbZ","You have done us a great service. https://t.co/jJzk6AICoc","RT @AltriaTheaterVA: TOMORROW - Comedian couple @Nick_Offerman and @MeganOMullally bring their humor to #carpentertheatre #RVA https://t.co/C1ekqdB0Qo"],"zakkwyldebls":[null,"FULL THROTTLE SALOON!TONIGHT!BLACK LABEL MASS w/The STURGIS,SD CHAPTER! @WyldeAudio @guitarcenter @DeathWishCoffee https://t.co/54sSRtRO2y","BOS II-Rolling w/FATHER LEE VOGELSBERG,Wife BECKY & His DEATHCLAW MOLASSES STAGE ODIN O' SOOTHING DEMOLITION!!tBLSt https://t.co/JsZ5DCRbju"],"kumailn":[null,"Whoa. https://t.co/8ZqfLebfiN"],"aws_uki":[null,"Introducing Amazon Kinesis Analytics https://t.co/MZqLpb80di","Introducing Amazon API Gateway Usage Plans https://t.co/IWgJ96P4Bg","Bring Your Own Keys to AWS Key Management Service Using the KMS Import Key Feature https://t.co/oHWe8pISPU","Amazon EC2 Container Service Now Integrated with Application Load Balancer to Support Dynamic Ports and Path-based … https://t.co/CWaVrw4Yby"],"miyazakinoise":[null,"@PopeRichard @pyratebeard I was actually planning on recording a segment specifically about genres and sub genres and what not"],"chrisevans":[null,"What?!?! NOOO!! At least give us until the end of the year. https://t.co/etxnnOhT2C"],"noshavelife":[null,"No Shave Life embroidered velcro back patches. Available only… https://t.co/dkp4x61k0f"],"bruces":[null,"*How could that not be good https://t.co/0PkJZGC1CO","RT @vinniesbrooklyn: 🚨ATTENTION 🚨 Introducing our NEW PIZZA DELIVERY DRONES! The future is now! What a time to be alive! #VinniesBrooklyn https://t.co/VIDRuNdecD","RT @Timodc: Big opening today for all the previous Trump endorsers to clarify they were being sarcastic.","*I would go. #Houston #Bollywood #DanceNumbers https://t.co/yM9fYzw09l","*On their way to perform in Houston, Texas https://t.co/FdaCUVdIyU","*Yup, that's pretty amazing. #Bollywood #superheromovies https://t.co/gGGbeIGcHV","https://t.co/9wmQJVbAqO","RT @PRcontraelZIKA: Municipios con casos confirmados de #Zika (Datos al 11 de agosto de 2016). Infórmate: https://t.co/1ihE5gnY4b https://t.co/a7XXBYG6PR"],"feistymoderate":[null,"I keep forgetting that @bing will spy on your location in searches even if ur location is set to United States. #noprivacy @StartPageSearch"],"hak5":[null,"Take home popular pentesting tools + full course documentation: https://t.co/YYLTRxzpDi - Sept 16-18. Register now! https://t.co/39mERpaeIa"],"sips_":[null,"gonna actually start far harbour in like 30 mins","ok i am doing the far harbour dlc today in fallout 4 thumbs up lets do this https://t.co/ahE5zMeycu","Game Dev Tycoon - Hellballz HQ - PART #12: https://t.co/1sTI0bU2uw via @YouTube"],"chesterbrewr":[null,"@pyratebeard @YouTube very eerie!"],"natwest_help":[null,"@pyratebeard Hi Dudley, you can report it to us here. Feel free to DM, thanks. ZY"],"mcmcomiccon":[null,"Good work soldier- best friend ever 😜 https://t.co/hhhX91RulH"],"s0paranoid":[null,"RT @kelseyhightower: Unless your laptop is running in a production like environment, testing on your laptop does not foreshadow what will happen in production."],"djsnm":[null,"Most Kerbal Spacecraft ever? I think we might have it. https://t.co/OEBNmMUFyf","RT @geoffnotkin: Hey @neilhimself ... @Lachtoday and #edfringe say hi. Screening is 8pm. You should beam over 😀@New_TownTheatre https://t.co/DPHCWw58MY","RT @ManyATrueNerd: It's almost as if they were refusing to send review code out until after launch because they had something to hide. https://t.co/H2ORE5UbU9"],"timminchin":[null,"RT @nycomedyfest: Get tickets to see @TimMinchin Live and Solo at @BeaconTheatre with promo code \"FNYCF\" -> https://t.co/urbnskjY8e https://t.co/9dm4mU42L1"],"twhiddleston":[null,"#TheNightManager marathon starts at 8:00pm on @AMC_TV tomorrow. Six episodes in one night. 👊🏼 https://t.co/XMO2vnOyQP","About to live on Facebook talking all things #TheNightManager with @ScottFeinberg and @THR.... https://t.co/t2GfRm6Tzx"],"nathanfillion":[null,"I’M Castle. https://t.co/EMkJaH3B8M","Vinyl is coming back. Time to stock up on the classics. (@breckinmeyer) https://t.co/7vRmbJYAl3","Missed your shot. Here for the shower. Of meteors. https://t.co/2I8UoZo2bQ","Quit telling your one follower I’m a Gringle. https://t.co/KDcCNpDQHB"],"tweetdeck":[null,"View how influential users discuss a topic by searching for Tweets from only verified accounts. #TweetDeckTips https://t.co/dCzkCDaq8G"],"eff":[null,"We think it's time to deal with government hacking https://t.co/D4h6qiYxiW","Starting your own tech company? You can support EFF and learn more with this bundle of ebooks on entrepreneurship: https://t.co/Q9F37qgJT3"],"xkcdcomic":[null,"Superzoom https://t.co/kJY4vBj5fa https://t.co/H6tEBSi0nM https://t.co/rKGlIIG1Dj"],"codeanywhere":[null,"Introducing Custom Domains for Codeanywhere Containers. https://t.co/ZILhRUVfpO #hosting #domains https://t.co/EUTGbmWid0","[Update] Easy Browser Preview is Back! Now you can preview all your files with one click #codeeditor #ide #PREVIEW https://t.co/BppphDcsTV"],"officialkat":[null,"RT @BethBehrs: New chapter of #Dents is live on @LINEWebtoon ! Check it out! https://t.co/p4d3ZmOEFQ"],"missvanspronsen":[null,"Hey @UberUK @UberEATS for the free ice cream #poparazzi https://t.co/oymwVN2Jt3"],"plex":[null,"Best possible Plex experience? #PlexPass gives you exclusive premium features & early access to new ones #CutTheCord https://t.co/nslNGyXEQl","Glad you are pleased with the upgraded #PlexPass experience. @roku is awesome too! https://t.co/10sv5mtzdu"],"wellmetalginge":[null,"RT @TheBriefing2016: #ManyPeopleAreSaying Trump has paid $0 in taxes and gives very little to charity. Show us the tax returns, Donald: https://t.co/wZ6XlRDh0o","RT @TheNewsThumpAPL: Profile: Jeremy Hunt. 'Jeremy Hunt wearing an NHS badge is like Harold Shipman wearing a Help the Aged T-shirt' https://t.co/KTn4lUO1hO","This. So much this. @UKLabour is a fucking joke right now. Now I have to \"stand by\" cos you won't let me \"stand up\". https://t.co/IQy1AXs8sT","RT @Flandyke: ...due to fears that the Labour Party has been infiltrated by supporters of the leader of the Labour Party. https://t.co/9dpoquBEUH","@pyratebeard omg. I can see both you and @FlappyHowserton wandering @Melksham_Con with these as standard issue!","@pyratebeard @FlappyHowserton @Melksham_Con precisely!","@pyratebeard yeah, ain't that the fucking truth. @loosewomen = waste of fucking space. Miraculously even less relevant than @BBCTheOneShow.","RT @HuffingtonPost: BREAKING: Brendan Dassey's conviction overturned after \"Making A Murderer\" tells his story https://t.co/fzVML2rD6G https://t.co/nldIb26Usr"],"protonmail":[null,"We are happy to report that ProtonMail is NOT vulnerable to the latest serious Linux TCP vulnerability: https://t.co/h8wqLCsiXV"],"ibexwebex":[null,"It's beautiful and I will cherish it forever https://t.co/8wCOljWzKK","You're so sweet thank you for this ☺️❤️ https://t.co/Fo4MRsOnPX","😳❤️❤️❤️❤️❤️ https://t.co/8Nn0cuTM3N","Je vous remercie tellement mes amours ❤️❤️ https://t.co/96xON6AHJ5","❤️❤️❤️💋 thank you https://t.co/9UWqMh97QB","RT @Hollyscoop: Happy Birthday to @IBexWeBex! Watch her talk #MTVScream with #TheLowdown's @DianaMadison https://t.co/2waOpsYAjF 🎂 💕 https://t.co/3ikhTJClsD","Happy birthday!!!!! https://t.co/WzQgJZBHiQ","😁😘❤️ https://t.co/113e26Q32g"],"jonlockcomics":[null,"RT @nichangell: The #7STRING crew having a brief rest from adventure and battle! Little sketchy/painty thing I'm rather chuffed with https://t.co/b9Yj8qeW5v"],"ders808":[null,"RT @TheOnion: Dad Immediately Develops Deep Friendship With Guy Giving Quote On Replacing Windows https://t.co/bhLoMLUw4v https://t.co/BGU77n7O8z","SAUSAGE PARTY It's insane. It's hilarious. It's in theaters. And I'm a sausage in it. TUHDOW!!! https://t.co/y96OWqLLQF","RT @nickkroll: #sausagepartymovie is out today! And I am Douche. The role I seem to be born to play. I… https://t.co/JIrmgmmGqP"],"chelseaperetti":[null,"Im in love with Aly and Simone FOREVERRRRRRRRRRRRRRRR","Packed bfast & lunch to work in a paper bag, water leaked, bag broke. 2 hours later REPLACEMENT bag broke😀Great day so far!!!!!!!!!!!!!!😀👌🏼","RT @Lesdoggg: To be young again https://t.co/wiF1lqTdqo"],"apothecary87":[null,"Blunt fringe, textured crop. Finished with our clay pomade. Get the clay online to achieve this look. #TheManClub … https://t.co/fRyE5kXhQ1","The newly released Muskoka Beard Balm by @spizoiky will condition the beard and skin and make you smell and look aw… https://t.co/km3NFxTlmm","our Lock, Stocke & Barrel Clay Pomade is a signature product from LA model @levistocke. Get the clay online at … https://t.co/8DUHINAAKJ"],"qikipedia":[null,"Bolts of lightning can reach a temperature five times hotter than the surface of the Sun.","Men are struck by lightning six times more often than women."],"robopike":[null,"@StewedRat Hell Yeah! That's a must! What a team up!"],"tcollen":[null,"Anyone ever get imgcat and irssi working together?"],"theawesomepod":[null,"Check out @SJWebsterArt @pongogirl @HellboundMedia @Brett_Uren @crazyfoxmachine on the Bristol Expo Special! https://t.co/kZkpiQYYYf","Check out @TomboyPrincess @bintykins @JonScrivens @MD_Doodles @DbroughtonDavid on the Bristol Expo Special! https://t.co/kZkpiQYYYf","RT @danielwarrenart: I'll be at @BostonComicCon this weekend! I'll have Space-Mullet & Green Leader w/ me, & I'll be taking commissions! https://t.co/Mnxk4jp76F","RT @bintykins: \"because mental health doesn't have a final page\" https://t.co/16OkM4Aq42 @theawesomepod"],"flashpointintel":[null,"Our Alex Kassirer told @FortuneMagazine that the tech community must address how #terrorists use their services: https://t.co/VAXrFFJSik","We spoke to Virtual Intelligence Briefing at #BHUSA last week about all things Flashpoint. Watch the interview here: https://t.co/TmhaEmLXSK","Are you in San Antonio next weekend? Register now to hear @lancejssc speak at @TheChannelCo #XChange2016: https://t.co/zmw1Sr7ZJ5","See our Alex Kassirer in the most recent @glamourmag: https://t.co/08LA6wirCr #51MillionVoices #DeepWeb #DarkWeb"],"bloodypopcorn":[null,"There is literal jack-hammering going on outside my office today. If I had any kidney stones, they're all dissolved by now. #headache","Because Friday. https://t.co/xzL3cFpHE5","RT @geekgirldiva: Please don't call it a blowout because then people won't vote. The only way we get a blowout is if people vote. https://t.co/Ra1TLvcaQr","RT @Lando_iHorror: #FF badass horror chicks @Zombighoul @thehorrorchick @BloodyPopcorn @HorrorGirlKate @moonrisesister @EightSexyLegs https://t.co/RIKLjtYxjw","Very much so. https://t.co/5DdITT2XxV","New #podcast should be up later today... So, in the meantime, CATCH UP: https://t.co/AlnU3H59yT","I just love when it's so hot that my makeup melts right off my face. Ninety-eight motherfucking degrees. https://t.co/0ic5bldToC","Holy shit! Almost forgot it was #MonsterMania weekend! Enjoy, con goers! Hope to see you all in March 😉","RT @CAVITYCOLORS: RETWEET & Follow @CAVITYCOLORS for a chance to win our \"LIVING DUMMY\" Enamel Pin! Winner announced Friday! https://t.co/uLJGQ5xgCS"],"neiltyson":[null,"The USA has 3x as many Olympic golds as Hungary, but 30x the population. Adjusting for this, Hungary is kicking our ass.","If you set a World Record in the Olympics, might be classy if they gave you a Platinum medal instead Gold."],"robynbergeron":[null,"RT @lusis: HOW CAN LAMBDA GO DOWN IF THERE ARE NO SERVERS?!??!?!?","RT @NDI: Democracy is in your hands. And hers. #ZambiaElections #ZambiaDecides #Zam #PhotoOfTheWeek https://t.co/05go8e4TNj"],"_brendonsmall":[null,"Shucks, I wish the rogue one trailer were more brooding and serious...","Just found out Charlie Rose is Axel Rose's father. #nepotism","I made a nice friend here in NY. Then I ate my friend. https://t.co/INuoY7TUk9"],"pyloris":[null,"RT @daniel_rehn: 1991's “Most Wanted Computer Viruses” according to Central Point (a predominant anti-virus tool for PCs at the time). http://t.co/KdeSHWhTZw"],"rikkuness":[null,"@pyratebeard sounds like it!"],"london_aquarium":[null,"We're experiencing some issues with our website at the moment - we'll be back up and running soon!","Our website is now back up and running, but let us know if you experience any issues!","RT @ShreksAdventure: Save up to 40% when you buy a combined ticket to Shrek's Adventure! London and @london_aquarium. #nothingfishyhere"],"gitkraken":[null,"RT @mrmonkeytech: I'm normally hardcore terminal fan boy, but @GitKraken makes git on large projects far easier.","Find out more about #GitKrakenPro https://t.co/liszVD6CFU https://t.co/KoYtWxD7Sm"],"blkstonecherry":[null,"An acoustic performance of \"In Our Dreams\" in the Amazon Artist Lounge for your listening and viewing pleasure!... https://t.co/J31b5qPv3a"],"tinkerknock":[null,"@neil_fifteen https://t.co/5WXFIuiYgB","@pyratebeard I know right! As much as I'd love to make like a cat and lay where I please, some of us got jobs to go to </3"],"puppetize":[null,"RT @CraigGomes: Cat meet mouse. A little entertainment mixed with some @puppetize https://t.co/uPvO94ukNB","Docker Swarm, CoreOS and Consul, oh my! 10 Puppet Enterprise capabilities you might not know about. https://t.co/P60lV3EXn8","RT @thenewstack: For Modern Business, it’s ‘DevOps or Die’ https://t.co/slpEinqoZj @puppetize @puppetmasterd #OSSV16","Happy Cat Shirt Friday! #lifeatepuppet https://t.co/e6XOuFcHHm","Here's a preview of some of the networking and fun to expect at @PuppetConf: https://t.co/qhRYBQX04X https://t.co/wu7ZoYuGG2","Learn how to automate tedious IT tasks with Puppet Enterprise. https://t.co/ReYrJs3KJ3","Know any great people who care about customers, prospects, code and/or dogs? We're hiring. https://t.co/lKSw4NTs9Q https://t.co/EyCuB0CZhb"],"greatdismal":[null,"Come on, networks, this would be *good tv*! https://t.co/ekwph0b9AE","It isn't so much that he lies, but that he lies like a small child. It isn't his small hands, but his malignant infantilism"],"thesimpsons":[null,"Who's got the lucky numbers?! #TheSimpsons https://t.co/Gh9hS3EoPZ"],"neil_fifteen":[null,"Half Chicken and Two Sides from Nandos followed by a Five Guys Double Cheeseburger. And what?!"],"starky_the_fox":[null,"Jitsi or Linphone; Wire; Tox; Bitmessage; HexChat, Weechat or Irssi, and Pidgin. (2/3)"],"sirpatstew":[null,"Onstage and on the road with @IanMcKellen. Sheffield -> Newcastle -> Brighton -> Cardiff -> London #NoMansLand https://t.co/Du5O8AsR7X"],"cmdr_hadfield":[null,"Saturn isn't only scientific, it's beautiful. https://t.co/ehYyzpVeXc Nice picture Kevin Gill, NASA engineer/artist. https://t.co/u5dSpuudFp"],"kerbalspacep":[null,"#KSP Going crazy on the mun by Freekynapoleon! Awesome! https://t.co/opqGFTsmjg","#KSP This is the second prototype for a artificial gravity module created by Midshogun https://t.co/qhjyyKOPYV"],"awscloud":[null,"Watch the #AWSummit keynote with @Werner & hear all the latest AWS announcements! https://t.co/SGtn1SnYa1 #CloudComputing","Join us & learn how @qubole on AWS can help customers optimize Big Data analysis. https://t.co/VUAxZvOf6Z https://t.co/N7ek3pWA1Q","AWS named as a “Leader” in the Gartner Public Cloud IaaS Magic Quadrant report. https://t.co/XdRJsP6IT6 https://t.co/pFuVpfsK9W","Looking for the decks from #AWSSummit New York? We are uploading them here: https://t.co/4OkCM3vh8K https://t.co/IUHjFn0SVj","Troubleshoot \"Conflict among chosen gateway IP addresses\" error message when creating a VPN! https://t.co/kwbHSYNKHm https://t.co/JSscnlMZMX","Request an increase for service limits on AWS resources: https://t.co/t8LBu9PsSC #CloudComputing https://t.co/5VQAfRC2IM","Learn best practices for building a data lake with #AmazonS3! https://t.co/FV6HsWVXh0 https://t.co/ny5pQ6Ezbz","Learn to use #ElastiCache to create solutions that make use of large & multisource data sets https://t.co/MgL1rmQQuE https://t.co/THFSgsdDfu"],"alancumming":[null,"Last night's #clubcumming was epic. Special guests were Brian Cox (reading Ae Fond Kiss as… https://t.co/d2dJwkaTUk","Look! The lovely dan0matic made me this #clubcumming badge!! #keepthefilth #danceyertitsaff #Lala https://t.co/t7RAYKlX4K"],"torproject":[null,"Tor creates 'social contract' promising never to harm users https://t.co/qd9lhQKvye via @ChrisTheDJ #Tor","RT @magic__lantern: All software and software based services should have social contracts - not just EULAs. https://t.co/HFV6a4YyfS"],"zacksnyder":[null,"Every day on set is an amazing adventure with this guy. #JusticeLeague #Aquaman @PrideofGypsies https://t.co/sSiyDx36Tc"],"bloodstockfest":[null,"Don't forget the #BOA16 TWISTED fancy dress competition is today, find our photographer between VIP and the EMP tent https://t.co/AqTm33dltJ",".@WeAreStuckMojo on the Ronnie James Dio stage in 20 minutes!!","Travelling to or from #BOA16? Share your spare seats on @gocarshare + you'll be in with a chance of winning #BOA17 tickets!!",".@coccabal hit the Ronnie James Dio stage in 20 mins, head over NOW!",".@coccabal killing it on the Ronnie James Dio stage https://t.co/JFg8dcAzv7","RT @AcidReignUKAC: H and Marc are doing a Q&A @facebooklive here https://t.co/RD6tPku7KM @ 20:30 BST talking @BLOODSTOCKFEST lots more! https://t.co/tISTnIvkLD","The MIGHTY @VenomsLegions will be on the Ronnie James Dio stage at 5.40! GET OVER THERE NOW!!!!","The MIGHTY VENOM!!! #BOA16 @ Bloodstock Open Air https://t.co/aWhjkiOPZh",".@BehemothBand about to play The Satanist in FULL on the Ronnie James Dio stage 🔥 🔥 🔥 https://t.co/ujx9KLJ9d5",".@behemothband on the Ronnie James Dio stage #BOA16🤘🏻🤘🏻 @ Bloodstock Open Air https://t.co/KmBZrdgm1M","RT @Epiphone: .@deesnider from @TwistedSisterNY swung by to visit the @Epiphone Bus at @BLOODSTOCKFEST #metal #epiphone https://t.co/PloPAwBaTp","Legends @TwistedSisterNY are about to perform their LAST EVER UK show on the Ronnie James Dio stage at #BOA16!! 🇬🇧 GET TO THE STAGE NOW!","Flying squid on the way to see @TwistedSisterNY 🚣🏻 https://t.co/DAFh7iwe7s","Twisted F*cking sister last ever UK show at #BOA16 🤘🏻🇬🇧 https://t.co/nrHjo1UCRH"],"dailydot":[null,"Silk Road admin 'Libertas' to be extradited to U.S. for narcotics, hacking charges: https://t.co/IIJKFaGeZC https://t.co/3YtMoJPBrP","Feel the romance with this woman's job offer photoshoot: https://t.co/aTzgkZgoVp https://t.co/hRlax64P79","Psst... These are the ad blockers publishers don't want you to know about: https://t.co/7Jgxje1NQV https://t.co/e5A3OjGVBM","Almost 15 years ago, 'Black People Love Us' taught the internet how to troll: https://t.co/shDgqwql0t https://t.co/1kVxO2UH0A","We made it! https://t.co/tWzxn0qsrN",".@MikeOBrienXOXO tries to land a kiss on @JimGaffigan in newest '7 Minutes in Heaven': https://t.co/SInjZHvuKN https://t.co/cymOWZsNvC","Meet the Pokémoms: https://t.co/T3kHlbrTjq https://t.co/mttHGOKDu9",".@Walmart is selling Banksy's 'Destroy Capitalism' art: https://t.co/FSUVkORyKq https://t.co/EWJNOpY8tf","Canadian Olympics announcer mixes up swimming lanes, thinks @RyanLochte beat @MichaelPhelps: https://t.co/jnfLwSE6Z9 https://t.co/nbGOwKUORX","Hillary proves she's queen of dank memes with her best campaign ad yet: https://t.co/M7OFKja8IM https://t.co/AMR1qlUczu","Adele invites fan onstage to sing—and gets blown away: https://t.co/4C97MLA2j8 https://t.co/plecqiC7t1","Adele invites fan onstage to sing—and gets blown away: https://t.co/OGpiKAlXTe https://t.co/23C1IVdgV1","Adele invites fan onstage to sing—and gets blown away: https://t.co/xQVnv8ecS8 https://t.co/QajrJPDaLI","Donald Trump releases his summer playlist: https://t.co/ia7pl4vQAT https://t.co/KZHJjpn17K","Daily Beast RTs calls for writer of Olympics catfishing story to be fired, then deletes them https://t.co/PTXooL7jAy https://t.co/QM4FfadLGp","Watch YouTube star @colin_furze soar 30 feet in the air on his terrifying 360 swing: https://t.co/oPNnzsqtSs https://t.co/7pRjUNg45U","When will the Olympics finally let these Microsoft Office-mastering teens finally compete? https://t.co/KsimuiScpN https://t.co/merBQ3bS7f","This is how No Man’s Sky creates over 18 quintillion planets: https://t.co/uiTEADnc83 https://t.co/xMgendLWrz","This elated mom is every mom on the first day of school: https://t.co/3gQZJLd6Uk https://t.co/Awrrnwx9Bs","The best-selling headsets for gamers are less than $30 right now: https://t.co/bGqOtfuum0 #DailyDotBazaar","!!!!!!! https://t.co/aiD9l5lZ1G","Mom perfectly captures how parents really feel on the first day of school: https://t.co/oLWUd0Ccs7 https://t.co/PNpl5av1HC","Chill out, guys, Trump was just being sarcastic about Obama founding ISIS: https://t.co/OcDlnzoemI https://t.co/kKUzDyWxoo","According to meme legend Scumbag Steve, Donald Trump is the real scumbag: https://t.co/dG2OZvg4v4 https://t.co/TcV2BaHYqx","Another Silk Road leader could be headed to trial in the U.S.: https://t.co/pnXyuzGRsV https://t.co/EI2PGaO7tA","Pokémon Uranium is a free, fan-made RPG you can play right now: https://t.co/0mqbkqbd3z https://t.co/dAAdv5vZ3i","Daily Beast RTs calls for writer of Olympics outing story to be fired, then deletes them: https://t.co/eeoLsgumiJ https://t.co/TTw2iDDAOQ","YUP https://t.co/j6jl3HpVBG","Jim Gaffigan proves elusive in latest '7 Minutes in Heaven': https://t.co/wHaHRZVIqt https://t.co/GCrfCjGC1e","How the music of 'Stranger Things' helped shape its characters: https://t.co/OkGD0Aqkk9 https://t.co/8w8ue9jhN6","Save animals from the slaughterhouse in this video game from The Smiths: https://t.co/1j2uSPKQSr https://t.co/QO0SC7zWeN","Study shows VR can help paralyzed patients regain some motor control, physical sensations: https://t.co/p7AZktjEQL https://t.co/9XbxW3hI2E","The LGBT Netflix has arrived with @RevryTV : https://t.co/g4H1phmYzL https://t.co/PbpkAWLgTK","Important petition calls for all women to apologize to Seth Rogen: https://t.co/mnbUEciXln https://t.co/sVebveeOq1","Hackers attack Olympics anti-doping organizations: https://t.co/USDYpEG0Ni https://t.co/cuQ10os9QS","Spotify's newest channel is all about video game music: https://t.co/q6nwHhccXN https://t.co/WRzu3stCA4","This Canadian broadcaster was excited Lochte beat Phelps until he discovered he was wrong: https://t.co/y55RtdjEVX https://t.co/FsZfozkZ8A","Chance the Rapper's eclectic freestyle inspires #SoGone challenge: https://t.co/YHdeHUOekb https://t.co/0udxiBKjAi","GoldenEye 007 amazingly recreated in the Source engine: https://t.co/ETscavHL5Y https://t.co/05ReQB7hAg","What the 'Where my shrimps' saga can teach Weird Facebook about page security: https://t.co/XDD8J3YdNO https://t.co/voFCCM03Tk","Cards Against Humanity lets fans pick candidate they'll donate to, as long as it's Clinton: https://t.co/NLwW5xAnba https://t.co/Bmc7IWnEGF","Man builds terrifying 360 swing in his backyard, survives riding it: https://t.co/SAue59P9xs https://t.co/mwv4YvJBUX","Newspaper reduces Simone Manuel to 'African American' who shared historic night with Phelps: https://t.co/779PXcQy0y https://t.co/JpASfDMStB","Is this actually the worst webcomic ever published? https://t.co/oeVQlKlJzj https://t.co/tiGYX6Wg3j","Teens from around the world just competed in the Olympics for Microsoft Office: https://t.co/zBfyNYaTlG https://t.co/Ssr8QB2oVk","Channing Tatum and Jenna Dewan Tatum celebrate the anniversary of 'Step Up': https://t.co/zFxRImLLQA https://t.co/J4xOhO93jI","Facebook has squashed the AdBlock Plus workaround that once again blocked ads: https://t.co/YXib4Ncqln https://t.co/hN67PEImci","Harley Quinn has rocketed in popularity on retail hub Polyvore: https://t.co/BqoJvYK0F6 https://t.co/2HCRGgx2aG","Twitter refuses to explain censorship of verified journalist accounts in Turkey: https://t.co/cFIkQaCw79 https://t.co/1xQaUPk95Q","Meme pages plan mass revolt against alleged Facebook bias: https://t.co/JtZKcq7qaJ https://t.co/DGsBVciZUQ","New study claims people who post their fitness routines to Facebook are narcissists: https://t.co/44ExyDn0IU https://t.co/5BHtMTRBcA","Video: Adele invites fan onstage to sing—and she's incredible: https://t.co/jV27yYoFOa https://t.co/6NjaTZ7loN","Silk Road administrator ordered to be extradited to the U.S. from Ireland: https://t.co/QR50wcgF22 https://t.co/Wk3BWDiz7B","Roses are red, violets are blue, this poetry meme is calling to you: https://t.co/EV6WwVwRYD https://t.co/v9Wrog3M5D","Hillary Clinton campaign unveils election season podcast, 'With Her': https://t.co/6QnZoOwWSx https://t.co/SrmGeuJ1fU","Move aside soccer moms, the Pokémoms are here: https://t.co/WXOykljG7q https://t.co/rST1qeXznU","The composers of the 'Stranger Things' score on balancing dark and light: https://t.co/cof2wk9ORh https://t.co/3hRsy2hoxx","Jim Gaffigan, Mike O'Brien go head to head in newest '7 Minutes in Heaven': https://t.co/ZK1re9bLHw https://t.co/HrbirR4BTY","New Zealand police take cutest trespasser of all time into custody: https://t.co/gJql4e3Qa7 https://t.co/vB03L7Nvmn","This fake Martin Shkreli email chain has destroyed journalism as we know it: https://t.co/PFqnDPzddO https://t.co/k31si6NJAL","Save up to 65 percent on some of the most popular headsets on Amazon: https://t.co/kulWMI44vN #DailyDotBazaar"],"zeroxten":[null,"ffs #docker https://t.co/aQFPbeBvGE","RT @ThePracticalDev: This wasn't in the brochure https://t.co/iuswbqspRL","@SwiftOnSecurity Overarching theme is cost-benefit analysis","RT @securelyfitz: Finally recovering from BH & Defcon. Gearing up for Sept classes at @44CON in London and @hardwear_io in The Hague : https://t.co/aH4WT3cHVU"],"jaymewes":[null,".@TellEmSteveDave just reached their 300th Episode NOOTCH! Click the link little ant https://t.co/alO94u9KG7 https://t.co/Gb0i49Ugxr"],"iss_research":[null,"RT @Space_Station: Middle school students are coding SPHERES robots aboard station. Watch @ZeroRobotics LIVE: https://t.co/ZyAMdtiDOJ https://t.co/qWd11cEYFx","RT @miniPCR: Space Camp is underway @NEBiolabs with #GiS winner Julian. Almost ready to launch @ISS_Research @ISS_CASIS! https://t.co/JLNTuYMtuj"],"thatkevinsmith":[null,"It was only Step 1 toward my ultimate goal of one day directing an all-@wilw handjob porn called \"Beatin' Wheaton.\" https://t.co/FwkHIWBY2j","Cape escape: Super Mega Awesome Ultra Guy teaches the @StoryBots how to fly on #AskTheStorybots! Now on @netflix! https://t.co/N3EzqvQNcM","CALIFORNIA! Come see me & @RalphGarman BABBLE the fuck out of each other TOMORROW night at the @HollywoodImprov! https://t.co/S5RjJ3XdQZ"],"makerscafe":[null,"Happy happy happy! @RZRMKR @Boxpark 3dhubs @Ultimaker @GravitySketch @Innofil3d sugru… https://t.co/AFFtXl6kEd","Still rock n roll! @RZRMKR @Boxpark 3dhubs @Ultimaker @GravitySketch @Innofil3d sugru… https://t.co/JPRAFu5W14","What a gorgeous weather to end the day! @RZRMKR @Boxpark 3dhubs @Ultimaker @GravitySketch… https://t.co/LpyIZPp0Z2"],"richardayoade":[null,"Fricken sweet. https://t.co/RcIUJ6RhGP","Can't believe these revelations about Farage. Are there no more heroes?"],"irssiproject":[null,"RT @GeertHauwaerts: The Irssi site is now proudly hosted on @github pages, tnx to everybody who participated in the transition! <3 https://t.co/YH5T7P0th7","RT @GeertHauwaerts: Do you want to take a sneak peak at the Irssi 0.8.18-beta1 release? Check out https://t.co/DnIM4pPTqM <3 @IrssiProject","RT @real_richlv: oh. #irssi got a new webpage and a release :) #irc ftw https://t.co/A2YJsDSdcT https://t.co/wZr4o1SiaZ","Poke @ahfaeroey if you are attending #32c3 in Hamburg and want Irssi stickers!","RT @saschaLaLaLa: @SwiftOnSecurity sudo irssi","RT @iarjun: Irssi. https://t.co/CuDvzUMLI3","@masptj auwww *hug* :)","@OgMaciel auwwww *hug* :)","Irssi 0.8.18-beta2 is out - please help us test it: https://t.co/N1AHA1ySG3","RT @ahfaeroey: New @IrssiProject stickers arrived for #FOSDEM https://t.co/CPF2F9Sd0i","@Mephux impressive, keep up the good work! :)","@gorOmLagcHee auww, we love you too <3","The @IrssiProject is glad to release #irssi 0.8.18 - https://t.co/oZZI4tlWOJ Thanks everyone who helped! NEWS:https://t.co/R0w1wXOsq3","OTR users should /unload otr, upgrade their libotr, /load otr - for more information see https://t.co/gXnZxXggQc","The @IrssiProject is glad to release #irssi 0.8.19 - https://t.co/B8pbKaNNV2 - IRCnet compatibility restored","RT @shadowcat_mst: Shadowcat is now providing pastebot services to the irssi channel on freenode. It's the little things that make me happy.","RT @ahfaeroey: Irssi and OTR - https://t.co/hZtNbwQec1 - please help test.","RT @bbhorne: These stickers have proven popular among Palestinian techies and journalists in Gaza. @torproject @Cloudflare https://t.co/bqxJbKsUNw","RT @Kaji_fi: Some new toys! #pocketchip @nextthingco #debian #linux #irssi https://t.co/5OwzXA8OvW","@wxl @tsimonq2 Elliot must be quite a noob."],"thekrakenrum_uk":[null,"RT @BLOODSTOCKFEST: @CitizenSnipp @TheKrakenRum_UK 👌🏻 Kraken Rum ISCREAM today","Right then @BLOODSTOCKFEST it's sunny outside and it feels right to indulge in a little ice cream #iscreamforkraken https://t.co/lCN96WUO14","RT @BLOODSTOCKFEST: Make sure you visit the @KrakenRumUK #ISCREAMFORKRAKEN van at #BOA16 to enjoy the most brutal ice cream out there!! https://t.co/9BCB2HinGI","Oh right. You're all hungry for Kraken then! Fair enough @BLOODSTOCKFEST - good taste... #IScreamForKraken https://t.co/Uvae1mJKeP","Our I SCREAM went down a storm at @BLOODSTOCKFEST... so now we're on to cocktails till late. See you tomorrow at 2pm for more I SCREAM. \\m/",".@BLOODSTOCKFEST has got us thinking.... What do you prefer?","Nice to meet @AnticloneHQ at @BLOODSTOCKFEST - Nice bunch, if slightly terrifying.... #iscreamforkraken https://t.co/h96GKyRJzw","Meanwhile.... It's thirsty work in @EvilScarecrowUK - Monty Blitzfist takes a gentle drinksbreak #iscreamforkraken https://t.co/U09sJCdbRC","Good looking bunch at @BLOODSTOCKFEST 💀 https://t.co/euZPIMXDBp","Twisted Sister and The Perfect Storm... Oh @BLOODSTOCKFEST how you spoil us!!"],"ogmaciel":[null,"Hello irssi, you sexy you! I missed you! https://t.co/jVUPBAfhPW"],"workaholicscc":[null,"It's not summer if you don't spend some time at DeMamp Camp. https://t.co/OcA6ERe6l6 https://t.co/mQVkjdtj1x"],"openshift":[null,"Don't miss Eric's talk. 09/20 #OpenShift #RedHatContainers https://t.co/jHYZMLczfq","Build an app that makes users fitter & your code healthier. Deploy your app on @openshift for #CodeHealthy https://t.co/7EhBtD93Zo","Do you want to have an early look at #OpenShift 3.3? https://t.co/T4vmPQLSfq Check the videos and let us know what you think!"],"deandelray":[null,"Thank you https://t.co/hCxMfph7Sk","Brand new LET THERE BE TALK with @spicer @istevehenry and myself talking about our favorite Summer Vacations. https://t.co/Zqeq1r6D6N","#ff the east coast friends @TheStandNYC @robertkelly @bigjayoakerson @mikefinoia @aaronbergcomedy @PaulVirzi","'Ac/Dc In Full Flight' Book Features Concert Photos From Bon Scott, Brian Johnson Years - https://t.co/NZKZquwXjg https://t.co/VKann4G2w2","HAPPY 25TH BIRTHDAY TO THE BLACK ALBUM - METALLICA - Wherever I May Roam (official video) https://t.co/0fS1elp41L","Trailer queens https://t.co/PT0S6Ol3Pk","Giraffe Tongue Orchestra Feat. Alice In Chains, Mastodon, The Dillinger Escape Plan Members: 'Crucifixion'... https://t.co/GUqq0ZsAHP","Yo Los Angeles my favorite rock photographer Baron Wolman is having a show tomorrow night 7-10pm do not miss this https://t.co/FMNkKGfUUX","terrible https://t.co/vzj9lnmVwe","Saturday night i will be @TheComedyStore in the main room. Get tickets asap before they are gone. https://t.co/3vFHBgs4aB","RT @DEVO: Tees are printed for DEVOtional 2016 event on Aug 19 & 20 in OH. Guests Jerry & Bob of DEVO! https://t.co/hGleQM7zkj https://t.co/nVEvql3Q7r","#ff Give the great @AndyKindler a follow","#ff these bands @QCNH @TheSheepdogs @TTM_Tweets @templeofthedog @cedricbixler_ @qotsa @JBONAMASSA","RT @YKWDpodcast: Catch \"Funny is Funny\" here! https://t.co/pyrn6dE5MG https://t.co/w7FqM2n1ro","👍👍 https://t.co/5LRzdG7j4t","Yo Salt Lake City come see me Headline this Sunday at @Wiseguysutah https://t.co/WWGTVEBAGQ","AZ i will be headlining @houseofcomedyaz Aug 31st thru Sept 4th Get tickets asap https://t.co/oh9UowtBrB","On this week’s @bertcast hang with @robertkelly & @bertkreischer for a real inside comedy chat https://t.co/y0jDiHFaQb #ATC","#ff my friends @SteveSimeone @HalliB @istevehenry @ErikGriffin @IanEdwardsComic @LucasHirl @BBCOMBES @LukeDoesStuff","#ff @BrentWeinbach @kevingchristy @realdonjamieson @Mrjimflorentine","#ff @benjiaflalo @robertkelly @BronstonJones @jonahray","RT @CobbsComedyClub: Follow @toddbarry and see him FRI&SAT! Get tix at https://t.co/AwnRHsBN31 NOW! #FF","RT @jasoncollings: Two show tonight at @zaniesnashville w/ my buddy @BrentMorin !! Come see us Nashville! https://t.co/gjMX5FVsv4","#recordoftheday Ziggy Stardust and the Spiders from Mars. I can't believe I didn't have this… https://t.co/bhFyOIhdZu","I hope so but nothing yet https://t.co/XXd1z4Des9","RT @TheRealRarrick: In the words of the wise @deandelray \"Promote what's great, not what you hate.\"","RT @History_Pics: The last known photo of the Titanic, as the ship leaving Queenstown, Ireland on April 12th, 1912. https://t.co/vNvntumHiU","Catch me tonight 8pm @TheComedyStore Bellyroom","How can anyone say they don't like the Black album that's just insane Metallica - Sad But True https://t.co/Ur2lN9IvYx","I had a dream the other night You were in a bar in the corner on a chair Wearing a long white… https://t.co/Zxl9SnBkTu","RT @eddiepepitone: San Francisco! I’m @punchlinesf 8/24-27! Tix- https://t.co/6EwKE4aEXz","RT @nytimesarts: Jeff Bridges brings a seen-it-all manner and smoked-’em-all drawl to \"Hell or High Water.\" https://t.co/Z0K3KEQxpM https://t.co/kKiL5krBfm"],"garrynewman":[null,"These sex bots get aroused by the weirdest things https://t.co/g4cNrpD3AN","This is the only one of these I'm posting https://t.co/6AAbDu8Udt","https://t.co/swAQx5dS3g"],"_rage":[null,"Something form ROCK POD KAMEŇOM LIVE! https://t.co/wcJHuqedgK"],"dropbox":[null,"Send a comment directly to a teammate by @ mentioning them in Dropbox Paper. Sign up now: https://t.co/tCNzcHvBdF https://t.co/k7FjfCuDN4"],"cw_arrow":[null,"RT @StevensonJohns1: @ARROWwriters #FanArtFriday @FLASHtvwriters Oh, Snap!! Never mind! Lol😁 I did have time 2 color it😁Hope u follow me https://t.co/QFbD2mGco1","RT @ArrowProdOffice: All Stunts on deck #Arrow https://t.co/t5TxcD8LB8"],"thenoisecartel":[null,"Great new videos from @thiswildlife & @SetItOff on the @SubtvMusic New Music Playlist! https://t.co/MUyIZTJnMj","RT @TheLKittens: Only two chances left to see #EverybodyHatesTLK @theSpaceUK @edfringe and very limited tickets left. LET'S DO THIS https://t.co/kSRRdsTuUx","RT @YoungGunsUK: 5 weeks today we get to introduce you to #Echoes! It'll come around FAST so make sure you've pre-ordered ok? https://t.co/nxSTYwVfAY"],"rcpavlicek":[null,"It's official: I'll be joining Red Hat in about a week & a half! @TheTechScribe @BitIntegrity @JohnnyCentOS @jzb @thomasdcameron @johnmark"],"thenerdmachine":[null,"Let's do some good: it's #donateaphototime! Please upload a pic to your @donateaphoto app to raise $1 for @operationsmile #jnj #NerdHQ."],"511tactical":[null,"New purpose-built gear for fall! Flannel shirts, jackets, pants. #alwaysbeready #511tactical https://t.co/THHMLhnUoY https://t.co/e7BmxTjcy7","RT @NLEOMF: Nominate an officer you know with a story of heroism and service for Officer of the Month! https://t.co/mUQWodJ3Ln https://t.co/OqUJjtQhNy"],"eddiemcclintock":[null,"https://t.co/R3fF1zcNql","pretty much https://t.co/nTzPEKqo4q","Did I mention that I'm going to @DragonCon? Did I mention that I'm bringing a new t-shirt? If not... #WAREHOUSE13 https://t.co/QyIDznL47L"],"irssi_kittie":[null,"Thanks for voting! Ready to start!!! #chaturbate https://t.co/Il4xzLXfQj"],"bdisgusting":[null,"‘SOMA’ Stars in September’s Humble Bundle https://t.co/hADcSlCHvj","New “American Horror Story ?6” Promo Coming Down the Tracks https://t.co/pMMh2FrTK7","‘The Force Awakens’ in 3D this Fall! https://t.co/CDDKH3hPCN","Your Primal Fears Realized in ‘6 Plots’ Coming October 4th! https://t.co/SOiuYYb9nz https://t.co/BevzGn8ipB","“Game of Thrones” Star Joins ‘Haunted’, a Steven Spielberg Passion Project! https://t.co/v4f2bZUveW","Crispin Glover Returns to Horror With ‘We Have Always Lived in the Castle’ https://t.co/twaBijp94z https://t.co/bKkYdjZFnC","Waxwork Records Releases Richard Band’s ‘From Beyond’ Soundtrack https://t.co/n5DQBypt8b","Doors Open On ‘The Rezort’ Image Gallery https://t.co/snrRc5lndL","Have a Bizarre Dinner With ‘Southbound’ (Clip) https://t.co/xBXsutTDKp","“Twin Peaks” Season 3 Might Break Conventional TV Practices https://t.co/M2pwykeKJb","‘Show Yourself’ Images Depict the Terrors That Await BCHFF Attendees! https://t.co/QzFtF83aif https://t.co/phcRUfca11","Here’s Noomi Rapace and Michael Chiklis in ‘Rupture’ https://t.co/GM8CcnWt3R","Alan Robert Talks “The Beauty of Horror” and Adult Coloring Books (Interview) https://t.co/Ec1DfuKlYR","Modern Giallo ‘Francesca’ Gets Home Video Release Date https://t.co/pu4USMFqmV","RT @JSolis82: @JonathanBarkan's AWESOME @BDisgusting interview with @arobert!! https://t.co/eoZtWaNSGS","[It Isn’t All Bad] ‘The Fourth Kind’ is a Highly Underrated Found-Footage Flick https://t.co/6oLA7LiSlj https://t.co/QK8rguBC9v","‘The Amityville Horror’ Collection and More Coming from Via Vision this September! https://t.co/5BS3spCdXJ https://t.co/Me9CKZD8YQ","[Review] ‘Belly of the Bulldog’ is Overtly Cryptic but Impressive https://t.co/BwcDyywRvO","Full Details on the Upcoming ‘Waxwork’ – ‘Waxwork II: Lost in Time’ Blu-ray! https://t.co/460vGDb0tL","James Wan Updates the Status of ‘Mortal Kombat’ https://t.co/ZdZQF86wyP","We Need to Reevaluate ‘The Village’ Before it’s Too Late https://t.co/ujbGMpjxPs https://t.co/N8sAzhNIK3","New “American Horror Story ?6” Teaser Channels ‘Dracula’ https://t.co/cgZxdwbe9q https://t.co/KobdrnLwAn","Here’s How to Make Freddy’s Glove For Cheap https://t.co/zDoRDQzsmc https://t.co/ExNlv9iNG5"],"paradoxcmxgrp":[null,"The PCG take a look at AN ANDROID AWAKES by @MikeFrench1 & @KARLATTACK89 https://t.co/RmtGDGCQYW https://t.co/hnOzTKxabg","Graphic Perception: AN ANDROID AWAKES https://t.co/SjTTCsM932 https://t.co/2M9riXAkXp","Graphic Perception: AN ANDROID AWAKES: AN ANDROID AWAKESWriter: Mike FrenchArt: Karl BrownElsewhen Press £13.... https://t.co/vj4D4Ymy73"],"poperichard":[null,"Everyone is at Bloodstock and I am at home playing Senran Kagura.","My meds have also really reduced my appetite which... is great news haha. I also haven't had much desire for alcohol. All plus points.","I am definitely in \"zombie mode\" right now though. I am awake but kinda just floating.","But sometimes I get hyperfocused on things. Like, man, Apocalypse... I have recorded 7 of 8 songs this week. That album is almost done.","@PopeRichard And I only just announced it.","my posse my posse https://t.co/WcuLVhDPd6","You know you've been living in Britain too long when a can of beans becomes an anticipated treat.","DISOBEY THE OPPRESSOR REFUSE DEMON PRINCE","ENEMY OF GOD PURITY AND INNOCENCE IS KILLED","good grief it's warm today","Whoops, there's only £1 left on the electric, I'd best get my shoes on.","Tuesday: World Controller are releasing a free three song EP. Dystopian post-apocalyptic death doom. #doubleplusdoom https://t.co/QQJXiiwu5C","@MiyazakiNoise @pyratebeard Fuck yeah man, I'd love to hear what you have to say."],"__freakyclown__":[null,"If one wanted to check a tracker hasn't been placed in a vehicle.. How would you check? #totallynotparanoid #dodgypeoplewashingmycar","So i was with the car the whole time so not in engine bay, checked underside (covered in cf sheet) checked wheel wells, not and seats","Shiney and chrome! #whatalovelyday https://t.co/ZObeFyTM5Z","right after a very through inspection, i have a 95% confidence there is no tracker :)"],"docker":[null,".@docker Lima are having a #DockerCon recap meetup @msperu tomorrow. It's not to late to RSVP! #dockermeetup https://t.co/avrVINyYll","RT @alexellisuk: @docker for Azure beta.. so quick to deploy an entire cluster. Even the swarm was created and joined before I SSH'd https://t.co/Kq1Vvo2CJ2","#DockerCaptains share tips & tricks for @docker 1.12 https://t.co/Ej3b9kvwIE by @ajeetsraina @vfarcic @BretFisher https://t.co/8Ju7mi9Y6Y","#FollowFriday @ajeetsraina @BretFisher @vieux @alexellisuk @arungupta @nigelpoulton @EmmetOGrady @stefscherer @tiffanyfayj","Don't miss @docker SB's meetup on Monday @impacthubsb on leveraging @docker + Compose for a real dev environment! https://t.co/wdj0dRyx4y","Get a preview of @jpetazzo's all-day tutorial - #Orchestrating #Containers in Production at Scale w/ @docker #Swarm: https://t.co/KeRqjolLh3"],"github":[null,"Join us in sunny Tampa Bay for a Patchwork August 30: https://t.co/mHZSw0ZnLK"],"serafinowicz":[null,"ICYMI: my latest SASSY TRUMP video, in playlist of all my @realDonaldTrump dubs. https://t.co/w6YY4IC4ow Remember: all Trump’s exact words!","My bro @flidby got me onto @WriterDuet last year. It bludgeons Final Draft to death. And so cheap too! RECOMMEND x https://t.co/4aR2XkKdoy"],"thomasdcameron":[null,".@RCPavlicek @TheTechScribe @BitIntegrity @JohnnyCentOS @jzb @johnmark Congratulations! Welcome aboard!"],"benhammersley":[null,"Realising the hit children's tv series of my youth was about a heroin addict, his underage girlfriend, and a dead arty kid. The 80s. Wtf?","RT @novapbs: When you eat a dried fig, you're probably chewing wasp mummies. https://t.co/CO4gmQJB7z via @NewYorker","RT @TechnicallyRon: Thanks to the youtube comments section we have some brand new taglines for Rogue One https://t.co/QPrC6hOkzp","RT @BBCWorld: Taxi drivers in Sarajevo pay tribute to the star of \"Taxi Driver\" - Robert De Niro https://t.co/cLJmf2Bp5V https://t.co/Kd7LsfKvmp","This is excellent: Burning Rocks Syndrome. https://t.co/1JtVjCYXGX https://t.co/RYRKdTbrDV"],"openstack":[null,"If you're a student or government/nonprofit employee interested in attending #OpenStackSummit, apply for a discount! https://t.co/qYelqMucij","The #OpenStackSummit offers a unique opportunity for #OpenStack developers & users to exchange ideas! Register now: https://t.co/ZgTSxSsVZL"],"eastvillageldn":[null,"This weekend you can use @SantanderCycles for FREE! To celebrate their 6th birthday enjoy 24-hours of free use with the code FREE2016 #Mye20","RT @IQLondonLife: From pizza @firezza to gelato @lagelatiera, there's plenty to enjoy @EastVillageLDN: https://t.co/IkoXqZjQje https://t.co/GLySVCL7UU","Sun and the city. This shamazing weather has to be enjoyed and where better than a park with a… https://t.co/Ud2AfBeDco"],"stormbeard":[null,"RT @keirwebster: A year ago I saw a tweet from a guy @BLOODSTOCKFEST watching pro pain. One of the nicest guys I've since got to know. Enjoy @stormbeard","#UKSanPScene https://t.co/aiLl3cRUrR","Watching Corrosion of Conformity. They started at 4:20. Not a coincidence.","Nope still don't like stoner rock. Glad we cleared that up.","Went to get a slushie and watch Foetal Juice instead","It's fuckin Venom next tho lads. Venom.","RT @Dave2012Toynbee: @stormbeard #U/K/S/P UK/SP #scene https://t.co/U6sdMxuNtI","Not interested Jenny. Got a lot on. https://t.co/xW91O5AXud","Bloodstock Update: @AbysmiOs is looking red.","More than one in three. The junkie fucks. https://t.co/2YAVn8Ks6M","Who's doing Behemoths sound. It's shit.","@pyratebeard https://t.co/E1XvMCOZZ3"],"brawbeardoil":[null,"RT @dig4lroy: @BrawBeardOil captions please...... @Lee_johnston13 @GIrwinRacing @UlsterGrandPrix https://t.co/n8D0e8X6ZE","Great day at the @UlsterGrandPrix today! @JCowardRacing @Lee_johnston13 @Steven_Colgan @theMdot50 @GIrwinRacing https://t.co/pYTDLCdenf"],"hobgoblin_beer":[null,"All you @BLOODSTOCKFEST goers remind me of someone... #Goliath #BOA16 #festival https://t.co/o5WSdmhdhJ","Head over heels for Hobgoblin at @BLOODSTOCKFEST #BOA16 https://t.co/jeFE5zenC6","The key to a mischeivious weekend…preparation! https://t.co/RyZhoqOlco"],"bbmc2016":[null,"Always great to see Lee BMG Andrews of Beard Club in the countdown, here he is marking 64 days to go until the... https://t.co/oL6CyjxU03"],"nightbikeman":[null,"@pyratebeard what qualification have you got?","@pyratebeard I haven't got ant qualifications but it doesn't stop me from doing anything (badly) 😄 https://t.co/saBytFPUFT"],"collettejellis":[null,"RT @manwhohasitall: ALL MEN! Can the beach ruin your looks? Can the moon fade your skin? Can holidays make you fat? Is it okay to have a body?"],"greyhound001":[null,"@irssi_kittie I think I like the third from the right! ;)"],"terrycrews":[null,"#Repost @rebeccakcrews with repostapp ・・・ We came to LA with two kids and a U-Haul and a dream!… https://t.co/AZtOJ8UN1v"],"amonamarthband":[null,"Are you with us, America? See you next month w @Megadeth @OFFICIALSTIG @metalchurchis1! https://t.co/fd2Fb9PXAi ⚔ https://t.co/jxSacvfEMp"],"alantudyk":[null,"I'm in a little indie flick about space and the force and forceful people in space forcing people. Plus a cool droid https://t.co/zPP0AcHWng"],"jwhitehurst":[null,"How Brainstorming Questions, Not Ideas, Sparks Creativity https://t.co/Zepa7ZTkJv < a better way to brainstorm","Open source speeds innovation, plays major role in NASA's mission @SwapnilBhartiya @tomassoderstrom https://t.co/P0qwHwR6eM"],"nickjfrost":[null,"RT @edgarwright: Idea for 'Hot Fuzz' sequel: One uninterrupted 2 hour shot of @nickjfrost as Danny Butterman watching 'Bad Boys For Life'. (cc: @carnojoe)"],"jesterdiablo":[null,"The @theawesomepod Bristol Comic Expo Special is available NOW!! https://t.co/T88wMCiBFz https://t.co/T4OwRAUt1a"],"newsarama":[null,"DC's Movie FLASH Wants to Race TV's FLASH https://t.co/KXpvAdGood https://t.co/ECJIlK1PFV","The Full SCI-FI, FANTASY & GENRE Live-Action Movie Release Schedule https://t.co/VgGgefAdBQ https://t.co/e0r8XrYoZU","Image's GLITTERBOMB Is 'Hollywood Horror Story About Fame, Failure' & Self-Image https://t.co/ofIB5JwfBN https://t.co/QH120XVjQz","BABS Calls Out DICK For Joining OWLS In NIGHTWING #3 Preview https://t.co/1I9LaGzbxf https://t.co/6xS5uDLBdN","PATRICK STEWART Says Next WOLVERINE Movie Is His 'Last With The Franchise' https://t.co/9jtnuXYOlG https://t.co/Hpl5gbOhGC","IVAN REIS Joins SUICIDE SQUAD https://t.co/DVb20tX4eD https://t.co/wXdP09zZDm","DC Re-Cancels @THEBRYANHITCH's Final Two JUSTICE LEAGUE OF AMERICA Issues https://t.co/V7I51mkxYy https://t.co/WjAhd866Ts","DC led in marketshare for both categories in July sales, first time in a while... details in a few.","REBIRTH Puts DC Back On Top of July 2016 Comic Book Sales Charts https://t.co/cRPuS7XQwS https://t.co/QBVoBOV02W","Reviews: ALL-NEW ALL-DIFFERENT AVENGERS ANNUAL #1, RED HOOD & THE OUTLAWS #1, More https://t.co/UfvaFXLEA3 https://t.co/UbNIexkFcL","OSTRANDER Returns to SUICIDE SQUAD For WAR CRIMES SPECIAL #1 https://t.co/DwXIxMyB8W https://t.co/p7OqfmTqtl","AQUAMAN Trades Trident In With New JUSTICE LEAGUE Set Photo https://t.co/kDmPUSCWUe https://t.co/oqwRWM4xJs","MARVEL, STAR WARS, JAMES BOND's Go-To Film Studio Bought Out https://t.co/09gMTlq8rf https://t.co/1moLQ29tNV","RED ALERT Takes The Lead In TRANSFORMERS: MORE THAN MEETS THE EYE #56 Preview https://t.co/O9XdiDdk6T https://t.co/YI3PAY6wOL"],"boredelonmusk":[null,"Bottom Of The Bag Tortilla Chip Reassembly as a Service"],"scythiametal":[null,"This was the song that got me into Fantasy Metal! https://t.co/rxtmLpbKUk https://t.co/oMUUmoHfsB","Tonight! We shall return with Brazilian Metal Masters, HIBRIA https://t.co/fhZ74aKkuR https://t.co/yASw1ST9KM"],"harvey_art":[null,"Upload made to Patreon https://t.co/f03IZKcjKB","RT @G0ATSHRINE: ✞ “The Witching Hour” ✞ Original available on my @Etsy GoatshrineART #art #etsy https://t.co/btIfbPoMfu https://t.co/xUygc8NY2a","When you can smell bullshit on someone from a mile away. https://t.co/ri5uBRIkgF","Very much enjoying Don't Trust the Bitch in apartment 23 on Netflix","TO-MARROW, TO-MARROW, ILL EAT YOU, TO-MARROW https://t.co/c0FZBzlc2w","Very important question. Does anyone have any good marrow recipes?","EVERY.TIME. https://t.co/9uLEiOuoRe"],"fedora":[null,"@AkkiShipurkar @kushaldas Congratulations on the #FirstContribution! :)"],"robzombie":[null,"Check it out! The final official one-sheet for 31! So bad ass! #robzombie #rz31 #31themovie https://t.co/SYQH5BkddD"],"googleplay":[null,"@pyratebeard Hi Dudley. What happens when you try to install or upgrade apps? Tell us more, we'll do our best to help."],"redhatnews":[null,"#ICYMI: Check out the July issue of #RedHat Shares focused on #digitaltransformation: https://t.co/aLwYxL8JHm https://t.co/P9ADgz2x9i","RT @MT_editorial: 4 leadership tips from Red Hat CEO Jim Whitehurst https://t.co/Ir5pmZPZ8s @redhatnews https://t.co/VcEyLqTj1n","@fedora @AkkiShipurkar @kushaldas we second that!","Check out the #FridayFive blog post for news from or about #RedHat & the #tech industry https://t.co/RmopHhYTyd https://t.co/zGHluVJ8Dx","RT @cbronline: Debunking containers with @RedHatNews https://t.co/YTHv7OBYsY #containers",".@JWhitehurst: Participation and innovation are tightly linked https://t.co/lkvSYfhsuu #RHSummit","Make your #virtualization investments work for you with #RedHat's @ghaff: https://t.co/PJDIp187E0 #virt","RT @benballjr: Container Defense in Depth #security #containers @thenewstack @fatherlinux https://t.co/BjnKG0wiIF https://t.co/jVtdHM05sh","#RedHat earns \"Visionary\" rating in @Gartner_inc Magic Quadrant for x86 Server Virtualization Infrastructure report! https://t.co/IQfxE9EKcl","Get useful IT insights every month. Sign up for #RedHat Shares: https://t.co/rRtZnF8Jce #technews https://t.co/IoBRGHwpfd"],"redhatevents":[null,"Want to fix your gov, but don’t know where to start? Vote @jhibbets to speak @ #SXSW on Civic Hacking: https://t.co/M4qhvOADJJ #panelpicker","RT @RedHatPartners: AWS Summit attendees, come by booth 648 to meet with Red Hat! #AWSsummit https://t.co/n4BCXTeGXQ","Will we see you there? #VMworld #RedHat #Ansible"],"wilw":[null,"RT @seanbonner: The greatest book ever written about turning Oklahoma into a lake is free for kindle today. Pass it on. https://t.co/UTRIokZXJr","It's Friday, and I've been awake for three hours. WHERE IS MY @STRANGER_THINGS SOUNDTRACK?!","How much do I love @Stranger_Things? So much, I'll buy the soundtrack on iTunes instead of in an open format. https://t.co/xPWEHUfETt","1 hour left on our charity auction of Seamus' book, autographed (and PAWTOGRAPHED CARL): https://t.co/KC1a9EbvYs https://t.co/UDYOsFAuyh","GPS wasn't entirely accurate today, but I can estimate my run was about 3.8 miles in 35 minutes. So ... go me! #zombiesrun","RT @LynNever: Women know Just Joking Guy. We know him real well.","The @Stranger_Things soundtrack is everything I wanted it to be and I can't stop listening to it. A+++ 500/10 will buy again."],"5fdpchriskael":[null,"There's a lot of hard work behind \"destiny.\" #ShitYesSon #BigBeardBigDreams… https://t.co/rRFXscW0XD","Only a handful of these limited edition, individually numbered and hand signed prints left over… https://t.co/JO2nFfQF60","https://t.co/AxbLcg5Vkg https://t.co/Mo58oiVFTB","Direct link for the signed Chris Kael Charity Prints for @XCGIFoundation here: https://t.co/AxbLcg5Vkg"],"nickazinas":[null,".coccabal chatting to @danielpcarter for @ScuzzTV at #BOA2016 https://t.co/1CScRBP283","Always loved the Battle of Bloodstock. #BOA2016 https://t.co/JnZeetTgJb"],"jenniegyllblad":[null,"RT @Elisagn73: Have a relaxing afternoon @FJAgrafojo Art by #Willis https://t.co/A6CkxSPCWV","Currently in bed, psyching myself up to get back to the desk #SickTweet https://t.co/akV9IfquBI","RT @nicodelort: https://t.co/NsblCyD3r6","Whaddaya know, looks like welcoming refugees might actually be a good thing all around? I am shocked. SHOCKED 💖 https://t.co/4LCI2x8KHR","WELCOME TO UK POLITICS. GRAB A DRINK, YOU'RE GONNA NEED IT https://t.co/VL70nRJw4Y","RT @AyyThereDelilah: When Harley & Ivy Met Each Other 😍 https://t.co/qtMgyXRkG7","RT @AyyThereDelilah: Harley & Ivy Christmas Shopping Montage🎄🎁. (they poisoned him) https://t.co/m0IucH5kDr","@pyratebeard it is indeed! I got it as a gift, so not sure! 💀💀💀💀","RT @artofeyeris: Colour #sketch for my #Melisandre piece. I will put this #redwoman up as a #giveaway over … https://t.co/4YKWJBtzue https://t.co/FrOTmagyOq","RT @ECMSquared: This isn't even his final form! https://t.co/E35SRpcvPN https://t.co/NGuICMojYS #comics #webcomics #SOANIME #IMSORRY https://t.co/ZhyfMNeb4T","Youtube gives me pregnancy ads and twitter gives me 'CHANGE YOUR CAREER' ads. Talk about shitty targeted ads https://t.co/bGaZk71Adi","If you couldn't tell, I love my job and I never want children. PUT THAT IN YOUR DATABASE, AD PEOPLE","Oh uh, sorry *clears throat* here's a #WIP shot! Working from bed! https://t.co/U1u2MEwM2B","I can guarantee you THAT wouldn't be my expression if I found out I was pregnant. https://t.co/yZTNRcCC4O","This would be more accurate https://t.co/s1ECvQTCra"],"kfalconspb":[null,"RT @EdgarR0jas: Amazing speaker lineup for @Tactical3dge Conference: @jaysonstreet @hrbrmstr @georgiaweidman @hacktress09 https://t.co/3RXfJu2SUF","RT @hacktress09: I will not judge your organization by annual revenue, but by your robots.txt.","RT @coolsport00: @vBrianGraf Happy birthday mate. Hope you have an amazing blessed day my friend.","RT @cylanceinc: What happens when 20,000 hackers invade Vegas for a week of \"hacking, booze, and debauchery\" https://t.co/ChoHaeF06z #AliceinChains","RT @KyleHanslovan: NetTraveler #malware also using signed @FSecure binary fsguidll.exe to sideload fake fslapi.dll payload. https://t.co/WjZ1aYdYdJ #DFIR","RT @chrisbisnett: Well no company wants to admit they got compromised by unsophisticated malware that was there for more than a year https://t.co/GLc2ewQTxg","RT @tcrawford: @reillyusa @citrix ...if only one could be a fly on the wall.","RT @AmberRoork1: Do what?! https://t.co/mMBhM6cdcP","RT @Jay_Redstone: How to Install antiX Linux 16 + VMware Tools https://t.co/hwPxHyQzEC #antix #linux","RT @InfoSystir: Two of my favorite people https://t.co/5j1ABBPUiz @3ncr1pt3d & @haydnjohnson :D","RT @DevOps_Dad: I love the that ozone smell in the datacenter. It smells like...a really long night. Need to get the #serverhuggers to move to the cloud.","RT @DMBisson: Decrypting Chimera ransomware https://t.co/mixRkqU7Nf @Malwarebytes @FightRansomware #security #ransomware https://t.co/msLQ7sjGS6"],"cyborgturkey":[null,"That befuddled Brendan kid from Making a Murderer just had his conviction overturned https://t.co/yNssOYQGf6"],"linuxfoundation":[null,"See you in Toronto, @smw355! Can't wait :) @EventsLF https://t.co/S9KybBDNI3","RT @Hyperledger: Open Source Won. So, Now What? https://t.co/549MWJ21oc #Hyperledger #blockchain #OSS",".@ONLab_CORD lays out technical roadmap to overcome NFV challenges at central office level: https://t.co/ZYNDLLXsG6 https://t.co/apbw401BOX","Hi @suseLEAP. Check out our other @EventsLF! @OpenDaylightSDN's #ODForum is in November in Bengaluru. A shorter flight for sure ;) @smw355",".@pnormand we don't give away attendee contact info to 3rd parties & have removed attendee lists from our websites to avoid this in future.",".@pnormand Thanks for letting us know and do apologize for the inconvenience!","TODAY is your last chance to attend #MesosCon Europe for less! Register here to save: https://t.co/I0P5LtOGrL https://t.co/HK6L47bg4A","RT @laurakempke: Lisa Caywood of @LinuxFoundation on OpenDaylight's ecosystem. #theCUBE https://t.co/QXAw4C0eTc @OpenDaylightSDN","To work, Blockchain must have open APIs and an open source approach, @prooney24 has details: https://t.co/VIVryODAy2 https://t.co/p7naOAXp7f","RT @angelatlf: So many amazing speakers in one place! #linuxcon #containercon Still time to register - https://t.co/ky7mNGAWh0 https://t.co/MU8D8LHjfd"],"stewedrat":[null,"RT @laufman: I couldn't resist. Rogue One looks so damn awesome! #rogueone #starwars #mangastudio https://t.co/ddgezi3ec8","@robopike You've seen this, right? https://t.co/wneRwA97ZV"],"insomniumband":[null,"Ah, can you feel it? The cold breeze. The scent of the black seas... Winter's Gate bundles also from Levykauppa Äx: https://t.co/KmdxEDlEuz"],"moongoosedani":[null,"@pyratebeard pfft, he's only a level 10..","@pyratebeard haha! Anyone that spends $175 on a pair of wooden dice must be a grade A twat! Tell me you haven't..","@pyratebeard @dswcofficial @RYA when can we start calling you captain?"],"kateysagal":[null,"#FlashbackFriday My take on the Gemma/Tara relationship. https://t.co/lOt9wAU8wX #SoA https://t.co/erQLx0govr"],"geeksaresexy":[null,"WANT: Suicide Squad Harley Quinn 3-Pack Panties https://t.co/EdG3W39uiX","The Rosetta Stone of the Future [Comic] https://t.co/X0S5Ycybpr","The TARDIS at The Way Station: A Bathroom That Defies Space and Time [Video] https://t.co/Ntlm4M9Q4S","Deal of the Day: Save BIG on Stick-anywhere LED lights, Popular Science, LG Destiny 4G… https://t.co/Q9Oyv1vpSh","Why The New Joker Deserves A Standalone Movie https://t.co/EFXmNBKnux","6 of the Best Ways Games Have Punished People For Cheating [Video] https://t.co/nT5e9oLEfr","Science Nerd [Comic] https://t.co/DYErC4KgFJ","Facebook Surveys Users On News Story Relevance https://t.co/JYRPj79nce","Pokémon GO-GO: A “Wake Me Up Before You Go-Go” Parody [Video] https://t.co/1iQMqHDmPt"],"swiftonsecurity":[null,"\"Get the Pokemon for our ads. Pokemon are cool now.\" https://t.co/jHAQQvUjBT","Starting to worry I have so much faith in the intelligence of the common person because I don't use Facebook.","RT @__apf__: .@natashenka reported ~1/3 of Flash bugs last year. Found 1 a day at first, then 1/wk, using code review. #sec16 https://t.co/7rTlkRB3Zg","RT @MarioVilas: Subtle. https://t.co/4NLnVpgSXc","https://t.co/KFPws4K9LY","Dell I swear to God. https://t.co/Mf275jGXjs","RT @TheWack0lian: @SwiftOnSecurity remember that vulnerable Dell Foundation Services had an internal name of \"Tribbles\"?","Holy shit why is our Palo Alto logging into clients using NTLM to discover the logged-in user on our machines https://t.co/FjE92eC29R","What the hell is going on https://t.co/9AGoQH0PX7","This is what happens when you go around reading event logs. You discover horrific shit happening.","Enabling NTLM logging in Group Policy is highly recommended https://t.co/YKSwCOK91B","https://t.co/mn1ng8D3L3","I just assumed Palo Alto was doing some weird MitM where they tricked IE into sending the username, not logging in as admin on our boxes","What you think I do: \"Everything's terrible but I'll fix it.\" What I actually do: \"I refuse to believe I'm reading this correctly.\"","RT @hdmoore: @SwiftOnSecurity Project Sonar + PAN User-ID resulted in so many inbound credentials it used to crash the Metasploit SMB service","What you think I do: \"This is Lord Swift from IT Security, I've denied your Change Request.\" What I actually do: \"What the fuck is this???\"","RT @rosyna: That's not how this works. That's not how any of this works… You have very bad \"experts\"! https://t.co/nUrak3nhyY https://t.co/s0LWRkW4Gv","RT @rosyna: The much creepier part of the story… Why did the parents of two 8-year-old girls install surveillance cameras in their daughters' bedroom?!","My new avatar is very effective. https://t.co/OvQT6I9x1r","RT @slugbait: @SwiftOnSecurity Not a good idea. I have seen this during a test. SMBrelay actually worked and we got DA shortly after.","Chemistry is the new sociology https://t.co/moq4QBIxbB","Question: Is there a good post comparing and explaining the tolerances for failure between rocketry/aeronautics and computer programming?","If someone asks me why we can launch a rocket into space on the first try, but can't make a program that doesn't crash, how do I explain?","I mean, I know the basic answers, but I can't synthesize them into an overarching theme that's well-informed.","This isn't a judgement against traditional programming, I'm asking a grander question about \"why the expectations we have make sense.\""],"cities_pdx":[null,"RT @Zervel: Going live with some @Cities_PDX Stockholm building in 5 minutes! Join me and @cKnoor at: https://t.co/JSVOhXxQAY","Our next Expansion will be revealed next week at #GamesCom! We're super excited! You can catch it all LIVE on Twitch https://t.co/8BvXWoYvnu"],"thegrimfrost":[null,"Competition time for all Facebook users! https://t.co/ADdk43D2RL"],"nerdbastards":[null,"Lando Wanted For ‘Han Solo’ Spin Off… And They Already Have Someone In Mind https://t.co/3LHh7F59dw https://t.co/BnwS3ri8rr","DCTV Adds 80s Gold with Lundgren and Henriksen https://t.co/mrV7w1A8GN https://t.co/qAq5FBhwNQ","Might Joss Whedon Direct the Possible ‘Flash’/’Supergirl’ Musical X-Over? https://t.co/3GcME0a3SA https://t.co/eItZW8m9Lp","‘South Park: The Fractured But Whole’ To Feature New Virtual Reality Device: Nosulus Rift https://t.co/ySp5NWGBh0 https://t.co/EqJWH8UatW"],"_3dprinting":[null,"voxeljet's Positive Outlook Starts to Come to Fruition in Q2 Financial Report https://t.co/Pate7ZY4Jd #3dprinting #3dprint"],"nickdoody":[null,"Retweeting without even reading it first; it's already full of my favourite words. https://t.co/y3DNPt1M4W"],"goromlagchee":[null,"love @IrssiProject, robust, supports anything, tons of scripts, no mouse, much win. #irssi"],"tgirlpromo1":[null,"#iRespect @TSEVA010 @irssi_kittie @Sienna_Tgirl @Carlottaruby @Shrutchy @TSZoeyBlaze @Cayenne_kennedy @KacyTSDate @jenna2047 @jennyflowers97"],"tumblr":[null,"New mantra. https://t.co/3ECZChK1iC https://t.co/aFKny5C8p4","The problems with logging in and refreshing the dashboard are fixed. All done and feeling fine. Thanks everyone.","\"@lesdoggg has officially won 2016, and the year isn’t even over yet.\" - @huffingtonpost https://t.co/nN9YpIanqo https://t.co/jpShNJWUGf","Life hack. https://t.co/W8uogb8TKL https://t.co/ktb7FMBOtF","Celebrate yourself today. https://t.co/AVLJzVT2Tm https://t.co/xr1XSyoyRz"],"pnormand":[null,"Attended LinuxCon last year and now I get to be spammed by various people selling attendees list. WTF is this business @linuxfoundation"],"geekswhoeat":[null,"Thank you!!! ❤️ https://t.co/aWlWAgGxVt","RT @JoshFrigerio: This is just crazy! But, crazy is good. Anything like this coming to the @azstatefair this year? CC: @KariVanHorn https://t.co/ylmluBMQse","It's Hatch Chile season! Get the scoop on locally available products, events, and even a recipe! #GeekEats #Food... https://t.co/6nBsHbS49e"],"defcon":[null,"RT @SamanthaLaineMN: Awesome video by our @CSMPasscode team about kid #hackers at #defcon2016 https://t.co/GUovsN7h5O #defcon https://t.co/squy9uB7z4","RT @1o57: Btw, those who did the @defcon badge challenge, you DO realize that ROT2 is the compliment to ROT24, right? #Defcon24 #mC","RT @securitycandy: I'm a bit late to the @defcon @HackerJeopardy conversation... Also, congrats @banasidhe and team!!! #defcon2016 https://t.co/eaOWDBpjeS","RT @djdead: @pukingmonkey @defcon #defcon2016 notable badges/buttons/stickers/coins/trinkets from dc24. cc @dc713hou @raypath24 https://t.co/tEC7oRRQyb","RT @SWingedSeraph: Here are some photos from the @DEFCON 24 #CoreWar @John_Metcalf https://t.co/XcE4urbTvz","RT @CyberMechBear: Ty @defcon for having such an extensive following list, have a great bunch of new people in my news feed now","RT @CyberJediLoren: Thanks @BlackHatUSA & @defcon for two great conferences! It was my 1st time & I'm already looking forward to 2017! https://t.co/N0zhlBC7gl","Always good advice https://t.co/pWpoKFWp0I","RT @damagedaniel: Did anyone NOT catch the #defconsickness? I definitely won't eat you to gain your powers. @defcon","RT @ultimateloather: My official @defcon photos have been posted! Let me know what you think. https://t.co/paWiqCpYji","RT @humanhacker: Did you miss the #SEVillage @defcon 24? Or just want to reminisce? Check out our recap blog: https://t.co/ZGy57AxGxC","We are collecting photo collections to share on the #DEFCON media server. Please send us links or we can send you an U/L link","Watch all the films from #defcon's @DEFCONFilmConte in their full glory at https://t.co/nWC8scen2V !","RT @CosmoValtran: The MONOLITH - by The Monolith (I am @CosmoValtran and I approve this message) #defcon24 @DEFCONFilmConte @defcon https://t.co/Ukwrzpevh3"],"martinstarr":[null,"RT @TheBillyWest: Zapp presents...Famous Quotations from Donald J Trump #MakeAmericaBrannigan https://t.co/kbaV8rIkwK"],"nasa":[null,"RT @Astro_Jeff: Bighorn National Forest, Wyoming. https://t.co/iFeXfkxmof","Perseid meteor streaks across the sky in this 30 sec exposure taken 8/12 in WV: https://t.co/x7mnmLzZ8K @nasahqphoto https://t.co/lUW5TapWKR","Astronauts get ready for Aug 19 #spacewalk on our weekly @Space_Station update. Watch now: Q? Use #SpaceToGround https://t.co/43Aae4yrOs","This lopsided galaxy shows patches of blue, which signals the presence of young, hot stars: https://t.co/1Me3ttxT7Z https://t.co/iWp7jOZ0Cb","Six ways @NASA_DEVELOP researchers use Earth observations to solve real-world problems: https://t.co/GkU19Mx8yx https://t.co/ruL1jVD7CH","Three studies using @NASAFermi data search for dark matter in creative new ways: https://t.co/Ln2Qv4dJml https://t.co/1SZTvUvGfT"]}} +\ No newline at end of file diff --git a/irssi/.irssi/scripts/twirssi.oauth b/irssi/.irssi/scripts/twirssi.oauth @@ -0,0 +1 @@ +pyratebeard@Twitter 766247875-fbntnqvYzSHrFw7QuyWkqQ3WdMG7h1bc9QIlxgNd fqJxfkjMWIG3diir57oBAwTUHsrPY6Qvk4HdOB1FHjORW diff --git a/irssi/.irssi/scripts/twirssi.pl b/irssi/.irssi/scripts/twirssi.pl @@ -0,0 +1,4030 @@ +use strict; +use Irssi; +use Irssi::Irc; +use HTTP::Date; +use HTML::Entities; +use File::Temp; +use LWP::Simple; +use Data::Dumper; +use Encode; +use FileHandle; +use POSIX qw/:sys_wait_h strftime/; +use Net::Twitter qw/3.11009/; +use JSON::Any; +use DateTime; +use DateTime::Format::Strptime; +$Data::Dumper::Indent = 1; + +use vars qw($VERSION %IRSSI); + +$VERSION = sprintf '%s', q$Version: v2.6.3$ =~ /^\w+:\s+v(\S+)/; +%IRSSI = ( + authors => '@zigdon, @gedge', + contact => 'zigdon@gmail.com', + name => 'twirssi', + description => 'Send twitter updates using /tweet. ' + . 'Can optionally set your bitlbee /away message to same', + license => 'GNU GPL v2', + url => 'http://twirssi.com', + changed => '$Date: 2014-01-16 21:59:02 +0000$', +); + +my $twit; # $twit is current logged-in Net::Twitter object (usually one of %twits) +my %twits; # $twits{$username} = logged-in object +my %oauth; +my $user; # current $account +my $defservice; # current $service +my $poll_event; # timeout_add event object (regular update) +my %last_poll; # $last_poll{$username}{tweets|friends|blocks|lists} = time of last update + # {__interval|__poll} = time +my %nicks; # $nicks{$screen_name} = last seen/mentioned time (for sorting completions) +my %friends; # $friends{$username}{$nick} = $epoch_when_refreshed (rhs value used??) +my %blocks; # $blocks {$username}{$nick} = $epoch_when_refreshed (rhs value used??) +my %tweet_cache; # $tweet_cache{$tweet_id} = time of tweet (helps keep last hour of IDs, to avoid dups) +my %state; + # $state{__ids} {$lc_nick}[$cache_idx] = $tweet_id + # $state{__tweets} {$lc_nick}[$cache_idx] = $tweet_text + # $state{__usernames} {$lc_nick}[$cache_idx] = $username_that_polled_tweet + # $state{__reply_to_ids} {$lc_nick}[$cache_idx] = $polled_tweet_replies_to_this_id + # $state{__reply_to_users} {$lc_nick}[$cache_idx] = $polled_tweet_replies_to_this_user + # $state{__created_ats} {$lc_nick}[$cache_idx] = $time_of_tweet + # $state{__indexes} {$lc_nick} = $last_cache_idx_used + # $state{__last_id} {$username}{timeline|reply|dm} = $id_of_last_tweet + # {__sent} = $id_of_last_tweet_from_act + # {__extras}{$lc_nick} = $id_of_last_tweet (fix_replies) + # {__search}{$topic} = $id_of_last_tweet + # $state{__lists} {$username}{$list_name} = { id => $list_id, members=>[$nick,...] } + # $state{__channels} {$type}{$tag}{$net_tag} = [ channel,... ] + # $state{__windows} {$type}{$tag} = $window_name +my $failstatus = 0; # last update status: 0=ok, 1=warned, 2=failwhaled +my $first_call = 1; +my $child_pid; +my %fix_replies_index; # $fix_replies_index($username} = 0..100 idx in sort keys $state{__last_id}{$username}{__extras} +my %search_once; +my $update_is_running = 0; +my %logfile; +my %settings; +my %last_ymd; # $last_ymd{$chan_or_win} = $last_shown_ymd +my @datetime_parser; +my %completion_types = (); +my %expanded_url = (); +my $ua; +my %valid_types = ( + 'window' => [ qw/ tweet search dm reply sender error default /], # twirssi_set_window + 'channel' => [ qw/ tweet search dm reply sender error * / ], # twirssi_set_channel +); + +my $local_tz = DateTime::TimeZone->new( name => 'local' ); + +my @settings_defn = ( + [ 'broadcast_users', 'twirssi_broadcast_users', 's', undef, 'list{,}' ], + [ 'charset', 'twirssi_charset', 's', 'utf8', ], + [ 'default_service', 'twirssi_default_service', 's', 'Twitter', ], + [ 'ignored_accounts', 'twirssi_ignored_accounts', 's', '', 'list{,},norm_user' ], + [ 'ignored_twits', 'twirssi_ignored_twits', 's', '', 'lc,list{,}' ], + [ 'ignored_tags', 'twirssi_ignored_tags', 's', '', 'lc,list{,}' ], + [ 'location', 'twirssi_location', 's', Irssi::get_irssi_dir . "/scripts/$IRSSI{name}.pl" ], + [ 'nick_color', 'twirssi_nick_color', 's', '%B', ], + [ 'ymd_color', 'twirssi_ymd_color', 's', '%r', ], + [ 'oauth_store', 'twirssi_oauth_store', 's', Irssi::get_irssi_dir . "/scripts/$IRSSI{name}.oauth" ], + [ 'replies_store', 'twirssi_replies_store', 's', Irssi::get_irssi_dir . "/scripts/$IRSSI{name}.json" ], + [ 'dump_store', 'twirssi_dump_store', 's', Irssi::get_irssi_dir . "/scripts/$IRSSI{name}.dump" ], + [ 'poll_store', 'twirssi_poll_store', 's', Irssi::get_irssi_dir . "/scripts/$IRSSI{name}.polls" ], + [ 'id_store', 'twirssi_id_store', 's', Irssi::get_irssi_dir . "/scripts/$IRSSI{name}.ids" ], + [ 'retweet_format', 'twirssi_retweet_format', 's', 'RT $n: "$t" ${-- $c$}' ], + [ 'retweeted_format', 'twirssi_retweeted_format', 's', 'RT $n: $t' ], + [ 'stripped_tags', 'twirssi_stripped_tags', 's', '', 'list{,}' ], + [ 'topic_color', 'twirssi_topic_color', 's', '%r', ], + [ 'timestamp_format', 'twirssi_timestamp_format', 's', '%H:%M:%S', ], + [ 'window_priority', 'twirssi_window_priority', 's', 'account', ], + [ 'upgrade_branch', 'twirssi_upgrade_branch', 's', 'master', ], + [ 'upgrade_dev', 'twirssi_upgrade_dev', 's', 'zigdon', ], + [ 'bitlbee_server', 'bitlbee_server', 's', 'bitlbee' ], + [ 'hilight_color', 'twirssi_hilight_color', 's', '%M' ], + [ 'unshorten_color', 'twirssi_unshorten_color', 's', '%b' ], + [ 'passwords', 'twitter_passwords', 's', undef, 'list{,}' ], + [ 'usernames', 'twitter_usernames', 's', undef, 'list{,}' ], + [ 'update_usernames', 'twitter_update_usernames', 's', undef, 'list{,}' ], + [ 'url_provider', 'short_url_provider', 's', 'TinyURL' ], + [ 'url_unshorten', 'short_url_domains', 's', '', 'lc,list{ }' ], + [ 'url_args', 'short_url_args', 's', undef ], + [ 'window', 'twitter_window', 's', 'twitter' ], + [ 'debug_win_name', 'twirssi_debug_win_name', 's', '' ], + [ 'limit_user_tweets', 'twitter_user_results', 's', '20' ], + + [ 'always_shorten', 'twirssi_always_shorten', 'b', 0 ], + [ 'rt_to_expand', 'twirssi_retweet_to_expand', 'b', 1 ], + [ 'avoid_ssl', 'twirssi_avoid_ssl', 'b', 0 ], + [ 'debug', 'twirssi_debug', 'b', 0 ], + [ 'notify_timeouts', 'twirssi_notify_timeouts', 'b', 1 ], + [ 'logging', 'twirssi_logging', 'b', 0 ], + [ 'mini_whale', 'twirssi_mini_whale', 'b', 0 ], + [ 'own_tweets', 'show_own_tweets', 'b', 1 ], + [ 'to_away', 'tweet_to_away', 'b', 0 ], + [ 'upgrade_beta', 'twirssi_upgrade_beta', 'b', 1 ], + [ 'use_oauth', 'twirssi_use_oauth', 'b', 1 ], + [ 'use_reply_aliases', 'twirssi_use_reply_aliases', 'b', 0 ], + [ 'window_input', 'tweet_window_input', 'b', 0 ], + [ 'retweet_classic', 'retweet_classic', 'b', 0 ], + [ 'retweet_show', 'retweet_show', 'b', 0 ], + [ 'force_first', 'twirssi_force_first', 'b', 0 ], + + [ 'friends_poll', 'twitter_friends_poll', 'i', 600 ], + [ 'blocks_poll', 'twitter_blocks_poll', 'i', 900 ], + [ 'lists_poll', 'twitter_lists_poll', 'i', 900 ], + [ 'poll_interval', 'twitter_poll_interval', 'i', 300 ], + [ 'poll_schedule', 'twitter_poll_schedule', 's', '', 'list{,}' ], + [ 'search_results', 'twitter_search_results', 'i', 5 ], + [ 'autosearch_results','twitter_autosearch_results','i', 0 ], + [ 'timeout', 'twitter_timeout', 'i', 30 ], + [ 'track_replies', 'twirssi_track_replies', 'i', 100 ], +); + +my %meta_to_twit = ( # map file keys to twitter keys + 'id' => 'id', + 'created_at' => 'created_at', + 'reply_to_user' => 'in_reply_to_screen_name', + 'reply_to_id' => 'in_reply_to_status_id', +); + +my %irssi_to_mirc_colors = ( + '%k' => '01', + '%r' => '05', + '%g' => '03', + '%y' => '07', + '%b' => '02', + '%m' => '06', + '%c' => '10', + '%w' => '15', + '%K' => '14', + '%R' => '04', + '%G' => '09', + '%Y' => '08', + '%B' => '12', + '%M' => '13', + '%C' => '11', + '%W' => '00', +); + +sub cmd_direct { + my ( $data, $server, $win ) = @_; + + my ( $target, $text ) = split ' ', $data, 2; + unless ( $target and $text ) { + ¬ice( ["dm"], "Usage: /dm <nick> <message>" ); + return; + } + + &cmd_direct_as( "$user $data", $server, $win ); +} + +sub cmd_direct_as { + my ( $data, $server, $win ) = @_; + + my ( $username, $target, $text ) = split ' ', $data, 3; + unless ( $username and $target and $text ) { + ¬ice( ["dm"], "Usage: /dm_as <username> <nick> <message>" ); + return; + } + + return unless $username = &valid_username($username); + return unless &logged_in($twits{$username}); + + my $target_norm = &normalize_username($target, 1); + + $text = &shorten($text); + + return if &too_long($text, ['dm', $target_norm]); + + eval { + if ( $twits{$username} + ->new_direct_message( { screen_name => $target, text => $text } ) ) { + ¬ice( [ "dm", $target_norm ], "DM sent to $target: $text" ); + $nicks{$target} = time; + } else { + my $error; + eval { + $error = JSON::Any->jsonToObj( $twits{$username}->get_error() ); + $error = $error->{error}; + }; + die "$error\n" if $error; + ¬ice( [ "dm", $target_norm ], "DM to $target failed" ); + } + }; + + if ($@) { + ¬ice( ["error"], "DM caused an error: $@" ); + return; + } +} + +sub cmd_retweet { + my ( $data, $server, $win ) = @_; + + $data =~ s/^\s+|\s+$//; + unless ($data) { + ¬ice( [ "tweet", $user ], "Usage: /retweet <nick[:num]> [comment]" ); + return; + } + + (my $id, $data ) = split ' ', $data, 2; + + &cmd_retweet_as( "$user $id $data", $server, $win ); +} + +sub cmd_retweet_as { + my ( $data, $server, $win ) = @_; + + $data =~ s/^\s+|\s+$//; + ( my $username, my $id, $data ) = split ' ', $data, 3; + + unless ($username) { + ¬ice( ["tweet"], + "Usage: /retweet_as <username> <nick[:num]> [comment]" ); + return; + } + + return unless $username = &valid_username($username); + + return unless &logged_in($twits{$username}); + + my $nick; + $id =~ s/[^\w\d\-:]+//g; + ( $nick, $id ) = split /:/, $id; + unless ( exists $state{__ids}{ lc $nick } ) { + ¬ice( [ "tweet", $username ], + "Can't find a tweet from $nick to retweet!" ); + return; + } + + $id = $state{__indexes}{lc $nick} unless defined $id; + unless ( $state{__ids}{ lc $nick }[$id] ) { + ¬ice( [ "tweet", $username ], + "Can't find a tweet numbered $id from $nick to retweet!" ); + return; + } + + unless ( $state{__tweets}{ lc $nick }[$id] ) { + ¬ice( [ "tweet", $username ], + "The text of this tweet isn't saved, sorry!" ); + return; + } + + my $text = &format_expand(fmt => $settings{retweet_format}, nick => $nick, data => $data, + tweet => $state{__tweets}{ lc $nick }[$id]); + + my $modified = $data; + $data = &shorten($text); + + return if ($modified or $settings{retweet_classic}) + and &too_long($data, ['tweet', $username]); + + my $success = 1; + my $extra_info = ''; + eval { + if ($modified or $settings{retweet_classic}) { + $success = $twits{$username}->update( + { + status => $data, + # in_reply_to_status_id => $state{__ids}{ lc $nick }[$id] + } + ); + $extra_info = ' (classic/edited)'; + } else { + $success = + $twits{$username}->retweet( { id => $state{__ids}{ lc $nick }[$id] } ); + # $retweeted_id{$username}{ $state{__ids}{ lc $nick }[$id] } = 1; + $extra_info = ' (native)'; + } + }; + unless ($success) { + ¬ice( [ "tweet", $username ], "Update failed" ); + return; + } + + if ($@) { + ¬ice( [ "error", $username ], + "Update caused an error: $@. Aborted" ); + return; + } + + $extra_info .= ' id=' . $success->{id} if $settings{debug}; + + foreach ( $data =~ /@([-\w]+)/g ) { + $nicks{$_} = time; + } + + ¬ice( [ "tweet", $username ], "Retweet of $nick:$id sent" . $extra_info ); +} + + +sub format_expand { + my %args = @_; + $args{fmt} =~ s/\$n/\@$args{nick}/g; + if (defined $args{data} and $args{data} ne '') { + $args{fmt} =~ s/\${|\$}//g; + $args{fmt} =~ s/\$c/$args{data}/g; + } else { + $args{fmt} =~ s/\${.*?\$}//g; + } + $args{fmt} =~ s/\$t/$args{tweet}/g; + return $args{fmt}; +} + + +sub cmd_retweet_to_window { + my ( $data, $server, $win ) = @_; + + $data =~ s/^\s+|\s+$//; + + ( my $id, $data ) = split ' ', $data, 2; + $id =~ s/[^\w\d\-:]+//g; + ( my $nick, $id ) = split ':', $id; + unless ( exists $state{__ids}{ lc $nick } ) { + ¬ice( [ "tweet" ], + "Can't find a tweet from $nick to retweet!" ); + return; + } + + $id = $state{__indexes}{lc $nick} unless defined $id; + unless ( $state{__ids}{ lc $nick }[$id] ) { + ¬ice( [ "tweet" ], + "Can't find a tweet numbered $id from $nick to retweet!" ); + return; + } + + unless ( $state{__tweets}{ lc $nick }[$id] ) { + ¬ice( [ "tweet" ], + "The text of this tweet isn't saved, sorry!" ); + return; + } + + my $target = ''; + my $got_net = 0; + my $got_target = 0; + while (not $got_target and $data =~ s/^(\S+)\s*//) { + my $arg = $1; + if (not $got_net and lc($arg) ne '-channel' and lc($arg) ne '-nick' and $arg =~ /^-/) { + $got_net = 1; + } else { + if (lc($arg) eq '-channel' or lc($arg) eq '-nick') { + last if not $data =~ s/^(\S+)\s*//; + $arg .= " $1"; + } + $got_target = 1; + } + $target .= ($target ne '' ? ' ' : '') . $arg; + } + if (not $got_target) { + ¬ice( [ "tweet" ], "Missing target." ); + return; + } + + my $text = &format_expand(fmt => $settings{retweet_format}, nick => $nick, data => $data, + tweet => &post_process_tweet($state{__tweets}{ lc $nick }[$id], not $settings{rt_to_expand})); + + Irssi::command("msg $target $text"); + + foreach ( $text =~ /@([-\w]+)/g ) { + $nicks{$_} = time; + } + + &debug("Retweet of $nick:$id sent to $target"); +} + +sub cmd_reload { + if ($settings{force_first} and $settings{poll_store}) { + &save_state(); + &save_polls(); + } + Irssi::command("script load $IRSSI{name}"); +} + +sub cmd_tweet { + my ( $data, $server, $win ) = @_; + + $data =~ s/^\s+|\s+$//; + unless ($data) { + ¬ice( ["tweet"], "Usage: /tweet <update>" ); + return; + } + + &cmd_tweet_as( "$user\@$defservice $data", $server, $win ); +} + +sub cmd_tweet_as { + my ( $data, $server, $win ) = @_; + + $data =~ s/^\s+|\s+$//; + $data =~ s/\s\s+/ /g; + ( my $username, $data ) = split ' ', $data, 2; + + unless ( $username and $data ) { + ¬ice( ["tweet"], "Usage: /tweet_as <username> <update>" ); + return; + } + + return unless $username = &valid_username($username); + + return unless &logged_in($twits{$username}); + + $data = &shorten($data); + + return if &too_long($data, ['tweet', $username]); + + my $success = 1; + my $res; + eval { + unless ( $res = $twits{$username}->update($data) ) { + ¬ice( [ "tweet", $username ], "Update failed" ); + $success = 0; + } + }; + return unless $success; + + if ($@) { + ¬ice( [ "error", $username ], + "Update caused an error: $@. Aborted." ); + return; + } + + foreach ( $data =~ /@([-\w]+)/g ) { + $nicks{$_} = time; + } + + # TODO: What's the official definition of a Hashtag? Let's use #[-\w]+ like above for now. + if ( $settings{autosearch_results} > 0 and $data =~ /#[-\w]+/ ) { + my @topics; + while ( $data =~ /(#[-\w]+)/g ) { + push @topics, $1; + $search_once{$username}->{$1} = $settings{autosearch_results}; + } + &get_updates([ 0, [ + [ $username, { up_searches => [ @topics ] } ], + ], + ]); + } + + $state{__last_id}{$username}{__sent} = $res->{id}; + my $id_info = ' id=' . $res->{id} if $settings{debug}; + + my $away_info = ''; + if ( $username eq "$user\@$defservice" + and $settings{to_away} + and &update_away($data) ) { + $away_info = " (and away msg set)"; + } + ¬ice( [ "tweet", $username ], "Update sent" . $away_info . $id_info ); +} + +sub cmd_broadcast { + my ( $data, $server, $win ) = @_; + + my @bcast_users = @{ $settings{broadcast_users} }; + @bcast_users = keys %twits if not @bcast_users; + + foreach my $buser (@bcast_users) { + &cmd_tweet_as( "$buser $data", $server, $win ); + } +} + +sub cmd_info { + my ( $data, $server, $win ) = @_; + + $data =~ s/^\s+|\s+$//g; + unless ( $data ) { + ¬ice( ["info"], "Usage: /twitter_info <nick[:num]>" ); + return; + } + + $data =~ s/[^\w\-:]+//g; + my ( $nick_orig, $id ) = split /:/, $data; + my $nick = lc $nick_orig; + unless ( exists $state{__ids}{ $nick } ) { + ¬ice( [ "info" ], + "Can't find any tweet from $nick_orig!" ); + return; + } + + $id = $state{__indexes}{$nick} unless defined $id; + my $statusid = $state{__ids}{$nick}[$id]; + unless ( $statusid ) { + ¬ice( [ "info" ], + "Can't find a tweet numbered $id from $nick_orig!" ); + return; + } + + my $username = $state{__usernames}{$nick}[$id]; + my $timestamp = $state{__created_ats}{$nick}[$id]; + my $tweet = $state{__tweets}{$nick}[$id]; + my $reply_to_id = $state{__reply_to_ids}{$nick}[$id]; + my $reply_to_user = $state{__reply_to_users}{$nick}[$id]; + my $exp_tweet = $tweet; + if ($tweet) { + $tweet = &post_process_tweet($tweet, 1); + $exp_tweet = &post_process_tweet($exp_tweet); + } + + my $url = ''; + if ( defined $username ) { + if ( $username =~ /\@Twitter/ ) { + $url = "http://twitter.com/$nick/statuses/$statusid"; + } elsif ( $username =~ /\@Identica/ ) { + $url = "http://identi.ca/notice/$statusid"; + } + } + + ¬ice( [ "info" ], ",--------- $nick:$id" ); + ¬ice( [ "info" ], "| nick: $nick_orig <http://twitter.com/$nick_orig>" ); + ¬ice( [ "info" ], "| id: $statusid" . ($url ? " <$url>" : '')); + ¬ice( [ "info" ], "| time: " . ($timestamp + ? DateTime->from_epoch( epoch => $timestamp, time_zone => $local_tz) + : '<unknown>') ); + ¬ice( [ "info" ], "| account: " . ($username ? $username : '<unknown>' ) ); + ¬ice( [ "info" ], "| text: " . ($tweet ? $tweet : '<unknown>' ) ); + ¬ice( [ "info" ], "| +url: " . $exp_tweet ) if $exp_tweet ne $tweet; + + if ($reply_to_id and $reply_to_user) { + ¬ice( [ "info" ], "| ReplyTo: $reply_to_user:$reply_to_id" ); + ¬ice( [ "info" ], "| thread: http://twitter.theinfo.org/$statusid"); + } + ¬ice( [ "info" ], "`---------" ); +} + +sub cmd_reply { + my ( $data, $server, $win ) = @_; + + $data =~ s/^\s+|\s+$//; + unless ($data) { + ¬ice( ["reply"], "Usage: /reply <nick[:num]> <update>" ); + return; + } + + ( my $id, $data ) = split ' ', $data, 2; + unless ( $id and $data ) { + ¬ice( ["reply"], "Usage: /reply <nick[:num]> <update>" ); + return; + } + + &cmd_reply_as( "$user $id $data", $server, $win ); +} + +sub cmd_reply_as { + my ( $data, $server, $win ) = @_; + + $data =~ s/^\s+|\s+$//; + ( my $username, my $id, $data ) = split ' ', $data, 3; + + unless ( $username and $data ) { + ¬ice( ["reply"], + "Usage: /reply_as <username> <nick[:num]> <update>" ); + return; + } + + return unless $username = &valid_username($username); + + return unless &logged_in($twits{$username}); + + my $nick; + $id =~ s/[^\w\d\-:]+//g; + ( $nick, $id ) = split /:/, $id; + unless ( exists $state{__ids}{ lc $nick } ) { + ¬ice( [ "reply", $username ], + "Can't find a tweet from $nick to reply to!" ); + return; + } + + $id = $state{__indexes}{lc $nick} unless defined $id; + unless ( $state{__ids}{ lc $nick }[$id] ) { + ¬ice( [ "reply", $username ], + "Can't find a tweet numbered $id from $nick to reply to!" ); + return; + } + + $data = "\@$nick $data"; + $data = &shorten($data); + + return if &too_long($data, ['reply', $username]); + + my $success = 1; + eval { + unless ( + $twits{$username}->update( + { + status => $data, + in_reply_to_status_id => $state{__ids}{ lc $nick }[$id] + } + ) + ) { + ¬ice( [ "reply", $username ], "Update failed" ); + $success = 0; + } + }; + return unless $success; + + if ($@) { + ¬ice( [ "reply", $username ], + "Update caused an error: $@. Aborted" ); + return; + } + + foreach ( $data =~ /@([-\w]+)/g ) { + $nicks{$_} = time; + } + + my $away = $settings{to_away} ? &update_away($data) : 0; + + ¬ice( [ "reply", $username ], + "Update sent" . ( $away ? " (and away msg set)" : "" ) ); +} + +sub gen_cmd { + my ( $usage_str, $api_name, $post_ref, $data_ref ) = @_; + + return sub { + my ( $data, $server, $win ) = @_; + + return unless &logged_in($twit); + + if ($data_ref) { + $data = $data_ref->($data); + } + + $data =~ s/^\s+|\s+$//; + unless ($data) { + ¬ice("Usage: $usage_str"); + return; + } + + my $success = 1; + eval { + unless ( $twit->$api_name($data) ) { + ¬ice("$api_name failed"); + $success = 0; + } + }; + return unless $success; + + if ($@) { + ¬ice(['error'], "$api_name caused an error. Aborted: $@"); + return; + } + + &$post_ref($data, $server, $win) if $post_ref; + } +} + +sub cmd_listinfo { + my ( $data, $server, $win ) = @_; + + $data =~ s/^\s+|\s+$//g; + if ( length $data > 0 ) { + my ($list_user, $list_name) = split(' ', lc $data, 2); + my $list_account = &normalize_username($list_user, 1); + my $list_ac = ($list_account eq "$user\@$defservice" ? '' : "$list_account/"); + if (defined $list_name) { + ¬ice("Getting list: '$list_ac$list_name'"); + } else { + ¬ice("Getting all lists for '$list_account'"); + } + &get_updates([ 0, [ + [ "$user\@$defservice", { up_lists => [ $list_user, $list_name ] } ], + ], + ]); + + } else { + ¬ice( ['error'], 'Usage: /twitter_listinfo [ <user> [<list name>] ]' ); + } +} + +sub cmd_search { + my ( $data, $server, $win ) = @_; + + $data =~ s/^\s+|\s+$//g; + if ( length $data > 0 ) { + my $username = &normalize_username($user); + if ( exists $search_once{$username}->{$data} ) { + ¬ice( [ "search", $data ], "Search is already queued" ); + return; + } + $search_once{$username}->{$data} = $settings{search_results}; + ¬ice( [ "search", $data ], "Searching for '$data'" ); + &get_updates([ 0, [ + [ $username, { up_searches => [ $data ] } ], + ], + ]); + } else { + ¬ice( ["search"], "Usage: /twitter_search <search term>" ); + } +} + + +sub cmd_dms_as { + my ( $data, $server, $win ) = @_; + + $data =~ s/^\s+|\s+$//g; + ( my $username, $data ) = split ' ', $data, 2; + unless ( $username ) { + ¬ice( ['dm'], 'Usage: /twitter_dms_as <username>' ); + return; + } + return unless $username = &valid_username($username); + return unless &logged_in($twits{$username}); + + if ( length $data > 0 ) { + ¬ice( ['error'], 'Usage: /' . + ($username eq "$user\@$defservice" + ? 'twitter_dms' : 'twitter_dms_as <username>') ); + return; + } + ¬ice( [ 'dm' ], 'Fetching direct messages' ); + &get_updates([ 0, [ + [ $username, { up_dms => 1 } ], + ], + ]); +} + + +sub cmd_dms { + my ( $data, $server, $win ) = @_; + &cmd_dms_as("$user $data", $server, $win); +} + +sub cmd_switch { + my ( $data, $server, $win ) = @_; + + $data =~ s/^\s+|\s+$//g; + $data = &normalize_username($data); + if ( exists $twits{$data} ) { + ¬ice( [ "tweet", $data ], "Switching to $data" ); + $twit = $twits{$data}; + if ( $data =~ /(.*)\@(.*)/ ) { + $user = $1; + $defservice = $2; + } else { + ¬ice( [ "tweet", $data ], + "Couldn't figure out what service '$data' is on" ); + } + } else { + ¬ice( ["tweet"], "Unknown user $data" ); + } +} + +sub cmd_logout { + my ( $data, $server, $win ) = @_; + + $data =~ s/^\s+|\s+$//g; + $data = $user unless $data; + return unless $data = &valid_username($data); + + ¬ice( [ "tweet", $data ], "Logging out $data..." ); + eval { $twits{$data}->end_session(); }; + delete $twits{$data}; + delete $last_poll{$data}; + undef $twit; + if ( keys %twits ) { + &cmd_switch( ( keys %twits )[0], $server, $win ); + } else { + Irssi::timeout_remove($poll_event) if $poll_event; + undef $poll_event; + } +} + +sub cmd_login { + my ( $data, $server, $win ) = @_; + my $username; + my $pass; + &debug("logging in: $data"); + if ($data) { + ( $username, $pass ) = split ' ', $data, 2; + unless ( $settings{use_oauth} or $pass ) { + ¬ice( ["tweet"], + "usage: /twitter_login <username>[\@<service>] <password>" ); + return; + } + &debug("%G$username%n manual data login"); + + } elsif ( $settings{use_oauth} and @{ $settings{usernames} } ) { + &debug("oauth autouser login @{ $settings{usernames} }" ); + %nicks = (); + my $some_success = 0; + foreach my $user ( @{ $settings{usernames} } ) { + $some_success = &cmd_login($user); + } + return $some_success; + + } elsif ( @{ $settings{usernames} } and @{ $settings{passwords} } ) { + &debug("autouser login"); + + if ( @{ $settings{usernames} } != @{ $settings{passwords} } ) { + ¬ice( ["error"], + "Number of usernames doesn't match " + . "the number of passwords - auto-login failed" ); + return; + } else { + %nicks = (); + my $some_success = 0; + for (my $i = 0; $i < @{ $settings{usernames} }; $i++) { + $some_success ||= &cmd_login("$settings{usernames}->[$i] $settings{passwords}->[$i]"); + } + return $some_success; + } + + } else { + ¬ice( ["error"], + "/twitter_login requires either a username/password " + . "or twitter_usernames and twitter_passwords to be set. " + . "Note that if twirssi_use_oauth is true, passwords are " + . "not required" ); + return; + } + + $username = &normalize_username($username, 1); + ( $user, $defservice ) = split('@', $username, 2); + + $state{__lists}{$username} = {}; + $blocks{$username} = {}; + $friends{$username} = {}; + + if ( $defservice eq 'Twitter' and $settings{use_oauth} ) { + &debug("%G$username%n Attempting OAuth"); + eval { + if ( $defservice eq 'Identica' ) { + $twit = Net::Twitter->new( + identica => 1, + traits => [ 'API::REST', 'API::Search' ], + source => "twirssi", # XXX + ssl => !$settings{avoid_ssl}, + ); + } else { + $twit = Net::Twitter->new( + traits => + [ 'API::RESTv1_1', 'OAuth', 'RetryOnError' ], + ( + grep tr/a-zA-Z/n-za-mN-ZA-M/, map $_, + pbafhzre_xrl => 'OMINiOzn4TkqvEjKVioaj', + pbafhzre_frperg => + '0G5xnujYlo34ipvTMftxN9yfwgTPD05ikIR2NCKZ', + ), + source => "twirssi", # XXX + ssl => !$settings{avoid_ssl}, + ); + } + }; + + if ($@) { + ¬ice( ["error"], "Error when creating object: $@" ); + } + + if ($twit) { + if ( open( my $oa_fh, '<', $settings{oauth_store} ) ) { + while (<$oa_fh>) { + chomp; + next unless /^$username (\S+) (\S+)/i; + &debug("%G$username%n Trying cached oauth creds"); + $twit->access_token($1); + $twit->access_token_secret($2); + last; + } + close $oa_fh; + } + + unless ( $twit->authorized ) { + my $url; + eval { $url = $twit->get_authorization_url; }; + + if ($@) { + ¬ice( ["error"], + "Failed to get OAuth authorization_url: $@" ); + return; + } + ¬ice( ["error"], + "$user: $IRSSI{name} not authorized to access $defservice.", + "Please authorize at the following url, then enter the PIN", + "supplied with /twirssi_oauth $username <pin>", + $url + ); + + $oauth{pending}{$username} = $twit; + return; + } + } + } else { + $twit = Net::Twitter->new( + $defservice eq 'Identica' ? ( identica => 1 ) : (), + username => $user, + password => $pass, + source => "twirssi", # XXX + ssl => $settings{avoid_ssl}, + ); + } + + unless ($twit) { + ¬ice( ["error"], "Failed to create object! Aborting." ); + return; + } + + return &verify_twitter_object( $server, $win, $user, $defservice, $twit ); +} + +sub cmd_oauth { + my ( $data, $server, $win ) = @_; + my ( $key, $pin ) = split ' ', $data; + my ( $user, $service ); + $key = &normalize_username($key); + if ( $key =~ /^(.*)@(Twitter|Identica)$/ ) { + ( $user, $service ) = ( $1, $2 ); + } + $pin =~ s/\D//g; + &debug("Applying pin to $key"); + + unless ( exists $oauth{pending}{$key} ) { + ¬ice( ["error"], + "There isn't a pending oauth request for $key. " + . "Try /twitter_login first" ); + return; + } + + my $twit = $oauth{pending}{$key}; + my ( $access_token, $access_token_secret ); + eval { + ( $access_token, $access_token_secret ) = + $twit->request_access_token( verifier => $pin ); + }; + + if ($@) { + ¬ice( ["error"], "Invalid pin, try again: $@" ); + return; + } + + delete $oauth{pending}{$key}; + + my $store_file = $settings{oauth_store}; + if ($store_file) { + my @store; + if ( open( my $oa_fh, '<', $store_file ) ) { + while (<$oa_fh>) { + chomp; + next if /$key/i; + push @store, $_; + } + close $oa_fh; + + } + + push @store, "$key $access_token $access_token_secret"; + + if ( open( my $oa_fh, '>', "$store_file.new" ) ) { + print $oa_fh "$_\n" foreach @store; + close $oa_fh; + rename "$store_file.new", $store_file + or ¬ice( ["error"], "Failed to rename $store_file.new: $!" ); + } else { + ¬ice( ["error"], "Failed to write $store_file.new: $!" ); + } + } else { + ¬ice( ["error"], + "No persistant storage set for OAuth. " + . "Please /set twirssi_oauth_store to a writable filename." ); + } + + return &verify_twitter_object( $server, $win, $user, $service, $twit ); +} + +sub rate_limited { + my $obj = shift; + my $username = shift; + my $fh = shift; + + my $rate_limit; + eval { + $rate_limit = $obj->rate_limit_status(); + }; + my $res = 0; + if ( $rate_limit and $rate_limit->{resources} ) { + for my $resource (keys %{ $rate_limit->{resources} }) { + for my $uri (keys %{ $rate_limit->{resources}->{$resource} }) { + if ( $rate_limit->{resources}->{$resource}->{$uri}->{remaining} < 1 ) { + ¬ice( [ 'error', $username, $fh ], + "Rate limit exceeded for $resource ($uri), try again after " . + localtime $rate_limit->{resources}->{$resource}->{$uri}->{reset} ); + $res = 1; + } + } + } + } + return $res; +} + +sub verify_twitter_object { + my ( $server, $win, $user, $service, $twit ) = @_; + + if ( my $timeout = $settings{timeout} and $twit->can('ua') ) { + $twit->ua->timeout($timeout); + ¬ice( ["tweet", "$user\@$service"], + "Twitter timeout for $user\@$service set to $timeout" ); + } + + my $verified = 0; + eval { $verified = $twit->verify_credentials(); }; + + if ( $@ or not $verified ) { + ¬ice( + [ "tweet", "$user\@$service" ], + "Login as $user\@$service failed" + ); + + if ( not $settings{avoid_ssl} ) { + ¬ice( + [ "tweet", "$user\@$service" ], + "It's possible you're missing one of the modules required for " + . "SSL logins. Try setting twirssi_avoid_ssl to on. See " + . "http://cpansearch.perl.org/src/GAAS/libwww-perl-5.831/README.SSL " + . "for the detailed requirements." + ); + } + + $twit = undef; + if ( keys %twits ) { + &cmd_switch( ( keys %twits )[0], $server, $win ); + } + return; + } + + if (&rate_limited($twit, "$user\@$service")) { + $twit = undef; + return; + } + + &debug("%G$user\@$service%n saving object"); + $twits{"$user\@$service"} = $twit; + + # &get_updates([ 1, [ "$user\@$service", {} ], ]); + &ensure_updates(); + + foreach my $scr_name (keys %{ $friends{"$user\@$service"} }) { + $nicks{$scr_name} = $friends{"$user\@$service"}{$scr_name}; + } + $nicks{$user} = 0; + return 1; +} + +sub cmd_add_follow { + my ( $data, $server, $win ) = @_; + + unless ($data) { + ¬ice( ["error"], "Usage: /twitter_add_follow_extra <username>" ); + return; + } + + $data =~ s/^\s+|\s+$//g; + $data =~ s/^\@//; + $data = lc $data; + + if ( exists $state{__last_id}{"$user\@$defservice"}{__extras}{$data} ) { + ¬ice( ["tweet"], "Already following all replies by \@$data" ); + return; + } + + $state{__last_id}{"$user\@$defservice"}{__extras}{$data} = 1; + ¬ice( ["tweet"], "Will now follow all replies by \@$data" ); +} + +sub cmd_del_follow { + my ( $data, $server, $win ) = @_; + + unless ($data) { + ¬ice( ["error"], "Usage: /twitter_del_follow_extra <username>" ); + return; + } + + $data =~ s/^\s+|\s+$//g; + $data =~ s/^\@//; + $data = lc $data; + + unless ( exists $state{__last_id}{"$user\@$defservice"}{__extras}{$data} ) { + ¬ice( ["error"], "Wasn't following all replies by \@$data" ); + return; + } + + delete $state{__last_id}{"$user\@$defservice"}{__extras}{$data}; + ¬ice( ["tweet"], "Will no longer follow all replies by \@$data" ); +} + +sub cmd_list_follow { + my ( $data, $server, $win ) = @_; + + my $found = 0; + foreach my $suser ( sort keys %{ $state{__last_id} } ) { + next unless exists $state{__last_id}{$suser}{__extras}; + my $frusers = join ', ', sort keys %{ $state{__last_id}{$suser}{__extras} }; + if ($frusers) { + $found = 1; + ¬ice( ["tweet"], "Following all replies as $suser: $frusers" ); + } + } + + unless ($found) { + ¬ice( ["tweet"], "Not following all replies by anyone" ); + } +} + +sub cmd_add_search { + my ( $data, $server, $win ) = @_; + + unless ( $twit and $twit->can('search') ) { + ¬ice( ["search"], + "ERROR: Your version of Net::Twitter ($Net::Twitter::VERSION) " + . "doesn't support searches." ); + return; + } + + my $want_win = 1 if $data =~ s/^\s*-w\s+//; + + $data =~ s/^\s+|\s+$//g; + $data = lc $data; + + unless ($data) { + ¬ice( ["search"], "Usage: /twitter_subscribe [-w] <topic>" ); + return; + } + + if ( exists $state{__last_id}{"$user\@$defservice"}{__search}{$data} ) { + ¬ice( [ "search", $data ], + "Already had a subscription for '$data'" ); + return; + } + + $state{__last_id}{"$user\@$defservice"}{__search}{$data} = 1; + ¬ice( [ "search", $data ], "Added subscription for '$data'" ); + if ($want_win) { + my $win_name = $data; + $win_name =~ tr/ /+/; + &cmd_set_window("search $data $win_name", $server, $win); + } +} + +sub cmd_del_search { + my ( $data, $server, $win ) = @_; + + unless ( $twit and $twit->can('search') ) { + ¬ice( ["search"], + "ERROR: Your version of Net::Twitter ($Net::Twitter::VERSION) " + . "doesn't support searches." ); + return; + } + $data =~ s/^\s+|\s+$//g; + $data = lc $data; + + unless ($data) { + ¬ice( ["search"], "Usage: /twitter_unsubscribe <topic>" ); + return; + } + + unless ( exists $state{__last_id}{"$user\@$defservice"}{__search}{$data} ) { + ¬ice( [ "search", $data ], "No subscription found for '$data'" ); + return; + } + + delete $state{__last_id}{"$user\@$defservice"}{__search}{$data}; + ¬ice( [ "search", $data ], "Removed subscription for '$data'" ); +} + +sub cmd_list_search { + my ( $data, $server, $win ) = @_; + + my $found = 0; + foreach my $suser ( sort keys %{ $state{__last_id} } ) { + my $topics = ''; + foreach my $topic ( sort keys %{ $state{__last_id}{$suser}{__search} } ) { + $topics .= ($topics ne '' ? ', ' : '') . "'$topic'"; + } + if ($topics ne '') { + $found = 1; + ¬ice( ["search"], "Search subscriptions for $suser: $topics" ); + } + } + + unless ($found) { + ¬ice( ["search"], "No search subscriptions set up" ); + } +} + +sub cmd_upgrade { + my ( $data, $server, $win ) = @_; + + my $loc = $settings{location}; + unless ( -w $loc ) { + ¬ice( ["error"], + "$loc isn't writable, can't upgrade." + . " Perhaps you need to /set twirssi_location?" ); + return; + } + + my $md5; + unless ( $data or $settings{upgrade_beta} ) { + eval " use Digest::MD5; "; + + if ($@) { + ¬ice( ["error"], + "Failed to load Digest::MD5." + . " Try '/twirssi_upgrade nomd5' to skip MD5 verification" ); + return; + } + + $md5 = get("http://twirssi.com/md5sum"); + chomp $md5; + $md5 =~ s/ .*//; + unless ($md5) { + ¬ice( ["error"], + "Failed to download md5sum from peeron! Aborting." ); + return; + } + + my $fh; + unless ( open( $fh, '<', $loc ) ) { + ¬ice( ["error"], + "Failed to read $loc." + . " Check that /set twirssi_location is set to the correct location." + ); + return; + } + + my $cur_md5 = Digest::MD5::md5_hex(<$fh>); + close $fh; + + if ( $cur_md5 eq $md5 ) { + ¬ice( ["error"], "Current twirssi seems to be up to date." ); + return; + } + } + + my $URL = + $settings{upgrade_beta} + ? "http://github.com/$settings{upgrade_dev}/twirssi/raw/$settings{upgrade_branch}/twirssi.pl" + : "http://twirssi.com/twirssi.pl"; + ¬ice( ["notice"], "Downloading twirssi from $URL" ); + LWP::Simple::getstore( $URL, "$loc.upgrade" ); + + unless ( -s "$loc.upgrade" ) { + ¬ice( ["error"], + "Failed to save $loc.upgrade." + . " Check that /set twirssi_location is set to the correct location." + ); + return; + } + + unless ( $data or $settings{upgrade_beta} ) { + my $fh; + unless ( open( $fh, '<', "$loc.upgrade" ) ) { + ¬ice( ["error"], + "Failed to read $loc.upgrade." + . " Check that /set twirssi_location is set to the correct location." + ); + return; + } + + my $new_md5 = Digest::MD5::md5_hex(<$fh>); + close $fh; + + if ( $new_md5 ne $md5 ) { + ¬ice( ["error"], + "MD5 verification failed. expected $md5, got $new_md5" ); + return; + } + } + + rename $loc, "$loc.backup" + or ¬ice( ["error"], "Failed to back up $loc: $!. Aborting" ) + and return; + rename "$loc.upgrade", $loc + or ¬ice( ["error"], "Failed to rename $loc.upgrade: $!. Aborting" ) + and return; + + my ( $dir, $file ) = ( $loc =~ m{(.*)/([^/]+)$} ); + if ( -e "$dir/autorun/$file" ) { + ¬ice( ["notice"], "Updating $dir/autorun/$file" ); + unlink "$dir/autorun/$file" + or + ¬ice( ["error"], "Failed to remove old $file from autorun: $!" ); + symlink "../$file", "$dir/autorun/$file" + or ¬ice( ["error"], + "Failed to create symlink in autorun directory: $!" ); + } + + ¬ice( ["notice"], + "Download complete. Reload twirssi with /twirssi_reload" ); +} + +sub cmd_list_channels { + my ( $data, $server, $win ) = @_; + + ¬ice("Current output channels:"); + foreach my $type ( sort keys %{ $state{__channels} } ) { + ¬ice("$type:"); + foreach my $tag ( sort keys %{ $state{__channels}{$type} } ) { + ¬ice(" $tag:"); + foreach my $net_tag ( sort keys %{ $state{__channels}{$type}{$tag} } ) { + ¬ice(" $net_tag: " + . join ', ', @{ $state{__channels}{$type}{$tag}{$net_tag} }); + } + } + } + ¬ice("Add new entries using /twirssi_set_channel " + . "[[-]type|*] [account|search_term|*] [net_tag] [channel]" ); + ¬ice("Type can be one of: tweet, reply, dm, search, sender, error.", + "A '*' for type/tag indicates wild" + . " (if type is wild, ensure account qualified: [user]\@[service]).", + "Remove settings by negating type, e.g. '-tweet'."); +} + +sub cmd_set_channel { + my ( $data, $server, $win ) = @_; + + my @words = split ' ', lc $data; + unless (@words == 4) { + return &cmd_list_channels(@_); + } + + my ($type, $tag, $net_tag, $channame) = @words; + my $delete = 1 if $type =~ s/^-//; + + unless ( grep { $type eq $_ } @{ $valid_types{'channel'} } ) { + ¬ice(['error'], "Invalid message type '$type'."); + ¬ice(['error'], 'Valid types: ' . join(', ', @{ $valid_types{'channel'} })); + return; + } + + $tag = &normalize_username($tag) unless grep { $type eq $_ } qw/ search sender * / + or $tag eq '*'; + + if ($delete) { + if (not defined $state{__channels}{$type} + or not defined $state{__channels}{$type}{$tag} + or not defined $state{__channels}{$type}{$tag}{$net_tag} + or not grep { $_ eq $channame } @{ $state{__channels}{$type}{$tag}{$net_tag} }) { + ¬ice("No such channel setting for $type/$tag on $net_tag."); + return; + } + ¬ice("$type/$tag messages will no longer be sent" + . " to the '$channame' channel on $net_tag" ); + @{ $state{__channels}{$type}{$tag}{$net_tag} } = + grep { $_ ne $channame } @{ $state{__channels}{$type}{$tag}{$net_tag} }; + delete $state{__channels}{$type}{$tag}{$net_tag} + unless @{ $state{__channels}{$type}{$tag}{$net_tag} }; + delete $state{__channels}{$type}{$tag} + unless keys %{ $state{__channels}{$type}{$tag} }; + delete $state{__channels}{$type} + unless keys %{ $state{__channels}{$type} }; + + } elsif (defined $state{__channels}{$type}{$tag}{$net_tag} + and grep { $_ eq $channame } + @{ $state{__channels}{$type}{$tag}{$net_tag} }) { + ¬ice("There is already such a channel setting."); + return; + + } else { + ¬ice("$type/$tag messages will now be sent" + . " to the '$channame' channel on $net_tag" ); + push @{ $state{__channels}{$type}{$tag}{$net_tag} }, $channame; + } + + &save_state(); + return; +} + +sub cmd_list_windows { + my ( $data, $server, $win ) = @_; + + ¬ice("Current output windows:"); + foreach my $type ( sort keys %{ $state{__windows} } ) { + ¬ice("$type:"); + foreach my $tag ( sort keys %{ $state{__windows}{$type} } ) { + ¬ice(" $tag: $state{__windows}{$type}{$tag}"); + } + } + ¬ice( "Default window for all other messages: " . $settings{window} ); + + ¬ice("Add new entries with the /twirssi_set_window " + . "[type] [tag] [window] command." ); + ¬ice("Remove a setting by setting window name to '-'."); +} + +sub cmd_set_window { + my ( $data, $server, $win ) = @_; + + my @words = split ' ', $data; + + unless (@words) { + &cmd_list_windows(@_); + return; + } + + my $winname = pop @words; # the last argument is the window name + my $delete = $winname eq '-'; + + if ( @words == 0 ) { # just a window name + $winname = 'twitter' if $delete; + ¬ice("Changing the default twirssi window to $winname"); + Irssi::settings_set_str( "twitter_window", $winname ); + &ensure_logfile($settings{window} = $winname); + } elsif ( @words > 2 and $words[0] ne 'search' ) { + ¬ice( + "Too many arguments to /twirssi_set_window. '@words'", + "Usage: /twirssi_set_window [type] [account|search_term] [window].", + 'Valid types: ' . join(', ', @{ $valid_types{'window'} }) + ); + return; + } elsif ( @words >= 1 ) { + my $type = lc $words[0]; + unless ( grep { $_ eq $type } @{ $valid_types{'window'} } ) { + ¬ice(['error'], + "Invalid message type '$type'.", + 'Valid types: ' . join(', ', @{ $valid_types{'window'} }) + ); + return; + } + + my $tag = "default"; + if ( @words >= 2 ) { + $tag = lc $words[1]; + if ($type eq 'sender') { + $tag =~ s/^\@//; + $tag =~ s/\@.+//; + } elsif ($type ne 'search' + and ($type ne 'default' or index($tag, '@') >= 0) + and $tag ne 'default') { + $tag = &normalize_username($tag); + } elsif ($type eq 'search' and @words > 2) { + $tag = lc join(' ', @words[1..$#words]); + } + if (substr($tag, -1, 1) eq '@') { + ¬ice(['error'], "Invalid tag '$tag'."); + return; + } + } + + if ($delete) { + if (not defined $state{__windows}{$type} + or not defined $state{__windows}{$type}{$tag}) { + ¬ice("No such window setting for $type/$tag."); + return; + } + ¬ice("$type/$tag messages will no longer be sent to the '" + . $state{__windows}{$type}{$tag} . "' window" ); + delete $state{__windows}{$type}{$tag}; + delete $state{__windows}{$type} + unless keys %{ $state{__windows}{$type} }; + } else { + ¬ice("$type/$tag messages will now" + . " be sent to the '$winname' window" ); + $state{__windows}{$type}{$tag} = $winname; + } + + &save_state(); + } + + &ensure_window($winname) if $winname ne '-'; + + return; +} + +sub get_friends { + my $u_twit = shift; + my $username = shift; + my $fh = shift; + my $is_update = shift; + + my $new_friends = &scan_cursor('friends', $u_twit, $username, $fh, + { fn=>'friends', cp=>(index($username, '@Twitter') != -1 ? 'c' : 'p'), + set_key=>'users', item_key=>'screen_name', }); + return if not defined $new_friends; + + return $new_friends if not $is_update; + + my ( $added, $removed ) = ( 0, 0 ); + # &debug($fh, "%G$username%n Scanning for new friends..."); + foreach ( keys %$new_friends ) { + next if exists $friends{$username}{$_}; + $friends{$username}{$_} = $new_friends->{$_}; + $added++; + } + + # &debug($fh, "%G$username%n Scanning for removed friends..."); + foreach ( keys %{ $friends{$username} } ) { + next if exists $new_friends->{$_}; + delete $friends{$username}{$_}; + &debug($fh, "%G$username%n removing friend: $_"); + $removed++; + } + + return ( $added, $removed ); +} + +sub scan_cursor { + my $type_str = shift; + my $u_twit = shift; + my $username = shift; + my $fh = shift; + my $fn_info = shift; + + my $whole_set = {}; + my $fn_args = { (defined $fn_info->{args} ? %{ $fn_info->{args} } : ()) }; + my $fn_name = $fn_info->{fn}; + my $pg_type = index($fn_info->{cp}, 'c') >= 0 ? 'cursor' : ($fn_info->{cp} =~ /p(\d*)/ ? 'page' : ''); + my $max_page = 10; + $max_page = $1 if $pg_type eq 'page' and length($1) > 0; + eval { + for (my($cursor, $page) = (-1, 1); $cursor and $page <= $max_page; $page++) { + if ($pg_type eq 'cursor') { + $fn_args->{cursor} = $cursor; + } elsif ($pg_type eq 'page') { + $fn_args->{page} = $page; + } + &debug($fh, "%G$username%n Loading $type_str $pg_type " . ($pg_type eq 'cursor' ? $cursor : $page)); + my $collection = $u_twit->$fn_name($fn_args); + last if not $collection; + if ($pg_type eq 'cursor') { + $cursor = $collection->{next_cursor}; + $collection = $collection->{$fn_info->{set_key}} if defined $fn_info->{set_key}; + } + last if 0 == @$collection; + foreach my $coll_item (@$collection) { + if ($pg_type eq 'page' + and defined $whole_set->{$coll_item->{$fn_info->{item_key}}}) { + &debug($fh, "%G$username%n repeated page $page key " . $fn_info->{item_key} . + ' val ' . $coll_item->{$fn_info->{item_key}} . + ''); #' pre ' . Dumper($whole_set->{$coll_item->{$fn_info->{item_key}}})); + next; + } + $whole_set->{$coll_item->{$fn_info->{item_key}}} = ( + defined $fn_info->{item_val} + ? $coll_item->{$fn_info->{item_val}} + : (defined $fn_info->{item_keys} + ? (ref($fn_info->{item_keys}) eq 'ARRAY' + ? { map { $_ => $coll_item->{$_} } @{ $fn_info->{item_keys} } } + : { %$coll_item }) + : time) + ); + $fn_args->{max_id} = $coll_item->{id_str} if defined $fn_args->{since_id}; + } + } + }; +foreach my $item (split "\n", Dumper($whole_set)) { &debug($fh, "$pg_type: $item"); } + + if ($@) { + ¬ice(['error', $username, $fh], "$username: Error updating $type_str. Aborted."); + &debug($fh, "%G$username%n Error updating $type_str: $@"); + return; + } + + return $whole_set; +} + +sub get_lists { + my $u_twit = shift; + my $username = shift; + my $fh = shift; + my $is_update = shift; + my $userid = shift; + my $list_name = shift; + + my $list_account = $username; + if ($is_update and not defined $userid and $username =~ /(.+)\@/) { + $userid = $1; + } else { + $list_account = &normalize_username($userid, 1); + } + + my %stats = (added => 0, deleted => 0); + + # ensure $new_lists->{$list_name} = $id + my %more_args = (); + my $new_lists = &scan_cursor('lists', $u_twit, $username, $fh, + { fn=>'list_ownerships', cp=>'c', set_key=>'lists', + args=>{ user=>$userid, %more_args }, item_key=>'name', item_val=>'id', }); + return if not defined $new_lists; + + # reduce $new_lists if $list_name specified (not $is_update) + if (defined $list_name) { + if (not defined $new_lists->{$list_name}) { + return {}; # not is_update, so return empty + } + $new_lists = { $list_name => $new_lists->{$list_name} }; + } + + foreach my $list (keys %$new_lists) { + $stats{added}++ if not exists $state{__lists}{$list_account}{$list}; + $state{__lists}{$list_account}{$list} = { id=>$new_lists->{$list}, members=>[], }; + } + + if ($is_update) { + # remove any newly-missing lists + foreach my $old_list (keys %{ $state{__lists}{$list_account} }) { + if (not defined $new_lists->{$old_list}) { + delete $state{__lists}{$list_account}{$old_list}; + &debug($fh, "%G$username%n removing list: $list_account / $old_list"); + $stats{deleted}++; + } + } + } + + foreach my $reget_list (keys %$new_lists) { + &debug($fh, "%G$username%n updating list: $list_account / $reget_list id=" . + $state{__lists}{$list_account}{$reget_list}{id}); + my $members = &scan_cursor('list member', $u_twit, $username, $fh, + { fn=>'list_members', cp=>'c', set_key=>'users', item_key=>'screen_name', item_val=>'id', + args=>{ user=>$userid, list_id=>$state{__lists}{$list_account}{$reget_list}{id} }, }); + return if not defined $members; + $state{__lists}{$list_account}{$reget_list}{members} = [ keys %$members ]; + } + + return ($stats{added}, $stats{deleted}); +} + +sub get_blocks { + my $u_twit = shift; + my $username = shift; + my $fh = shift; + my $is_update = shift; + + my $new_blocks = &scan_cursor('blocks', $u_twit, $username, $fh, + { fn=>'blocking', cp=>'c', set_key=>'users', item_key=>'screen_name', }); + return if not defined $new_blocks; + + return $new_blocks if not $is_update; + + my ( $added, $removed ) = ( 0, 0 ); + # &debug($fh, "%G$username%n Scanning for new blocks..."); + foreach ( keys %$new_blocks ) { + next if exists $blocks{$username}{$_}; + $blocks{$username}{$_} = time; + $added++; + } + + # &debug($fh, "%G$username%n Scanning for removed blocks..."); + foreach ( keys %{ $blocks{$username} } ) { + next if exists $new_blocks->{$_}; + delete $blocks{$username}{$_}; + &debug($fh, "%G$username%n removing block: $_"); + $removed++; + } + + return ( $added, $removed ); +} + +sub get_reply_to { + # extract reply-to-information from tweets + my $t = shift; + + if ($t->{in_reply_to_screen_name} + and $t->{in_reply_to_status_id}) { + return sprintf 'reply_to_user:%s reply_to_id:%s ', + $t->{in_reply_to_screen_name}, + $t->{in_reply_to_status_id}; + } else { + return ''; + } +} + +sub cmd_wipe { + my ( $data, $server, $win ) = @_; + my @cache_keys = qw/ __tweets __indexes __ids + __usernames __reply_to_ids __reply_to_users __created_ats /; + my @surplus_nicks = (); + if ($data eq '') { + for my $nick (keys %{ $state{__tweets} }) { + my $followed = 0; + for my $acct (keys %twits) { + if (grep { lc($_) eq $nick } keys %{ $friends{$acct} }) { + $followed = 1; + last; + } + } + push @surplus_nicks, $nick if not $followed; + } + } else { + for my $to_wipe (split(/\s+/, $data)) { + if (exists $state{$to_wipe}) { + ¬ice("Wiping '$to_wipe' state."); + $state{$to_wipe} = {}; + } elsif ($to_wipe eq '-f') { + push @surplus_nicks, keys %{ $state{__tweets} }; + } elsif ($to_wipe eq '-A') { + ¬ice('Wiping all info/settings.'); + %state = (); + } else { + ¬ice([ 'error' ], "Error: no such twirssi_wipe argument '$to_wipe'."); + } + } + } + if (@surplus_nicks) { + for my $surplus_nick (@surplus_nicks) { + for my $cache_key (@cache_keys) { + delete $state{$cache_key}{$surplus_nick}; + } + } + &debug('Wiped data for ' . join(',', @surplus_nicks)); + ¬ice('Wiped data for ' . (0+@surplus_nicks) . ' nicks.'); + } +} + +sub cmd_user { + my $target = shift; + my $server = shift; + my $win = shift; + $target =~ s/(?::\d+)?\s*$//; + &cmd_set_window("sender $target $target", $server, $win) + if $target =~ s/^\s*-w\s+// and $target ne ''; + &get_updates([ 0, [ + [ "$user\@$defservice", { up_user => $target } ], + ], + ]); +} + +sub tweet_to_meta { + my $obj = shift; + my $t = shift; + my $username = shift; + my $type = shift; + my $topic = shift; + my %meta = ( + username => $username, + type => $type, + nick => ($type eq 'dm' ? $t->{sender_screen_name} + : $t->{user}{screen_name}), + ); + ($meta{account}, $meta{service}) = split('@', $username, 2); + foreach my $meta_key (keys %meta_to_twit) { + $meta{$meta_key} = $t->{$meta_to_twit{$meta_key}} if defined $t->{$meta_to_twit{$meta_key}}; + } + $meta{created_at} = &date_to_epoch($meta{created_at}); + $meta{topic} = $topic if defined $topic; + $meta{text} = &get_text($t, $obj); + return \%meta; +} + +sub tweet_or_reply { + my $obj = shift; + my $t = shift; + my $username = shift; + my $cache = shift; + my $fh = shift; + + my $type = 'tweet'; + if ( $t->{in_reply_to_screen_name} + and $username !~ /^\Q$t->{in_reply_to_screen_name}\E\@/i + and not exists $friends{$username}{ $t->{in_reply_to_screen_name} } ) { + $nicks{ $t->{in_reply_to_screen_name} } = time; + unless ( $cache->{ $t->{in_reply_to_status_id} } ) { + eval { + $cache->{ $t->{in_reply_to_status_id} } = + $obj->show_status( $t->{in_reply_to_status_id} ); + }; + } +&debug($fh, "REPLY $username rep2 $@ " . Dumper($cache->{ $t->{in_reply_to_status_id} })); + if (my $t_reply = $cache->{ $t->{in_reply_to_status_id} }) { + if (defined $fh) { + my $ctext = &get_text( $t_reply, $obj ); + printf $fh "t:tweet id:%s ac:%s %snick:%s created_at:%s %s\n", + $t_reply->{id}, $username, &get_reply_to($t_reply), + $t_reply->{user}{screen_name}, + &encode_for_file($t_reply->{created_at}), + $ctext; + &get_unshorten_urls($ctext, $fh); + } + $type = 'reply'; + } + } + return $type; +} + +sub background_setup { + my $pause_monitor = shift || 5000; + my $max_pauses = shift || 24; + my $is_update = shift; + my $fn_to_call = shift; + my $fn_args_ref = shift; + + &debug("bg_setup starting upd=$is_update"); + + return unless &logged_in($twit); + + my ( $fh, $filename ) = File::Temp::tempfile('tw_'.$$.'_XXXX', TMPDIR => 1); + my $done_filename = "$filename.done"; + unlink($done_filename) if -f $done_filename; + binmode( $fh, ":" . &get_charset() ); + $child_pid = fork(); + + if ($child_pid) { # parent + Irssi::timeout_add_once( $pause_monitor, 'monitor_child', + [ $done_filename, $max_pauses, $pause_monitor, $is_update, $filename . '.' . $child_pid, 0 ] ); + Irssi::pidwait_add($child_pid); + } elsif ( defined $child_pid ) { # child + my $pid_filename = $filename . '.' . $$; + rename $filename, $pid_filename; + close STDIN; + close STDOUT; + close STDERR; + + { + no strict 'refs'; + &$fn_to_call($fh, @$fn_args_ref); + } + + close $fh; + rename $pid_filename, $done_filename; + exit; + } else { + ¬ice([ 'error' ], "Failed to fork for background call: $!"); + } +} + +sub ensure_updates { + my $adhoc_interval = shift; + my $poll_interval = (defined $adhoc_interval ? $adhoc_interval : &get_poll_time) * 1000; + if ($poll_interval != $last_poll{__interval} or not $poll_event) { + &debug("get_updates every " . int($poll_interval/1000)); + Irssi::timeout_remove($poll_event) if $poll_event; + $poll_event = Irssi::timeout_add( $poll_interval, \&get_updates, [ 1 ] ); + $last_poll{__interval} = $poll_interval; + } +} + +sub get_updates { + my $args = shift; + + my $is_regular = 0; + my $to_be_updated; + if (not ref $args) { # command-line request, so do regular + $is_regular = 1; + } else { + $is_regular = $args->[0]; + $to_be_updated = $args->[1]; + } + + &debug("get_updates starting upd=$is_regular"); + + return unless &logged_in($twit); + + if ($is_regular) { + if ($update_is_running) { + &debug("get_updates aborted: already running"); + return; + } + $update_is_running = 1; + } + + if (not defined $to_be_updated) { + $to_be_updated = []; + foreach my $pref_user (@{ $settings{update_usernames} }) { + next unless $pref_user = &valid_username($pref_user); + next if grep { $_ eq $pref_user } @{ $settings{ignored_accounts} }; + push @$to_be_updated, [ $pref_user, {} ]; + } + foreach my $other_user (keys %twits) { + next if grep { $_ eq $other_user } @{ $settings{ignored_accounts} }; + push @$to_be_updated, [ $other_user, {} ] + if not grep { $other_user eq $_->[0] } @$to_be_updated; + } + } + &background_setup(5000, (24*@$to_be_updated), $is_regular, 'get_updates_child', [ $is_regular, $to_be_updated ]); + + if ($is_regular) { + &ensure_updates(); + } +} + +sub get_updates_child { + my $fh = shift; + my $is_regular = shift; + my $to_be_updated = shift; + + my $time_before_update = time; + + my $error = 0; + my @error_types = (); + my %context_cache; + + foreach my $update_tuple ( @$to_be_updated ) { + my $username = shift @$update_tuple; + my $what_to_update = shift @$update_tuple; + my $errors_beforehand = $error; + + if (0 == keys(%$what_to_update) + or defined $what_to_update->{up_tweets}) { + unless (&get_tweets( $fh, $username, $twits{$username}, \%context_cache )) { + $error++; + push @error_types, 'tweets'; + } + + if ( exists $state{__last_id}{$username}{__extras} + and keys %{ $state{__last_id}{$username}{__extras} } ) { + my @frusers = sort keys %{ $state{__last_id}{$username}{__extras} }; + + unless (&get_timeline( $fh, $frusers[ $fix_replies_index{$username} ], + $username, $twits{$username}, \%context_cache, $is_regular )) { + $error++; + push @error_types, 'replies'; + } + + $fix_replies_index{$username}++; + $fix_replies_index{$username} = 0 + if $fix_replies_index{$username} >= @frusers; + print $fh "t:fix_replies_index idx:$fix_replies_index{$username} ", + "ac:$username\n"; + } + } + next if $error > $errors_beforehand; + + if (defined $what_to_update->{up_user}) { + unless (&get_timeline( $fh, $what_to_update->{up_user}, + $username, $twits{$username}, \%context_cache, $is_regular )) { + $error++; + push @error_types, 'tweets'; + } + + } + next if $error > $errors_beforehand; + + if (0 == keys(%$what_to_update) + or defined $what_to_update->{up_dms}) { + unless (&do_dms( $fh, $username, $twits{$username}, $is_regular )) { + $error++; + push @error_types, 'dms'; + } + } + next if $error > $errors_beforehand; + + if (0 == keys(%$what_to_update) + or defined $what_to_update->{up_subs}) { + unless (&do_subscriptions( $fh, $username, $twits{$username}, $what_to_update->{up_subs} )) { + $error++; + push @error_types, 'subs'; + } + } + next if $error > $errors_beforehand; + + if (0 == keys(%$what_to_update) + or defined $what_to_update->{up_searches}) { + unless (&do_searches( $fh, $username, $twits{$username}, $what_to_update->{up_searches} )) { + $error++; + push @error_types, 'searches'; + } + } + next if $error > $errors_beforehand; + + if ( (0 == keys(%$what_to_update) + and time - $last_poll{$username}{friends} > $settings{friends_poll}) + or defined $what_to_update->{up_friends} ) { + my $show_friends; + if ($is_regular) { + my $time_before = time; + my ( $added, $removed ) = &get_friends($twits{$username}, $username, $fh, 1); + print $fh "t:debug %G$username%n Friends list updated: ", + "$added added, $removed removed\n" if $added + $removed; + print $fh "t:last_poll ac:$username poll_type:friends epoch:$time_before\n"; + $show_friends = $friends{$username}; + } else { + $show_friends = &get_friends($twits{$username}, $username, $fh, 0); + } + foreach ( sort keys %$show_friends ) { + print $fh "t:friend ac:$username nick:$_ epoch:$show_friends->{$_}\n"; + } + } + next if $error > $errors_beforehand; + + if ( (0 == keys(%$what_to_update) + and time - $last_poll{$username}{blocks} > $settings{blocks_poll} ) + or defined $what_to_update->{up_blocks}) { + my $show_blocks; + if ($is_regular) { + my $time_before = time; + my ( $added, $removed ) = &get_blocks($twits{$username}, $username, $fh, 1); + print $fh "t:debug %G$username%n Blocks list updated: ", + "$added added, $removed removed\n" if $added + $removed; + print $fh "t:last_poll ac:$username poll_type:blocks epoch:$time_before\n"; + $show_blocks = $blocks{$username}; + } else { + $show_blocks = &get_blocks($twits{$username}, $username, $fh, 0); + } + foreach ( sort keys %$show_blocks ) { + print $fh "t:block ac:$username nick:$_ epoch:$show_blocks->{$_}\n"; + } + } + next if $error > $errors_beforehand; + + if ( (0 == keys(%$what_to_update) + and time - $last_poll{$username}{lists} > $settings{lists_poll} ) + or defined $what_to_update->{up_lists}) { + my $list_account = $username; + my $list_name_limit; + if ($is_regular) { + my $time_before = time; + my ( $added, $removed ) = &get_lists($twits{$username}, $username, $fh, 1); + print $fh "t:debug %G$username%n Lists list updated: ", + "$added added, $removed removed\n" if $added or $removed; + print $fh "t:last_poll ac:$username poll_type:lists epoch:$time_before\n"; + } else { + if (defined $what_to_update->{up_lists} and ref $what_to_update->{up_lists} + and defined $what_to_update->{up_lists}->[0]) { + $list_account = &normalize_username($what_to_update->{up_lists}->[0], 1); + if (defined $what_to_update->{up_lists}->[1]) { + $list_name_limit = $what_to_update->{up_lists}->[1]; + } + } + if (not defined &get_lists($twits{$username}, $username, $fh, 0, @{ $what_to_update->{up_lists} })) { + &debug($fh, "%G$username%n Polling for lists failed."); + $error++; + push @error_types, 'lists'; + } + } + if (not defined $state{__lists}{$list_account}) { + ¬ice(['info', undef, $fh], "List owner $list_account does not exist or has no lists.") + if not $is_regular; + } elsif (defined $list_name_limit and not defined $state{__lists}{$list_account}{$list_name_limit}) { + ¬ice(['info', undef, $fh], "List $list_account/$list_name_limit does not exist.") + if not $is_regular; + } else { + foreach my $list_name (sort keys %{ $state{__lists}{$list_account} }) { + next if defined $list_name_limit and $list_name ne $list_name_limit; + my $list_id = $state{__lists}{$list_account}{$list_name}{id}; + foreach my $member ( @{ $state{__lists}{$list_account}{$list_name}{members} } ) { + print $fh "t:list ac:$username list:$list_account/$list_name id:$list_id nick:$member\n"; + } + } + } + } + next if $error > $errors_beforehand; + } + + &put_unshorten_urls($fh, $time_before_update); + + if ($error) { + ¬ice( [ 'error', undef, $fh ], "Update encountered errors (@error_types). Aborted"); + ¬ice( [ 'error', undef, $fh ], "For recurring DMs errors, please re-auth (delete $settings{oauth_store})") if grep { $_ eq 'dms' } @error_types; + } elsif ($is_regular) { + print $fh "t:last_poll poll_type:__poll epoch:$time_before_update\n"; + } +} + +sub is_ignored { + my $text = shift; + my $twit = shift; + + my $text_no_colors = &remove_colors($text); + foreach my $tag (@{ $settings{ignored_tags} }) { + return $tag if $text_no_colors =~ /(?:^|\b|\s)\Q$tag\E(?:\b|\s|$)/i; + } + if (defined $twit and grep { $_ eq lc $twit } @{ $settings{ignored_twits} }) { + return $twit; + } + return undef; +} + +sub remove_tags { + my $text = shift; + + foreach my $tag (@{ $settings{stripped_tags} }) { + $text =~ s/\cC\d{2}\Q$tag\E\cO//gi; # with then without colors + $text =~ s/(^|\b|\s)\Q$tag\E(\b|\s|$)/$1$2/gi; + } + return $text; +} + +sub get_tweets { + my ( $fh, $username, $obj, $cache ) = @_; + + return if &rate_limited($obj, $username, $fh); + + my %call_attribs = (); + $call_attribs{count} = 200; + $call_attribs{since_id} = $state{__last_id}{$username}{timeline} + if defined $state{__last_id}{$username}{timeline}; + + my $tweets = &scan_cursor('home_timeline', $obj, $username, $fh, + { fn=>'home_timeline', cp=>'p', args => \%call_attribs, + item_key=>'id_str', item_keys=>1 }); + + if (not defined $tweets) { + print $fh "t:error $username Error during home_timeline call: Aborted.\n"; + return; + } + $tweets = [ map { $tweets->{$_} } sort { cmp_id($b, $a) } keys %$tweets ]; + + print $fh "t:debug %G$username%n got ", scalar(@$tweets), ' tweets', + (@$tweets ? ', first/last: ' . join('/', + (sort {$a->{id} <=> $b->{id}} @$tweets)[0]->{id}, + (sort {$a->{id} <=> $b->{id}} @$tweets)[$#{$tweets}]->{id} + ) + : ''), + "\n"; + + my $new_poll_id = 0; + my @own_ids = (); + foreach my $t ( reverse @$tweets ) { + my $text = &get_text( $t, $obj ); + $text = &remove_tags($text); + my $ign = &is_ignored($text, $t->{user}{screen_name}); + $ign = (defined $ign ? 'ign:' . &encode_for_file($ign) . ' ' : ''); + my $reply = &tweet_or_reply($obj, $t, $username, $cache, $fh); + if ($t->{user}{screen_name} eq $username and not $settings{own_tweets}) { + push @own_ids, $t->{id}; + next; + } + printf $fh "t:%s id:%s ac:%s %s%snick:%s created_at:%s %s\n", + $reply, $t->{id}, $username, $ign, &get_reply_to($t), $t->{user}{screen_name}, + &encode_for_file($t->{created_at}), $text; + &get_unshorten_urls($text, $fh); + + $new_poll_id = $t->{id} if $new_poll_id < $t->{id}; + } + &debug($fh, "%G$username%n skip own " . join(', ', @own_ids) . "\n") if @own_ids; + printf $fh "t:last_id id:%s ac:%s id_type:timeline\n", $new_poll_id, $username if $new_poll_id; + + &debug($fh, "%G$username%n Polling for replies since " . $state{__last_id}{$username}{reply}); + eval { + if ( $state{__last_id}{$username}{reply} ) { + $tweets = $obj->replies( { since_id => $state{__last_id}{$username}{reply} } ) + || []; + } else { + $tweets = $obj->replies() || []; + } + }; + + if ($@) { + print $fh "t:debug %G$username%n Error during replies call. Aborted.\n"; + &debug($fh, "%G$username%n Error: " . $@); + return; + } + + $new_poll_id = 0; + foreach my $t ( reverse @$tweets ) { + next if exists $friends{$username}{ $t->{user}{screen_name} }; + + my $text = &get_text( $t, $obj ); + $new_poll_id = $t->{id} if $new_poll_id < $t->{id}; + $text = &remove_tags($text); + &get_unshorten_urls($text, $fh); + my $ign = &is_ignored($text); + $ign = (defined $ign ? 'ign:' . &encode_for_file($ign) . ' ' : ''); + printf $fh "t:tweet id:%s ac:%s %s%snick:%s created_at:%s %s\n", + $t->{id}, $username, $ign, &get_reply_to($t), $t->{user}{screen_name}, + &encode_for_file($t->{created_at}), $text; + } + printf $fh "t:last_id id:%s ac:%s id_type:reply\n", $new_poll_id, $username if $new_poll_id; + return 1; +} + + +sub do_dms { + my ( $fh, $username, $obj, $is_regular ) = @_; + + my $new_poll_id = 0; + + my $since_args = {}; + if ( $is_regular and $state{__last_id}{$username}{dm} ) { + $since_args->{since_id} = $state{__last_id}{$username}{dm}; + &debug($fh, "%G$username%n Polling for DMs since_id " . + $state{__last_id}{$username}{dm}); + } else { + &debug($fh, "%G$username%n Polling for DMs"); + } + + my $tweets; + eval { + $tweets = $obj->direct_messages($since_args) || []; + }; + if ($@) { + &debug($fh, "%G$username%n Error during direct_messages call. Aborted."); + &debug($fh, "%G$username%n Error: " . $@); + return; + } + &debug($fh, "%G$username%n got DMs: " . (0+@$tweets)); + + foreach my $t ( reverse @$tweets ) { + my $text = decode_entities( $t->{text} ); + $text =~ s/[\n\r]/ /g; + printf $fh "t:dm id:%s ac:%s %snick:%s created_at:%s %s\n", + $t->{id}, $username, &get_reply_to($t), $t->{sender_screen_name}, + &encode_for_file($t->{created_at}), $text; + $new_poll_id = $t->{id} if $new_poll_id < $t->{id}; + } + printf $fh "t:last_id id:%s ac:%s id_type:dm\n", $new_poll_id, $username if $new_poll_id; + return 1; +} + +sub do_subscriptions { + my ( $fh, $username, $obj, $search_limit ) = @_; + + &debug($fh, "%G$username%n Polling for subscriptions"); + if ( $obj->can('search') and $state{__last_id}{$username}{__search} ) { + my $search; + foreach my $topic ( sort keys %{ $state{__last_id}{$username}{__search} } ) { + next if defined $search_limit and @$search_limit and not grep { $topic eq $_ } @$search_limit; + print $fh "t:debug %G$username%n Search '$topic' id was ", + "$state{__last_id}{$username}{__search}{$topic}\n"; + eval { + $search = $obj->search( + { + q => $topic, + since_id => $state{__last_id}{$username}{__search}{$topic} eq '9223372036854775807' + ? 0 + : $state{__last_id}{$username}{__search}{$topic}, + } + ); + }; + + if ($@) { + print $fh + "t:debug %G$username%n Error during search($topic) call. Aborted.\n"; + &debug($fh, "%G$username%n Error: " . $@); + return; + } + + unless ( $search->{search_metadata}->{max_id} ) { + print $fh "t:debug %G$username%n Invalid search results when searching", + " for '$topic'. Aborted.\n"; + return; + } elsif ( $search->{search_metadata}->{max_id} eq '9223372036854775807' ) { + &debug($fh, "%G$username%n Error: search max_id = MAX_INT64"); + $state{__last_id}{$username}{__search}{$topic} = 0; + foreach my $t ( reverse @{ $search->{statuses} } ) { + $state{__last_id}{$username}{__search}{$topic} = $t->{id} + if cmp_id($t->{id}, $state{__last_id}{$username}{__search}{$topic}) > 0; + } + } else { + $state{__last_id}{$username}{__search}{$topic} = $search->{search_metadata}->{max_id}; + } + + printf $fh "t:searchid id:%s ac:%s topic:%s\n", + $state{__last_id}{$username}{__search}{$topic}, $username, &encode_for_file($topic); + + foreach my $t ( reverse @{ $search->{statuses} } ) { + next if exists $blocks{$username}{ $t->{user}->{screen_name} }; + my $text = &get_text( $t, $obj ); + $text = &remove_tags($text); + my $ign = &is_ignored($text, $t->{user}->{screen_name}); + &get_unshorten_urls($text, $fh); + $ign = (defined $ign ? 'ign:' . &encode_for_file($ign) . ' ' : ''); + printf $fh "t:search id:%s ac:%s %snick:%s topic:%s created_at:%s %s\n", + $t->{id}, $username, $ign, $t->{user}->{screen_name}, &encode_for_file($topic), + &encode_for_file($t->{created_at}), $text; + } + } + } + return 1; +} + +sub do_searches { + my ( $fh, $username, $obj, $search_limit ) = @_; + + &debug($fh, "%G$username%n Polling for one-time searches"); + if ( $obj->can('search') and exists $search_once{$username} ) { + my $search; + foreach my $topic ( sort keys %{ $search_once{$username} } ) { + next if defined $search_limit and @$search_limit and not grep { $topic eq $_ } @$search_limit; + my $max_results = $search_once{$username}->{$topic}; + + $topic = &make_utf8($topic); + + print $fh + "t:debug %G$username%n search $topic once (max $max_results)\n"; + eval { $search = $obj->search( { 'q' => $topic } ); }; + + if (my $err = $@) { + $err = $err->error . ' (' . $err->code . ' ' . $err->message . ')' if ref($err) eq 'Net::Twitter::Error'; + print $fh "t:debug %G$username%n Error during search_once($topic) call. Aborted.\n"; + &debug($fh, "%G$username%n Error: $err"); + return; + } + + unless ( $search->{search_metadata}->{max_id} ) { + print $fh "t:debug %G$username%n Invalid search results when searching once", + " for $topic. Aborted.\n"; + return; + } + + # TODO: consider applying ignore-settings to search results + my @results = (); + foreach my $res (@{ $search->{statuses} }) { + if (exists $blocks{$username}{ $res->{user}->{screen_name} }) { + print $fh "t:debug %G$username%n blocked $topic: $res->{user}->{screen_name}\n"; + next; + } + push @results, $res; + } + if ( $max_results > 0 ) { + splice @results, $max_results; + } + foreach my $t ( reverse @results ) { + my $text = &get_text( $t, $obj ); + $text = &remove_tags($text); + &get_unshorten_urls($text, $fh); + my $ign = &is_ignored($text, $t->{user}->{screen_name}); + $ign = (defined $ign ? 'ign:' . &encode_for_file($ign) . ' ' : ''); + printf $fh "t:search_once id:%s ac:%s %s%snick:%s topic:%s created_at:%s %s\n", + $t->{id}, $username, $ign, &get_reply_to($t), $t->{user}->{screen_name}, &encode_for_file($topic), + &encode_for_file($t->{created_at}), $text; + } + } + } + + return 1; +} + +sub get_timeline { + my ( $fh, $target, $username, $obj, $cache, $is_update ) = @_; + my $tweets; + my $last_id = $state{__last_id}{$username}{__extras}{$target} if $is_update; + + &debug($fh, "%G$username%n get_timeline $target" + . ($is_update ? "($fix_replies_index{$username} > $last_id)" : '')); + my $arg_ref = { id => $target, }; + if ($is_update) { + $arg_ref->{since_id} = $last_id if $last_id; + $arg_ref->{include_rts} = 1 if $settings{retweet_show}; + } elsif ($settings{limit_user_tweets} and $settings{limit_user_tweets} =~ /\b(\d+)\b/) { + $arg_ref->{count} = $1; + } + eval { + $tweets = $obj->user_timeline($arg_ref); + }; + + if ($@) { + print $fh "t:error $username user_timeline($target) call: Aborted.\n"; + print $fh "t:debug : $_\n" foreach split /\n/, Dumper($@); + return; + } + + unless ($tweets) { + print $fh "t:error $username user_timeline($target) call returned undef! Aborted\n"; + return 1; + } + + my $not_before = time - $1*86400 if not $is_update and $settings{limit_user_tweets} and $settings{limit_user_tweets} =~ /\b(\d+)d\b/; + foreach my $t ( reverse @$tweets ) { + next if defined $not_before and &date_to_epoch($t->{created_at}) < $not_before; + my $text = &get_text( $t, $obj ); + my $reply = &tweet_or_reply($obj, $t, $username, $cache, $fh); + printf $fh "t:%s id:%s ac:%s %snick:%s created_at:%s %s\n", + $reply, $t->{id}, $username, &get_reply_to($t), $t->{user}{screen_name}, + &encode_for_file($t->{created_at}), $text; + $last_id = $t->{id} if $last_id < $t->{id}; + &get_unshorten_urls($text, $fh); + } + if ($is_update) { + printf $fh "t:last_id_fixreplies id:%s ac:%s id_type:%s\n", + $last_id, $username, $target; + } + + return 1; +} + +sub encode_for_file { + my $datum = shift; + $datum =~ s/\t/%09/g; + $datum =~ s/ /%20/g; + return $datum; +} + +sub decode_from_file { + my $datum = shift; + $datum =~ s/%20/ /g; + $datum =~ s/%09/\t/g; + return $datum; +} + +sub date_to_epoch { + # parse created_at style date to epoch time + my $date = shift; + if (not @datetime_parser) { + foreach my $date_fmt ( + '%a %b %d %T %z %Y', # Fri Nov 05 10:14:05 +0000 2010 + '%a, %d %b %Y %T %z', # Fri, 05 Nov 2010 16:59:40 +0000 + ) { + my $parser = DateTime::Format::Strptime->new(pattern => $date_fmt); + if (not defined $parser) { + @datetime_parser = (); + return; + } + push @datetime_parser, $parser; + } + } + # my $orig_date = $date; + $date = $datetime_parser[index($date, ',') == -1 ? 0 : 1]->parse_datetime($date); + # &debug("date '$orig_date': " . ref($date)); + return if not defined $date; + return $date->epoch(); +} + +sub meta_to_line { + my $meta = shift; + my %line_attribs = ( + username => $meta->{username}, epoch => $meta->{created_at}, + type => $meta->{type}, account => $meta->{account}, + service => $meta->{service}, nick => $meta->{nick}, + hilight => 0, hi_nick => $meta->{nick}, + text => $meta->{text}, topic => $meta->{topic}, + level => MSGLEVEL_PUBLIC, + ); + + if ($meta->{type} eq 'dm' or $meta->{type} eq 'error' or $meta->{type} eq 'deerror') { + $line_attribs{level} = MSGLEVEL_MSGS; + } + + my $nick = "\@$meta->{account}"; + if ( $meta->{text} =~ /\Q$nick\E(?:\W|$)/i ) { + my $hilight_color = $irssi_to_mirc_colors{ $settings{hilight_color} }; + $line_attribs{level} |= MSGLEVEL_HILIGHT; + $line_attribs{hi_nick} = "\cC$hilight_color$meta->{nick}\cO"; + } + elsif ($settings{nick_color} eq 'rotate') { + my $c = get_nick_color($meta->{nick}); + $line_attribs{hi_nick} = "\cC$c$meta->{nick}\cO"; + } + + if (defined $meta->{ign}) { + $line_attribs{ignoring} = 1; + $line_attribs{marker} = '-' . $meta->{ign}; # must have a marker for tweet theme + + } elsif ( $meta->{type} ne 'dm' and $meta->{nick} and $meta->{id} and not $meta->{ign} ) { + ### not ignored, so we probably want it cached and create a :marker... + my $marker; + my $lc_nick = lc $meta->{nick}; + for (my $mark_idx = 0; + defined $state{__ids}{ $lc_nick } and $mark_idx < @{ $state{__ids}{ $lc_nick } }; + $mark_idx++) { + if ($state{__ids}{ $lc_nick }[$mark_idx] eq $meta->{id}) { + $marker = $mark_idx; + last; + } + } + if (not defined $marker) { + $marker = ( $state{__indexes}{ $lc_nick } + 1 ) % $settings{track_replies}; + $state{__ids} { $lc_nick }[$marker] = $meta->{id}; + $state{__indexes}{ $lc_nick } = $marker; + $state{__tweets} { $lc_nick }[$marker] = $meta->{text}; + foreach my $key (qw/username reply_to_id reply_to_user created_at/) { + # __usernames __reply_to_ids __reply_to_users __created_ats + $state{"__${key}s"}{ $lc_nick }[$marker] = $meta->{$key} if defined $meta->{$key}; + } + } + $line_attribs{marker} = ":$marker"; + } + return %line_attribs; +} + +sub cache_to_meta { + my $line = shift; + my $type = shift; + my %meta = ( type => $type ); + foreach my $key (@{ $_[0] }) { + if ($line =~ s/^$key:(\S+)\s*//) { + $key = 'account' if $key eq 'ac'; + $meta{$key} = $1; + $meta{$key} = &decode_from_file($meta{$key}); + if ($key eq 'account') { + $meta{username} = &normalize_username($meta{account}); # username is account@Service + $meta{account} =~ s/\@(\w+)$//; + $meta{service} = $1; + } elsif ($key eq 'created_at') { + $meta{created_at} = &date_to_epoch($meta{created_at}); + } + } + } + $meta{text} = $line; + return %meta; +} + +sub monitor_child { + my $args = shift; + + my $filename = $args->[0]; + my $attempts_to_go = $args->[1]; + my $wait_time = $args->[2]; + my $is_update = $args->[3]; + my $filename_tmp = $args->[4]; + my $prev_mtime = $args->[5]; + + my $file_progress = 'no ' . $filename_tmp; + my $this_mtime = $prev_mtime; + if (-f $filename_tmp) { + $this_mtime = (stat(_))[9]; + $file_progress = 'mtime=' . $this_mtime; + } + &debug("checking child log at $filename [$file_progress v $prev_mtime] ($attempts_to_go)"); + + # reap any random leftover processes - work around a bug in irssi on gentoo + waitpid( -1, WNOHANG ); + + # first time we run we don't want to print out *everything*, so we just + # pretend + + my @lines = (); + my %new_cache = (); + my %types_per_user = (); + my $got_errors = 0; + my %show_now = (); # for non-update info + + my $fh; + if ( -e $filename and open $fh, '<', $filename ) { + binmode $fh, ":" . &get_charset(); + } else { + # file not ready yet + + if ( $attempts_to_go > 0 ) { + Irssi::timeout_add_once( $wait_time, 'monitor_child', + [ $filename, $attempts_to_go - 1, $wait_time, $is_update, $filename_tmp, $this_mtime ] ); + } else { + &debug("Giving up on polling $filename"); + Irssi::pidwait_remove($child_pid); + waitpid( -1, WNOHANG ); + unlink $filename unless &debug(); + + if (not $is_update) { + ¬ice([ 'error' ], "Failed to get response. Giving up."); + return; + } + + $update_is_running = 0 if $is_update; + + return unless $settings{notify_timeouts}; + + my $since; + if ( time - $last_poll{__poll} < 24 * 60 * 60 ) { + my @time = localtime($last_poll{__poll}); + $since = sprintf( "%d:%02d", @time[ 2, 1 ] ); + } else { + $since = scalar localtime($last_poll{__poll}); + } + + if ( $failstatus < 2 and time - $last_poll{__poll} > 60 * 60 ) { + ¬ice([ 'error' ], + $settings{mini_whale} + ? 'FAIL WHALE' + : q{ v v v}, + q{ | | v | v}, + q{ | .-, | | |}, + q{ .--./ / | _.---.| }, + q{ '-. (__..-" \\}, + q{ \\ a |}, + q{ ',.__. ,__.-'/}, + q{ '--/_.'----'`} + ); + $failstatus = 2; + } + + if ( $failstatus == 0 and time - $last_poll{__poll} < 600 ) { + ¬ice([ 'error' ],"Haven't been able to get updated tweets since $since"); + $failstatus = 1; + } + } + + return; + } + + # make sure we're not in slurp mode + local $/ = "\n"; + while (<$fh>) { + unless (/\n$/) { # skip partial lines + &debug($fh, "Skipping partial line: $_"); + next; + } + chomp; + + my $type; + if (s/^t:(\w+)\s+//) { + $type = $1; + } else { + ¬ice(['error'], "invalid: $_"); + next; + } + + if ($type eq 'debug') { + &debug($_); + + } elsif ($type =~ /^(error|info|deerror)$/) { + $got_errors++ if $type eq 'error'; + ¬ice([$type], $_); + + } elsif ($type eq 'url') { + my %meta = &cache_to_meta($_, $type, [ qw/epoch https site uri/ ]); + $expanded_url{$meta{site}}{$meta{https} ? 1 : 0}{$meta{uri}} = { + url => $meta{text}, + epoch => $meta{epoch}, + }; + + } elsif ($type eq 'last_poll') { + my %meta = &cache_to_meta($_, $type, [ qw/ac poll_type epoch/ ]); + + if ( not defined $meta{ac} and $meta{poll_type} eq '__poll' ) { + $last_poll{$meta{poll_type}} = $meta{epoch}; + } elsif ( $meta{epoch} >= $last_poll{$meta{username}}{$meta{poll_type}} ) { + $last_poll{$meta{username}}{$meta{poll_type}} = $meta{epoch}; + &debug("%G$meta{username}%n $meta{poll_type} updated to $meta{epoch}"); + } else { + &debug("%G$meta{username}%n Impossible! $meta{poll_type}: " + . "new poll=$meta{epoch} < prev=$last_poll{$meta{username}}{$meta{poll_type}}!"); + $got_errors++; + } + + } elsif ($type eq 'fix_replies_index') { + my %meta = &cache_to_meta($_, $type, [ qw/idx ac topic id_type/ ]); + $fix_replies_index{ $meta{username} } = $meta{idx}; + &debug("%G$meta{username}%n fix_replies_index set to $meta{idx}"); + + } elsif ($type eq 'searchid' or $type eq 'last_id_fixreplies' or $type eq 'last_id') { + my %meta = &cache_to_meta($_, $type, [ qw/id ac topic id_type/ ]); + if ( $meta{type} eq 'searchid' ) { + &debug("%G$meta{username}%n Search '$meta{topic}' got id $meta{id}"); + if (not exists $state{__last_id}{ $meta{username} }{__search}{ $meta{topic} } + or $state{__last_id}{ $meta{username} }{__search}{ $meta{topic} } eq '9223372036854775807' + or cmp_id($meta{id}, $state{__last_id}{ $meta{username} }{__search}{ $meta{topic} }) > 0) { + $state{__last_id}{ $meta{username} }{__search}{ $meta{topic} } = $meta{id}; + } else { + &debug("%G$meta{username}%n Search '$meta{topic}' bad id $meta{id}"); + $got_errors++; + } + } elsif ( $meta{type} eq 'last_id') { + $state{__last_id}{ $meta{username} }{ $meta{id_type} } = $meta{id} + if cmp_id($meta{id}, $state{__last_id}{ $meta{username} }{ $meta{id_type} }) > 0; + } elsif ( $meta{type} eq 'last_id_fixreplies' ) { + $state{__last_id}{ $meta{username} }{__extras}{ $meta{id_type} } = $meta{id} + if cmp_id($meta{id}, $state{__last_id}{ $meta{username} }{__extras}{ $meta{id_type} }) > 0; + } + + } elsif ($type eq 'tweet' or $type eq 'dm' or $type eq 'reply' or $type eq 'search' or $type eq 'search_once') { # cf theme_register + my %meta = &cache_to_meta($_, $type, [ qw/id ac ign reply_to_user reply_to_id nick topic created_at/ ]); + + if (exists $new_cache{ $meta{id} }) { + &debug("SKIP newly-cached $meta{id}"); + next; + } + $new_cache{ $meta{id} } = time; + if (exists $tweet_cache{ $meta{id} }) { + # and (not $retweeted_id{$username} or not $retweeted_id{$username}{ $meta{id} }); + &debug("SKIP cached $meta{id}"); + next; + } + + my %line_attribs = &meta_to_line(\%meta); + push @lines, { %line_attribs }; + + if ( $meta{type} eq 'search' ) { + if ( exists $state{__last_id}{ $meta{username} }{__search}{ $meta{topic} } + and cmp_id($meta{id}, $state{__last_id}{ $meta{username} }{__search}{ $meta{topic} }) > 0) { + $state{__last_id}{ $meta{username} }{__search}{ $meta{topic} } = $meta{id}; + } + } elsif ( $meta{type} eq 'search_once' ) { + delete $search_once{ $meta{username} }->{ $meta{topic} }; + } + + } elsif ($type eq 'friend' or $type eq 'block' or $type eq 'list') { + my %meta = &cache_to_meta($_, $type, [ qw/ac list id nick epoch/ ]); + if ($is_update and not defined $types_per_user{$meta{username}}{$meta{type}}) { + if ($meta{type} eq 'friend') { + $friends{$meta{username}} = (); + } elsif ($meta{type} eq 'block') { + $blocks{$meta{username}} = (); + } elsif ($meta{type} eq 'list') { + my ($list_account, $list_name) = split '/', $meta{list}; + $state{__lists}{$list_account} = {}; + } + $types_per_user{$meta{username}}{$meta{type}} = 1; + } + if ($meta{type} eq 'friend') { + $nicks{$meta{nick}} = $friends{$meta{username}}{$meta{nick}} = $meta{epoch}; + } elsif ($meta{type} eq 'block') { + $blocks{$meta{username}}{$meta{nick}} = $meta{epoch}; + } elsif ($meta{type} eq 'list') { + my ($list_account, $list_name) = split '/', $meta{list}; + if (not exists $state{__lists}{$list_account}{$list_name}) { + $state{__lists}{$list_account}{$list_name} = { id=>$meta{id}, members=>[] }; + } + $show_now{lists}{$list_account}{$list_name} = $meta{id} if not $is_update; + push @{ $state{__lists}{$list_account}{$list_name}{members} }, $meta{nick}; + } + + } else { + ¬ice(['error'], "invalid type ($type): $_"); + } + } + + # file was opened, so we tried to parse... + close $fh; + + # make sure the pid is removed from the waitpid list + Irssi::pidwait_remove($child_pid); + + # and that we don't leave any zombies behind, somehow + waitpid( -1, WNOHANG ); + + &debug("new last_poll = $last_poll{__poll}", + "new last_poll_id = " . Dumper( $state{__last_id} )) if $is_update; + if ($is_update and $first_call and not $settings{force_first}) { + &debug("First call, not printing updates"); + } else { + + if (exists $show_now{lists}) { + for my $list_account (keys %{ $show_now{lists} }) { + my $list_ac = ($list_account eq "$user\@$defservice" ? '' : "$list_account/"); + for my $list_name (keys %{ $show_now{lists}{$list_account} }) { + if (0 == @{ $state{__lists}{$list_account}{$list_name}{members} }) { + ¬ice(['info'], "List $list_ac$list_name is empty."); + } else { + ¬ice("List $list_ac$list_name members: " . + join(', ', @{ $state{__lists}{$list_account}{$list_name}{members} })); + } + } + } + } + + &write_lines(\@lines, $is_update); + } + + unlink $filename or warn "Failed to remove $filename: $!" unless &debug(); + + # commit the pending cache lines to the actual cache, now that + # we've printed our output + for my $updated_id (keys %new_cache) { + $tweet_cache{$updated_id} = $new_cache{$updated_id}; + } + + # keep enough cached tweets, to make sure we don't show duplicates + for my $loop_id ( keys %tweet_cache ) { + next if $tweet_cache{$loop_id} >= $last_poll{__poll} - 3600; + delete $tweet_cache{$loop_id}; + } + + if (not $got_errors) { + &save_state(); + } + + if ($is_update) { + if ($failstatus and not $got_errors) { + ¬ice([ 'deerror' ], "Update succeeded."); + $failstatus = 0; + } + $first_call = 0; + $update_is_running = 0; + } +} + +sub cmp_id { + my $id1 = shift; + my $id2 = shift; + return -1 if length $id1 < length $id2; + return 1 if length $id1 > length $id2; + return $id1 cmp $id2; +} + +sub write_lines { + my $lines_ref = shift; + my $is_update = shift; + my $ymd_color = $irssi_to_mirc_colors{ $settings{ymd_color} }; + my @date_now = localtime(); + my $ymd_now = sprintf('%04d-%02d-%02d', $date_now[5]+1900, $date_now[4]+1, $date_now[3]); + my $old_tf; + # &debug("line: " . Dumper $lines_ref); + foreach my $line (@$lines_ref) { + my $line_want_extras = $is_update; + my $win_name = &window( $line->{type}, $line->{username}, $line->{nick}, $line->{topic} ); + my $ac_tag = ''; + if ( lc $line->{service} ne lc $settings{default_service} ) { + $ac_tag = "$line->{username}: "; + } elsif ( $line->{username} ne "$user\@$defservice" + and lc $line->{account} ne lc $win_name ) { + $ac_tag = $line->{account} . ': '; + } + + my @print_opts = ( + $line->{level}, + "twirssi_" . $line->{type}, # theme + $ac_tag, + ); + push @print_opts, (lc $line->{topic} ne lc $win_name ? $line->{topic} . ':' : '') + if $line->{type} =~ /search/; + push @print_opts, $line->{hi_nick} if $line->{type} ne 'error' and $line->{type} ne 'deerror'; + push @print_opts, $line->{marker} if defined $line->{marker}; + + # set timestamp + my @date = localtime($line->{epoch}); + my $ymd = sprintf('%04d-%02d-%02d', $date[5]+1900, $date[4]+1, $date[3]); + my $ymd_suffix = ''; + if (defined $line->{ignoring}) { + next if not $settings{debug}; + $line->{text} = "\cC$irssi_to_mirc_colors{'%b'}IGNORED\cO " . $line->{text}; + if ($settings{debug_win_name} ne '' ) { + $win_name = $settings{debug_win_name}; + } else { + $win_name = '(status)'; + $line->{text} = "%g[$IRSSI{name}] %n " . $line->{text}; + } + $line_want_extras = 0; + } elsif (not $is_update) { + $ymd_suffix = " \cC$ymd_color$ymd\cO" if $ymd_now ne $ymd; + } elsif (not defined $last_ymd{wins}{$win_name} + or $last_ymd{wins}{$win_name}->{ymd} ne $ymd) { + Irssi::window_find_name($win_name)->printformat(MSGLEVEL_PUBLIC, 'twirssi_new_day', $ymd, ''); + $last_ymd{wins}{$win_name}->{ymd} = $ymd; + } + my $ts = DateTime->from_epoch( epoch => $line->{epoch}, time_zone => $local_tz + )->strftime($settings{timestamp_format}); + if (not defined $old_tf) { + $old_tf = Irssi::settings_get_str('timestamp_format'); + } + $line->{text} = &post_process_tweet($line->{text}); + Irssi::command("^set timestamp_format $ts"); + Irssi::window_find_name($win_name)->printformat( + @print_opts, &hilight( $line->{text} ) . $ymd_suffix + ); + if ($line_want_extras) { + &write_log($line, $win_name, \@date); + &write_channels($line, \@date); + } + } + # recall timestamp format + if (defined $old_tf) { + Irssi::command("^set timestamp_format $old_tf"); + &debug((0+@$lines_ref) . " lines, pre-ts: " . $old_tf); + } +} + +sub write_channels { + my $line = shift; + my $date_ref = shift; + my %msg_seen; + for my $type ($line->{type}, 'sender', '*') { + next unless defined $state{__channels}{$type}; + for my $tag (($type eq 'sender' ? $line->{nick} + : ($line->{type} =~ /search/ ? $line->{topic} + : $line->{username})), + '*') { + next unless defined $state{__channels}{$type}{$tag}; + for my $net_tag (keys %{ $state{__channels}{$type}{$tag} }) { + for my $channame (@{ $state{__channels}{$type}{$tag}{$net_tag} }) { + next if defined $msg_seen{$net_tag}{$channame}; + my $server = Irssi::server_find_tag($net_tag); + $last_ymd{chans}{$channame} = {} if not defined $last_ymd{chans}{$channame}; + for my $log_line (&log_format($line, $channame, $last_ymd{chans}{$channame}, $date_ref)) { + if (defined $server) { + $server->command("msg -$net_tag $channame $log_line"); + $msg_seen{$net_tag}{$channame} = 1; + } else { + ¬ice("no server for $net_tag/$channame: $log_line"); + } + } + } + } + } + } +} + +sub write_log { + my $line = shift; + my $win_name = shift; + my $date_ref = shift; + return unless my $logfile_obj = &ensure_logfile($win_name); + my $fh = $logfile_obj->{fh}; + for my $log_line (&log_format($line, $logfile_obj->{filename}, $logfile_obj, $date_ref, 1)) { + print $fh $log_line, "\n"; + } +} + +sub log_format { + my $line = shift; + my $target_name = shift; + my $ymd_obj = shift; # can be $last_ymd{chans}{$chan} or $logfile_obj (both need to have ->{ymd}) + my $date_ref = shift; + my $to_file = shift; + + my @logs = (); + + my $ymd = sprintf('%04d-%02d-%02d', $date_ref->[5]+1900, $date_ref->[4]+1, $date_ref->[3]); + if ($ymd_obj->{ymd} ne $ymd) { + push @logs, "Day changed to $ymd" if $ymd ne ''; + $ymd_obj->{ymd} = $ymd; + } + + my $out = ''; + $out .= sprintf('%02d:%02d:%02d ', $date_ref->[2], $date_ref->[1], $date_ref->[0]) if $to_file; + if ( $line->{type} eq 'dm' ) { + $out .= 'DM @' . $line->{hi_nick} . ':'; + } elsif ( $line->{type} eq 'search' or $line->{type} eq 'search_once' ) { + $out .= '[' . ($target_name =~ /$line->{topic}/ ? '' : "$line->{topic}:") + . '@' . $line->{hi_nick} . ']'; + } elsif ( $line->{type} eq 'tweet' or $line->{type} eq 'reply' ) { + $out .= '<' . ($target_name =~ /$line->{account}/ ? '' : "$line->{account}:") + . '@' . $line->{hi_nick} . '>'; + } else { + $out .= 'ERR:'; + } + push @logs, $out . ' ' . ($to_file ? &remove_colors($line->{text}) : $line->{text}); + return @logs; +} + +sub remove_colors { + my $txt = shift; + $txt =~ s/\cC\d{2}(.*?)\cO/$1/g; + return $txt; +} + +sub save_state { + # save state hash + if ( keys %state and my $file = $settings{replies_store} ) { + if ( open my $fh, '>', $file ) { + print $fh JSON::Any->objToJson( \%state ); + close $fh; + } else { + ¬ice([ 'error' ],"Failed to write state to $file: $!"); + } + } + # save id hash + if ( my $file = $settings{id_store} ) { + if ( open my $fh, '>', $file ) { + print $fh JSON::Any->objToJson( \%tweet_cache ); + close $fh; + } else { + ¬ice([ 'error' ],"Failed to write IDs to $file: $!"); + } + } +} + +sub save_polls { + # save last_poll hash + if ( keys %last_poll and my $file = $settings{poll_store} ) { + if ( open my $fh, '>', $file ) { + print $fh JSON::Any->objToJson( \%last_poll ); + close $fh; + } else { + ¬ice([ 'error' ], "Failed to write polls to $file: $!"); + } + } +} + +sub debug { + return if not $settings{debug}; + my $fh; + $fh = shift if ref($_[0]) eq 'GLOB'; + while (@_) { + my $line = shift; + next if not defined $line; + chomp $line; + for my $sub_line (split("\n", $line)) { + next if $sub_line eq ''; + if ($fh) { + print $fh 't:debug +', substr(time, -3), ' ', $sub_line, "\n"; + } elsif ($settings{debug_win_name} ne '') { + my $dbg_win = $settings{debug_win_name}; + $dbg_win = $settings{window} if not &ensure_window($dbg_win); + Irssi::window_find_name($dbg_win)->print( + $sub_line, MSGLEVEL_PUBLIC ); + } else { + print "[$IRSSI{name}] ", $sub_line; + } + } + } + return 1; +} + +sub notice { + my ( $type, $tag, $fh, $theme ); + if ( ref $_[0] ) { + ( $type, $tag, $fh ) = @{ shift @_ }; + $theme = 'twirssi_' . $type; + } + foreach my $msg (@_) { + if (defined $fh) { + for my $sub_line (split("\n", $msg)) { + print $fh "t:$type ", $sub_line, "\n" if $sub_line ne ''; + } + } else { + my $col = '%G'; + my $win_level = MSGLEVEL_PUBLIC; + my $win; + if ($tag eq '_tw_in_Win') { + $win = Irssi::active_win(); + } elsif ($type eq 'crap') { + $win = Irssi::window_find_name(&window()); + $col = '%R'; + $win_level = MSGLEVEL_CLIENTCRAP; + } else { + $win = Irssi::window_find_name(&window( $type, $tag )); + } + + if ($type =~ /^(error|info|deerror)$/) { + $win->printformat(MSGLEVEL_PUBLIC, $theme, $msg); # theme + } else { + $win->print("${col}***%n $msg", $win_level ); + } + } + } +} + +sub update_away { + my $data = shift; + + if ( $data !~ /\@\w/ and $data !~ /^[dD] / ) { + my $server = Irssi::server_find_tag( $settings{bitlbee_server} ); + if ($server) { + $server->send_raw("away :$data"); + return 1; + } else { + ¬ice([ 'error' ], "Can't find bitlbee server.", + "Update bitlbee_server or disable tweet_to_away" ); + return 0; + } + } + + return 0; +} + +sub too_long { + my $data = shift; + my $alert_to = shift; + + if ( length $data > 140 ) { + ¬ice( $alert_to, + "Tweet too long (" . length($data) . " characters) - aborted" ) + if defined $alert_to; + return 1; + } + + return 0; +} + +sub make_utf8 { + my $data = shift; + if ( !utf8::is_utf8($data) ) { + return decode &get_charset(), $data; + } else { + return $data; + } +} + +sub valid_username { + my $username = shift; + + $username = &normalize_username($username); + + unless ( exists $twits{$username} ) { + ¬ice( ["error", $username], "Unknown username $username" ); + return; + } + + return $username; +} + +sub logged_in { + my $obj = shift; + unless ($obj) { + ¬ice( ["error"], + "Not logged in! Use /twitter_login username" ); + return 0; + } + + return 1; +} + +sub sig_complete { + my ( $complist, $window, $word, $linestart, $want_space ) = @_; + + my $cmdchars = quotemeta Irssi::settings_get_str('cmdchars'); + my $comp_type = ''; + my $keep_at = 0; + my $lc_stag = ''; + + my $cmd = ''; + my @args = (); + my $want_account = 0; + if ($linestart =~ m@^ [$cmdchars] (\S+?)(_as)? ((?: \s+ \S+ )*) \s* $@xi) { + $cmd = lc $1; + my $cmd_as = $2; + my $args = $3; + $args =~ s/^\s+//; + @args = split(/\s+/, $args); + if ($cmd_as) { + if (@args) { + # act as if "_as ac" is not there + shift @args; + } elsif ($cmd =~ /^(?:twitter|twirssi|tweet|dm|retweet)/) { + $want_account = 1; + } + } + } + + if (not @args) { + if ($want_account or grep { $cmd eq $_ } @{ $completion_types{'account'} }) { + # '*_as' and 'account' types expect account as first arg + $word =~ s/^@//; + @$complist = grep /^\Q$word/i, map { s/\@.*// and $_ } keys %twits; + return; + } + if (grep { $cmd eq $_ } @{ $completion_types{'tweet'} }) { + # 'tweet' expects nick:num (we offer last num for each nick) + $word =~ s/^@//; + @$complist = map { "$_:$state{__indexes}{lc $_}" } + sort { $nicks{$b} <=> $nicks{$a} } + grep /^\Q$word/i, keys %{ $state{__indexes} }; + return; + } + if (grep { $cmd eq $_ } @{ $completion_types{'nick'} }) { + # 'nick' expects a nick + $comp_type = 'nick'; + } + } + + # retweet_to non-first args + if ($cmd eq 'retweet_to') { + if (@args == 1) { + @$complist = grep /^\Q$word/i, map { "-$_->{tag}" } Irssi::servers(); + return; + } elsif (@args == 2) { + @$complist = grep /^\Q$word/i, qw/ -channel -nick /; + return; + } elsif (@args == 3 and $args[2] =~ m{^ -(channel|nick) $}x) { + $lc_stag = lc $args[1]; + $lc_stag = substr($lc_stag, 1) if substr($lc_stag, 0, 1) eq '-'; + $comp_type = $1; + } + } + + # twirssi_set_window twirssi_set_channel + if ($cmd eq 'twirssi_set_window' or $cmd eq 'twirssi_set_channel') { + my $set_type = substr($cmd, 12); + if (@args == 0) { + @$complist = grep /^\Q$word/i, @{ $valid_types{$set_type} }; + return; + } elsif (@args == 1) { + $comp_type = 'nick'; + } elsif (@args == 2) { + if ($set_type eq 'window') { + @$complist = map { $_->{name} || $_->{active}->{name} } + grep { my $n = $_->{name} || $_->{active}->{name}; $n =~ /^\Q$word\E/i } Irssi::windows(); + return; + } elsif ($set_type eq 'channel') { + $comp_type = $set_type; + } + } + } + + # anywhere in line... + if (not $comp_type and grep { $cmd eq $_ } @{ $completion_types{'re_nick'} }) { + # 're_nick' can have @nick anywhere + $comp_type = 'nick'; + $keep_at = 1; + } + + if ($comp_type eq 'channel') { + @$complist = map { $_->{name} } + grep { $_->{name} =~ /^\Q$word\E/i and ($lc_stag eq '' or lc($_->{server}->{tag}) eq $lc_stag) } + Irssi::channels(); + return; + } elsif ($comp_type eq 'nick') { + my $prefix = $1 if $word =~ s/^(@)//; + @$complist = map { ($prefix and $keep_at) ? "$prefix$_" : $_ } + grep /^\Q$word/i, sort { $nicks{$b} <=> $nicks{$a} } keys %nicks; + return; + } +} + +sub event_send_text { + my ( $line, $server, $win ) = @_; + my $awin = Irssi::active_win(); + + # if the window where we got our text was the twitter window, and the user + # wants to be lazy, tweet away! + my $acc = &window_to_account( $awin->get_active_name() ); + if ( $acc and $settings{window_input} ) { + &cmd_tweet_as( "$acc $line", $server, $win ); + } +} + +sub event_setup_changed { + my $do_add = shift; # first run, want to add, too + my @changed_stgs = (); + + foreach my $setting (@settings_defn) { + my $setting_changed = 0; + my $stg_type .= '_' . ($setting->[2] eq 'b' ? 'bool' + : $setting->[2] eq 'i' ? 'int' + : $setting->[2] eq 's' ? 'str' : ''); + if ($stg_type eq '_') { + if ($do_add) { + print "ERROR: Bad opt '$setting->[2]' for $setting->[0]"; + } else { + ¬ice( ["error"], "Bad opt '$setting->[2]' for $setting->[0]" ); + } + next; + } + + my $stg_type_fn; + if ($do_add) { + $stg_type_fn = 'Irssi::settings_add' . $stg_type; # settings_add_str, settings_add_int, settings_add_bool + no strict 'refs'; + $settings{ $setting->[0] } = &$stg_type_fn( $IRSSI{name}, $setting->[1], $setting->[3] ); + } + + my $prev_stg; + { + $prev_stg = $settings{ $setting->[0] }; + $stg_type_fn = 'Irssi::settings_get' . $stg_type; # settings_get_str, settings_get_int, settings_get_bool + no strict 'refs'; + $settings{ $setting->[0] } = &$stg_type_fn( $setting->[1] ); + } + if ($setting->[2] eq 's') { + my $pre_proc = $setting->[4]; + my $trim = 1; + my $norm_user = 0; + my $is_list = 0; + while (defined $pre_proc and $pre_proc ne '') { + if ($pre_proc =~ s/^lc(?:,|$)//) { + $settings{$setting->[0]} = lc $settings{$setting->[0]}; + } elsif ($pre_proc =~ s/^list{(.)}(?:,|$)//) { + my $re = $1; + $re = qr/\s*$re\s*/ if $trim; + if ($settings{$setting->[0]} eq '') { + $settings{$setting->[0]} = [ ]; + } else { + $settings{$setting->[0]} = [ split($re, $settings{$setting->[0]}) ]; + if (grep { $_ eq $setting->[0] } ('passwords')) { + # ends '\', unescape separator: concatenate with next + for (my $i = 0; $i+1 < @{ $settings{$setting->[0]} }; $i++) { + while ( $settings{$setting->[0]}->[$i] =~ /\\$/ ) { + $settings{$setting->[0]}->[$i] .= "," . delete $settings{$setting->[0]}->[$i+1]; + } + } + } + } + $is_list = 1; + } elsif ($pre_proc =~ s/^norm_user(?:,|$)//) { + $norm_user = 1; + } elsif ($do_add) { + print "ERROR: Bad opt pre-proc '$pre_proc' for $setting->[0]"; + } else { + ¬ice( ["error"], "Bad opt pre-proc '$pre_proc' for $setting->[0]" ); + } + if ($norm_user) { + my @normed = (); + for my $to_norm ($is_list ? @{ $settings{$setting->[0]} } : $settings{$setting->[0]} ) { + next if $to_norm eq ''; + &debug($setting->[0] . ' to_norm {' . $to_norm . '}'); + push @normed, &normalize_username($to_norm, 1); + } + $is_list = 1; + $settings{$setting->[0]} = ($is_list ? \@normed : $normed[0]); + } + } + if (Dumper($prev_stg) ne Dumper($settings{ $setting->[0] })) { + $setting_changed = 1; + } + } elsif ($prev_stg != $settings{ $setting->[0] }) { + $setting_changed = 1; + } + push @changed_stgs, $setting->[0] if $setting_changed and not $do_add; + if ($setting_changed or $do_add) { + if ($setting->[0] eq 'poll_interval' + or $setting->[0] eq 'poll_schedule' ) { + &ensure_updates(); + } + } + } + &debug('changed settings: ' . join(', ', @changed_stgs)) if @changed_stgs; + + &ensure_logfile($settings{window}); + + if ($do_add or grep 'url_unshorten', @changed_stgs) { + # want to load this in the parent to allow child to use it expediently + &load_ua(); + } + &debug("Settings changed ($do_add):" . Dumper \%settings); +} + +sub ensure_logfile() { + my $win_name = shift; + return unless $settings{logging}; + my $new_logfile = Irssi::settings_get_str('autolog_path'); + return if $new_logfile eq ''; + $new_logfile =~ s/^~/$ENV{HOME}/; + $new_logfile = strftime($new_logfile, localtime()); + $new_logfile =~ s/\$(tag\b|\{tag\})/$IRSSI{name}/g; + if ($new_logfile !~ s/\$(0\b|\{0\})/$win_name/g) { + # not per-window logging, so use default window name as key + $win_name = $settings{window}; + } + return $logfile{$win_name} if defined $logfile{$win_name} and $new_logfile eq $logfile{$win_name}->{filename}; + return if not &ensure_dir_for($new_logfile); + my $old_umask = umask(0177); + &debug("Logging to $new_logfile"); + my $res; + if ( my $fh = FileHandle->new( $new_logfile, '>>' ) ) { + umask($old_umask); + binmode $fh, ':utf8'; + $fh->autoflush(1); + $res = $logfile{$win_name} = { + 'fh' => $fh, + 'filename' => $new_logfile, + 'ymd' => '', + }; + } else { + ¬ice( ["error"], "Failed to append to $new_logfile: $!" ); + } + umask($old_umask); + return $res; +} + +sub ensure_dir_for { + my $path = shift; + if (not $path =~ s@/[^/]+$@@) { + &debug("Cannot cd up $path"); + return; + } + return 1 if $path eq '' or -d $path or $path eq '/'; + return if not &ensure_dir_for($path); + if (not mkdir($path, 0700)) { + &debug("Cannot make $path: $!"); + return; + } + return 1; +} + +sub get_poll_time { + my $poll = $settings{poll_interval}; + + my $hhmm; + foreach my $tuple ( @{ $settings{poll_schedule} } ) { + if ( $tuple =~ /^(\d{4})-(\d{4}):(\d+)$/ ) { + $hhmm = sprintf('%02d%02d', (localtime())[2,1]) if not defined $hhmm; + my($range_from, $range_to, $poll_val) = ($1, $2, $3); + if ( ( $hhmm ge $range_from and $hhmm lt $range_to ) + or ( $range_from gt $range_to + and ( $hhmm ge $range_from or $hhmm lt $range_to ) ) + ) { + $poll = $poll_val; + } + } + } + return $poll if $poll >= 60; + return 60; +} + +sub get_charset { + my $charset = $settings{charset}; + return "utf8" if $charset =~ /^\s*$/; + return $charset; +} + +my @available_nick_colors =( + 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, + '0,2', '0,3', '0,5', '0,6', + '1,0', '1,3', '1,5', '1,6', '1,7', '1,10', '1,15', + '2,3', '2,7', '2,10', '2,15', + '3,2', '3,5', '3,10', + '4,2', '4,7', + '5,2', '5,3', '5,7', '5,10', '5,15', + '6,2', '6,7', '6,10', '6,15', + '8,2', '8,5', '8,6', + '9,2', '9,5', '9,6', + '10,2', '10,5', '10,6', + '11,2', '11,5', '11,6', + '12,2', '12,5', + '13,2', '13,15', + '14,2', '14,5', '14,6', + '15,2', '15,5', '15,6' +); +my %nick_colors; + +sub get_nick_color { + if ($settings{nick_color} eq 'rotate') { + my $nick = shift; + + if (!defined $nick_colors{$nick}) { + my @chars = split //, lc $nick; + my $value = 0; + foreach my $char (@chars) { + $value += ord $char; + } + $nick_colors{$nick} = $available_nick_colors[$value % @available_nick_colors]; + } + return $nick_colors{$nick}; + } else { + return $irssi_to_mirc_colors{$settings{nick_color}}; + } +} + +sub hilight { + my $text = shift; + + if ( $settings{nick_color} ) { + $text =~ s[(^|\W)\@(\w+)] { + my $c = get_nick_color($2); + qq[$1\cC$c\@$2\cO]; + }eg; + } + if ( $settings{topic_color} ) { + my $c = $settings{topic_color}; + $c = $irssi_to_mirc_colors{$c}; + $text =~ s/(^|\W)(\#|\!)([-\w]+)/$1\cC$c$2$3\cO/g if $c; + } + $text =~ s/[\n\r]/ /g; + + return $text; +} + +sub shorten { + my $data = shift; + + my $provider = $settings{url_provider}; + if ( ( $settings{always_shorten} or &too_long($data) ) and $provider ) { + my @args; + if ( $provider eq 'Bitly' ) { + @args[ 1, 2 ] = split ',', $settings{url_args}, 2; + unless ( @args == 3 ) { + ¬ice([ 'crap' ], + "WWW::Shorten::Bitly requires a username and API key.", + "Set short_url_args to username,API_key or change your", + "short_url_provider." + ); + return &make_utf8($data); + } + } + + foreach my $url ( $data =~ /(https?:\/\/\S+[\w\/])/g ) { + eval { + $args[0] = $url; + my $short = makeashorterlink(@args); + if ($short) { + $data =~ s/\Q$url/$short/g; + } else { + ¬ice( ["error"], "Failed to shorten $url!" ); + } + }; + } + } + + return &make_utf8($data); +} + + +sub load_ua { + return if defined $ua or not @{ $settings{url_unshorten} }; + ¬ice("Loading LWP and ua..."); + eval "use LWP;"; + $ua = LWP::UserAgent->new( + env_proxy => 1, + timeout => 10, + agent => "$IRSSI{name}/$VERSION", + requests_redirectable => [], + ); +} + + +sub is_url_from_shortener { + my $url = shift; + return unless @{ $settings{url_unshorten} } + and $url =~ s@^https?://([\w.]+)/.*@lc $1@e; + return grep { $url eq $_ } @{ $settings{url_unshorten} }; +} + + +sub get_url_parts { + my $url = shift; + my @parts = ($url =~ m@^(https?)://([^/]+)/(.+)@i); + $parts[0] = lc $parts[0]; + $parts[1] = lc $parts[1]; + return @parts; +} + + +sub get_unshorten_urls { + my $text = shift; + my $fh = shift; + return unless @{ $settings{url_unshorten} }; + foreach my $url ( $text =~ m@\b(https?://\S+[\w/])@g ) { + my @orig_url_parts; + my @url_parts; + my $new_url = $url; + my $max_redir = 4; + my $resp; + while ($max_redir-- > 0 + and @url_parts = &get_url_parts($new_url) + and grep { $url_parts[1] eq $_ } @{ $settings{url_unshorten} } + and not defined $expanded_url{$url_parts[1]}{$url_parts[0] eq 'https' ? 1 : 0}{$url_parts[2]} + and $resp = $ua->head($new_url) + and (defined $resp->header('Location') + or (&debug($fh, "cut_short $new_url => " . $resp->header('Host')) and 0) + )) { + &debug($fh, "deshort $new_url => " . $resp->header('Location')); + @orig_url_parts = @url_parts if not @orig_url_parts; + $new_url = $resp->header('Location'); + } + if (@orig_url_parts) { + $expanded_url{$orig_url_parts[1]}{$orig_url_parts[0] eq 'https' ? 1 : 0}{$orig_url_parts[2]} = { + url => $new_url, + epoch => time, + }; + } + } +} + + +sub put_unshorten_urls { + my $fh = shift; + my $epoch = shift; + for my $site (keys %expanded_url) { + for my $https (keys %{ $expanded_url{$site} }) { + for my $uri (keys %{ $expanded_url{$site}{$https} }) { + next if $expanded_url{$site}{$https}{$uri}{epoch} < $epoch; + print $fh "t:url epoch:$expanded_url{$site}{$https}{$uri}{epoch} ", + ($https ? 'https:1 ' : ''), + "site:$site uri:$uri $expanded_url{$site}{$https}{$uri}{url}\n"; + } + } + } +} + + +sub post_process_tweet { + my $data = shift; + my $skip_unshorten = shift; + if (@{ $settings{url_unshorten} } and not $skip_unshorten) { + for my $site (keys %expanded_url) { + for my $https (keys %{ $expanded_url{$site} }) { + my $url = ($https ? 'https' : 'http') . '://' . $site . '/'; + next if -1 == index($data, $url); + for my $uri (keys %{ $expanded_url{$site}{$https} }) { + $data =~ s/\Q$url$uri\E/$& \cC$irssi_to_mirc_colors{$settings{unshorten_color}}<$expanded_url{$site}{$https}{$uri}{url}>\cO/g; + } + } + } + } + return &make_utf8($data); +} + + +sub normalize_username { + my $user = shift; + my $non_login = shift; + return '' if $user eq ''; + + my ( $username, $service ) = split /\@/, lc($user), 2; + if ($service) { + $service = ucfirst $service; + } else { + $service = ucfirst lc $settings{default_service}; + unless ( $non_login or exists $twits{"$username\@$service"} ) { + $service = undef; + foreach my $t ( sort keys %twits ) { + next unless $t =~ /^\Q$username\E\@(Twitter|Identica)/; + $service = $1; + last; + } + + unless ($service) { + ¬ice( ["error"], "Can't find a logged in user '$user'" ); + return "$username\@$settings{default_service}"; + } + } + } + + return "$username\@$service"; +} + +sub get_text { + my $tweet = shift; + my $object = shift; + my $text = decode_entities( $tweet->{text} ); + if ( exists $tweet->{retweeted_status} ) { + $text = &format_expand(fmt => $settings{retweeted_format} || $settings{retweet_format}, + nick => $tweet->{retweeted_status}{user}{screen_name}, data => '', + tweet => decode_entities( $tweet->{retweeted_status}{text} )); + } elsif ( $tweet->{truncated} and $object->isa('Net::Twitter') ) { + $text .= " -- http://twitter.com/$tweet->{user}{screen_name}" + . "/status/$tweet->{id}"; + } + + $text =~ s/[\n\r]/ /g; + + return $text; +} + +sub window { + my $type = shift || "default"; + my $uname = shift || "default"; + my $sname = lc(shift); + my $topic = lc(shift || ''); + + $type = "search" if $type eq 'search_once'; + $type = "error" if $type eq 'deerror'; + + my $win; + my @all_priorities = qw/ account sender list /; + my @win_priorities = split ',', $settings{window_priority}; + my $done_rest = 0; + while (@win_priorities and not defined $win) { + my $win_priority = shift @win_priorities; + if ($win_priority eq 'account') { + for my $type_iter ($type, 'default') { + next unless exists $state{__windows}{$type_iter}; + $win = + $state{__windows}{$type_iter}{$uname} + || $state{__windows}{$type_iter}{$topic} + || $state{__windows}{$type_iter}{$user} + || $state{__windows}{$type_iter}{default}; + last if defined $win or $type_iter eq 'default'; + } + } elsif ($win_priority eq 'sender') { + if (defined $sname + and defined $state{__windows}{$win_priority}{$sname}) { + $win = $state{__windows}{$win_priority}{$sname}; + } + } elsif ($win_priority eq 'list') { + if (defined $sname + and defined $state{__windows}{$win_priority}{$sname}) { + $win = $state{__windows}{$win_priority}{$sname}; + } + } + if (not defined $win and not @win_priorities and not $done_rest) { + $done_rest = 1; + for my $check_priority (@all_priorities) { + if (not grep { $check_priority eq $_ } split ',', $settings{window_priority}) { + push @win_priorities, $check_priority; + } + } + } + } + $win = $settings{window} if not defined $win; + if (not &ensure_window($win, '_tw_in_Win')) { + $win = $settings{window}; + } + + # &debug("window($type, $uname, $sname, $topic) -> $win"); + return $win; +} + +sub ensure_window { + my $win = shift; + my $using_win = shift; + return $win if Irssi::window_find_name($win); + ¬ice([ 'crap', $using_win ], "Creating window '$win'."); + my $newwin = Irssi::Windowitem::window_create( $win, 1 ); + if (not $newwin) { + ¬ice([ 'error', $using_win ], "Failed to create window $win!"); + return; + } + $newwin->set_name($win); + return $win; +} + +sub window_to_account { + my $name = shift; + + foreach my $type ( keys %{ $state{__windows} } ) { + foreach my $uname ( keys %{ $state{__windows}{$type} } ) { + if ( lc $state{__windows}{$type}{$uname} eq lc $name ) { + return $uname; + } + } + } + + if ( lc $name eq $settings{window} ) { + return $user; + } + + return; +} + +sub read_json { + my $file = shift; + my $store = shift; + my $desc = shift; + if ( $file and -r $file ) { + if ( open( my $fh, '<', $file ) ) { + my $json; + do { local $/; $json = <$fh>; }; + close $fh; + eval { + my $ref = JSON::Any->jsonToObj($json); + %$store = %$ref; + }; + } else { + ¬ice( ["error"], "Failed to load $desc from $file: $!" ); + } + } +} + +Irssi::signal_add( "send text", "event_send_text" ); +Irssi::signal_add( "setup changed", "event_setup_changed" ); + +Irssi::theme_register( # theme + [ + 'twirssi_tweet', '[$0%B@$1%n$2] $3', + 'twirssi_search', '[$0%r$1%n%B@$2%n$3] $4', + 'twirssi_search_once', '[$0%r$1%n%B@$2%n$3] $4', + 'twirssi_reply', '[$0\--> %B@$1%n$2] $3', + 'twirssi_dm', '[$0%r@$1%n (%WDM%n)] $2', + 'twirssi_error', '%RERROR%n: $0', + 'twirssi_deerror', '%RUPDATE%n: $0', + 'twirssi_info', '%CINFO:%N $0', + 'twirssi_new_day', '%CDay changed to $0%N', + ] +); + +$last_poll{__poll} = time - &get_poll_time; + +&event_setup_changed(1); +if ( Irssi::window_find_name(window()) ) { + Irssi::command_bind( "dm", "cmd_direct" ); + Irssi::command_bind( "dm_as", "cmd_direct_as" ); + Irssi::command_bind( "tweet", "cmd_tweet" ); + Irssi::command_bind( "tweet_as", "cmd_tweet_as" ); + Irssi::command_bind( "retweet", "cmd_retweet" ); + Irssi::command_bind( "retweet_as", "cmd_retweet_as" ); + Irssi::command_bind( "retweet_to", "cmd_retweet_to_window" ); + Irssi::command_bind( "twitter_broadcast", "cmd_broadcast" ); + Irssi::command_bind( "twitter_info", "cmd_info" ); + Irssi::command_bind( "twitter_user", "cmd_user" ); + Irssi::command_bind( "twitter_reply", "cmd_reply" ); + Irssi::command_bind( "twitter_reply_as", "cmd_reply_as" ); + Irssi::command_bind( "twitter_login", "cmd_login" ); + Irssi::command_bind( "twitter_logout", "cmd_logout" ); + Irssi::command_bind( "twitter_search", "cmd_search" ); + Irssi::command_bind( "twitter_listinfo", "cmd_listinfo" ); + Irssi::command_bind( "twitter_dms", "cmd_dms" ); + Irssi::command_bind( "twitter_dms_as", "cmd_dms_as" ); + Irssi::command_bind( "twitter_switch", "cmd_switch" ); + Irssi::command_bind( "twitter_subscribe", "cmd_add_search" ); + Irssi::command_bind( "twitter_unsubscribe", "cmd_del_search" ); + Irssi::command_bind( "twitter_list_subscriptions", "cmd_list_search" ); + Irssi::command_bind( "twirssi_upgrade", "cmd_upgrade" ); + Irssi::command_bind( "twirssi_reload", "cmd_reload" ); + Irssi::command_bind( "twirssi_oauth", "cmd_oauth" ); + Irssi::command_bind( "twitter_updates", "get_updates" ); + Irssi::command_bind( "twitter_add_follow_extra", "cmd_add_follow" ); + Irssi::command_bind( "twitter_del_follow_extra", "cmd_del_follow" ); + Irssi::command_bind( "twitter_list_follow_extra", "cmd_list_follow" ); + Irssi::command_bind( "twirssi_set_channel", "cmd_set_channel" ); + Irssi::command_bind( "twirssi_list_channels", "cmd_list_channels" ); + Irssi::command_bind( "twirssi_set_window", "cmd_set_window" ); + Irssi::command_bind( "twirssi_list_windows", "cmd_list_windows" ); + Irssi::command_bind( "twirssi_wipe", "cmd_wipe" ); + Irssi::command_bind( "bitlbee_away", "update_away" ); + if ( $settings{use_reply_aliases} ) { + Irssi::command_bind( "reply", "cmd_reply" ); + Irssi::command_bind( "reply_as", "cmd_reply_as" ); + } + Irssi::command_bind( + "twirssi_dump", + sub { + &debug( "twits: ", join ", ", + map { "u: $_\@" . ref($twits{$_}) } keys %twits ); + &debug( "selected: $user\@$defservice" ); + &debug( "friends: ", Dumper \%friends ); + &debug( "blocks: ", Dumper \%blocks ); + &debug( "nicks: ", join ", ", sort keys %nicks ); + &debug( "searches: ", join('; ', map { $state{__last_id}{$_}{__search} and "$_ : " . join(', ', keys %{ $state{__last_id}{$_}{__search} }) } keys %{ $state{__last_id} } )); + &debug( "windows: ", Dumper \%{ $state{__windows} } ); + &debug( "channels: ", Dumper \%{ $state{__channels} } ); + &debug( "lists: ", Dumper \%{ $state{__lists} } ); + &debug( "settings: ", Dumper \%settings ); + &debug( "last poll: ", Dumper \%last_poll ); + if ( open my $fh, '>', "/tmp/$IRSSI{name}.cache.txt" ) { + print $fh Dumper \%tweet_cache; + close $fh; + ¬ice([ 'crap' ], "cache written out to /tmp/$IRSSI{name}.cache.txt"); + } + if ( open my $fh, '>', "$settings{dump_store}" ) { + print $fh Dumper \%state; + close $fh; + ¬ice([ 'crap' ], "state written out to $settings{dump_store}"); + } + } + ); + Irssi::command_bind( + "twirssi_version", + sub { + ¬ice( + # ["error"], + "$IRSSI{name} v$VERSION; " + . ( + $Net::Twitter::VERSION + ? "Net::Twitter v$Net::Twitter::VERSION. " + : "" + ) + . ( + $Net::Identica::VERSION + ? "Net::Identica v$Net::Identica::VERSION. " + : "" + ) + . "JSON in use: " + . JSON::Any::handler() + . ". See details at http://twirssi.com/" + ); + } + ); + Irssi::command_bind( + "twitter_delete", + &gen_cmd( + "/twitter_delete <username:id>", + "destroy_status", + sub { ¬ice( ["tweet"], "Tweet deleted." ); }, + sub { + my ( $nick, $num ) = split /:/, lc $_[0], 2; + return $state{__last_id}{ &normalize_username($nick) }{__sent} unless defined $num; + return $state{__ids}{$nick}[$num]; + } + ) + ); + Irssi::command_bind( + "twitter_fav", + &gen_cmd( + "/twitter_fav <username:id>", + "create_favorite", + sub { ¬ice( ["tweet"], "Tweet favorited." ); }, + sub { + my ( $nick, $num ) = split ':', lc $_[0], 2; + return $state{__last_id}{ &normalize_username($nick) }{__sent} unless defined $num; + return $state{__ids}{$nick}[$num]; + } + ) + ); + Irssi::command_bind( + "twitter_unfav", + &gen_cmd( + "/twitter_unfav <username:id>", + "destroy_favorite", + sub { ¬ice( ["tweet"], "Tweet un-favorited." ); }, + sub { + my ( $nick, $num ) = split ':', lc $_[0], 2; + return $state{__last_id}{ &normalize_username($nick) }{__sent} unless defined $num; + return $state{__ids}{$nick}[$num]; + } + ) + ); + Irssi::command_bind( + "twitter_follow", + &gen_cmd( + "/twitter_follow [-w] <username>", + "create_friend", + sub { + ¬ice( ["tweet", "$user\@$defservice"], + "Following $_[0]" ); + $nicks{ $_[0] } = time; + &cmd_user(@_); + }, + sub { + &cmd_set_window("sender $_[0] $_[0]", $_[1], $_[2]) + if $_[0] =~ s/^\s*-w\s+// and $_[0] ne ''; + return $_[0]; + } + ) + ); + Irssi::command_bind( + "twitter_unfollow", + &gen_cmd( + "/twitter_unfollow <username>", + "destroy_friend", + sub { + ¬ice( ["tweet"], "Stopped following $_[0]" ); + delete $nicks{ $_[0] }; + } + ) + ); + Irssi::command_bind( + "twitter_device_updates", + &gen_cmd( + "/twitter_device_updates none|im|sms", + "update_delivery_device", + sub { ¬ice( ["tweet"], "Device updated to $_[0]" ); } + ) + ); + Irssi::command_bind( + "twitter_block", + &gen_cmd( + "/twitter_block <username>", + "create_block", + sub { ¬ice( ["tweet"], "Blocked $_[0]" ); } + ) + ); + Irssi::command_bind( + "twitter_unblock", + &gen_cmd( + "/twitter_unblock <username>", + "destroy_block", + sub { ¬ice( ["tweet"], "Unblock $_[0]" ); } + ) + ); + Irssi::command_bind( + "twitter_spam", + &gen_cmd( + "/twitter_spam <username>", + "report_spam", + sub { ¬ice( ["tweet"], "Reported $_[0] for spam" ); } + ) + ); + + %completion_types = ( + 'account' => [ + 'twitter_switch', + ], + 'tweet' => [ + 'retweet', + 'retweet_to', + 'twitter_delete', + 'twitter_fav', + 'twitter_info', + 'twitter_reply', + 'twitter_unfav', + ], + 'nick' => [ + 'dm', + 'twitter_block', + 'twitter_add_follow_extra', + 'twitter_del_follow_extra', + 'twitter_follow', + 'twitter_spam', + 'twitter_unblock', + 'twitter_unfollow', + 'twitter_user', + 'twitter_dms', # here for twitter_dms_as + ], + 're_nick' => [ + 'dm', + 'retweet', + 'tweet', + ], + ); + push @{ $completion_types{'tweet'} }, 'reply' if $settings{use_reply_aliases}; + + Irssi::signal_add_last( 'complete word' => \&sig_complete ); + + ¬ice( + " %Y<%C(%B^%C)%N TWIRSSI v%R$VERSION%N", + " %C(_(\\%N http://twirssi.com/ for full docs", + " %Y||%C `%N Log in with /twitter_login, send updates with /tweet" + ); + + my $file = $settings{replies_store}; + if ( $file and -r $file ) { + if ( open( my $fh, '<', $file ) ) { + my $json; + do { local $/; $json = <$fh>; }; + close $fh; + eval { + my $ref = JSON::Any->jsonToObj($json); + %state = %$ref; + # fix legacy vulnerable ids + for (grep !/^__\w+$/, keys %state) { $state{__ids}{$_} = $state{$_}; delete $state{$_}; } + # # remove legacy broken searches (without service name) + # map { /\@/ or delete $state{__searches}{$_} } keys %{$state{__searches}}; + # convert legacy/broken window tags (without @service, or unnormalized) + for my $type (keys %{$state{__windows}}) { + next if $type eq 'search' or $type eq 'sender'; + for my $tag (keys %{$state{__windows}{$type}}) { + next if $tag eq 'default'; + my $new_tag = &normalize_username($tag); + next if -1 == index($new_tag, '@') or $new_tag eq $tag; + $state{__windows}{$type}{$new_tag} = $state{__windows}{$type}{$tag}; + delete $state{__windows}{$type}{$tag}; + } + } + my $num = keys %{ $state{__indexes} }; + ¬ice( sprintf "Loaded old replies from %d contact%s.", + $num, ( $num == 1 ? "" : "s" ) ); + &cmd_list_search; + &cmd_list_follow; + }; + } else { + ¬ice( ["error"], "Failed to load old replies from $file: $!" ); + } + } + + &read_json($settings{poll_store}, \%last_poll, "prev. poll times"); + &read_json($settings{id_store}, \%tweet_cache, "cached IDs"); + + if ( my $provider = $settings{url_provider} ) { + ¬ice("Loading WWW::Shorten::$provider..."); + eval "use WWW::Shorten::$provider;"; + + if ($@) { + ¬ice(["error"], + "Failed to load WWW::Shorten::$provider - either clear", + "short_url_provider or install the CPAN module" + ); + } + } + + if ( @{ $settings{usernames} } ) { + &cmd_login(); + &ensure_updates(15) if keys %twits; + } + +} else { + Irssi::active_win() + ->print( "Create a window named " + . $settings{window} + . " or change the value of twitter_window. Then, reload $IRSSI{name}." ); +} + +# vim: set sts=4 expandtab: diff --git a/moc/config b/moc/config @@ -0,0 +1,673 @@ +# This is a configuration file for the MOC player. It should be named +# 'config' and placed in the ~/.moc directory. As this file can specify +# commands which invoke other applications, MOC will refuse to start if it +# is not owned by either root or the current user, or if it is writable by +# anyone other than its owner. All options are given with their default +# values, and therefore commented. + +# Comments begin with '#'. +# You can use quotes and escape ('\') in parameters. +# +# You can have variable values substituted by enclosing the variable name +# as "${...}". (This only applies to the portion of the option following +# the '='.) Variables are substituted first from the environment then, +# if not found, from the configuration options. (Note that the value of +# a configuration option substituted is that which it has at the time the +# substitution variable is encountered.) If there is a naming conflict +# between an environment and configuration variable, you may be able to +# resolve it by using lowercase as the environment variable matches are +# case-sensitive whereas the configuration variables are not. +# +# You can also use the form "${...:-...}" where the value in the second +# position will be substituted if the variable name given in the first +# position is unset or null. +# +# So, for example: +# +# MusicDir = /music/${USER:-public} +# Fastdir1 = ${MusicDir}/mp3/rock +# Fastdir2 = ${MusicDir}/mp3/electronic +# Fastdir3 = ${MusicDir}/mp3/rap +# Fastdir4 = ${MusicDir}/mp3/etc +# +# Variable names are limited to those accepted by the BASH shell; that +# is, those comprising the upper- and lowercase ASCII characters, digits +# and the underscore. +# +# If you need to use the "${" sequence for any other purpose, write "$${" +# and it will be replaced by "${" and not treated as a substitution. +# +# Some options take lists of strings as their values. The strings are +# separated by colons. Additional strings can be appended to the list +# using "+=" in place of a plain "=" to assign the value. For an example, +# see the XTerms option. +# +# You can override any configuration option when you run MOC using the +# '-O' command line option: +# +# mocp -O AutoNext=no -O messagelingertime=1 -O XTerms+=xxt:xwt +# +# This command line option can be repeated as many times as needed and +# the configuration option name is not case sensitive. (Note that MOC +# does not perform variable substitution on the value of such overridden +# configuration options.) Most option values are set before the +# configuration file is processed (which allows the new values to be +# picked up by substitutions), however list-valued options are overridden +# afterwards (which gives the choice of whether the configured values are +# replaced or added to). + +# Remember that the client and server are separate processes and the +# server will retain the configuration values formed from the environment +# within which it was originally started. + +# Show file titles (title, author, album) instead of file names? +#ReadTags = yes + +# In which directory do you store your music files? If you specify it +# you will be able to jump straight to this directory with the '-m' +# parameter or the 'm' command. This can also point to a playlist. +# +# Example: MusicDir = "/home/joe/music" +# +MusicDir = "/home/dudley/music" + +# Start in the music directory by default? If set to 'no', start +# in the current directory by default. A single directory on +# the command line takes precedence. +#StartInMusicDir = no + +# How to sort? FileName is the option's only value for now. +#Sort = FileName + +# Show errors in the streams (for example, broken frames in MP3 files)? +#ShowStreamErrors = no + +# Ignore CRC errors in MP3 files? Most players do that, so the default +# value is 'yes'. +#MP3IgnoreCRCErrors = yes + +# Set playback toggles. +#Repeat = no +#Shuffle = no +#AutoNext = yes + +# Default FormatString: +# +# %n - Track number +# %a - Artist +# %A - Album +# %t - Title +# %(X:TRUE:FALSE) - Ternary expression: if X exists, do TRUE, +# otherwise FALSE. The escape character must +# be doubled (i.e., '\\'). (See zshmisc +# documentation for more information.) +# +#FormatString = "%(n:%n :)%(a:%a - :)%(t:%t:)%(A: \(%A\):)" + +# Input and output buffer sizes (in kilobytes). +#InputBuffer = 512 # Minimum value is 32KB +#OutputBuffer = 512 # Minimum value is 128KB + +# How much to fill the input buffer before playing (in kilobytes)? +# This can't be greater than the value of InputBuffer. While this has +# a positive effect for network streams, it also causes the broadcast +# audio to be delayed. +#Prebuffering = 64 + +# Use this HTTP proxy server for internet streams. If not set, the +# environment variables http_proxy and ALL_PROXY will be used if present. +# +# Format: HTTPProxy = PROXY_NAME:PORT +# +#HTTPProxy = + +# Sound driver - OSS, ALSA, JACK, SNDIO (on OpenBSD) or null (only for +# debugging). You can enter more than one driver as a colon-separated +# list. The first working driver will be used. +#SoundDriver = JACK:ALSA:OSS + +# Jack output settings. +#JackClientName = "moc" +#JackStartServer = no +#JackOutLeft = "system:playback_1" +#JackOutRight = "system:playback_2" + +# OSS output settings. +#OSSDevice = /dev/dsp +#OSSMixerDevice = /dev/mixer +#OSSMixerChannel1 = pcm # 'pcm', 'master' or 'speaker' +#OSSMixerChannel2 = master # 'pcm', 'master' or 'speaker' + +# ALSA output settings. If you need to dump the audio produced by MOC +# to a file for diagnostic purposes, the following setting of 'ALSADevice' +# should do that: +# +# ALSADevice=tee:hw,'/tmp/out.wav',wav +# +#ALSADevice = default +#ALSAMixer1 = PCM +#ALSAMixer2 = Master + +# Save software mixer state? +# If enabled, a file 'softmixer' will be created in '~/.moc/' storing the +# mixersetting set when the server is shut down. +# Note that there is a "hidden" 'Amplification' setting in that file. +# Amplification (0-200) is used to scale the mixer setting (0-100). This +# results in a higher signal amplitude but may also produce clipping. +#Softmixer_SaveState = yes + +# Save equalizer state? +# If enabled, a file 'equalizer' will be created in '~/.moc/' storing the +# equalizer settings when the server is shut down. +# Note that there is a "hidden" 'Mixin' setting in that file. +# Mixin (0.0-1.0) is used to determine how much of the original signal is +# used after equalizing. 0 means to only use the equalized sound, while 1 +# effectively disabled the mixer. The default is 0.25. +#Equalizer_SaveState = yes + +# Show files with dot at the beginning? +#ShowHiddenFiles = no + +# Hide file name extensions? +#HideFileExtension = no + +# Show file format in menu? +#ShowFormat = yes + +# Show file time in menu? Possible values: 'yes', 'no' and 'IfAvailable' +# (meaning show the time only when it is already known, which often works +# faster). +#ShowTime = IfAvailable + +# Show time played as a percentage in the time progress bar. +#ShowTimePercent = no + +# Values of the TERM environment variable which are deemed to be managed by +# screen(1). If you are setting a specific terminal using screen(1)'s +# '-T <term>' option, then you will need to add 'screen.<term>' to this list. +# Note that this is only a partial test; the value of the WINDOW environment +# variable must also be a number (which screen(1) sets). +#ScreenTerms = screen:screen-w:vt100 + +# Values of the TERM environment variable which are deemed to be xterms. If +# you are using MOC within screen(1) under an xterm, then add screen(1)'s +# TERM setting here as well to cause MOC to update the xterm's title. +#XTerms = xterm +#XTerms += xterm-colour:xterm-color +#XTerms += xterm-256colour:xterm-256color +#XTerms += rxvt:rxvt-unicode +#XTerms += rxvt-unicode-256colour:rxvt-unicode-256color +#XTerms += eterm + +# Theme file to use. This can be absolute path or relative to +# /usr/share/moc/themes/ (depends on installation prefix) or +# ~/.moc/themes/ . +# +# Example: Theme = laras_theme +# +Theme = digitaljedi_theme + +# The theme used when running on an xterm. +# +# Example: XTermTheme = transparent-background +# +#XTermTheme = + +# Should MOC try to autoload the default lyrics file for an audio? (The +# default lyrics file is a text file with the same file name as the audio +# file name with any trailing "extension" removed.) +#AutoLoadLyrics = yes + +# MOC directory (where pid file, socket and state files are stored). +# You can use ~ at the beginning. +#MOCDir = ~/.moc + +# Use mmap() to read files. mmap() is much slower on NFS. +#UseMMap = no + +# Use MIME to identify audio files. This can make for slower loading +# of playlists but is more accurate than using "extensions". +#UseMimeMagic = no + +# Assume this encoding for ID3 version 1/1.1 tags (MP3 files). Unlike +# ID3v2, UTF-8 is not used here and MOC can't guess how tags are encoded. +# Another solution is using librcc (see the next option). This option is +# ignored if UseRCC is set to 'yes'. +#ID3v1TagsEncoding = WINDOWS-1250 + +# Use librcc to fix ID3 version 1/1.1 tags encoding. +#UseRCC = yes + +# Use librcc to filenames and directory names encoding. +#UseRCCForFilesystem = yes + +# When this option is set the player assumes that if the encoding of +# ID3v2 is set to ISO-8859-1 then the ID3v1TagsEncoding is actually +# that and applies appropriate conversion. +#EnforceTagsEncoding = no + +# Enable the conversion of filenames from the local encoding to UTF-8. +#FileNamesIconv = no + +# Enable the conversion of the xterm title from UTF-8 to the local encoding. +#NonUTFXterm = no + +# Remember the playlist after exit? +#SavePlaylist = yes + +# When using more than one client (interface) at a time, do they share +# the playlist? +#SyncPlaylist = yes + +# Choose a keymap file (relative to '~/.moc/' or using an absolute path). +# An annotated example keymap file is included ('keymap.example'). +# +# Example: Keymap = my_keymap +# +#Keymap = + +# Use ASCII rather than graphic characters for drawing lines. This +# helps on some terminals. +#ASCIILines = no + +# FastDirs, these allow you to jump directly to a directory, the key +# bindings are in the keymap file. +# +# Examples: Fastdir1 = /mp3/rock +# Fastdir2 = /mp3/electronic +# Fastdir3 = /mp3/rap +# Fastdir4 = /mp3/etc +# +#Fastdir1 = +#Fastdir2 = +#Fastdir3 = +#Fastdir4 = +#Fastdir5 = +#Fastdir6 = +#Fastdir7 = +#Fastdir8 = +#Fastdir9 = +#Fastdir10 = + +# How fast to seek (in number of seconds per keystroke). The first +# option is for normal seek and the second for silent seek. +#SeekTime = 1 +#SilentSeekTime = 5 + +# PreferredDecoders allows you to specify which decoder should be used +# for any given audio format. It is a colon-separated list in which +# each entry is of the general form 'code(decoders)', where 'code' +# identifies the audio format and 'decoders' is a comma-separated list +# of decoders in order of preference. +# +# The audio format identifier may be either a filename extension or a +# MIME media type. If the latter, the format is 'type/subtype' (e.g., +# 'audio/flac'). Because different systems may give different MIME +# media types, any 'x-' prefix of the subtype is ignored both here and +# in the actual file MIME type (so all combinations of 'audio/flac' and +# 'audio/x-flac' match each other). +# +# For Internet streams the matching is done on MIME media type and on +# actual content. For files the matches are made on MIME media type +# (if the 'UseMimeMagic' option is set) and on filename extension. The +# MIME media type of a file is not determined until the first entry for +# MIME is encountered in the list. +# +# The matching is done in the order of appearance in the list with any +# entries added from the command line being matched before those listed +# here. Therefore, if you place all filename extension entries before +# all MIME entries you will speed up MOC's processing of directories +# (which could be significant for remote file systems). +# +# The decoder list may be empty, in which case no decoders will be used +# for files (and files with that audio format ignored) while Internet +# streams will be assessed on the actual content. Any decoder position +# may contain an asterisk, in which case any decoder not otherwise listed +# which can handle the audio format will be used. It is not an error to +# list the same decoder twice, but neither does it make sense to do so. +# +# If you have a mix of audio and non-audio files in your directories, you +# may wish to include entries at top of the list which ignore non-audio +# files by extension. +# +# In summary, the PreferredDecoders option provides fine control over the +# type of matching which is performed (filename extension, MIME media +# type and streamed media content) and which decoder(s) (if any) are used +# based on the option's list entries and their ordering. +# +# Examples: aac(aac,ffmpeg) first try FAAD2 for AACs then FFmpeg +# mp3() ignore MP3 files +# wav(*,sndfile) use sndfile for WAV as a last resort +# ogg(vorbis,*):flac(flac,*) try Xiph decoders first +# ogg():audio/ogg() ignore OGG files, and +# force Internet selection by content +# gz():html() ignore some non-audio files +# +# Any unspecified audio formats default to trying all decoders. +# Any unknown (or misspelt) drivers are ignored. +# All names are case insensitive. +# The default setting reflects the historical situation modified by +# the experience of users. +# +#PreferredDecoders = aac(aac,ffmpeg):m4a(ffmpeg) +#PreferredDecoders += mpc(musepack,*,ffmpeg):mpc8(musepack,*,ffmpeg) +#PreferredDecoders += sid(sidplay2):mus(sidplay2) +#PreferredDecoders += wav(sndfile,*,ffmpeg) +#PreferredDecoders += wv(wavpack,*,ffmpeg) +#PreferredDecoders += audio/aac(aac):audio/aacp(aac):audio/m4a(ffmpeg) +#PreferredDecoders += audio/wav(sndfile,*) + +# The following PreferredDecoders attempt to handle the ambiguity surrounding +# container types such as OGG for files. The first two entries will force +# a local file to the correct decoder (assuming the .ogg file contains Vorbis +# audio), while the MIME media types will cause Internet audio streams to +# be assessed on content (which may be either Vorbis or Speex). +# +#PreferredDecoders += ogg(vorbis,ffmpeg):oga(vorbis,ffmpeg):ogv(ffmpeg) +#PreferredDecoders += opus(ffmpeg) +#PreferredDecoders += spx(speex) +#PreferredDecoders += application/ogg(vorbis):audio/ogg(vorbis) + +# Which resampling method to use. There are a few methods of resampling +# sound supported by libresamplerate. The default is 'Linear') which is +# also the fastest. A better description can be found at: +# +# http://www.mega-nerd.com/libsamplerate/api_misc.html#Converters +# +# but briefly, the following methods are based on bandlimited interpolation +# and are higher quality, but also slower: +# +# SincBestQuality - really slow (I know you probably have an xx GHz +# processor, but it's still not enough to not see +# this in the top output :) The worst case +# Signal-to-Noise Ratio is 97dB. +# SincMediumQuality - much faster. +# SincFastest - the fastest bandlimited interpolation. +# +# And these are lower quality, but much faster methods: +# +# ZeroOrderHold - really poor quality, but it's really fast. +# Linear - a bit better and a bit slower. +# +#ResampleMethod = Linear + +# Always use this sample rate (in Hz) when opening the audio device (and +# resample the sound if necessary). When set to 0 the device is opened +# with the file's rate. +#ForceSampleRate = 0 + +# By default, even if the sound card reports that it can output 24bit samples +# MOC converts 24bit PCM to 16bit. Setting this option to 'yes' allows MOC +# to use 24bit output. (The MP3 decoder, for example, uses this format.) +# This is disabled by default because there were reports that it prevents +# MP3 files from playing on some soundcards. +#Allow24bitOutput = no + +# Use realtime priority for output buffer thread. This will prevent gaps +# while playing even with heavy load. The user who runs MOC must have +# permissions to set such a priority. This could be dangerous, because it +# is possible that a bug in MOC will freeze your computer. +#UseRealtimePriority = no + +# The number of audio files for which MOC will cache tags. When this limit +# is reached, file tags are discarded on a least recently used basis (with +# one second resolution). You can disable the cache by giving it a size of +# zero. Note that if you decrease the cache size below the number of items +# currently in the cache, the number will not decrease immediately (if at +# all). +#TagsCacheSize = 256 + +# Number items in the playlist. +#PlaylistNumbering = yes + +# Main window layouts can be configured. You can change the position and +# size of the menus (directory and playlist). You have three layouts and +# can switch between then using the 'l' key (standard mapping). By default, +# only two layouts are configured. +# +# The format is as follows: +# +# - Each layout is described as a list of menu entries. +# - Each menu entry is of the form: +# +# menu(position_x, position_y, width, height) +# +# where 'menu' is either 'directory' or 'playlist'. +# - The parameters define position and size of the menu. They can +# be absolute numbers (like 10) or a percentage of the screen size +# (like 45%). +# - 'width' and 'height' can have also value of 'FILL' which means +# fill the screen from the menu's position to the border. +# - Menus may overlap. +# +# You must describe at least one menu (default is to fill the whole window). +# There must be at least one layout (Layout1) defined; others can be empty. +# +# Example: Layout1 = playlist(50%,50%,50%,50%) +# Layout2 = "" +# Layout3 = "" +# +# Just one layout, the directory will occupy the whole +# screen, the playlist will have 1/4 of the screen size +# and be positioned at lower right corner. (Note that +# because the playlist will be hidden by the directory +# you will have to use the TAB key to make the playlist +# visible.) +# +# Example: Layout1 = playlist(0,0,100%,10):directory(0,10,100%,FILL) +# +# The screen is split into two parts: playlist at the top +# and the directory menu at the bottom. Playlist will +# occupy 10 lines and the directory menu the rest. +# +#Layout1 = directory(0,0,50%,100%):playlist(50%,0,FILL,100%) +#Layout2 = directory(0,0,100%,100%):playlist(0,0,100%,100%) +#Layout3 = "" + +# When the song changes, should the menu be scrolled so that the currently +# played file is visible? +#FollowPlayedFile = yes + +# What to do if the interface was started and the server is already playing +# something from the playlist? If CanStartInPlaylist is set to 'yes', the +# interface will switch to the playlist. When set to 'no' it will start +# from the last directory. +#CanStartInPlaylist = yes + +# Executing external commands (1 - 10) invoked with key commands (F1 - F10 +# by default). +# +# Some arguments are substituted before executing: +# +# %f - file path +# %i - title made from tags +# %S - start block mark (in seconds) +# %E - end block mark (in seconds) +# +# Data from tags can also be substituted: +# +# %t - title +# %a - album +# %r - artist +# %n - track +# %m - time of the file (in seconds) +# +# The parameters above apply to the currently selected file. If you change +# them to capital letters, they are taken from the file currently playing. +# +# Programs are run using execv(), not a shell, so you can't do things like +# redirecting the output to a file. The command string is split using blank +# characters as separators; the first element is the command to be executed +# and the rest are its parameters, so if you use "echo Playing: %I" we run +# program 'echo' (from $PATH) with 2 parameters: the string 'Playing:' and +# the title of the file currently playing. Even if the title contains +# spaces, it's still one parameter and it's safe if it contains `rm -rf /`. +# +# Examples: ExecCommand1 = "cp %f /mnt/usb_drive" +# ExecCommand2 = "/home/joe/now_playing %I" +# +#ExecCommand1 = +#ExecCommand2 = +#ExecCommand3 = +#ExecCommand4 = +#ExecCommand5 = +#ExecCommand6 = +#ExecCommand7 = +#ExecCommand8 = +#ExecCommand9 = +#ExecCommand10 = + +# Display the cursor in the line with the selected file. Some braille +# readers (the Handy Tech modular series ZMU 737, for example) use the +# cursor to focus and can make use of it to present the file line even +# when other fields are changing. +#UseCursorSelection = no + +# Set the terminal title when running under xterm. +#SetXtermTitle = yes + +# Set the terminal title when running under screen(1). If MOC can detect +# that it is running under screen(1), then it will set an appropriate +# title (see description of ScreenTerms above). However, if multiple +# levels of screen management are involved, detection might fail and this +# could cause a screen upset. In that situation you can use this option +# to force screen titles off. +#SetScreenTitle = yes + +# Display full paths instead of just file names in the playlist. +#PlaylistFullPaths = yes + +# The following setting describes how block markers are displayed in +# the play time progress bar. Its value is a string of exactly three +# characters. The first character is displayed in a position which +# corresponds to the time marked as the start of a block and the last +# character to the time marked as the end of the block. The middle +# character is displayed instead if both the start and the end of the block +# would fall in the same position (within the resolution of the interface). +# You can turn off the displaying of these block marker positions by using +# three space characters. +#BlockDecorators = "`\"'" + +# How long (in seconds) to leave a message displayed on the screen. +# Setting this to a high value allows you to scroll through the messages +# using the 'hide_message' key. Setting it to zero means you'll have to +# be quick to see any message at all. Any new messages will be queued up +# and displayed after the current message's linger time expires. +#MessageLingerTime = 3 + +# Does MOC display a prefix on delayed messages indicating +# the number of queued messages still to be displayed? +#PrefixQueuedMessages = yes + +# String to append to the queued message count if any +# error messages are still waiting to be displayed. +#ErrorMessagesQueued = "!" + +# Self-describing ModPlug options (with 'yes' or 'no' values). +#ModPlug_Oversampling = yes +#ModPlug_NoiseReduction = yes +#ModPlug_Reverb = no +#ModPlug_MegaBass = no +#ModPlug_Surround = no + +# ModPlug resampling mode. +# Valid values are: +# +# FIR - 8 tap fir filter (extremely high quality) +# SPLINE - Cubic spline interpolation (high quality) +# LINEAR - Linear interpolation (fast, good quality) +# NEAREST - No interpolation (very fast, extremely bad sound quality) +# +#ModPlug_ResamplingMode = FIR + +# Other self-describing ModPlug audio characteristic options. +# (Note that the 32 bit sample size seems to be buggy.) +#ModPlug_Channels = 2 # 1 or 2 channels +#ModPlug_Bits = 16 # 8, 16 or 32 bits +#ModPlug_Frequency = 44100 # 11025, 22050, 44100 or 48000 Hz +#ModPlug_ReverbDepth = 0 # 0 (quiet) to 100 (loud) +#ModPlug_ReverbDelay = 0 # Delay in ms (usually 40-200ms) +#ModPlug_BassAmount = 0 # 0 (quiet) to 100 (loud). +#ModPlug_BassRange = 10 # Cutoff in Hz (10-100). +#ModPlug_SurroundDepth = 0 # Surround level 0(quiet)-100(heavy). +#ModPlug_SurroundDelay = 0 # Surround delay in ms, usually 5-40ms. +#ModPlug_LoopCount = 0 # 0 (never), n (times) or -1 (forever) + +# Self-describing TiMidity audio characteristic options. +#TiMidity_Rate = 44100 # Between 8000 and 48000 +#TiMidity_Bits = 16 # 8 or 16 +#TiMidity_Channels = 2 # 1 or 2 +#TiMidity_Volume = 100 # 0 to 800 + +# You can setup a TiMidity-Config-File here. +# Leave it unset to use library defaults (/etc/timidity.cfg mostly). +# Setting it to 'yes' also uses the library defaults. +# Set it to 'no' if you don't have any configuration file. +# Otherwise set it to the name of a specific file. +#TiMidity_Config = + +# Self-describing SidPlay2 audio characteristic options. +#SidPlay2_DefaultSongLength = 180 # If not in database (in seconds) +#SidPlay2_MinimumSongLength = 0 # Play at least n (in seconds) +#SidPlay2_Frequency = 44100 # 4000 to 48000 +#SidPlay2_Bits = 16 # 8 or 16 +#SidPlay2_Optimisation = 0 # 0 (worst quality) to 2 (best quality) + +# Set path to a HVSC-compatible database (if not set, database is disabled). +#SidPlay2_Database = + +# SidPlay2 playback Mode: +# +# "M": Mono (best for many SIDs) +# "S": Stereo +# "L"/"R": Left / Right +# +#SidPlay2_PlayMode = "M" + +# Use start-song information from SID ('yes') or start at first song +# ('no'). Songs before the start-song won't be played. (Note that this +# option previously took the values 1 and 0; these are now deprecated +# in favour of 'yes' and 'no'.) +#SidPlay2_StartAtStart = yes + +# Play sub-tunes. (Note that this option previously took the values 1 +# and 0; these are now deprecated in favour of 'yes' and 'no'.) +#SidPlay2_PlaySubTunes = yes + +# Run the OnSongChange command when a new song starts playing. +# Specify the full path (i.e. no leading '~') of an executable to run. +# Arguments will be passed, and you can use the following escapes: +# +# %a artist +# %r album +# %f filename +# %t title +# %n track +# %d file duration in XX:YY form +# %D file duration, number of seconds +# +# No pipes/redirects can be used directly, but writing a shell script +# can do the job. +# +# Example: OnSongChange = "/home/jack/.moc/myscript %a %r" +# +#OnSongChange = + +# If RepeatSongChange is 'yes' then MOC will execute the command every time +# a song starts playing regardless of whether or not it is just repeating. +# Otherwise the command will only be executed when a different song is +# started. +#RepeatSongChange = no + +# Run the OnStop command (full path, no arguments) when MOC changes state +# to stopped (i.e., when user stopped playing or changes a song). +#OnStop = "/home/jack/.moc/myscript_on_stop" + +# This option determines which song to play after finishing all the songs +# in the queue. Setting this to 'yes' causes MOC to play the song which +# follows the song being played before queue playing started. If set to +# 'no', MOC will play the song following the last song in the queue if it +# is in the playlist. The default is 'yes' because this is the way other +# players usually behave. (Note that this option previously took the +# values 1 and 0; these are now deprecated in favour of 'yes' and 'no'.) +#QueueNextSongReturn = yes diff --git a/moc/themes/algersoft_theme b/moc/themes/algersoft_theme @@ -0,0 +1,36 @@ +# digitaljedi theme for MOC by glitch; adapted from the orpheus default color scheme (version 3) +# 2015 02 13 + + +background = default default normal +frame = green black bold +window_title = black black bold +directory = green black normal +selected_directory = blue black bold,underline +playlist = white black normal +selected_playlist = blue black bold,underline +file = white black normal +selected_file = blue black bold,underline +marked_file = cyan black bold +marked_selected_file = cyan black bold +info = blue black bold +status = black white normal +title = cyan black bold +state = green black bold,blink +current_time = white black normal +time_left = black black bold +total_time = blue black bold +time_total_frames = black black bold +sound_parameters = white black normal +legend = blue black bold +disabled = black black bold +enabled = white black normal +empty_mixer_bar = white black normal +filled_mixer_bar = black white normal +empty_time_bar = black black normal +filled_time_bar = black white bold +entry = white black normal +entry_title = black white normal +error = yellow black bold +message = yellow black bold +plist_time = black white normal diff --git a/moc/themes/digitaljedi_theme b/moc/themes/digitaljedi_theme @@ -0,0 +1,36 @@ +# digitaljedi theme for MOC by glitch; adapted from the orpheus default color scheme (version 3) +# 2015 02 13 + + +background = default default normal +frame = blue black bold +window_title = black black bold +directory = cyan black normal +selected_directory = blue black bold,underline +playlist = white black normal +selected_playlist = blue black bold,underline +file = white black normal +selected_file = blue black bold,underline +marked_file = cyan black bold +marked_selected_file = cyan black bold +info = blue black bold +status = black white normal +title = cyan black bold +state = green black bold,blink +current_time = white black normal +time_left = black black bold +total_time = blue black bold +time_total_frames = black black bold +sound_parameters = white black normal +legend = blue black bold +disabled = black black bold +enabled = white black normal +empty_mixer_bar = white black normal +filled_mixer_bar = black white normal +empty_time_bar = black black normal +filled_time_bar = black white bold +entry = white black normal +entry_title = black white normal +error = yellow black bold +message = yellow black bold +plist_time = black white normal diff --git a/moc/themes/orpheus_theme b/moc/themes/orpheus_theme @@ -0,0 +1,36 @@ +# orpheus theme for MOC by orveldv; adapted from the orpheus default color scheme (version 3) +# 24/May/2007 + + +background = default default normal +frame = blue black bold +window_title = black black bold +directory = cyan black normal +selected_directory = cyan black underline +playlist = white black normal +selected_playlist = cyan black bold +file = green black normal +selected_file = green black underline +marked_file = yellow black bold +marked_selected_file = green black bold +info = blue black bold +status = black white normal +title = yellow black bold +state = green black bold,blink +current_time = white black normal +time_left = black black bold +total_time = green black normal +time_total_frames = black black bold +sound_parameters = white black normal +legend = green black normal +disabled = black black bold +enabled = white black normal +empty_mixer_bar = white black normal +filled_mixer_bar = black white normal +empty_time_bar = black black normal +filled_time_bar = black white bold +entry = white black normal +entry_title = black white normal +error = yellow black bold +message = yellow black bold +plist_time = black white normal diff --git a/mpd/.mpd/mpd.conf b/mpd/.mpd/mpd.conf @@ -0,0 +1,37 @@ +# ████ ████ ███████ ███████ +# ░██░██ ██░██░██░░░░██░██░░░░██ +# ░██░░██ ██ ░██░██ ░██░██ ░██ +# ░██ ░░███ ░██░███████ ░██ ░██ +# ░██ ░░█ ░██░██░░░░ ░██ ░██ +# ░██ ░ ░██░██ ░██ ██ +# ░██ ░██░██ ░███████ +# ░░ ░░ ░░ ░░░░░░░ +# +#█▓▒░ files +music_directory "/media/data_01/music" +playlist_directory "~/.mpd/playlists" +db_file "~/.mpd/database" +log_file "~/.mpd/log" +pid_file "~/.mpd/pid" +state_file "~/.mpd/state" +sticker_file "~/.mpd/sticker.sql" +#█▓▒░ opts +bind_to_address "127.0.0.1" +port "6601" +log_level "default" +gapless_mp3_playback "yes" +filesystem_charset "UTF-8" +#█▓▒░ io +input { + plugin "curl" +} +audio_output { + type "alsa" + name "audio" +} +audio_output { + type "fifo" + name "visualizer" + path "~/.mpd/mpd.fifo" + format "44100:16:2" +} diff --git a/mutt/.mutt/cache/bodies b/mutt/.mutt/cache/bodies diff --git a/mutt/.mutt/cache/headers b/mutt/.mutt/cache/headers diff --git a/mutt/.mutt/certificates b/mutt/.mutt/certificates diff --git a/mutt/.mutt/muttrc b/mutt/.mutt/muttrc @@ -0,0 +1,16 @@ +set imap_user = "root@pyratebeard.net" +set imap_pass = "" +set smtp_url = "smtp.domain.com:587/" +set smtp_pass = "" +set from = "root@pyratebeard.net" +set realname = "pyratebeard" +set header_cache = "~/.mutt/cache/headers" +set message_cachedir = "~/.mutt/cache/" +set certificate_file = "~/.mutt/certificates" +set folder = imaps://imap.domain.com +set spoolfile = +INBOX +mailboxes = +INBOX +unset imap_passive +set imap_keepalive = 300 +set mail_check = 120 +set editor = vim diff --git a/ncmpcpp/.ncmpcpp/config b/ncmpcpp/.ncmpcpp/config @@ -0,0 +1,78 @@ +# ████ ██ ██████ ████ ████ ███████ ██████ ███████ ███████ +# ░██░██ ░██ ██░░░░██░██░██ ██░██░██░░░░██ ██░░░░██░██░░░░██░██░░░░██ +# ░██░░██ ░██ ██ ░░ ░██░░██ ██ ░██░██ ░██ ██ ░░ ░██ ░██░██ ░██ +# ░██ ░░██ ░██░██ ░██ ░░███ ░██░███████ ░██ ░███████ ░███████ +# ░██ ░░██░██░██ ░██ ░░█ ░██░██░░░░ ░██ ░██░░░░ ░██░░░░ +# ░██ ░░████░░██ ██░██ ░ ░██░██ ░░██ ██░██ ░██ +# ░██ ░░███ ░░██████ ░██ ░██░██ ░░██████ ░██ ░██ +# ░░ ░░░ ░░░░░░ ░░ ░░ ░░ ░░░░░░ ░░ ░░ +# +# █▓▒░ Setup +ncmpcpp_directory = "~/.ncmpcpp" +#lyrics_directory = "~/.lyrics" +external_editor = "/usr/bin/vim" + +# █▓▒░ MPD Settings +mpd_crossfade_time = "3" +mpd_music_dir = "/media/data_01/music" +mpd_host = "127.0.0.1" +mpd_port = "6601" + +# █▓▒░ Visualizer +visualizer_look = "▒░" +visualizer_color = "cyan" +visualizer_in_stereo = "yes" +visualizer_fifo_path = "~/.mpd/mpd.fifo" +visualizer_sync_interval = "10" +visualizer_output_name = "mpd spectrum" + +# █▓▒░ Display Settings +song_list_format = "{$7%a $6> $5}{%t$6$R$b} [{%l}]" +song_status_format = "$7%a $6$b> $5%t $6$b> $2%b$6" +statusbar_color = "black" +main_window_color = "cyan" +main_window_highlight_color = "magenta" +active_column_color = "black" +header_visibility = "no" +statusbar_visibility = "yes" +colors_enabled = "yes" +now_playing_prefix = "> " +#now_playing_suffix = "" +autocenter_mode = "yes" +centered_cursor = "yes" +progressbar_color = "black" +progressbar_elapsed_color = "yellow" +progressbar_look = "▒▓░" +titles_visibility = "no" +mouse_support = "no" +discard_colors_if_item_is_selected = "yes" +user_interface = "classic" +playlist_display_mode = "classic" + +# █▓▒░ cheat sheet +# %l - length +# %f - filename +# %D - directory +# %a - 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 +# █▓▒░ colors +# $0 - default window color +# $1 - black +# $2 - red +# $3 - green +# $4 - yellow +# $5 - blue +# $6 - magenta +# $7 - cyan +# $8 - white +# $9 - end of current color diff --git a/ranger/.config/ranger/bookmarks b/ranger/.config/ranger/bookmarks @@ -0,0 +1 @@ +':/home/dudley/dotfiles diff --git a/ranger/.config/ranger/colorschemes/z3bratabs.py b/ranger/.config/ranger/colorschemes/z3bratabs.py @@ -0,0 +1,162 @@ +#nixers + +from ranger.gui.colorscheme import ColorScheme +from ranger.gui.color import * + +class z3bratabs(ColorScheme): + progress_bar_color = 8 + + def use(self, context): + fg, bg, attr = default_colors + + if context.reset: + return default_colors + + elif context.in_browser: + if context.selected: + attr = reverse + else: + attr = normal + if context.empty or context.error: + fg = 7 + bg = 8 + if context.border: + fg = 7 + if context.image: + fg = 10 + if context.video: + fg = 4 + if context.audio: + fg = 6 + if context.document: + fg = 8 + bg = 7 + if context.container: + attr |= bold + fg = 8 + if context.directory: + attr |= bold + fg = 7 + elif context.executable and not \ + any((context.media, context.container, + context.fifo, context.socket)): + attr |= bold + fg = 4 + if context.socket: + fg = 3 + attr |= bold + if context.fifo or context.device: + fg = 10 + if context.device: + attr |= bold + if context.link: + fg = context.good and 7 or 8 + bg = 8 + if context.bad: + fg = 1 + if context.tag_marker and not context.selected: + attr |= bold + if fg in (7, 8): + fg = 8 + else: + fg = 1 + if not context.selected and (context.cut or context.copied): + fg = 15 + bg = 8 + if context.main_column: + if context.selected: + attr |= bold + if context.marked: + attr |= bold + fg = 8 + if context.badinfo: + if attr & reverse: + bg = 1 + else: + fg = 7 + + elif context.in_titlebar: + attr |= bold + if context.hostname: + fg = context.bad and 8 or 7 + bg = 8 + elif context.directory: + fg = 8 + elif context.tab: + if context.good: + fg = 1 + elif context.link: + fg = 8 + + elif context.in_statusbar: + if context.permissions: + if context.good: + fg = 7 + bg = 8 + elif context.bad: + fg = 8 + bg = 7 + if context.marked: + attr |= bold | reverse + fg = 8 + if context.message: + if context.bad: + attr |= bold + fg = 10 + if context.loaded: + bg = self.progress_bar_color + if context.vcsinfo: + fg = 10 + attr &= ~bold + if context.vcscommit: + fg = 5 + attr &= ~bold + + + if context.text: + if context.highlight: + attr |= reverse + + if context.in_taskview: + if context.title: + fg = 8 + + if context.selected: + attr |= reverse + + if context.loaded: + if context.selected: + fg = self.progress_bar_color + else: + bg = self.progress_bar_color + + + if context.vcsfile and not context.selected: + attr &= ~bold + if context.vcsconflict: + fg = 1 + elif context.vcschanged: + fg = 2 + elif context.vcsunknown: + fg = 3 + elif context.vcsstaged: + fg = 4 + elif context.vcssync: + fg = 5 + elif context.vcsignored: + fg = 6 + + elif context.vcsremote and not context.selected: + attr &= ~bold + if context.vcssync: + fg = 12 + elif context.vcsbehind: + fg = 13 + elif context.vcsahead: + fg = 9 + elif context.vcsdiverged: + fg = 10 + elif context.vcsunknown: + fg = 11 + + return fg, bg, attr +\ No newline at end of file diff --git a/ranger/.config/ranger/commands.py b/ranger/.config/ranger/commands.py @@ -0,0 +1,1244 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2009-2013 Roman Zimbelmann <hut@lavabit.com> +# This configuration file is licensed under the same terms as ranger. +# =================================================================== +# This file contains ranger's commands. +# It's all in python; lines beginning with # are comments. +# +# Note that additional commands are automatically generated from the methods +# of the class ranger.core.actions.Actions. +# +# You can customize commands in the file ~/.config/ranger/commands.py. +# It has the same syntax as this file. In fact, you can just copy this +# file there with `ranger --copy-config=commands' and make your modifications. +# But make sure you update your configs when you update ranger. +# +# =================================================================== +# Every class defined here which is a subclass of `Command' will be used as a +# command in ranger. Several methods are defined to interface with ranger: +# execute(): called when the command is executed. +# cancel(): called when closing the console. +# tab(): called when <TAB> is pressed. +# quick(): called after each keypress. +# +# The return values for tab() can be either: +# None: There is no tab completion +# A string: Change the console to this string +# A list/tuple/generator: cycle through every item in it +# +# The return value for quick() can be: +# False: Nothing happens +# True: Execute the command afterwards +# +# The return value for execute() and cancel() doesn't matter. +# +# =================================================================== +# Commands have certain attributes and methods that facilitate parsing of +# the arguments: +# +# self.line: The whole line that was written in the console. +# self.args: A list of all (space-separated) arguments to the command. +# self.quantifier: If this command was mapped to the key "X" and +# the user pressed 6X, self.quantifier will be 6. +# self.arg(n): The n-th argument, or an empty string if it doesn't exist. +# self.rest(n): The n-th argument plus everything that followed. For example, +# If the command was "search foo bar a b c", rest(2) will be "bar a b c" +# self.start(n): The n-th argument and anything before it. For example, +# If the command was "search foo bar a b c", rest(2) will be "bar a b c" +# +# =================================================================== +# And this is a little reference for common ranger functions and objects: +# +# self.fm: A reference to the "fm" object which contains most information +# about ranger. +# self.fm.notify(string): Print the given string on the screen. +# self.fm.notify(string, bad=True): Print the given string in RED. +# self.fm.reload_cwd(): Reload the current working directory. +# self.fm.thisdir: The current working directory. (A File object.) +# self.fm.thisfile: The current file. (A File object too.) +# self.fm.thistab.get_selection(): A list of all selected files. +# self.fm.execute_console(string): Execute the string as a ranger command. +# self.fm.open_console(string): Open the console with the given string +# already typed in for you. +# self.fm.move(direction): Moves the cursor in the given direction, which +# can be something like down=3, up=5, right=1, left=1, to=6, ... +# +# File objects (for example self.fm.thisfile) have these useful attributes and +# methods: +# +# cf.path: The path to the file. +# cf.basename: The base name only. +# cf.load_content(): Force a loading of the directories content (which +# obviously works with directories only) +# cf.is_directory: True/False depending on whether it's a directory. +# +# For advanced commands it is unavoidable to dive a bit into the source code +# of ranger. +# =================================================================== + +from ranger.api.commands import * + +class alias(Command): + """:alias <newcommand> <oldcommand> + + Copies the oldcommand as newcommand. + """ + + context = 'browser' + resolve_macros = False + + def execute(self): + if not self.arg(1) or not self.arg(2): + self.fm.notify('Syntax: alias <newcommand> <oldcommand>', bad=True) + else: + self.fm.commands.alias(self.arg(1), self.rest(2)) + +class cd(Command): + """:cd [-r] <dirname> + + The cd command changes the directory. + The command 'cd -' is equivalent to typing ``. + Using the option "-r" will get you to the real path. + """ + + def execute(self): + import os.path + if self.arg(1) == '-r': + self.shift() + destination = os.path.realpath(self.rest(1)) + if os.path.isfile(destination): + destination = os.path.dirname(destination) + else: + destination = self.rest(1) + + if not destination: + destination = '~' + + if destination == '-': + self.fm.enter_bookmark('`') + else: + self.fm.cd(destination) + + def tab(self): + import os + from os.path import dirname, basename, expanduser, join + + cwd = self.fm.thisdir.path + rel_dest = self.rest(1) + + bookmarks = [v.path for v in self.fm.bookmarks.dct.values() + if rel_dest in v.path ] + + # expand the tilde into the user directory + if rel_dest.startswith('~'): + rel_dest = expanduser(rel_dest) + + # define some shortcuts + abs_dest = join(cwd, rel_dest) + abs_dirname = dirname(abs_dest) + rel_basename = basename(rel_dest) + rel_dirname = dirname(rel_dest) + + try: + # are we at the end of a directory? + if rel_dest.endswith('/') or rel_dest == '': + _, dirnames, _ = next(os.walk(abs_dest)) + + # are we in the middle of the filename? + else: + _, dirnames, _ = next(os.walk(abs_dirname)) + dirnames = [dn for dn in dirnames \ + if dn.startswith(rel_basename)] + except (OSError, StopIteration): + # os.walk found nothing + pass + else: + dirnames.sort() + dirnames = bookmarks + dirnames + + # no results, return None + if len(dirnames) == 0: + return + + # one result. since it must be a directory, append a slash. + if len(dirnames) == 1: + return self.start(1) + join(rel_dirname, dirnames[0]) + '/' + + # more than one result. append no slash, so the user can + # manually type in the slash to advance into that directory + return (self.start(1) + join(rel_dirname, dirname) for dirname in dirnames) + + +class chain(Command): + """:chain <command1>; <command2>; ... + + Calls multiple commands at once, separated by semicolons. + """ + def execute(self): + for command in self.rest(1).split(";"): + self.fm.execute_console(command) + + +class shell(Command): + escape_macros_for_shell = True + + def execute(self): + if self.arg(1) and self.arg(1)[0] == '-': + flags = self.arg(1)[1:] + command = self.rest(2) + else: + flags = '' + command = self.rest(1) + + if not command and 'p' in flags: + command = 'cat %f' + if command: + if '%' in command: + command = self.fm.substitute_macros(command, escape=True) + self.fm.execute_command(command, flags=flags) + + def tab(self): + from ranger.ext.get_executables import get_executables + if self.arg(1) and self.arg(1)[0] == '-': + command = self.rest(2) + else: + command = self.rest(1) + start = self.line[0:len(self.line) - len(command)] + + try: + position_of_last_space = command.rindex(" ") + except ValueError: + return (start + program + ' ' for program \ + in get_executables() if program.startswith(command)) + if position_of_last_space == len(command) - 1: + selection = self.fm.thistab.get_selection() + if len(selection) == 1: + return self.line + selection[0].shell_escaped_basename + ' ' + else: + return self.line + '%s ' + else: + before_word, start_of_word = self.line.rsplit(' ', 1) + return (before_word + ' ' + file.shell_escaped_basename \ + for file in self.fm.thisdir.files \ + if file.shell_escaped_basename.startswith(start_of_word)) + +class open_with(Command): + def execute(self): + app, flags, mode = self._get_app_flags_mode(self.rest(1)) + self.fm.execute_file( + files = [f for f in self.fm.thistab.get_selection()], + app = app, + flags = flags, + mode = mode) + + def tab(self): + return self._tab_through_executables() + + def _get_app_flags_mode(self, string): + """Extracts the application, flags and mode from a string. + + examples: + "mplayer f 1" => ("mplayer", "f", 1) + "aunpack 4" => ("aunpack", "", 4) + "p" => ("", "p", 0) + "" => None + """ + + app = '' + flags = '' + mode = 0 + split = string.split() + + if len(split) == 0: + pass + + elif len(split) == 1: + part = split[0] + if self._is_app(part): + app = part + elif self._is_flags(part): + flags = part + elif self._is_mode(part): + mode = part + + elif len(split) == 2: + part0 = split[0] + part1 = split[1] + + if self._is_app(part0): + app = part0 + if self._is_flags(part1): + flags = part1 + elif self._is_mode(part1): + mode = part1 + elif self._is_flags(part0): + flags = part0 + if self._is_mode(part1): + mode = part1 + elif self._is_mode(part0): + mode = part0 + if self._is_flags(part1): + flags = part1 + + elif len(split) >= 3: + part0 = split[0] + part1 = split[1] + part2 = split[2] + + if self._is_app(part0): + app = part0 + if self._is_flags(part1): + flags = part1 + if self._is_mode(part2): + mode = part2 + elif self._is_mode(part1): + mode = part1 + if self._is_flags(part2): + flags = part2 + elif self._is_flags(part0): + flags = part0 + if self._is_mode(part1): + mode = part1 + elif self._is_mode(part0): + mode = part0 + if self._is_flags(part1): + flags = part1 + + return app, flags, int(mode) + + def _is_app(self, arg): + return not self._is_flags(arg) and not arg.isdigit() + + def _is_flags(self, arg): + from ranger.core.runner import ALLOWED_FLAGS + return all(x in ALLOWED_FLAGS for x in arg) + + def _is_mode(self, arg): + return all(x in '0123456789' for x in arg) + + +class set_(Command): + """:set <option name>=<python expression> + + Gives an option a new value. + """ + name = 'set' # don't override the builtin set class + def execute(self): + name = self.arg(1) + name, value, _ = self.parse_setting_line() + self.fm.set_option_from_string(name, value) + + def tab(self): + name, value, name_done = self.parse_setting_line() + settings = self.fm.settings + if not name: + return sorted(self.firstpart + setting for setting in settings) + if not value and not name_done: + return (self.firstpart + setting for setting in settings \ + if setting.startswith(name)) + if not value: + return self.firstpart + str(settings[name]) + if bool in settings.types_of(name): + if 'true'.startswith(value.lower()): + return self.firstpart + 'True' + if 'false'.startswith(value.lower()): + return self.firstpart + 'False' + + +class setlocal(set_): + """:setlocal path=<python string> <option name>=<python expression> + + Gives an option a new value. + """ + PATH_RE = re.compile(r'^\s*path="?(.*?)"?\s*$') + def execute(self): + import os.path + match = self.PATH_RE.match(self.arg(1)) + if match: + path = os.path.normpath(os.path.expanduser(match.group(1))) + self.shift() + elif self.fm.thisdir: + path = self.fm.thisdir.path + else: + path = None + + if path: + name = self.arg(1) + name, value, _ = self.parse_setting_line() + self.fm.set_option_from_string(name, value, localpath=path) + + +class setintag(setlocal): + """:setintag <tag or tags> <option name>=<option value> + + Sets an option for directories that are tagged with a specific tag. + """ + def execute(self): + tags = self.arg(1) + self.shift() + name, value, _ = self.parse_setting_line() + self.fm.set_option_from_string(name, value, tags=tags) + + +class quit(Command): + """:quit + + Closes the current tab. If there is only one tab, quit the program. + """ + + def execute(self): + if len(self.fm.tabs) <= 1: + self.fm.exit() + self.fm.tab_close() + + +class quitall(Command): + """:quitall + + Quits the program immediately. + """ + + def execute(self): + self.fm.exit() + + +class quit_bang(quitall): + """:quit! + + Quits the program immediately. + """ + name = 'quit!' + allow_abbrev = False + + +class terminal(Command): + """:terminal + + Spawns an "x-terminal-emulator" starting in the current directory. + """ + def execute(self): + import os + from ranger.ext.get_executables import get_executables + command = os.environ.get('TERMCMD', os.environ.get('TERM')) + if command not in get_executables(): + command = 'x-terminal-emulator' + if command not in get_executables(): + command = 'xterm' + self.fm.run(command, flags='f') + + +class delete(Command): + """:delete + + Tries to delete the selection. + + "Selection" is defined as all the "marked files" (by default, you + can mark files with space or v). If there are no marked files, + use the "current file" (where the cursor is) + + When attempting to delete non-empty directories or multiple + marked files, it will require a confirmation. + """ + + allow_abbrev = False + + def execute(self): + import os + if self.rest(1): + self.fm.notify("Error: delete takes no arguments! It deletes " + "the selected file(s).", bad=True) + return + + cwd = self.fm.thisdir + cf = self.fm.thisfile + if not cwd or not cf: + self.fm.notify("Error: no file selected for deletion!", bad=True) + return + + confirm = self.fm.settings.confirm_on_delete + many_files = (cwd.marked_items or (cf.is_directory and not cf.is_link \ + and len(os.listdir(cf.path)) > 0)) + + if confirm != 'never' and (confirm != 'multiple' or many_files): + self.fm.ui.console.ask("Confirm deletion of: %s (y/N)" % + ', '.join(f.basename for f in self.fm.thistab.get_selection()), + self._question_callback, ('n', 'N', 'y', 'Y')) + else: + # no need for a confirmation, just delete + self.fm.delete() + + def _question_callback(self, answer): + if answer == 'y' or answer == 'Y': + self.fm.delete() + + +class mark_tag(Command): + """:mark_tag [<tags>] + + Mark all tags that are tagged with either of the given tags. + When leaving out the tag argument, all tagged files are marked. + """ + do_mark = True + + def execute(self): + cwd = self.fm.thisdir + tags = self.rest(1).replace(" ","") + if not self.fm.tags: + return + for fileobj in cwd.files: + try: + tag = self.fm.tags.tags[fileobj.realpath] + except KeyError: + continue + if not tags or tag in tags: + cwd.mark_item(fileobj, val=self.do_mark) + self.fm.ui.status.need_redraw = True + self.fm.ui.need_redraw = True + + +class console(Command): + """:console <command> + + Open the console with the given command. + """ + def execute(self): + position = None + if self.arg(1)[0:2] == '-p': + try: + position = int(self.arg(1)[2:]) + self.shift() + except: + pass + self.fm.open_console(self.rest(1), position=position) + + +class load_copy_buffer(Command): + """:load_copy_buffer + + Load the copy buffer from confdir/copy_buffer + """ + copy_buffer_filename = 'copy_buffer' + def execute(self): + from ranger.container.file import File + from os.path import exists + try: + fname = self.fm.confpath(self.copy_buffer_filename) + f = open(fname, 'r') + except: + return self.fm.notify("Cannot open %s" % \ + (fname or self.copy_buffer_filename), bad=True) + self.fm.copy_buffer = set(File(g) \ + for g in f.read().split("\n") if exists(g)) + f.close() + self.fm.ui.redraw_main_column() + + +class save_copy_buffer(Command): + """:save_copy_buffer + + Save the copy buffer to confdir/copy_buffer + """ + copy_buffer_filename = 'copy_buffer' + def execute(self): + fname = None + try: + fname = self.fm.confpath(self.copy_buffer_filename) + f = open(fname, 'w') + except: + return self.fm.notify("Cannot open %s" % \ + (fname or self.copy_buffer_filename), bad=True) + f.write("\n".join(f.path for f in self.fm.copy_buffer)) + f.close() + + +class unmark_tag(mark_tag): + """:unmark_tag [<tags>] + + Unmark all tags that are tagged with either of the given tags. + When leaving out the tag argument, all tagged files are unmarked. + """ + do_mark = False + + +class mkdir(Command): + """:mkdir <dirname> + + Creates a directory with the name <dirname>. + """ + + def execute(self): + from os.path import join, expanduser, lexists + from os import mkdir + + dirname = join(self.fm.thisdir.path, expanduser(self.rest(1))) + if not lexists(dirname): + mkdir(dirname) + else: + self.fm.notify("file/directory exists!", bad=True) + + def tab(self): + return self._tab_directory_content() + + +class touch(Command): + """:touch <fname> + + Creates a file with the name <fname>. + """ + + def execute(self): + from os.path import join, expanduser, lexists + + fname = join(self.fm.thisdir.path, expanduser(self.rest(1))) + if not lexists(fname): + open(fname, 'a').close() + else: + self.fm.notify("file/directory exists!", bad=True) + + def tab(self): + return self._tab_directory_content() + + +class edit(Command): + """:edit <filename> + + Opens the specified file in vim + """ + + def execute(self): + if not self.arg(1): + self.fm.edit_file(self.fm.thisfile.path) + else: + self.fm.edit_file(self.rest(1)) + + def tab(self): + return self._tab_directory_content() + + +class eval_(Command): + """:eval [-q] <python code> + + Evaluates the python code. + `fm' is a reference to the FM instance. + To display text, use the function `p'. + + Examples: + :eval fm + :eval len(fm.directories) + :eval p("Hello World!") + """ + name = 'eval' + resolve_macros = False + + def execute(self): + if self.arg(1) == '-q': + code = self.rest(2) + quiet = True + else: + code = self.rest(1) + quiet = False + import ranger + global cmd, fm, p, quantifier + fm = self.fm + cmd = self.fm.execute_console + p = fm.notify + quantifier = self.quantifier + try: + try: + result = eval(code) + except SyntaxError: + exec(code) + else: + if result and not quiet: + p(result) + except Exception as err: + p(err) + + +class rename(Command): + """:rename <newname> + + Changes the name of the currently highlighted file to <newname> + """ + + def execute(self): + from ranger.container.file import File + from os import access + + new_name = self.rest(1) + + if not new_name: + return self.fm.notify('Syntax: rename <newname>', bad=True) + + if new_name == self.fm.thisfile.basename: + return + + if access(new_name, os.F_OK): + return self.fm.notify("Can't rename: file already exists!", bad=True) + + self.fm.rename(self.fm.thisfile, new_name) + f = File(new_name) + self.fm.thisdir.pointed_obj = f + self.fm.thisfile = f + + def tab(self): + return self._tab_directory_content() + + +class chmod(Command): + """:chmod <octal number> + + Sets the permissions of the selection to the octal number. + + The octal number is between 0 and 777. The digits specify the + permissions for the user, the group and others. + + A 1 permits execution, a 2 permits writing, a 4 permits reading. + Add those numbers to combine them. So a 7 permits everything. + """ + + def execute(self): + mode = self.rest(1) + if not mode: + mode = str(self.quantifier) + + try: + mode = int(mode, 8) + if mode < 0 or mode > 0o777: + raise ValueError + except ValueError: + self.fm.notify("Need an octal number between 0 and 777!", bad=True) + return + + for file in self.fm.thistab.get_selection(): + try: + os.chmod(file.path, mode) + except Exception as ex: + self.fm.notify(ex) + + try: + # reloading directory. maybe its better to reload the selected + # files only. + self.fm.thisdir.load_content() + except: + pass + + +class bulkrename(Command): + """:bulkrename + + This command opens a list of selected files in an external editor. + After you edit and save the file, it will generate a shell script + which does bulk renaming according to the changes you did in the file. + + This shell script is opened in an editor for you to review. + After you close it, it will be executed. + """ + def execute(self): + import sys + import tempfile + from ranger.container.file import File + from ranger.ext.shell_escape import shell_escape as esc + py3 = sys.version > "3" + + # Create and edit the file list + filenames = [f.basename for f in self.fm.thistab.get_selection()] + listfile = tempfile.NamedTemporaryFile() + + if py3: + listfile.write("\n".join(filenames).encode("utf-8")) + else: + listfile.write("\n".join(filenames)) + listfile.flush() + self.fm.execute_file([File(listfile.name)], app='editor') + listfile.seek(0) + if py3: + new_filenames = listfile.read().decode("utf-8").split("\n") + else: + new_filenames = listfile.read().split("\n") + listfile.close() + if all(a == b for a, b in zip(filenames, new_filenames)): + self.fm.notify("No renaming to be done!") + return + + # Generate and execute script + cmdfile = tempfile.NamedTemporaryFile() + cmdfile.write(b"# This file will be executed when you close the editor.\n") + cmdfile.write(b"# Please double-check everything, clear the file to abort.\n") + if py3: + cmdfile.write("\n".join("mv -vi -- " + esc(old) + " " + esc(new) \ + for old, new in zip(filenames, new_filenames) \ + if old != new).encode("utf-8")) + else: + cmdfile.write("\n".join("mv -vi -- " + esc(old) + " " + esc(new) \ + for old, new in zip(filenames, new_filenames) if old != new)) + cmdfile.flush() + self.fm.execute_file([File(cmdfile.name)], app='editor') + self.fm.run(['/bin/sh', cmdfile.name], flags='w') + cmdfile.close() + + +class relink(Command): + """:relink <newpath> + + Changes the linked path of the currently highlighted symlink to <newpath> + """ + + def execute(self): + from ranger.container.file import File + + new_path = self.rest(1) + cf = self.fm.thisfile + + if not new_path: + return self.fm.notify('Syntax: relink <newpath>', bad=True) + + if not cf.is_link: + return self.fm.notify('%s is not a symlink!' % cf.basename, bad=True) + + if new_path == os.readlink(cf.path): + return + + try: + os.remove(cf.path) + os.symlink(new_path, cf.path) + except OSError as err: + self.fm.notify(err) + + self.fm.reset() + self.fm.thisdir.pointed_obj = cf + self.fm.thisfile = cf + + def tab(self): + if not self.rest(1): + return self.line+os.readlink(self.fm.thisfile.path) + else: + return self._tab_directory_content() + + +class help_(Command): + """:help + + Display ranger's manual page. + """ + name = 'help' + def execute(self): + if self.quantifier == 1: + self.fm.dump_keybindings() + elif self.quantifier == 2: + self.fm.dump_commands() + elif self.quantifier == 3: + self.fm.dump_settings() + else: + self.fm.display_help() + + +class copymap(Command): + """:copymap <keys> <newkeys1> [<newkeys2>...] + + Copies a "browser" keybinding from <keys> to <newkeys> + """ + context = 'browser' + + def execute(self): + if not self.arg(1) or not self.arg(2): + return self.fm.notify("Not enough arguments", bad=True) + + for arg in self.args[2:]: + self.fm.ui.keymaps.copy(self.context, self.arg(1), arg) + + +class copypmap(copymap): + """:copypmap <keys> <newkeys1> [<newkeys2>...] + + Copies a "pager" keybinding from <keys> to <newkeys> + """ + context = 'pager' + + +class copycmap(copymap): + """:copycmap <keys> <newkeys1> [<newkeys2>...] + + Copies a "console" keybinding from <keys> to <newkeys> + """ + context = 'console' + + +class copytmap(copymap): + """:copycmap <keys> <newkeys1> [<newkeys2>...] + + Copies a "taskview" keybinding from <keys> to <newkeys> + """ + context = 'taskview' + + +class unmap(Command): + """:unmap <keys> [<keys2>, ...] + + Remove the given "browser" mappings + """ + context = 'browser' + + def execute(self): + for arg in self.args[1:]: + self.fm.ui.keymaps.unbind(self.context, arg) + + +class cunmap(unmap): + """:cunmap <keys> [<keys2>, ...] + + Remove the given "console" mappings + """ + context = 'browser' + + +class punmap(unmap): + """:punmap <keys> [<keys2>, ...] + + Remove the given "pager" mappings + """ + context = 'pager' + + +class tunmap(unmap): + """:tunmap <keys> [<keys2>, ...] + + Remove the given "taskview" mappings + """ + context = 'taskview' + + +class map_(Command): + """:map <keysequence> <command> + + Maps a command to a keysequence in the "browser" context. + + Example: + map j move down + map J move down 10 + """ + name = 'map' + context = 'browser' + resolve_macros = False + + def execute(self): + self.fm.ui.keymaps.bind(self.context, self.arg(1), self.rest(2)) + + +class cmap(map_): + """:cmap <keysequence> <command> + + Maps a command to a keysequence in the "console" context. + + Example: + cmap <ESC> console_close + cmap <C-x> console_type test + """ + context = 'console' + + +class tmap(map_): + """:tmap <keysequence> <command> + + Maps a command to a keysequence in the "taskview" context. + """ + context = 'taskview' + + +class pmap(map_): + """:pmap <keysequence> <command> + + Maps a command to a keysequence in the "pager" context. + """ + context = 'pager' + + +class scout(Command): + """:scout [-FLAGS] <pattern> + + Swiss army knife command for searching, traveling and filtering files. + The command takes various flags as arguments which can be used to + influence its behaviour: + + -a = automatically open a file on unambiguous match + -e = open the selected file when pressing enter + -f = filter files that match the current search pattern + -g = interpret pattern as a glob pattern + -i = ignore the letter case of the files + -k = keep the console open when changing a directory with the command + -l = letter skipping; e.g. allow "rdme" to match the file "readme" + -m = mark the matching files after pressing enter + -M = unmark the matching files after pressing enter + -p = permanent filter: hide non-matching files after pressing enter + -s = smart case; like -i unless pattern contains upper case letters + -t = apply filter and search pattern as you type + -v = inverts the match + + Multiple flags can be combined. For example, ":scout -gpt" would create + a :filter-like command using globbing. + """ + AUTO_OPEN = 'a' + OPEN_ON_ENTER = 'e' + FILTER = 'f' + SM_GLOB = 'g' + IGNORE_CASE = 'i' + KEEP_OPEN = 'k' + SM_LETTERSKIP = 'l' + MARK = 'm' + UNMARK = 'M' + PERM_FILTER = 'p' + SM_REGEX = 'r' + SMART_CASE = 's' + AS_YOU_TYPE = 't' + INVERT = 'v' + + def __init__(self, *args, **kws): + Command.__init__(self, *args, **kws) + self._regex = None + self.flags, self.pattern = self.parse_flags() + + def execute(self): + thisdir = self.fm.thisdir + flags = self.flags + pattern = self.pattern + regex = self._build_regex() + count = self._count(move=True) + + self.fm.thistab.last_search = regex + self.fm.set_search_method(order="search") + + if self.MARK in flags or self.UNMARK in flags: + value = flags.find(self.MARK) > flags.find(self.UNMARK) + if self.FILTER in flags: + for f in thisdir.files: + thisdir.mark_item(f, value) + else: + for f in thisdir.files: + if regex.search(f.basename): + thisdir.mark_item(f, value) + + if self.PERM_FILTER in flags: + thisdir.filter = regex if pattern else None + + # clean up: + self.cancel() + + if self.OPEN_ON_ENTER in flags or \ + self.AUTO_OPEN in flags and count == 1: + if os.path.exists(pattern): + self.fm.cd(pattern) + else: + self.fm.move(right=1) + + if self.KEEP_OPEN in flags and thisdir != self.fm.thisdir: + # reopen the console: + self.fm.open_console(self.line[0:-len(pattern)]) + + if thisdir != self.fm.thisdir and pattern != "..": + self.fm.block_input(0.5) + + def cancel(self): + self.fm.thisdir.temporary_filter = None + self.fm.thisdir.refilter() + + def quick(self): + asyoutype = self.AS_YOU_TYPE in self.flags + if self.FILTER in self.flags: + self.fm.thisdir.temporary_filter = self._build_regex() + if self.PERM_FILTER in self.flags and asyoutype: + self.fm.thisdir.filter = self._build_regex() + if self.FILTER in self.flags or self.PERM_FILTER in self.flags: + self.fm.thisdir.refilter() + if self._count(move=asyoutype) == 1 and self.AUTO_OPEN in self.flags: + return True + return False + + def tab(self): + self._count(move=True, offset=1) + + def _build_regex(self): + if self._regex is not None: + return self._regex + + frmat = "%s" + flags = self.flags + pattern = self.pattern + + if pattern == ".": + return re.compile("") + + # Handle carets at start and dollar signs at end separately + if pattern.startswith('^'): + pattern = pattern[1:] + frmat = "^" + frmat + if pattern.endswith('$'): + pattern = pattern[:-1] + frmat += "$" + + # Apply one of the search methods + if self.SM_REGEX in flags: + regex = pattern + elif self.SM_GLOB in flags: + regex = re.escape(pattern).replace("\\*", ".*").replace("\\?", ".") + elif self.SM_LETTERSKIP in flags: + regex = ".*".join(re.escape(c) for c in pattern) + else: + regex = re.escape(pattern) + + regex = frmat % regex + + # Invert regular expression if necessary + if self.INVERT in flags: + regex = "^(?:(?!%s).)*$" % regex + + # Compile Regular Expression + options = re.LOCALE | re.UNICODE + if self.IGNORE_CASE in flags or self.SMART_CASE in flags and \ + pattern.islower(): + options |= re.IGNORECASE + try: + self._regex = re.compile(regex, options) + except: + self._regex = re.compile("") + return self._regex + + def _count(self, move=False, offset=0): + count = 0 + cwd = self.fm.thisdir + pattern = self.pattern + + if not pattern: + return 0 + if pattern == '.': + return 0 + if pattern == '..': + return 1 + + deq = deque(cwd.files) + deq.rotate(-cwd.pointer - offset) + i = offset + regex = self._build_regex() + for fsobj in deq: + if regex.search(fsobj.basename): + count += 1 + if move and count == 1: + cwd.move(to=(cwd.pointer + i) % len(cwd.files)) + self.fm.thisfile = cwd.pointed_obj + if count > 1: + return count + i += 1 + + return count == 1 + + +class grep(Command): + """:grep <string> + + Looks for a string in all marked files or directories + """ + + def execute(self): + if self.rest(1): + action = ['grep', '--line-number'] + action.extend(['-e', self.rest(1), '-r']) + action.extend(f.path for f in self.fm.thistab.get_selection()) + self.fm.execute_command(action, flags='p') + + +# Version control commands +# -------------------------------- +class stage(Command): + """ + :stage + + Stage selected files for the corresponding version control system + """ + def execute(self): + from ranger.ext.vcs import VcsError + + filelist = [f.path for f in self.fm.thistab.get_selection()] + self.fm.thisdir.vcs_outdated = True +# for f in self.fm.thistab.get_selection(): +# f.vcs_outdated = True + + try: + self.fm.thisdir.vcs.add(filelist) + except VcsError: + self.fm.notify("Could not stage files.") + + self.fm.reload_cwd() + + +class unstage(Command): + """ + :unstage + + Unstage selected files for the corresponding version control system + """ + def execute(self): + from ranger.ext.vcs import VcsError + + filelist = [f.path for f in self.fm.thistab.get_selection()] + self.fm.thisdir.vcs_outdated = True +# for f in self.fm.thistab.get_selection(): +# f.vcs_outdated = True + + try: + self.fm.thisdir.vcs.reset(filelist) + except VcsError: + self.fm.notify("Could not unstage files.") + + self.fm.reload_cwd() + + +class diff(Command): + """ + :diff + + Displays a diff of selected files against last last commited version + """ + def execute(self): + from ranger.ext.vcs import VcsError + import tempfile + + L = self.fm.thistab.get_selection() + if len(L) == 0: return + + filelist = [f.path for f in L] + vcs = L[0].vcs + + diff = vcs.get_raw_diff(filelist=filelist) + if len(diff.strip()) > 0: + tmp = tempfile.NamedTemporaryFile() + tmp.write(diff.encode('utf-8')) + tmp.flush() + + pager = os.environ.get('PAGER', ranger.DEFAULT_PAGER) + self.fm.run([pager, tmp.name]) + else: + raise Exception("diff is empty") + + +class log(Command): + """ + :log + + Displays the log of the current repo or files + """ + def execute(self): + from ranger.ext.vcs import VcsError + import tempfile + + L = self.fm.thistab.get_selection() + if len(L) == 0: return + + filelist = [f.path for f in L] + vcs = L[0].vcs + + log = vcs.get_raw_log(filelist=filelist) + tmp = tempfile.NamedTemporaryFile() + tmp.write(log.encode('utf-8')) + tmp.flush() + + pager = os.environ.get('PAGER', ranger.DEFAULT_PAGER) + self.fm.run([pager, tmp.name]) diff --git a/ranger/.config/ranger/commands.pyo b/ranger/.config/ranger/commands.pyo Binary files differ. diff --git a/ranger/.config/ranger/history b/ranger/.config/ranger/history @@ -0,0 +1,9 @@ +search +open_with unzip +find +search ranger +search dotfile +sxiv bind +open_with sxiv +set show_hidden=true + diff --git a/ranger/.config/ranger/rc.conf b/ranger/.config/ranger/rc.conf @@ -0,0 +1,11 @@ +# █████ +# ██████ ██████ ███████ ██░░░██ █████ ██████ +# ░░██░░█ ░░░░░░██ ░░██░░░██░██ ░██ ██░░░██░░██░░█ +# ░██ ░ ███████ ░██ ░██░░██████░███████ ░██ ░ +# ░██ ██░░░░██ ░██ ░██ ░░░░░██░██░░░░ ░██ +# ░███ ░░████████ ███ ░██ █████ ░░██████░███ +# ░░░ ░░░░░░░░ ░░░ ░░ ░░░░░ ░░░░░░ ░░░ +set show_hidden true +set colorscheme z3bratabs +set preview_images true +set draw_borders true +\ No newline at end of file diff --git a/ranger/.config/ranger/rifle.conf b/ranger/.config/ranger/rifle.conf @@ -0,0 +1,2 @@ +mime ^image, has eog, X, flag f = sxiv -- "$@" +ext gif, has gifview, X, flag a = gifview -- "$@" diff --git a/ranger/.config/ranger/scope.sh b/ranger/.config/ranger/scope.sh @@ -0,0 +1,84 @@ +#!/usr/bin/env sh +# ranger supports enhanced previews. If the option "use_preview_script" +# is set to True and this file exists, this script will be called and its +# output is displayed in ranger. ANSI color codes are supported. + +# NOTES: This script is considered a configuration file. If you upgrade +# ranger, it will be left untouched. (You must update it yourself.) +# Also, ranger disables STDIN here, so interactive scripts won't work properly + +# Meanings of exit codes: +# code | meaning | action of ranger +# -----+------------+------------------------------------------- +# 0 | success | success. display stdout as preview +# 1 | no preview | failure. display no preview at all +# 2 | plain text | display the plain content of the file +# 3 | fix width | success. Don't reload when width changes +# 4 | fix height | success. Don't reload when height changes +# 5 | fix both | success. Don't ever reload + +# Meaningful aliases for arguments: +path="$1" # Full path of the selected file +width="$2" # Width of the preview pane (number of fitting characters) +height="$3" # Height of the preview pane (number of fitting characters) + +maxln=200 # Stop after $maxln lines. Can be used like ls | head -n $maxln + +# Find out something about the file: +mimetype=$(file --mime-type -Lb "$path") +extension=${path##*.} + +# Functions: +# runs a command and saves its output into $output. Useful if you need +# the return value AND want to use the output in a pipe +try() { output=$(eval '"$@"'); } + +# writes the output of the previouosly used "try" command +dump() { echo "$output"; } + +# a common post-processing function used after most commands +trim() { head -n "$maxln"; } + +# wraps highlight to treat exit code 141 (killed by SIGPIPE) as success +highlight() { command highlight "$@"; test $? = 0 -o $? = 141; } + +case "$extension" in + # Archive extensions: + 7z|a|ace|alz|arc|arj|bz|bz2|cab|cpio|deb|gz|jar|lha|lz|lzh|lzma|lzo|\ + rpm|rz|t7z|tar|tbz|tbz2|tgz|tlz|txz|tZ|tzo|war|xpi|xz|Z|zip) + try als "$path" && { dump | trim; exit 0; } + try acat "$path" && { dump | trim; exit 3; } + try bsdtar -lf "$path" && { dump | trim; exit 0; } + exit 1;; + rar) + try unrar -p- lt "$path" && { dump | trim; exit 0; } || exit 1;; + # PDF documents: + pdf) + try pdftotext -l 10 -nopgbrk -q "$path" - && \ + { dump | trim | fmt -s -w $width; exit 0; } || exit 1;; + # BitTorrent Files + torrent) + try transmission-show "$path" && { dump | trim; exit 5; } || exit 1;; + # HTML Pages: + htm|html|xhtml) + try w3m -dump "$path" && { dump | trim | fmt -s -w $width; exit 4; } + try lynx -dump "$path" && { dump | trim | fmt -s -w $width; exit 4; } + try elinks -dump "$path" && { dump | trim | fmt -s -w $width; exit 4; } + ;; # fall back to highlight/cat if the text browsers fail +esac + +case "$mimetype" in + # Syntax highlight for text files: + text/* | */xml) + try highlight --out-format=ansi "$path" && { dump | trim; exit 5; } || exit 2;; + # Ascii-previews of images: + image/*) + img2txt --gamma=0.6 --width="$width" "$path" && exit 4 || exit 1;; + # Display information about media files: + video/* | audio/*) + exiftool "$path" && exit 5 + # Use sed to remove spaces so the output fits into the narrow window + try mediainfo "$path" && { dump | trim | sed 's/ \+:/: /;'; exit 5; } || exit 1;; +esac + +exit 1 diff --git a/ranger/.config/ranger/tagged b/ranger/.config/ranger/tagged diff --git a/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/Batman.tmTheme b/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/Batman.tmTheme @@ -0,0 +1,389 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>name</key> + <string>Batman</string> + <key>settings</key> + <array> + <dict> + <key>settings</key> + <dict> + <key>background</key> + <string>#000000</string> + <key>caret</key> + <string>#F8F8F0</string> + <key>foreground</key> + <string>#666666</string> + <key>invisibles</key> + <string>#3B3A32</string> + <key>lineHighlight</key> + <string>#3E3D32</string> + <key>selection</key> + <string>#49483E</string> + <key>findHighlight</key> + <string>#FFE792</string> + <key>findHighlightForeground</key> + <string>#000000</string> + <key>selectionBorder</key> + <string>#222218</string> + <key>activeGuide</key> + <string>#9D550FB0</string> + + <key>bracketsForeground</key> + <string>#F8F8F2A5</string> + <key>bracketsOptions</key> + <string>underline</string> + + <key>bracketContentsForeground</key> + <string>#F8F8F2A5</string> + <key>bracketContentsOptions</key> + <string>underline</string> + + <key>tagsOptions</key> + <string>stippled_underline</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Comment</string> + <key>scope</key> + <string>comment</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#000000</string> + <key>background</key> + <string>#666666</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>String</string> + <key>scope</key> + <string>string</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#ffb200</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Number</string> + <key>scope</key> + <string>constant.numeric</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#7da2fa</string> + </dict> + </dict> + + <dict> + <key>name</key> + <string>Built-in constant</string> + <key>scope</key> + <string>constant.language</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#7da2fa</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>User-defined constant</string> + <key>scope</key> + <string>constant.character, constant.other</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#7da2fa</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Variable</string> + <key>scope</key> + <string>variable</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Keyword</string> + <key>scope</key> + <string>keyword</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#AE81FF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Storage</string> + <key>scope</key> + <string>storage</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#7da2fa</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Storage type</string> + <key>scope</key> + <string>storage.type</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>italic</string> + <key>foreground</key> + <string>#7da2fa</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Class name</string> + <key>scope</key> + <string>entity.name.class</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>underline</string> + <key>foreground</key> + <string>#27b9b1</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Inherited class</string> + <key>scope</key> + <string>entity.other.inherited-class</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>italic underline</string> + <key>foreground</key> + <string>#27b9b1</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Function name</string> + <key>scope</key> + <string>entity.name.function</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#27b9b1</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Function argument</string> + <key>scope</key> + <string>variable.parameter</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>italic</string> + <key>foreground</key> + <string>#AE81FF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Tag name</string> + <key>scope</key> + <string>entity.name.tag</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#AE81FF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Tag attribute</string> + <key>scope</key> + <string>entity.other.attribute-name</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#27b9b1</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Library function</string> + <key>scope</key> + <string>support.function</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#27b9b1</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Library constant</string> + <key>scope</key> + <string>support.constant</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#27b9b1</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Library class/type</string> + <key>scope</key> + <string>support.type, support.class</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>italic</string> + <key>foreground</key> + <string>#27b9b1</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Library variable</string> + <key>scope</key> + <string>support.other.variable</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Invalid</string> + <key>scope</key> + <string>invalid</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#F92672</string> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#27b9b1</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Invalid deprecated</string> + <key>scope</key> + <string>invalid.deprecated</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#AE81FF</string> + <key>foreground</key> + <string>#27b9b1</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>JSON String</string> + <key>scope</key> + <string>meta.structure.dictionary.json string.quoted.double.json</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#ffb200</string> + </dict> + </dict> + + <dict> + <key>name</key> + <string>diff.header</string> + <key>scope</key> + <string>meta.diff, meta.diff.header</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#27b9b1</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>diff.deleted</string> + <key>scope</key> + <string>markup.deleted</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#27b9b1</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>diff.inserted</string> + <key>scope</key> + <string>markup.inserted</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#27b9b1</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>diff.changed</string> + <key>scope</key> + <string>markup.changed</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#27b9b1</string> + </dict> + </dict> + + <dict> + <key>scope</key> + <string>constant.numeric.line-number.find-in-files - match</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#27b9b1</string> + </dict> + </dict> + <dict> + <key>scope</key> + <string>entity.name.filename.find-in-files</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#27b9b1</string> + </dict> + </dict> + + </array> + <key>uuid</key> + <string>18e447ed-dcbd-40a0-8ece-d1bc27790949</string> +</dict> +</plist> diff --git a/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/Batman.tmTheme.cache b/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/Batman.tmTheme.cache Binary files differ. diff --git a/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/Bliss.tmTheme b/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/Bliss.tmTheme @@ -0,0 +1,196 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<!-- Generated by: TmTheme-Editor --> +<!-- ============================================ --> +<!-- app: http://tmtheme-editor.herokuapp.com --> +<!-- code: https://github.com/aziz/tmTheme-Editor --> +<plist version="1.0"> +<dict> + <key>comment</key> + <string>http://github.com/saadq</string> + <key>name</key> + <string>Bliss</string> + <key>settings</key> + <array> + <dict> + <key>settings</key> + <dict> + <key>background</key> + <string>#0b0b0b</string> + <key>caret</key> + <string>#AEAFAD</string> + <key>foreground</key> + <string>#d9d9d9</string> + <key>invisibles</key> + <string>#4B4E55</string> + <key>lineHighlight</key> + <string>#282A2E</string> + <key>selection</key> + <string>#373B41</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Comment</string> + <key>scope</key> + <string>comment</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#4f6d82</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Foreground</string> + <key>scope</key> + <string>keyword.operator.class, constant.other, source.php.embedded.line</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#CED1CF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Variable, String Link, Regular Expression, Tag Name</string> + <key>scope</key> + <string>variable, support.other.variable, string.other.link, string.regexp, entity.name.tag, entity.other.attribute-name, meta.tag, declaration.tag</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#abfdd8</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Number, Constant, Function Argument, Tag Attribute, Embedded</string> + <key>scope</key> + <string>constant.numeric, constant.language, support.constant, constant.character, variable.parameter, punctuation.section.embedded, keyword.other.unit</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#98a6dd</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Class, Support</string> + <key>scope</key> + <string>entity.name.class, entity.name.type.class, support.type, support.class</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#efabec</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>String, Symbols, Inherited Class, Markup Heading</string> + <key>scope</key> + <string>string, constant.other.symbol, entity.other.inherited-class, markup.heading</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#99e1df</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Operator, Misc</string> + <key>scope</key> + <string>keyword.operator, constant.other.color</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#8dd9d9</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Function, Special Method, Block Level</string> + <key>scope</key> + <string>entity.name.function, meta.function-call, support.function, keyword.other.special-method, meta.block-level</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#3bb1df</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Keyword, Storage</string> + <key>scope</key> + <string>keyword, storage, storage.type, entity.name.tag.css</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#64fbc8</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Invalid</string> + <key>scope</key> + <string>invalid</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#DF5F5F</string> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#CED2CF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Separator</string> + <key>scope</key> + <string>meta.separator</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#82A3BF</string> + <key>foreground</key> + <string>#CED2CF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Deprecated</string> + <key>scope</key> + <string>invalid.deprecated</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#B798BF</string> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#CED2CF</string> + </dict> + </dict> + </array> + <key>uuid</key> + <string>F96223EB-1A60-4617-92F3-D24D4F13DB09</string> + <key>colorSpaceName</key> + <string>sRGB</string> + <key>semanticClass</key> + <string>theme.dark.bliss</string> + <key>author</key> + <string>Saad Quadri</string> +</dict> +</plist> +\ No newline at end of file diff --git a/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/Bliss.tmTheme.cache b/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/Bliss.tmTheme.cache Binary files differ. diff --git a/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/Coffee_Dark_Roast.tmTheme b/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/Coffee_Dark_Roast.tmTheme @@ -0,0 +1,409 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!--********************************************************************** +Coffee Dark Roast Theme v1.0 +https://github.com/Toddses/coffee +A Sublime Text 2 & 3 / Textmate theme. +Copyright (c) 2014 Todd Miller +Released under the Creative Commons Attribution-ShareAlike 3.0 License <http://creativecommons.org/licenses/by-sa/3.0/> +***********************************************************************--> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>author</key> + <string>Todd Miller</string> + <key>comment</key> + <string>Original Textmate / Sublime Text earth tone theme with dedicated syntax highlighting for YAML, JSON.</string> + <key>name</key> + <string>Coffee Dark Roast Sublime Theme</string> + <key>semanticClass</key> + <string>theme.coffee.darkroast</string> + <key>settings</key> + <array> + <dict> + <key>settings</key> + <dict> + <key>background</key> + <string>#0F0700</string> + <key>bracketContentsForeground</key> + <string>#B90900</string> + <key>bracketContentsOptions</key> + <string>underline</string> + <key>bracketsForeground</key> + <string>#B90900</string> + <key>bracketsOptions</key> + <string>underline</string> + <key>caret</key> + <string>#FFF2CF</string> + <key>findHighlight</key> + <string>#796D47</string> + <key>findHighlightForeground</key> + <string>#FFF2CF</string> + <key>foreground</key> + <string>#FFF2CF</string> + <key>invisibles</key> + <string>#000000</string> + <key>lineHighlight</key> + <string>#4F4117</string> + <key>selection</key> + <string>#796D47</string> + <key>selectionBorder</key> + <string>#BCB291</string> + <key>tagsForeground</key> + <string>#B90900</string> + <key>tagsOptions</key> + <string>underline</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Comment</string> + <key>scope</key> + <string>comment</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>italic</string> + <key>foreground</key> + <string>#4A4A4A</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Constant</string> + <key>scope</key> + <string>constant</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#074C76</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Entity</string> + <key>scope</key> + <string>entity</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#dc5f37</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Invalid</string> + <key>scope</key> + <string>invalid</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#B90900</string> + <key>border</key> + <string>#DC3F37</string> + <key>foreground</key> + <string>#FFF2CF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Keyword</string> + <key>scope</key> + <string>keyword</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#B96600</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Markup</string> + <key>scope</key> + <string>markup</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#8B3C23</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Storage</string> + <key>scope</key> + <string>storage</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#8B5C23</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>String</string> + <key>scope</key> + <string>string</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#DC9237</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Support</string> + <key>scope</key> + <string>support</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#DCBC63</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Variable</string> + <key>scope</key> + <string>variable</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#B92D00</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Class Name</string> + <key>scope</key> + <string>entity.name.type</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#5A96BA</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Class Inherited</string> + <key>scope</key> + <string>entity.other.inherited-class</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>italic</string> + <key>foreground</key> + <string>#5A96BA</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Constant Number</string> + <key>scope</key> + <string>constant.numeric</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#074C76</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Constant Built-In</string> + <key>scope</key> + <string>constant.language</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#074C76</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Constant User-Defined</string> + <key>scope</key> + <string>constant.character, constant.other</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#074C76</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Invalid Deprecated</string> + <key>scope</key> + <string>invalid.deprecated</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#781d00</string> + <key>foreground</key> + <string>#FFF2CF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Function Name</string> + <key>scope</key> + <string>entity.name.function</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#B98800</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Function Argument</string> + <key>scope</key> + <string>variable.parameter</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>italic</string> + <key>foreground</key> + <string>#B92D00</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Library Class</string> + <key>scope</key> + <string>support.class</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#5A96BA</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Library Constant</string> + <key>scope</key> + <string>support.constant</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#074C76</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Library Function</string> + <key>scope</key> + <string>support.function</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#B98800</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Library Variable</string> + <key>scope</key> + <string>support.variable</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#B92D00</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Storage Type</string> + <key>scope</key> + <string>storage.type</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#8B5C23</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Tag Name</string> + <key>scope</key> + <string>entity.name.tag</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>bold</string> + <key>foreground</key> + <string>#8B3C23</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Tag Attribute</string> + <key>scope</key> + <string>entity.other.attribute-name</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>italic</string> + <key>foreground</key> + <string>#DC5F37</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Find in Files Line Number</string> + <key>scope</key> + <string>constant.numeric.line-number.find-in-files - match</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>italic</string> + <key>foreground</key> + <string>#02314D</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>YAML Tag Name</string> + <key>scope</key> + <string>entity.name.tag.yaml</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>none</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>JSON Punctuation</string> + <key>scope</key> + <string>punctuation.definition.string.begin.json - meta.structure.dictionary.value.json, punctuation.definition.string.end.json - meta.structure.dictionary.value.json</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#FFF2CF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>JSON String</string> + <key>scope</key> + <string>meta.structure.dictionary.value.json string.quoted.double.json</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#DC9237</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>JSON Structure</string> + <key>scope</key> + <string>meta.structure.dictionary.json string.quoted.double.json</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#8B3C23</string> + </dict> + </dict> + </array> + <key>uuid</key> + <string>48e51dc9-e4a4-4563-b9d9-a21fd18c4c7f</string> +</dict> +</plist> diff --git a/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/Coffee_Dark_Roast.tmTheme.cache b/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/Coffee_Dark_Roast.tmTheme.cache Binary files differ. diff --git a/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/Green.tmTheme b/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/Green.tmTheme @@ -0,0 +1,152 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>name</key> + <string>Green</string> + <key>settings</key> + <array> + <dict> + <key>settings</key> + <dict> + <key>background</key> + <string>#1B1D16</string> + <key>caret</key> + <string>#F8FFE2</string> + <key>foreground</key> + <string>#D7FF68</string> + <key>invisibles</key> + <string>#808080</string> + <key>lineHighlight</key> + <string>#3C4822</string> + <key>selection</key> + <string>#3C4822</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Comment</string> + <key>scope</key> + <string>comment</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#738939</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Keyword</string> + <key>scope</key> + <string>keyword, storage</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#9DC443</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Number</string> + <key>scope</key> + <string>constant.numeric</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#E6FFA4</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Constant</string> + <key>scope</key> + <string>constant</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#E6FFA4</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>String</string> + <key>scope</key> + <string>string</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#E6FFA4</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Invalid</string> + <key>scope</key> + <string>invalid</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#990000</string> + <key>foreground</key> + <string>#FFFFFF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Diff Header</string> + <key>scope</key> + <string>meta.diff.header, meta.separator.diff, meta.diff.index, meta.diff.range</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#2F33AB</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>diff.deleted</string> + <key>scope</key> + <string>markup.deleted</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#F92672</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>diff.inserted</string> + <key>scope</key> + <string>markup.inserted</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#A6E22E</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>diff.changed</string> + <key>scope</key> + <string>markup.changed</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#967EFB</string> + </dict> + </dict> + </array> + <key>uuid</key> + <string>15675CF3-9DE0-420B-8863-DDF5AFA1D7CA</string> +</dict> +</plist> diff --git a/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/Green.tmTheme.cache b/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/Green.tmTheme.cache Binary files differ. diff --git a/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/Hacker.tmTheme b/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/Hacker.tmTheme @@ -0,0 +1,297 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>name</key> + <string>Hacker</string> + <key>settings</key> + <array> + <dict> + <key>settings</key> + <dict> + <key>background</key> + <string>#000000</string> + <key>caret</key> + <string>#F8F8F0</string> + <key>foreground</key> + <string>#F8F8F2</string> + <key>invisibles</key> + <string>#3B3A32</string> + <key>lineHighlight</key> + <string>#000000</string> + <key>selection</key> + <string>#49483E</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Comment</string> + <key>scope</key> + <string>comment</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#00FF00</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>String</string> + <key>scope</key> + <string>string</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#0B8747</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Number</string> + <key>scope</key> + <string>constant.numeric</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#7729FF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Built-in constant</string> + <key>scope</key> + <string>constant.language</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#2B00FF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>User-defined constant</string> + <key>scope</key> + <string>constant.character, constant.other</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#AE81FF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Variable</string> + <key>scope</key> + <string>variable</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Keyword</string> + <key>scope</key> + <string>keyword</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#11FF00</string> + <key>background</key> + <string>#000000</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Storage</string> + <key>scope</key> + <string>storage</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#FAFA23</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Storage type</string> + <key>scope</key> + <string>storage.type</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>italic</string> + <key>foreground</key> + <string>#00FF55</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Class name</string> + <key>scope</key> + <string>entity.name.class</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>underline</string> + <key>foreground</key> + <string>#E02D2D</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Inherited class</string> + <key>scope</key> + <string>entity.other.inherited-class</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>italic underline</string> + <key>foreground</key> + <string>#A6E22E</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Function name</string> + <key>scope</key> + <string>entity.name.function</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#A6E22E</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Function argument</string> + <key>scope</key> + <string>variable.parameter</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>italic</string> + <key>foreground</key> + <string>#FD971F</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Tag name</string> + <key>scope</key> + <string>entity.name.tag</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#032582</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Tag attribute</string> + <key>scope</key> + <string>entity.other.attribute-name</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#A6E22E</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Library function</string> + <key>scope</key> + <string>support.function</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#FF0000</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Library constant</string> + <key>scope</key> + <string>support.constant</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#FF0000</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Library class/type</string> + <key>scope</key> + <string>support.type, support.class</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>italic</string> + <key>foreground</key> + <string>#65A6F0</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Library variable</string> + <key>scope</key> + <string>support.other.variable</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Invalid</string> + <key>scope</key> + <string>invalid</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#F92672</string> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#F8F8F0</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Invalid deprecated</string> + <key>scope</key> + <string>invalid.deprecated</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#AE81FF</string> + <key>foreground</key> + <string>#F8F8F0</string> + </dict> + </dict> + </array> + <key>uuid</key> + <string>D8D5E82E-3D5B-46B5-B38E-8C841C21347D</string> + <key>colorSpaceName</key> + <string>sRGB</string> + <key>semanticClass</key> + <string>theme.dark.monokai</string> + <key>author</key> + <string></string> +</dict> +</plist> +\ No newline at end of file diff --git a/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/Hacker.tmTheme.cache b/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/Hacker.tmTheme.cache Binary files differ. diff --git a/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/Neon.tmTheme b/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/Neon.tmTheme @@ -0,0 +1,2933 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>author</key> + <string>Matt Morrison</string> + <key>comment</key> + <string>Created by Matt Morrison @MattDMo mattdmo@pigimal.com + https://github.com/MattDMo/Neon-color-scheme + Check out https://github.com/MattDMo/PythonImproved for a better Python language definition + containing some of the scopes in this color scheme. + </string> + <key>name</key> + <string>Neon</string> + <key>settings</key> + <array> + <dict> + <key>settings</key> + <dict> + <key>activeGuide</key> + <string>#FF0080</string> + <key>background</key> + <string>#000000</string> + <key>caret</key> + <string>#FFFFFF</string> + <key>findHighlight</key> + <string>#F2FF06</string> + <key>findHighlightForeground</key> + <string>#1515FF</string> + <key>foreground</key> + <string>#FFFFFF</string> + <key>guide</key> + <string>#6F6F6F</string> + <key>inactiveSelection</key> + <string>#353576</string> + <key>invisibles</key> + <string>#06FF05</string> + <key>lineHighlight</key> + <string>#2D2D2D</string> + <key>searchHighlight</key> + <string>#0205FF</string> + <key>selection</key> + <string>#0205FF</string> + <key>selectionBorder</key> + <string>#06FF05</string> + <key>stackGuide</key> + <string>#06FF05</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Invalid</string> + <key>scope</key> + <string>invalid</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#FF1E00</string> + <key>fontStyle</key> + <string>bold italic</string> + <key>foreground</key> + <string>#FFFFFF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Punctuation</string> + <key>scope</key> + <string>punctuation - (punctuation.definition.string | punctuation.definition.comment)</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#FFFEF7</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>INI =</string> + <key>scope</key> + <string>punctuation.definition.equals.ini</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#FF07A2</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Comment</string> + <key>scope</key> + <string>comment, punctuation.definition.comment</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>italic</string> + <key>foreground</key> + <string>#7F817E</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>docstring</string> + <key>scope</key> + <string>string.quoted.double.block, string.docstring, string.quoted.single.block</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>italic</string> + <key>foreground</key> + <string>#218B97</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Numbers</string> + <key>scope</key> + <string>constant.numeric</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#FF0604</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Language Constant</string> + <key>scope</key> + <string>constant.language</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>bold italic</string> + <key>foreground</key> + <string>#FF1308</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Constant.character.entity</string> + <key>scope</key> + <string>constant.character.entity, punctuation.definition.constant</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>italic</string> + <key>foreground</key> + <string>#FF07A0</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Support.constant</string> + <key>scope</key> + <string>support.constant</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>italic</string> + <key>foreground</key> + <string>#EB939A</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Exception</string> + <key>scope</key> + <string>support.type.exception</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#800F00</string> + <key>foreground</key> + <string>#F8F8F8</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Keyword</string> + <key>scope</key> + <string>keyword, storage.control.matlab</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#0B93FF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Keyword other</string> + <key>scope</key> + <string>keyword.other</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#FF026A</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Operator</string> + <key>scope</key> + <string>keyword.operator -keyword.operator.dereference</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#A7A3FF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Comparison operator</string> + <key>scope</key> + <string>keyword.operator.comparison</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#48FFC2</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Assignment operator</string> + <key>scope</key> + <string>keyword.operator.assignment</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#FF6106</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Augmented assignment operator</string> + <key>scope</key> + <string>keyword.operator.assignment.augmented</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#FFBBF4</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Storage type</string> + <key>scope</key> + <string>storage.type</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#FF4101</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Storage modifier</string> + <key>scope</key> + <string>storage.modifier</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#276AFF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Variable</string> + <key>scope</key> + <string>variable, punctuation.definition.variable</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#FF25D9</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Other Variable</string> + <key>scope</key> + <string>variable.other, meta.variable.other.valid</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#D285CC</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Language Variable</string> + <key>scope</key> + <string>variable.language, variable.parameter.function.language</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>italic</string> + <key>foreground</key> + <string>#0AEDFF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Entity-Other</string> + <key>scope</key> + <string>entity.other</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#04FFD7</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Dict key</string> + <key>scope</key> + <string>meta.structure.dictionary meta.structure.dictionary.key, constant.other.object.key string</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>bold</string> + <key>foreground</key> + <string>#A9FF98</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Dict Value</string> + <key>scope</key> + <string>meta.structure.dictionary.value</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#7DC5F9</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Item-access arguments</string> + <key>scope</key> + <string>meta.item-access.arguments</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#11BD7C</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Class</string> + <key>scope</key> + <string>meta.class.identifier, entity.name.type.class, support.class, variable.other.class, entity.name.class</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#CFFF01</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Inherited class</string> + <key>scope</key> + <string>entity.other.inherited-class</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#80FCFF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Method</string> + <key>scope</key> + <string>meta.method.identifier, meta.method-call, meta.method.declaration</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#13FFA3</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Function definition</string> + <key>scope</key> + <string>meta.function entity.name.function, entity.name.function.abp, meta.prototype.function.js, entity.name.function.js, entity.name.function.makefile</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#07019A</string> + <key>foreground</key> + <string>#0AFF04</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Function call</string> + <key>scope</key> + <string>meta.function-call, support.function.name, meta.function-call punctuation.definition.parameters, meta.function-call.method.without-arguments.js -meta.group.braces.round.function.arguments.js</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#10FF02</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Function arguments</string> + <key>scope</key> + <string>meta.function-call.arguments</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>italic</string> + <key>foreground</key> + <string>#2BB71D</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Function definition parameters</string> + <key>scope</key> + <string>variable.parameter.function</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>italic</string> + <key>foreground</key> + <string>#FFF57F</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Support function</string> + <key>scope</key> + <string>support.function</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#E5A5FF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Builtin function</string> + <key>scope</key> + <string>support.function.builtin</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>italic</string> + <key>foreground</key> + <string>#E0A1FF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>String</string> + <key>scope</key> + <string>string -string.unquoted.old-plist -string.unquoted.heredoc, string.unquoted.heredoc string</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#FFDF02</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>String Quotes</string> + <key>scope</key> + <string>string.quoted punctuation.definition.string.begin, string.quoted punctuation.definition.string.end, punctuation.definition.string</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>italic</string> + <key>foreground</key> + <string>#FF07A2</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>String constant</string> + <key>scope</key> + <string>string constant</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>italic</string> + <key>foreground</key> + <string>#FF087B</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>String embedded-source</string> + <key>scope</key> + <string>string.quoted source</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#414141</string> + <key>foreground</key> + <string>#EBFF59</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>String.regexp</string> + <key>scope</key> + <string>string.regexp</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#FFE4A6</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>String variable</string> + <key>scope</key> + <string>string variable</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#EF9975</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Support.type</string> + <key>scope</key> + <string>support.type</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#FF1190</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Support variable</string> + <key>scope</key> + <string>support.variable</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#0A4AFF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>=========== JavaScript ==========</string> + <key>scope</key> + <string></string> + <key>settings</key> + <dict> + </dict> + </dict> + <dict> + <key>name</key> + <string>New Object - JavaScriptNext</string> + <key>scope</key> + <string>entity.name.type.new</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>bold italic</string> + <key>foreground</key> + <string>#FFFF03</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Property - JavaScriptNext</string> + <key>scope</key> + <string>variable.other.property</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#AA00AA</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Object - JavaScriptNext</string> + <key>scope</key> + <string>variable.other.object</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#00A452</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Object Property - JavaScriptNext</string> + <key>scope</key> + <string>meta.property.object</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#34A7FF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Constant - JavaScriptNext</string> + <key>scope</key> + <string>variable.other.constant</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>bold</string> + <key>foreground</key> + <string>#FFA325</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Node keyword - JavaScriptNext</string> + <key>scope</key> + <string>support.keyword.node</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#93D6F7</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Statement Terminator - JavaScriptNext</string> + <key>scope</key> + <string>punctuation.terminator.statement</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>bold</string> + <key>foreground</key> + <string>#FFFFFF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>jQuery support class</string> + <key>scope</key> + <string>support.class.js.jquery</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#08D879</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>=========== Clojure ==========</string> + <key>scope</key> + <string></string> + <key>settings</key> + <dict> + <key>background</key> + <string></string> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string></string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Constant.other</string> + <key>scope</key> + <string>source.clojure constant.other</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>bold</string> + <key>foreground</key> + <string>#FFA325</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Keyword</string> + <key>scope</key> + <string>source.clojure support.other.keyword</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#0B93FF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Namespace</string> + <key>scope</key> + <string>entity.name.namespace.clojure</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#070E48</string> + <key>foreground</key> + <string>#CFFF01</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Storage, Support functions</string> + <key>scope</key> + <string>storage.clojure, support.function.clojure</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#00BB5E</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Storage.type.function</string> + <key>scope</key> + <string>storage.type.function source.clojure</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#10FF02</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Keyword.other.mark</string> + <key>scope</key> + <string>keyword.other.mark</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>bold italic</string> + <key>foreground</key> + <string>#FF71BB</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Match Function</string> + <key>scope</key> + <string>support.function.match.clojure</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>bold italic</string> + <key>foreground</key> + <string>#47FFC7</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Map braces</string> + <key>scope</key> + <string>punctuation.definition.map</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>bold italic</string> + <key>foreground</key> + <string>#80FF80</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Set braces</string> + <key>scope</key> + <string>punctuation.definition.set</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>bold italic</string> + <key>foreground</key> + <string>#FF3229</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Vector brackets</string> + <key>scope</key> + <string>punctuation.definition.vector</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>bold italic</string> + <key>foreground</key> + <string>#FF00FF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>String Constant Symbol</string> + <key>scope</key> + <string>constant.string.symbole.clojure</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#A7A3FF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>=========== Ruby ==========</string> + <key>scope</key> + <string></string> + <key>settings</key> + <dict> + <key>background</key> + <string></string> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string></string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Ruby symbol</string> + <key>scope</key> + <string>constant.other.symbol, constant.other.symbol punctuation.definition.constant</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#FF9705</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Environment variable</string> + <key>scope</key> + <string>meta.environment-variable string</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#FFEE0C</string> + <key>foreground</key> + <string>#0613FF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Global variable</string> + <key>scope</key> + <string>variable.other.readwrite.global, variable.other.readwrite.global punctuation.definition.variable</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#FFACAA</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Instance variable</string> + <key>scope</key> + <string>variable.other.readwrite.instance, variable.other.readwrite.instance punctuation.definition.variable</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#04310A</string> + <key>foreground</key> + <string>#9AA5FF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Ruby special method</string> + <key>scope</key> + <string>keyword.other.special-method.ruby</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#DB1E44</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Punctuation.separator.other</string> + <key>scope</key> + <string>punctuation.separator.other</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#276AFF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Regex character class</string> + <key>scope</key> + <string>string.regexp.character-class, punctuation.definition.character-class</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#22FFC9</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Block variable</string> + <key>scope</key> + <string>variable.other.block, punctuation.separator.variable</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#14FF01</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>=========== Python ==========</string> + <key>scope</key> + <string></string> + <key>settings</key> + <dict> + <key>background</key> + <string></string> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string></string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Annotation separator :</string> + <key>scope</key> + <string>punctuation.separator.annotation.python</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#0205FF</string> + <key>fontStyle</key> + <string>bold italic</string> + <key>foreground</key> + <string>#F6FF04</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Annotation result -></string> + <key>scope</key> + <string>punctuation.separator.annotation.result.python</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#0205FF</string> + <key>fontStyle</key> + <string>bold italic</string> + <key>foreground</key> + <string>#F6FF04</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Annotation parameters group begin (</string> + <key>scope</key> + <string>punctuation.definition.parameters-group.begin.python</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>bold italic</string> + <key>foreground</key> + <string>#FF06A5</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Annotation parameters group end )</string> + <key>scope</key> + <string>punctuation.definition.parameters-group.end.python</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>bold italic</string> + <key>foreground</key> + <string>#FF06A5</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Comment - Note</string> + <key>scope</key> + <string>comment.line.note.python</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#000B76</string> + <key>foreground</key> + <string>#E2FF09</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Comment - Note - Notation</string> + <key>scope</key> + <string>comment.line.note.notation.python</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>bold</string> + <key>foreground</key> + <string>#FF112C</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Constant - allcaps</string> + <key>scope</key> + <string>constant.other.allcaps</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>bold</string> + <key>foreground</key> + <string>#FFA325</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Decorator</string> + <key>scope</key> + <string>meta.function.decorator entity.name.function.decorator, meta.function.decorator support.type, punctuation.definition.decorator</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>bold</string> + <key>foreground</key> + <string>#B6B8FE</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Django models</string> + <key>scope</key> + <string>support.type.django.model</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#588925</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Django modules</string> + <key>scope</key> + <string>support.other.django.module</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#82C537</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Django keyword tag name</string> + <key>scope</key> + <string>keyword.control.tag-name.django</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>bold italic</string> + <key>foreground</key> + <string>#C2FFBD</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Django filter tag name</string> + <key>scope</key> + <string>keyword.control.filter.django</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#908A0770</string> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#0FD0FF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Django template tag braces</string> + <key>scope</key> + <string>storage.type.templatetag.django entity.tag.tagbraces.django</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>bold italic</string> + <key>foreground</key> + <string>#1FA919</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Django variable tag braces</string> + <key>scope</key> + <string>storage.type.variable entity.tag.tagbraces.django</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>bold italic</string> + <key>foreground</key> + <string>#FF0D8F</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>IPython In</string> + <key>scope</key> + <string>support.ipython.in</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#17FF07</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>IPython Out</string> + <key>scope</key> + <string>support.ipython.out</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#FF0704</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>IPython Cell Number</string> + <key>scope</key> + <string>source.python support.ipython support.ipython.cell-number</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>bold</string> + <key>foreground</key> + <string>#00B1F7</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Jinja filter</string> + <key>scope</key> + <string>variable.other.jinja.filter</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>bold italic</string> + <key>foreground</key> + <string>#10FDFF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Jinja Variable</string> + <key>scope</key> + <string>variable.other.jinja</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#FF0102</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Jinja tag delimiter</string> + <key>scope</key> + <string>entity.other.jinja.delimiter</string> + <key>settings</key> + <dict> + <key>background</key> + <string></string> + <key>fontStyle</key> + <string>bold</string> + <key>foreground</key> + <string>#FFF704</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Magic function</string> + <key>scope</key> + <string>support.function.magic</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>bold italic</string> + <key>foreground</key> + <string>#E3A0FF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>=========== JSON ==========</string> + <key>scope</key> + <string></string> + <key>settings</key> + <dict> + </dict> + </dict> + <dict> + <key>name</key> + <string>JSON - 18 deep</string> + <key>scope</key> + <string>source.json meta meta meta meta meta meta meta meta meta meta meta meta meta meta meta meta meta meta meta.structure.dictionary string</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#F50AFF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>JSON - 17 deep</string> + <key>scope</key> + <string>source.json meta meta meta meta meta meta meta meta meta meta meta meta meta meta meta meta meta meta.structure.dictionary string</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#ACFF04</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>JSON - 16 deep</string> + <key>scope</key> + <string>source.json meta meta meta meta meta meta meta meta meta meta meta meta meta meta meta meta meta.structure.dictionary string</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#18FFFA</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>JSON - 15 deep</string> + <key>scope</key> + <string>source.json meta meta meta meta meta meta meta meta meta meta meta meta meta meta meta meta.structure.dictionary string</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#FF5A60</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>JSON - 14 deep</string> + <key>scope</key> + <string>source.json meta meta meta meta meta meta meta meta meta meta meta meta meta meta meta.structure.dictionary string</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#1471FF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>JSON - 13 deep</string> + <key>scope</key> + <string>source.json meta meta meta meta meta meta meta meta meta meta meta meta meta meta.structure.dictionary string</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#FF8D04</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>JSON - 12 deep</string> + <key>scope</key> + <string>source.json meta meta meta meta meta meta meta meta meta meta meta meta meta.structure.dictionary string</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#22FF31</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>JSON - 11 deep</string> + <key>scope</key> + <string>source.json meta meta meta meta meta meta meta meta meta meta meta meta.structure.dictionary string</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#A9BAFF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>JSON - 10 deep</string> + <key>scope</key> + <string>source.json meta meta meta meta meta meta meta meta meta meta meta.structure.dictionary string</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#FF0C77</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>JSON - 9 deep</string> + <key>scope</key> + <string>source.json meta meta meta meta meta meta meta meta meta meta.structure.dictionary string</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#FFFA02</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>JSON - 8 deep</string> + <key>scope</key> + <string>source.json meta meta meta meta meta meta meta meta meta.structure.dictionary string</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#F50AFF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>JSON - 7 deep</string> + <key>scope</key> + <string>source.json meta meta meta meta meta meta meta meta.structure.dictionary string</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#ACFF04</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>JSON - 6 deep</string> + <key>scope</key> + <string>source.json meta meta meta meta meta meta meta.structure.dictionary string</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#18FFFA</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>JSON - 5 deep</string> + <key>scope</key> + <string>source.json meta meta meta meta meta meta.structure.dictionary string</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#FF5A60</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>JSON - 4 deep</string> + <key>scope</key> + <string>source.json meta meta meta meta meta.structure.dictionary string</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#1471FF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>JSON - 3 deep</string> + <key>scope</key> + <string>source.json meta meta meta meta.structure.dictionary string</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#FF8D04</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>JSON - 2 deep</string> + <key>scope</key> + <string>source.json meta meta meta.structure.dictionary string</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#22FF31</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>JSON - 1 deep</string> + <key>scope</key> + <string>source.json meta meta.structure.dictionary string</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#FF82EC</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>=========== C/C++ ==========</string> + <key>scope</key> + <string></string> + <key>settings</key> + <dict> + </dict> + </dict> + <dict> + <key>name</key> + <string>C/C++ Preprocessor Line</string> + <key>scope</key> + <string>meta.preprocessor</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#A85E3D</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>C/C++ Preprocessor Directive</string> + <key>scope</key> + <string>meta.preprocessor keyword</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#8189FF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>C/C++ <include></string> + <key>scope</key> + <string>string.quoted.other.lt-gt.include</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#0CC4FF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>C/C++ "include"</string> + <key>scope</key> + <string>string.quoted.double.include</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#FF65BE</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>=========== diff ==========</string> + <key>scope</key> + <string></string> + <key>settings</key> + <dict> + </dict> + </dict> + <dict> + <key>name</key> + <string>diff.header</string> + <key>scope</key> + <string>meta.diff, meta.diff.header</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#008BFE</string> + <key>foreground</key> + <string>#FFFFFF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>diff.deleted</string> + <key>scope</key> + <string>markup.deleted</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#BC1802</string> + <key>foreground</key> + <string>#FFFFFF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>diff.changed</string> + <key>scope</key> + <string>markup.changed</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#CFB406</string> + <key>foreground</key> + <string>#FFFFFF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>diff.inserted</string> + <key>scope</key> + <string>markup.inserted</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#277D08</string> + <key>foreground</key> + <string>#FFFFFF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>=========== HTML/XML ==========</string> + <key>scope</key> + <string></string> + <key>settings</key> + <dict> + </dict> + </dict> + <dict> + <key>name</key> + <string>Attribute name</string> + <key>scope</key> + <string>entity.other.attribute-name, storage.type.attr</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#FF88F9</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Local name</string> + <key>scope</key> + <string>entity.other.attribute-name.localname</string> + <key>settings</key> + <dict> + <key>background</key> + <string></string> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#10FF07</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>HTML String</string> + <key>scope</key> + <string>string.quoted.double.html, string.quoted.single.html</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#10FF07</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>HTML entity</string> + <key>scope</key> + <string>constant.character.entity.html, constant.character.entity.html punctuation</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>italic</string> + <key>foreground</key> + <string>#FF07A2</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>doctype</string> + <key>scope</key> + <string>meta.tag.sgml.doctype, entity.name.tag.doctype</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>italic</string> + <key>foreground</key> + <string>#1AEFFF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Tag</string> + <key>scope</key> + <string>meta.tag, meta.tag entity</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#FF6803</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Tag Punctuation</string> + <key>scope</key> + <string>punctuation.definition.tag</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#02AEFF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>=========== Android Debug Bridge ==========</string> + <key>scope</key> + <string></string> + <key>settings</key> + <dict> + <key>background</key> + <string></string> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string></string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Timestamp</string> + <key>scope</key> + <string>constant.other.adb.timestamp</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#FE7DF5</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Function</string> + <key>scope</key> + <string>source.adb entity.name.function</string> + <key>settings</key> + <dict> + <key>background</key> + <string></string> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#10FF07</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>constant.other</string> + <key>scope</key> + <string>constant.other.adb</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#FF8000</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Info</string> + <key>scope</key> + <string>entity.name.filename.adb</string> + <key>settings</key> + <dict> + <key>background</key> + <string></string> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#08F2FF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Warning</string> + <key>scope</key> + <string>keyword.adb</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#FFFF00</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>=========== Logcat ==========</string> + <key>scope</key> + <string></string> + <key>settings</key> + <dict> + <key>background</key> + <string></string> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string></string> + </dict> + </dict> + <dict> + <key>name</key> + <string>logcat Timestamp</string> + <key>scope</key> + <string>string.logcat.timestamp</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#FE7DF5</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>logcat Tag</string> + <key>scope</key> + <string>entity.name.tag.logcat.tag</string> + <key>settings</key> + <dict> + <key>background</key> + <string></string> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#10FF07</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>logcat pid</string> + <key>scope</key> + <string>constant.numeric.logcat</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#FF8000</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>logcat Verbose</string> + <key>scope</key> + <string>entity.name.function.logcat</string> + <key>settings</key> + <dict> + <key>background</key> + <string></string> + <key>fontStyle</key> + <string>italic</string> + <key>foreground</key> + <string>#777777</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>logcat Debug</string> + <key>scope</key> + <string>entity.name.function.logcat</string> + <key>settings</key> + <dict> + <key>background</key> + <string></string> + <key>fontStyle</key> + <string>italic</string> + <key>foreground</key> + <string>#CCCCCC</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>logcat Info</string> + <key>scope</key> + <string>entity.name.class.logcat</string> + <key>settings</key> + <dict> + <key>background</key> + <string></string> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#08F2FF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>logcat Warning</string> + <key>scope</key> + <string>keyword.logcat</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#DBBE07</string> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#FFFFFF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>=========== Markup ==========</string> + <key>scope</key> + <string></string> + <key>settings</key> + <dict> + </dict> + </dict> + <dict> + <key>name</key> + <string>Raw Markup</string> + <key>scope</key> + <string>markup.raw, markup.raw punctuation</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#3F403F</string> + <key>foreground</key> + <string>#FFFFFF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Markup Link URL</string> + <key>scope</key> + <string>meta.link.inline markup.underline, meta.image.inline markup.underline, markup.underline.link</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#212121</string> + <key>foreground</key> + <string>#8080FF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Markup Link brackets/parens</string> + <key>scope</key> + <string>punctuation.definition.metadata, punctuation.definition.string.begin.markdown, punctuation.definition.string.end.markdown</string> + <key>settings</key> + <dict> + <key>background</key> + <string></string> + <key>fontStyle</key> + <string>bold</string> + <key>foreground</key> + <string>#FF07A2</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Markup Link Text</string> + <key>scope</key> + <string>string.other.link.title, string.other.link.description</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#11FF09</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Block Quote</string> + <key>scope</key> + <string>markup.quote</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#004480</string> + <key>fontStyle</key> + <string>italic</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>List</string> + <key>scope</key> + <string>markup.list punctuation.definition.list_item</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#F90BEA</string> + <key>foreground</key> + <string>#000000</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Bold Markup</string> + <key>scope</key> + <string>markup.bold</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>bold</string> + <key>foreground</key> + <string>#FF9303</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Italic Markup</string> + <key>scope</key> + <string>markup.italic</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>italic</string> + <key>foreground</key> + <string>#FFF103</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Heading Markup</string> + <key>scope</key> + <string>markup.heading, markup.heading punctuation</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#008BFE</string> + <key>fontStyle</key> + <string>bold</string> + <key>foreground</key> + <string>#FDF503</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Image</string> + <key>scope</key> + <string>meta.image.inline</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>bold</string> + <key>foreground</key> + <string>#E421FD</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>=========== PHP ==========</string> + <key>scope</key> + <string></string> + <key>settings</key> + <dict> + </dict> + </dict> + <dict> + <key>name</key> + <string>PHP: PHPdocs</string> + <key>scope</key> + <string>keyword.other.phpdoc.php</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>italic</string> + <key>foreground</key> + <string>#3A771F</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>PHP: Constants Core Predefined</string> + <key>scope</key> + <string>support.constant.core.php</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>bold italic</string> + <key>foreground</key> + <string>#FFA325</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>PHP: Constants Standard Predefined</string> + <key>scope</key> + <string>support.constant.std.php</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>bold italic</string> + <key>foreground</key> + <string>#BBFD0D</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>PHP: Include() & Require()</string> + <key>scope</key> + <string>keyword.other.include.php, meta.include.php</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#C82255</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>PHP: Keywords Storage</string> + <key>scope</key> + <string>keyword.storage.php</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#6969FA</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>PHP: Strings Double-Quoted</string> + <key>scope</key> + <string>string.quoted.double.php</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#FF6F5B</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>PHP: Strings Single-Quoted</string> + <key>scope</key> + <string>string.quoted.single.php</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#FEF611</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>PHP: Variables Globals</string> + <key>scope</key> + <string>variable.other.global.php</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>italic</string> + <key>foreground</key> + <string>#FF4028</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>PHP: Variables Safer Globals</string> + <key>scope</key> + <string>variable.other.global.safer.php</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#00FF00</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>=========== Stylesheets ==========</string> + <key>scope</key> + <string></string> + <key>settings</key> + <dict> + </dict> + </dict> + <dict> + <key>name</key> + <string>CSS: additional-constants</string> + <key>scope</key> + <string>meta.property-value support.constant.named-color.css, meta.property-value constant</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>italic</string> + <key>foreground</key> + <string>#FFF203</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>CSS: @at-rule</string> + <key>scope</key> + <string>meta.preprocessor.at-rule keyword.control.at-rule</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#F6AA11</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>CSS: attribute-match</string> + <key>scope</key> + <string>source.css meta.attribute-selector keyword.operator.comparison</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#833F04</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>CSS: .class</string> + <key>scope</key> + <string>entity.other.attribute-name.class.css, entity.other.attribute-name.class.css punctuation</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#B2FF02</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>CSS: constructor argument</string> + <key>scope</key> + <string>meta.constructor.argument</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#0AEB77</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>CSS: #id</string> + <key>scope</key> + <string>entity.other.attribute-name.id.css, entity.other.attribute-name.id.css punctuation</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#FF50F0</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>CSS: pseudo-element</string> + <key>scope</key> + <string>entity.other.attribute-name.pseudo-element</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#AE08FF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>CSS: pseudo-class</string> + <key>scope</key> + <string>entity.other.attribute-name.pseudo-class, entity.other.attribute-name.tag.pseudo-class</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#D2C9FF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>CSS: property-name</string> + <key>scope</key> + <string>support.type.property-name.css, meta.property-name</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#FF9F82</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>CSS: property-value</string> + <key>scope</key> + <string>meta.property-group support.constant.property-value.css, meta.property-value support.constant.property-value.css</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#357BF6</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>CSS: selector</string> + <key>scope</key> + <string>meta.selector.css</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#84F6C3</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>CSS: tag-name</string> + <key>scope</key> + <string>entity.name.tag.css</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#05C2FF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>CSS: tag wildcard</string> + <key>scope</key> + <string>entity.name.tag.wildcard, entity.other.attribute-name.universal</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>bold</string> + <key>foreground</key> + <string>#FF7900</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>CSS: units</string> + <key>scope</key> + <string>keyword.other.unit</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#1DD292</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>CSS: Flag</string> + <key>scope</key> + <string>keyword.other.important.css</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>bold italic</string> + <key>foreground</key> + <string>#FF0000</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>SASS: Block comment</string> + <key>scope</key> + <string>comment.block.sass</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>italic</string> + <key>foreground</key> + <string>#208C9A</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>SASS: Placeholder Selector</string> + <key>scope</key> + <string>entity.other.attribute-name.placeholder-selector.sass</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>bold italic</string> + <key>foreground</key> + <string>#FF5699</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>SASS: Attribute Selector</string> + <key>scope</key> + <string>entity.other.attribute-selector.sass</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#817DFF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>SASS: Regex</string> + <key>scope</key> + <string>keyword.other.regex.sass</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#FFE4A6</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>SASS: Comma</string> + <key>scope</key> + <string>comment.punctuation.comma.sass</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#FCFDFF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>SASS: RGB Color</string> + <key>scope</key> + <string>constant.other.color.rgb-value.css, meta.property-value.css constant.other.color.rgb-value.css, constant.other.color.rgb-value.css punctuation.definition.constant.css, meta.property-value.css constant.other.color.rgb-value.css punctuation.definition.constant.css</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#07FFF5</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>SCSS: Semicolon</string> + <key>scope</key> + <string>comment.punctuation.semicolon.sass</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#6969FA</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>=========== GitGutter ==========</string> + <key>scope</key> + <string></string> + <key>settings</key> + <dict> + </dict> + </dict> + <dict> + <key>name</key> + <string>GitGutter deleted</string> + <key>scope</key> + <string>markup.deleted.git_gutter</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#FF0000</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>GitGutter inserted</string> + <key>scope</key> + <string>markup.inserted.git_gutter</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#00FF00</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>GitGutter changed</string> + <key>scope</key> + <string>markup.changed.git_gutter</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#FFFF00</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>=========== Find In Files ==========</string> + <key>scope</key> + <string></string> + <key>settings</key> + <dict> + </dict> + </dict> + <dict> + <key>name</key> + <string>Find In Files: filename</string> + <key>scope</key> + <string>entity.name.filename.find-in-files</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#06FF05</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Find In Files: Line Number - Match</string> + <key>scope</key> + <string>constant.numeric.line-number.match.find-in-files</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#FFFF00</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>=========== AAAPackageDev ==========</string> + <key>scope</key> + <string></string> + <key>settings</key> + <dict> + <key>background</key> + <string></string> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string></string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Sublime Settings Keyword</string> + <key>scope</key> + <string>keyword.other.name.sublime-settings</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#05B4FF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Regex Control Anchors</string> + <key>scope</key> + <string>entity.other.control</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#07019A</string> + <key>foreground</key> + <string>#A4FF5A</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Regex Escape Character</string> + <key>scope</key> + <string>constant.character.escape</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#AF35FF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Regex Group</string> + <key>scope</key> + <string>storage.type.regexp.group, string meta.group.regexp punctuation.definition.group, punctuation.definition.group.regexp</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>bold italic</string> + <key>foreground</key> + <string>#05B4FF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Regex Quantifier</string> + <key>scope</key> + <string>support.operator.quantifier</string> + <key>settings</key> + <dict> + <key>background</key> + <string></string> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#0DFF03</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>YAML numeric key</string> + <key>scope</key> + <string>constant.numeric.key</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>bold</string> + <key>foreground</key> + <string>#00B000</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>YAML-tmLanguage support.type</string> + <key>scope</key> + <string>source.yaml-tmlanguage support.type</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>bold</string> + <key>foreground</key> + <string>#F57C0E</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>YAML-tmLanguage match</string> + <key>scope</key> + <string>source.yaml-tmlanguage keyword.other.match</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#FF00FF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>YAML-tmLanguage name</string> + <key>scope</key> + <string>source.yaml-tmlanguage keyword.other.name</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#0BFF02</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>YAML-tmLanguage folding-marker</string> + <key>scope</key> + <string>source.yaml-tmlanguage meta.folding-marker keyword.other.folding-marker</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#23FFB0</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>=========== RAML ==========</string> + <key>scope</key> + <string>source.raml</string> + <key>settings</key> + <dict> + </dict> + </dict> + <dict> + <key>name</key> + <string>RAML Document control</string> + <key>scope</key> + <string>source.raml constant.language.document.yaml</string> + <key>settings</key> + <dict> + </dict> + </dict> + <dict> + <key>name</key> + <string>RAML Language directive</string> + <key>scope</key> + <string>source.raml constant.other.directive.yaml constant.language.directive.yaml</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#c2e978</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>RAML Method name</string> + <key>scope</key> + <string>source.raml meta.key-value entity.name.function.yaml</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#df31fc</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>RAML Resource name</string> + <key>scope</key> + <string>source.raml meta.resource entity.name.tag.yaml</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#fca628</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>RAML value</string> + <key>scope</key> + <string>source.raml meta.key-value</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#ffffff</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>RAML include statement</string> + <key>scope</key> + <string>source.raml meta.key-value.include</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#212121</string> + <key>foreground</key> + <string>#8080FF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>RAML include path/target</string> + <key>scope</key> + <string>source.raml meta.key-value.include.path</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#a080FF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>RAML description</string> + <key>scope</key> + <string>source.raml markup.raw.description.raml</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#1c1c1c</string> + <key>foreground</key> + <string>#c2e978</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>RAML schema description</string> + <key>scope</key> + <string>source.raml string.quoted.single.yaml</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#1c1c1c</string> + <key>foreground</key> + <string>#90f060</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>RAML HTML method</string> + <key>scope</key> + <string>source.raml meta.method constant.character.method.yaml</string> + <key>settings</key> + <dict> + <key>background</key> + <string></string> + <key>foreground</key> + <string>#4281fb</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>=========== SublimeLinter ==========</string> + <key>scope</key> + <string></string> + <key>settings</key> + <dict> + <key>background</key> + <string></string> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string></string> + </dict> + </dict> + <dict> + <key>name</key> + <string>SublimeLinter Annotations</string> + <key>scope</key> + <string>sublimelinter.annotations</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#FFFFAA</string> + <key>foreground</key> + <string>#FFFFFF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>SublimeLinter Error Outline</string> + <key>scope</key> + <string>sublimelinter.outline.illegal</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#FF4A52</string> + <key>foreground</key> + <string>#FFFFFF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>SublimeLinter Error Underline</string> + <key>scope</key> + <string>sublimelinter.underline.illegal</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#FF0000</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>SublimeLinter Warning Outline</string> + <key>scope</key> + <string>sublimelinter.outline.warning</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#DF9400</string> + <key>foreground</key> + <string>#FFFFFF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>SublimeLinter Warning Underline</string> + <key>scope</key> + <string>sublimelinter.underline.warning</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#FF0000</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>SublimeLinter Violation Outline</string> + <key>scope</key> + <string>sublimelinter.outline.violation</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#FFFFFF33</string> + <key>foreground</key> + <string>#FFFFFF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>SublimeLinter3 Gutter Mark</string> + <key>scope</key> + <string>sublimelinter.gutter-mark</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#FFFFFF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>SublimeLinter3 Error</string> + <key>scope</key> + <string>sublimelinter.mark.error</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#DA2000</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>SublimeLinter3 Warning</string> + <key>scope</key> + <string>sublimelinter.mark.warning</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#EDBA00</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>=========== BracketHighlighter ==========</string> + <key>scope</key> + <string></string> + <key>settings</key> + <dict> + <key>background</key> + <string></string> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string></string> + </dict> + </dict> + <dict> + <key>name</key> + <string>BracketHighlighter default</string> + <key>scope</key> + <string>brackethighlighter.default</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#FFFFFF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>BracketHighlighter unmatched</string> + <key>scope</key> + <string>brackethighlighter.unmatched</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#FF1E00</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>BracketHighlighter curly</string> + <key>scope</key> + <string>brackethighlighter.curly</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#00FF40</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>BracketHighlighter round</string> + <key>scope</key> + <string>brackethighlighter.round</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#1AB5FF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>BracketHighlighter square</string> + <key>scope</key> + <string>brackethighlighter.square</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#FF8000</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>BracketHighlighter angle</string> + <key>scope</key> + <string>brackethighlighter.angle</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#9A35FF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>BracketHighlighter tag</string> + <key>scope</key> + <string>brackethighlighter.tag</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#FFFF00</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>BracketHighlighter quote</string> + <key>scope</key> + <string>brackethighlighter.quote</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#FF07A2</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>BracketHighlighter C define</string> + <key>scope</key> + <string>brackethighlighter.c_define</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#8189FF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>BracketHighlighter Bash</string> + <key>scope</key> + <string>brackethighlighter.bash</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#0B93FF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>=========== Matlab ==========</string> + <key>scope</key> + <string></string> + <key>settings</key> + <dict> + <key>background</key> + <string></string> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string></string> + </dict> + </dict> + <dict> + <key>name</key> + <string>keyword.mathematics</string> + <key>scope</key> + <string>keyword.mathematics.matlab</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#D6FF1E</string> + </dict> + </dict> + </array> + <key>uuid</key> + <string>06CD1FB2-A00A-4F8C-97B2-60E131912345</string> +</dict> +</plist> diff --git a/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/Neon.tmTheme.cache b/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/Neon.tmTheme.cache Binary files differ. diff --git a/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/NeonDark.tmTheme b/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/NeonDark.tmTheme @@ -0,0 +1,414 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<!-- + + Name: Neon Dark + Author: Jack Doyle + License: Public Domain Mark 1.0 +--> +<plist version="1.0"> +<dict> + <key>name</key> + <string>Neon Dark</string> + <key>settings</key> + <array> + <dict> + <key>name</key> + <string>Tag Punctuations</string> + <key>scope</key> + <string>punctuation.definition.tag.begin, punctuation.definition.tag.end</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#F92672</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Doctype Tags</string> + <key>scope</key> + <string>meta.tag.sgml.html</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#F92672</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Attribute Value Separator</string> + <key>scope</key> + <string>punctuation.separator.key-value.html</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#F92672</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Equals</string> + <key>scope</key> + <string>keyword.operator.assignment.js, keyword.operator.comparison.js, keyword.operator.logical.js, keyword.operator.arithmetic.js, keyword.operator.accessor.js, keyword.operator.assignment.augmented.js, punctuation.separator.key-value.js</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#EEE</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Class Method Definition</string> + <key>scope</key> + <string>meta.class.js meta.method.js entity.name.method.js</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#62b4fa</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Class Method</string> + <key>scope</key> + <string>meta.class.js entity.name.function.js</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#62b4fa</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Class This</string> + <key>scope</key> + <string>meta.class.js variable.language.this.js</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#F92672</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Object Property</string> + <key>scope</key> + <string>meta.property.object.js</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#62b4fa</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Numbers</string> + <key>scope</key> + <string>constant.numeric.js</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#FD971F</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Function</string> + <key>scope</key> + <string>variable.function.js</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#62b4fa</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>CSS Property Name</string> + <key>scope</key> + <string>meta.property-name.css</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#F92672</string> + </dict> + </dict> + <dict> + <key>settings</key> + <dict> + <key>background</key> + <string>#272822</string> + <key>caret</key> + <string>#F8F8F0</string> + <key>foreground</key> + <string>#F8F8F2</string> + <key>invisibles</key> + <string>#3B3A32</string> + <key>lineHighlight</key> + <string>#2F2F2F</string> + <key>selection</key> + <string>#333F48</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Comment</string> + <key>scope</key> + <string>comment</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#75715E</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>String</string> + <key>scope</key> + <string>string</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#A6E22E</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Number</string> + <key>scope</key> + <string>constant.numeric</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#F92672</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Built-in constant</string> + <key>scope</key> + <string>constant.language</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#AE81FF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>User-defined constant</string> + <key>scope</key> + <string>constant.character, constant.other</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#62B4FA</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Variable</string> + <key>scope</key> + <string>variable</string> + <key>settings</key> + <dict> + </dict> + </dict> + <dict> + <key>name</key> + <string>Keyword</string> + <key>scope</key> + <string>keyword</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#F92672</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Storage</string> + <key>scope</key> + <string>storage</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#F92672</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Storage type</string> + <key>scope</key> + <string>storage.type</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#F92672</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Class name</string> + <key>scope</key> + <string>entity.name.class</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>underline</string> + <key>foreground</key> + <string>#F92672</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Inherited class</string> + <key>scope</key> + <string>entity.other.inherited-class</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string> underline </string> + <key>foreground</key> + <string>#F92672</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Function name</string> + <key>scope</key> + <string>entity.name.function</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#EEEEEE</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Function argument</string> + <key>scope</key> + <string>variable.parameter</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#FD971F</string> + <key>fontStyle</key> + <string>italic</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Tag name</string> + <key>scope</key> + <string>entity.name.tag</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#F92672</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Tag attribute</string> + <key>scope</key> + <string>entity.other.attribute-name</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#F92672</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Library function</string> + <key>scope</key> + <string>support.function</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#62B4FA</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Library constant</string> + <key>scope</key> + <string>support.constant</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#62B4FA</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Library class/type</string> + <key>scope</key> + <string>support.type, support.class</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#eee</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Library variable</string> + <key>scope</key> + <string>support.other.variable</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#62B4FA</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Invalid</string> + <key>scope</key> + <string>invalid</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#F92672</string> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#F8F8F0</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Invalid deprecated</string> + <key>scope</key> + <string>invalid.deprecated</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#AE81FF</string> + <key>foreground</key> + <string>#F8F8F0</string> + </dict> + </dict> + </array> + <key>uuid</key> + <string>D8D5E82E-3D5B-46B5-B38E-8C841C21347D</string> + <key>colorSpaceName</key> + <string>sRGB</string> + <key>semanticClass</key> + <string>theme.dark.monokai</string> +</dict> +</plist> +\ No newline at end of file diff --git a/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/NeonDark.tmTheme.cache b/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/NeonDark.tmTheme.cache Binary files differ. diff --git a/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/NeonGlow.tmTheme b/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/NeonGlow.tmTheme @@ -0,0 +1,565 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> + <dict> + <key>settings</key> + <array> + <!-- General --> + <dict> + <key>settings</key> + <dict> + <key>background</key> + <string>#1c1c1c</string> + <key>foreground</key> + <string>#777777</string> + + <key>caret</key> + <string>#D8D9D1</string> + <key>invisibles</key> + <string>#E5E5B2</string> + <key>lineHighlight</key> + <string>#282828</string> + + <key>selection</key> + <string>#223F63</string> + <key>selectionForeground</key> + <string>#ececec</string> + + <key>bracketContentsOptions</key> + <string>underline</string> + <key>tagsForeground</key> + <string>#B6DFEB</string> + <key>tagsOptions</key> + <string>underline</string> + + <key>activeGuide</key> + <string>#777777</string> + <key>stackGuide</key> + <string>#71787c66</string> + <key>guide</key> + <string>#71787c66</string> + </dict> + </dict> + + <!-- Comment --> + <dict> + <key>scope</key> + <string>comment</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>italic bold</string> + <key>foreground</key> + <string>#a1784cee</string> + <key>background</key> + <string>#a1784c20</string> + </dict> + </dict> + + <!-- String --> + <dict> + <key>scope</key> + <string>string</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#aaafebee</string> + <key>background</key> + <string>#aaafdb09</string> + </dict> + </dict> + + <!-- Number --> + <dict> + <key>scope</key> + <string>constant.numeric</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#8fc2bbbb</string> + <key>background</key> + <string>#8fc2bb0f</string> + </dict> + </dict> + + <!-- Includes --> + <dict> + <key>scope</key> + <string>meta.use, support.other.namespace</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#ef6aa7dd</string> + <key>background</key> + <string>#ef6aa710</string> + </dict> + </dict> + + <!-- Built-in Constant --> + <dict> + <key>scope</key> + <string>constant.language</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#bDbe82</string> + <key>background</key> + <string>#bDbe820f</string> + </dict> + </dict> + + <!-- Storage modifier --> + <dict> + <key>scope</key> + <string>storage</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#8B6ccfff</string> + <key>background</key> + <string>#8B5Ddf11</string> + </dict> + </dict> + + <!-- Function Name --> + <dict> + <key>scope</key> + <string>entity.name.function</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#12ffa9f7</string> + <key>background</key> + <string>#22ffa912</string> + </dict> + </dict> + + <!-- function --> + <dict> + <key>scope</key> + <string>meta.function-call</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#cBaf6cff</string> + <key>background</key> + <string>#cBaf6c11</string> + </dict> + </dict> + + <!-- Support Function --> + <dict> + <key>scope</key> + <string>support.function</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#ADAeB2</string> + <key>background</key> + <string>#bDbe820f</string> + </dict> + </dict> + + <!-- Misc Function --> + <dict> + <key>scope</key> + <string>entity.name.function.misc</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#E3E4A9</string> + <key>background</key> + <string>#E3E4A90a</string> + </dict> + </dict> + + <!-- Predicate Function --> + <dict> + <key>scope</key> + <string>entity.name.function.predicate</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#A5DF93</string> + <key>background</key> + <string>#A5DF930a</string> + </dict> + </dict> + + <!-- IO Function --> + <dict> + <key>scope</key> + <string>entity.name.function.io</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#DFB3AC</string> + <key>background</key> + <string>#DFB3AC0a</string> + </dict> + </dict> + + <!-- External Symbol --> + <dict> + <key>scope</key> + <string>variable.other.external-symbol</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#BBDFDD</string> + <key>background</key> + <string>#BBDFDD0a</string> + </dict> + </dict> + + <!-- Variable --> + <dict> + <key>scope</key> + <string>variable.language, variable.other</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#3aafff</string> + <key>background</key> + <string>#3aafff0f</string> + </dict> + </dict> + + <!-- Variable Assignment --> + <dict> + <key>scope</key> + <string>variable.parameter, variable.assignment</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#3aafff</string> + <key>background</key> + <string>#3aafff0f</string> + </dict> + </dict> + + <!-- Keyword --> + <dict> + <key>scope</key> + <string>keyword.control</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#cB5F5Df0</string> + <key>background</key> + <string>#cB5F5D10</string> + </dict> + </dict> + <dict> + <key>scope</key> + <string>keyword.operator</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#bB7Dbf</string> + <key>background</key> + <string>#9B9FfD10</string> + </dict> + </dict> + <dict> + <key>scope</key> + <string>keyword</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#bB7Dbf</string> + <key>background</key> + <string>#9B9FfD10</string> + </dict> + </dict> + + <!-- Structure Name --> + <dict> + <key>scope</key> + <string>entity.name.structure</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#22ff99df</string> + <key>background</key> + <string>#B998DF0a</string> + </dict> + </dict> + + <!-- Type Name --> + <dict> + <key>scope</key> + <string>entity.name.type</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#af77a9ee</string> + <key>background</key> + <string>#af77a90d</string> + </dict> + </dict> + + <!-- Class name --> + <dict> + <key>scope</key> + <string>meta.class, entity.name.class, entity.name.type.class</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#ff4377</string> + <key>background</key> + <string>#ff339916</string> + </dict> + </dict> + + <!-- Support Class --> + <dict> + <key>scope</key> + <string>support.class</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#ef6aa7dd</string> + <key>background</key> + <string>#ef6aa710</string> + </dict> + </dict> + + <!-- Invalid --> + <dict> + <key>scope</key> + <string>invalid</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#CC1B27</string> + <key>foreground</key> + <string>#DFDFD5</string> + </dict> + </dict> + + <!-- String embedded-source --> + <dict> + <key>scope</key> + <string>string source</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>italic</string> + <key>foreground</key> + <string>#3399ffff</string> + <key>background</key> + <string>#0099ff0a</string> + </dict> + </dict> + + <!-- Tag name --> + <dict> + <key>scope</key> + <string>entity.name.tag</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#49a6d2</string> + <key>background</key> + <string>#49a6d212</string> + </dict> + </dict> + + <!-- Tag attribute --> + <dict> + <key>scope</key> + <string>entity.other.attribute-name</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#4986c2cc</string> + <key>background</key> + <string>#4986c209</string> + </dict> + </dict> + + <!-- change specific language styles --> + <!-- all (php, asp, ruby, python, perl) --> + <dict> + <key>scope</key> + <string>source.php, source.asp, source.ruby, source.python, source.perl, punctuation.whitespace + </string> + <key>settings</key> + <dict> + <key>background</key> + <string>#1c1c1c</string> + </dict> + </dict> + + <!-- html/xml and similar things --> + <dict> + <key>scope</key> + <string>text</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#1c1c22</string> + </dict> + </dict> + + <!-- css --> + <dict> + <key>scope</key> + <string>source.css</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#22221c</string> + </dict> + </dict> + + <!-- js --> + <dict> + <key>scope</key> + <string>source.js</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#1c221c</string> + </dict> + </dict> + + <!-- GitGutter --> + <dict> + <key>scope</key> + <string>markup.inserted.git_gutter</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#6cc644</string> + </dict> + </dict> + <dict> + <key>scope</key> + <string>markup.deleted.git_gutter</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#ff7Dbf</string> + </dict> + </dict> + <dict> + <key>scope</key> + <string>markup.changed.git_gutter</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#ff984c</string> + </dict> + </dict> + + <!-- Git Diff --> + <!-- Insert --> + <dict> + <key>scope</key> + <string>markup.inserted</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#12ffa9a0</string> + <key>background</key> + <string>#22ffa912</string> + </dict> + </dict> + <!-- Delete --> + <dict> + <key>scope</key> + <string>markup.deleted</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#ff4377a0</string> + <key>background</key> + <string>#ff339916</string> + </dict> + </dict> + <!-- Changed --> + <dict> + <key>scope</key> + <string>markup.changed, meta.diff.range</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#a1784c</string> + <key>background</key> + <string>#a1784c1b</string> + </dict> + </dict> + <!-- File --> + <dict> + <key>scope</key> + <string>meta.diff.header</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#a1784c</string> + <key>background</key> + <string>#a1784c1b</string> + </dict> + </dict> + <!-- Command --> + <dict> + <key>scope</key> + <string>source.git-diff.command</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#bB7Dbf</string> + <key>background</key> + <string>#9B9FfD10</string> + </dict> + </dict> + + <!-- SublimeLinter --> + <dict> + <key>name</key> + <string>SublimeLinter Error</string> + <key>scope</key> + <string>sublimelinter.mark.error</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#D02000</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>SublimeLinter Warning</string> + <key>scope</key> + <string>sublimelinter.mark.warning</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#DDB700</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>SublimeLinter Gutter Mark</string> + <key>scope</key> + <string>sublimelinter.gutter-mark</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#FFFFFF</string> + </dict> + </dict> + </array> + </dict> +</plist> diff --git a/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/NeonGlow.tmTheme.cache b/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/NeonGlow.tmTheme.cache Binary files differ. diff --git a/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/TronLegacy.tmTheme b/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/TronLegacy.tmTheme @@ -0,0 +1,398 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<!-- +====================================================================== +Tron +====================================================================== +A Sublime Text 2 / Textmate theme. +Copyright (c) 2012 Dayle Rees. +Released under the MIT License <http://opensource.org/licenses/MIT> +====================================================================== +Find more themes at : https://github.com/daylerees/colour-schemes +====================================================================== +--> +<plist version="1.0"> +<dict> + <key>name</key> + <string>TronLegacy</string> + <key>settings</key> + <array> + <dict> + <key>settings</key> + <dict> + <key>background</key> + <string>#14191f</string> + <key>caret</key> + <string>#F8F8F0</string> + <key>foreground</key> + <string>#aec2e0</string> + <key>invisibles</key> + <string>#3B3A32</string> + <key>lineHighlight</key> + <string>#1b232c</string> + <key>selection</key> + <string>#183c66</string> + <key>findHighlight</key> + <string>#FFE792</string> + <key>findHighlightForeground</key> + <string>#000000</string> + <key>selectionBorder</key> + <string>#183c66</string> + <key>activeGuide</key> + <string>#9D550FB0</string> + + <key>bracketsForeground</key> + <string>#F8F8F2A5</string> + <key>bracketsOptions</key> + <string>underline</string> + + <key>bracketContentsForeground</key> + <string>#F8F8F2A5</string> + <key>bracketContentsOptions</key> + <string>underline</string> + + <key>tagsOptions</key> + <string>stippled_underline</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Comment</string> + <key>scope</key> + <string>comment</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#324357</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>String</string> + <key>scope</key> + <string>string</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#FF410D</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Number</string> + <key>scope</key> + <string>constant.numeric</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#C7F026</string> + </dict> + </dict> + + <dict> + <key>name</key> + <string>Built-in constant</string> + <key>scope</key> + <string>constant.language</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#FFB20D</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>User-defined constant</string> + <key>scope</key> + <string>constant.character, constant.other</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#FFB20D</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Variable</string> + <key>scope</key> + <string>variable</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d0dfe6</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Keyword</string> + <key>scope</key> + <string>keyword</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#748aa6</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Storage</string> + <key>scope</key> + <string>storage</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#ffffff</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Storage type</string> + <key>scope</key> + <string>storage.type</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>italic</string> + <key>foreground</key> + <string>#267fb5</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Class name</string> + <key>scope</key> + <string>entity.name.class</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>underline</string> + <key>foreground</key> + <string>#F79D1E</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Inherited class</string> + <key>scope</key> + <string>entity.other.inherited-class</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>italic underline</string> + <key>foreground</key> + <string>#F79D1E</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Function name</string> + <key>scope</key> + <string>entity.name.function</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#FFB20D</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Function argument</string> + <key>scope</key> + <string>variable.parameter</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>italic</string> + <key>foreground</key> + <string>#95CC5E</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Tag name</string> + <key>scope</key> + <string>entity.name.tag</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#267fb5</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Tag attribute</string> + <key>scope</key> + <string>entity.other.attribute-name</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#FFB20D</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Library function</string> + <key>scope</key> + <string>support.function</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#267fb5</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Library constant</string> + <key>scope</key> + <string>support.constant</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#267fb5</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Library class/type</string> + <key>scope</key> + <string>support.type, support.class</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>italic</string> + <key>foreground</key> + <string>#267fb5</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Library variable</string> + <key>scope</key> + <string>support.other.variable</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Invalid</string> + <key>scope</key> + <string>invalid</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#00A8C6</string> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#F8F8F0</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Invalid deprecated</string> + <key>scope</key> + <string>invalid.deprecated</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#8FBE00</string> + <key>foreground</key> + <string>#F8F8F0</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>JSON String</string> + <key>scope</key> + <string>meta.structure.dictionary.json string.quoted.double.json</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#CFCFC2</string> + </dict> + </dict> + + <dict> + <key>name</key> + <string>diff.header</string> + <key>scope</key> + <string>meta.diff, meta.diff.header</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#75715E</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>diff.deleted</string> + <key>scope</key> + <string>markup.deleted</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#00A8C6</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>diff.inserted</string> + <key>scope</key> + <string>markup.inserted</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#A6E22E</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>diff.changed</string> + <key>scope</key> + <string>markup.changed</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#E6DB74</string> + </dict> + </dict> + + <dict> + <key>scope</key> + <string>constant.numeric.line-number.find-in-files - match</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#8FBE00A0</string> + </dict> + </dict> + <dict> + <key>scope</key> + <string>entity.name.filename.find-in-files</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#E6DB74</string> + </dict> + </dict> + + </array> + <key>uuid</key> + <string>6BC5629A-D5D9-4337-9674-6355EB039ADB</string> +</dict> +</plist> diff --git a/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/TronLegacy.tmTheme.cache b/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/TronLegacy.tmTheme.cache Binary files differ. diff --git a/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/gotham.tmTheme b/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/gotham.tmTheme @@ -0,0 +1,510 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>author</key> + <string>terminal.sexy</string> + <key>name</key> + <string>terminal.sexy</string> + <key>semanticClass</key> + <string>terminal.sexy</string> + <key>colorSpaceName</key> + <string>sRGB</string> + <key>gutterSettings</key> + <dict> + <key>background</key> + <string>#0b0b0b</string> + <key>divider</key> + <string>#c33027</string> + <key>foreground</key> + <string>#d9d9d9</string> + <key>selectionBackground</key> + <string>#0a0f14</string> + <key>selectionForeground</key> + <string>#d3ebe9</string> + </dict> + <key>settings</key> + <array> + <dict> + <key>settings</key> + <dict> + <key>background</key> + <string>#0b0b0b</string> + <key>caret</key> + <string>#4e5165</string> + <key>foreground</key> + <string>#d9d9d9</string> + <key>invisibles</key> + <string>#edb54b</string> + <key>lineHighlight</key> + <string>#edb54b55</string> + <key>selection</key> + <string>#26a98b</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Text</string> + <key>scope</key> + <string>variable.parameter.function</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#4e5165</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Comments</string> + <key>scope</key> + <string>comment, punctuation.definition.comment</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#edb54b</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Punctuation</string> + <key>scope</key> + <string>punctuation.definition.string, punctuation.definition.variable, punctuation.definition.string, punctuation.definition.parameters, punctuation.definition.string, punctuation.definition.array</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#4e5165</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Delimiters</string> + <key>scope</key> + <string>none</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#4e5165</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Operators</string> + <key>scope</key> + <string>keyword.operator</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#4e5165</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Keywords</string> + <key>scope</key> + <string>keyword</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#599caa</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Variables</string> + <key>scope</key> + <string>variable</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#10151b</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Functions</string> + <key>scope</key> + <string>entity.name.function, meta.require, support.function.any-method</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#888ba5</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Classes</string> + <key>scope</key> + <string>support.class, entity.name.class, entity.name.type.class</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#36454f</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Classes</string> + <key>scope</key> + <string>meta.class</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#98d1ce</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Methods</string> + <key>scope</key> + <string>keyword.other.special-method</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#888ba5</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Storage</string> + <key>scope</key> + <string>storage</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#599caa</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Support</string> + <key>scope</key> + <string>support.function</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#093748</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Strings, Inherited Class</string> + <key>scope</key> + <string>string, constant.other.symbol, entity.other.inherited-class</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#245361</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Integers</string> + <key>scope</key> + <string>constant.numeric</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d26939</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Floats</string> + <key>scope</key> + <string>none</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d26939</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Boolean</string> + <key>scope</key> + <string>none</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d26939</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Constants</string> + <key>scope</key> + <string>constant</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d26939</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Tags</string> + <key>scope</key> + <string>entity.name.tag</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#10151b</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Attributes</string> + <key>scope</key> + <string>entity.other.attribute-name</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d26939</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Attribute IDs</string> + <key>scope</key> + <string>entity.other.attribute-name.id, punctuation.definition.entity</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#888ba5</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Selector</string> + <key>scope</key> + <string>meta.selector</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#599caa</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Values</string> + <key>scope</key> + <string>none</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d26939</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Headings</string> + <key>scope</key> + <string>markup.heading punctuation.definition.heading, entity.name.section</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#888ba5</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Units</string> + <key>scope</key> + <string>keyword.other.unit</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d26939</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Bold</string> + <key>scope</key> + <string>markup.bold, punctuation.definition.bold</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>bold</string> + <key>foreground</key> + <string>#36454f</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Italic</string> + <key>scope</key> + <string>markup.italic, punctuation.definition.italic</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>italic</string> + <key>foreground</key> + <string>#599caa</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Code</string> + <key>scope</key> + <string>markup.raw.inline</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#245361</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Link Text</string> + <key>scope</key> + <string>string.other.link</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#10151b</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Link Url</string> + <key>scope</key> + <string>meta.link</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d26939</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Lists</string> + <key>scope</key> + <string>markup.list</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#10151b</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Quotes</string> + <key>scope</key> + <string>markup.quote</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d26939</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Separator</string> + <key>scope</key> + <string>meta.separator</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#26a98b</string> + <key>foreground</key> + <string>#4e5165</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Inserted</string> + <key>scope</key> + <string>markup.inserted</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#245361</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Deleted</string> + <key>scope</key> + <string>markup.deleted</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#10151b</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Changed</string> + <key>scope</key> + <string>markup.changed</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#599caa</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Colors</string> + <key>scope</key> + <string>constant.other.color</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#093748</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Regular Expressions</string> + <key>scope</key> + <string>string.regexp</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#093748</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Escape Characters</string> + <key>scope</key> + <string>constant.character.escape</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#093748</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Embedded</string> + <key>scope</key> + <string>punctuation.section.embedded, variable.interpolation</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d3ebe9</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Invalid</string> + <key>scope</key> + <string>invalid.illegal</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#10151b</string> + <key>foreground</key> + <string>#0a0f14</string> + </dict> + </dict> + </array> + <key>uuid</key> + <string>terminal-dot-sexy</string> +</dict> +</plist> diff --git a/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/gotham.tmTheme.cache b/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/gotham.tmTheme.cache Binary files differ. diff --git a/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/gotham2.tmTheme b/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/gotham2.tmTheme @@ -0,0 +1,510 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>author</key> + <string>terminal.sexy</string> + <key>name</key> + <string>terminal.sexy</string> + <key>semanticClass</key> + <string>terminal.sexy</string> + <key>colorSpaceName</key> + <string>sRGB</string> + <key>gutterSettings</key> + <dict> + <key>background</key> + <string>#212121</string> + <key>divider</key> + <string>#c33027</string> + <key>foreground</key> + <string>#d9d9d9</string> + <key>selectionBackground</key> + <string>#0a0f14</string> + <key>selectionForeground</key> + <string>#d3ebe9</string> + </dict> + <key>settings</key> + <array> + <dict> + <key>settings</key> + <dict> + <key>background</key> + <string>#212121</string> + <key>caret</key> + <string>#4e5165</string> + <key>foreground</key> + <string>#d9d9d9</string> + <key>invisibles</key> + <string>#edb54b</string> + <key>lineHighlight</key> + <string>#edb54b55</string> + <key>selection</key> + <string>#26a98b</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Text</string> + <key>scope</key> + <string>variable.parameter.function</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#4e5165</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Comments</string> + <key>scope</key> + <string>comment, punctuation.definition.comment</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#edb54b</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Punctuation</string> + <key>scope</key> + <string>punctuation.definition.string, punctuation.definition.variable, punctuation.definition.string, punctuation.definition.parameters, punctuation.definition.string, punctuation.definition.array</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#4e5165</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Delimiters</string> + <key>scope</key> + <string>none</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#4e5165</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Operators</string> + <key>scope</key> + <string>keyword.operator</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#4e5165</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Keywords</string> + <key>scope</key> + <string>keyword</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#599caa</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Variables</string> + <key>scope</key> + <string>variable</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#10151b</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Functions</string> + <key>scope</key> + <string>entity.name.function, meta.require, support.function.any-method</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#888ba5</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Classes</string> + <key>scope</key> + <string>support.class, entity.name.class, entity.name.type.class</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#36454f</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Classes</string> + <key>scope</key> + <string>meta.class</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#98d1ce</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Methods</string> + <key>scope</key> + <string>keyword.other.special-method</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#888ba5</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Storage</string> + <key>scope</key> + <string>storage</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#599caa</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Support</string> + <key>scope</key> + <string>support.function</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#093748</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Strings, Inherited Class</string> + <key>scope</key> + <string>string, constant.other.symbol, entity.other.inherited-class</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#245361</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Integers</string> + <key>scope</key> + <string>constant.numeric</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d26939</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Floats</string> + <key>scope</key> + <string>none</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d26939</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Boolean</string> + <key>scope</key> + <string>none</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d26939</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Constants</string> + <key>scope</key> + <string>constant</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d26939</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Tags</string> + <key>scope</key> + <string>entity.name.tag</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#10151b</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Attributes</string> + <key>scope</key> + <string>entity.other.attribute-name</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d26939</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Attribute IDs</string> + <key>scope</key> + <string>entity.other.attribute-name.id, punctuation.definition.entity</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#888ba5</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Selector</string> + <key>scope</key> + <string>meta.selector</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#599caa</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Values</string> + <key>scope</key> + <string>none</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d26939</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Headings</string> + <key>scope</key> + <string>markup.heading punctuation.definition.heading, entity.name.section</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#888ba5</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Units</string> + <key>scope</key> + <string>keyword.other.unit</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d26939</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Bold</string> + <key>scope</key> + <string>markup.bold, punctuation.definition.bold</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>bold</string> + <key>foreground</key> + <string>#36454f</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Italic</string> + <key>scope</key> + <string>markup.italic, punctuation.definition.italic</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>italic</string> + <key>foreground</key> + <string>#599caa</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Code</string> + <key>scope</key> + <string>markup.raw.inline</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#245361</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Link Text</string> + <key>scope</key> + <string>string.other.link</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#10151b</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Link Url</string> + <key>scope</key> + <string>meta.link</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d26939</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Lists</string> + <key>scope</key> + <string>markup.list</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#10151b</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Quotes</string> + <key>scope</key> + <string>markup.quote</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d26939</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Separator</string> + <key>scope</key> + <string>meta.separator</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#26a98b</string> + <key>foreground</key> + <string>#4e5165</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Inserted</string> + <key>scope</key> + <string>markup.inserted</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#245361</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Deleted</string> + <key>scope</key> + <string>markup.deleted</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#10151b</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Changed</string> + <key>scope</key> + <string>markup.changed</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#599caa</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Colors</string> + <key>scope</key> + <string>constant.other.color</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#093748</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Regular Expressions</string> + <key>scope</key> + <string>string.regexp</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#093748</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Escape Characters</string> + <key>scope</key> + <string>constant.character.escape</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#093748</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Embedded</string> + <key>scope</key> + <string>punctuation.section.embedded, variable.interpolation</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d3ebe9</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Invalid</string> + <key>scope</key> + <string>invalid.illegal</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#10151b</string> + <key>foreground</key> + <string>#0a0f14</string> + </dict> + </dict> + </array> + <key>uuid</key> + <string>terminal-dot-sexy</string> +</dict> +</plist> diff --git a/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/gotham2.tmTheme.cache b/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/gotham2.tmTheme.cache Binary files differ. diff --git a/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/gotham3.tmTheme b/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/gotham3.tmTheme @@ -0,0 +1,510 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>author</key> + <string>terminal.sexy</string> + <key>name</key> + <string>terminal.sexy</string> + <key>semanticClass</key> + <string>terminal.sexy</string> + <key>colorSpaceName</key> + <string>sRGB</string> + <key>gutterSettings</key> + <dict> + <key>background</key> + <string>#0b0b0b</string> + <key>divider</key> + <string>#c33027</string> + <key>foreground</key> + <string>#d9d9d9</string> + <key>selectionBackground</key> + <string>#0a0f14</string> + <key>selectionForeground</key> + <string>#d3ebe9</string> + </dict> + <key>settings</key> + <array> + <dict> + <key>settings</key> + <dict> + <key>background</key> + <string>#0b0b0b</string> + <key>caret</key> + <string>#4e5165</string> + <key>foreground</key> + <string>#d9d9d9</string> + <key>invisibles</key> + <string>#edb54b</string> + <key>lineHighlight</key> + <string>#edb54b55</string> + <key>selection</key> + <string>#26a98b</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Text</string> + <key>scope</key> + <string>variable.parameter.function</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#4e5165</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Comments</string> + <key>scope</key> + <string>comment, punctuation.definition.comment</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#edb54b</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Punctuation</string> + <key>scope</key> + <string>punctuation.definition.string, punctuation.definition.variable, punctuation.definition.string, punctuation.definition.parameters, punctuation.definition.string, punctuation.definition.array</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#4e5165</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Delimiters</string> + <key>scope</key> + <string>none</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#4e5165</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Operators</string> + <key>scope</key> + <string>keyword.operator</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#4e5165</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Keywords</string> + <key>scope</key> + <string>keyword</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#599caa</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Variables</string> + <key>scope</key> + <string>variable</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#10151b</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Functions</string> + <key>scope</key> + <string>entity.name.function, meta.require, support.function.any-method</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#888ba5</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Classes</string> + <key>scope</key> + <string>support.class, entity.name.class, entity.name.type.class</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#36454f</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Classes</string> + <key>scope</key> + <string>meta.class</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#98d1ce</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Methods</string> + <key>scope</key> + <string>keyword.other.special-method</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#888ba5</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Storage</string> + <key>scope</key> + <string>storage</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#599caa</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Support</string> + <key>scope</key> + <string>support.function</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#093748</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Strings, Inherited Class</string> + <key>scope</key> + <string>string, constant.other.symbol, entity.other.inherited-class</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#245361</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Integers</string> + <key>scope</key> + <string>constant.numeric</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d26939</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Floats</string> + <key>scope</key> + <string>none</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d26939</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Boolean</string> + <key>scope</key> + <string>none</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d26939</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Constants</string> + <key>scope</key> + <string>constant</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d26939</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Tags</string> + <key>scope</key> + <string>entity.name.tag</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#10151b</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Attributes</string> + <key>scope</key> + <string>entity.other.attribute-name</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d26939</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Attribute IDs</string> + <key>scope</key> + <string>entity.other.attribute-name.id, punctuation.definition.entity</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#888ba5</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Selector</string> + <key>scope</key> + <string>meta.selector</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#599caa</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Values</string> + <key>scope</key> + <string>none</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d26939</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Headings</string> + <key>scope</key> + <string>markup.heading punctuation.definition.heading, entity.name.section</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#888ba5</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Units</string> + <key>scope</key> + <string>keyword.other.unit</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d26939</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Bold</string> + <key>scope</key> + <string>markup.bold, punctuation.definition.bold</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>bold</string> + <key>foreground</key> + <string>#36454f</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Italic</string> + <key>scope</key> + <string>markup.italic, punctuation.definition.italic</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>italic</string> + <key>foreground</key> + <string>#599caa</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Code</string> + <key>scope</key> + <string>markup.raw.inline</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#245361</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Link Text</string> + <key>scope</key> + <string>string.other.link</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#10151b</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Link Url</string> + <key>scope</key> + <string>meta.link</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d26939</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Lists</string> + <key>scope</key> + <string>markup.list</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#10151b</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Quotes</string> + <key>scope</key> + <string>markup.quote</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d26939</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Separator</string> + <key>scope</key> + <string>meta.separator</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#26a98b</string> + <key>foreground</key> + <string>#4e5165</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Inserted</string> + <key>scope</key> + <string>markup.inserted</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#245361</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Deleted</string> + <key>scope</key> + <string>markup.deleted</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#10151b</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Changed</string> + <key>scope</key> + <string>markup.changed</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#599caa</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Colors</string> + <key>scope</key> + <string>constant.other.color</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#093748</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Regular Expressions</string> + <key>scope</key> + <string>string.regexp</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#093748</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Escape Characters</string> + <key>scope</key> + <string>constant.character.escape</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#093748</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Embedded</string> + <key>scope</key> + <string>punctuation.section.embedded, variable.interpolation</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d3ebe9</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Invalid</string> + <key>scope</key> + <string>invalid.illegal</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#10151b</string> + <key>foreground</key> + <string>#0a0f14</string> + </dict> + </dict> + </array> + <key>uuid</key> + <string>terminal-dot-sexy</string> +</dict> +</plist> diff --git a/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/gotham3.tmTheme.cache b/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/gotham3.tmTheme.cache Binary files differ. diff --git a/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/gotham_original.tmTheme b/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/gotham_original.tmTheme @@ -0,0 +1,510 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>author</key> + <string>terminal.sexy</string> + <key>name</key> + <string>terminal.sexy</string> + <key>semanticClass</key> + <string>terminal.sexy</string> + <key>colorSpaceName</key> + <string>sRGB</string> + <key>gutterSettings</key> + <dict> + <key>background</key> + <string>#0a0f14</string> + <key>divider</key> + <string>#c33027</string> + <key>foreground</key> + <string>#98d1ce</string> + <key>selectionBackground</key> + <string>#0a0f14</string> + <key>selectionForeground</key> + <string>#d3ebe9</string> + </dict> + <key>settings</key> + <array> + <dict> + <key>settings</key> + <dict> + <key>background</key> + <string>#0a0f14</string> + <key>caret</key> + <string>#4e5165</string> + <key>foreground</key> + <string>#98d1ce</string> + <key>invisibles</key> + <string>#edb54b</string> + <key>lineHighlight</key> + <string>#edb54b55</string> + <key>selection</key> + <string>#26a98b</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Text</string> + <key>scope</key> + <string>variable.parameter.function</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#4e5165</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Comments</string> + <key>scope</key> + <string>comment, punctuation.definition.comment</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#edb54b</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Punctuation</string> + <key>scope</key> + <string>punctuation.definition.string, punctuation.definition.variable, punctuation.definition.string, punctuation.definition.parameters, punctuation.definition.string, punctuation.definition.array</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#4e5165</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Delimiters</string> + <key>scope</key> + <string>none</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#4e5165</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Operators</string> + <key>scope</key> + <string>keyword.operator</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#4e5165</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Keywords</string> + <key>scope</key> + <string>keyword</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#599caa</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Variables</string> + <key>scope</key> + <string>variable</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#10151b</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Functions</string> + <key>scope</key> + <string>entity.name.function, meta.require, support.function.any-method</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#888ba5</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Classes</string> + <key>scope</key> + <string>support.class, entity.name.class, entity.name.type.class</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#081f2d</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Classes</string> + <key>scope</key> + <string>meta.class</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#98d1ce</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Methods</string> + <key>scope</key> + <string>keyword.other.special-method</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#888ba5</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Storage</string> + <key>scope</key> + <string>storage</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#599caa</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Support</string> + <key>scope</key> + <string>support.function</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#093748</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Strings, Inherited Class</string> + <key>scope</key> + <string>string, constant.other.symbol, entity.other.inherited-class</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#245361</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Integers</string> + <key>scope</key> + <string>constant.numeric</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d26939</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Floats</string> + <key>scope</key> + <string>none</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d26939</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Boolean</string> + <key>scope</key> + <string>none</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d26939</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Constants</string> + <key>scope</key> + <string>constant</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d26939</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Tags</string> + <key>scope</key> + <string>entity.name.tag</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#10151b</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Attributes</string> + <key>scope</key> + <string>entity.other.attribute-name</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d26939</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Attribute IDs</string> + <key>scope</key> + <string>entity.other.attribute-name.id, punctuation.definition.entity</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#888ba5</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Selector</string> + <key>scope</key> + <string>meta.selector</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#599caa</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Values</string> + <key>scope</key> + <string>none</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d26939</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Headings</string> + <key>scope</key> + <string>markup.heading punctuation.definition.heading, entity.name.section</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#888ba5</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Units</string> + <key>scope</key> + <string>keyword.other.unit</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d26939</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Bold</string> + <key>scope</key> + <string>markup.bold, punctuation.definition.bold</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>bold</string> + <key>foreground</key> + <string>#081f2d</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Italic</string> + <key>scope</key> + <string>markup.italic, punctuation.definition.italic</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>italic</string> + <key>foreground</key> + <string>#599caa</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Code</string> + <key>scope</key> + <string>markup.raw.inline</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#245361</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Link Text</string> + <key>scope</key> + <string>string.other.link</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#10151b</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Link Url</string> + <key>scope</key> + <string>meta.link</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d26939</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Lists</string> + <key>scope</key> + <string>markup.list</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#10151b</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Quotes</string> + <key>scope</key> + <string>markup.quote</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d26939</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Separator</string> + <key>scope</key> + <string>meta.separator</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#26a98b</string> + <key>foreground</key> + <string>#4e5165</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Inserted</string> + <key>scope</key> + <string>markup.inserted</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#245361</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Deleted</string> + <key>scope</key> + <string>markup.deleted</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#10151b</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Changed</string> + <key>scope</key> + <string>markup.changed</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#599caa</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Colors</string> + <key>scope</key> + <string>constant.other.color</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#093748</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Regular Expressions</string> + <key>scope</key> + <string>string.regexp</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#093748</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Escape Characters</string> + <key>scope</key> + <string>constant.character.escape</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#093748</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Embedded</string> + <key>scope</key> + <string>punctuation.section.embedded, variable.interpolation</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d3ebe9</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Invalid</string> + <key>scope</key> + <string>invalid.illegal</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#10151b</string> + <key>foreground</key> + <string>#0a0f14</string> + </dict> + </dict> + </array> + <key>uuid</key> + <string>terminal-dot-sexy</string> +</dict> +</plist> diff --git a/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/gotham_original.tmTheme.cache b/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/gotham_original.tmTheme.cache Binary files differ. diff --git a/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/pyratesoft.tmTheme b/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/pyratesoft.tmTheme @@ -0,0 +1,398 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<!-- +====================================================================== +Tron +====================================================================== +A Sublime Text 2 / Textmate theme. +Copyright (c) 2012 Dayle Rees. +Released under the MIT License <http://opensource.org/licenses/MIT> +====================================================================== +Find more themes at : https://github.com/daylerees/colour-schemes +====================================================================== +--> +<plist version="1.0"> +<dict> + <key>name</key> + <string>TronLegacy</string> + <key>settings</key> + <array> + <dict> + <key>settings</key> + <dict> + <key>background</key> + <string>#181818</string> + <key>caret</key> + <string>#F8F8F0</string> + <key>foreground</key> + <string>#aec2e0</string> + <key>invisibles</key> + <string>#3B3A32</string> + <key>lineHighlight</key> + <string>#1b232c</string> + <key>selection</key> + <string>#183c66</string> + <key>findHighlight</key> + <string>#FFE792</string> + <key>findHighlightForeground</key> + <string>#000000</string> + <key>selectionBorder</key> + <string>#183c66</string> + <key>activeGuide</key> + <string>#9D550FB0</string> + + <key>bracketsForeground</key> + <string>#F8F8F2A5</string> + <key>bracketsOptions</key> + <string>underline</string> + + <key>bracketContentsForeground</key> + <string>#F8F8F2A5</string> + <key>bracketContentsOptions</key> + <string>underline</string> + + <key>tagsOptions</key> + <string>stippled_underline</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Comment</string> + <key>scope</key> + <string>comment</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#324357</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>String</string> + <key>scope</key> + <string>string</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#FF410D</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Number</string> + <key>scope</key> + <string>constant.numeric</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#C7F026</string> + </dict> + </dict> + + <dict> + <key>name</key> + <string>Built-in constant</string> + <key>scope</key> + <string>constant.language</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#FFB20D</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>User-defined constant</string> + <key>scope</key> + <string>constant.character, constant.other</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#FFB20D</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Variable</string> + <key>scope</key> + <string>variable</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d0dfe6</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Keyword</string> + <key>scope</key> + <string>keyword</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#748aa6</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Storage</string> + <key>scope</key> + <string>storage</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#ffffff</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Storage type</string> + <key>scope</key> + <string>storage.type</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>italic</string> + <key>foreground</key> + <string>#267fb5</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Class name</string> + <key>scope</key> + <string>entity.name.class</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>underline</string> + <key>foreground</key> + <string>#F79D1E</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Inherited class</string> + <key>scope</key> + <string>entity.other.inherited-class</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>italic underline</string> + <key>foreground</key> + <string>#F79D1E</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Function name</string> + <key>scope</key> + <string>entity.name.function</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#FFB20D</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Function argument</string> + <key>scope</key> + <string>variable.parameter</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>italic</string> + <key>foreground</key> + <string>#95CC5E</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Tag name</string> + <key>scope</key> + <string>entity.name.tag</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#267fb5</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Tag attribute</string> + <key>scope</key> + <string>entity.other.attribute-name</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#FFB20D</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Library function</string> + <key>scope</key> + <string>support.function</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#267fb5</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Library constant</string> + <key>scope</key> + <string>support.constant</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#267fb5</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Library class/type</string> + <key>scope</key> + <string>support.type, support.class</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>italic</string> + <key>foreground</key> + <string>#267fb5</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Library variable</string> + <key>scope</key> + <string>support.other.variable</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Invalid</string> + <key>scope</key> + <string>invalid</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#00A8C6</string> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#F8F8F0</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Invalid deprecated</string> + <key>scope</key> + <string>invalid.deprecated</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#8FBE00</string> + <key>foreground</key> + <string>#F8F8F0</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>JSON String</string> + <key>scope</key> + <string>meta.structure.dictionary.json string.quoted.double.json</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#CFCFC2</string> + </dict> + </dict> + + <dict> + <key>name</key> + <string>diff.header</string> + <key>scope</key> + <string>meta.diff, meta.diff.header</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#75715E</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>diff.deleted</string> + <key>scope</key> + <string>markup.deleted</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#00A8C6</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>diff.inserted</string> + <key>scope</key> + <string>markup.inserted</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#A6E22E</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>diff.changed</string> + <key>scope</key> + <string>markup.changed</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#E6DB74</string> + </dict> + </dict> + + <dict> + <key>scope</key> + <string>constant.numeric.line-number.find-in-files - match</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#8FBE00A0</string> + </dict> + </dict> + <dict> + <key>scope</key> + <string>entity.name.filename.find-in-files</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#E6DB74</string> + </dict> + </dict> + + </array> + <key>uuid</key> + <string>6BC5629A-D5D9-4337-9674-6355EB039ADB</string> +</dict> +</plist> diff --git a/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/pyratesoft.tmTheme.cache b/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/pyratesoft.tmTheme.cache Binary files differ. diff --git a/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/pyratesoft2.tmTheme b/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/pyratesoft2.tmTheme @@ -0,0 +1,510 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>author</key> + <string>terminal.sexy</string> + <key>name</key> + <string>terminal.sexy</string> + <key>semanticClass</key> + <string>terminal.sexy</string> + <key>colorSpaceName</key> + <string>sRGB</string> + <key>gutterSettings</key> + <dict> + <key>background</key> + <string>#0b0b0b</string> + <key>divider</key> + <string>#803131</string> + <key>foreground</key> + <string>#d9d9d9</string> + <key>selectionBackground</key> + <string>#2d2d2d</string> + <key>selectionForeground</key> + <string>#d9d9d9</string> + </dict> + <key>settings</key> + <array> + <dict> + <key>settings</key> + <dict> + <key>background</key> + <string>#0b0b0b</string> + <key>caret</key> + <string>#4e596a</string> + <key>foreground</key> + <string>#d9d9d9</string> + <key>invisibles</key> + <string>#4e596a</string> + <key>lineHighlight</key> + <string>#4e596a55</string> + <key>selection</key> + <string>#5c954f</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Text</string> + <key>scope</key> + <string>variable.parameter.function</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#4e596a</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Comments</string> + <key>scope</key> + <string>comment, punctuation.definition.comment</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#4e596a</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Punctuation</string> + <key>scope</key> + <string>punctuation.definition.string, punctuation.definition.variable, punctuation.definition.string, punctuation.definition.parameters, punctuation.definition.string, punctuation.definition.array</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#4e596a</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Delimiters</string> + <key>scope</key> + <string>none</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#4e596a</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Operators</string> + <key>scope</key> + <string>keyword.operator</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#4e596a</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Keywords</string> + <key>scope</key> + <string>keyword</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#84a6d4</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Variables</string> + <key>scope</key> + <string>variable</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#505050</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Functions</string> + <key>scope</key> + <string>entity.name.function, meta.require, support.function.any-method</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#84a6d4</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Classes</string> + <key>scope</key> + <string>support.class, entity.name.class, entity.name.type.class</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#7ecc6c</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Classes</string> + <key>scope</key> + <string>meta.class</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#aaaaaa</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Methods</string> + <key>scope</key> + <string>keyword.other.special-method</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#84a6d4</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Storage</string> + <key>scope</key> + <string>storage</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#84a6d4</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Support</string> + <key>scope</key> + <string>support.function</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#84a6d4</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Strings, Inherited Class</string> + <key>scope</key> + <string>string, constant.other.symbol, entity.other.inherited-class</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#84a6d4</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Integers</string> + <key>scope</key> + <string>constant.numeric</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#84a6d4</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Floats</string> + <key>scope</key> + <string>none</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#84a6d4</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Boolean</string> + <key>scope</key> + <string>none</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#84a6d4</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Constants</string> + <key>scope</key> + <string>constant</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#84a6d4</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Tags</string> + <key>scope</key> + <string>entity.name.tag</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#505050</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Attributes</string> + <key>scope</key> + <string>entity.other.attribute-name</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#84a6d4</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Attribute IDs</string> + <key>scope</key> + <string>entity.other.attribute-name.id, punctuation.definition.entity</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#84a6d4</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Selector</string> + <key>scope</key> + <string>meta.selector</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#84a6d4</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Values</string> + <key>scope</key> + <string>none</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#84a6d4</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Headings</string> + <key>scope</key> + <string>markup.heading punctuation.definition.heading, entity.name.section</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#84a6d4</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Units</string> + <key>scope</key> + <string>keyword.other.unit</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#84a6d4</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Bold</string> + <key>scope</key> + <string>markup.bold, punctuation.definition.bold</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>bold</string> + <key>foreground</key> + <string>#7ecc6c</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Italic</string> + <key>scope</key> + <string>markup.italic, punctuation.definition.italic</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>italic</string> + <key>foreground</key> + <string>#84a6d4</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Code</string> + <key>scope</key> + <string>markup.raw.inline</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#84a6d4</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Link Text</string> + <key>scope</key> + <string>string.other.link</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#505050</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Link Url</string> + <key>scope</key> + <string>meta.link</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#84a6d4</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Lists</string> + <key>scope</key> + <string>markup.list</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#505050</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Quotes</string> + <key>scope</key> + <string>markup.quote</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#84a6d4</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Separator</string> + <key>scope</key> + <string>meta.separator</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#5c954f</string> + <key>foreground</key> + <string>#4e596a</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Inserted</string> + <key>scope</key> + <string>markup.inserted</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#84a6d4</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Deleted</string> + <key>scope</key> + <string>markup.deleted</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#505050</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Changed</string> + <key>scope</key> + <string>markup.changed</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#84a6d4</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Colors</string> + <key>scope</key> + <string>constant.other.color</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#84a6d4</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Regular Expressions</string> + <key>scope</key> + <string>string.regexp</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#84a6d4</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Escape Characters</string> + <key>scope</key> + <string>constant.character.escape</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#84a6d4</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Embedded</string> + <key>scope</key> + <string>punctuation.section.embedded, variable.interpolation</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d9d9d9</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Invalid</string> + <key>scope</key> + <string>invalid.illegal</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#505050</string> + <key>foreground</key> + <string>#2d2d2d</string> + </dict> + </dict> + </array> + <key>uuid</key> + <string>terminal-dot-sexy</string> +</dict> +</plist> diff --git a/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/pyratesoft2.tmTheme.cache b/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/pyratesoft2.tmTheme.cache Binary files differ. diff --git a/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/pyratesoft6.tmTheme b/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/pyratesoft6.tmTheme @@ -0,0 +1,510 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>author</key> + <string>terminal.sexy</string> + <key>name</key> + <string>terminal.sexy</string> + <key>semanticClass</key> + <string>terminal.sexy</string> + <key>colorSpaceName</key> + <string>sRGB</string> + <key>gutterSettings</key> + <dict> + <key>background</key> + <string>#0b0b0b</string> + <key>divider</key> + <string>#c33027</string> + <key>foreground</key> + <string>#d9d9d9</string> + <key>selectionBackground</key> + <string>#093748</string> + <key>selectionForeground</key> + <string>#d3ebe9</string> + </dict> + <key>settings</key> + <array> + <dict> + <key>settings</key> + <dict> + <key>background</key> + <string>#0b0b0b</string> + <key>caret</key> + <string>#4e5165</string> + <key>foreground</key> + <string>#d9d9d9</string> + <key>invisibles</key> + <string>#edb54b</string> + <key>lineHighlight</key> + <string>#edb54b55</string> + <key>selection</key> + <string>#019cb3</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Text</string> + <key>scope</key> + <string>variable.parameter.function</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#4e5165</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Comments</string> + <key>scope</key> + <string>comment, punctuation.definition.comment</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#edb54b</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Punctuation</string> + <key>scope</key> + <string>punctuation.definition.string, punctuation.definition.variable, punctuation.definition.string, punctuation.definition.parameters, punctuation.definition.string, punctuation.definition.array</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#4e5165</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Delimiters</string> + <key>scope</key> + <string>none</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#4e5165</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Operators</string> + <key>scope</key> + <string>keyword.operator</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#4e5165</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Keywords</string> + <key>scope</key> + <string>keyword</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#599caa</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Variables</string> + <key>scope</key> + <string>variable</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#245361</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Functions</string> + <key>scope</key> + <string>entity.name.function, meta.require, support.function.any-method</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#888ba5</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Classes</string> + <key>scope</key> + <string>support.class, entity.name.class, entity.name.type.class</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#4f5f6a</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Classes</string> + <key>scope</key> + <string>meta.class</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#98d1ce</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Methods</string> + <key>scope</key> + <string>keyword.other.special-method</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#888ba5</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Storage</string> + <key>scope</key> + <string>storage</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#599caa</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Support</string> + <key>scope</key> + <string>support.function</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#33859d</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Strings, Inherited Class</string> + <key>scope</key> + <string>string, constant.other.symbol, entity.other.inherited-class</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#245361</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Integers</string> + <key>scope</key> + <string>constant.numeric</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d85a21</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Floats</string> + <key>scope</key> + <string>none</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d85a21</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Boolean</string> + <key>scope</key> + <string>none</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d85a21</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Constants</string> + <key>scope</key> + <string>constant</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d85a21</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Tags</string> + <key>scope</key> + <string>entity.name.tag</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#245361</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Attributes</string> + <key>scope</key> + <string>entity.other.attribute-name</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d85a21</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Attribute IDs</string> + <key>scope</key> + <string>entity.other.attribute-name.id, punctuation.definition.entity</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#888ba5</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Selector</string> + <key>scope</key> + <string>meta.selector</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#599caa</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Values</string> + <key>scope</key> + <string>none</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d85a21</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Headings</string> + <key>scope</key> + <string>markup.heading punctuation.definition.heading, entity.name.section</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#888ba5</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Units</string> + <key>scope</key> + <string>keyword.other.unit</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d85a21</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Bold</string> + <key>scope</key> + <string>markup.bold, punctuation.definition.bold</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>bold</string> + <key>foreground</key> + <string>#4f5f6a</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Italic</string> + <key>scope</key> + <string>markup.italic, punctuation.definition.italic</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>italic</string> + <key>foreground</key> + <string>#599caa</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Code</string> + <key>scope</key> + <string>markup.raw.inline</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#245361</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Link Text</string> + <key>scope</key> + <string>string.other.link</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#245361</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Link Url</string> + <key>scope</key> + <string>meta.link</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d85a21</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Lists</string> + <key>scope</key> + <string>markup.list</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#245361</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Quotes</string> + <key>scope</key> + <string>markup.quote</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d85a21</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Separator</string> + <key>scope</key> + <string>meta.separator</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#019cb3</string> + <key>foreground</key> + <string>#4e5165</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Inserted</string> + <key>scope</key> + <string>markup.inserted</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#245361</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Deleted</string> + <key>scope</key> + <string>markup.deleted</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#245361</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Changed</string> + <key>scope</key> + <string>markup.changed</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#599caa</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Colors</string> + <key>scope</key> + <string>constant.other.color</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#33859d</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Regular Expressions</string> + <key>scope</key> + <string>string.regexp</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#33859d</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Escape Characters</string> + <key>scope</key> + <string>constant.character.escape</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#33859d</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Embedded</string> + <key>scope</key> + <string>punctuation.section.embedded, variable.interpolation</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d3ebe9</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Invalid</string> + <key>scope</key> + <string>invalid.illegal</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#245361</string> + <key>foreground</key> + <string>#093748</string> + </dict> + </dict> + </array> + <key>uuid</key> + <string>terminal-dot-sexy</string> +</dict> +</plist> diff --git a/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/pyratesoft6.tmTheme.cache b/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/pyratesoft6.tmTheme.cache Binary files differ. diff --git a/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/pyratesoft7.tmTheme b/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/pyratesoft7.tmTheme @@ -0,0 +1,510 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>author</key> + <string>terminal.sexy</string> + <key>name</key> + <string>terminal.sexy</string> + <key>semanticClass</key> + <string>terminal.sexy</string> + <key>colorSpaceName</key> + <string>sRGB</string> + <key>gutterSettings</key> + <dict> + <key>background</key> + <string>#0b0b0b</string> + <key>divider</key> + <string>#c33027</string> + <key>foreground</key> + <string>#d9d9d9</string> + <key>selectionBackground</key> + <string>#093748</string> + <key>selectionForeground</key> + <string>#d3ebe9</string> + </dict> + <key>settings</key> + <array> + <dict> + <key>settings</key> + <dict> + <key>background</key> + <string>#0b0b0b</string> + <key>caret</key> + <string>#4e5165</string> + <key>foreground</key> + <string>#d9d9d9</string> + <key>invisibles</key> + <string>#a39375</string> + <key>lineHighlight</key> + <string>#a3937555</string> + <key>selection</key> + <string>#019cb3</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Text</string> + <key>scope</key> + <string>variable.parameter.function</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#4e5165</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Comments</string> + <key>scope</key> + <string>comment, punctuation.definition.comment</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#a39375</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Punctuation</string> + <key>scope</key> + <string>punctuation.definition.string, punctuation.definition.variable, punctuation.definition.string, punctuation.definition.parameters, punctuation.definition.string, punctuation.definition.array</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#4e5165</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Delimiters</string> + <key>scope</key> + <string>none</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#4e5165</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Operators</string> + <key>scope</key> + <string>keyword.operator</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#4e5165</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Keywords</string> + <key>scope</key> + <string>keyword</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#599caa</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Variables</string> + <key>scope</key> + <string>variable</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#245361</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Functions</string> + <key>scope</key> + <string>entity.name.function, meta.require, support.function.any-method</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#888ba5</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Classes</string> + <key>scope</key> + <string>support.class, entity.name.class, entity.name.type.class</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#4f5f6a</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Classes</string> + <key>scope</key> + <string>meta.class</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#98d1ce</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Methods</string> + <key>scope</key> + <string>keyword.other.special-method</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#888ba5</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Storage</string> + <key>scope</key> + <string>storage</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#599caa</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Support</string> + <key>scope</key> + <string>support.function</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#33859d</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Strings, Inherited Class</string> + <key>scope</key> + <string>string, constant.other.symbol, entity.other.inherited-class</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#245361</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Integers</string> + <key>scope</key> + <string>constant.numeric</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d85a21</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Floats</string> + <key>scope</key> + <string>none</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d85a21</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Boolean</string> + <key>scope</key> + <string>none</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d85a21</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Constants</string> + <key>scope</key> + <string>constant</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d85a21</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Tags</string> + <key>scope</key> + <string>entity.name.tag</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#245361</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Attributes</string> + <key>scope</key> + <string>entity.other.attribute-name</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d85a21</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Attribute IDs</string> + <key>scope</key> + <string>entity.other.attribute-name.id, punctuation.definition.entity</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#888ba5</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Selector</string> + <key>scope</key> + <string>meta.selector</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#599caa</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Values</string> + <key>scope</key> + <string>none</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d85a21</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Headings</string> + <key>scope</key> + <string>markup.heading punctuation.definition.heading, entity.name.section</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#888ba5</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Units</string> + <key>scope</key> + <string>keyword.other.unit</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d85a21</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Bold</string> + <key>scope</key> + <string>markup.bold, punctuation.definition.bold</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>bold</string> + <key>foreground</key> + <string>#4f5f6a</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Italic</string> + <key>scope</key> + <string>markup.italic, punctuation.definition.italic</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>italic</string> + <key>foreground</key> + <string>#599caa</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Code</string> + <key>scope</key> + <string>markup.raw.inline</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#245361</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Link Text</string> + <key>scope</key> + <string>string.other.link</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#245361</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Link Url</string> + <key>scope</key> + <string>meta.link</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d85a21</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Lists</string> + <key>scope</key> + <string>markup.list</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#245361</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Quotes</string> + <key>scope</key> + <string>markup.quote</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d85a21</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Separator</string> + <key>scope</key> + <string>meta.separator</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#019cb3</string> + <key>foreground</key> + <string>#4e5165</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Inserted</string> + <key>scope</key> + <string>markup.inserted</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#245361</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Deleted</string> + <key>scope</key> + <string>markup.deleted</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#245361</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Changed</string> + <key>scope</key> + <string>markup.changed</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#599caa</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Colors</string> + <key>scope</key> + <string>constant.other.color</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#33859d</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Regular Expressions</string> + <key>scope</key> + <string>string.regexp</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#33859d</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Escape Characters</string> + <key>scope</key> + <string>constant.character.escape</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#33859d</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Embedded</string> + <key>scope</key> + <string>punctuation.section.embedded, variable.interpolation</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d3ebe9</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Invalid</string> + <key>scope</key> + <string>invalid.illegal</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#245361</string> + <key>foreground</key> + <string>#093748</string> + </dict> + </dict> + </array> + <key>uuid</key> + <string>terminal-dot-sexy</string> +</dict> +</plist> diff --git a/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/pyratesoft7.tmTheme.cache b/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/pyratesoft7.tmTheme.cache Binary files differ. diff --git a/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/pyratesoft8.tmTheme b/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/pyratesoft8.tmTheme @@ -0,0 +1,510 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>author</key> + <string>terminal.sexy</string> + <key>name</key> + <string>terminal.sexy</string> + <key>semanticClass</key> + <string>terminal.sexy</string> + <key>colorSpaceName</key> + <string>sRGB</string> + <key>gutterSettings</key> + <dict> + <key>background</key> + <string>#0b0b0b</string> + <key>divider</key> + <string>#c33027</string> + <key>foreground</key> + <string>#d9d9d9</string> + <key>selectionBackground</key> + <string>#093748</string> + <key>selectionForeground</key> + <string>#d3ebe9</string> + </dict> + <key>settings</key> + <array> + <dict> + <key>settings</key> + <dict> + <key>background</key> + <string>#121212</string> + <key>caret</key> + <string>#4e5165</string> + <key>foreground</key> + <string>#d9d9d9</string> + <key>invisibles</key> + <string>#a9c535</string> + <key>lineHighlight</key> + <string>#30303055</string> + <key>selection</key> + <string>#d85a21</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Text</string> + <key>scope</key> + <string>variable.parameter.function</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#c33027</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Comments</string> + <key>scope</key> + <string>comment, punctuation.definition.comment</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#a9c53555</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Punctuation</string> + <key>scope</key> + <string>punctuation.definition.string, punctuation.definition.variable, punctuation.definition.string, punctuation.definition.parameters, punctuation.definition.string, punctuation.definition.array</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d85a21</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Delimiters</string> + <key>scope</key> + <string>none</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#4e5165</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Operators</string> + <key>scope</key> + <string>keyword.operator</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#888ba5</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Keywords</string> + <key>scope</key> + <string>keyword</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#599caa</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Variables</string> + <key>scope</key> + <string>variable</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#245361</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Functions</string> + <key>scope</key> + <string>entity.name.function, meta.require, support.function.any-method</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#888ba5</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Classes</string> + <key>scope</key> + <string>support.class, entity.name.class, entity.name.type.class</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#33859d</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Classes</string> + <key>scope</key> + <string>meta.class</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#98d1ce</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Methods</string> + <key>scope</key> + <string>keyword.other.special-method</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#888ba5</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Storage</string> + <key>scope</key> + <string>storage</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#599caa</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Support</string> + <key>scope</key> + <string>support.function</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#33859d</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Strings, Inherited Class</string> + <key>scope</key> + <string>string, constant.other.symbol, entity.other.inherited-class</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#245361</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Integers</string> + <key>scope</key> + <string>constant.numeric</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d85a21</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Floats</string> + <key>scope</key> + <string>none</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d85a21</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Boolean</string> + <key>scope</key> + <string>none</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d85a21</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Constants</string> + <key>scope</key> + <string>constant</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d85a21</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Tags</string> + <key>scope</key> + <string>entity.name.tag</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#599caa</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Attributes</string> + <key>scope</key> + <string>entity.other.attribute-name</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d85a21</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Attribute IDs</string> + <key>scope</key> + <string>entity.other.attribute-name.id, punctuation.definition.entity</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#888ba5</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Selector</string> + <key>scope</key> + <string>meta.selector</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#599caa</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Values</string> + <key>scope</key> + <string>none</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d85a21</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Headings</string> + <key>scope</key> + <string>markup.heading punctuation.definition.heading, entity.name.section</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#888ba5</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Units</string> + <key>scope</key> + <string>keyword.other.unit</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d85a21</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Bold</string> + <key>scope</key> + <string>markup.bold, punctuation.definition.bold</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>bold</string> + <key>foreground</key> + <string>#33859d</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Italic</string> + <key>scope</key> + <string>markup.italic, punctuation.definition.italic</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>italic</string> + <key>foreground</key> + <string>#599caa</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Code</string> + <key>scope</key> + <string>markup.raw.inline</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#245361</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Link Text</string> + <key>scope</key> + <string>string.other.link</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#245361</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Link Url</string> + <key>scope</key> + <string>meta.link</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d85a21</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Lists</string> + <key>scope</key> + <string>markup.list</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#245361</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Quotes</string> + <key>scope</key> + <string>markup.quote</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d85a21</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Separator</string> + <key>scope</key> + <string>meta.separator</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#61b343</string> + <key>foreground</key> + <string>#4e5165</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Inserted</string> + <key>scope</key> + <string>markup.inserted</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#245361</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Deleted</string> + <key>scope</key> + <string>markup.deleted</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#245361</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Changed</string> + <key>scope</key> + <string>markup.changed</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#599caa</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Colors</string> + <key>scope</key> + <string>constant.other.color</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#33859d</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Regular Expressions</string> + <key>scope</key> + <string>string.regexp</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#33859d</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Escape Characters</string> + <key>scope</key> + <string>constant.character.escape</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#33859d</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Embedded</string> + <key>scope</key> + <string>punctuation.section.embedded, variable.interpolation</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d3ebe9</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Invalid</string> + <key>scope</key> + <string>invalid.illegal</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#245361</string> + <key>foreground</key> + <string>#093748</string> + </dict> + </dict> + </array> + <key>uuid</key> + <string>terminal-dot-sexy</string> +</dict> +</plist> diff --git a/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/pyratesoft8.tmTheme.cache b/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/pyratesoft8.tmTheme.cache Binary files differ. diff --git a/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/pyratesoft9.tmTheme b/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/pyratesoft9.tmTheme @@ -0,0 +1,510 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>author</key> + <string>terminal.sexy</string> + <key>name</key> + <string>terminal.sexy</string> + <key>semanticClass</key> + <string>terminal.sexy</string> + <key>colorSpaceName</key> + <string>sRGB</string> + <key>gutterSettings</key> + <dict> + <key>background</key> + <string>#0b0b0b</string> + <key>divider</key> + <string>#c33027</string> + <key>foreground</key> + <string>#d9d9d9</string> + <key>selectionBackground</key> + <string>#093748</string> + <key>selectionForeground</key> + <string>#d3ebe9</string> + </dict> + <key>settings</key> + <array> + <dict> + <key>settings</key> + <dict> + <key>background</key> + <string>#0b0b0b</string> + <key>caret</key> + <string>#4e5165</string> + <key>foreground</key> + <string>#d9d9d9</string> + <key>invisibles</key> + <string>#d9d9d9</string> + <key>lineHighlight</key> + <string>#30303055</string> + <key>selection</key> + <string>#019cb3</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Text</string> + <key>scope</key> + <string>variable.parameter.function</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#a9c535</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Comments</string> + <key>scope</key> + <string>comment, punctuation.definition.comment</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d9d9d955</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Punctuation</string> + <key>scope</key> + <string>punctuation.definition.string, punctuation.definition.variable, punctuation.definition.string, punctuation.definition.parameters, punctuation.definition.string, punctuation.definition.array</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#61b343</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Delimiters</string> + <key>scope</key> + <string>none</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#4e5165</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Operators</string> + <key>scope</key> + <string>keyword.operator</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#4e5165</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Keywords</string> + <key>scope</key> + <string>keyword</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#599caa</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Variables</string> + <key>scope</key> + <string>variable</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#245361</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Functions</string> + <key>scope</key> + <string>entity.name.function, meta.require, support.function.any-method</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#693699</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Classes</string> + <key>scope</key> + <string>support.class, entity.name.class, entity.name.type.class</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#33859d</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Classes</string> + <key>scope</key> + <string>meta.class</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#98d1ce</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Methods</string> + <key>scope</key> + <string>keyword.other.special-method</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#583976</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Storage</string> + <key>scope</key> + <string>storage</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#599caa</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Support</string> + <key>scope</key> + <string>support.function</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#33859d</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Strings, Inherited Class</string> + <key>scope</key> + <string>string, constant.other.symbol, entity.other.inherited-class</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#61b343</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Integers</string> + <key>scope</key> + <string>constant.numeric</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d85a21</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Floats</string> + <key>scope</key> + <string>none</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d85a21</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Boolean</string> + <key>scope</key> + <string>none</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d85a21</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Constants</string> + <key>scope</key> + <string>constant</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d85a21</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Tags</string> + <key>scope</key> + <string>entity.name.tag</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#245361</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Attributes</string> + <key>scope</key> + <string>entity.other.attribute-name</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d85a21</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Attribute IDs</string> + <key>scope</key> + <string>entity.other.attribute-name.id, punctuation.definition.entity</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#583976</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Selector</string> + <key>scope</key> + <string>meta.selector</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#599caa</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Values</string> + <key>scope</key> + <string>none</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d85a21</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Headings</string> + <key>scope</key> + <string>markup.heading punctuation.definition.heading, entity.name.section</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#583976</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Units</string> + <key>scope</key> + <string>keyword.other.unit</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d85a21</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Bold</string> + <key>scope</key> + <string>markup.bold, punctuation.definition.bold</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>bold</string> + <key>foreground</key> + <string>#33859d</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Italic</string> + <key>scope</key> + <string>markup.italic, punctuation.definition.italic</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>italic</string> + <key>foreground</key> + <string>#599caa</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Code</string> + <key>scope</key> + <string>markup.raw.inline</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#245361</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Link Text</string> + <key>scope</key> + <string>string.other.link</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#245361</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Link Url</string> + <key>scope</key> + <string>meta.link</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d85a21</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Lists</string> + <key>scope</key> + <string>markup.list</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#245361</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Quotes</string> + <key>scope</key> + <string>markup.quote</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d85a21</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Separator</string> + <key>scope</key> + <string>meta.separator</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#61b343</string> + <key>foreground</key> + <string>#4e5165</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Inserted</string> + <key>scope</key> + <string>markup.inserted</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#245361</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Deleted</string> + <key>scope</key> + <string>markup.deleted</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#245361</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Changed</string> + <key>scope</key> + <string>markup.changed</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#599caa</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Colors</string> + <key>scope</key> + <string>constant.other.color</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#33859d</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Regular Expressions</string> + <key>scope</key> + <string>string.regexp</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#33859d</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Escape Characters</string> + <key>scope</key> + <string>constant.character.escape</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#33859d</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Embedded</string> + <key>scope</key> + <string>punctuation.section.embedded, variable.interpolation</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d3ebe9</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Invalid</string> + <key>scope</key> + <string>invalid.illegal</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#245361</string> + <key>foreground</key> + <string>#093748</string> + </dict> + </dict> + </array> + <key>uuid</key> + <string>terminal-dot-sexy</string> +</dict> +</plist> diff --git a/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/pyratesoft9.tmTheme.cache b/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/pyratesoft9.tmTheme.cache Binary files differ. diff --git a/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/tron-contrast.tmTheme b/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/tron-contrast.tmTheme @@ -0,0 +1,687 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<!-- +====================================================================== +Tron Contrast +====================================================================== +A Sublime Text 2 / Textmate theme. +Copyright (c) 2014 Dayle Rees. +Released under the MIT License <http://opensource.org/licenses/MIT> +====================================================================== +Find more themes at : https://github.com/daylerees/colour-schemes +====================================================================== +--> +<plist version="1.0"> +<dict> + <key>name</key> + <string>Tron Contrast</string> + <key>settings</key> + <array> + <dict> + <key>settings</key> + <dict> + <key>background</key> + <string>#0b0b0b</string> + <key>caret</key> + <string>#f8f8f0</string> + <key>foreground</key> + <string>#d9d9d9</string> + <key>invisibles</key> + <string>#3b3a32</string> + <key>lineHighlight</key> + <string>#202020</string> + <key>selection</key> + <string>#019cb3</string> + <key>selectionForeground</key> + <string>#ffffff</string> + <key>findHighlight</key> + <string>#ffe792</string> + <key>findHighlightForeground</key> + <string>#000000</string> + <key>selectionBorder</key> + <string>#222218</string> + <key>activeGuide</key> + <string>#9d550fb0</string> + + <key>bracketsForeground</key> + <string>#7a9bc2</string> + <key>bracketsOptions</key> + <string>underline</string> + + <key>bracketContentsForeground</key> + <string>#ffffff</string> + <key>bracketContentsOptions</key> + <string>underline</string> + + <key>tagsOptions</key> + <string>stippled_underline</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Comment</string> + <key>scope</key> + <string>comment</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#324357</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>String</string> + <key>scope</key> + <string>string</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#6ee2ff</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Number</string> + <key>scope</key> + <string>constant.numeric</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#6ee2ff</string> + </dict> + </dict> + + <dict> + <key>name</key> + <string>Built-in constant</string> + <key>scope</key> + <string>constant.language</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#ffffff</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>User-defined constant</string> + <key>scope</key> + <string>constant.character, constant.other</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#ffffff</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Variable</string> + <key>scope</key> + <string>variable</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Keyword</string> + <key>scope</key> + <string>keyword</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#748aa6</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Storage</string> + <key>scope</key> + <string>storage</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#ffffff</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Storage type</string> + <key>scope</key> + <string>storage.type</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#267fb5</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Class name</string> + <key>scope</key> + <string>entity.name.class</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>underline</string> + <key>foreground</key> + <string>#ffffff</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Inherited class</string> + <key>scope</key> + <string>entity.other.inherited-class</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>italic underline</string> + <key>foreground</key> + <string>#ffffff</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Function name</string> + <key>scope</key> + <string>entity.name.function</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#ffffff</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Function argument</string> + <key>scope</key> + <string>variable.parameter</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>italic</string> + <key>foreground</key> + <string></string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Tag name</string> + <key>scope</key> + <string>entity.name.tag</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#267fb5</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Tag attribute</string> + <key>scope</key> + <string>entity.other.attribute-name</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#ffffff</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Library function</string> + <key>scope</key> + <string>support.function</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#267fb5</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Library constant</string> + <key>scope</key> + <string>support.constant</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#ffffff</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Library class/type</string> + <key>scope</key> + <string>support.type, support.class</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>italic</string> + <key>foreground</key> + <string>#ffffff</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Library variable</string> + <key>scope</key> + <string>support.other.variable</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string></string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Invalid</string> + <key>scope</key> + <string>invalid</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#00a8c6</string> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#f8f8f0</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Invalid deprecated</string> + <key>scope</key> + <string>invalid.deprecated</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#00a8c6</string> + <key>foreground</key> + <string>#f8f8f0</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>JSON String</string> + <key>scope</key> + <string>meta.structure.dictionary.json string.quoted.double.json</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#6ee2ff</string> + </dict> + </dict> + + <dict> + <key>name</key> + <string>diff.header</string> + <key>scope</key> + <string>meta.diff, meta.diff.header</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#75715E</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>diff.deleted</string> + <key>scope</key> + <string>markup.deleted</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#00A8C6</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>diff.inserted</string> + <key>scope</key> + <string>markup.inserted</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#A6E22E</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>diff.changed</string> + <key>scope</key> + <string>markup.changed</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#E6DB74</string> + </dict> + </dict> + + <dict> + <key>scope</key> + <string>constant.numeric.line-number.find-in-files - match</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#8FBE00A0</string> + </dict> + </dict> + <dict> + <key>scope</key> + <string>entity.name.filename.find-in-files</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#E6DB74</string> + </dict> + </dict> + <dict> + <key>scope</key> + <string>keyword.other</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#4d6785</string> + </dict> + </dict> + <dict> + <key>scope</key> + <string>meta.property-value, support.constant.property-value, constant.other.color</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#6ee2ff</string> + </dict> + </dict> + <dict> + <key>scope</key> + <string>meta.structure.dictionary.json string.quoted.double.json</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#ffffff</string> + </dict> + </dict> + <dict> + <key>scope</key> + <string>meta.structure.dictionary.value.json string.quoted.double.json</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#6ee2ff</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Function argument</string> + <key>scope</key> + <string>meta.property-name support.type.property-name</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>normal</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Function argument</string> + <key>scope</key> + <string>meta.property-value punctuation.separator.key-value</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#aec2e0</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Function argument</string> + <key>scope</key> + <string>keyword.other.use, keyword.other.function.use, keyword.other.namespace, keyword.other.new, keyword.other.special-method, keyword.other.unit, keyword.other.use-as</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#267fb5</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Function argument</string> + <key>scope</key> + <string>meta.use support.class.builtin, meta.other.inherited-class support.class.builtin</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#aec2e0</string> + <key>fontStyle</key> + <string>normal</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Function argument</string> + <key>scope</key> + <string>variable.other</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string></string> + <key>fontStyle</key> + <string>normal</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Coffeescript Function argument</string> + <key>scope</key> + <string>variable.parameter.function.coffee</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#6ee2ff</string> + <key>fontStyle</key> + <string>italic</string> + </dict> + </dict> + + <!-- Markdown support. --> + <dict> + <key>name</key> + <string>Markdown Titles</string> + <key>scope</key> + <string>entity.name.section.markdown</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#ffffff</string> + </dict> + </dict> + + <dict> + <key>name</key> + <string>Markdown Title Hash</string> + <key>scope</key> + <string>punctuation.definition.heading.markdown</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#748aa6</string> + </dict> + </dict> + + <dict> + <key>name</key> + <string>Markdown Raw</string> + <key>scope</key> + <string>markup.raw.inline.markdown</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#6ee2ff</string> + </dict> + </dict> + + <dict> + <key>name</key> + <string>Markdown bold stars</string> + <key>scope</key> + <string>punctuation.definition.bold.markdown, punctuation.definition.italic.markdown</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#748aa6</string> + </dict> + </dict> + + <dict> + <key>name</key> + <string>Markdown link title braces</string> + <key>scope</key> + <string>punctuation.definition.string.begin.markdown, punctuation.definition.string.end.markdown</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#748aa6</string> + </dict> + </dict> + + <dict> + <key>name</key> + <string>Markdown link braces</string> + <key>scope</key> + <string>punctuation.definition.metadata.markdown</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#748aa6</string> + </dict> + </dict> + + <dict> + <key>name</key> + <string>Markdown link</string> + <key>scope</key> + <string>markup.underline.link.markdown, markup.underline.link.image.markdown, meta.image.inline.markdown</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#267fb5</string> + <key>fontStyle</key> + <string>italic</string> + </dict> + </dict> + + <dict> + <key>name</key> + <string>Markdown bold/italic</string> + <key>scope</key> + <string>markup.bold.markdown, markup.italic.markdown</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#267fb5</string> + </dict> + </dict> + + <dict> + <key>name</key> + <string>Markdown bold/italic</string> + <key>scope</key> + <string>markup.italic.markdown</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>italic</string> + </dict> + </dict> + + <dict> + <key>name</key> + <string>Markdown bold/italic</string> + <key>scope</key> + <string>markup.bold.markdown</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>bold</string> + </dict> + </dict> + + <dict> + <key>name</key> + <string>Markdown pre</string> + <key>scope</key> + <string>markup.raw.block.markdown</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#00a8c6</string> + </dict> + </dict> + + <dict> + <key>name</key> + <string>GitGutter deleted</string> + <key>scope</key> + <string>markup.deleted.git_gutter</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#e61f44</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>GitGutter inserted</string> + <key>scope</key> + <string>markup.inserted.git_gutter</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#a7da1e</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>GitGutter changed</string> + <key>scope</key> + <string>markup.changed.git_gutter</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#f7b83d</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>CSS Class</string> + <key>scope</key> + <string>entity.other.attribute-name.class.css</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#ffffff</string> + </dict> + </dict> + </array> + <key>uuid</key> + <string>f5508b8c-132b-1556-b8db-f43f608c596c</string> +</dict> +</plist> diff --git a/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/tron-contrast.tmTheme.cache b/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/tron-contrast.tmTheme.cache Binary files differ. diff --git a/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/x3-alpha.tmTheme b/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/x3-alpha.tmTheme @@ -0,0 +1,721 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>name</key> + <string>x3-alpha</string> + <key>settings</key> + <array> + <dict> + <key>settings</key> + <dict> + <key>background</key> + <string>#12171B</string> + <key>caret</key> + <string>#BCA879</string> + <key>foreground</key> + <string>#CBD8EB</string> + <key>invisibles</key> + <string>#3b3a32</string> + <key>lineHighlight</key> + <string>#0000003F</string> + <key>selection</key> + <string>#2F4050</string> + <key>selectionForeground</key> + <string>#ffffff</string> + <key>findHighlight</key> + <string>#DFCF98</string> + <key>findHighlightForeground</key> + <string>#000000</string> + <key>selectionBorder</key> + <string>#000000</string> + <key>activeGuide</key> + <string>#9d550fb0</string> + <key>bracketsForeground</key> + <string>#FFFFFF</string> + <key>bracketsOptions</key> + <string>underline</string> + <key>bracketContentsForeground</key> + <string>#FF9F60</string> + <key>bracketContentsOptions</key> + <string>underline</string> + <key>tagsOptions</key> + <string>stippled_underline</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Source base background</string> + <key>scope</key> + <string>text, source</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#14181E</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Comment</string> + <key>scope</key> + <string>comment</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#556552</string> + <key>background</key> + <string>#5565520C</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>String</string> + <key>scope</key> + <string>string</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#A0E4A3</string> + <key>background</key> + <string>#A0E4A309</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Number</string> + <key>scope</key> + <string>constant.numeric</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#73B8E1</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Built-in constant</string> + <key>scope</key> + <string>constant.language</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#6897E9</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Constant characters</string> + <key>scope</key> + <string>constant.character</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#617CC3</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Other constant</string> + <key>scope</key> + <string>constant.other</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#FFFFFF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Variable Parameter</string> + <key>scope</key> + <string>variable.parameter, meta.function.arguments variable.other</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#A3ABBD</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Variable Other</string> + <key>scope</key> + <string>variable.other</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#D8DFE7</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Variable Other Property</string> + <key>scope</key> + <string>variable.other.property</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#B7BED1</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Variable Language</string> + <key>scope</key> + <string>variable.language</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#69A1C8</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Keyword Control</string> + <key>scope</key> + <string>keyword.control</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#69A1C8</string> + <key>background</key> + <string>#69A1C80C</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Keyword Operator</string> + <key>scope</key> + <string>keyword.operator</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#678396</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Storage</string> + <key>scope</key> + <string>storage, meta.include</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#228ECC</string> + <key>background</key> + <string>#228ECC0C</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Class name</string> + <key>scope</key> + <string>entity.name.class, entity.name.type.class, support.type, support.class</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#FFFFFF</string> + <key>background</key> + <string>#0000000C</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Inherited class</string> + <key>scope</key> + <string>entity.other.inherited-class</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#BBBBBB</string> + <key>background</key> + <string>#0000000C</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Function name</string> + <key>scope</key> + <string>entity.name.function, support.function, meta.function-call</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#8CB5CC</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Library constant</string> + <key>scope</key> + <string>support.constant</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#ffffff</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Function argument</string> + <key>scope</key> + <string>meta.property-name support.type.property-name</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#8CB5CC</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Function argument</string> + <key>scope</key> + <string>meta.property-value punctuation.separator.key-value</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#A3ABBD</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Function argument</string> + <key>scope</key> + <string>keyword.other.use, keyword.other.function.use, keyword.other.namespace, keyword.other.new, keyword.other.special-method, keyword.other.unit, keyword.other.use-as</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#8CB5CC</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Function argument</string> + <key>scope</key> + <string>meta.use support.class.builtin, meta.other.inherited-class support.class.builtin</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#A3ABBD</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>PHP Open/Close Tag</string> + <key>scope</key> + <string>source.php.embedded punctuation.section.embedded.begin, source.php.embedded punctuation.section.embedded.end</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#C92828</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>PHP Line</string> + <key>scope</key> + <string>source.php.embedded.line, source.php.embedded.line string</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#C9282819</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>PHP in-line variable</string> + <key>scope</key> + <string>source.php.embedded meta.string-contents variable, source.php.embedded meta.string-contents punctuation.definition.variable</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#CCCCCC</string> + <key>background</key> + <string>#C9282819</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>PHP SQL Line</string> + <key>scope</key> + <string>source.sql.embedded.php, keyword.other.DML, support.function.aggregate.sql</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#CCCCCC</string> + <key>background</key> + <string>#A0E4A319</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>PHP SQL Variables</string> + <key>scope</key> + <string>source.sql.embedded.php string.quoted punctuation, source.sql.embedded.php string.quoted variable, source.sql.embedded.php string.quoted meta</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#CCCCCC</string> + <key>background</key> + <string>#C9282819</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Tag name</string> + <key>scope</key> + <string>entity.name.tag</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#4E99C9</string> + <key>background</key> + <string>#4E99C90C</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Tag attribute</string> + <key>scope</key> + <string>entity.other.attribute-name</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#CCCCCC</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>CSS Class</string> + <key>scope</key> + <string>entity.other.attribute-name.class.css</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#ffffff</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>CSS Embedded</string> + <key>scope</key> + <string>source.css.embedded.html</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#CFA0E409</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>JavaScript Embedded</string> + <key>scope</key> + <string>source.js.embedded.html</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#CFA0E409</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Markdown Titles</string> + <key>scope</key> + <string>entity.name.section.markdown</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#ffffff</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Markdown Title Hash</string> + <key>scope</key> + <string>punctuation.definition.heading.markdown</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#748aa6</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Markdown Raw</string> + <key>scope</key> + <string>markup.raw.inline.markdown</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#6ee2ff</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Markdown bold stars</string> + <key>scope</key> + <string>punctuation.definition.bold.markdown, punctuation.definition.italic.markdown</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#748aa6</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Markdown link title braces</string> + <key>scope</key> + <string>punctuation.definition.string.begin.markdown, punctuation.definition.string.end.markdown</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#748aa6</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Markdown link braces</string> + <key>scope</key> + <string>punctuation.definition.metadata.markdown</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#748aa6</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Markdown link</string> + <key>scope</key> + <string>markup.underline.link.markdown, markup.underline.link.image.markdown, meta.image.inline.markdown</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#267fb5</string> + <key>fontStyle</key> + <string>italic</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Markdown bold/italic</string> + <key>scope</key> + <string>markup.bold.markdown, markup.italic.markdown</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#267fb5</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Markdown bold/italic</string> + <key>scope</key> + <string>markup.italic.markdown</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>italic</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Markdown bold/italic</string> + <key>scope</key> + <string>markup.bold.markdown</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>bold</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Markdown pre</string> + <key>scope</key> + <string>markup.raw.block.markdown</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#00a8c6</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>SublimeLinter Warning</string> + <key>scope</key> + <string>sublimelinter.mark.warning</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#DDB700</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>SublimeLinter Error</string> + <key>scope</key> + <string>sublimelinter.mark.error</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#D02000</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>SublimeLinter Gutter Mark</string> + <key>scope</key> + <string>sublimelinter.gutter-mark</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#FFFFFF</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Invalid</string> + <key>scope</key> + <string>invalid</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#683C3E99</string> + <key>fontStyle</key> + <string></string> + <key>foreground</key> + <string>#f8f8f0</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Invalid deprecated</string> + <key>scope</key> + <string>invalid.deprecated</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#683C3E99</string> + <key>foreground</key> + <string>#f8f8f0</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>JSON String</string> + <key>scope</key> + <string>meta.structure.dictionary.json string.quoted.double.json</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#6ee2ff</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>diff.header</string> + <key>scope</key> + <string>meta.diff, meta.diff.header</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#75715E</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>diff.deleted</string> + <key>scope</key> + <string>markup.deleted</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#00A8C6</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>diff.inserted</string> + <key>scope</key> + <string>markup.inserted</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#A6E22E</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>diff.changed</string> + <key>scope</key> + <string>markup.changed</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#D8D482</string> + </dict> + </dict> + <dict> + <key>scope</key> + <string>constant.numeric.line-number.find-in-files - match</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#88B00EA0</string> + </dict> + </dict> + <dict> + <key>scope</key> + <string>entity.name.filename.find-in-files</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#D8D482</string> + </dict> + </dict> + <dict> + <key>scope</key> + <string>keyword.other</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#58646E</string> + </dict> + </dict> + <dict> + <key>scope</key> + <string>meta.property-value, support.constant.property-value, constant.other.color</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#80A3B4</string> + </dict> + </dict> + <dict> + <key>scope</key> + <string>meta.structure.dictionary.json string.quoted.double.json</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#ffffff</string> + </dict> + </dict> + <dict> + <key>scope</key> + <string>meta.structure.dictionary.value.json string.quoted.double.json</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#80A3B4</string> + </dict> + </dict> + </array> + <key>uuid</key> + <string>9f92edff-cd52-41b1-95bd-06e7e146cd5e</string> + <key>colorSpaceName</key> + <string>sRGB</string> + <key>semanticClass</key> + <string>theme.dark.x3_alpha</string> + <key>author</key> + <string>x3ns <ns@nsyed.com></string> +</dict> +</plist> diff --git a/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/x3-alpha.tmTheme.cache b/sublime/.config/sublime-text-2/Packages/Colorsublime-Themes/x3-alpha.tmTheme.cache Binary files differ. diff --git a/sublime/.config/sublime-text-2/Packages/Default/Preferences.sublime-settings b/sublime/.config/sublime-text-2/Packages/Default/Preferences.sublime-settings @@ -0,0 +1,336 @@ +// While you can edit this file, it's best to put your changes in +// "User/Preferences.sublime-settings", which overrides the settings in here. +// +// Settings may also be placed in file type specific options files, for +// example, in Packages/Python/Python.sublime-settings for python files. +{ + // Sets the colors used within the text area + "color_scheme": "Packages/Color Scheme - Default/Monokai.tmTheme", + + // Note that the font_face and font_size are overriden in the platform + // specific settings file, for example, "Preferences (Linux).sublime-settings". + // Because of this, setting them here will have no effect: you must set them + // in your User File Preferences. + "font_face": "", + "font_size": 10, + + // Valid options are "no_bold", "no_italic", "no_antialias", "gray_antialias", + // "subpixel_antialias", "no_round" (OS X only) and "directwrite" (Windows only) + "font_options": [], + + // Characters that are considered to separate words + "word_separators": "./\\()\"'-:,.;<>~!@#$%^&*|+=[]{}`~?", + + // Set to false to prevent line numbers being drawn in the gutter + "line_numbers": true, + + // Set to false to hide the gutter altogether + "gutter": true, + + // Spacing between the gutter and the text + "margin": 4, + + // Fold buttons are the triangles shown in the gutter to fold regions of text + "fold_buttons": true, + + // Hides the fold buttons unless the mouse is over the gutter + "fade_fold_buttons": true, + + // Columns in which to display vertical rulers + "rulers": [], + + // Set to true to turn spell checking on by default + "spell_check": false, + + // The number of spaces a tab is considered equal to + "tab_size": 4, + + // Set to true to insert spaces when tab is pressed + "translate_tabs_to_spaces": false, + + // If translate_tabs_to_spaces is true, use_tab_stops will make tab and + // backspace insert/delete up to the next tabstop + "use_tab_stops": true, + + // Set to false to disable detection of tabs vs. spaces on load + "detect_indentation": true, + + // Calculates indentation automatically when pressing enter + "auto_indent": true, + + // Makes auto indent a little smarter, e.g., by indenting the next line + // after an if statement in C. Requires auto_indent to be enabled. + "smart_indent": true, + + // Adds whitespace up to the first open bracket when indenting. Requires + // auto_indent to be enabled. + "indent_to_bracket": false, + + // Trims white space added by auto_indent when moving the caret off the + // line. + "trim_automatic_white_space": true, + + // Disables horizontal scrolling if enabled. + // May be set to true, false, or "auto", where it will be disabled for + // source code, and otherwise enabled. + "word_wrap": "auto", + + // Set to a value other than 0 to force wrapping at that column rather than the + // window width + "wrap_width": 0, + + // Set to false to prevent word wrapped lines from being indented to the same + // level + "indent_subsequent_lines": true, + + // Draws text centered in the window rather than left aligned + "draw_centered": false, + + // Controls auto pairing of quotes, brackets etc + "auto_match_enabled": true, + + // Word list to use for spell checking + "dictionary": "Packages/Language - English/en_US.dic", + + // Set to true to draw a border around the visible rectangle on the minimap. + // The color of the border will be determined by the "minimapBorder" key in + // the color scheme + "draw_minimap_border": false, + + // If enabled, will highlight any line with a caret + "highlight_line": false, + + // Valid values are "smooth", "phase", "blink", "wide" and "solid". + "caret_style": "smooth", + + // Set to false to disable underlining the brackets surrounding the caret + "match_brackets": true, + + // Set to false if you'd rather only highlight the brackets when the caret is + // next to one + "match_brackets_content": true, + + // Set to false to not highlight square brackets. This only takes effect if + // match_brackets is true + "match_brackets_square": true, + + // Set to false to not highlight curly brackets. This only takes effect if + // match_brackets is true + "match_brackets_braces": true, + + // Set to false to not highlight angle brackets. This only takes effect if + // match_brackets is true + "match_brackets_angle": false, + + // Enable visualization of the matching tag in HTML and XML + "match_tags": true, + + // Highlights other occurrences of the currently selected text + "match_selection": true, + + // Additional spacing at the top of each line, in pixels + "line_padding_top": 0, + + // Additional spacing at the bottom of each line, in pixels + "line_padding_bottom": 0, + + // Set to false to disable scrolling past the end of the buffer. + // On OS X, this value is overridden in the platform specific settings, so + // you'll need to place this line in your user settings to override it. + "scroll_past_end": true, + + // This controls what happens when pressing up or down when on the first + // or last line. + // On OS X, this value is overridden in the platform specific settings, so + // you'll need to place this line in your user settings to override it. + "move_to_limit_on_up_down": false, + + // Set to "none" to turn off drawing white space, "selection" to draw only the + // white space within the selection, and "all" to draw all white space + "draw_white_space": "selection", + + // Set to false to turn off the indentation guides. + // The color and width of the indent guides may be customized by editing + // the corresponding .tmTheme file, and specifying the colors "guide", + // "activeGuide" and "stackGuide" + "draw_indent_guides": true, + + // Controls how the indent guides are drawn, valid options are + // "draw_normal" and "draw_active". draw_active will draw the indent + // guides containing the caret in a different color. + "indent_guide_options": ["draw_normal"], + + // Set to true to removing trailing white space on save + "trim_trailing_white_space_on_save": false, + + // Set to true to ensure the last line of the file ends in a newline + // character when saving + "ensure_newline_at_eof_on_save": false, + + // Set to true to automatically save files when switching to a different file + // or application + "save_on_focus_lost": false, + + // The encoding to use when the encoding can't be determined automatically. + // ASCII, UTF-8 and UTF-16 encodings will be automatically detected. + "fallback_encoding": "Western (Windows 1252)", + + // Encoding used when saving new files, and files opened with an undefined + // encoding (e.g., plain ascii files). If a file is opened with a specific + // encoding (either detected or given explicitly), this setting will be + // ignored, and the file will be saved with the encoding it was opened + // with. + "default_encoding": "UTF-8", + + // Files containing null bytes are opened as hexadecimal by default + "enable_hexadecimal_encoding": true, + + // Determines what character(s) are used to terminate each line in new files. + // Valid values are 'system' (whatever the OS uses), 'windows' (CRLF) and + // 'unix' (LF only). + "default_line_ending": "system", + + // When enabled, pressing tab will insert the best matching completion. + // When disabled, tab will only trigger snippets or insert a tab. + // Shift+tab can be used to insert an explicit tab when tab_completion is + // enabled. + "tab_completion": true, + + // Enable auto complete to be triggered automatically when typing. + "auto_complete": true, + + // The maximum file size where auto complete will be automatically triggered. + "auto_complete_size_limit": 4194304, + + // The delay, in ms, before the auto complete window is shown after typing + "auto_complete_delay": 50, + + // Controls what scopes auto complete will be triggered in + "auto_complete_selector": "source - comment", + + // Additional situations to trigger auto complete + "auto_complete_triggers": [ {"selector": "text.html", "characters": "<"} ], + + // By default, auto complete will commit the current completion on enter. + // This setting can be used to make it complete on tab instead. + // Completing on tab is generally a superior option, as it removes + // ambiguity between committing the completion and inserting a newline. + "auto_complete_commit_on_tab": false, + + // Controls if auto complete is shown when snippet fields are active. + // Only relevant if auto_complete_commit_on_tab is true. + "auto_complete_with_fields": false, + + // By default, shift+tab will only unindent if the selection spans + // multiple lines. When pressing shift+tab at other times, it'll insert a + // tab character - this allows tabs to be inserted when tab_completion is + // enabled. Set this to true to make shift+tab always unindent, instead of + // inserting tabs. + "shift_tab_unindent": false, + + // If true, the copy and cut commands will operate on the current line + // when the selection is empty, rather than doing nothing. + "copy_with_empty_selection": true, + + // If true, the selected text will be copied into the find panel when it's + // shown. + // On OS X, this value is overridden in the platform specific settings, so + // you'll need to place this line in your user settings to override it. + "find_selected_text": true, + + // When drag_text is enabled, clicking on selected text will begin a + // drag-drop operation + "drag_text": true, + + // + // User Interface Settings + // + + // The theme controls the look of Sublime Text's UI (buttons, tabs, scroll bars, etc) + "theme": "Default.sublime-theme", + + // Set to 0 to disable smooth scrolling. Set to a value between 0 and 1 to + // scroll slower, or set to larger than 1 to scroll faster + "scroll_speed": 1.0, + + // Controls side bar animation when expanding or collapsing folders + "tree_animation_enabled": true, + + // Makes tabs with modified files more visible + "highlight_modified_tabs": false, + + "show_tab_close_buttons": true, + + // Show folders in the side bar in bold + "bold_folder_labels": false, + + // OS X 10.7 only: Set to true to disable Lion style full screen support. + // Sublime Text must be restarted for this to take effect. + "use_simple_full_screen": false, + + // OS X only. Valid values are true, false, and "auto". Auto will enable + // the setting when running on a screen 2880 pixels or wider (i.e., a + // Retina display). When this setting is enabled, OpenGL is used to + // accelerate drawing. Sublime Text must be restarted for changes to take + // effect. + "gpu_window_buffer": "auto", + + // Valid values are "system", "enabled" and "disabled" + "overlay_scroll_bars": "system", + + // + // Application Behavior Settings + // + + // Exiting the application with hot_exit enabled will cause it to close + // immediately without prompting. Unsaved modifications and open files will + // be preserved and restored when next starting. + // + // Closing a window with an associated project will also close the window + // without prompting, preserving unsaved changes in the workspace file + // alongside the project. + "hot_exit": true, + + // remember_open_files makes the application start up with the last set of + // open files. Changing this to false will have no effect if hot_exit is + // true + "remember_open_files": true, + + // OS X only: When files are opened from finder, or by dragging onto the + // dock icon, this controls if a new window is created or not. + "open_files_in_new_window": true, + + // OS X only: This controls if an empty window is created at startup or not. + "create_window_at_startup": true, + + // Set to true to close windows as soon as the last file is closed, unless + // there's a folder open within the window. This is always enabled on OS X, + // changing it here won't modify the behavior. + "close_windows_when_empty": false, + + // Show the full path to files in the title bar. + // On OS X, this value is overridden in the platform specific settings, so + // you'll need to place this line in your user settings to override it. + "show_full_path": true, + + // Shows the Build Results panel when building. If set to false, the Build + // Results can be shown via the Tools/Build Results menu. + "show_panel_on_build": true, + + // Preview file contents when clicking on a file in the side bar. Double + // clicking or editing the preview will open the file and assign it a tab. + "preview_on_click": true, + + // folder_exclude_patterns and file_exclude_patterns control which files + // are listed in folders on the side bar. These can also be set on a per- + // project basis. + "folder_exclude_patterns": [".svn", ".git", ".hg", "CVS"], + "file_exclude_patterns": ["*.pyc", "*.pyo", "*.exe", "*.dll", "*.obj","*.o", "*.a", "*.lib", "*.so", "*.dylib", "*.ncb", "*.sdf", "*.suo", "*.pdb", "*.idb", ".DS_Store", "*.class", "*.psd", "*.db"], + // These files will still show up in the side bar, but won't be included in + // Goto Anything or Find in Files + "binary_file_patterns": ["*.jpg", "*.jpeg", "*.png", "*.gif", "*.ttf", "*.tga", "*.dds", "*.ico", "*.eot", "*.pdf", "*.swf", "*.jar", "*.zip"], + + // List any packages to ignore here. When removing entries from this list, + // a restart may be required if the package contains plugins. + "ignored_packages": ["Vintage"] +} diff --git a/sublime/.config/sublime-text-2/Packages/Default/send2trash/__init__.py b/sublime/.config/sublime-text-2/Packages/Default/send2trash/__init__.py @@ -0,0 +1,14 @@ +# Copyright 2010 Hardcoded Software (http://www.hardcoded.net) + +# This software is licensed under the "BSD" License as described in the "LICENSE" file, +# which should be included with this package. The terms are also available at +# http://www.hardcoded.net/licenses/bsd_license + +import sys + +if sys.platform == 'darwin': + from .plat_osx import send2trash +elif sys.platform == 'win32': + from .plat_win import send2trash +else: + from .plat_other import send2trash diff --git a/sublime/.config/sublime-text-2/Packages/Default/send2trash/__init__.pyc b/sublime/.config/sublime-text-2/Packages/Default/send2trash/__init__.pyc Binary files differ. diff --git a/sublime/.config/sublime-text-2/Packages/Default/send2trash/plat_osx.py b/sublime/.config/sublime-text-2/Packages/Default/send2trash/plat_osx.py @@ -0,0 +1,44 @@ +# Copyright 2010 Hardcoded Software (http://www.hardcoded.net) + +# This software is licensed under the "BSD" License as described in the "LICENSE" file, +# which should be included with this package. The terms are also available at +# http://www.hardcoded.net/licenses/bsd_license + +from ctypes import cdll, byref, Structure, c_char, c_char_p +from ctypes.util import find_library + +Foundation = cdll.LoadLibrary(find_library('Foundation')) +CoreServices = cdll.LoadLibrary(find_library('CoreServices')) + +GetMacOSStatusCommentString = Foundation.GetMacOSStatusCommentString +GetMacOSStatusCommentString.restype = c_char_p +FSPathMakeRefWithOptions = CoreServices.FSPathMakeRefWithOptions +FSMoveObjectToTrashSync = CoreServices.FSMoveObjectToTrashSync + +kFSPathMakeRefDefaultOptions = 0 +kFSPathMakeRefDoNotFollowLeafSymlink = 0x01 + +kFSFileOperationDefaultOptions = 0 +kFSFileOperationOverwrite = 0x01 +kFSFileOperationSkipSourcePermissionErrors = 0x02 +kFSFileOperationDoNotMoveAcrossVolumes = 0x04 +kFSFileOperationSkipPreflight = 0x08 + +class FSRef(Structure): + _fields_ = [('hidden', c_char * 80)] + +def check_op_result(op_result): + if op_result: + msg = GetMacOSStatusCommentString(op_result).decode('utf-8') + raise OSError(msg) + +def send2trash(path): + if not isinstance(path, bytes): + path = path.encode('utf-8') + fp = FSRef() + opts = kFSPathMakeRefDoNotFollowLeafSymlink + op_result = FSPathMakeRefWithOptions(path, opts, byref(fp), None) + check_op_result(op_result) + opts = kFSFileOperationDefaultOptions + op_result = FSMoveObjectToTrashSync(byref(fp), None, opts) + check_op_result(op_result) diff --git a/sublime/.config/sublime-text-2/Packages/Default/send2trash/plat_other.py b/sublime/.config/sublime-text-2/Packages/Default/send2trash/plat_other.py @@ -0,0 +1,154 @@ +# Copyright 2010 Hardcoded Software (http://www.hardcoded.net) + +# This software is licensed under the "BSD" License as described in the "LICENSE" file, +# which should be included with this package. The terms are also available at +# http://www.hardcoded.net/licenses/bsd_license + +# This is a reimplementation of plat_other.py with reference to the +# freedesktop.org trash specification: +# [1] http://www.freedesktop.org/wiki/Specifications/trash-spec +# [2] http://www.ramendik.ru/docs/trashspec.html +# See also: +# [3] http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html +# +# For external volumes this implementation will raise an exception if it can't +# find or create the user's trash directory. + +import sys +import os +import os.path as op +from datetime import datetime +import stat +from urllib import quote + +FILES_DIR = 'files' +INFO_DIR = 'info' +INFO_SUFFIX = '.trashinfo' + +# Default of ~/.local/share [3] +XDG_DATA_HOME = op.expanduser(os.environ.get('XDG_DATA_HOME', '~/.local/share')) +HOMETRASH = op.join(XDG_DATA_HOME, 'Trash') + +uid = os.getuid() +TOPDIR_TRASH = '.Trash' +TOPDIR_FALLBACK = '.Trash-' + str(uid) + +def is_parent(parent, path): + path = op.realpath(path) # In case it's a symlink + parent = op.realpath(parent) + return path.startswith(parent) + +def format_date(date): + return date.strftime("%Y-%m-%dT%H:%M:%S") + +def info_for(src, topdir): + # ...it MUST not include a ".."" directory, and for files not "under" that + # directory, absolute pathnames must be used. [2] + if topdir is None or not is_parent(topdir, src): + src = op.abspath(src) + else: + src = op.relpath(src, topdir) + + info = "[Trash Info]\n" + info += "Path=" + quote(src) + "\n" + info += "DeletionDate=" + format_date(datetime.now()) + "\n" + return info + +def check_create(dir): + # use 0700 for paths [3] + if not op.exists(dir): + os.makedirs(dir, 0o700) + +def trash_move(src, dst, topdir=None): + filename = op.basename(src) + filespath = op.join(dst, FILES_DIR) + infopath = op.join(dst, INFO_DIR) + base_name, ext = op.splitext(filename) + + counter = 0 + destname = filename + while op.exists(op.join(filespath, destname)) or op.exists(op.join(infopath, destname + INFO_SUFFIX)): + counter += 1 + destname = '%s %s%s' % (base_name, counter, ext) + + check_create(filespath) + check_create(infopath) + + os.rename(src, op.join(filespath, destname)) + f = open(op.join(infopath, destname + INFO_SUFFIX), 'w') + f.write(info_for(src, topdir)) + f.close() + +def find_mount_point(path): + # Even if something's wrong, "/" is a mount point, so the loop will exit. + # Use realpath in case it's a symlink + path = op.realpath(path) # Required to avoid infinite loop + while not op.ismount(path): + path = op.split(path)[0] + return path + +def find_ext_volume_global_trash(volume_root): + # from [2] Trash directories (1) check for a .Trash dir with the right + # permissions set. + trash_dir = op.join(volume_root, TOPDIR_TRASH) + if not op.exists(trash_dir): + return None + + mode = os.lstat(trash_dir).st_mode + # vol/.Trash must be a directory, cannot be a symlink, and must have the + # sticky bit set. + if not op.isdir(trash_dir) or op.islink(trash_dir) or not (mode & stat.S_ISVTX): + return None + + trash_dir = op.join(trash_dir, str(uid)) + try: + check_create(trash_dir) + except OSError: + return None + return trash_dir + +def find_ext_volume_fallback_trash(volume_root): + # from [2] Trash directories (1) create a .Trash-$uid dir. + trash_dir = op.join(volume_root, TOPDIR_FALLBACK) + # Try to make the directory, if we can't the OSError exception will escape + # be thrown out of send2trash. + check_create(trash_dir) + return trash_dir + +def find_ext_volume_trash(volume_root): + trash_dir = find_ext_volume_global_trash(volume_root) + if trash_dir is None: + trash_dir = find_ext_volume_fallback_trash(volume_root) + return trash_dir + +# Pull this out so it's easy to stub (to avoid stubbing lstat itself) +def get_dev(path): + return os.lstat(path).st_dev + +def send2trash(path): + # if not isinstance(path, str): + # path = str(path, sys.getfilesystemencoding()) + if not op.exists(path): + raise OSError("File not found: %s" % path) + # ...should check whether the user has the necessary permissions to delete + # it, before starting the trashing operation itself. [2] + if not os.access(path, os.W_OK): + raise OSError("Permission denied: %s" % path) + # if the file to be trashed is on the same device as HOMETRASH we + # want to move it there. + path_dev = get_dev(path) + + # If XDG_DATA_HOME or HOMETRASH do not yet exist we need to stat the + # home directory, and these paths will be created further on if needed. + trash_dev = get_dev(op.expanduser('~')) + + if path_dev == trash_dev: + topdir = XDG_DATA_HOME + dest_trash = HOMETRASH + else: + topdir = find_mount_point(path) + trash_dev = get_dev(topdir) + if trash_dev != path_dev: + raise OSError("Couldn't find mount point for %s" % path) + dest_trash = find_ext_volume_trash(topdir) + trash_move(path, dest_trash, topdir) diff --git a/sublime/.config/sublime-text-2/Packages/Default/send2trash/plat_other.pyc b/sublime/.config/sublime-text-2/Packages/Default/send2trash/plat_other.pyc Binary files differ. diff --git a/sublime/.config/sublime-text-2/Packages/Default/send2trash/plat_win.py b/sublime/.config/sublime-text-2/Packages/Default/send2trash/plat_win.py @@ -0,0 +1,55 @@ +# Copyright 2010 Hardcoded Software (http://www.hardcoded.net) + +# This software is licensed under the "BSD" License as described in the "LICENSE" file, +# which should be included with this package. The terms are also available at +# http://www.hardcoded.net/licenses/bsd_license + +from ctypes import windll, Structure, byref, c_uint +from ctypes.wintypes import HWND, UINT, LPCWSTR, BOOL +import os.path as op + +shell32 = windll.shell32 +SHFileOperationW = shell32.SHFileOperationW + +class SHFILEOPSTRUCTW(Structure): + _fields_ = [ + ("hwnd", HWND), + ("wFunc", UINT), + ("pFrom", LPCWSTR), + ("pTo", LPCWSTR), + ("fFlags", c_uint), + ("fAnyOperationsAborted", BOOL), + ("hNameMappings", c_uint), + ("lpszProgressTitle", LPCWSTR), + ] + +FO_MOVE = 1 +FO_COPY = 2 +FO_DELETE = 3 +FO_RENAME = 4 + +FOF_MULTIDESTFILES = 1 +FOF_SILENT = 4 +FOF_NOCONFIRMATION = 16 +FOF_ALLOWUNDO = 64 +FOF_NOERRORUI = 1024 + +def send2trash(path): + # if not isinstance(path, str): + # path = str(path, 'mbcs') + if not op.isabs(path): + path = op.abspath(path) + fileop = SHFILEOPSTRUCTW() + fileop.hwnd = 0 + fileop.wFunc = FO_DELETE + fileop.pFrom = LPCWSTR(path + '\0') + fileop.pTo = None + fileop.fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMATION | FOF_NOERRORUI | FOF_SILENT + fileop.fAnyOperationsAborted = 0 + fileop.hNameMappings = 0 + fileop.lpszProgressTitle = None + result = SHFileOperationW(byref(fileop)) + if result: + msg = "Couldn't perform operation. Error code: %d" % result + raise OSError(msg) + diff --git a/sublime/.config/sublime-text-2/Packages/User/Preferences.sublime-settings b/sublime/.config/sublime-text-2/Packages/User/Preferences.sublime-settings @@ -0,0 +1,33 @@ +{ + "bold_folder_labels": true, + "caret_style": "phase", + "color_scheme": "Packages/Colorsublime-Themes/tron-contrast.tmTheme", + "fade_fold_buttons": false, + "file_exclude_patterns": + [ + ".DS_Store", + "*.pid", + "*.pyc" + ], + "folder_exclude_patterns": + [ + ".git", + "__pycache__", + "env", + "env3" + ], + "font_face": "Tamsyn", + "font_size": 11, + "highlight_line": true, + "ignored_packages": + [ + "Neka Theme", + "Vintage" + ], + "tab_size": 4, + "theme": "Wombat2.sublime-theme", + "translate_tabs_to_spaces": false, + "wide_caret": true, + "wombat_color_blue": true, + "wombat_dirty_bottom_bar_blue": true +} diff --git a/tmux/.tmux.conf b/tmux/.tmux.conf @@ -0,0 +1,115 @@ +# change prefix to backtick +unbind C-b +set-option -g prefix ` +bind ` send-prefix + +# shell +set -g default-command /usr/bin/zsh +set -g default-shell /usr/bin/zsh + +# start with window 1 (instead of 0) +set -g base-index 1 + +# start with pane 1 +set -g pane-base-index 1 + +# keep window names fixed +set-option -g allow-rename off + +# screen mode +set -g default-terminal "screen-256color" + +# source config file +bind r source-file ~/.tmux.conf + +# history +set -g history-limit 4096 + +# allow terminal scrolling +set-option -g terminal-overrides 'xterm*:smcup@:rmcup@' + +# vim style copy paste mode +unbind [ +bind Escape copy-mode +unbind p +bind p paste-buffer +bind-key -t vi-copy 'v' begin-selection +bind -t vi-copy y copy-pipe 'xclip -in -selection clipboard' + +# use vi mode +setw -g mode-keys vi +set -g status-keys vi + +# pleb mode +#set -g mouse on + +# splitting +unbind % +bind h split-window -h +unbind '"' +bind v split-window -v + +# window switching +# urxvt tab like window switching (-n: no prior escape seq) +bind-key -n S-left prev +bind-key -n S-right next +bind-key -n C-left swap-window -t -1 +bind-key -n C-right swap-window -t +1 +bind ` select-pane -t :.+ + +# colon : +bind : command-prompt + +# panes +set -g pane-border-fg colour0 +set -g pane-active-border-fg colour0 +#set -g pane-active-border-attr blink + +# status line +set -g status-justify left +set -g status-bg colour0 +set -g status-fg colour66 +set -g status-interval 2 + +# messaging +set -g message-fg colour0 +set -g message-bg colour66 +set -g message-command-fg colour66 +set -g message-command-bg colour1 + +# window mode +setw -g mode-bg colour66 +setw -g mode-fg colour0 + +# resizing +setw -g aggressive-resize on + +# window status +set-option -g status-position bottom +setw -g window-status-format "#[bg=colour241,fg=colour0,noreverse]█▓░ #W " +setw -g window-status-current-format "#[bg=colour66,fg=colour0,noreverse]█▓░ #W " + +# info on right +set -g status-right-length 100 +set -g status-right '' +set -g status-right '#(~/bin/tmux-status)' +# info on left (no session display) +set -g status-left '' + +# loud or quiet? +set-option -g visual-activity on +set-option -g visual-bell off +set-option -g visual-silence off +set-window-option -g monitor-activity off +set-option -g bell-action none + +# tmux clock +set -g clock-mode-colour colour66 + +# some key-binding changes +bind x kill-pane +bind X next-layout +bind Z previous-layout + +# toggle status bar visibility +bind t set status diff --git a/tmux/bin/tmux-status b/tmux/bin/tmux-status @@ -0,0 +1,111 @@ +#!/bin/sh +# ██ +# ░██ +# ██████ ██████████ ██ ██ ██ ██ +# ░░░██░ ░░██░░██░░██░██ ░██░░██ ██ +# ░██ ░██ ░██ ░██░██ ░██ ░░███ +# ░██ ░██ ░██ ░██░██ ░██ ██░██ +# ░░██ ███ ░██ ░██░░██████ ██ ░░██ +# ░░ ░░░ ░░ ░░ ░░░░░░ ░░ ░░ +# ██ ██ +# ░██ ░██ +# ██████ ██████ ██████ ██████ ██ ██ ██████ +# ██░░░░ ░░░██░ ░░░░░░██ ░░░██░ ░██ ░██ ██░░░░ +#░░█████ ░██ ███████ ░██ ░██ ░██░░█████ +# ░░░░░██ ░██ ██░░░░██ ░██ ░██ ░██ ░░░░░██ +# ██████ ░░██ ░░████████ ░░██ ░░██████ ██████ +#░░░░░░ ░░ ░░░░░░░░ ░░ ░░░░░░ ░░░░░░ +# +# ▓▓▓▓▓▓▓▓▓▓ +# ░▓ author ▓ xero <x@xero.nu> +# ░▓ code ▓ http://code.xero.nu/dotfiles +# ░▓ mirror ▓ http://git.io/.files +# ░▓▓▓▓▓▓▓▓▓▓ +# ░░░░░░░░░░ + +FULL=▓ +EMPTY=░ +EOL=▒ +SIZE=7 +C0="#000000" +C1="#222222" +C2="#1C596E" +C3="#B3291C" +C4="#3A3A3A" +C5="#efefef" +C6="#878787" +C7="#8787af" + +draw() +{ + perc=$1 + SIZE=$2 + inc=$(( perc * SIZE / 100 )) + out= + thiscolor= + for v in `seq 0 $(( SIZE - 1 ))`; do + test "$v" -le "$inc" \ + && out="${out}#[fg=$C1]${FULL}" \ + || out="${out}#[fg=$C1]${EMPTY}" + done + echo $out +} +temp() +{ + t=$(sensors | awk '/Core\ 0/ {gsub(/\+/,"",$3); gsub(/\..+/,"",$3) ; print $3}') + tc=$C0 + case 1 in + $((t <= 50))) + tc=$C2 + ;; + $((t >= 75))) + tc=$C3 + ;; + esac + echo "#[fg=$tc]$t°c" +} +bat() +{ + BATPATH=/sys/class/power_supply/BAT1 + STATUS=$BATPATH/status + BAT_FULL=$BATPATH/charge_full + BAT_NOW=$BATPATH/charge_now + bf=$(cat $BAT_FULL) + bn=$(cat $BAT_NOW) + stat=$(cat $STATUS) + case $stat in + Full) + st="=" + ;; + Discharging) + st="-" + ;; + Charging) + st="+" + ;; + esac + echo $st$(( 100 * $bn / $bf ))"%" +} +cpu() +{ + CPU_USE=$(grep 'cpu ' /proc/stat | awk '{usage=($2+$4)*100/($2+$4+$5)} END {print usage}') + printf "%.0f" $CPU_USE +} +ram() +{ + free | awk '/Mem:/ {print int($3/$2 * 100.0)}' +} +clock() +{ + mtime=$(date +'%H:%M') + myear=$(date +'%Y-%m-') + mday=$(date +'%d') + echo "#[fg=$C5]#[bg=$C4] $mtime #[fg=$C6]$myear#[fg=$C5]$mday #[fg=$C6]$EOL" +} +front() +{ + echo "#[bg=$C7]#[fg=$C1]▓░" +} +CPU_INFO=`cpu` +RAM_INFO=`ram` +echo `front` `bat` `draw $RAM_INFO 4` `temp` `draw $CPU_INFO 7` `clock` diff --git a/urxvt/.Xdefaults b/urxvt/.Xdefaults @@ -0,0 +1,65 @@ +! pyratesoft Xdefaults + +!#include </home/dudley/pyratesoft4.Xcolors> + +! geometry +urxvt.geometry: 85x45 + +! fonts +urxvt*font: xft:Tamsyn:pixelsize=15 +urxvt*boldFont: +urxvt*italicFont: +urxvt*bolditalicFont: + +! interface +urxvt*transparent: true +urxvt*shading: 10 +urxvt*scrollBar: false +urxvt*cursorBlink: true + +! clipboard +urxvt.perl-ext-common: default,clipboard,keyboard-select +urxvt.keysym.M-Escape: perl:keyboard-select:activate +urxvt.keysym.M-c: perl:clipboard:copy +urxvt.keysym.C-v: perl:clipboard:paste +urxvt.keysym.M-C-v: perl:clipboard:paste_escaped +urxvt.clipboard.copycmd: xsel -ib +urxvt.clipboard.pastecmd: xsel -ob + +! special +*.foreground: #d9d9d9 +*.background: #0b0b0b +*.cursorColor: #d9d9d9 + +! black +*.color0: #093748 +*.color8: #245361 + +! red +*.color1: #c33027 +*.color9: #d85a21 + +! green +*.color2: #61b343 +*.color10: #33859d + +! yellow +*.color3: #d9d9d9 +*.color11: #245361 + +! blue +*.color4: #195465 +*.color12: #33859d + +! magenta +*.color5: #4e5165 +*.color13: #693699 + +! cyan +*.color6: #019cb3 +!*.color6: #233fe8 +*.color14: #599caa + +! white +*.color7: #98d1ce +*.color15: #d3ebe9 diff --git a/urxvt/.pyratesoft4.Xcolors b/urxvt/.pyratesoft4.Xcolors @@ -0,0 +1,55 @@ +! special +!217,217,217 +*.foreground: #d9d9d9 +*.cursorColor: #d9d9d9 + +!11,11,11 +*.background: #0b0b0b + +! black +!9,55,67 +*.color0: #093748 +!36,83,97 +*.color8: #245361 + +! red +!195,48,39 +*.color1: #c33027 +!210,105,57 +*.color9: #d26939 + +! green +!38,169,139 +*.color2: #2cc4a1 +!54,69,79 +*.color10: #4f5f6a + +! yellow +!237,181,75 +*.color3: #edb54b +!36,83,97 +*.color11: #245361 + +! blue +!25,84,101 +*.color4: #195465 +!51,133,157 +*.color12: #33859d + +! magenta +!78,81,101 +*.color5: #4e5165 +!136,139,165 +*.color13: #888ba5 + +! cyan +!51,133,157 +*.color6: #33859d +!89,156,170 +*.color14: #599caa + +! white +!152,209,206 +*.color7: #98d1ce +!211,235,233 +*.color15: #d3ebe9 +\ No newline at end of file diff --git a/vim/.vim/bundle/lightline.vim/autoload/lightline/colorscheme/sourcerer.vim b/vim/.vim/bundle/lightline.vim/autoload/lightline/colorscheme/sourcerer.vim @@ -0,0 +1,38 @@ +" ============================================================================= +" Filename: autoload/lightline/colorscheme/sourcerer.vim +" Author: xero (http://xero.nu) +" Last Change: 2015/06/13 22:22:22 +" ============================================================================= +let s:base03 = [ '#151513', 233 ] +let s:base02 = [ '#222222', 0 ] +let s:base01 = [ '#4e4e43', 239 ] +let s:base00 = [ '#666656', 242 ] +let s:base0 = [ '#808070', 244 ] +let s:base1 = [ '#949484', 246 ] +let s:base2 = [ '#a8a897', 248 ] +let s:base3 = [ '#e8e8d3', 253 ] +let s:yellow = [ '#7A7A57', 11 ] +let s:orange = [ '#ff9800', 3 ] +let s:red = [ '#ff6a6a', 1 ] +let s:magenta = [ '#6688aa', 13 ] +let s:cyan = [ '#87ceeb', 12 ] +let s:green = [ '#b1d631', 2 ] + +let s:p = {'normal': {}, 'inactive': {}, 'insert': {}, 'replace': {}, 'visual': {}, 'tabline': {}} +let s:p.normal.left = [ [ s:base02, s:magenta ], [ s:base3, s:base01 ] ] +let s:p.normal.right = [ [ s:base02, s:base1 ], [ s:base2, s:base01 ] ] +let s:p.inactive.right = [ [ s:base02, s:base00 ], [ s:base0, s:base02 ] ] +let s:p.inactive.left = [ [ s:base0, s:base02 ], [ s:base00, s:base02 ] ] +let s:p.insert.left = [ [ s:base02, s:cyan ], [ s:base3, s:base01 ] ] +let s:p.replace.left = [ [ s:base02, s:red ], [ s:base3, s:base01 ] ] +let s:p.visual.left = [ [ s:base02, s:green ], [ s:base3, s:base01 ] ] +let s:p.normal.middle = [ [ s:base0, s:base02 ] ] +let s:p.inactive.middle = [ [ s:base00, s:base02 ] ] +let s:p.tabline.left = [ [ s:base3, s:base00 ] ] +let s:p.tabline.tabsel = [ [ s:base3, s:base02 ] ] +let s:p.tabline.middle = [ [ s:base01, s:base1 ] ] +let s:p.tabline.right = copy(s:p.normal.right) +let s:p.normal.error = [ [ s:red, s:base02 ] ] +let s:p.normal.warning = [ [ s:yellow, s:base01 ] ] + +let g:lightline#colorscheme#sourcerer#palette = lightline#colorscheme#flatten(s:p) diff --git a/vim/.vim/colors/sourcerer.vim b/vim/.vim/colors/sourcerer.vim @@ -0,0 +1,210 @@ +" ██████ ██████ ██ ██ ██████ █████ █████ ██████ █████ ██████ +" ██░░░░ ██░░░░██░██ ░██░░██░░████░░░██ ██░░░██░░██░░████░░░██░░██░░██ +" ░░█████ ░██ ░██░██ ░██ ░██ ░░░██ ░░ ░███████ ░██ ░░░███████ ░██ ░░ +" ░░░░░██░██ ░██░██ ░██ ░██ ░██ ██░██░░░░ ░██ ░██░░░░ ░██ +" ██████ ░░██████ ░░██████░███ ░░█████ ░░██████░███ ░░██████░███ +" ░░░░░░ ░░░░░░ ░░░░░░ ░░░ ░░░░░ ░░░░░░ ░░░ ░░░░░░ ░░░ +" r e a d c o d e l i k e a w i z a r d +" +" sourcerer by xero harrison (http://xero.nu) +" ├─ based on sorcerer by Jeet Sukumaran (http://jeetworks.org) +" └─ based on mustang by Henrique C. Alves (hcarvalhoalves@gmail.com) + +set background=dark +hi clear + +if exists("syntax_on") + syntax reset +endif + +let colors_name = "sourcerer" + + +" █▓▒░ GUI colors +hi Normal guifg=#c2c2b0 guibg=#222222 gui=NONE +hi ColorColumn guifg=NONE guibg=#1c1c1c +hi Cursor guifg=NONE guibg=#626262 gui=NONE +hi CursorColumn guibg=#2d2d2d +hi CursorLine guibg=#2d2d2d +hi DiffAdd guifg=#000000 guibg=#3cb371 gui=NONE +hi DiffDelete guifg=#000000 guibg=#aa4450 gui=NONE +hi DiffChange guifg=#000000 guibg=#4f94cd gui=NONE +hi DiffText guifg=#000000 guibg=#8ee5ee gui=NONE +hi Directory guifg=#1e90ff guibg=NONE gui=NONE +hi ErrorMsg guifg=#ff6a6a guibg=NONE gui=bold +hi FoldColumn guifg=#68838b guibg=#4B4B4B gui=bold +hi Folded guifg=#406060 guibg=#232c2c gui=NONE +hi IncSearch guifg=#ffffff guibg=#ff4500 gui=bold +hi LineNr guifg=#878787 guibg=#3A3A3A gui=NONE +hi MatchParen guifg=#fff000 guibg=NONE gui=bold +hi ModeMsg guifg=#afafaf guibg=#222222 gui=bold +hi MoreMsg guifg=#2e8b57 guibg=NONE gui=bold +hi NonText guifg=#404050 guibg=NONE gui=NONE + +hi Pmenu guifg=#ffffff guibg=#444444 +hi PmenuSel guifg=#000000 guibg=#b1d631 +" hi PmenuSbar guifg=#ffffff guibg=#c1cdc1 gui=NONE +" hi PmenuThumb guifg=#ffffff guibg=#838b83 gui=NONE + +hi Question guifg=#00ee00 guibg=NONE gui=bold +hi Search guifg=#000000 guibg=#d6e770 gui=bold +hi SignColumn guifg=#ffffff guibg=NONE gui=NONE +hi SpecialKey guifg=#505060 guibg=NONE gui=NONE +hi SpellBad guisp=#ee2c2c gui=undercurl +hi SpellCap guisp=#0000ff gui=undercurl +hi SpellLocal guisp=#008b8b gui=undercurl +hi SpellRare guisp=#ff00ff gui=undercurl +hi StatusLine guifg=#000000 guibg=#808070 gui=bold +hi StatusLineNC guifg=#000000 guibg=#404c4c gui=italic +hi VertSplit guifg=#404c4c guibg=#404c4c gui=NONE +hi TabLine guifg=fg guibg=#d3d3d3 gui=underline +hi TabLineFill guifg=fg guibg=NONE gui=reverse +hi TabLineSel guifg=fg guibg=NONE gui=bold +hi Title guifg=#528b8b guibg=NONE gui=bold +hi Visual guifg=#000000 guibg=#6688aa gui=NONE +hi WarningMsg guifg=#ee9a00 guibg=NONE gui=NONE +hi WildMenu guifg=#000000 guibg=#87ceeb gui=NONE +hi ExtraWhitespace guifg=fg guibg=#528b8b gui=NONE + +" syntax highlighting +hi Comment guifg=#686858 gui=italic +hi Boolean guifg=#ff9800 gui=NONE +hi String guifg=#779b70 gui=NONE +hi Identifier guifg=#9ebac2 gui=NONE +hi Function guifg=#faf4c6 gui=NONE +hi Type guifg=#7e8aa2 gui=NONE +hi Statement guifg=#90b0d1 gui=NONE +hi Keyword guifg=#90b0d1 gui=NONE +hi Constant guifg=#ff9800 gui=NONE +hi Number guifg=#cc8800 gui=NONE +hi Special guifg=#719611 gui=NONE +hi PreProc guifg=#528b8b gui=NONE +hi Todo guifg=#8f6f8f guibg=#202020 gui=italic,underline,bold + +" diff +hi diffOldFile guifg=#88afcb guibg=NONE gui=italic +hi diffNewFile guifg=#88afcb guibg=NONE gui=italic +hi diffFile guifg=#88afcb guibg=NONE gui=italic +hi diffLine guifg=#88afcb guibg=NONE gui=italic +hi link diffSubname diffLine +hi diffAdded guifg=#3cb371 guibg=NONE gui=NONE +hi diffRemoved guifg=#aa4450 guibg=NONE gui=NONE +hi diffChanged guifg=#4f94cd guibg=NONE gui=NONE +hi link diffOnly Constant +hi link diffIdentical Constant +hi link diffDiffer Constant +hi link diffBDiffer Constant +hi link diffIsA Constant +hi link diffNoEOL Constant +hi link diffCommon Constant +hi link diffComment Constant + +" python +hi pythonException guifg=#90b0d1 guibg=NONE gui=NONE +hi pythonExClass guifg=#996666 guibg=NONE gui=NONE +hi pythonDecorator guifg=#888555 guibg=NONE gui=NONE +hi link pythonDecoratorFunction pythonDecorator + +" █▓▒░ 256 colors +hi Normal cterm=NONE ctermbg=NONE ctermfg=145 +hi ColorColumn cterm=NONE ctermbg=16 ctermfg=NONE +hi Cursor cterm=NONE ctermbg=241 ctermfg=fg +hi CursorColumn cterm=NONE ctermbg=16 ctermfg=fg +hi CursorLine cterm=NONE ctermbg=236 ctermfg=fg +hi DiffAdd cterm=NONE ctermbg=71 ctermfg=16 +hi DiffDelete cterm=NONE ctermbg=124 ctermfg=16 +hi DiffChange cterm=NONE ctermbg=68 ctermfg=16 +hi DiffText cterm=NONE ctermbg=117 ctermfg=16 +hi Directory cterm=NONE ctermbg=234 ctermfg=33 +hi ErrorMsg cterm=bold ctermbg=NONE ctermfg=203 +hi FoldColumn cterm=bold ctermbg=239 ctermfg=66 +hi Folded cterm=NONE ctermbg=16 ctermfg=60 +hi IncSearch cterm=bold ctermbg=202 ctermfg=231 +hi LineNr cterm=NONE ctermbg=237 ctermfg=102 +hi MatchParen cterm=bold ctermbg=NONE ctermfg=226 +hi ModeMsg cterm=bold ctermbg=NONE ctermfg=145 +hi MoreMsg cterm=bold ctermbg=234 ctermfg=29 +hi NonText cterm=NONE ctermbg=NONE ctermfg=59 +hi Pmenu cterm=NONE ctermbg=238 ctermfg=231 +hi PmenuSbar cterm=NONE ctermbg=250 ctermfg=fg +hi PmenuSel cterm=NONE ctermbg=149 ctermfg=16 +hi Question cterm=bold ctermbg=NONE ctermfg=46 +hi Search cterm=bold ctermbg=185 ctermfg=16 +hi SignColumn cterm=NONE ctermbg=NONE ctermfg=231 +hi SpecialKey cterm=NONE ctermbg=NONE ctermfg=59 +hi SpellBad cterm=undercurl ctermbg=NONE ctermfg=196 +hi SpellCap cterm=undercurl ctermbg=NONE ctermfg=21 +hi SpellLocal cterm=undercurl ctermbg=NONE ctermfg=30 +hi SpellRare cterm=undercurl ctermbg=NONE ctermfg=201 +hi StatusLine cterm=bold ctermbg=101 ctermfg=16 +hi StatusLineNC cterm=NONE ctermbg=102 ctermfg=16 +hi VertSplit cterm=NONE ctermbg=102 ctermfg=102 +hi TabLine cterm=bold ctermbg=102 ctermfg=16 +hi TabLineFill cterm=NONE ctermbg=102 ctermfg=16 +hi TabLineSel cterm=bold ctermbg=16 ctermfg=59 +hi Title cterm=bold ctermbg=NONE ctermfg=66 +hi Visual cterm=NONE ctermbg=67 ctermfg=16 +hi WarningMsg cterm=NONE ctermbg=234 ctermfg=208 +hi WildMenu cterm=NONE ctermbg=116 ctermfg=16 +hi ExtraWhitespace cterm=NONE ctermbg=66 ctermfg=fg + +hi Comment cterm=NONE ctermbg=NONE ctermfg=59 +hi Boolean cterm=NONE ctermbg=NONE ctermfg=208 +hi String cterm=NONE ctermbg=NONE ctermfg=101 +hi Identifier cterm=NONE ctermbg=NONE ctermfg=145 +hi Function cterm=NONE ctermbg=NONE ctermfg=230 +hi Type cterm=NONE ctermbg=NONE ctermfg=103 +hi Statement cterm=NONE ctermbg=NONE ctermfg=110 +hi Keyword cterm=NONE ctermbg=NONE ctermfg=110 +hi Constant cterm=NONE ctermbg=NONE ctermfg=208 +hi Number cterm=NONE ctermbg=NONE ctermfg=172 +hi Special cterm=NONE ctermbg=NONE ctermfg=64 +hi PreProc cterm=NONE ctermbg=NONE ctermfg=66 +hi Todo cterm=bold,underline ctermbg=234 ctermfg=96 + +hi diffOldFile cterm=NONE ctermbg=NONE ctermfg=67 +hi diffNewFile cterm=NONE ctermbg=NONE ctermfg=67 +hi diffFile cterm=NONE ctermbg=NONE ctermfg=67 +hi diffLine cterm=NONE ctermbg=NONE ctermfg=67 +hi diffAdded cterm=NONE ctermfg=NONE ctermfg=71 +hi diffRemoved cterm=NONE ctermfg=NONE ctermfg=124 +hi diffChanged cterm=NONE ctermfg=NONE ctermfg=68 +hi link diffSubname diffLine +hi link diffOnly Constant +hi link diffIdentical Constant +hi link diffDiffer Constant +hi link diffBDiffer Constant +hi link diffIsA Constant +hi link diffNoEOL Constant +hi link diffCommon Constant +hi link diffComment Constant + +hi pythonClass cterm=NONE ctermbg=NONE ctermfg=fg +hi pythonDecorator cterm=NONE ctermbg=NONE ctermfg=101 +hi pythonExClass cterm=NONE ctermbg=NONE ctermfg=95 +hi pythonException cterm=NONE ctermbg=NONE ctermfg=110 +hi pythonFunc cterm=NONE ctermbg=NONE ctermfg=fg +hi pythonFuncParams cterm=NONE ctermbg=NONE ctermfg=fg +hi pythonKeyword cterm=NONE ctermbg=NONE ctermfg=fg +hi pythonParam cterm=NONE ctermbg=NONE ctermfg=fg +hi pythonRawEscape cterm=NONE ctermbg=NONE ctermfg=fg +hi pythonSuperclasses cterm=NONE ctermbg=NONE ctermfg=fg +hi pythonSync cterm=NONE ctermbg=NONE ctermfg=fg + +hi Conceal cterm=NONE ctermbg=248 ctermfg=252 +hi Error cterm=NONE ctermbg=196 ctermfg=231 +hi Ignore cterm=NONE ctermbg=NONE ctermfg=234 +hi InsertModeCursorLine cterm=NONE ctermbg=16 ctermfg=fg +hi NormalModeCursorLine cterm=NONE ctermbg=235 ctermfg=fg +hi PmenuThumb cterm=reverse ctermbg=NONE ctermfg=fg +hi StatusLineAlert cterm=NONE ctermbg=160 ctermfg=231 +hi StatusLineUnalert cterm=NONE ctermbg=238 ctermfg=144 +hi Test cterm=NONE ctermbg=NONE ctermfg=fg +hi Underlined cterm=underline ctermbg=NONE ctermfg=111 +hi VisualNOS cterm=bold,underline ctermbg=NONE ctermfg=fg +hi cCursor cterm=reverse ctermbg=NONE ctermfg=fg +hi iCursor cterm=NONE ctermbg=210 ctermfg=16 +hi lCursor cterm=NONE ctermbg=145 ctermfg=234 +hi nCursor cterm=NONE ctermbg=NONE ctermfg=145 +hi vCursor cterm=NONE ctermbg=201 ctermfg=16 + diff --git a/vim/.vim/undo/.gitignore b/vim/.vim/undo/.gitignore @@ -0,0 +1 @@ +[^.]* diff --git a/vim/.vimrc b/vim/.vimrc @@ -0,0 +1,260 @@ +" ██ +" ░░ +" ██ ██ ██ ██████████ ██████ █████ +" ░██ ░██░██░░██░░██░░██░░██░░█ ██░░░██ +" ░░██ ░██ ░██ ░██ ░██ ░██ ░██ ░ ░██ ░░ +" ░░████ ░██ ░██ ░██ ░██ ░██ ░██ ██ +" ░░██ ░██ ███ ░██ ░██░███ ░░█████ +" ░░ ░░ ░░░ ░░ ░░ ░░░ ░░░░░ +" +" ▓▓▓▓▓▓▓▓▓▓ +" ░▓ author ▓ xero <x@xero.nu> +" ░▓ code ▓ http://code.xero.nu/dotfiles +" ░▓ mirror ▓ http://git.io/.files +" ░▓▓▓▓▓▓▓▓▓▓ +" ░░░░░░░░░░ +" +" use vim settings, rather than vi settings +" must be first, because it changes other options as a side effect +set nocompatible + +" security +set modelines=0 + +" paste without auto indentation +set paste + +" hide buffers, not close them +set hidden + +" maintain undo history between sessions +set undofile +set undodir=~/.vim/undo +set noswapfile + +" lazy file name tab completion +set wildmode=longest,list,full +set wildmenu +set wildignorecase + +" case insensitive search +set ignorecase +set smartcase +set infercase + +" the /g flag on :s substitutions by default +set gdefault + +" make backspace behave in a sane manner +set backspace=indent,eol,start + +" searching +set hlsearch +set incsearch + +" use indents of 4 spaces +set shiftwidth=2 + +" tabs are spaces, not tabs +set expandtab + +" an indentation every four columns +set tabstop=2 + +" let backspace delete indent +set softtabstop=2 + +" enable auto indentation +set autoindent + +" remove trailing whitespaces and ^M chars +autocmd FileType c,cpp,java,php,js,python,twig,xml,yml autocmd BufWritePre <buffer> :call setline(1,map(getline(1,"$"),'substitute(v:val,"\\s\\+$","","")')) + +" let mapleader="," +vnoremap <silent> <leader>y :w !xsel -i -b<CR> +nnoremap <silent> <leader>y V:w !xsel -i -b<CR> +nnoremap <silent> <leader>p :silent :r !xsel -o -b<CR> + +" ┏━╸┏━┓┏┳┓┏┳┓┏━┓┏┓╻╺┳┓┏━┓ +" ┃ ┃ ┃┃┃┃┃┃┃┣━┫┃┗┫ ┃┃┗━┓ +" ┗━╸┗━┛╹ ╹╹ ╹╹ ╹╹ ╹╺┻┛┗━┛ + +" json pretty print +command J :%!python -mjson.tool + +" remove trailing white space +command Nows :%s/\s\+$// + +" remove blank lines +command Nobl :g/^\s*$/d + +" toggle spellcheck +command Spell :setlocal spell! spell? + +" make current buffer executable +command Chmodx :!chmod a+x % + +" ╻┏┓╻╺┳╸┏━╸┏━┓┏━╸┏━┓┏━╸┏━╸ +" ┃┃┗┫ ┃ ┣╸ ┣┳┛┣╸ ┣━┫┃ ┣╸ +" ╹╹ ╹ ╹ ┗━╸╹┗╸╹ ╹ ╹┗━╸┗━╸ + +" show matching brackets/parenthesis +set showmatch + +" disable startup message +set shortmess+=I + +" syntax highlighting and colors +syntax on +colorscheme sourcerer +filetype off + +" stop unnecessary rendering +set lazyredraw + +" show line numbers +set number + +" no line wrapping +set nowrap + +" no folding +set foldlevel=99 +set foldminlines=99 + +" don't wrap long lines +set nowrap + +" highlight column +set cursorcolumn + +" ┏━┓╻ ╻ ╻┏━╸╻┏┓╻ ┏━┓╺┳╸╻ ╻┏━╸┏━╸ +" ┣━┛┃ ┃ ┃┃╺┓┃┃┗┫ ┗━┓ ┃ ┃ ┃┣╸ ┣╸ +" ╹ ┗━╸┗━┛┗━┛╹╹ ╹ ┗━┛ ╹ ┗━┛╹ ╹ +" i struggle with the decision to use plugins or a more vanilla vim. but right now i'm feeling sytanx completion, linting, and visual git diffs. don't judge me. +" to install from the shell run: +" git clone https://github.com/gmarik/Vundle.vim.git ~/dotfiles/vim/.vim/bundle/Vundle.vim && vim +BundleInstall +qall && PYTHON=/usr/bin/python2 ~/dotfiles/vim/.vim/bundle/YouCompleteMe/install.sh --clang-completer && pacman -S the_silver_searcher +if 1 " boolean for plugin loading + set rtp+=~/.vim/bundle/Vundle.vim + call vundle#begin() + Plugin 'gmarik/Vundle.vim' + Plugin 'Valloric/YouCompleteMe' + Plugin 'scrooloose/syntastic' + Plugin 'airblade/vim-gitgutter' + Plugin 'isa/vim-matchit' + Plugin 'shawncplus/phpcomplete.vim' + Plugin 'rking/ag.vim' + Plugin 'itchyny/lightline.vim' + Plugin 'tpope/vim-fugitive' + call vundle#end() + filetype plugin indent on + + " syntatic http://git.io/syntastic.vim + " linters: (from aur) nodejs-jshint, nodejs-jsonlint, csslint, checkbashisms + let g:syntastic_always_populate_loc_list = 1 + let g:syntastic_auto_loc_list = 1 + let g:syntastic_check_on_open = 1 + let g:syntastic_check_on_wq = 0 + highlight SyntasticErrorSign ctermfg=red ctermbg=237 + highlight SyntasticWarningSign ctermfg=yellow ctermbg=237 + highlight SyntasticStyleErrorSign ctermfg=red ctermbg=237 + highlight SyntasticStyleWarningSign ctermfg=yellow ctermbg=237 + + " git-gutter http://git.io/vimgitgutter + let g:gitgutter_realtime = 1 + let g:gitgutter_eager = 1 + let g:gitgutter_diff_args = '-w' + let g:gitgutter_sign_added = '+' + let g:gitgutter_sign_modified = '~' + let g:gitgutter_sign_removed = '-' + let g:gitgutter_sign_removed_first_line = '^' + let g:gitgutter_sign_modified_removed = ':' + let g:gitgutter_max_signs = 1500 + highlight clear SignColumn + highlight GitGutterAdd ctermfg=green ctermbg=237 + highlight GitGutterChange ctermfg=yellow ctermbg=237 + highlight GitGutterDelete ctermfg=red ctermbg=237 + highlight GitGutterChangeDelete ctermfg=red ctermbg=237 + + " ag, the silver searcher http://git.io/AEu3dQ + http://git.io/d9N0MA + let g:agprg="ag -i --vimgrep" + let g:ag_highlight=1 + " map \ to the ag command for quick searching + nnoremap \ :Ag<SPACE> + + " ┏━┓╺┳╸┏━┓╺┳╸╻ ╻┏━┓╻ ╻┏┓╻┏━╸ + " ┗━┓ ┃ ┣━┫ ┃ ┃ ┃┗━┓┃ ┃┃┗┫┣╸ + " ┗━┛ ╹ ╹ ╹ ╹ ┗━┛┗━┛┗━╸╹╹ ╹┗━╸ + " lightline http://git.io/lightline + " █▓▒░ wizard status line + set laststatus=2 + let g:lightline = { + \ 'colorscheme': 'sourcerer', + \ 'active': { + \ 'left': [ [ 'filename' ], + \ [ 'readonly', 'fugitive' ] ], + \ 'right': [ [ 'percent', 'lineinfo' ], + \ [ 'fileencoding', 'filetype' ], + \ [ 'fileformat', 'syntastic' ] ] + \ }, + \ 'component_function': { + \ 'modified': 'WizMod', + \ 'readonly': 'WizRO', + \ 'fugitive': 'WizGit', + \ 'filename': 'WizName', + \ 'filetype': 'WizType', + \ 'fileformat' : 'WizFormat', + \ 'fileencoding': 'WizEncoding', + \ 'mode': 'WizMode', + \ }, + \ 'component_expand': { + \ 'syntastic': 'SyntasticStatuslineFlag', + \ }, + \ 'component_type': { + \ 'syntastic': 'error', + \ }, + \ 'separator': { 'left': '▓▒░', 'right': '░▒▓' }, + \ 'subseparator': { 'left': '▒', 'right': '░' } + \ } + + function! WizMod() + return &ft =~ 'help\|vimfiler' ? '' : &modified ? '»' : &modifiable ? '' : '' + endfunction + + function! WizRO() + return &ft !~? 'help\|vimfiler' && &readonly ? 'x' : '' + endfunction + + function! WizGit() + if &ft !~? 'help\|vimfiler' && exists("*fugitive#head") + return fugitive#head() + endif + return '' + endfunction + + function! WizName() + return ('' != WizMod() ? WizMod() . ' ' : '') . + \ ('' != expand('%:t') ? expand('%:t') : '[none]') + endfunction + + function! WizType() + return winwidth(0) > 70 ? (strlen(&filetype) ? &filetype : '') : '' + endfunction + + function! WizFormat() + return '' + endfunction + + function! WizEncoding() + return winwidth(0) > 70 ? (strlen(&fenc) ? &enc : &enc) : '' + endfunction + + augroup AutoSyntastic + autocmd! + autocmd BufWritePost *.c,*.cpp call s:syntastic() + augroup END + function! s:syntastic() + SyntasticCheck + call lightline#update() + endfunction +endif diff --git a/vim/.vimrc-min b/vim/.vimrc-min @@ -0,0 +1,389 @@ +" ██ +" ░░ +" ██ ██ ██ ██████████ ██████ █████ +" ░██ ░██░██░░██░░██░░██░░██░░█ ██░░░██ +" ░░██ ░██ ░██ ░██ ░██ ░██ ░██ ░ ░██ ░░ +" ░░████ ░██ ░██ ░██ ░██ ░██ ░██ ██ +" ░░██ ░██ ███ ░██ ░██░███ ░░█████ +" ░░ ░░ ░░░ ░░ ░░ ░░░ ░░░░░ +" +" ▓▓▓▓▓▓▓▓▓▓ +" ░▓ author ▓ xero <x@xero.nu> +" ░▓ code ▓ http://code.xero.nu/dotfiles +" ░▓ mirror ▓ http://git.io/.files +" ░▓▓▓▓▓▓▓▓▓▓ +" ░░░░░░░░░░ +" +" use vim settings, rather than vi settings +" must be first, because it changes other options as a side effect +set nocompatible + +" paste without auto indentation +set paste + +" maintain undo history between sessions +set undofile +set undodir=~/.vim/undo +set noswapfile + +" lazy file name tab completion +set wildmode=longest,list,full +set wildmenu +set wildignorecase + +" case insensitive search +set ignorecase +set smartcase + +" the /g flag on :s substitutions by default +set gdefault + +" make backspace behave in a sane manner +set backspace=indent,eol,start + +" searching +set hlsearch +set incsearch + +" use indents of 4 spaces +set shiftwidth=2 + +" tabs are spaces, not tabs +set expandtab + +" an indentation every four columns +set tabstop=2 + +" let backspace delete indent +set softtabstop=2 + +" remove trailing whitespaces and ^M chars +autocmd FileType c,cpp,java,php,js,python,twig,xml,yml autocmd BufWritePre <buffer> :call setline(1,map(getline(1,"$"),'substitute(v:val,"\\s\\+$","","")')) + +" let mapleader="," +vnoremap <silent> <leader>y :w !xsel -i -b<CR> +nnoremap <silent> <leader>y V:w !xsel -i -b<CR> +nnoremap <silent> <leader>p :silent :r !xsel -o -b<CR> + +" ┏━╸┏━┓┏┳┓┏┳┓┏━┓┏┓╻╺┳┓┏━┓ +" ┃ ┃ ┃┃┃┃┃┃┃┣━┫┃┗┫ ┃┃┗━┓ +" ┗━╸┗━┛╹ ╹╹ ╹╹ ╹╹ ╹╺┻┛┗━┛ + +" make ; work like : for commands (lazy shifting) +nnoremap ; : + +" json pretty print +command J :%!python -mjson.tool + +" remove trailing white space +command Nows :%s/\s\+$// + +" remove blank lines +command Nobl :g/^\s*$/d + +" toggle spellcheck +command Spell :setlocal spell! spell? + +" ╻┏┓╻╺┳╸┏━╸┏━┓┏━╸┏━┓┏━╸┏━╸ +" ┃┃┗┫ ┃ ┣╸ ┣┳┛┣╸ ┣━┫┃ ┣╸ +" ╹╹ ╹ ╹ ┗━╸╹┗╸╹ ╹ ╹┗━╸┗━╸ + +" show matching brackets/parenthesis +set showmatch + +" disable startup message +set shortmess+=I + +" syntax highlighting and colors +syntax on +colorscheme sourcerer +filetype off + +" stop unnecessary rendering +set lazyredraw + +" show line numbers +set number + +" no line wrapping +set nowrap + +" no folding +set foldlevel=99 +set foldminlines=99 + +" don't wrap long lines +set nowrap + +" highlight column +set cursorcolumn + +" enable file type detection and do language-dependent indenting +if has("autocmd") + filetype on + filetype indent on + filetype plugin on +endif + +" ┏━┓╺┳╸┏━┓╺┳╸╻ ╻┏━┓╻ ╻┏┓╻┏━╸ +" ┗━┓ ┃ ┣━┫ ┃ ┃ ┃┗━┓┃ ┃┃┗┫┣╸ +" ┗━┛ ╹ ╹ ╹ ╹ ┗━┛┗━┛┗━╸╹╹ ╹┗━╸ +" █▓▒░ wizard status line +set laststatus=2 + +hi BgColor guibg=#3A3A3A guifg=#ffffff ctermbg=237 ctermfg=255 +hi ModColor guibg=#3A3A3A guifg=#afaf00 ctermbg=237 ctermfg=142 +hi StatColor guibg=#3a3a3a guifg=#ffffff ctermbg=237 ctermfg=255 +hi GitColor guibg=#4e4e4e guifg=#ffffff ctermbg=239 ctermfg=255 +hi VoidColor guibg=#222222 guifg=#4e4e4e ctermbg=NONE ctermfg=239 +hi TypeColor guibg=#D78700 guifg=#262626 ctermbg=66 ctermfg=235 +hi PosColor guibg=#8787AF guifg=#262626 ctermbg=103 ctermfg=235 + +function! WizardStatus(mode) + let statusline="%#BgColor#" + if &modified == 1 + let statusline.="%#ModColor# »» " + else + let statusline.=" " + endif + if &readonly != '' + hi StatColor guifg=#af0000 ctermfg=124 + endif + let statusline.="%#StatColor#%F " + let statusline .= '%#VoidColor#▒░ ' + let statusline .= "%=%h%w\ %#TypeColor#▓" + if &filetype != '' + let statusline .="▒ %Y " + endif + let statusline .="▒ %{&encoding}:%{&fileformat} %#PosColor#▒ %p%% ░ %l/%L\.\%c\ ▒" + return statusline +endfunction + +au WinEnter * setlocal statusline=%!WizardStatus('Enter') +au WinLeave * setlocal statusline=%!WizardStatus('Leave') +set statusline=%!WizardStatus('Enter') + +function! Colorize(mode) + if a:mode == 'i' + hi StatColor guibg=#D78700 guifg=#222222 ctermbg=110 ctermfg=235 + elseif a:mode == 'r' + hi StatColor guibg=#D78700 guifg=#222222 ctermbg=172 ctermfg=235 + elseif a:mode == 'v' + hi StatColor guibg=#D78700 guifg=#222222 ctermbg=172 ctermfg=235 + else + hi StatColor guibg=#af0000 guifg=#222222 ctermbg=124 ctermfg=235 + endif +endfunction + +au InsertEnter * call Colorize(v:insertmode) +au InsertLeave * hi StatColor guibg=#3a3a3a guifg=#ffffff ctermbg=237 ctermfg=255 + +" ██████ ██████ ██ ██ ██████ █████ █████ ██████ █████ ██████ +" ██░░░░ ██░░░░██░██ ░██░░██░░████░░░██ ██░░░██░░██░░████░░░██░░██░░██ +" ░░█████ ░██ ░██░██ ░██ ░██ ░░░██ ░░ ░███████ ░██ ░░░███████ ░██ ░░ +" ░░░░░██░██ ░██░██ ░██ ░██ ░██ ██░██░░░░ ░██ ░██░░░░ ░██ +" ██████ ░░██████ ░░██████░███ ░░█████ ░░██████░███ ░░██████░███ +" ░░░░░░ ░░░░░░ ░░░░░░ ░░░ ░░░░░ ░░░░░░ ░░░ ░░░░░░ ░░░ +" r e a d c o d e l i k e a w i z a r d +" +" sourcerer colors by xero harrison (http://xero.nu) +" ├─ based on sorcerer by Jeet Sukumaran (http://jeetworks.org) +" └─ based on mustang by Henrique C. Alves (hcarvalhoalves@gmail.com) + +set background=dark +hi clear + +if exists("syntax_on") + syntax reset +endif + +let colors_name = "sourcerer" + + +" █▓▒░ GUI colors +hi Normal guifg=#c2c2b0 guibg=#222222 gui=NONE +hi ColorColumn guifg=NONE guibg=#1c1c1c +hi Cursor guifg=NONE guibg=#626262 gui=NONE +hi CursorColumn guibg=#2d2d2d +hi CursorLine guibg=#2d2d2d +hi DiffAdd guifg=#000000 guibg=#3cb371 gui=NONE +hi DiffDelete guifg=#000000 guibg=#aa4450 gui=NONE +hi DiffChange guifg=#000000 guibg=#4f94cd gui=NONE +hi DiffText guifg=#000000 guibg=#8ee5ee gui=NONE +hi Directory guifg=#1e90ff guibg=NONE gui=NONE +hi ErrorMsg guifg=#ff6a6a guibg=NONE gui=bold +hi FoldColumn guifg=#68838b guibg=#4B4B4B gui=bold +hi Folded guifg=#406060 guibg=#232c2c gui=NONE +hi IncSearch guifg=#ffffff guibg=#ff4500 gui=bold +hi LineNr guifg=#878787 guibg=#3A3A3A gui=NONE +hi MatchParen guifg=#fff000 guibg=NONE gui=bold +hi ModeMsg guifg=#afafaf guibg=#222222 gui=bold +hi MoreMsg guifg=#2e8b57 guibg=NONE gui=bold +hi NonText guifg=#404050 guibg=NONE gui=NONE + +hi Pmenu guifg=#ffffff guibg=#444444 +hi PmenuSel guifg=#000000 guibg=#b1d631 +" hi PmenuSbar guifg=#ffffff guibg=#c1cdc1 gui=NONE +" hi PmenuThumb guifg=#ffffff guibg=#838b83 gui=NONE + +hi Question guifg=#00ee00 guibg=NONE gui=bold +hi Search guifg=#000000 guibg=#d6e770 gui=bold +hi SignColumn guifg=#ffffff guibg=NONE gui=NONE +hi SpecialKey guifg=#505060 guibg=NONE gui=NONE +hi SpellBad guisp=#ee2c2c gui=undercurl +hi SpellCap guisp=#0000ff gui=undercurl +hi SpellLocal guisp=#008b8b gui=undercurl +hi SpellRare guisp=#ff00ff gui=undercurl +hi StatusLine guifg=#000000 guibg=#808070 gui=bold +hi StatusLineNC guifg=#000000 guibg=#404c4c gui=italic +hi VertSplit guifg=#404c4c guibg=#404c4c gui=NONE +hi TabLine guifg=fg guibg=#d3d3d3 gui=underline +hi TabLineFill guifg=fg guibg=NONE gui=reverse +hi TabLineSel guifg=fg guibg=NONE gui=bold +hi Title guifg=#528b8b guibg=NONE gui=bold +hi Visual guifg=#000000 guibg=#6688aa gui=NONE +hi WarningMsg guifg=#ee9a00 guibg=NONE gui=NONE +hi WildMenu guifg=#000000 guibg=#87ceeb gui=NONE +hi ExtraWhitespace guifg=fg guibg=#528b8b gui=NONE + +" syntax highlighting +hi Comment guifg=#686858 gui=italic +hi Boolean guifg=#ff9800 gui=NONE +hi String guifg=#779b70 gui=NONE +hi Identifier guifg=#9ebac2 gui=NONE +hi Function guifg=#faf4c6 gui=NONE +hi Type guifg=#7e8aa2 gui=NONE +hi Statement guifg=#90b0d1 gui=NONE +hi Keyword guifg=#90b0d1 gui=NONE +hi Constant guifg=#ff9800 gui=NONE +hi Number guifg=#cc8800 gui=NONE +hi Special guifg=#719611 gui=NONE +hi PreProc guifg=#528b8b gui=NONE +hi Todo guifg=#8f6f8f guibg=#202020 gui=italic,underline,bold + +" diff +hi diffOldFile guifg=#88afcb guibg=NONE gui=italic +hi diffNewFile guifg=#88afcb guibg=NONE gui=italic +hi diffFile guifg=#88afcb guibg=NONE gui=italic +hi diffLine guifg=#88afcb guibg=NONE gui=italic +hi link diffSubname diffLine +hi diffAdded guifg=#3cb371 guibg=NONE gui=NONE +hi diffRemoved guifg=#aa4450 guibg=NONE gui=NONE +hi diffChanged guifg=#4f94cd guibg=NONE gui=NONE +hi link diffOnly Constant +hi link diffIdentical Constant +hi link diffDiffer Constant +hi link diffBDiffer Constant +hi link diffIsA Constant +hi link diffNoEOL Constant +hi link diffCommon Constant +hi link diffComment Constant + +" python +hi pythonException guifg=#90b0d1 guibg=NONE gui=NONE +hi pythonExClass guifg=#996666 guibg=NONE gui=NONE +hi pythonDecorator guifg=#888555 guibg=NONE gui=NONE +hi link pythonDecoratorFunction pythonDecorator + +" █▓▒░ 256 colors +hi Normal cterm=NONE ctermbg=NONE ctermfg=145 +hi ColorColumn cterm=NONE ctermbg=16 ctermfg=NONE +hi Cursor cterm=NONE ctermbg=241 ctermfg=fg +hi CursorColumn cterm=NONE ctermbg=16 ctermfg=fg +hi CursorLine cterm=NONE ctermbg=236 ctermfg=fg +hi DiffAdd cterm=NONE ctermbg=71 ctermfg=16 +hi DiffDelete cterm=NONE ctermbg=124 ctermfg=16 +hi DiffChange cterm=NONE ctermbg=68 ctermfg=16 +hi DiffText cterm=NONE ctermbg=117 ctermfg=16 +hi Directory cterm=NONE ctermbg=234 ctermfg=33 +hi ErrorMsg cterm=bold ctermbg=NONE ctermfg=203 +hi FoldColumn cterm=bold ctermbg=239 ctermfg=66 +hi Folded cterm=NONE ctermbg=16 ctermfg=60 +hi IncSearch cterm=bold ctermbg=202 ctermfg=231 +hi LineNr cterm=NONE ctermbg=237 ctermfg=102 +hi MatchParen cterm=bold ctermbg=NONE ctermfg=226 +hi ModeMsg cterm=bold ctermbg=NONE ctermfg=145 +hi MoreMsg cterm=bold ctermbg=234 ctermfg=29 +hi NonText cterm=NONE ctermbg=NONE ctermfg=59 +hi Pmenu cterm=NONE ctermbg=238 ctermfg=231 +hi PmenuSbar cterm=NONE ctermbg=250 ctermfg=fg +hi PmenuSel cterm=NONE ctermbg=149 ctermfg=16 +hi Question cterm=bold ctermbg=NONE ctermfg=46 +hi Search cterm=bold ctermbg=185 ctermfg=16 +hi SignColumn cterm=NONE ctermbg=NONE ctermfg=231 +hi SpecialKey cterm=NONE ctermbg=NONE ctermfg=59 +hi SpellBad cterm=undercurl ctermbg=NONE ctermfg=196 +hi SpellCap cterm=undercurl ctermbg=NONE ctermfg=21 +hi SpellLocal cterm=undercurl ctermbg=NONE ctermfg=30 +hi SpellRare cterm=undercurl ctermbg=NONE ctermfg=201 +hi StatusLine cterm=bold ctermbg=101 ctermfg=16 +hi StatusLineNC cterm=NONE ctermbg=102 ctermfg=16 +hi VertSplit cterm=NONE ctermbg=102 ctermfg=102 +hi TabLine cterm=bold ctermbg=102 ctermfg=16 +hi TabLineFill cterm=NONE ctermbg=102 ctermfg=16 +hi TabLineSel cterm=bold ctermbg=16 ctermfg=59 +hi Title cterm=bold ctermbg=NONE ctermfg=66 +hi Visual cterm=NONE ctermbg=67 ctermfg=16 +hi WarningMsg cterm=NONE ctermbg=234 ctermfg=208 +hi WildMenu cterm=NONE ctermbg=116 ctermfg=16 +hi ExtraWhitespace cterm=NONE ctermbg=66 ctermfg=fg + +hi Comment cterm=NONE ctermbg=NONE ctermfg=59 +hi Boolean cterm=NONE ctermbg=NONE ctermfg=208 +hi String cterm=NONE ctermbg=NONE ctermfg=101 +hi Identifier cterm=NONE ctermbg=NONE ctermfg=145 +hi Function cterm=NONE ctermbg=NONE ctermfg=230 +hi Type cterm=NONE ctermbg=NONE ctermfg=103 +hi Statement cterm=NONE ctermbg=NONE ctermfg=110 +hi Keyword cterm=NONE ctermbg=NONE ctermfg=110 +hi Constant cterm=NONE ctermbg=NONE ctermfg=208 +hi Number cterm=NONE ctermbg=NONE ctermfg=172 +hi Special cterm=NONE ctermbg=NONE ctermfg=64 +hi PreProc cterm=NONE ctermbg=NONE ctermfg=66 +hi Todo cterm=bold,underline ctermbg=234 ctermfg=96 + +hi diffOldFile cterm=NONE ctermbg=NONE ctermfg=67 +hi diffNewFile cterm=NONE ctermbg=NONE ctermfg=67 +hi diffFile cterm=NONE ctermbg=NONE ctermfg=67 +hi diffLine cterm=NONE ctermbg=NONE ctermfg=67 +hi diffAdded cterm=NONE ctermfg=NONE ctermfg=71 +hi diffRemoved cterm=NONE ctermfg=NONE ctermfg=124 +hi diffChanged cterm=NONE ctermfg=NONE ctermfg=68 +hi link diffSubname diffLine +hi link diffOnly Constant +hi link diffIdentical Constant +hi link diffDiffer Constant +hi link diffBDiffer Constant +hi link diffIsA Constant +hi link diffNoEOL Constant +hi link diffCommon Constant +hi link diffComment Constant + +hi pythonClass cterm=NONE ctermbg=NONE ctermfg=fg +hi pythonDecorator cterm=NONE ctermbg=NONE ctermfg=101 +hi pythonExClass cterm=NONE ctermbg=NONE ctermfg=95 +hi pythonException cterm=NONE ctermbg=NONE ctermfg=110 +hi pythonFunc cterm=NONE ctermbg=NONE ctermfg=fg +hi pythonFuncParams cterm=NONE ctermbg=NONE ctermfg=fg +hi pythonKeyword cterm=NONE ctermbg=NONE ctermfg=fg +hi pythonParam cterm=NONE ctermbg=NONE ctermfg=fg +hi pythonRawEscape cterm=NONE ctermbg=NONE ctermfg=fg +hi pythonSuperclasses cterm=NONE ctermbg=NONE ctermfg=fg +hi pythonSync cterm=NONE ctermbg=NONE ctermfg=fg + +hi Conceal cterm=NONE ctermbg=248 ctermfg=252 +hi Error cterm=NONE ctermbg=196 ctermfg=231 +hi Ignore cterm=NONE ctermbg=NONE ctermfg=234 +hi InsertModeCursorLine cterm=NONE ctermbg=16 ctermfg=fg +hi NormalModeCursorLine cterm=NONE ctermbg=235 ctermfg=fg +hi PmenuThumb cterm=reverse ctermbg=NONE ctermfg=fg +hi StatusLineAlert cterm=NONE ctermbg=160 ctermfg=231 +hi StatusLineUnalert cterm=NONE ctermbg=238 ctermfg=144 +hi Test cterm=NONE ctermbg=NONE ctermfg=fg +hi Underlined cterm=underline ctermbg=NONE ctermfg=111 +hi VisualNOS cterm=bold,underline ctermbg=NONE ctermfg=fg +hi cCursor cterm=reverse ctermbg=NONE ctermfg=fg +hi iCursor cterm=NONE ctermbg=210 ctermfg=16 +hi lCursor cterm=NONE ctermbg=145 ctermfg=234 +hi nCursor cterm=NONE ctermbg=NONE ctermfg=145 +hi vCursor cterm=NONE ctermbg=201 ctermfg=16 diff --git a/zsh/.zsh/aliases.zsh b/zsh/.zsh/aliases.zsh @@ -0,0 +1,97 @@ +# ██ +# ░██ +# ██████ ██████░██ +# ░░░░██ ██░░░░ ░██████ +# ██ ░░█████ ░██░░░██ +# ██ ░░░░░██░██ ░██ +# ██████ ██████ ░██ ░██ +# ░░░░░░ ░░░░░░ ░░ ░░ +# +# ▓▓▓▓▓▓▓▓▓▓ +# ░▓ author ▓ xero <x@xero.nu> +# ░▓ code ▓ http://code.xero.nu/dotfiles +# ░▓ mirror ▓ http://git.io/.files +# ░▓▓▓▓▓▓▓▓▓▓ +# ░░░░░░░░░░ +# +#█▓▒░ aliases +alias ll="ls -lahF --color=auto" +alias ls="ls -hF --color=auto" +alias lsl="ls -lhF --color=auto" +alias "cd.."="cd ../" +alias up="cd ../" +alias rmrf="rm -rf" +alias psef="ps -ef" +alias mkdir="mkdir -p" +alias cp="cp -r" +alias scp="scp -r" +alias mkdir="mkdir -p" +alias xsel="xsel -b" +alias fuck='sudo $(fc -ln -1)' +alias v="vim" +alias vi="vim" +#alias emacs="vim" +alias git="hub" +alias g="hub" +alias ga="git add" +alias gc="git commit -m" +alias gs="git status" +alias gd="git diff" +alias gf="git fetch" +alias gm="git merge" +alias gr="git rebase" +alias gp="git push" +alias gu="git unstage" +alias gg="git graph" +alias gco="git checkout" +alias gpr="hub pull-request" +alias ag="ag --color --color-line-number '0;35' --color-match '46;30' --color-path '4;36'" +alias tree='tree -CAFa -I "CVS|*.*.package|.svn|.git|.hg|node_modules|bower_components" --dirsfirst' +alias rock="ncmpcpp" +alias mixer="alsamixer" +alias genplaylist="cd ~/music;find . -name '*.mp3' -o -name '*.flac'|sed -e 's%^./%%g' > ~/.mpd/playlists/all.m3u" +alias matrix="cmatrix -b" +alias tempwatch="while :; do sensors; sleep 1 && clear; done;" +alias term="urxvtc -hold -e " #used for run menu +alias sprunge="curl -F 'sprunge=<-' http://sprunge.us" +alias clbin="curl -F 'clbin=<-' https://clbin.com" +alias toiletlist='for i in ${TOILET_FONT_PATH:=/usr/share/figlet}/*.{t,f}lf; do j=${i##*/}; echo ""; echo "╓───── "$j; echo "╙────────────────────────────────────── ─ ─ "; echo ""; toilet -d "${i%/*}" -f "$j" "${j%.*}"; done' +alias ascii="toilet -t -f 3d" +alias future="toilet -t -f future" +alias rusto="toilet -t -f rusto" +alias rustofat="toilet -t -f rustofat" +alias lol="base64 </dev/urandom | lolcat" +alias pacman="sudo pacman" +alias update="pacman-colors && yaourt -Syua" +alias systemctl="sudo systemctl" +alias :q="sudo systemctl poweroff" +alias ZZ="quit" +alias disks='echo "╓───── m o u n t . p o i n t s"; echo "╙────────────────────────────────────── ─ ─ "; lsblk -a; echo ""; echo "╓───── d i s k . u s a g e"; echo "╙────────────────────────────────────── ─ ─ "; df -h;' +alias todo="bash ~/code/sys/todo" +alias record="ffmpeg -f x11grab -s 1366x768 -an -r 16 -loglevel quiet -i :0.0 -b:v 5M -y" #pass a filename +alias nexus="jmtpfs ~/nexus" +tmx() { + [[ $# -eq 0 ]] && bash ~/bin/tmx 0 || bash ~/bin/tmx $# +} +email() { + echo $3 | mutt -s $2 $1 +} +# colorized cat +c() { + for file in "$@" + do + pygmentize -O style=sourcerer -f console256 -g "$file" + done +} +# colorized less +l() { + pygmentize -O style=sourcerer -f console256 -g $1 | less -r +} +# read markdown files like manpages +md() { + pandoc -s -f markdown -t man "$*" | man -l - +} +# nullpointer url shortener +short() { + curl -F"shorten=$*" https://0x0.st +} diff --git a/zsh/.zsh/autocompletion.zsh b/zsh/.zsh/autocompletion.zsh @@ -0,0 +1,35 @@ +# ██ +# ░██ +# ██████ ██████░██ +# ░░░░██ ██░░░░ ░██████ +# ██ ░░█████ ░██░░░██ +# ██ ░░░░░██░██ ░██ +# ██████ ██████ ░██ ░██ +# ░░░░░░ ░░░░░░ ░░ ░░ +# +# ▓▓▓▓▓▓▓▓▓▓ +# ░▓ author ▓ xero <x@xero.nu> +# ░▓ code ▓ http://code.xero.nu/dotfiles +# ░▓ mirror ▓ http://git.io/.files +# ░▓▓▓▓▓▓▓▓▓▓ +# ░░░░░░░░░░ +# +#█▓▒░ autocompletion systems +autoload -Uz compinit +compinit +autoload -U ~/.zsh/completion/*(:t) +zstyle ':completion:*' auto-description 'specify: %d' +zstyle ':completion:*' completer _expand _complete _correct _approximate +zstyle ':completion:*' format 'Completing %d' +zstyle ':completion:*' group-name '' +zstyle ':completion:*' menu select=2 eval "$(dircolors -b)" +zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS} +zstyle ':completion:*' list-colors '' +zstyle ':completion:*' list-prompt %SAt %p: hit TAB for more, or the character to insert%s +zstyle ':completion:*' matcher-list '' 'm:{a-z}={A-Z}' 'm:{a-zA-Z}={A-Za-z}' 'r:|[._-]=* r:|=* l:|=*' +zstyle ':completion:*' menu select=long +zstyle ':completion:*' select-prompt %SScrolling active: current selection at %p%s +zstyle ':completion:*' use-compctl false +zstyle ':completion:*' verbose true +zstyle ':completion:*:*:kill:*:processes' list-colors '=(#b) #([0-9]#)*=0=01;31' +zstyle ':completion:*:kill:*' command 'ps -u $USER -o pid,%cpu,tty,cputime,cmd' diff --git a/zsh/.zsh/colored-man-pages.zsh b/zsh/.zsh/colored-man-pages.zsh @@ -0,0 +1,24 @@ +# ██ +# ░██ +# ██████ ██████░██ +# ░░░░██ ██░░░░ ░██████ +# ██ ░░█████ ░██░░░██ +# ██ ░░░░░██░██ ░██ +# ██████ ██████ ░██ ░██ +# ░░░░░░ ░░░░░░ ░░ ░░ +# +# ▓▓▓▓▓▓▓▓▓▓ +# ░▓ author ▓ xero <x@xero.nu> +# ░▓ code ▓ http://code.xero.nu/dotfiles +# ░▓ mirror ▓ http://git.io/.files +# ░▓▓▓▓▓▓▓▓▓▓ +# ░░░░░░░░░░ +# +#█▓▒░ source: https://github.com/imkira/dotfiles/blob/master/.zsh/colored-man-pages.zsh +export LESS_TERMCAP_mb=$'\E[01;31m' +export LESS_TERMCAP_md=$'\E[01;38;5;74m' +export LESS_TERMCAP_me=$'\E[0m' +export LESS_TERMCAP_se=$'\E[0m' +export LESS_TERMCAP_so=$'\E[38;33;246m' +export LESS_TERMCAP_ue=$'\E[0m' +export LESS_TERMCAP_us=$'\E[04;38;5;146m' diff --git a/zsh/.zsh/completion/_bower b/zsh/.zsh/completion/_bower @@ -0,0 +1,135 @@ +#compdef bower +# ------------------------------------------------------------------------------ +# Description +# ----------- +# +# Completion script for Bower (http://bower.io). +# +# ------------------------------------------------------------------------------ +# Authors +# ------- +# +# * Joe Lencioni (https://github.com/lencioni) +# +# ------------------------------------------------------------------------------ + + +local curcontext="$curcontext" state line _packages _opts ret=1 + +_arguments -C -A "-v" -A "--version" \ + '(- 1 *)'{-v,--version}'[display version information]' \ + '1: :->cmds' \ + '*:: :->args' && ret=0 + +case $state in + cmds) + _values "bower command" \ + "cache[Manage bower cache]" \ + "help[Display help information about Bower]" \ + "home[Opens a package homepage into your favorite browser]" \ + "info[Info of a particular package]" \ + "init[Interactively create a bower.json file]" \ + "install[Install a package locally]" \ + "link[Symlink a package folder]" \ + "list[List local packages]" \ + "lookup[Look up a package URL by name]" \ + "prune[Removes local extraneous packages]" \ + "register[Register a package]" \ + "search[Search for a package by name]" \ + "update[Update a local package]" \ + "uninstall[Remove a local package]" \ + "version[Bump a package version]" + _arguments \ + '(--force)--force[Makes various commands more forceful]' \ + '(--json)--json[Output consumable JSON]' \ + '(--log-level)--log-level[What level of logs to report]' \ + '(--offline)--offline[Do not hit the network]' \ + '(--quiet)--quiet[Only output important information]' \ + '(--silent)--silent[Do not output anything, besides errors]' \ + '(--verbose)--verbose[Makes output more verbose]' \ + '(--allow-root)--allow-root[Allows running commands as root]' + ret=0 + ;; + args) + case $line[1] in + help) + _values 'commands' \ + 'cache' \ + 'home' \ + 'info' \ + 'init' \ + 'install' \ + 'link' \ + 'list' \ + 'lookup' \ + 'prune' \ + 'register' \ + 'search' \ + 'update' \ + 'uninstall' \ + 'version' + ret=0 + ;; + (home|info|init|link|lookup|prune|register|search) + _arguments \ + '(--help)--help[Show help message]' + ret=0 + ;; + install) + _arguments \ + '(--force-latest)--force-latest[Force latest version on conflict]' \ + '(--help)--help[Show help message]' \ + '(--production)--production[Do not install project devDependencies]' \ + '(--save)--save[Save installed packages into the project''s bower.json dependencies]' \ + '(--save-dev)--save-dev[Save installed packages into the project''s bower.json devDependencies]' + ret=0 + ;; + list) + _arguments \ + '(--help)--help[Show help message]' \ + '(--paths)--paths[Generate a simple JSON source mapping]' \ + '(--relative)--relative[Make paths relative to the directory config property, which defaults to bower_components]' + ret=0 + ;; + uninstall) + _arguments \ + '(--help)--help[Show help message]' \ + '(--save)--save[Save installed packages into th projects''s bower.json dependencies]' \ + '(--save-dev)--save-dev[Save installed packages into th projects''s bower.json devDependencies]' + ret=0 + ;; + update) + _arguments \ + '(--force-latest)--force-latest[Force latest version on conflict]' \ + '(--help)--help[Show help message]' \ + '(--production)--production[Do not install project devDependencies]' + ret=0 + ;; + version) + _arguments \ + '(--message)--message[Custom git commit and tag message]' + ret=0 + ;; + exec) + _normal && ret=0 + ;; + *) + _opts=( $(bower help $line[1] | sed -e '/^ \[-/!d; s/^ \[\(-[^=]*\)=.*/\1/') ) + _opts+=( $(bower help $line[1] | sed -e '/^ -/!d; s/^ \(-.\), \[\(-[^=]*\)=.*/\1 \2/') ) + if [[ $_opts != "" ]]; then + _values 'options' $_opts && ret=0 + fi + ;; + esac + ;; +esac + +return ret + +# Local Variables: +# mode: Shell-Script +# sh-indentation: 2 +# indent-tabs-mode: nil +# sh-basic-offset: 2 +# End: +# vim: ft=zsh sw=2 ts=2 et diff --git a/zsh/.zsh/completion/_cmake b/zsh/.zsh/completion/_cmake @@ -0,0 +1,274 @@ +#compdef cmake + +# Description +# ----------- +# +# Completion script for CMake (http://www.cmake.org). +# +# ------------------------------------------------------------------------- +# Authors +# ------- +# +# * Scott M. Kroll <skroll@gmail.com> +# +# ------------------------------------------------------------------------- +# Notes +# ----- +# +# * By default only C and C++ languages are supported for compiler flag +# variables. To define your own list of languages: +# +# cmake_langs=('C' 'C' +# 'CXX' 'C++') +# zstyle ':completion:*:cmake:*' languages $cmake_langs +# +# ------------------------------------------------------------------------- + +_cmake() { + local context state line curcontext="$curcontext" cmake_args + + local cmake_help_actions;cmake_help_actions=( + '(- 1)--help-command[Print help for a single command and exit]:command-name:_cmake_command_names' + '(- 1)--help-command-list[List available listfile commands and exit]' + '(- 1)--help-commands[Print help for all commands and exit]' + '(- 1)--help-compatcommands[Print help for compatibility commands]' + '(- 1)--help-module[Print help for compatibility commands]:module-name:_cmake_module_names' + '(- 1)--help-module-list[Print help for a single module and exit]' + '(- 1)--help-modules[Print help for all modules and exit]' + '(- 1)--help-property[List available properties and exit]:property-name:_cmake_property_names' + '(- 1)--help-property-list[List available properties and exit]' + '(- 1)--help-properties[Print help for all properties and exit]' + '(- 1)--help-variable[Print help for a single variable and exit]:variable-name:_cmake_variable_names' + '(- 1)--help-variable-list[List documented variables and exit]' + '(- 1)--help-variables[Print help for all variables and exit]' + '(- 1)--copyright[Print the CMake copyright and exit]' + '(- 1)'{--help,-help,-usage,-h,-H}'[Print usage information and exit]' + '(- 1)--help-full[Print full help and exit]' + '(- 1)--help-html[Print full help in HTML format]' + '(- 1)--help-man[Print full help as a UNIX man page and exit]' + '(- 1)'{--version,-version}'[Print full help as a UNIX man page and exit]' + ) + + local cmake_build_options;cmake_build_options=( + '-C[Pre-load a script to populate the cache]:script:_files' + '*-D-[Create a cmake cache entry]:property:_cmake_define_property' + '-U[Remove matching entries from CMake cache]:globbing expression' + '-G[Specify a makefile generator]:generator:_cmake_generators' + '-T[Specify toolset name if supported by generator]:toolset name' + '(-Wno-dev -Wdev)-Wno-dev[Suppress developer warnings]' + '(-Wno-dev -Wdev)-Wdev[Enable developer warnings]' + '-i[Run in wizard mode]' + '-L-[List cache variables]::_values "options" "[non-advanced cache variables]" "A[advanced cache variables]" "H[non-advanced cached variables with help]" "AH[advanced cache variables with help]"' + '--trace[Put cmake in trace mode]' + ':cmake project:_files -/' + ) + + local cmake_command_actions;cmake_command_actions=( + '-E[CMake command mode]:*:command' + ) + + _arguments -C -s \ + - help \ + "$cmake_help_actions[@]" \ + - command \ + "$cmake_command_actions[@]" \ + - build_opts \ + "$cmake_build_options[@]" && return 0 +} + +# ------------------- +# _cmake_command_names +# ------------------- +(( $+functions[_cmake_command_names] )) || +_cmake_command_names() { + local command_names; command_names=(${(f)"$($service --help-command-list 2> /dev/null)"}) + _values 'command name' ${command_names[@]:1} && return 0 +} + +# ----------------- +# _cmake_list_names +# ----------------- +(( $+functions[_cmake_list_names] )) || +_cmake_list_names() { + local command; command="$@[1]" + local desc; desc="$@[2]" + local list_names; list_names=(${(f)"$($service $command 2> /dev/null | sed -e 's/\[/\\\[/' -e 's/\]/\\\]/')"}) + + _values ${desc} ${list_names[@]:1} && return 0 +} + +# ------------------ +# _cmake_module_names +# ------------------ +(( $+functions[_cmake_module_names] )) || +_cmake_module_names() { + _cmake_list_names '--help-module-list' 'module name' && return 0 +} + +# -------------------- +# _cmake_property_names +# -------------------- +(( $+functions[_cmake_property_names] )) || +_cmake_property_names() { + _cmake_list_names '--help-property-list' 'property name' && return 0 +} + +# --------------------- +# _cmake_variable_names +# --------------------- +(( $+functions[_cmake_variable_names] )) || +_cmake_variable_names() { + _cmake_list_names '--help-variable-list' 'variable name' && return 0 +} + +# ---------------------- +# _cmake_define_property +# ---------------------- +(( $+functions[_cmake_define_property] )) || +_cmake_define_property() { + if compset -P '*='; then + _wanted property-values expl 'property value' _cmake_define_property_values ${${IPREFIX%=}#-D} && return 0 + else + _wanted property-names expl 'property name' _cmake_define_property_names -qS= && return 0 + fi +} + +# ---------------------------- +# _cmake_define_property_names +# ---------------------------- +(( $+functions[_cmake_define_property_names] )) || +_cmake_define_property_names() { + local alternatives; alternatives=( + 'common-property-names:common property name:_cmake_define_common_property_names -qS=' + ) + local -A cmake_langs + zstyle -a ":completion:${curcontext}:" languages cmake_langs + [[ $#cmake_langs -eq 0 ]] && cmake_langs=('C' 'C' 'CXX' 'C++') + + for cmake_lang in ${(k)cmake_langs}; do + cmake_lang_desc="${cmake_langs[$cmake_lang]}" + alternatives+=("${cmake_lang//:/-}-property-names:${cmake_lang_desc} language property name:_cmake_define_lang_property_names -qS= ${cmake_lang} ${cmake_lang_desc}") + done + + _alternative "${alternatives[@]}" +} + +# --------------------------------- +# _cmake_define_lang_property_names +# --------------------------------- +(( $+functions[_cmake_define_lang_property_names] )) || +_cmake_define_lang_property_names() { + local cmake_lang="$@[-2]" cmake_lang_desc="$@[-1]" + local properties; properties=( + "CMAKE_${cmake_lang}_COMPILER:${cmake_lang_desc} compiler" + "CMAKE_${cmake_lang}_FLAGS:${cmake_lang_desc} compiler flags for all builds" + "CMAKE_${cmake_lang}_FLAGS_DEBUG:${cmake_lang_desc} compiler flags for all Debug build" + "CMAKE_${cmake_lang}_FLAGS_RLEASE:${cmake_lang_desc} compiler flags for all Relase build" + "CMAKE_${cmake_lang}_FLAGS_MINSIZREL:${cmake_lang_desc} compiler flags for all MinSizRel build" + "CMAKE_${cmake_lang}_FLAGS_RELWITHDEBINFO:${cmake_lang_desc} compiler flags for all RelWithDebInfo build" + ) + + _describe -t "${cmake_lang//:/-}-property-names" "${cmake_lang_desc} property name" properties $@[0,-3] && return 0 +} + +# ----------------------------------- +# _cmake_define_common_property_names +# ----------------------------------- +(( $+functions[_cmake_define_common_property_names] )) || +_cmake_define_common_property_names() { + local properties; properties=( + 'CMAKE_BUILD_TYPE:Specifies the build type for make based generators' + 'CMAKE_TOOLCHAIN_FILE:Absolute or relative path to a cmake script which sets up toolchain related variables' + 'CMAKE_COLOR_MAKEFILE:Enables/disables color output when using the Makefile generator' + 'CMAKE_INSTALL_PREFIX:Install directory used by install' + ) + + _describe -t 'common-property-names' 'common property name' properties $@ +} + +# ---------------------------- +# _cmake_define_property_values +# ---------------------------- +(( $+functions[_cmake_define_property_values] )) || +_cmake_define_property_values() { + local ret=1 + setopt localoptions extendedglob + case $@[-1] in + (CMAKE_BUILD_TYPE) _wanted build-types expl 'build type' _cmake_build_types && ret=0;; + (CMAKE_TOOLCHAIN_FILE) _wanted toolchain-files expl 'file' _cmake_toolchain_files && ret=0;; + (CMAKE_COLOR_MAKEFILE) _wanted booleans expl 'boolean' _cmake_booleans && ret=0;; + (CMAKE_INSTALL_PREFIX) _files -/ && ret=0;; + (CMAKE_*_COMPILER) _wanted compilers expl 'compiler' _cmake_compilers && ret=0;; + (CMAKE_*_FLAGS(|_?*)) _message -e compiler-flags 'compiler flags' && ret=0;; + (*) _files && ret=0;; + esac + + return ret +} + +# ------------------ +# _cmake_build_types +# ------------------ +(( $+functions[_cmake_build_types] )) || +_cmake_build_types() { + local build_types; build_types=( + 'Debug' + 'Release' + 'RelWithDebInfo' + 'MinSizeRel' + ) + _values 'build type' ${build_types[@]} +} + +# ----------------- +# _cmake_generators +# ----------------- +(( $+functions[_cmake_generators] )) || +_cmake_generators() { + local generators; generators=( + 'Unix Makefiles' + 'Ninja' + 'CodeBlocks - Ninja' + 'CodeBlocks - Unix Makefiles' + 'Eclipse CDT4 - Ninja' + 'Eclipse CDT4 - Unix Makefiles' + 'KDevelop3' + 'KDevelop3 - Unix Makefiles' + 'Sublime Text 2 - Ninja' + 'Sublime Text 2 - Unix Makefiles' + ) + + _describe -t generators 'generator' generators +} + +# ---------------------- +# _cmake_toolchain_files +# ---------------------- +(( $+functions[_cmake_toolchain_files] )) || +_cmake_toolchain_files() { + _files -g '*\.cmake*' +} + +# --------------- +# _cmake_booleans +# --------------- +(( $+functions[_cmake_booleans] )) || +_cmake_booleans() { + local booleans; booleans=( + 'YES' + 'NO' + ) + _describe -t booleans 'boolean' booleans +} + +# --------------- +# _cmake_compilers +# --------------- +(( $+functions[_cmake_compilers] )) || +_cmake_compilers() { + _command_names -e +} + + +_cmake "$@" + diff --git a/zsh/.zsh/completion/_composer b/zsh/.zsh/completion/_composer @@ -0,0 +1,76 @@ +#compdef composer +# ------------------------------------------------------------------------------ +# Copyright (c) 2011 Github zsh-users - http://github.com/zsh-users +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the zsh-users nor the +# names of its contributors may be used to endorse or promote products +# derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL ZSH-USERS BE LIABLE FOR ANY +# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# ------------------------------------------------------------------------------ +# Description +# ----------- +# +# Completion script for composer (https://getcomposer.org/). +# +# ------------------------------------------------------------------------------ +# Authors +# ------- +# +# * Daniel Gomes (me@danielcsgomes.com) +# * Valerii Hiora (https://github.com/vhbit) +# * loranger (https://github.com/loranger) +# +# ------------------------------------------------------------------------------ + +local curcontext=$curcontext state line +declare -A opt_args + +_composer_get_command_list () { + composer --no-ansi | sed "1,/Available commands/d" | awk '/ [a-z]+/ { print $1 }' +} + +_composer_get_required_list () { + composer show -s --no-ansi | sed '1,/requires/d' | awk 'NF > 0 && !/^requires \(dev\)/{ print $1 }' +} + + +_composer () { + local curcontext="$curcontext" state line + typeset -A opt_args + + _arguments \ + '1: :->command'\ + '*: :->args' + if [ -f composer.json ]; then + case $state in + command) + compadd `_composer_get_command_list` + ;; + *) + compadd `_composer_get_required_list` + ;; + esac + else + compadd create-project init search selfupdate show + fi +} + +compdef _composer composer diff --git a/zsh/.zsh/completion/_docker b/zsh/.zsh/completion/_docker @@ -0,0 +1,514 @@ +#compdef docker +# +# zsh completion for docker (http://docker.com) +# +# version: 0.3.0 +# github: https://github.com/felixr/docker-zsh-completion +# +# contributors: +# - Felix Riedel +# - Vincent Bernat +# +# license: +# +# Copyright (c) 2013, Felix Riedel +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the <organization> nor the +# names of its contributors may be used to endorse or promote products +# derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY +# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# + +__docker_get_containers() { + local kind expl + declare -a running stopped lines args + + kind=$1 + shift + [[ $kind = (stopped|all) ]] && args=($args -a) + + lines=(${(f)"$(_call_program commands docker ps ${args})"}) + + # Parse header line to find columns + local i=1 j=1 k header=${lines[1]} + declare -A begin end + while (( $j < ${#header} - 1 )) { + i=$(( $j + ${${header[$j,-1]}[(i)[^ ]]} - 1)) + j=$(( $i + ${${header[$i,-1]}[(i) ]} - 1)) + k=$(( $j + ${${header[$j,-1]}[(i)[^ ]]} - 2)) + begin[${header[$i,$(($j-1))]}]=$i + end[${header[$i,$(($j-1))]}]=$k + } + lines=(${lines[2,-1]}) + + # Container ID + local line + local s + for line in $lines; do + s="${line[${begin[CONTAINER ID]},${end[CONTAINER ID]}]%% ##}" + s="$s:${(l:15:: :::)${${line[${begin[CREATED]},${end[CREATED]}]/ ago/}%% ##}}" + s="$s, ${${${line[$begin[IMAGE],$end[IMAGE]]}/:/\\:}%% ##}" + if [[ ${line[${begin[STATUS]},${end[STATUS]}]} = Exit* ]]; then + stopped=($stopped $s) + else + running=($running $s) + fi + done + + # Names + local name + local -a names + for line in $lines; do + names=(${(ps:,:)${${line[${begin[NAMES]},-1]}%% *}}) + for name in $names; do + s="${name}:${(l:15:: :::)${${line[${begin[CREATED]},${end[CREATED]}]/ ago/}%% ##}}" + s="$s, ${${${line[$begin[IMAGE],$end[IMAGE]]}/:/\\:}%% ##}" + if [[ ${line[${begin[STATUS]},${end[STATUS]}]} = Exit* ]]; then + stopped=($stopped $s) + else + running=($running $s) + fi + done + done + + [[ $kind = (running|all) ]] && _describe -t containers-running "running containers" running + [[ $kind = (stopped|all) ]] && _describe -t containers-stopped "stopped containers" stopped +} + +__docker_stoppedcontainers() { + __docker_get_containers stopped "$@" +} + +__docker_runningcontainers() { + __docker_get_containers running "$@" +} + +__docker_containers () { + __docker_get_containers all "$@" +} + +__docker_images () { + local expl + declare -a images + images=(${${${${(f)"$(_call_program commands docker images)"}[2,-1]}/ ##/\\:}%% *}) + images=(${${images%\\:<none>}#<none>} ${${${(f)"$(_call_program commands docker images)"}[2,-1]}/(#b)([^ ]##) ##([^ ]##) ##([^ ]##)*/${match[3]}:${(r:15:: :::)match[2]} in ${match[1]}}) + _describe -t docker-images "images" images +} + +__docker_tags() { + local expl + declare -a tags + tags=(${${${${${(f)"$(_call_program commands docker images)"}#* }## #}%% *}[2,-1]}) + _describe -t docker-tags "tags" tags +} + +__docker_repositories_with_tags() { + if compset -P '*:'; then + __docker_tags + else + __docker_repositories -qS ":" + fi +} + +__docker_search() { + # declare -a dockersearch + local cache_policy + zstyle -s ":completion:${curcontext}:" cache-policy cache_policy + if [[ -z "$cache_policy" ]]; then + zstyle ":completion:${curcontext}:" cache-policy __docker_caching_policy + fi + + local searchterm cachename + searchterm="${words[$CURRENT]%/}" + cachename=_docker-search-$searchterm + + local expl + local -a result + if ( [[ ${(P)+cachename} -eq 0 ]] || _cache_invalid ${cachename#_} ) \ + && ! _retrieve_cache ${cachename#_}; then + _message "Searching for ${searchterm}..." + result=(${${${(f)"$(_call_program commands docker search ${searchterm})"}%% *}[2,-1]}) + _store_cache ${cachename#_} result + fi + _wanted dockersearch expl 'available images' compadd -a result +} + +__docker_caching_policy() +{ + oldp=( "$1"(Nmh+1) ) # 1 hour + (( $#oldp )) +} + + +__docker_repositories () { + local expl + declare -a repos + repos=(${${${(f)"$(_call_program commands docker images)"}%% *}[2,-1]}) + _describe -t docker-repos "repositories" repos "$@" +} + +__docker_commands () { + # local -a _docker_subcommands + local cache_policy + + zstyle -s ":completion:${curcontext}:" cache-policy cache_policy + if [[ -z "$cache_policy" ]]; then + zstyle ":completion:${curcontext}:" cache-policy __docker_caching_policy + fi + + if ( [[ ${+_docker_subcommands} -eq 0 ]] || _cache_invalid docker_subcommands) \ + && ! _retrieve_cache docker_subcommands; + then + local -a lines + lines=(${(f)"$(_call_program commands docker 2>&1)"}) + _docker_subcommands=(${${${lines[$((${lines[(i)Commands:]} + 1)),${lines[(I) *]}]}## #}/ ##/:}) + _docker_subcommands=($_docker_subcommands 'help:Show help for a command') + _store_cache docker_subcommands _docker_subcommands + fi + _describe -t docker-commands "docker command" _docker_subcommands +} + +__docker_subcommand () { + local -a _command_args + case "$words[1]" in + (attach) + _arguments \ + '--no-stdin[Do not attach stdin]' \ + '--sig-proxy[Proxy all received signals to the process (non-TTY mode only)]' \ + ':containers:__docker_runningcontainers' + ;; + (build) + _arguments \ + {-f,--file=-}'[Dockerfile to use]:Dockerfile:_files' \ + '--force-rm[Always remove intermediate containers]' \ + '--no-cache[Do not use cache when building the image]' \ + '--pull[Attempt to pull a newer version of the image]' \ + {-q,--quiet}'[Suppress verbose build output]' \ + '--rm[Remove intermediate containers after a successful build]' \ + {-t,--tag=-}'[Repository, name and tag to be applied]:repository:__docker_repositories_with_tags' \ + ':path or URL:_directories' + ;; + (commit) + _arguments \ + {-a,--author=-}'[Author]:author: ' \ + {-m,--message=-}'[Commit message]:message: ' \ + {-p,--pause}'[Pause container during commit]' \ + ':container:__docker_containers' \ + ':repository:__docker_repositories_with_tags' + ;; + (cp) + _arguments \ + ':container:->container' \ + ':hostpath:_files' + case $state in + (container) + if compset -P '*:'; then + _files + else + __docker_containers -qS ":" + fi + ;; + esac + ;; + (diff|export) + _arguments '*:containers:__docker_containers' + ;; + (events) + _arguments \ + '*'{-f,--filter=-}'[Filter values]:filter: ' \ + '--since=-[Events created since this timestamp]:timestamp: ' \ + '--until=-[Events created until this timestamp]:timestamp: ' + ;; + (exec) + local state ret + _arguments \ + {-d,--detach}'[Detached mode: leave the container running in the background]' \ + {-i,--interactive}'[Keep stdin open even if not attached]' \ + {-t,--tty}'[Allocate a pseudo-tty]' \ + ':containers:__docker_runningcontainers' \ + '*::command:->anycommand' && ret=0 + + case $state in + (anycommand) + shift 1 words + (( CURRENT-- )) + _normal + ;; + esac + + return ret + ;; + (history) + _arguments \ + '--no-trunc[Do not truncate output]' \ + {-q,--quiet}'[Only show numeric IDs]' \ + '*:images:__docker_images' + ;; + (images) + _arguments \ + {-a,--all}'[Show all images]' \ + '*'{-f,--filter=-}'[Filter values]:filter: ' \ + '--no-trunc[Do not truncate output]' \ + {-q,--quiet}'[Only show numeric IDs]' \ + ':repository:__docker_repositories' + ;; + (inspect) + _arguments \ + {-f,--format=-}'[Format the output using the given go template]:template: ' \ + '*:containers:__docker_containers' + ;; + (import) + _arguments \ + ':URL:(- http:// file://)' \ + ':repository:__docker_repositories_with_tags' + ;; + (info) + ;; + (import) + _arguments \ + ':URL:(- http:// file://)' \ + ':repository:__docker_repositories_with_tags' + ;; + (insert) + _arguments '1:containers:__docker_containers' \ + '2:URL:(http:// file://)' \ + '3:file:_files' + ;; + (kill) + _arguments \ + {-s,--signal=-}'[Signal to send]:signal:_signals' \ + '*:containers:__docker_runningcontainers' + ;; + (load) + _arguments \ + {-i,--input=-}'[Read from tar archive file]:archive file:_files -g "*.((tar|TAR)(.gz|.GZ|.Z|.bz2|.lzma|.xz|)|(tbz|tgz|txz))(-.)"' + ;; + (login) + _arguments \ + {-e,--email=-}'[Email]:email: ' \ + {-p,--password=-}'[Password]:password: ' \ + {-u,--user=-}'[Username]:username: ' \ + ':server: ' + ;; + (logout) + _arguments \ + ':server: ' + ;; + (logs) + _arguments \ + {-f,--follow}'[Follow log output]' \ + {-t,--timestamps}'[Show timestamps]' \ + '--tail=-[Output the last K lines]:lines:(1 10 20 50 all)' \ + '*:containers:__docker_containers' + ;; + (port) + _arguments \ + '1:containers:__docker_runningcontainers' \ + '2:port:_ports' + ;; + (pause|unpause) + _arguments \ + '1:containers:__docker_runningcontainers' + ;; + (start) + _arguments \ + {-a,--attach}'[Attach container'"'"'s stdout/stderr and forward all signals]' \ + {-i,--interactive}'[Attach container'"'"'s stding]' \ + '*:containers:__docker_stoppedcontainers' + ;; + (stats) + _arguments \ + '*:containers:__docker_runningcontainers' + ;; + (rm) + _arguments \ + {-f,--force}'[Force removal]' \ + {-l,--link}'[Remove the specified link and not the underlying container]' \ + {-v,--volumes}'[Remove the volumes associated to the container]' \ + '*:containers:__docker_stoppedcontainers' + ;; + (rmi) + _arguments \ + {-f,--force}'[Force removal]' \ + '--no-prune[Do not delete untagged parents]' \ + '*:images:__docker_images' + ;; + (restart|stop) + _arguments \ + {-t,--time=-}'[Number of seconds to try to stop for before killing the container]:seconds to before killing:(1 5 10 30 60)' \ + '*:containers:__docker_runningcontainers' + ;; + (top) + _arguments \ + '1:containers:__docker_runningcontainers' \ + '(-)*:: :->ps-arguments' + case $state in + (ps-arguments) + _ps + ;; + esac + + ;; + (ps) + _arguments \ + {-a,--all}'[Show all containers]' \ + '--before=-[Show only container created before...]:containers:__docker_containers' \ + '*'{-f,--filter=-}'[Filter values]:filter: ' \ + {-l,--latest}'[Show only the latest created container]' \ + '-n[Show n last created containers, include non-running one]:n:(1 5 10 25 50)' \ + '--no-trunc[Do not truncate output]' \ + {-q,--quiet}'[Only show numeric IDs]' \ + {-s,--size}'[Display total file sizes]' \ + '--since=-[Show only containers created since...]:containers:__docker_containers' + ;; + (tag) + _arguments \ + {-f,--force}'[force]'\ + ':image:__docker_images'\ + ':repository:__docker_repositories_with_tags' + ;; + (create|run) + _arguments \ + {-a,--attach}'[Attach to stdin, stdout or stderr]' \ + '*--add-host=-[Add a custom host-to-IP mapping]:host\:ip mapping: ' \ + {-c,--cpu-shares=-}'[CPU shares (relative weight)]:CPU shares:(0 10 100 200 500 800 1000)' \ + '*--cap-add=-[Add Linux capabilities]:capability: ' \ + '*--cap-drop=-[Drop Linux capabilities]:capability: ' \ + '--cidfile=-[Write the container ID to the file]:CID file:_files' \ + '--cpuset=-[CPUs in which to allow execution]:CPU set: ' \ + {-d,--detach}'[Detached mode: leave the container running in the background]' \ + '*--device=-[Add a host device to the container]:device:_files' \ + '*--dns=-[Set custom dns servers]:dns server: ' \ + '*--dns-search=-[Set custom DNS search domains]:dns domains: ' \ + '*'{-e,--environment=-}'[Set environment variables]:environment variable: ' \ + '--entrypoint=-[Overwrite the default entrypoint of the image]:entry point: ' \ + '*--env-file=-[Read environment variables from a file]:environment file:_files' \ + '*--expose=-[Expose a port from the container without publishing it]: ' \ + {-h,--hostname=-}'[Container host name]:hostname:_hosts' \ + {-i,--interactive}'[Keep stdin open even if not attached]' \ + '*--link=-[Add link to another container]:link:->link' \ + '*--lxc-conf=-[Add custom lxc options]:lxc options: ' \ + '-m[Memory limit (in bytes)]:limit: ' \ + '--name=-[Container name]:name: ' \ + '--net=-[Network mode]:network mode:(bridge none container host)' \ + {-P,--publish-all}'[Publish all exposed ports]' \ + '*'{-p,--publish=-}'[Expose a container'"'"'s port to the host]:port:_ports' \ + '--privileged[Give extended privileges to this container]' \ + '--restart=-[Restart policy]:restart policy:(no on-failure always)' \ + '--rm[Remove intermediate containers when it exits]' \ + '*--security-opt=-[Security options]:security option: ' \ + '--sig-proxy[Proxy all received signals to the process (non-TTY mode only)]' \ + {-t,--tty}'[Allocate a pseudo-tty]' \ + {-u,--user=-}'[Username or UID]:user:_users' \ + '*-v[Bind mount a volume]:volume: '\ + '*--volumes-from=-[Mount volumes from the specified container]:volume: ' \ + {-w,--workdir=-}'[Working directory inside the container]:directory:_directories' \ + '(-):images:__docker_images' \ + '(-):command: _command_names -e' \ + '*::arguments: _normal' + + case $state in + (link) + if compset -P '*:'; then + _wanted alias expl 'Alias' compadd -E "" + else + __docker_runningcontainers -qS ":" + fi + ;; + esac + + ;; + (pull) + _arguments \ + {-a,--all-tags}'[Download all tagged images]' \ + ':name:__docker_search' + ;; + (push) + _arguments ':images:__docker_images' + ;; + (rename) + _arguments \ + ':old name:__docker_containers' \ + ':new name: ' + ;; + (save) + _arguments \ + {-o,--output=-}'[Write to file]:file:_files' \ + '*:images:__docker_images' + ;; + (search) + _arguments \ + '--automated[Only show automated builds]' \ + '--no-trunc[Do not truncate output]' \ + {-s,--stars=-}'[Only display with at least X stars]:stars:(0 10 100 1000)' \ + ':term: ' + ;; + (wait) + _arguments '*:containers:__docker_runningcontainers' + ;; + (help) + _arguments ':subcommand:__docker_commands' + ;; + (*) + _message 'Unknown sub command' + esac + +} + +_docker () { + # Support for subservices, which allows for `compdef _docker docker-shell=_docker_containers`. + # Based on /usr/share/zsh/functions/Completion/Unix/_git without support for `ret`. + if [[ $service != docker ]]; then + _call_function - _$service + return + fi + + local curcontext="$curcontext" state line + typeset -A opt_args + + _arguments -C \ + '-H[tcp://host:port to bind/connect to]:socket: ' \ + '(-): :->command' \ + '(-)*:: :->option-or-argument' + + if (( CURRENT == 1 )); then + + fi + case $state in + (command) + __docker_commands + ;; + (option-or-argument) + curcontext=${curcontext%:*:*}:docker-$words[1]: + __docker_subcommand + ;; + esac +} + +_docker "$@" + +# Local Variables: +# mode: Shell-Script +# sh-indentation: 4 +# indent-tabs-mode: nil +# sh-basic-offset: 4 +# End: +# vim: ft=zsh sw=4 ts=4 et diff --git a/zsh/.zsh/completion/_hub b/zsh/.zsh/completion/_hub @@ -0,0 +1,160 @@ +#compdef hub + +# Zsh will source this file when attempting to autoload the "_hub" function, +# typically on the first attempt to complete the hub command. We define two new +# setup helper routines (one for the zsh-distributed version, one for the +# git-distributed, bash-based version). Then we redefine the "_hub" function to +# call "_git" after some other interception. +# +# This is pretty fragile, if you think about it. Any number of implementation +# changes in the "_git" scripts could cause problems down the road. It would be +# better if the stock git completions were just a bit more permissive about how +# it allowed third-party commands to be added. + +(( $+functions[__hub_setup_zsh_fns] )) || +__hub_setup_zsh_fns () { + (( $+functions[_git-alias] )) || + _git-alias () { + _arguments \ + '-s[output shell script suitable for eval]' \ + '1::shell:(zsh bash csh)' + } + + (( $+functions[_git-browse] )) || + _git-browse () { + _arguments \ + '-u[output the URL]' \ + '2::subpage:(wiki commits issues)' + } + + (( $+functions[_git-compare] )) || + _git-compare () { + _arguments \ + '-u[output the URL]' \ + ':[start...]end range:' + } + + (( $+functions[_git-create] )) || + _git-create () { + _arguments \ + '::name (REPOSITORY or ORGANIZATION/REPOSITORY):' \ + '-p[make repository private]' \ + '-d[description]:description' \ + '-h[home page]:repository home page URL:_urls' + } + + (( $+functions[_git-fork] )) || + _git-fork () { + _arguments \ + '--no-remote[do not add a remote for the new fork]' + } + + (( $+functions[_git-pull-request] )) || + _git-pull-request () { + _arguments \ + '-f[force (skip check for local commits)]' \ + '-b[base]:base ("branch", "owner\:branch", "owner/repo\:branch"):' \ + '-h[head]:head ("branch", "owner\:branch", "owner/repo\:branch"):' \ + - set1 \ + '-m[message]' \ + '-F[file]' \ + - set2 \ + '-i[issue]:issue number:' \ + - set3 \ + '::issue-url:_urls' + } + + # stash the "real" command for later + functions[_hub_orig_git_commands]=$functions[_git_commands] + + # Replace it with our own wrapper. + declare -f _git_commands >& /dev/null && unfunction _git_commands + _git_commands () { + local ret=1 + # call the original routine + _call_function ret _hub_orig_git_commands + + # Effectively "append" our hub commands to the behavior of the original + # _git_commands function. Using this wrapper function approach ensures + # that we only offer the user the hub subcommands when the user is + # actually trying to complete subcommands. + hub_commands=( + alias:'show shell instructions for wrapping git' + pull-request:'open a pull request on GitHub' + fork:'fork origin repo on GitHub' + create:'create new repo on GitHub for the current project' + browse:'browse the project on GitHub' + compare:'open GitHub compare view' + ci-status:'lookup commit in GitHub Status API' + ) + _describe -t hub-commands 'hub command' hub_commands && ret=0 + + return ret + } +} + +(( $+functions[__hub_setup_bash_fns] )) || +__hub_setup_bash_fns () { + # TODO more bash-style fns needed here to complete subcommand args. They take + # the form "_git_CMD" where "CMD" is something like "pull-request". + + # Duplicate and rename the 'list_all_commands' function + eval "$(declare -f __git_list_all_commands | \ + sed 's/__git_list_all_commands/__git_list_all_commands_without_hub/')" + + # Wrap the 'list_all_commands' function with extra hub commands + __git_list_all_commands() { + cat <<-EOF +alias +pull-request +fork +create +browse +compare +ci-status +EOF + __git_list_all_commands_without_hub + } + + # Ensure cached commands are cleared + __git_all_commands="" +} + +# redefine _hub to a much smaller function in the steady state +_hub () { + # only attempt to intercept the normal "_git" helper functions once + (( $+__hub_func_replacement_done )) || + () { + # At this stage in the shell's execution the "_git" function has not yet + # been autoloaded, so the "_git_commands" or "__git_list_all_commands" + # functions will not be defined. Call it now (with a bogus no-op service + # to prevent premature completion) so that we can wrap them. + if declare -f _git >& /dev/null ; then + _hub_noop () { __hub_zsh_provided=1 } # zsh-provided will call this one + __hub_noop_main () { __hub_git_provided=1 } # git-provided will call this one + local service=hub_noop + _git + unfunction _hub_noop + unfunction __hub_noop_main + service=git + fi + + if (( $__hub_zsh_provided )) ; then + __hub_setup_zsh_fns + elif (( $__hub_git_provided )) ; then + __hub_setup_bash_fns + fi + + __hub_func_replacement_done=1 + } + + # Now perform the actual completion, allowing the "_git" function to call our + # replacement "_git_commands" function as needed. Both versions expect + # service=git or they will call nonexistent routines or end up in an infinite + # loop. + service=git + declare -f _git >& /dev/null && _git +} + +# make sure we actually attempt to complete on the first "tab" from the user +_hub diff --git a/zsh/.zsh/completion/_node b/zsh/.zsh/completion/_node @@ -0,0 +1,66 @@ +#compdef node +# ------------------------------------------------------------------------------ +# Copyright (c) 2011 Github zsh-users - http://github.com/zsh-users +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the zsh-users nor the +# names of its contributors may be used to endorse or promote products +# derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL ZSH-USERS BE LIABLE FOR ANY +# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# ------------------------------------------------------------------------------ +# Description +# ----------- +# +# Completion script for Node.js v0.8.4 (http://nodejs.org) +# +# ------------------------------------------------------------------------------ +# Authors +# ------- +# +# * Mario Fernandez (https://github.com/sirech) +# * Nicholas Penree (https://github.com/drudge) +# +# ------------------------------------------------------------------------------ + +local curcontext="$curcontext" state line ret=1 +typeset -A opt_args + +_arguments -C \ + '(- 1 *)--help[print options help]' \ + '(- 1 *)'{-v,--version}'[print node version]' \ + '(--no-deprecation)--no-deprecation[silence deprecation warnings]' \ + '(--trace-deprecation)--trace-deprecation[show stack traces on deprecations]' \ + '(- 1 *)--v8-options[print v8 command line options]' \ + '(--max-stack-size)--max-stack-size=[set max v8 stack size (bytes)]' \ + '(-e --eval)'{-e,--eval}'[evaluate script]:Inline Script' \ + '(-i --interactive)'{-i,--interactive}'[always enter the REPL even if stdin does not appear to be a terminal]' \ + '(-p --print)'{-p,--print}'[print result of --eval]' \ + '(--vars)--vars[print various compiled-in variables]' \ + '*:JS Script:_files -g "*.js"' && ret=0 + +return ret + +# Local Variables: +# mode: Shell-Script +# sh-indentation: 2 +# indent-tabs-mode: nil +# sh-basic-offset: 2 +# End: +# vim: ft=zsh sw=2 ts=2 et diff --git a/zsh/.zsh/completion/_nvm b/zsh/.zsh/completion/_nvm @@ -0,0 +1,85 @@ +#compdef nvm +# ------------------------------------------------------------------------------ +# Description +# ----------- +# +# Completion script for nvm (https://github.com/creationix/nvm). +# +# ------------------------------------------------------------------------------ +# Authors +# ------- +# +# * Changwoo Park (https://github.com/pismute) +# +# ------------------------------------------------------------------------------ + +local curcontext="$curcontext" state line ret=1 + +local -a _1st_arguments +_1st_arguments=( + 'help:Show this message' + 'install:Download and install a <version>' + 'uninstall:Uninstall a <version>' + 'use:Modify PATH to use <version>' + 'run:Run <version> with <args> as arguments' + 'ls:List installed [versions]' + 'ls-remote:List remote versions available for install' + 'deactivate:Undo effects of NVM on current shell' + 'alias:Set an alias named <name> pointing to <version>. Show all aliases beginning with [<pattern>].' + 'unalias:Deletes the alias named <name>' + 'copy-packages:Install global NPM packages contained in <version> to current version' + 'clear-cache:Clear cache' + 'version:Show current node version' +) + +_arguments -C \ + '1: :->cmds' \ + '*: :->args' && ret=0 + +__nvm_aliases(){ + local aliases + aliases="" + if [ -d $NVM_DIR/alias ]; then + aliases="`cd $NVM_DIR/alias && ls`" + fi + echo "${aliases}" +} + +__nvm_versions(){ + echo "$(nvm_ls) $(__nvm_aliases)" +} + +case $state in + cmds) + _describe -t commands 'nvm command' _1st_arguments && ret=0 + ;; + + args) + case $words[2] in + (use|run|ls|list|install|uninstall|copy-packages) + + _values 'version' $(__nvm_versions) && ret=0 + ;; + + (alias|unalias) + + _values 'aliases' $(__nvm_aliases) && ret=0 + ;; + + *) + (( ret )) && _message 'no more arguments' + ;; + + esac + ;; +esac + +return ret + +# Local Variables: +# mode: Shell-Script +# sh-indentation: 2 +# indent-tabs-mode: nil +# sh-basic-offset: 2 +# End: +# vim: ft=zsh sw=2 ts=2 et diff --git a/zsh/.zsh/custom-prompt.zsh b/zsh/.zsh/custom-prompt.zsh @@ -0,0 +1,40 @@ +# ██ +# ░██ +# ██████ ██████░██ +# ░░░░██ ██░░░░ ░██████ +# ██ ░░█████ ░██░░░██ +# ██ ░░░░░██░██ ░██ +# ██████ ██████ ░██ ░██ +# ░░░░░░ ░░░░░░ ░░ ░░ +# +# ▓▓▓▓▓▓▓▓▓▓ +# ░▓ author ▓ xero <x@xero.nu> +# ░▓ code ▓ http://code.xero.nu/dotfiles +# ░▓ mirror ▓ http://git.io/.files +# ░▓▓▓▓▓▓▓▓▓▓ +# ░░░░░░░░░░ +# +#█▓▒░ colors for permissions +if [[ "$EUID" -ne "0" ]] +then # if user is not root + USER_LEVEL="%F{cyan}" +else # root! + USER_LEVEL="%F{red}" +fi + +#█▓▒░ allow functions in the prompt +setopt PROMPT_SUBST + +#█▓▒░ autoload zsh functions +fpath=(~/.zsh/functions $fpath) +autoload -U ~/.zsh/functions/*(:t) + +#█▓▒░ enable auto-execution of functions +typeset -ga preexec_functions +typeset -ga precmd_functions +typeset -ga chpwd_functions + +#█▓▒░ prepend git functions needed for prompt +preexec_functions+='preexec_update_git_vars' +precmd_functions+='precmd_update_git_vars' +chpwd_functions+=('chpwd_update_git_vars', 'chpwd_auto_cd') diff --git a/zsh/.zsh/dual-line-prompt._zsh b/zsh/.zsh/dual-line-prompt._zsh @@ -0,0 +1,19 @@ +# ██ +# ░██ +# ██████ ██████░██ +# ░░░░██ ██░░░░ ░██████ +# ██ ░░█████ ░██░░░██ +# ██ ░░░░░██░██ ░██ +# ██████ ██████ ░██ ░██ +# ░░░░░░ ░░░░░░ ░░ ░░ +# +# ▓▓▓▓▓▓▓▓▓▓ +# ░▓ author ▓ xero <x@xero.nu> +# ░▓ code ▓ http://code.xero.nu/dotfiles +# ░▓ mirror ▓ http://git.io/.files +# ░▓▓▓▓▓▓▓▓▓▓ +# ░░░░░░░░░░ +# +#█▓▒░dual line prompt +PROMPT='${USER_LEVEL}┌[%F{white}%n@%M${USER_LEVEL}]─[%F{white}%~${USER_LEVEL}]$(prompt_git_info) +${USER_LEVEL}└─ 0 %F{white}' diff --git a/zsh/.zsh/environment.zsh b/zsh/.zsh/environment.zsh @@ -0,0 +1,38 @@ +# ██ +# ░██ +# ██████ ██████░██ +# ░░░░██ ██░░░░ ░██████ +# ██ ░░█████ ░██░░░██ +# ██ ░░░░░██░██ ░██ +# ██████ ██████ ░██ ░██ +# ░░░░░░ ░░░░░░ ░░ ░░ +# +# ▓▓▓▓▓▓▓▓▓▓ +# ░▓ author ▓ xero <x@xero.nu> +# ░▓ code ▓ http://code.xero.nu/dotfiles +# ░▓ mirror ▓ http://git.io/.files +# ░▓▓▓▓▓▓▓▓▓▓ +# ░░░░░░░░░░ +# +#█▓▒░ timestamps +#HIST_STAMPS=mm/dd/yyyy + +#█▓▒░ paths +export PATH=$HOME/bin:/usr/local/bin:/home/xero/.gem/ruby/2.2.0/bin:$PATH +#export MANPATH=/usr/local/man:$MANPATH + +#█▓▒░ preferred editor for local and remote sessions +export EDITOR=vim +export VISUAL=vim + +#█▓▒░ language +export LC_COLLATE=en_US.UTF-8 +export LC_CTYPE=en_US.UTF-8 +export LC_MESSAGES=en_US.UTF-8 +export LC_MONETARY=en_US.UTF-8 +export LC_NUMERIC=en_US.UTF-8 +export LC_TIME=en_US.UTF-8 +export LC_ALL=en_US.UTF-8 +export LANG=en_US.UTF-8 +export LANGUAGE=en_US.UTF-8 +export LESSCHARSET=utf-8 diff --git a/zsh/.zsh/functions/chpwd_auto_cd b/zsh/.zsh/functions/chpwd_auto_cd @@ -0,0 +1,2 @@ +emulate -L zsh +ls -lA --color=auto diff --git a/zsh/.zsh/functions/chpwd_update_git_vars b/zsh/.zsh/functions/chpwd_update_git_vars @@ -0,0 +1 @@ +update_current_git_vars +\ No newline at end of file diff --git a/zsh/.zsh/functions/precmd_update_git_vars b/zsh/.zsh/functions/precmd_update_git_vars @@ -0,0 +1,4 @@ +if [ -n "$__EXECUTED_GIT_COMMAND" ]; then + update_current_git_vars + unset __EXECUTED_GIT_COMMAND +fi +\ No newline at end of file diff --git a/zsh/.zsh/functions/preexec_update_git_vars b/zsh/.zsh/functions/preexec_update_git_vars @@ -0,0 +1,5 @@ +case "$1" in + git*) + __EXECUTED_GIT_COMMAND=1 + ;; +esac +\ No newline at end of file diff --git a/zsh/.zsh/functions/prompt_git_info b/zsh/.zsh/functions/prompt_git_info @@ -0,0 +1,23 @@ +if [ -d .git ]; then + if [ -n $__CURRENT_GIT_BRANCH ]; then + local s="%F{white}-[" + s+="$__CURRENT_GIT_BRANCH" + case "$__CURRENT_GIT_BRANCH_STATUS" in + ahead) + s+="↑" + ;; + diverged) + s+="↕" + ;; + behind) + s+="↓" + ;; + esac + if [ -n "$__CURRENT_GIT_BRANCH_IS_DIRTY" ]; then + s+="⚡" + fi + s+="%F{white}]" + + printf "%s%s" $s + fi +fi diff --git a/zsh/.zsh/functions/update_current_git_vars b/zsh/.zsh/functions/update_current_git_vars @@ -0,0 +1,31 @@ +unset __CURRENT_GIT_BRANCH +unset __CURRENT_GIT_BRANCH_STATUS +unset __CURRENT_GIT_BRANCH_IS_DIRTY + +local st="$(git status 2>/dev/null)" +local st2="$(git log -1 --pretty=%h 2>/dev/null)" + +if [[ -n "$st" ]]; then + local -a arr + arr=(${(f)st}) + + if [[ $arr[1] =~ 'Not currently on any branch.' ]]; then + __CURRENT_GIT_BRANCH="$st2" + else + __CURRENT_GIT_BRANCH="${arr[1][(w)4]}"; + fi + + if [[ $arr[2] =~ 'Your branch is' ]]; then + if [[ $arr[2] =~ 'ahead' ]]; then + __CURRENT_GIT_BRANCH_STATUS='ahead' + elif [[ $arr[2] =~ 'diverged' ]]; then + __CURRENT_GIT_BRANCH_STATUS='diverged' + else + __CURRENT_GIT_BRANCH_STATUS='behind' + fi + fi + + if [[ ! $st =~ 'nothing to commit' ]]; then + __CURRENT_GIT_BRANCH_IS_DIRTY='1' + fi +fi +\ No newline at end of file diff --git a/zsh/.zsh/history.zsh b/zsh/.zsh/history.zsh @@ -0,0 +1,24 @@ +# ██ +# ░██ +# ██████ ██████░██ +# ░░░░██ ██░░░░ ░██████ +# ██ ░░█████ ░██░░░██ +# ██ ░░░░░██░██ ░██ +# ██████ ██████ ░██ ░██ +# ░░░░░░ ░░░░░░ ░░ ░░ +# +# ▓▓▓▓▓▓▓▓▓▓ +# ░▓ author ▓ xero <x@xero.nu> +# ░▓ code ▓ http://code.xero.nu/dotfiles +# ░▓ mirror ▓ http://git.io/.files +# ░▓▓▓▓▓▓▓▓▓▓ +# ░░░░░░░░░░ +# +#█▓▒░ history +HISTFILE=~/.zhistory +setopt APPEND_HISTORY +HISTSIZE=1200 +SAVEHIST=1000 +setopt HIST_EXPIRE_DUPS_FIRST +setopt EXTENDED_HISTORY +# setopt SHARE_HISTORY diff --git a/zsh/.zsh/keybindings.zsh b/zsh/.zsh/keybindings.zsh @@ -0,0 +1,51 @@ +# ██ +# ░██ +# ██████ ██████░██ +# ░░░░██ ██░░░░ ░██████ +# ██ ░░█████ ░██░░░██ +# ██ ░░░░░██░██ ░██ +# ██████ ██████ ░██ ░██ +# ░░░░░░ ░░░░░░ ░░ ░░ +# +# ▓▓▓▓▓▓▓▓▓▓ +# ░▓ author ▓ xero <x@xero.nu> +# ░▓ code ▓ http://code.xero.nu/dotfiles +# ░▓ mirror ▓ http://git.io/.files +# ░▓▓▓▓▓▓▓▓▓▓ +# ░░░░░░░░░░ +# +#█▓▒░ keybindings +typeset -A key + +key[Home]=${terminfo[khome]} +key[End]=${terminfo[kend]} +key[Insert]=${terminfo[kich1]} +key[Delete]=${terminfo[kdch1]} +key[Up]=${terminfo[kcuu1]} +key[Down]=${terminfo[kcud1]} +key[Left]=${terminfo[kcub1]} +key[Right]=${terminfo[kcuf1]} +key[PageUp]=${terminfo[kpp]} +key[PageDown]=${terminfo[knp]} + +[[ -n "${key[Home]}" ]] && bindkey "${key[Home]}" beginning-of-line +[[ -n "${key[End]}" ]] && bindkey "${key[End]}" end-of-line +[[ -n "${key[Insert]}" ]] && bindkey "${key[Insert]}" overwrite-mode +[[ -n "${key[Delete]}" ]] && bindkey "${key[Delete]}" delete-char +[[ -n "${key[Up]}" ]] && bindkey "${key[Up]}" up-line-or-history +[[ -n "${key[Down]}" ]] && bindkey "${key[Down]}" down-line-or-history +[[ -n "${key[Left]}" ]] && bindkey "${key[Left]}" backward-char +[[ -n "${key[Right]}" ]] && bindkey "${key[Right]}" forward-char +[[ -n "${key[PageUp]}" ]] && bindkey "${key[PageUp]}" beginning-of-buffer-or-history +[[ -n "${key[PageDown]}" ]] && bindkey "${key[PageDown]}" end-of-buffer-or-history + +if (( ${+terminfo[smkx]} )) && (( ${+terminfo[rmkx]} )); then + function zle-line-init () { + printf '%s' "${terminfo[smkx]}" + } + function zle-line-finish () { + printf '%s' "${terminfo[rmkx]}" + } + zle -N zle-line-init + zle -N zle-line-finish +fi diff --git a/zsh/.zsh/keychain.zsh b/zsh/.zsh/keychain.zsh @@ -0,0 +1,21 @@ +# ██ +# ░██ +# ██████ ██████░██ +# ░░░░██ ██░░░░ ░██████ +# ██ ░░█████ ░██░░░██ +# ██ ░░░░░██░██ ░██ +# ██████ ██████ ░██ ░██ +# ░░░░░░ ░░░░░░ ░░ ░░ +# +# ▓▓▓▓▓▓▓▓▓▓ +# ░▓ author ▓ xero <x@xero.nu> +# ░▓ code ▓ http://code.xero.nu/dotfiles +# ░▓ mirror ▓ http://git.io/.files +# ░▓▓▓▓▓▓▓▓▓▓ +# ░░░░░░░░░░ +# +#█▓▒░ ssh keys +export SSH_KEY_PATH="~/.ssh/id_rsa" + +#█▓▒░ funtoo keychain +eval `keychain -q --eval ~/.ssh/id_rsa` diff --git a/zsh/.zsh/minimal-prompt.zsh b/zsh/.zsh/minimal-prompt.zsh @@ -0,0 +1,19 @@ +# ██ +# ░██ +# ██████ ██████░██ +# ░░░░██ ██░░░░ ░██████ +# ██ ░░█████ ░██░░░██ +# ██ ░░░░░██░██ ░██ +# ██████ ██████ ░██ ░██ +# ░░░░░░ ░░░░░░ ░░ ░░ +# +# ▓▓▓▓▓▓▓▓▓▓ +# ░▓ author ▓ xero <x@xero.nu> +# ░▓ code ▓ http://code.xero.nu/dotfiles +# ░▓ mirror ▓ http://git.io/.files +# ░▓▓▓▓▓▓▓▓▓▓ +# ░░░░░░░░░░ +# +#█▓▒░ minial prompt +#PROMPT='${USER_LEVEL}[%F{white}%~${USER_LEVEL}]$(prompt_git_info) >\%f ' +PROMPT='${USER_LEVEL}%n@%F{d9d9d9}[%m]:%1~$(prompt_git_info)%F{d9d9d9}#%f ' diff --git a/zsh/.zsh/ninja-prompt._zsh b/zsh/.zsh/ninja-prompt._zsh @@ -0,0 +1,22 @@ +# ██ +# ░██ +# ██████ ██████░██ +# ░░░░██ ██░░░░ ░██████ +# ██ ░░█████ ░██░░░██ +# ██ ░░░░░██░██ ░██ +# ██████ ██████ ░██ ░██ +# ░░░░░░ ░░░░░░ ░░ ░░ +# +# ▓▓▓▓▓▓▓▓▓▓ +# ░▓ author ▓ xero <x@xero.nu> +# ░▓ code ▓ http://code.xero.nu/dotfiles +# ░▓ mirror ▓ http://git.io/.files +# ░▓▓▓▓▓▓▓▓▓▓ +# ░░░░░░░░░░ +# +#█▓▒░ ninja prompt +PROMPT='%F{white} ▟▙ ${USER_LEVEL}%~%F{white}$(prompt_git_info) %F{white} +▟▒${USER_LEVEL}░░░░░░░%F{white}▜▙▜████████████████████████████████▛ +▜▒${USER_LEVEL}░░░░░░░%F{white}▟▛▟▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▛ + ▜▛ + %F{white}' diff --git a/zsh/.zsh/nodejs.zsh b/zsh/.zsh/nodejs.zsh @@ -0,0 +1,24 @@ +# ██ +# ░██ +# ██████ ██████░██ +# ░░░░██ ██░░░░ ░██████ +# ██ ░░█████ ░██░░░██ +# ██ ░░░░░██░██ ░██ +# ██████ ██████ ░██ ░██ +# ░░░░░░ ░░░░░░ ░░ ░░ +# +# ▓▓▓▓▓▓▓▓▓▓ +# ░▓ author ▓ xero <x@xero.nu> +# ░▓ code ▓ http://code.xero.nu/dotfiles +# ░▓ mirror ▓ http://git.io/.files +# ░▓▓▓▓▓▓▓▓▓▓ +# ░░░░░░░░░░ +# +#█▓▒░ node version manager +source ~/.nvm/nvm.sh + +#█▓▒░ aliases +alias node="sudo node" +alias npm="sudo npm" +alias npminstall="sudo rm -rf node_modules && sudo npm cache clear && sudo npm cache clean && npm install" +# alias npminstall="sudo rm -rf node_modules && sudo npm cache clear && sudo npm cache clean && sudo PYTHON=/usr/bin/python2 npm install" diff --git a/zsh/.zsh/security.zsh b/zsh/.zsh/security.zsh @@ -0,0 +1,20 @@ +# ██ +# ░██ +# ██████ ██████░██ +# ░░░░██ ██░░░░ ░██████ +# ██ ░░█████ ░██░░░██ +# ██ ░░░░░██░██ ░██ +# ██████ ██████ ░██ ░██ +# ░░░░░░ ░░░░░░ ░░ ░░ +# +# ▓▓▓▓▓▓▓▓▓▓ +# ░▓ author ▓ xero <x@xero.nu> +# ░▓ code ▓ http://code.xero.nu/dotfiles +# ░▓ mirror ▓ http://git.io/.files +# ░▓▓▓▓▓▓▓▓▓▓ +# ░░░░░░░░░░ +# +#█▓▒░ av aliases +alias checkrootkits="sudo rkhunter --update; sudo rkhunter --propupd; sudo rkhunter --check" +alias checkvirus="clamscan --recursive=yes --infected /home" +alias updateantivirus="sudo freshclam" diff --git a/zsh/.zsh/sourcerer.zsh b/zsh/.zsh/sourcerer.zsh @@ -0,0 +1,37 @@ +# ██ +# ░██ +# ██████ ██████░██ +# ░░░░██ ██░░░░ ░██████ +# ██ ░░█████ ░██░░░██ +# ██ ░░░░░██░██ ░██ +# ██████ ██████ ░██ ░██ +# ░░░░░░ ░░░░░░ ░░ ░░ +# +# ▓▓▓▓▓▓▓▓▓▓ +# ░▓ author ▓ xero <x@xero.nu> +# ░▓ code ▓ http://code.xero.nu/dotfiles +# ░▓ mirror ▓ http://git.io/.files +# ░▓▓▓▓▓▓▓▓▓▓ +# ░░░░░░░░░░ +# +#█▓▒░ tty colors +if [ "$TERM" = "linux" ] +then + echo -en "\e]P0222222" #black + echo -en "\e]P8111111" #darkgrey + echo -en "\e]P1aa4450" #darkred + echo -en "\e]P9ff6a6a" #red + echo -en "\e]P2719611" #darkgreen + echo -en "\e]PAb1d631" #green + echo -en "\e]P3cc8800" #brown + echo -en "\e]PBff9800" #yellow + echo -en "\e]P46688aa" #darkblue + echo -en "\e]PC90b0d1" #blue + echo -en "\e]P58f6f8f" #darkmagenta + echo -en "\e]PD8181a6" #magenta + echo -en "\e]P6528b8b" #darkcyan + echo -en "\e]PE87ceeb" #cyan + echo -en "\e]P7d3d3d3" #lightgrey + echo -en "\e]PFc1cdc1" #white + clear #for background artifacting +fi diff --git a/zsh/.zsh/syntax.zsh b/zsh/.zsh/syntax.zsh @@ -0,0 +1,43 @@ +# ██ +# ░██ +# ██████ ██████░██ +# ░░░░██ ██░░░░ ░██████ +# ██ ░░█████ ░██░░░██ +# ██ ░░░░░██░██ ░██ +# ██████ ██████ ░██ ░██ +# ░░░░░░ ░░░░░░ ░░ ░░ +# +# ▓▓▓▓▓▓▓▓▓▓ +# ░▓ author ▓ xero <x@xero.nu> +# ░▓ code ▓ http://code.xero.nu/dotfiles +# ░▓ mirror ▓ http://git.io/.files +# ░▓▓▓▓▓▓▓▓▓▓ +# ░░░░░░░░░░ +# +#█▓▒░ source the plugin https://github.com/zsh-users/zsh-syntax-highlighting +source /usr/share/zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh + +#█▓▒░ color overrides +ZSH_HIGHLIGHT_STYLES[default]='none' +ZSH_HIGHLIGHT_STYLES[unknown-token]='fg=red' +ZSH_HIGHLIGHT_STYLES[reserved-word]='fg=yellow' +ZSH_HIGHLIGHT_STYLES[alias]='fg=blue' +ZSH_HIGHLIGHT_STYLES[builtin]='fg=blue' +ZSH_HIGHLIGHT_STYLES[function]='fg=blue' +ZSH_HIGHLIGHT_STYLES[command]='fg=blue' +ZSH_HIGHLIGHT_STYLES[precommand]='none' +ZSH_HIGHLIGHT_STYLES[commandseparator]='none' +ZSH_HIGHLIGHT_STYLES[hashed-command]='fg=blue' +ZSH_HIGHLIGHT_STYLES[path]='none' +ZSH_HIGHLIGHT_STYLES[path_prefix]='none' +ZSH_HIGHLIGHT_STYLES[path_approx]='fg=yellow' +ZSH_HIGHLIGHT_STYLES[globbing]='fg=green' +ZSH_HIGHLIGHT_STYLES[history-expansion]='fg=green' +ZSH_HIGHLIGHT_STYLES[single-hyphen-option]='fg=magenta' +ZSH_HIGHLIGHT_STYLES[double-hyphen-option]='fg=red' +ZSH_HIGHLIGHT_STYLES[back-quoted-argument]='none' +ZSH_HIGHLIGHT_STYLES[single-quoted-argument]='fg=yellow' +ZSH_HIGHLIGHT_STYLES[double-quoted-argument]='fg=yellow' +ZSH_HIGHLIGHT_STYLES[dollar-double-quoted-argument]='fg=cyan' +ZSH_HIGHLIGHT_STYLES[back-double-quoted-argument]='fg=cyan' +ZSH_HIGHLIGHT_STYLES[assign]='none' diff --git a/zsh/.zshrc b/zsh/.zshrc @@ -0,0 +1,20 @@ +# ██ +# ░██ +# ██████ ██████░██ ██████ █████ +# ░░░░██ ██░░░░ ░██████ ░░██░░█ ██░░░██ +# ██ ░░█████ ░██░░░██ ░██ ░ ░██ ░░ +# ██ ░░░░░██░██ ░██ ░██ ░██ ██ +# ██████ ██████ ░██ ░██░███ ░░█████ +# ░░░░░░ ░░░░░░ ░░ ░░ ░░░ ░░░░░ +# +# ▓▓▓▓▓▓▓▓▓▓ +# ░▓ author ▓ xero <x@xero.nu> +# ░▓ code ▓ http://code.xero.nu/dotfiles +# ░▓ mirror ▓ http://git.io/.files +# ░▓▓▓▓▓▓▓▓▓▓ +# ░░░░░░░░░░ +# +#█▓▒░ load configs +for config (~/.zsh/*.zsh) source $config + +setopt auto_cd +\ No newline at end of file