Merge remote-tracking branch 'ryuslash/master' into phoenix

Conflicts:
	.config/awesome/rc.lua
	.emacs.d/init.el
	.emacs.d/init.org
	.emacs.d/site-lisp/oni.el
This commit is contained in:
Tom Willemsen 2013-02-15 15:37:42 +01:00
commit 934d02bcac
28 changed files with 1331 additions and 921 deletions

View file

@ -1,4 +1,3 @@
urxvt.internalBorder: 0
urxvt.loginShell: true
@ -21,11 +20,12 @@ urxvt.keysym.M-s: perl:keyboard-select:search
urxvt.keysym.M-u: perl:url-select:select_next
urxvt.font: xft:Monaco:weight=medium:pixelsize=18
urxvt.boldFont: xft:Monaco:weight=black:pixelsize=18
! urxvt.italicFont: xft:Monaco:slant=italic:pixelsize=18
urxvt.font: xft:Envy Code R:weight=medium:pixelsize=18
urxvt.boldFont: xft:Envy Code R:weight=bold:pixelsize=18
urxvt.italicFont: xft:Envy Code R:slant=italic:pixelsize=18
urxvt.background: #111113
urxvt.depth: 32
urxvt.background: [90]#111113
urxvt.foreground: #eeeeec
urxvt.color0: #171719

View file

@ -1,16 +1,62 @@
require("awful")
require("awful.autofocus")
require("awful.rules")
require("beautiful")
require("bowl")
require("keychain")
require("naughty")
require("ext")
require("oni")
-- Standard awesome library
local gears = require("gears")
local awful = require("awful")
-- 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")
local lfs = require("lfs")
--- 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)
awful.rules = require("awful.rules")
require("awful.autofocus")
local maildir_base = os.getenv("HOME") .. "/documents/mail/"
function ror(program, cls)
local rorfunc = function ()
local matcher = function (c)
return awful.rules.match(c, { class = cls })
end
awful.client.run_or_raise(program, matcher)
end
return rorfunc
end
function ror_combo(mod, key, program, class)
return awful.util.table.join(
awful.key(mod, key, ror(program, class)),
awful.key(awful.util.table.join(mod, { "Shift" }), key,
function () awful.util.spawn(program) end))
end
function new_mail(maildir)
local count = 0
for file in lfs.dir(maildir_base .. maildir .. "/new") do
if file ~= "." and file ~= ".." then
count = count + 1
end
end
for file in lfs.dir(maildir_base .. maildir .. "/cur") do
if string.sub(file, -1) ~= "S" and file ~= "."
and file ~= ".." then
count = count + 1
end
end
return count
end
----- 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!",
@ -20,7 +66,7 @@ end
-- Handle runtime errors after startup
do
local in_error = false
awesome.add_signal("debug::error", function (err)
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
@ -31,33 +77,26 @@ do
in_error = false
end)
end
-- {{{ Variable definitions
----- Variable definitions
-- Themes define colours, icons, and wallpapers
beautiful.init("/home/slash/.config/awesome/themes/custom/theme.lua")
bowl.init({ use_timers = true, timeout = 1 })
bowl.default_setup()
keychain.init({ escapes = {
keychain.keystroke ({ }, "Escape"),
keychain.keystroke ({ "Control", }, "g")
} })
beautiful.init("/usr/share/awesome/themes/default/theme.lua")
-- This is used later as the default terminal and editor to run.
terminal = "urxvt"
editor = os.getenv("EDITOR") or "nano"
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.
----- 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.
layouts =
local layouts =
{
awful.layout.suit.magnifier,
awful.layout.suit.tile,
@ -66,22 +105,29 @@ layouts =
awful.layout.suit.tile.top,
awful.layout.suit.fair,
awful.layout.suit.fair.horizontal,
awful.layout.suit.spiral,
awful.layout.suit.spiral.dwindle,
awful.layout.suit.max,
awful.layout.suit.max.fullscreen,
awful.layout.suit.floating
}
-- }}}
-- {{{ Tags
----- 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({ 1, 2, 3, 4, 5, 6, 7, 8, 9 }, s, layouts[1])
end
-- }}}
-- {{{ Menu
----- Menu
-- Create a laucher widget and a main menu
myawesomemenu = {
{ "manual", terminal .. " -e man awesome" },
@ -90,294 +136,289 @@ myawesomemenu = {
{ "quit", awesome.quit }
}
mymainmenu = awful.menu({ items = { { "awesome", myawesomemenu, beautiful.awesome_icon },
{ "open terminal", terminal }
}
})
mymainmenu = awful.menu(
{ items = { { "awesome", myawesomemenu, beautiful.awesome_icon },
{ "open terminal", terminal } } })
mylauncher = awful.widget.launcher({ image = image(beautiful.awesome_icon),
mylauncher = awful.widget.launcher({ image = beautiful.awesome_icon,
menu = mymainmenu })
-- }}}
-- {{{ Wibox
-- Menubar configuration
menubar.utils.terminal = terminal -- Set the terminal for applications
-- that require it
----- Wibox
-- Create a textclock widget
mytextclock = awful.widget.textclock({ align = "right" })
-- Create a systray
mysystray = widget({ type = "systray" })
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, awful.tag.viewnext),
awful.button({ }, 5, awful.tag.viewprev)
)
mytasklist = {}
mytasklist.buttons = awful.util.table.join(
awful.button({ }, 1, function (c)
if c == client.focus then
c.minimized = true
else
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({ 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))
mymaillist = wibox.widget.textbox()
mymaillist:set_text(
string.format(" ryu: %d gmail: %d aethon: %d 9f: %d",
new_mail('ryuslash.org/inbox'),
new_mail('gmail/inbox'),
new_mail('aethon/inbox'),
new_mail('ninthfloor/inbox')))
mymaillisttimer = timer({ timeout = 60 })
mymaillisttimer:connect_signal(
"timeout",
function ()
mymaillist:set_text(
string.format(" ryu: %d gmail: %d aethon: %d 9f: %d",
new_mail('ryuslash.org/inbox'),
new_mail('gmail/inbox'),
new_mail('aethon/inbox'),
new_mail('ninthfloor/inbox')))
end)
mymaillisttimer:start()
mytodolist = wibox.widget.textbox()
mytodolist:set_text(
string.format(" ptodo: %d wtodo: %d",
awful.util.pread("todo-count t"),
awful.util.pread("todo-count w")))
mytodolisttimer = timer({ timeout = 60 * 60 })
mytodolisttimer:connect_signal(
"timeout",
function ()
mytodolist:set_text(
string.format(" pers: %d work: %d",
awful.util.pread("todo-count t"),
awful.util.pread("todo-count w")))
end)
mytodolisttimer:start()
for s = 1, screen.count() do
-- Create a promptbox for each screen
mypromptbox[s] = awful.widget.prompt({ layout = awful.widget.layout.horizontal.leftright })
-- Create an imagebox widget which will contains an icon indicating which layout we're using.
-- We need one layoutbox per 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.label.all, mytaglist.buttons)
mytaglist[s] = awful.widget.taglist(
s, awful.widget.taglist.filter.all, mytaglist.buttons)
-- Create a tasklist widget
mytasklist[s] = awful.widget.tasklist(function(c)
return awful.widget.tasklist.label.currenttags(c, s)
end, mytasklist.buttons)
mytasklist[s] = awful.widget.tasklist(
s, awful.widget.tasklist.filter.currenttags, mytasklist.buttons)
-- Create the wibox
mywibox[s] = awful.wibox({ position = "top", screen = s })
-- Add widgets to the wibox - order matters
mywibox[s].widgets = {
{
mylauncher,
mytaglist[s],
mypromptbox[s],
layout = awful.widget.layout.horizontal.leftright
},
mylayoutbox[s],
mytextclock,
s == 1 and mysystray or nil,
mytasklist[s],
layout = awful.widget.layout.horizontal.rightleft
}
-- 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(mypromptbox[s])
-- Widgets that are aligned to the right
local right_layout = wibox.layout.fixed.horizontal()
if s == 1 then
right_layout:add(mytodolist)
right_layout:add(mymaillist)
right_layout:add(wibox.widget.systray())
end
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
local bind = keychain
local sub = keychain.sub
----- Key bindings
globalkeys = awful.util.table.join(
bind({ "Control", }, "i",
{ sub({ }, "space", ext.next_client),
sub({ }, ",",
function () awful.screen.focus_relative(1) end),
sub({ }, ".",
function () awful.screen.focus_relative(-1) end),
sub({ "Shift", }, "1",
function () mypromptbox[mouse.screen]:run() end),
sub({ }, "f", function () oni.focus_raise("right") end),
sub({ }, "b", function () oni.focus_raise("left") end),
sub({ }, "n", function () oni.focus_raise("down") end),
sub({ }, "p", function () oni.focus_raise("up") end),
sub({ }, "c", oni.ror_term),
sub({ "Shift", }, "c", oni.run_term),
sub({ }, "e", oni.ror_editor),
sub({ "Shift", }, "e", oni.run_editor),
sub({ }, "w", oni.ror_browser),
sub({ "Shift", }, "w", oni.run_browser),
sub({ "Control", }, "i", ext.prev_client) }),
awful.key({ "Control", "Mod1" }, "l",
function () awful.util.spawn("i3lock -c 000000") end),
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, }, "Left", awful.tag.viewprev),
awful.key({ modkey, }, "Right", awful.tag.viewnext),
awful.key({ modkey, }, "Escape", awful.tag.history.restore),
-- awful.key({ modkey, }, "w", function () mymainmenu:show({keygrabber=true}) end),
awful.key({ modkey, }, "n",
function ()
awful.client.focus.byidx(1)
if client.focus then client.focus:raise() end
end),
awful.key({ modkey, }, "p",
function ()
awful.client.focus.byidx(-1)
if client.focus then client.focus:raise() end
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, }, "u", awful.client.urgent.jumpto),
awful.key({ modkey, "Shift" }, "n",
function () awful.client.swap.byidx(1) end),
awful.key({ modkey, "Shift" }, "p",
function () awful.client.swap.byidx(-1) end),
awful.key({ modkey, "Control" }, "n",
function () awful.screen.focus_relative(1) end),
awful.key({ modkey, "Control" }, "p",
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, }, "Return",
function () awful.util.spawn(terminal) end),
awful.key({ modkey, "Control" }, "r", awesome.restart),
awful.key({ modkey, "Shift" }, "q", awesome.quit),
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, }, "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),
awful.key({ modkey, "Control" }, "j", awful.client.restore),
-- Prompt
awful.key({ modkey }, "r", function () mypromptbox[mouse.screen]:run() end),
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)
)
awful.prompt.run(
{ prompt = "Run Lua code: " },
mypromptbox[mouse.screen].widget,
awful.util.eval, nil,
awful.util.getdir("cache") .. "/history_eval")
end),
ror_combo({ modkey }, "e", 'emacsclient -ca emacs', 'Emacs'),
ror_combo({ modkey }, "c", 'urxvt', 'URxvt'),
ror_combo({ modkey }, "w", 'conkeror', 'Conkeror'),
awful.key({ "Control", "Mod1" }, "l",
function () awful.util.spawn('i3lock -c 000000') 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, "Shift" }, "r", function (c) c:redraw() end),
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)
)
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",
function () awful.screen.focus_relative(1) end),
awful.key({ modkey, "Shift" }, "o", awful.client.movetoscreen),
awful.key({ modkey, }, "t", function (c) c.ontop = not c.ontop end),
awful.key({ modkey, }, "m",
function (c)
c.maximized_horizontal = not c.maximized_horizontal
c.maximized_vertical = not c.maximized_vertical
end))
-- Compute the maximum number of digit we need, limited to 9
keynumber = 0
for s = 1, screen.count() do
keynumber = math.min(9, math.max(#tags[s], keynumber));
keynumber = math.min(9, math.max(#tags[s], keynumber))
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.
-- 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, keynumber do
globalkeys = awful.util.table.join(globalkeys,
awful.key({ modkey }, "#" .. i + 9,
function ()
local screen = mouse.screen
if tags[screen][i] then
awful.tag.viewonly(tags[screen][i])
end
end),
awful.key({ modkey, "Control" }, "#" .. i + 9,
function ()
local screen = mouse.screen
if tags[screen][i] then
awful.tag.viewtoggle(tags[screen][i])
end
end),
awful.key({ modkey, "Shift" }, "#" .. i + 9,
function ()
if client.focus and tags[client.focus.screen][i] then
awful.client.movetotag(tags[client.focus.screen][i])
end
end),
awful.key({ modkey, "Control", "Shift" }, "#" .. i + 9,
function ()
if client.focus and tags[client.focus.screen][i] then
awful.client.toggletag(tags[client.focus.screen][i])
end
end))
globalkeys = awful.util.table.join(
globalkeys,
awful.key({ modkey }, "#" .. i + 9,
function ()
local screen = mouse.screen
if tags[screen][i] then
awful.tag.viewonly(tags[screen][i])
end
end),
awful.key({ modkey, "Control" }, "#" .. i + 9,
function ()
local screen = mouse.screen
if tags[screen][i] then
awful.tag.viewtoggle(tags[screen][i])
end
end),
awful.key({ modkey, "Shift" }, "#" .. i + 9,
function ()
if client.focus and tags[client.focus.screen][i] then
awful.client.movetotag(tags[client.focus.screen][i])
end
end),
awful.key({ modkey, "Control", "Shift" }, "#" .. i + 9,
function ()
if client.focus and tags[client.focus.screen][i] then
awful.client.toggletag(tags[client.focus.screen][i])
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
awful.rules.rules = {
-- All clients will match this rule.
{ rule = { },
properties = { border_width = beautiful.border_width,
border_color = beautiful.border_normal,
focus = true,
keys = clientkeys,
buttons = clientbuttons } },
{ rule = { class = "MPlayer" },
properties = { floating = true } },
{ rule = { class = "pinentry" },
properties = { floating = true } },
{ rule = { class = "gimp" },
properties = { floating = true } },
-- Set Firefox to always map on tags number 2 of screen 1.
-- { rule = { class = "Firefox" },
-- properties = { tag = tags[1][2] } },
-- All clients will match this rule.
{ rule = { },
properties = { border_width = beautiful.border_width,
border_color = beautiful.border_normal,
focus = awful.client.focus.filter,
keys = clientkeys } },
{ rule = { class = "pinentry" },
properties = { floating = true } },
{ rule = { class = "gimp" },
properties = { floating = true } },
{ rule = { class = "Conkeror" },
properties = { floating = false,
tag = tags[2][1] } },
-- Set Firefox to always map on tags number 2 of screen 1.
-- { rule = { class = "Firefox" },
-- properties = { tag = tags[1][2] } },
}
-- }}}
-- {{{ Signals
----- Signals
-- Signal function to execute when a new client appears.
client.add_signal("manage", function (c, startup)
-- Add a titlebar
-- awful.titlebar.add(c, { modkey = modkey })
client.connect_signal(
"manage",
function (c, startup)
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)
-- Enable sloppy focus
c:add_signal("mouse::enter", function(c)
if awful.layout.get(c.screen) ~= awful.layout.suit.magnifier
and awful.client.focus.filter(c) then
client.focus = c
end
end)
-- 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
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
end)
client.add_signal("focus", function(c) c.border_color = beautiful.border_focus end)
client.add_signal("unfocus", function(c) c.border_color = beautiful.border_normal 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)

View file

@ -1,5 +1,5 @@
DESTDIR:=$(DESTDIR)/.conkerorrc
modules=themes
objects=gtk2rc init.js
modules=themes styles
objects=gtk2rc init.js ext_restore.js
include ../dotfiles.mk

View file

@ -0,0 +1,33 @@
/// From http://conkeror.org/Tips#Restore_Killed_Buffer_Url
// I think by the time kill_buffer_hook runs the buffer is gone so I
// patch kill_buffer
var kill_buffer_original = kill_buffer_original || kill_buffer;
var killed_buffer_urls = [];
kill_buffer = function (buffer, force) {
if (buffer.display_uri_string) {
killed_buffer_urls.push(buffer.display_uri_string);
}
kill_buffer_original(buffer,force);
};
interactive("restore-killed-buffer-url", "Loads url from a previously killed buffer",
function restore_killed_buffer_url (I) {
if (killed_buffer_urls.length !== 0) {
var url = yield I.minibuffer.read(
$prompt = "Restore killed url:",
$completer = all_word_completer($completions = killed_buffer_urls),
$default_completion = killed_buffer_urls[killed_buffer_urls.length - 1],
$auto_complete = "url",
$auto_complete_initial = true,
$auto_complete_delay = 0,
$match_required);
load_url_in_new_buffer(url);
} else {
I.window.minibuffer.message("No killed buffer urls");
}
});

View file

@ -1,10 +1,10 @@
require("content-policy.js");
require("favicon");
load_paths.push("file:///home/slash/var/src/linkwave/conkeror/");
load_paths.push("file:///home/slash/projects/markam/conkeror/");
theme_load_paths.push("/home/slash/.conkerorrc/themes/");
require("linkwave");
require("markam");
define_browser_object_class(
"history-url", null,
@ -23,6 +23,15 @@ function ext_title_format(window) {
+ window.buffers.current.description;
}
function oni_add_sheet(css) {
let (sheet = get_home_directory()) {
sheet.append(".conkerorrc");
sheet.append("styles");
sheet.append(css);
register_user_stylesheet(make_uri(sheet));
};
}
function oni_before_quit_func() {
var w = get_recent_conkeror_window();
var result = (w == null) ||
@ -112,18 +121,43 @@ define_webjump("arch/packages",
"https://www.archlinux.org/packages/?sort=&q=%s&limit=50",
$alternative="https://packages.archlinux.org");
/// Chickadee
// From http://conkeror.org/Webjumps
function chickadee_completer (input, cursor_position, conservative) {
var completions = [];
var content = yield send_http_request(
load_spec({uri: "http://api.call-cc.org/cdoc/ajax/prefix?q="+
encodeURIComponent(input)}));
if (content.responseText) {
var parser = Cc["@mozilla.org/xmlextras/domparser;1"]
.createInstance(Ci.nsIDOMParser);
var doc = parser.parseFromString(content.responseText, "text/xml");
var res = doc.getElementsByTagName("li");
for (let i = 0, n = res.length; i < n; ++i) {
completions.push(res[i].textContent);
}
}
yield co_return(prefix_completer($completions = completions)
(input, cursor_position, conservative));
}
define_webjump("chickadee",
"http://api.call-cc.org/cdoc?q=%s&query-name=Lookup",
$alternative = "http://api.call-cc.org/doc/",
$completer = chickadee_completer);
/// /Chickadee
// content_policy_bytype_table.object = oni_block_flash;
cwd = make_file("/home/slash/downloads/");
hint_digits = "arstdhneio";
read_buffer_show_icons = true;
title_format_fn = ext_title_format;
url_remoting_fn = load_url_in_new_buffer;
markam_program = "/home/slash/projects/markam/src/markam";
define_key(content_buffer_normal_keymap, "h",
"find-url-from-history-new-buffer");
define_key(content_buffer_normal_keymap, "H",
"find-url-from-history");
define_key(content_buffer_normal_keymap, "C-x C-b", "switch-to-buffer");
define_key(content_buffer_normal_keymap, "C-y", "paste-url-new-buffer");
define_key(content_buffer_normal_keymap, "H", "find-url-from-history");
define_key(content_buffer_normal_keymap, "h", "find-url-from-history-new-buffer");
define_key(default_base_keymap, "C-x f", "follow-new-buffer");
add_hook("before_quit_hook", oni_before_quit_func);
@ -227,14 +261,47 @@ function read_url_github_command_handler(input)
function read_url_local_port_handler(input)
{
var m = /^lh (\d{1,5})$/.exec(input);
var m = /^lh (\d{1,5})(?:\s+([a-zA-Z0-9%/]+))?$/.exec(input),
rv = null;
if (m) {
return "http://localhost:" + m[1];
rv = "http://localhost:" + m[1];
if (m[2])
rv += "/" + m[2];
}
return null;
return rv;
}
read_url_handler_list = [read_url_local_port_handler,
read_url_github_command_handler];
// Mozrepl
let (mozrepl_init = get_home_directory()) {
mozrepl_init.appendRelativePath(".mozrepl-conkeror.js");
session_pref('extensions.mozrepl.initUrl', make_uri(mozrepl_init).spec);
};
if ('@hyperstruct.net/mozlab/mozrepl;1' in Cc) {
let mozrepl = Cc['@hyperstruct.net/mozlab/mozrepl;1']
.getService(Ci.nsIMozRepl);
if (!mozrepl.isActive())
mozrepl.start(4242);
}
register_user_stylesheet(
"data:text/css," +
escape(
"@namespace url(\"http://www.w3.org/1999/xhtml\");\n" +
"span.__conkeror_hint {\n" +
" font-family: \"Envy Code R\" !important;\n" +
" font-size: 12px !important;\n" +
" line-height: 12px !important;\n" +
" padding: 0 2px !important;\n" +
"}"
)
);
oni_add_sheet("github.css");
oni_add_sheet("help.css");

View file

@ -0,0 +1,4 @@
DESTDIR:=$(DESTDIR)/styles
objects=github.css help.css
include ../../dotfiles.mk

View file

@ -0,0 +1,161 @@
@-moz-document url(https://github.com/), url(https://github.com/dashboard) {
#dashboard .filter-bar {
background: #222224 !important;
border-bottom: none !important;
}
#dashboard .filter-bar li a.filter_selected {
color: #eeeeec !important;
}
#dashboard .repos {
border: none !important;
background-color: #171719 !important;
}
#dashboard .repos .bottom-bar {
background-color: #222224 !important;
}
#dashboard .repos .top-bar {
background: #222224 !important;
border-bottom: none !important;
}
#dashboard .repos h2 {
color: inherit !important;
}
#dashboard ul.repo_list li.private {
background: #222224 !important;
}
#dashboard ul.repo_list li a {
border-width: 0 !important;
}
#footer {
text-shadow: none !important;
}
.button .minibutton {
background: #171719 !important;
}
.header {
background: #222224 !important;
color: #eeeeec !important;
border-bottom: none !important;
text-shadow: none !important;
}
.header .divider-vertical {
background: #222224 !important;
border-right: none !important;
}
.header .top-nav a {
color: #eeeeec !important;
}
.header .topsearch a#advanced_search {
color: #eeeeec !important;
}
.header #user-links a {
color: #eeeeec !important;
}
.markdown-body code,
.markdown-body tt {
background-color: #222224 !important;
border: none !important;
color: #eeeeec !important;
font-family: "Envy Code R" !important;
}
.minibutton.dark-grey {
background: #171719 !important;o
}
.news .alert {
border-top: none !important;
}
.news .alert .branch-link,
.news .alert .pull-info {
background: #222224 !important;
color: #eeeeec !important;
}
.news .alert .gravatar {
background: none !important;
}
.news .alert .simple .title {
color: #eeeeec !important;
}
.news .commits li img {
background: none !important;
}
.news blockquote {
color: #eeeeec !important;
}
.pagehead .container > ul.tabs {
background: #171719 !important;
border: none !important;
}
.pagehead .container > ul.tabs li a {
text-shadow: none !important;
border: none !important;
}
.pagehead .container > ul.tabs li a:hover {
background: #222224 !important;
}
.pagehead .container > ul.tabs li a.selected {
background: #222224 !important;
}
.pagehead-actions a.feed {
background: #222224 !important;
border: none !important;
}
.pagination {
background: #171719 !important;
border: none !important;
}
.pagination a {
text-shadow: none !important;
border-bottom: none !important;
}
.pagination a:hover {
background: #222224 !important;
}
a {
color: #ffbb56 !important;
}
a:visited {
color: #ee82ee !important;
}
a.header-logo-blacktocat,
a.header-logo-blacktocat:visited {
color: #eeeeec !important;
}
body {
background-color: #111113 !important;
color: #eeeeec !important;
}
}

View file

@ -0,0 +1,19 @@
@-moz-document url(chrome://conkeror-help/content/help.html) {
body {
background: #111113 !important;
color: #eeeeec !important;
}
a {
color: #ffbb56 !important;
}
a:visited {
color: #ee82ee !important;
}
pre, .key {
background: #222224 !important;
font-family: "Envy Code R" !important;
}
}

View file

@ -8,13 +8,6 @@
(load (concat user-emacs-directory "init2"))
(define-key key-translation-map (kbd "C-j") (kbd "C-l"))
(define-key key-translation-map (kbd "C-l") (kbd "C-j"))
(defalias 'yes-or-no-p 'y-or-n-p)
(defalias 'list-buffers 'ibuffer)
(defalias 'dabbrev-expand 'hippie-expand)
(defface git-commit-summary-face
'((t (:inherit org-level-1)))
"Face for the git title line."
@ -30,69 +23,31 @@
"Face for the supposedly empty line in commit messages."
:group 'local)
(eval-after-load "eldoc"
'(diminish 'eldoc-mode))
(eval-after-load "ido" '(oni:ido-init))
(eval-after-load "jabber" '(oni:jabber-init))
(eval-after-load "newst-treeview" '(require 'newsticker-init))
(eval-after-load "org" '(require 'org-init))
(eval-after-load "rainbow-mode" '(oni:rainbow-mode-init))
(eval-after-load "smex" '(oni:smex-init))
(eval-after-load "yasnippet" '(oni:yasnippet-init))
(eval-after-load "em-term"
'(add-to-list 'eshell-visual-commands "unison"))
(autoload 'define-slime-contrib "slime")
(autoload 'gtags-mode "gtags" nil t)
(autoload 'jabber-connect "jabber" nil t)
(autoload 'php-mode "php-mode" nil t)
(autoload 'po-mode "po-mode" nil t)
(autoload 'pony-mode "pony-mode" nil t)
(autoload 'sawfish-mode "sawfish" nil t)
(autoload 'server-running-p "server")
(autoload 'slime-js-minor-mode "slime-js" nil t)
(autoload 'xmodmap-mode "xmodmap-mode" nil t)
(autoload 'w3m-bookmark-view "w3m" nil t)
(autoload 'w3m-goto-url "w3m" nil t)
(eval-after-load "emms-source-file"
'(progn
(require 'emms-setup)
(require 'emms-player-mpd)
(emms-standard)
(add-to-list 'emms-info-functions 'emms-info-mpd)
(add-to-list 'emms-player-list 'emms-player-mpd)
(setq emms-player-mpd-server-name "localhost")
(setq emms-player-mpd-server-port "6600")
(setq emms-player-mpd-music-directory "/mnt/music/mp3")))
(eval-after-load "flymake"
'(progn
(require 'flymake-cursor)
(add-to-list ; Make sure pyflakes is loaded
'flymake-allowed-file-name-masks ; for python files.
'("\\.py\\'" ext:flymake-pyflakes-init))
(add-to-list ; Error line repexp for go
'flymake-err-line-patterns ; compilation.
'("^\\([a-zA-Z0-9_]+\\.go\\):\\([0-9]+\\):\\(.*\\)$"
1 2 nil 3))
(add-to-list ; Go uses makefiles, makes
'flymake-allowed-file-name-masks ; flymaking 'easy'.
'("\\.go$" flymake-simple-make-init))))
(eval-after-load "ido"
'(setq ido-ignore-buffers `(,@ido-ignore-buffers
"^\\*.*\\*$" "^irc\\." "^\\#")))
(eval-after-load "jabber"
'(remove-hook 'jabber-alert-presence-hooks 'jabber-presence-echo))
(eval-after-load "newst-treeview"
'(require 'newsticker-init))
(eval-after-load "org"
'(require 'org-init))
(eval-after-load "pretty-symbols-mode"
'(diminish 'pretty-symbols-mode))
(eval-after-load "rainbow-mode"
'(diminish 'rainbmow-mode))
(eval-after-load "smex"
'(progn
(global-set-key (kbd "M-x") 'smex)
(global-set-key (kbd "C-M-x") 'smex-major-mode-commands)))
(eval-after-load "yasnippet"
'(diminish 'yas-minor-mode))
(require 'geiser-install)
(require 'uniquify)
(require 'ext)
(require 'oni)
(put 'upcase-region 'disabled nil)
(put 'downcase-region 'disabled nil)
@ -112,11 +67,9 @@
(setq appt-disp-window-function #'oni:appt-display-window-and-jabber)
(setq appt-display-diary nil)
(setq auto-mode-case-fold nil)
(setq auto-save-file-name-transforms
`((".*" ,temporary-file-directory t)))
(setq auto-save-file-name-transforms oni:auto-save-name-transforms)
(setq avandu-article-render-function #'avandu-view-w3m)
(setq backup-directory-alist
`((".*" . ,temporary-file-directory)))
(setq backup-directory-alist oni:backup-directory-alist)
(setq browse-url-browser-function 'browse-url-generic)
(setq browse-url-generic-program (getenv "BROWSER"))
(setq c-offsets-alist '((statement-block-intro . +)
@ -141,75 +94,30 @@
(vertical-scroll-bars . nil)
(menu-bar-lines . nil)
(tool-bar-lines . nil)
(font . "monaco-12")))
(setq emms-source-file-default-directory "/mnt/music/")
(font . "Envy Code R:pixelsize=18")
(alpha 90 90)))
(setq elnode-do-init nil)
(setq erc-autojoin-channels-alist
'(("freenode.net" "#ninthfloor" "#emacs" "#dispass")))
'(("freenode.net" "#ninthfloor" "#emacs")))
(setq erc-hide-list '("JOIN" "PART" "QUIT"))
(setq erc-insert-timestamp-function 'erc-insert-timestamp-left)
(setq erc-nick "ryuslash")
(setq erc-timestamp-format "[%H:%M] ")
(setq erc-timestamp-only-if-changed-flag nil)
(setq eshell-highlight-prompt nil)
(setq eshell-prompt-function 'oni:eshell-prompt-function)
(setq eshell-prompt-regexp "^[#$]> ")
(setq fci-rule-color "darkred")
(setq flymake-gui-warnings-enabled nil)
(setq flymake-info-line-regexp
(eval-when-compile
(regexp-opt
'("Invalid name"
"String statement has no effect"
"Missing docstring"
"Empty docstring"
"multiple imports on one line"
"expected 2 blank lines, found 1"
"expected 2 blank lines, found 0"
"TODO:"
"whitespace after '{'"
"whitespace before '}'"
"whitespace before ':'"
"whitespace after '('"
"whitespace before ')'"
"whitespace after '['"
"whitespace before ']'"
"the backslash is redundant between brackets"
"continuation line over-indented for visual indent"
"continuation line under-indented for visual indent"
"Too many statements"
"comparison to None should be"
"missing whitespace around operator"
"missing whitespace after ','"
"line too long"
"at least two spaces before inline comment"
"trailing whitespace"
"imported but unused"
"Unused import"
"too many blank lines"))))
(setq flymake-log-file-name (expand-file-name "~/.emacs.d/flymake.log"))
(setq flymake-log-level 0)
(setq flymake-warn-line-regexp
(eval-when-compile
(regexp-opt '("warning"
"Warning"
"redefinition of unused"
"Redefining built-in"
"Redefining name"
"Unused argument"
"Unused variable"
"Dangerous default value {} as argument"
"no newline at end of file"
"Access to a protected member"))))
(setq frame-title-format '(:eval (concat "emacs: " (buffer-name))))
(setq geiser-repl-history-filename "~/.emacs.d/geiser-history")
(setq gnus-init-file "~/.emacs.d/gnus")
(setq gtags-auto-update t)
(setq help-at-pt-display-when-idle t)
(setq highlight-80+-columns 72)
(setq identica-enable-striping t)
(setq ido-auto-merge-delay-time 1000000)
(setq ido-default-buffer-method 'selected-window)
(setq ido-max-window-height 1)
(setq ido-save-directory-list-file nil)
(setq ido-ubiquitous-command-exceptions '(org-refile))
(setq ido-ubiquitous-command-exceptions
'(org-refile org-capture-refile))
(setq inferior-lisp-program "sbcl")
(setq inhibit-default-init t)
(setq inhibit-local-menu-bar-menus t)
@ -217,15 +125,16 @@
(setq initial-major-mode 'emacs-lisp-mode)
(setq initial-scratch-message nil)
(setq jabber-account-list '(("ryuslash@jabber.org")
("tom@ryuslash.org"
("tom@ryuslash.org/Emacs"
(:connection-type . ssl))))
(setq jabber-chat-buffer-format "*jabber:%n*")
(setq jabber-chat-buffer-format "*jab:%n*")
(setq jabber-chat-buffer-show-avatar nil)
(setq jabber-chat-fill-long-lines nil)
(setq jabber-chat-foreign-prompt-format "%t <\n")
(setq jabber-chat-local-prompt-format "%t >\n")
(setq jabber-chat-foreign-prompt-format "%t %u/%r <\n")
(setq jabber-chat-local-prompt-format "%t %u/%r >\n")
(setq jabber-chatstates-confirm nil)
(setq jabber-history-dir "~/.emacs.d/jabber")
(setq jabber-muc-autojoin '("aethon@muc.ryuslash.org"))
(setq jabber-roster-show-bindings nil)
(setq jit-lock-defer-time 0.2)
(setq magit-repo-dirs '("~/projects/" "~/var/src/"))
@ -234,9 +143,8 @@
(setq message-sendmail-extra-arguments '("-a" "ryuslash"))
(setq package-archives
'(("melpa" . "http://melpa.milkbox.net/packages/")
("ELPA" . "http://tromey.com/elpa/")
("gnu" . "http://elpa.gnu.org/packages/")
("marmalade" . "http://marmalade-repo.org/packages/")))
("marmalade" . "http://marmalade-repo.org/packages/")
("gnu" . "http://elpa.gnu.org/packages/")))
(setq package-load-list '((htmlize "1.39")
(lua-mode "20111107")
all))
@ -249,6 +157,7 @@
(setq redisplay-dont-pause t)
(setq send-mail-function 'smtpmail-send-it)
(setq sendmail-program "/usr/bin/msmtp")
(setq sentence-end-double-space nil)
(setq smex-key-advice-ignore-menu-bar t)
(setq smex-save-file "~/.emacs.d/smex-items")
(setq split-height-threshold 40)
@ -272,12 +181,12 @@
(add-hook 'c-mode-hook 'oni:c-mode-func)
(add-hook 'css-mode-hook 'oni:css-mode-func)
(add-hook 'diary-display-hook 'oni:diary-display-func)
(add-hook 'emacs-startup-hook 'oni:emacs-startup-func)
(add-hook 'emacs-lisp-mode-hook 'oni:emacs-lisp-mode-func)
(add-hook 'erc-mode-hook 'oni:erc-mode-func)
(add-hook 'eshell-mode-hook 'oni:eshell-mode-func)
(add-hook 'flymake-mode-hook 'oni:flymake-mode-func)
(add-hook 'go-mode-hook 'oni:go-mode-func)
(add-hook 'gtags-mode-hook 'oni:gtags-mode-func)
(add-hook 'haskell-mode-hook 'oni:haskell-mode-func)
(add-hook 'html-mode-hook 'oni:html-mode-func)
(add-hook 'jabber-alert-message-hooks 'oni:jabber-alert-message-func)
(add-hook 'jabber-chat-mode-hook 'oni:jabber-chat-mode-func)
@ -299,19 +208,17 @@
(add-hook 'write-file-hooks 'oni:write-file-func)
(add-hook 'yas-minor-mode-hook 'oni:yas-minor-mode-func)
(define-key key-translation-map (kbd "C-j") (kbd "C-l"))
(define-key key-translation-map (kbd "C-l") (kbd "C-j"))
(global-set-key (kbd "'") 'oni:self-insert-dwim)
(global-set-key (kbd "<XF86AudioNext>") 'emms-next)
(global-set-key (kbd "<XF86AudioPlay>") 'oni:emms-toggle-playing)
(global-set-key (kbd "<XF86AudioPrev>") 'emms-previous)
(global-set-key (kbd "<XF86AudioStop>") 'emms-stop)
(global-set-key (kbd "<XF86HomePage>") 'oni:raise-scratch)
(global-set-key (kbd "<XF86Mail>") 'oni:view-mail)
(global-set-key (kbd "<XF86Tools>") 'oni:start-emms)
(global-set-key (kbd "<f10>") 'git-project-show-files)
(global-set-key (kbd "<f5>") 'ext:reload-buffer)
(global-set-key (kbd "<f6>") 'jabber-switch-to-roster-buffer)
(global-set-key (kbd "<f7>") 'magit-status)
(global-set-key (kbd "<f8>") 'oni:raise-eshell)
(global-set-key (kbd "<hiragana>") 'oni:show-org-index)
(global-set-key (kbd "C-<") 'oni:indent-shift-left)
(global-set-key (kbd "C->") 'oni:indent-shift-right)
(global-set-key (kbd "C-M-4") 'split-window-vertically)
@ -329,14 +236,14 @@
(global-set-key (kbd "C-e") 'oni:move-end-of-dwim)
(global-set-key (kbd "C-k") 'oni:kill-region-or-line)
(global-set-key (kbd "C-w") 'oni:kill-region-or-backward-char)
(global-set-key (kbd "M-4") 'split-window-horizontally)
(global-set-key (kbd "M-n") 'idomenu)
(global-set-key (kbd "\"") 'oni:self-insert-dwim)
(global-set-key (kbd "M-o") 'other-window)
(global-set-key (kbd "M-0") 'delete-window)
(global-set-key (kbd "M-1") 'delete-other-windows)
(global-set-key (kbd "M-2") 'split-window-below)
(global-set-key (kbd "M-3") 'split-window-right)
(global-set-key (kbd "M-0") 'delete-window)
(global-set-key (kbd "M-4") 'split-window-horizontally)
(global-set-key (kbd "M-n") 'idomenu)
(global-set-key (kbd "M-o") 'other-window)
(global-set-key (kbd "\"") 'oni:self-insert-dwim)
(if (daemonp)
(global-set-key "\C-x\C-c" 'oni:close-client-window))
@ -369,24 +276,15 @@
'display-buffer-alist
'("^\\*magit: .*\\*$" . ((display-buffer-same-window . nil))))
(unless (oni:required-packages-installed-p)
(message "%s" "Refreshing package database...")
(package-refresh-contents)
(message "%s" " done.")
(mapc #'(lambda (package)
(when (not (package-installed-p package))
(package-install package)))
oni:required-packages))
(blink-cursor-mode -1)
(column-number-mode -1)
(line-number-mode -1)
(menu-bar-mode -1)
(scroll-bar-mode -1)
(tool-bar-mode -1)
(tooltip-mode -1)
(package-initialize)
(auto-insert-mode)
(cua-selection-mode t)
(electric-indent-mode)
(electric-pair-mode)
(ido-mode)
@ -398,8 +296,8 @@
(smex-initialize)
(help-at-pt-set-timer)
(load-theme 'yoshi t)
(windmove-default-keybindings)
(global-diff-hl-mode)
(load custom-file)
;; (load "rudel-loaddefs.el")
@ -408,7 +306,6 @@
(server-start))
(diminish 'auto-fill-function "_")
(ac-config-default)
(provide 'init)

View file

@ -1,308 +1,310 @@
#+TITLE: Emacs init
#+STYLE: <link href="http://ryuslash.ninth.su/test2.css" rel="stylesheet">
#+OPTIONS: author:nil
* Startup
Startup requires a bit of customization to handle all my
customizations.
** Load paths
I have two versions of Emacs installed on my main computer. I have
a daily build of Emacs's ~trunk~ (or currently ~emacs-24~) branch from
bazaar and I have the official ~emacs~ package from archlinux
installed. I keep that second one around so that the occasional
emacs package that I install using ~pacman~ will recognize it as a
dependency and so that if there has been some horrible mistake in
the ~trunk~ branch I still have a stable version to fall back
on[fn:1].
*** Package initialization
In order for packages installed through ELPA to be included
without having to mess with load paths and such, use:
#+NAME: package-initialize
#+BEGIN_SRC emacs-lisp
(package-initialize)
#+END_SRC
*** site-lisp
Because of the setup I wrote about I need to have both the
self-built ~site-lisp~ directory in my load path *and* the "official"
one.
The =oni:add-all-to-load-path= function just binds =default-directory=
to the given directory and calls
=normal-top-level-add-subdirs-to-load-path= to add it and all its
subdirectories to the load path.
#+NAME: add-all
#+BEGIN_SRC emacs-lisp
(defun oni:add-all-to-load-path (dir)
(add-to-list 'load-path dir)
(let ((default-directory dir))
(normal-top-level-add-subdirs-to-load-path)))
#+END_SRC
**** TODO Add load paths in different order depending on version
The officially installed version should load
=/usr/share/emacs/site-lisp= before
=/usr/local/emacs/share/emacs/sit-lisp= and the bzr version should
do the reversed.
*** Projects
Then there are some projects I'm working on, which I use on a
daily basis, these should also be added so I don't have to
constantly remove and re-install them through ~package.el~ when
working on them. And there is the ~load-defs.el~ in my personal
~site-lisp~ directory of course.
#+NAME: load-projects
#+BEGIN_SRC emacs-lisp
(mapc #'oni:add-to-load-path-maybe-load-defs
'("~/projects/emacs/dispass.el" "~/var/src/emacs/mode-icons"
"~/.emacs.d/site-lisp"))
#+END_SRC
The =oni:add-to-load-path-maybe-load-defs= function just adds the
given directory to the load path and then looks for a file named
~loaddefs.el~ within that directory, if it exists it loads it.
#+NAME: add-with-loaddefs
#+BEGIN_SRC emacs-lisp
(defun oni:add-to-load-path-maybe-load-defs (dir)
(add-to-list 'load-path dir)
(let ((loaddefs (concat dir "/loaddefs.el")))
(when (file-exists-p loaddefs)
(load loaddefs))))
#+END_SRC
*** Themes
And, finally, I'm also working on a color theme for emacs, this
should be added to ~custom-theme-load-path~. By using =mapc= here as
well I'm keeping in mind that this isn't the first theme I've
worked on and it might not be the last either.
#+NAME: load-themes
#+BEGIN_SRC emacs-lisp
(mapc #'oni:add-to-custom-theme-load-path
'("~/projects/emacs/yoshi-theme"))
#+END_SRC
The =oni:add-to-custom-theme-load-path= just adds the given
directory to the cutom theme load path.
#+NAME: add-themes
#+BEGIN_SRC emacs-lisp
(defun oni:add-to-custom-theme-load-path (dir)
(add-to-list 'custom-theme-load-path dir))
#+END_SRC
*** Evaluation
Because during byte-compilation certain parts loaded so far might
also be required I put it in an =eval-and-compile= form, so that all
components are loaded with ~emacs -Q~ as well. Without this
compilation might fail at certain points.
#+BEGIN_SRC emacs-lisp :tangle init2.el :noweb yes
(eval-and-compile
<<add-all>>
<<add-with-loaddefs>>
<<add-themes>>
<<package-initialize>>
<<load-site-lisps>>
<<load-projects>>
<<load-themes>>)
#+END_SRC
** Modules
While I try to use =eval-after-load= and =autoload= as much as
possible, some things require direct =require='ing to be of use.
*** Require
- ~auto-complete-config~ :: This sets up some default settings to
make ~auto-complete~ work for most[fn:2] of the modes it
supports.
#+BEGIN_SRC emacs-lisp :tangle init2.el
(require 'auto-complete-config)
#+END_SRC
- ~geiser-install~ :: Sets up geiser autoloads and such.
#+BEGIN_SRC emacs-lisp :tangle init2.el
(require 'geiser-install)
#+END_SRC
- ~uniquify~ :: Provides more helpful buffer name uniquification.
The default of using ~buffer-name<2>~ is boring and
uninformative, ~uniquify~ fixes this.
#+BEGIN_SRC emacs-lisp :tangle init2.el
(require 'uniquify)
#+END_SRC
- ~ext~ :: Functions from external sources.
- ~oni~ :: Functions written personally.
#+BEGIN_SRC emacs-lisp :tangle init2.el
(require 'ext)
(require 'oni)
#+END_SRC
*** Autoload
These might not be used at all in a session, so they should only
be loaded when necessary.
=define-slime-contrib= was used by some module that didn't autoload
or require it[fn:3]. But since I don't use whichever model it
was every day, it is of no use to load it every single time.
#+BEGIN_SRC emacs-lisp :tangle init2.el
(autoload 'define-slime-contrib "slime")
#+END_SRC
I installed ~global~ with ~pacman~, but this doesn't add anything to
any =loaddefs.el=, so doesn't create any autoloads.
#+BEGIN_SRC emacs-lisp :tangle init2.el
(autoload 'gtags-mode "gtags" nil t)
#+END_SRC
~jabber.el~ does create ~jabber-autoloads.el~, but I only ever start
using it through ~jabber-connect~, so anything else isn't really
necessary.
#+BEGIN_SRC emacs-lisp :tangle init2.el
(autoload 'jabber-connect "jabber" nil t)
#+END_SRC
I used to work a bit on ~php-mode~, but that was a while ago, so
it's still in my ~site-lisp~ directory.
#+BEGIN_SRC emacs-lisp :tangle init2.el
(autoload 'php-mode "php-mode" nil t)
#+END_SRC
The same that goes for ~gtags.el~ also goes for ~po-mode.el~.
#+BEGIN_SRC emacs-lisp :tangle init2.el
(autoload 'po-mode "po-mode" nil t)
#+END_SRC
And the same that went for ~php-mode~ also goes for ~pony-mode~,
except I'm still working on it and I was too lazy to put it with
my other projects. I should still do that.
#+BEGIN_SRC emacs-lisp :tangle init2.el
(autoload 'pony-mode "pony-mode" nil t)
#+END_SRC
~sawfish.el~ has the same problem that ~gtags.el~ and ~po-mode.el~ have.
#+BEGIN_SRC emacs-lisp :tangle init2.el
(autoload 'sawfish-mode "sawfish" nil t)
#+END_SRC
I use =server-running-p= to check whether or not I should start a
new server, but this function isn't autoloaded by default.
#+BEGIN_SRC emacs-lisp :tangle init2.el
(autoload 'server-running-p "server")
#+END_SRC
I was starting to try ~slime-js~ to make JavaScript programming
more interesting, but I haven't gotten around to trying it out
fully, yet. It shares issues with ~gtags.el~, ~po-mode.el~ and
~sawfish.el~.
#+BEGIN_SRC emacs-lisp :tangle init2.el
(autoload 'slime-js-minor-mode "slime-js" nil t)
#+END_SRC
I found ~xmodmap-mode~ on the [[http://emacswiki.org][EmacsWiki]] some time ago, it was
simple and a good example of how to use ~define-generic-mode~, but
since it's not really my project and it's really small it just
sits in my ~site-lisp~ directory.
#+BEGIN_SRC emacs-lisp :tangle init2.el
(autoload 'xmodmap-mode "xmodmap-mode" nil t)
#+END_SRC
~w3m~ also has a setup module like ~geiser-install~, but since I only
ever use these two functions to start it, there is no real need
for anything else.
#+BEGIN_SRC emacs-lisp :tangle init2.el
(autoload 'w3m-bookmark-view "w3m" nil t)
(autoload 'w3m-goto-url "w3m" nil t)
#+END_SRC
* Aliases
There are some functions that are just better than others, no
matter how politically incorrect it might be to admit.
#+STARTUP: showall
#+LINK: yoshi-theme http://ryuslash.org/projects/yoshi-theme.html
* Emacs init
Before doing anything else I should make sure that both the
directories ~/usr/local/emacs/share/emacs/site-lisp~ and
~/usr/share/emacs/site-list~ are included in =load-path=, along with
their subdirectories, but only if they haven't already been added
and exist. Place them at the end of =load-path= so they don't mess up
package precedence.
#+BEGIN_SRC emacs-lisp :tangle init2.el
(eval-and-compile
(defun oni:path-init (dir)
"Add DIR to `load-path' and all its subdirectories, unless
DIR is already in `load-path'."
(unless (or (member dir load-path) (not (file-exists-p dir)))
(let ((default-directory dir))
(add-to-list 'load-path dir t)
(normal-top-level-add-subdirs-to-load-path))))
(oni:path-init "/usr/share/emacs/site-lisp")
(oni:path-init "/usr/local/emacs/share/emacs/site-lisp"))
#+END_SRC
Add my project [[yoshi-theme]] to =custom-theme-load-path= and load it.
#+BEGIN_SRC emacs-lisp :tangle init2.el
(add-to-list 'custom-theme-load-path "~/projects/emacs/yoshi-theme/")
(load-theme 'yoshi t)
#+END_SRC
Remove the ~menu-bar~, ~tool-bar~ and ~scroll-bar~ from the UI since I
don't use them at all.
#+BEGIN_SRC emacs-lisp :tangle init2.el
(menu-bar-mode -1)
(scroll-bar-mode -1)
(tool-bar-mode -1)
#+END_SRC
Add any other interesting paths to =load-path= and, if it exists,
load the ~loaddefs.el~ file from these directories.
#+BEGIN_SRC emacs-lisp :tangle init2.el
(mapc #'(lambda (dir)
(add-to-list 'load-path dir)
(let ((loaddefs (concat dir "/loaddefs.el")))
(when (file-exists-p loaddefs)
(load loaddefs))))
'("~/projects/emacs/mode-icons" "~/.emacs.d/site-lisp"
"~/projects/emacs/pony-mode/src" "~/projects/emacs/php-mode"))
#+END_SRC
Don't ask ~yes~ or ~no~, ask ~y~ or ~n~, I've never had an accidental ~y~ so
far.
#+BEGIN_SRC emacs-lisp :tangle init2.el
(defalias 'yes-or-no-p 'y-or-n-p)
#+END_SRC
Use =ibuffer= instead of the default =list-buffers= because it has many
more features.
#+BEGIN_SRC emacs-lisp :tangle init2.el
(defalias 'list-buffers 'ibuffer)
#+END_SRC
Do the same with =hippie-expand= and =dabbrev-expand=.
#+BEGIN_SRC emacs-lisp :tangle init2.el
(defalias 'dabbrev-expand 'hippie-expand)
#+END_SRC
* Faces
Define faces for use with ~magit~ log edit mode.
Don't show it when ~eldoc~ is running, I almost assume that it is
whenever I'm working in a mode that supports it anyway. This should
only execute once ~eldoc~ has been loaded.
#+BEGIN_SRC emacs-lisp :tangle init2.el
(defface git-commit-summary-face
'((t (:inherit org-level-1)))
"Face for the git title line."
:group 'local)
(defface git-commit-overlong-summary-face
'((t (:background "#873732")))
"Face for commit titles that are too long."
:group 'local)
(defface git-commit-nonempty-second-line-face
'((t (:inherit git-commit-overlong-summary-face)))
"Face for the supposedly empty line in commit messages."
:group 'local)
(eval-after-load "eldoc" '(diminish 'eldoc-mode))
#+END_SRC
* Keys
Use the standard EMMS configuration and add some MPD settings.
With the awesome power of Emacs comes the need for lots of
keybindings.
#+BEGIN_SRC emacs-lisp :tangle init2.el
(defun oni:emms-init ()
"Initialization function for EMMS."
(require 'emms-setup)
(require 'emms-player-mpd)
** Translation
(emms-standard)
Since the ~C-l~ combination is so much easier than ~C-j~ when using
the [[http://colemak.com][colemak]] keyboard layout and ~C-j~ is used so much more, switch
them.
(add-to-list 'emms-info-functions 'emms-info-mpd)
(add-to-list 'emms-player-list 'emms-player-mpd)
#+BEGIN_SRC emacs-lisp tangle init2.el
(define-key key-translation-map (kbd "C-j") (kbd "C-l"))
(define-key key-translation-map (kbd "C-l") (kbd "C-j"))
(setq emms-player-mpd-server-name "localhost")
(setq emms-player-mpd-server-port "6600")
(setq emms-player-mpd-music-directory "/mnt/music/mp3"))
(eval-after-load "emms-source-file" '(oni:emms-init))
(setq emms-source-file-default-directory "/mnt/music/")
#+END_SRC
* Footnotes
[fn:1] Though it doesn't happen often that ~trunk~ is so messed up that
I can't use it.
Add some keybindings for EMMS.
[fn:2] Or perhaps all.
#+BEGIN_SRC emacs-lisp :tangle init2.el
(defun oni:emms-toggle-playing ()
"Toggle between playing/paused states."
(interactive)
(if (eq emms-player-playing-p nil)
(emms-start)
(emms-pause)))
[fn:3] I think it was ~slime-js-minor-mode~, but I'm not sure.
(defun oni:start-emms ()
"Check to see if the function `emms' exists, if not call
`emms-player-mpd-connect' and assume that will have loaded it."
(interactive)
(unless (fboundp 'emms)
(emms-player-mpd-connect))
(emms))
(global-set-key (kbd "<XF86AudioNext>") 'emms-next)
(global-set-key (kbd "<XF86AudioPlay>") 'oni:emms-toggle-playing)
(global-set-key (kbd "<XF86AudioPrev>") 'emms-previous)
(global-set-key (kbd "<XF86AudioStop>") 'emms-stop)
(global-set-key (kbd "<XF86Tools>") 'oni:start-emms)
#+END_SRC
Load ~flymake-cursor~ after loading ~flymake~, add Python and Go to
"allowed" files and add go error output to error patterns.
#+BEGIN_SRC emacs-lisp :tangle init2.el
(defun oni:flymake-init ()
"Initialization function for flymake."
(require 'flymake-cursor)
(add-to-list ; Make sure pyflakes is loaded
'flymake-allowed-file-name-masks ; for python files.
'("\\.py\\'" ext:flymake-pyflakes-init))
(add-to-list ; Error line repexp for go
'flymake-err-line-patterns ; compilation.
'("^\\([a-zA-Z0-9_]+\\.go\\):\\([0-9]+\\):\\(.*\\)$"
1 2 nil 3))
(add-to-list ; Go uses makefiles, makes
'flymake-allowed-file-name-masks ; flymaking 'easy'.
'("\\.go$" flymake-simple-make-init)))
(eval-after-load "flymake" '(oni:flymake-init))
#+END_SRC
Disable the GUI for flymake errors, add a bunch of pep8, flymake
and pyflakes messages to warning and info patterns, set the log
file to somewhere in my home directory and set logging level to 0.
#+BEGIN_SRC emacs-lisp :tangle init2.el
(setq flymake-gui-warnings-enabled nil)
(setq flymake-info-line-regexp
(eval-when-compile
(regexp-opt
'("Invalid name"
"String statement has no effect"
"Missing docstring"
"Empty docstring"
"multiple imports on one line"
"expected 2 blank lines, found 1"
"expected 2 blank lines, found 0"
"TODO:"
"whitespace after '{'"
"whitespace before '}'"
"whitespace before ':'"
"whitespace after '('"
"whitespace before ')'"
"whitespace after '['"
"whitespace before ']'"
"the backslash is redundant between brackets"
"continuation line over-indented for visual indent"
"continuation line under-indented for visual indent"
"Too many statements"
"comparison to None should be"
"missing whitespace around operator"
"missing whitespace after ','"
"line too long"
"at least two spaces before inline comment"
"trailing whitespace"
"imported but unused"
"Unused import"
"too many blank lines"))))
(setq flymake-log-file-name (expand-file-name "~/.emacs.d/flymake.log"))
(setq flymake-log-level 0)
(setq flymake-warn-line-regexp
(eval-when-compile
(regexp-opt '("warning"
"Warning"
"redefinition of unused"
"Redefining built-in"
"Redefining name"
"Unused argument"
"Unused variable"
"Dangerous default value {} as argument"
"no newline at end of file"
"Access to a protected member"))))
#+END_SRC
After loading ~flycheck~ Remove the default python checkers and
replace them with my own, which tries both ~flake8~ and ~pylint~.
#+BEGIN_SRC emacs-lisp :tangle init2.el
(eval-after-load "flycheck"
'(progn
(mapc (lambda (c) (delete c flycheck-checkers))
'(python-pylint python-pyflakes))))
#+END_SRC
** Eshell
Add ~unison~ to the list of =eshell-visual-commands= because it
expects unbuffered input and eshell just doesn't give that.
#+BEGIN_SRC emacs-lisp :tangle init2.el
(eval-after-load "em-term"
'(add-to-list 'eshell-visual-commands "unison"))
#+END_SRC
Don't let eshell highlight it's prompt, this way I can decide the
colors for it myself.
#+BEGIN_SRC emacs-lisp :tangle init2.el
(setq eshell-highlight-prompt nil)
#+END_SRC
In the prompt:
- Show the exit status of the last program/command run represented
by a green ~+~ and a red ~-~ sign.
- Show the current hostname with the =mode-line-buffer-id= face.
- Show an abbreviation of the current directory (as seen in ~fish~)
using the =font-lock-string-face= face.
- If we're in a git repository, show the current branch with the
=font-lock-function-name-face= face.
- Show the status of priviledges in blue.
And set the =eshell-prompt-regexp= to
#+BEGIN_SRC emacs-lisp :tangle init2.el
(defun oni:eshell-prompt-function ()
"Show a pretty shell prompt."
(let ((status (if (zerop eshell-last-command-status) ?+ ?-))
(hostname (shell-command-to-string "hostname"))
(dir (abbreviate-file-name (eshell/pwd)))
(branch
(shell-command-to-string
"git branch --contains HEAD 2>/dev/null | sed -e '/^[^*]/d'"))
(userstatus (if (zerop (user-uid)) ?# ?$)))
(concat
(propertize (char-to-string status)
'face `(:foreground ,(if (= status ?+)
"green"
"red")))
" "
(propertize (substring hostname 0 -1) 'face 'mode-line-buffer-id)
" "
(propertize (oni:shorten-dir dir) 'face 'font-lock-string-face)
" "
(when (not (string= branch ""))
(propertize
;; Cut off "* " and "\n"
(substring branch 2 -1)
'face 'font-lock-function-name-face))
" \n"
(propertize (char-to-string userstatus)
'face `(:foreground "blue"))
"> ")))
(setq eshell-prompt-function 'oni:eshell-prompt-function
eshell-prompt-regexp "^[#$]> ")
#+END_SRC
Don't truncate lines in eshell, wrap them.
#+BEGIN_SRC emacs-lisp :tangle init2.el
(defun oni:eshell-mode-func ()
"Function for `eshell-mode-hook'."
(setq truncate-lines nil))
(add-hook 'eshell-mode-hook 'oni:eshell-mode-func)
#+END_SRC
Bind the ~f8~ key to easily show eshell.
#+BEGIN_SRC emacs-lisp :tangle init2.el
(defun oni:raise-eshell ()
"Start or switch back to `eshell'.
Also change directories to current working directory."
(interactive)
(let ((dir (file-name-directory
(or (buffer-file-name) "~/")))
(hasfile (not (eq (buffer-file-name) nil))))
(eshell)
(if (and hasfile (eq eshell-process-list nil))
(progn
(eshell/cd dir)
(eshell-reset)))))
(global-set-key (kbd "<f8>") 'oni:raise-eshell)
#+END_SRC

View file

@ -39,7 +39,9 @@
(defun dzen-update ()
(let ((strl "")
(strc metal-express-radio-currently-playing)
(strc (if (boundp 'metal-express-radio-currently-playing)
metal-express-radio-currently-playing
""))
(strr (format
"jabber: %s ryu: %d gm: %d aet: %d 9n: %d rss: %d\n"
(oni:current-jabber-status)

View file

@ -27,22 +27,6 @@
(autoload 'notifications-notify "notifications")
(autoload 'jabber-send-message "jabber-chat")
(defmacro oni:define-mailbox (name email &optional signature longname)
"Define a mailbox function for mailbox NAME with address EMAIL.
Optionally set signature to SIGNATURE and use LONGNAME as the
actual account name."
`(defun ,(make-symbol (concat "oni:" name "-mailbox")) ()
,(concat "Settings for " name " mailbox")
(setq mu4e-mu-home ,(expand-file-name (concat "~/.mu/" name))
mu4e-maildir ,(expand-file-name (concat "~/documents/mail/"
(or longname name)))
mu4e-get-mail-command ,(concat "offlineimap -oa " (or longname
name))
mu4e~main-buffer-name ,(concat "*mu4e-" name "*")
user-mail-address ,email
message-sendmail-extra-arguments '("-a" ,name)
message-signature-file ,signature)))
(defmacro oni:email (user at host dot com)
"Turn arguments into an email address.
The resulting email address will look like: USER@HOST.COM, AT and
@ -50,20 +34,6 @@ DOT are intentionally being skipped."
(concat (symbol-name user) "@" (symbol-name host) "."
(symbol-name com)))
(defvar oni:mailbox-map
'("top" ("menu"
("ryulash.org" . "ryuslash")
("ninthfloor" . "ninthfloor")
("gmail" . "gmail")
("aethon" . "aethon")))
"A mailbox map for use with `tmm-prompt'.")
(defvar oni:required-packages
'(graphviz-dot-mode htmlize magit rainbow-delimiters rainbow-mode
yasnippet markdown-mode flymake flymake-cursor sauron expand-region
fill-column-indicator git-auto-commit-mode idomenu magit smex)
"List of all the packages I have (want) installed.")
(defun oni:after-save-func ()
"Function for `after-save-hook'."
(oni:compile-el)
@ -81,7 +51,9 @@ DOT are intentionally being skipped."
nil (format "%s%s (in %s minutes)"
new-time appt-msg min-to-app) nil)
(appt-disp-window min-to-app new-time appt-msg))
;; (jabber-send-message (car jabber-connections)
;; "aethon@muc.ryuslash.org" nil "Hi, I'm a programmatic message; this
;; upens up possibilities :)" "groupchat")
(defun oni:before-save-func ()
"Function for `before-save-hook'."
(if (eq major-mode 'html-mode)
@ -99,6 +71,10 @@ DOT are intentionally being skipped."
(interactive)
(server-save-buffers-kill-terminal nil))
(defun oni:color-for (object)
"Generate a hex color by taking the first 6 characters of OBJECT's MD5 sum."
(format "#%s" (substring (md5 object) 0 6)))
(defun oni:compile-el ()
"Compile the current buffer file if it is an .el file."
(let* ((full-file-name (buffer-file-name))
@ -128,12 +104,10 @@ DOT are intentionally being skipped."
"Function for `emacs-lisp-mode-hook'."
(eldoc-mode))
(defun oni:emms-toggle-playing ()
"Toggle between playing/paused states."
(interactive)
(if (eq emms-player-playing-p nil)
(emms-start)
(emms-pause)))
(defun oni:emacs-startup-func ()
"Function for `emacs-init-hook'."
(require 'auto-complete-config)
(ac-config-default))
(defun oni:erc-mode-func ()
"Function for `erc-mode-hook'."
@ -141,44 +115,6 @@ DOT are intentionally being skipped."
(visual-line-mode)
(setq truncate-lines nil))
(defun oni:eshell-mode-func ()
"Function for `eshell-mode-hook'."
(setq truncate-lines nil))
(defun oni:eshell-prompt-function ()
"Show a pretty shell prompt."
(let ((status (if (zerop eshell-last-command-status) ?+ ?-))
(hostname (shell-command-to-string "hostname"))
(dir (abbreviate-file-name (eshell/pwd)))
(branch
(shell-command-to-string
"git branch --contains HEAD 2>/dev/null | sed -e '/^[^*]/d'"))
(userstatus (if (zerop (user-uid)) ?# ?$)))
(concat
(propertize (char-to-string status)
'face `(:foreground ,(if (= status ?+)
"green"
"red")))
" "
(propertize (substring hostname 0 -1) 'face 'mode-line-buffer-id)
" "
(propertize (oni:shorten-dir dir) 'face 'font-lock-string-face)
" "
(when (not (string= branch ""))
(propertize
;; Cut off "* " and "\n"
(substring branch 2 -1)
'face 'font-lock-function-name-face))
" \n"
(propertize (char-to-string userstatus)
'face `(:foreground "blue"))
"> ")))
(defun oni:flymake-mode-func ()
"Function for `flymake-mode-hook'."
(local-set-key [M-P] 'flymake-goto-prev-error)
(local-set-key [M-N] 'flymake-goto-next-error))
(defun oni:go-mode-func ()
"Function for `go-mode-hook'."
(setq indent-tabs-mode nil)
@ -189,9 +125,28 @@ DOT are intentionally being skipped."
(local-set-key "\M-," 'gtags-find-tag)
(local-set-key "\M-." 'gtags-find-rtag))
(defun oni:haskell-mode-func ()
"Function for `haskell-mode-hook'."
(turn-on-haskell-indentation))
(defun oni:html-mode-func ()
"Function for `html-mode-hook'."
(fci-mode))
(yas-minor-mode)
(fci-mode)
(flycheck-mode))
(defun oni:ido-init ()
"Initialization functionn for ido."
(setq ido-ignore-buffers
(list "^\\` " "^irc\\." "^\\#" "^\\*Customize Option:"
(eval-when-compile
(regexp-opt
'("*-jabber-roster-*"
"*Messages*"
"*fsm-debug*"
"*magit-process*"
"*magit-edit-log*"
"*Backtrace*"))))))
(defun oni:indent-shift-left (start end &optional count)
"Rigidly indent region.
@ -245,6 +200,10 @@ If COUNT has been specified indent by that much, otherwise look at
'(global-mode-string))
header-line-format nil))
(defun oni:jabber-init ()
"Initialization function for jabber."
(remove-hook 'jabber-alert-presence-hooks 'jabber-presence-echo))
(defun oni:jabber-roster-mode-func ()
"Function for `jabber-roster-mode-hook'."
(setq mode-line-format
@ -257,8 +216,7 @@ If COUNT has been specified indent by that much, otherwise look at
(defun oni:js-mode-func ()
"Function for `js-mode-hook'."
(rainbow-delimiters-mode)
(local-set-key "\C-j" 'oni:newline-and-indent)
(pretty-symbols-mode -1))
(local-set-key "\C-j" 'oni:newline-and-indent))
(defun oni:js2-mode-func ()
"Function for `js2-mode-hook'."
@ -292,7 +250,8 @@ If COUNT has been specified indent by that much, otherwise look at
"Function for `lua-mode-hook'."
(local-unset-key (kbd ")"))
(local-unset-key (kbd "]"))
(local-unset-key (kbd "}")))
(local-unset-key (kbd "}"))
(flycheck-mode))
(defun oni:magit-log-edit-mode-func ()
"Function for `magit-log-edit-mode-hook'."
@ -403,29 +362,30 @@ When dealing with braces, add another line and indent that too."
(defun oni:php-mode-func ()
"Function for `php-mode-hook'."
(flymake-mode)
(local-set-key "\C-j" 'oni:newline-and-indent)
(c-set-offset 'arglist-intro '+)
(c-set-offset 'arglist-close '0)
(rainbow-delimiters-mode)
(setq fci-rule-column 80))
(setq-local fci-rule-column 80)
(flycheck-mode))
(defun oni:pretty-control-l-function (win)
"Just make a string of either `fci-rule-colum' or `fill-column'
length -1. Use the `-' character. WIN is ignored."
"Just make a string of either `fci-rule-column' or
`fill-column' length -1. Use the `-' character. WIN is ignored."
(make-string
(1- (if (boundp 'fci-rule-column) fci-rule-column fill-column)) ?-))
(1- (if (boundp 'fci-rule-column)
fci-rule-column fill-column)) ?-))
(defun oni:prog-mode-func ()
"Function for `prog-mode-hook'."
(rainbow-delimiters-mode)
(fci-mode)
(pretty-symbols-mode)
(yas-minor-mode)
(auto-fill-mode))
(defun oni:python-mode-func ()
"Function for `python-mode-hook'."
(flymake-mode)
(flycheck-mode)
(local-set-key (kbd "C->") 'python-indent-shift-right)
(local-set-key (kbd "C-<") 'python-indent-shift-left)
(set (make-local-variable 'electric-indent-chars) nil)
@ -436,6 +396,10 @@ length -1. Use the `-' character. WIN is ignored."
(fci-mode)
(whitespace-mode))
(defun oni:rainbow-mode-init ()
"Initialization function for rainbow-mode."
(diminish 'rainbow-mode))
(defun oni:raise-ansi-term (arg)
"Create or show an `ansi-term' buffer."
(interactive "P")
@ -444,19 +408,6 @@ length -1. Use the `-' character. WIN is ignored."
(switch-to-buffer buffer)
(call-interactively 'ansi-term))))
(defun oni:raise-eshell ()
"Start or switch back to `eshell'.
Also change directories to current working directory."
(interactive)
(let ((dir (file-name-directory
(or (buffer-file-name) "~/")))
(hasfile (not (eq (buffer-file-name) nil))))
(eshell)
(if (and hasfile (eq eshell-process-list nil))
(progn
(eshell/cd dir)
(eshell-reset)))))
(defun oni:raise-scratch (&optional mode)
"Show the *scratch* buffer.
If called with a universal argument, ask the user which mode to
@ -519,16 +470,6 @@ use. If MODE is not nil, open a new buffer with the name
default-directory "' request-pull " (when patchp "-p ")
from " " url " " to))))))
(defun oni:required-packages-installed-p ()
"Check if all the packages I need are installed."
(let ((tmp-packages oni:required-packages)
(result t))
(while (and tmp-packages result)
(if (not (package-installed-p (car tmp-packages)))
(setq result nil))
(setq tmp-packages (cdr tmp-packages)))
result))
(defun oni:rst-mode-func ()
"Function for `rst-mode-hook'."
(auto-fill-mode))
@ -559,6 +500,16 @@ insert at the end of the region and at the beginning."
(interactive)
(message (format "%d:%d" (line-number-at-pos) (current-column))))
(defun oni:show-org-index ()
"Show the index of my org files."
(interactive)
(find-file "~/documents/org/index.org"))
(defun oni:smex-init ()
"Initialization function for smex."
(global-set-key (kbd "M-x") 'smex)
(global-set-key (kbd "C-M-x") 'smex-major-mode-commands))
(defun oni:split-window-interactive (dir)
"Split windows in direction DIR.
@ -582,13 +533,16 @@ If no direction is given, don't split."
((?h) (split-window-horizontally))
(t window))))
(defun oni:start-emms ()
"Check to see if the function `emms' exists, if not call
`emms-player-mpd-connect' and assume that will have loaded it."
(defun oni:start-python-test-mail-server ()
"Run the python test mailserver."
(interactive)
(unless (fboundp 'emms)
(emms-player-mpd-connect))
(emms))
(start-process "python-test-mail-server" "*py-mail-server*" "python" "-m"
"smtpd" "-n" "-c" "DebuggingServer" "localhost:1025"))
(defun oni:stop-python-test-mail-server ()
"Stop the python test mailserver."
(interactive)
(kill-process "python-test-mail-server"))
(defun oni:term-mode-func ()
"Function for `term-mode-hook'."
@ -599,20 +553,6 @@ If no direction is given, don't split."
(setq-local comment-auto-fill-only-comments nil)
(auto-fill-mode))
(defun oni:view-mail (inbox)
"Show a menu with all mailbox options from `oni:mailbox-map'
for easy selection."
(interactive
(list (progn
(require 'tmm)
(let ((tmm-completion-prompt "Choose a mailbox\n"))
(tmm-prompt oni:mailbox-map)))))
(if inbox
(progn
(require 'mu4e)
(funcall (intern (concat "oni:" inbox "-mailbox")))
(mu4e))))
(defun oni:write-file-func ()
"Function for `write-file-hooks'."
(time-stamp))
@ -623,11 +563,25 @@ for easy selection."
(define-key yas-minor-mode-map [(tab)] nil)
(define-key yas-minor-mode-map (kbd "C-\\") 'yas-expand))
(define-skeleton html-tag
"Testing creation of an html tag"
"Tagname:"
"<" str ("Attribute: " " " str "=\"" (skeleton-read "Value: ") "\"") ">\n"
"</" str ">\n")
(defun oni:yasnippet-init ()
"Initialization function for yasnippet."
(diminish 'yas-minor-mode))
(defvar oni:auto-save-name-transforms
`((".*" ,temporary-file-directory t))
"Place all auto-save files in `temporary-file-directory'.")
(defvar oni:backup-directory-alist
`((".*" . ,temporary-file-directory))
"Palce all backup files in `temporary-file-directory'.")
(defvar oni:mailbox-map
'("top" ("menu"
("ryulash.org" . "ryuslash")
("ninthfloor" . "ninthfloor")
("gmail" . "gmail")
("aethon" . "aethon")))
"A mailbox map for use with `tmm-prompt'.")
(provide 'oni)
;;; oni.el ends here

View file

@ -30,16 +30,73 @@
(require 'org-habit)
(require 'org-protocol)
(autoload 'org-clocking-p "org-clock")
(eval-after-load "org-crypt"
'(org-crypt-use-before-save-magic))
(defun oni:note-template ()
(concat
"* %<%c>\n"
" :DIRECTORY: =" default-directory "=\n"
(when (buffer-file-name) " :FILE: [[file:%F][%F]]\n")
(when (org-clocking-p) " :TASK: %K\n")
"\n %?"))
(defun oni:org-maybe-outline-path ()
(let ((outline-path (org-format-outline-path (org-get-outline-path))))
(unless (string= outline-path "")
(setq outline-path (concat "[ " outline-path " ] ")))
outline-path))
(defun oni:set-org-agenda-files ()
"Set `org-agenda-files` according to the current time."
(interactive)
(let* ((current-time (decode-time))
(current-hour (nth 2 current-time))
(current-dow (nth 6 current-time)))
(if (or (= current-dow 6) (= current-dow 0) ; Saturday or Sunday
(< current-hour 9) (>= current-hour 17))
(setq org-agenda-files
(append oni:personal-agenda-files oni:common-agenda-files))
(setq org-agenda-files
(append oni:work-agenda-files oni:common-agenda-files)))))
(defvar oni:personal-agenda-files
(list (expand-file-name "~/documents/org/tasks"))
"My personal agenda, should only show up at times I don't have
to work.")
(defvar oni:work-agenda-files
(list (expand-file-name "~/documents/org/work"))
"My work agenda, should only show up at times I work.")
(defvar oni:common-agenda-files
(list (expand-file-name "~/documents/org/dailies")
(expand-file-name "~/documents/org/misc/contacts.org")
(expand-file-name "~/documents/org/misc/bookmarks.org"))
"Agenda files that are work-agnostic, should always show up.")
(setq org-agenda-custom-commands
'(("w" "Work todo." tags-todo "work")))
'(("P" . "Personal only")
("Pa" "Personal agenda" agenda ""
((org-agenda-files (append oni:personal-agenda-files
oni:common-agenda-files))))
("Pt" "Personal todo" todo ""
((org-agenda-files (append oni:personal-agenda-files
oni:common-agenda-files))))
("W" . "Work only")
("Wa" "Work agenda" agenda ""
((org-agenda-files (append oni:work-agenda-files
oni:common-agenda-files))))
("Wt" "Work todo" todo ""
((org-agenda-files (append oni:work-agenda-files
oni:common-agenda-files))))))
(setq org-agenda-prefix-format
'((agenda . " %i %-12:c%?-12t% s")
(timeline . " % s")
(todo . " %i %-12:c %(concat \"[ \"(org-format-outline-path (org-get-outline-path)) \" ]\") ")
(tags . " %i %-12:c %(concat \"[ \"(org-format-outline-path (org-get-outline-path)) \" ]\") ")
(todo . " %i %-12:c %(oni:org-maybe-outline-path)")
(tags . " %i %-12:c %(oni:org-maybe-outline-path)")
(search . " %i %-12:c")))
(setq org-agenda-sorting-strategy
'((agenda habit-down time-up priority-down category-keep)
@ -47,23 +104,19 @@
(tags priority-down category-keep)
(search category-keep)))
(setq org-agenda-tags-column -101)
(setq org-directory (expand-file-name "~/documents/org"))
(setq org-default-notes-file (concat org-directory "/org"))
(setq org-capture-templates
'(("t" "Task" entry (file "~/documents/org/tasks")
`(("t" "Task" entry (file "~/documents/org/tasks")
"* TODO %?")
("T" "Linked task" entry (file "~/documents/org/tasks")
"* TODO %?\n\n %a")))
"* TODO %?\n\n %a")
("n" "General note" entry (file ,org-default-notes-file)
(function oni:note-template))))
(setq org-contacts-files '("~/documents/org/misc/contacts.org"))
(setq org-directory (expand-file-name "~/documents/org"))
(setq org-agenda-files
(append
`(,(concat org-directory "/tasks")
,(concat org-directory "/misc/contacts.org")
,(concat org-directory "/misc/bookmarks.org"))
org-agenda-files))
(setq org-agenda-show-outline-path nil)
(setq org-agenda-todo-ignore-deadlines 'far)
(setq org-agenda-todo-ignore-scheduled t)
(setq org-default-notes-file (concat org-directory "/org"))
(setq org-export-htmlize-output-type 'css)
(setq org-feed-alist
'(("MyEpisodes"
@ -103,5 +156,9 @@
(org-agenda-to-appt)
(ad-activate 'org-agenda-redo)
(oni:set-org-agenda-files)
(run-at-time "09:01" (* 60 60 24) 'oni:set-org-agenda-files)
(run-at-time "17:01" (* 60 60 24) 'oni:set-org-agenda-files)
(provide 'org-init)
;;; org-init.el ends here

View file

@ -1,4 +1,4 @@
DESTDIR:=$(DESTDIR)/org-mode
objects=codeblock heading
objects=codeblock heading project snippet
include ../../../dotfiles.mk

View file

@ -0,0 +1,51 @@
# -*- mode: snippet -*-
# name: project
# key: project
# --
#+TITLE: ${1:project_name}
#+LINK: src ${2:http://code.ryuslash.org/cgit.cgi/$3$1/}
#+LINK: tar_gz $2${4:snapshot/$1-master}.tar.gz
#+LINK: zip $2$4.zip
#+STARTUP: showall
#+begin_html
<script src="/keyjs.js" type="text/javascript"></script>
<script type="text/javascript">
keyjs_initialize({ "u": [ "keyjs_goto", "../index.html" ],
"h": [ "keyjs_goto", "http://ryuslash.org" ] });
</script>
#+end_html
#+INCLUDE: "dlmenu.inc"
* About
${5:A short description about $1}
| $0Status | $6 |
| Language | $7 |
| License | ${8:GPLv3} |
* Why?
${9:Why did you even think of writing $1?}
* Features
${10:$1 does...}
* Dependencies
${11:$1 needs to have...}
* Download
${12:To download $1...}
* Install
${13:To install $1...}
* Usage
${14:Using $1...}

View file

@ -0,0 +1,14 @@
# -*- mode: snippet -*-
# name: snippet
# key: snippet
# --
#+TITLE: ${1:snippet-name}
#+OPTIONS: toc:nil
* $1
${2:A short description abount $1}
#+BEGIN_SRC $3 :tangle yes
$0
#+END_SRC

View file

@ -1,4 +1,3 @@
# -*- eval: (git-auto-commit-mode 1) -*-
# Playlist
autocenter_mode = "yes"
centered_cursor = "yes"

View file

@ -97,7 +97,7 @@
(set-float-focus-color (colour :black))
(set-float-unfocus-color (colour :aluminium-6))
(set-focus-color (colour :black))
(set-font "-*-dejavu sans mono-medium-r-*-*-15-*-*-*-*-*-iso10646-*")
(set-font "-*-tamsyn-medium-r-normal-*-17-*-*-*-*-0-iso8859-1")
(set-unfocus-color (colour :aluminium-6))
(set-win-bg-color (colour :background))
@ -105,16 +105,14 @@
:butter-1 :sky-blue-1 :plum-1 :cyan
:aluminium-1)))
(setf *input-window-gravity* :bottom-left)
(setf *maxsize-border-width* 1)
(setf *message-window-gravity* :top-right)
(setf *mode-line-background-color* (colour :background))
(setf *mode-line-border-color* (colour :aluminium-6))
(setf *mode-line-foreground-color* (colour :aluminium-1))
(setf *normal-border-width* 1)
(setf *shell-program* (getenv "SHELL"))
(setf *transient-border-width* 1)
(setf *window-border-style* :tight)
(setf *window-format* "%m%50t")
(setf *window-border-style* :thin)
(setf *screen-mode-line-format*
(list "[%n]"
'(:eval
@ -127,15 +125,9 @@
(format-expand *window-formatters* *window-format*
(current-window)))))
(set-prefix-key (kbd "C-i"))
(set-prefix-key (kbd "C-z"))
(define-key *top-map* (kbd "C-M-l") "run-i3lock")
(define-key *top-map* (kbd "KP_Begin") "vsplit")
(define-key *top-map* (kbd "KP_Divide") "remove")
(define-key *top-map* (kbd "KP_Left") "only")
(define-key *top-map* (kbd "KP_Multiply") "fnext")
(define-key *top-map* (kbd "KP_Right") "hsplit")
(define-key *top-map* (kbd "KP_End") "pull-hidden-next")
(define-key *root-map* (kbd "c") "raise-urxvt")
(define-key *root-map* (kbd "C") "run-urxvt")

View file

@ -9,8 +9,11 @@ if [ -d /etc/X11/xinit/xinitrc.d ]; then
unset f
fi
emacs --daemon &
fehlstart &
xflux -l 51.1180 -g 4.0012
unclutter &
mowedline &
xcompmgr -n -r 0 &
feh --bg-tile ~/pictures/wallpapers/wallpaper-864137.jpg
test -n "$1" && wm=$1 || wm="sawfish"
test -n "$1" && wm=$1 || wm="xmonad"
exec $wm

5
.zile Normal file
View file

@ -0,0 +1,5 @@
;; -*- mode: lisp; -*-
(setq inhibit-splash-screen t)
(setq tab-width 4)
(setq indent-tabs-mode nil)
(setq backup-directory "/tmp")

View file

@ -2,6 +2,6 @@ DESTDIR:=$(DESTDIR)/functions
objects=chpwd_show_todo chpwd_update_git_vars env get_cnt line \
precmd_maybe_festival precmd_update_git_vars precmd_update_updates \
preexec_update_vars prompt prompt_git_info rprompt \
update_current_git_vars welcome
update_current_git_vars welcome venv
include ../../dotfiles.mk

15
.zsh/functions/venv Normal file
View file

@ -0,0 +1,15 @@
# -*- mode: sh; -*-
if [ "${#}" -eq 1 ]; then
local venv_activate="$HOME/.virtualenv/$1/bin/activate"
if [ -r "$venv_activate" ]; then
source $venv_activate
else
echo "$1 is not a know virtual environment"
fi
else
echo "Virtual environments: "
for itm in ~/.virtualenv/*; do
echo " $(basename $itm)"
done
fi

7
.zshrc
View file

@ -9,7 +9,7 @@ fpath=($HOME/.zsh/functions $fpath)
autoload -U $HOME/.zsh/functions/*(:t)
# Setup variables
HISTFILE=$ZDOTDIR/histfile
HISTFILE=$HOME/.zsh/histfile
HISTSIZE=1000
SAVEHIST=1000
LESSCMD="/usr/bin/less -FXRS"
@ -30,8 +30,9 @@ alias grep="grep --color=always"
alias less=$LESSCMD
alias ls="ls -F --color=always"
alias mysql="mysql --pager"
alias reboot="systemctl reboot"
alias poweroff="systemctl poweroff"
# Suffix aliases
alias -s pdf="zathura"
setopt notify
setopt PROMPT_SUBST # Allow for functions in the prompt

View file

@ -1,10 +1,12 @@
export DESTDIR:=$(HOME)
modules=.emacs.d .config .conkerorrc .local .moc .mutt .ncmpcpp \
.pentadactyl .sawfish .ssh .w3m .weechat .zsh
.pentadactyl .sawfish .ssh .w3m .weechat .zsh xmonad
objects=.bash_profile .beetsconfig .conky_box.lua .conkyrc .gitconfig \
.guile .hgrc .offlineimap.py .offlineimaprc .screenrc .scwmrc \
.slrnrc .stumpwmrc .tmux.conf .urlview .xbindkeysrc.scm .Xdefaults \
.xinitrc .Xmodmap .xsession .zprofile .zshrc
.xinitrc .Xmodmap .xsession .zprofile .zshrc .zile
export MAKEROOT=y
include dotfiles.mk

View file

@ -16,47 +16,77 @@ define older =
$(shell if [ "$(1)" -ot "$(DESTDIR)/$(1)" ]; then echo "older"; fi)
endef
install-objects=$(addprefix install-,$(objects))
uninstall-objects=$(addprefix uninstall-,$(objects))
check-objects=$(addprefix check-,$(objects))
install-objects=$(addprefix install-,$(objects))
reverse-objects=$(addprefix reverse-,$(objects))
uninstall-objects=$(addprefix uninstall-,$(objects))
install-modules=$(addprefix install-,$(modules))
uninstall-modules=$(addprefix uninstall-,$(modules))
check-modules=$(addprefix check-,$(modules))
install-modules=$(addprefix install-,$(modules))
reverse-modules=$(addprefix reverse-,$(modules))
uninstall-modules=$(addprefix uninstall-,$(modules))
.PHONY: all install uninstall check uninstall $(modules) \
$(install-objects) $(uninstall-objects) $(check-objects) \
$(install-modules) $(uninstall-modules) $(check-modules)
$(install-modules) $(uninstall-modules) $(check-modules) \
$(reverse) $(reverse-objects) $(reverse-modules)
all: $(modules) $(objects)
install: $(install-modules) $(install-objects)
ifeq ($(MAKEROOT),y)
check: $(check-modules) $(check-objects)
install: $(install-modules) $(install-objects)
reverse: $(reverse-modules) $(reverse-objects)
uninstall: $(uninstall-modules) $(uninstall-objects)
else
check:
@$(MAKE) -s -C ../ check
install:
@$(MAKE) -s -C ../ install
reverse:
@$(MAKE) -s -C ../ reverse
uninstall:
@$(MAKE) -s -C ../ uninstall
endif
$(modules): %:
@echo $(MAKEFILES)
@$(MAKE) -C $*
$(MAKE) -C $*
$(install-objects): install-%: %
$(if $(call newer,$*), \
install -pDm $(MODE) "$*" "$(DESTDIR)/$*")
@$(if $(call newer,$*), \
echo -e "$(FG_GRE)+ $(FG_YEL)$(MKDPREFIX)$* $(CLR_RE)to $(DESTDIR) as $(MODE)"; \
install -pDm $(MODE) "$*" "$(DESTDIR)/$*", \
echo -e "$(FG_RED)- $(FG_YEL)$(MKDPREFIX)$*$(CLR_RE)")
$(install-modules): install-%:
@$(MAKE) -C $* install
@$(MAKE) -s -C $* install MKDPREFIX=$(MKDPREFIX)$*/
$(reverse-objects): reverse-%:
@$(if $(call older,$*), \
echo -e "$(FG_GRE)+ $(FG_YEL)$(MKDPREFIX)$*$(CLR_RE)"; \
cp -a "$(DESTDIR)/$*" "$*", \
echo -e "$(FG_RED)- $(FG_YEL)$(MKDPREFIX)$*$(CLR_RE)")
$(reverse-modules): reverse-%:
@$(MAKE) -s -C $* reverse MKDPREFIX=$(MKDPREFIX)$*/
$(uninstall-objects): uninstall-%:
$(if $(call newer,$*),rm -f "$(DESTDIR)/$*")
@$(if $(call older,$*), \
echo -e "$(FG_RED)+ $(FG_YEL)$(MKDPREFIX)$*$(CLR_RE)", \
echo -e "$(FG_GRE)- $(FG_YEL)$(MKDPREFIX)$*$(CLR_RE)"; \
rm -f "$(DESTDIR)/$*")
$(uninstall-modules): uninstall-%:
@$(MAKE) -C $* uninstall
@$(MAKE) -C $* uninstall MKDPREFIX=$(MKDPREFIX)$*/
$(check-objects): check-%:
@$(if $(call newer,$*), \
echo -e "$(FG_YEL)$* $(FG_GRE)newer$(CLR_RE)!", \
echo -e "$(FG_GRE)+ $(FG_YEL)$(MKDPREFIX)$*$(CLR_RE)", \
$(if $(call older,$*), \
echo -e "$(FG_YEL)$* $(FG_RED)older$(CLR_RE)."))
echo -e "$(FG_RED)- $(FG_YEL)$(MKDPREFIX)$*$(CLR_RE)", \
echo -e "$(FG_BLU)= $(FG_YEL)$(MKDPREFIX)$*$(CLR_RE)"))
$(check-modules): check-%:
@$(MAKE) -C $* check
@$(MAKE) -s -C $* check MKDPREFIX=$(MKDPREFIX)$*/
$(filter %.elc,$(objects)): %.elc: %.el
$(call compile,$^)

3
xmonad/.gitignore vendored Normal file
View file

@ -0,0 +1,3 @@
*.o
xmonad-x86_64-linux
xmonad.hi

10
xmonad/Makefile Normal file
View file

@ -0,0 +1,10 @@
DESTDIR := $(DESTDIR)/.xmonad
objects=xmonad-x86_64-linux xmonad.hs
GHC := ghc
include ../dotfiles.mk
xmonad-x86_64-linux: xmonad.hs
$(GHC) --make $^ -i -ilib -fforce-recomp -main-is main -v0 -o $@
install-xmonad-x86_64-linux: MODE=744

48
xmonad/xmonad.hs Normal file
View file

@ -0,0 +1,48 @@
--
-- It overrides a few basic settings, reusing all other defaults.
--
import XMonad
import XMonad.Actions.WindowGo
import XMonad.Hooks.FadeInactive
import XMonad.Hooks.ManageDocks
import XMonad.Hooks.ManageHelpers
import XMonad.Util.EZConfig
import qualified XMonad.StackSet as W
myLogHook :: X ()
myLogHook = fadeOutLogHook fadeRules
fadeRules :: Query Rational
fadeRules = do
fullscreen <- isFullscreen
conkeror <- className =? "Conkeror"
return $ case () of _ | fullscreen -> 1
| conkeror -> 0.95
| otherwise -> 0.9
main = xmonad $ defaultConfig
{ terminal = "urxvt"
, focusFollowsMouse = False
, clickJustFocuses = False
, modMask = mod4Mask
, layoutHook = avoidStruts $ layoutHook defaultConfig
, logHook = myLogHook
, manageHook = manageHook defaultConfig <+> manageDocks }
`additionalKeysP`
[
("C-z ,", screenWorkspace 0 >>= flip whenJust (windows . W.view)),
("C-z .", screenWorkspace 1 >>= flip whenJust (windows . W.view)),
("C-z S-c", spawn "urxvt"),
("C-z S-e", spawn "emacsclient -ca emacs"),
("C-z c", runOrRaiseNext "urxvt" (className =? "URxvt")),
("C-z e", runOrRaiseNext "emacsclient -ca emacs" (className =? "Emacs")),
("C-z w", runOrRaiseNext "conkeror" (className =? "Conkeror")),
("M-S-1", spawn "dmenu_run"),
("M-n", windows W.focusDown),
("M-p", windows W.focusUp),
("M1-C-l", spawn "i3lock -c 000000")
]
`removeKeysP`
[ ("M-j"), ("M-k") ]