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.internalBorder: 0
urxvt.loginShell: true 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.keysym.M-u: perl:url-select:select_next
urxvt.font: xft:Monaco:weight=medium:pixelsize=18 urxvt.font: xft:Envy Code R:weight=medium:pixelsize=18
urxvt.boldFont: xft:Monaco:weight=black:pixelsize=18 urxvt.boldFont: xft:Envy Code R:weight=bold:pixelsize=18
! urxvt.italicFont: xft:Monaco:slant=italic: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.foreground: #eeeeec
urxvt.color0: #171719 urxvt.color0: #171719

View file

@ -1,16 +1,62 @@
require("awful") -- Standard awesome library
require("awful.autofocus") local gears = require("gears")
require("awful.rules") local awful = require("awful")
require("beautiful") -- Widget and layout library
require("bowl") local wibox = require("wibox")
require("keychain") -- Theme handling library
require("naughty") local beautiful = require("beautiful")
require("ext") -- Notification library
require("oni") local naughty = require("naughty")
local menubar = require("menubar")
local lfs = require("lfs")
--- Error handling awful.rules = require("awful.rules")
-- Check if awesome encountered an error during startup and fell back to require("awful.autofocus")
-- another config (This code will only ever execute for the fallback config)
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 if awesome.startup_errors then
naughty.notify({ preset = naughty.config.presets.critical, naughty.notify({ preset = naughty.config.presets.critical,
title = "Oops, there were errors during startup!", title = "Oops, there were errors during startup!",
@ -20,7 +66,7 @@ end
-- Handle runtime errors after startup -- Handle runtime errors after startup
do do
local in_error = false 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 -- Make sure we don't go into an endless error loop
if in_error then return end if in_error then return end
in_error = true in_error = true
@ -31,33 +77,26 @@ do
in_error = false in_error = false
end) end)
end end
-- {{{ Variable definitions ----- Variable definitions
-- Themes define colours, icons, and wallpapers -- Themes define colours, icons, and wallpapers
beautiful.init("/home/slash/.config/awesome/themes/custom/theme.lua") beautiful.init("/usr/share/awesome/themes/default/theme.lua")
bowl.init({ use_timers = true, timeout = 1 })
bowl.default_setup()
keychain.init({ escapes = {
keychain.keystroke ({ }, "Escape"),
keychain.keystroke ({ "Control", }, "g")
} })
-- This is used later as the default terminal and editor to run. -- This is used later as the default terminal and editor to run.
terminal = "urxvt" terminal = "urxvt"
editor = os.getenv("EDITOR") or "nano" editor = os.getenv("EDITOR") or "nano"
editor_cmd = terminal .. " -e " .. editor editor_cmd = terminal .. " -e " .. editor
-- Default modkey. ----- Default modkey.
-- Usually, Mod4 is the key with a logo between Control and Alt. -- Usually, Mod4 is the key with a logo between Control and Alt. If
-- If you do not like this or do not have such a key, -- you do not like this or do not have such a key, I suggest you to
-- I suggest you to remap Mod4 to another key using xmodmap or other tools. -- remap Mod4 to another key using xmodmap or other tools. However,
-- However, you can use another modifier like Mod1, but it may interact with others. -- you can use another modifier like Mod1, but it may interact with
-- others.
modkey = "Mod4" modkey = "Mod4"
-- Table of layouts to cover with awful.layout.inc, order matters. -- Table of layouts to cover with awful.layout.inc, order matters.
layouts = local layouts =
{ {
awful.layout.suit.magnifier, awful.layout.suit.magnifier,
awful.layout.suit.tile, awful.layout.suit.tile,
@ -66,22 +105,29 @@ layouts =
awful.layout.suit.tile.top, awful.layout.suit.tile.top,
awful.layout.suit.fair, awful.layout.suit.fair,
awful.layout.suit.fair.horizontal, awful.layout.suit.fair.horizontal,
awful.layout.suit.spiral,
awful.layout.suit.spiral.dwindle,
awful.layout.suit.max, awful.layout.suit.max,
awful.layout.suit.max.fullscreen, awful.layout.suit.max.fullscreen,
awful.layout.suit.floating awful.layout.suit.floating
} }
-- }}}
----- Wallpaper
-- {{{ Tags 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. -- Define a tag table which hold all screen tags.
tags = {} tags = {}
for s = 1, screen.count() do for s = 1, screen.count() do
-- Each screen has its own tag table. -- Each screen has its own tag table.
tags[s] = awful.tag({ 1, 2, 3, 4, 5, 6, 7, 8, 9 }, s, layouts[1]) tags[s] = awful.tag({ 1, 2, 3, 4, 5, 6, 7, 8, 9 }, s, layouts[1])
end end
-- }}}
----- Menu
-- {{{ Menu
-- Create a laucher widget and a main menu -- Create a laucher widget and a main menu
myawesomemenu = { myawesomemenu = {
{ "manual", terminal .. " -e man awesome" }, { "manual", terminal .. " -e man awesome" },
@ -90,209 +136,217 @@ myawesomemenu = {
{ "quit", awesome.quit } { "quit", awesome.quit }
} }
mymainmenu = awful.menu({ items = { { "awesome", myawesomemenu, beautiful.awesome_icon }, mymainmenu = awful.menu(
{ "open terminal", terminal } { 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 }) menu = mymainmenu })
-- }}}
-- {{{ Wibox -- Menubar configuration
menubar.utils.terminal = terminal -- Set the terminal for applications
-- that require it
----- Wibox
-- Create a textclock widget -- Create a textclock widget
mytextclock = awful.widget.textclock({ align = "right" }) mytextclock = awful.widget.textclock()
-- Create a systray
mysystray = widget({ type = "systray" })
-- Create a wibox for each screen and add it -- Create a wibox for each screen and add it
mywibox = {} mywibox = {}
mypromptbox = {} mypromptbox = {}
mylayoutbox = {} mylayoutbox = {}
mytaglist = {} 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 = {}
mytasklist.buttons = awful.util.table.join(
awful.button({ }, 1, function (c) mymaillist = wibox.widget.textbox()
if c == client.focus then mymaillist:set_text(
c.minimized = true string.format(" ryu: %d gmail: %d aethon: %d 9f: %d",
else new_mail('ryuslash.org/inbox'),
if not c:isvisible() then new_mail('gmail/inbox'),
awful.tag.viewonly(c:tags()[1]) new_mail('aethon/inbox'),
end new_mail('ninthfloor/inbox')))
-- This will also un-minimize mymaillisttimer = timer({ timeout = 60 })
-- the client, if needed mymaillisttimer:connect_signal(
client.focus = c "timeout",
c:raise() function ()
end mymaillist:set_text(
end), string.format(" ryu: %d gmail: %d aethon: %d 9f: %d",
awful.button({ }, 3, function () new_mail('ryuslash.org/inbox'),
if instance then new_mail('gmail/inbox'),
instance:hide() new_mail('aethon/inbox'),
instance = nil new_mail('ninthfloor/inbox')))
else end)
instance = awful.menu.clients({ width=250 }) mymaillisttimer:start()
end
end), mytodolist = wibox.widget.textbox()
awful.button({ }, 4, function () mytodolist:set_text(
awful.client.focus.byidx(1) string.format(" ptodo: %d wtodo: %d",
if client.focus then client.focus:raise() end awful.util.pread("todo-count t"),
end), awful.util.pread("todo-count w")))
awful.button({ }, 5, function () mytodolisttimer = timer({ timeout = 60 * 60 })
awful.client.focus.byidx(-1) mytodolisttimer:connect_signal(
if client.focus then client.focus:raise() end "timeout",
end)) 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 for s = 1, screen.count() do
-- Create a promptbox for each screen -- Create a promptbox for each screen
mypromptbox[s] = awful.widget.prompt({ layout = awful.widget.layout.horizontal.leftright }) mypromptbox[s] = awful.widget.prompt()
-- Create an imagebox widget which will contains an icon indicating which layout we're using. -- Create an imagebox widget which will contains an icon
-- We need one layoutbox per screen. -- indicating which layout we're using. We need one layoutbox per
-- screen.
mylayoutbox[s] = awful.widget.layoutbox(s) 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 -- 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 -- Create a tasklist widget
mytasklist[s] = awful.widget.tasklist(function(c) mytasklist[s] = awful.widget.tasklist(
return awful.widget.tasklist.label.currenttags(c, s) s, awful.widget.tasklist.filter.currenttags, mytasklist.buttons)
end, mytasklist.buttons)
-- Create the wibox -- Create the wibox
mywibox[s] = awful.wibox({ position = "top", screen = s }) mywibox[s] = awful.wibox({ position = "top", screen = s })
-- Add widgets to the wibox - order matters
mywibox[s].widgets = { -- Widgets that are aligned to the left
{ local left_layout = wibox.layout.fixed.horizontal()
mylauncher, left_layout:add(mylauncher)
mytaglist[s], left_layout:add(mytaglist[s])
mypromptbox[s], left_layout:add(mypromptbox[s])
layout = awful.widget.layout.horizontal.leftright
}, -- Widgets that are aligned to the right
mylayoutbox[s], local right_layout = wibox.layout.fixed.horizontal()
mytextclock, if s == 1 then
s == 1 and mysystray or nil, right_layout:add(mytodolist)
mytasklist[s], right_layout:add(mymaillist)
layout = awful.widget.layout.horizontal.rightleft right_layout:add(wibox.widget.systray())
}
end end
-- }}} right_layout:add(mytextclock)
right_layout:add(mylayoutbox[s])
-- {{{ Mouse bindings -- Now bring it all together (with the tasklist in the middle)
root.buttons(awful.util.table.join( local layout = wibox.layout.align.horizontal()
awful.button({ }, 3, function () mymainmenu:toggle() end), layout:set_left(left_layout)
awful.button({ }, 4, awful.tag.viewnext), layout:set_middle(mytasklist[s])
awful.button({ }, 5, awful.tag.viewprev) layout:set_right(right_layout)
))
-- }}}
-- {{{ Key bindings mywibox[s]:set_widget(layout)
local bind = keychain end
local sub = keychain.sub
----- Key bindings
globalkeys = awful.util.table.join( 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, }, "Left", awful.tag.viewprev),
awful.key({ modkey, }, "Right", awful.tag.viewnext), awful.key({ modkey, }, "Right", awful.tag.viewnext),
awful.key({ modkey, }, "Escape", awful.tag.history.restore), 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 -- Layout manipulation
awful.key({ modkey, "Shift" }, "j", function () awful.client.swap.byidx( 1) end), awful.key({ modkey, "Shift" }, "n",
awful.key({ modkey, "Shift" }, "k", function () awful.client.swap.byidx( -1) end), 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, }, "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 -- 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, "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, }, "l",
awful.key({ modkey, }, "h", function () awful.tag.incmwfact(-0.05) end), function () awful.tag.incmwfact( 0.05) end),
awful.key({ modkey, "Shift" }, "h", function () awful.tag.incnmaster( 1) end), awful.key({ modkey, }, "h",
awful.key({ modkey, "Shift" }, "l", function () awful.tag.incnmaster(-1) end), function () awful.tag.incmwfact(-0.05) end),
awful.key({ modkey, "Control" }, "h", function () awful.tag.incncol( 1) end), awful.key({ modkey, "Shift" }, "h",
awful.key({ modkey, "Control" }, "l", function () awful.tag.incncol(-1) end), function () awful.tag.incnmaster(1) end),
awful.key({ modkey, }, "space", function () awful.layout.inc(layouts, 1) end), awful.key({ modkey, "Shift" }, "l",
awful.key({ modkey, "Shift" }, "space", function () awful.layout.inc(layouts, -1) end), 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 -- 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", awful.key({ modkey }, "x",
function () function ()
awful.prompt.run({ prompt = "Run Lua code: " }, awful.prompt.run(
{ prompt = "Run Lua code: " },
mypromptbox[mouse.screen].widget, mypromptbox[mouse.screen].widget,
awful.util.eval, nil, awful.util.eval, nil,
awful.util.getdir("cache") .. "/history_eval") awful.util.getdir("cache") .. "/history_eval")
end) 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( clientkeys = awful.util.table.join(
awful.key({ modkey, }, "f", function (c) c.fullscreen = not c.fullscreen end), awful.key({ modkey, }, "f",
awful.key({ modkey, "Shift" }, "c", function (c) c:kill() end), function (c) c.fullscreen = not c.fullscreen end),
awful.key({ modkey, "Control" }, "space", awful.client.floating.toggle ), awful.key({ modkey, "Shift" }, "c",
awful.key({ modkey, "Control" }, "Return", function (c) c:swap(awful.client.getmaster()) end), function (c) c:kill() end),
awful.key({ modkey, }, "o", awful.client.movetoscreen ), awful.key({ modkey, "Control" }, "space",
awful.key({ modkey, "Shift" }, "r", function (c) c:redraw() end), 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, }, "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", awful.key({ modkey, }, "m",
function (c) function (c)
c.maximized_horizontal = not c.maximized_horizontal c.maximized_horizontal = not c.maximized_horizontal
c.maximized_vertical = not c.maximized_vertical c.maximized_vertical = not c.maximized_vertical
end) end))
)
-- Compute the maximum number of digit we need, limited to 9 -- Compute the maximum number of digit we need, limited to 9
keynumber = 0 keynumber = 0
for s = 1, screen.count() do 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 end
-- Bind all key numbers to tags. -- Bind all key numbers to tags. Be careful: we use keycodes to make
-- Be careful: we use keycodes to make it works on any keyboard layout. -- it works on any keyboard layout. This should map on the top row of
-- This should map on the top row of your keyboard, usually 1 to 9. -- your keyboard, usually 1 to 9.
for i = 1, keynumber do for i = 1, keynumber do
globalkeys = awful.util.table.join(globalkeys, globalkeys = awful.util.table.join(
globalkeys,
awful.key({ modkey }, "#" .. i + 9, awful.key({ modkey }, "#" .. i + 9,
function () function ()
local screen = mouse.screen local screen = mouse.screen
@ -321,63 +375,50 @@ for i = 1, keynumber do
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 -- Set keys
root.keys(globalkeys) root.keys(globalkeys)
-- }}}
----- Rules
-- {{{ Rules
awful.rules.rules = { awful.rules.rules = {
-- All clients will match this rule. -- All clients will match this rule.
{ rule = { }, { rule = { },
properties = { border_width = beautiful.border_width, properties = { border_width = beautiful.border_width,
border_color = beautiful.border_normal, border_color = beautiful.border_normal,
focus = true, focus = awful.client.focus.filter,
keys = clientkeys, keys = clientkeys } },
buttons = clientbuttons } },
{ rule = { class = "MPlayer" },
properties = { floating = true } },
{ rule = { class = "pinentry" }, { rule = { class = "pinentry" },
properties = { floating = true } }, properties = { floating = true } },
{ rule = { class = "gimp" }, { rule = { class = "gimp" },
properties = { floating = true } }, 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. -- Set Firefox to always map on tags number 2 of screen 1.
-- { rule = { class = "Firefox" }, -- { rule = { class = "Firefox" },
-- properties = { tag = tags[1][2] } }, -- properties = { tag = tags[1][2] } },
} }
-- }}}
----- Signals
-- {{{ Signals
-- Signal function to execute when a new client appears. -- Signal function to execute when a new client appears.
client.add_signal("manage", function (c, startup) client.connect_signal(
-- Add a titlebar "manage",
-- awful.titlebar.add(c, { modkey = modkey }) function (c, startup)
-- 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)
if not startup then if not startup then
-- Set the windows at the slave, -- Set the windows at the slave, i.e. put it at the end of
-- i.e. put it at the end of others instead of setting it master. -- others instead of setting it master.
-- awful.client.setslave(c) -- awful.client.setslave(c)
-- Put windows in a smart way, only if they does not set an initial position. -- Put windows in a smart way, only if they does not set an
if not c.size_hints.user_position and not c.size_hints.program_position then -- 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_overlap(c)
awful.placement.no_offscreen(c) awful.placement.no_offscreen(c)
end end
end end
end) end)
client.add_signal("focus", function(c) c.border_color = beautiful.border_focus end) client.connect_signal(
client.add_signal("unfocus", function(c) c.border_color = beautiful.border_normal end) "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 DESTDIR:=$(DESTDIR)/.conkerorrc
modules=themes modules=themes styles
objects=gtk2rc init.js objects=gtk2rc init.js ext_restore.js
include ../dotfiles.mk 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("content-policy.js");
require("favicon"); 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/"); theme_load_paths.push("/home/slash/.conkerorrc/themes/");
require("linkwave"); require("markam");
define_browser_object_class( define_browser_object_class(
"history-url", null, "history-url", null,
@ -23,6 +23,15 @@ function ext_title_format(window) {
+ window.buffers.current.description; + 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() { function oni_before_quit_func() {
var w = get_recent_conkeror_window(); var w = get_recent_conkeror_window();
var result = (w == null) || var result = (w == null) ||
@ -112,18 +121,43 @@ define_webjump("arch/packages",
"https://www.archlinux.org/packages/?sort=&q=%s&limit=50", "https://www.archlinux.org/packages/?sort=&q=%s&limit=50",
$alternative="https://packages.archlinux.org"); $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; // content_policy_bytype_table.object = oni_block_flash;
cwd = make_file("/home/slash/downloads/"); cwd = make_file("/home/slash/downloads/");
hint_digits = "arstdhneio"; hint_digits = "arstdhneio";
read_buffer_show_icons = true; read_buffer_show_icons = true;
title_format_fn = ext_title_format; title_format_fn = ext_title_format;
url_remoting_fn = load_url_in_new_buffer; 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-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"); define_key(default_base_keymap, "C-x f", "follow-new-buffer");
add_hook("before_quit_hook", oni_before_quit_func); 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) 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) { 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_handler_list = [read_url_local_port_handler,
read_url_github_command_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")) (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 (defface git-commit-summary-face
'((t (:inherit org-level-1))) '((t (:inherit org-level-1)))
"Face for the git title line." "Face for the git title line."
@ -30,69 +23,31 @@
"Face for the supposedly empty line in commit messages." "Face for the supposedly empty line in commit messages."
:group 'local) :group 'local)
(eval-after-load "eldoc" (eval-after-load "ido" '(oni:ido-init))
'(diminish 'eldoc-mode)) (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" (autoload 'define-slime-contrib "slime")
'(add-to-list 'eshell-visual-commands "unison")) (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" (require 'geiser-install)
'(progn (require 'uniquify)
(require 'emms-setup) (require 'ext)
(require 'emms-player-mpd) (require 'oni)
(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))
(put 'upcase-region 'disabled nil) (put 'upcase-region 'disabled nil)
(put 'downcase-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-disp-window-function #'oni:appt-display-window-and-jabber)
(setq appt-display-diary nil) (setq appt-display-diary nil)
(setq auto-mode-case-fold nil) (setq auto-mode-case-fold nil)
(setq auto-save-file-name-transforms (setq auto-save-file-name-transforms oni:auto-save-name-transforms)
`((".*" ,temporary-file-directory t)))
(setq avandu-article-render-function #'avandu-view-w3m) (setq avandu-article-render-function #'avandu-view-w3m)
(setq backup-directory-alist (setq backup-directory-alist oni:backup-directory-alist)
`((".*" . ,temporary-file-directory)))
(setq browse-url-browser-function 'browse-url-generic) (setq browse-url-browser-function 'browse-url-generic)
(setq browse-url-generic-program (getenv "BROWSER")) (setq browse-url-generic-program (getenv "BROWSER"))
(setq c-offsets-alist '((statement-block-intro . +) (setq c-offsets-alist '((statement-block-intro . +)
@ -141,75 +94,30 @@
(vertical-scroll-bars . nil) (vertical-scroll-bars . nil)
(menu-bar-lines . nil) (menu-bar-lines . nil)
(tool-bar-lines . nil) (tool-bar-lines . nil)
(font . "monaco-12"))) (font . "Envy Code R:pixelsize=18")
(setq emms-source-file-default-directory "/mnt/music/") (alpha 90 90)))
(setq elnode-do-init nil)
(setq erc-autojoin-channels-alist (setq erc-autojoin-channels-alist
'(("freenode.net" "#ninthfloor" "#emacs" "#dispass"))) '(("freenode.net" "#ninthfloor" "#emacs")))
(setq erc-hide-list '("JOIN" "PART" "QUIT")) (setq erc-hide-list '("JOIN" "PART" "QUIT"))
(setq erc-insert-timestamp-function 'erc-insert-timestamp-left) (setq erc-insert-timestamp-function 'erc-insert-timestamp-left)
(setq erc-nick "ryuslash") (setq erc-nick "ryuslash")
(setq erc-timestamp-format "[%H:%M] ") (setq erc-timestamp-format "[%H:%M] ")
(setq erc-timestamp-only-if-changed-flag nil) (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 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 frame-title-format '(:eval (concat "emacs: " (buffer-name))))
(setq geiser-repl-history-filename "~/.emacs.d/geiser-history") (setq geiser-repl-history-filename "~/.emacs.d/geiser-history")
(setq gnus-init-file "~/.emacs.d/gnus") (setq gnus-init-file "~/.emacs.d/gnus")
(setq gtags-auto-update t) (setq gtags-auto-update t)
(setq help-at-pt-display-when-idle 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-auto-merge-delay-time 1000000)
(setq ido-default-buffer-method 'selected-window) (setq ido-default-buffer-method 'selected-window)
(setq ido-max-window-height 1) (setq ido-max-window-height 1)
(setq ido-save-directory-list-file nil) (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 inferior-lisp-program "sbcl")
(setq inhibit-default-init t) (setq inhibit-default-init t)
(setq inhibit-local-menu-bar-menus t) (setq inhibit-local-menu-bar-menus t)
@ -217,15 +125,16 @@
(setq initial-major-mode 'emacs-lisp-mode) (setq initial-major-mode 'emacs-lisp-mode)
(setq initial-scratch-message nil) (setq initial-scratch-message nil)
(setq jabber-account-list '(("ryuslash@jabber.org") (setq jabber-account-list '(("ryuslash@jabber.org")
("tom@ryuslash.org" ("tom@ryuslash.org/Emacs"
(:connection-type . ssl)))) (: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-buffer-show-avatar nil)
(setq jabber-chat-fill-long-lines nil) (setq jabber-chat-fill-long-lines nil)
(setq jabber-chat-foreign-prompt-format "%t <\n") (setq jabber-chat-foreign-prompt-format "%t %u/%r <\n")
(setq jabber-chat-local-prompt-format "%t >\n") (setq jabber-chat-local-prompt-format "%t %u/%r >\n")
(setq jabber-chatstates-confirm nil) (setq jabber-chatstates-confirm nil)
(setq jabber-history-dir "~/.emacs.d/jabber") (setq jabber-history-dir "~/.emacs.d/jabber")
(setq jabber-muc-autojoin '("aethon@muc.ryuslash.org"))
(setq jabber-roster-show-bindings nil) (setq jabber-roster-show-bindings nil)
(setq jit-lock-defer-time 0.2) (setq jit-lock-defer-time 0.2)
(setq magit-repo-dirs '("~/projects/" "~/var/src/")) (setq magit-repo-dirs '("~/projects/" "~/var/src/"))
@ -234,9 +143,8 @@
(setq message-sendmail-extra-arguments '("-a" "ryuslash")) (setq message-sendmail-extra-arguments '("-a" "ryuslash"))
(setq package-archives (setq package-archives
'(("melpa" . "http://melpa.milkbox.net/packages/") '(("melpa" . "http://melpa.milkbox.net/packages/")
("ELPA" . "http://tromey.com/elpa/") ("marmalade" . "http://marmalade-repo.org/packages/")
("gnu" . "http://elpa.gnu.org/packages/") ("gnu" . "http://elpa.gnu.org/packages/")))
("marmalade" . "http://marmalade-repo.org/packages/")))
(setq package-load-list '((htmlize "1.39") (setq package-load-list '((htmlize "1.39")
(lua-mode "20111107") (lua-mode "20111107")
all)) all))
@ -249,6 +157,7 @@
(setq redisplay-dont-pause t) (setq redisplay-dont-pause t)
(setq send-mail-function 'smtpmail-send-it) (setq send-mail-function 'smtpmail-send-it)
(setq sendmail-program "/usr/bin/msmtp") (setq sendmail-program "/usr/bin/msmtp")
(setq sentence-end-double-space nil)
(setq smex-key-advice-ignore-menu-bar t) (setq smex-key-advice-ignore-menu-bar t)
(setq smex-save-file "~/.emacs.d/smex-items") (setq smex-save-file "~/.emacs.d/smex-items")
(setq split-height-threshold 40) (setq split-height-threshold 40)
@ -272,12 +181,12 @@
(add-hook 'c-mode-hook 'oni:c-mode-func) (add-hook 'c-mode-hook 'oni:c-mode-func)
(add-hook 'css-mode-hook 'oni:css-mode-func) (add-hook 'css-mode-hook 'oni:css-mode-func)
(add-hook 'diary-display-hook 'oni:diary-display-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 'emacs-lisp-mode-hook 'oni:emacs-lisp-mode-func)
(add-hook 'erc-mode-hook 'oni:erc-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 'go-mode-hook 'oni:go-mode-func)
(add-hook 'gtags-mode-hook 'oni:gtags-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 'html-mode-hook 'oni:html-mode-func)
(add-hook 'jabber-alert-message-hooks 'oni:jabber-alert-message-func) (add-hook 'jabber-alert-message-hooks 'oni:jabber-alert-message-func)
(add-hook 'jabber-chat-mode-hook 'oni:jabber-chat-mode-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 'write-file-hooks 'oni:write-file-func)
(add-hook 'yas-minor-mode-hook 'oni:yas-minor-mode-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 "'") '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 "<XF86HomePage>") 'oni:raise-scratch)
(global-set-key (kbd "<XF86Mail>") 'oni:view-mail) (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 "<f10>") 'git-project-show-files)
(global-set-key (kbd "<f5>") 'ext:reload-buffer) (global-set-key (kbd "<f5>") 'ext:reload-buffer)
(global-set-key (kbd "<f6>") 'jabber-switch-to-roster-buffer) (global-set-key (kbd "<f6>") 'jabber-switch-to-roster-buffer)
(global-set-key (kbd "<f7>") 'magit-status) (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-left)
(global-set-key (kbd "C->") 'oni:indent-shift-right) (global-set-key (kbd "C->") 'oni:indent-shift-right)
(global-set-key (kbd "C-M-4") 'split-window-vertically) (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-e") 'oni:move-end-of-dwim)
(global-set-key (kbd "C-k") 'oni:kill-region-or-line) (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 "C-w") 'oni:kill-region-or-backward-char)
(global-set-key (kbd "M-4") 'split-window-horizontally) (global-set-key (kbd "M-0") 'delete-window)
(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-1") 'delete-other-windows) (global-set-key (kbd "M-1") 'delete-other-windows)
(global-set-key (kbd "M-2") 'split-window-below) (global-set-key (kbd "M-2") 'split-window-below)
(global-set-key (kbd "M-3") 'split-window-right) (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) (if (daemonp)
(global-set-key "\C-x\C-c" 'oni:close-client-window)) (global-set-key "\C-x\C-c" 'oni:close-client-window))
@ -369,24 +276,15 @@
'display-buffer-alist 'display-buffer-alist
'("^\\*magit: .*\\*$" . ((display-buffer-same-window . nil)))) '("^\\*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) (blink-cursor-mode -1)
(column-number-mode -1) (column-number-mode -1)
(line-number-mode -1) (line-number-mode -1)
(menu-bar-mode -1)
(scroll-bar-mode -1)
(tool-bar-mode -1)
(tooltip-mode -1) (tooltip-mode -1)
(package-initialize)
(auto-insert-mode) (auto-insert-mode)
(cua-selection-mode t)
(electric-indent-mode) (electric-indent-mode)
(electric-pair-mode) (electric-pair-mode)
(ido-mode) (ido-mode)
@ -398,8 +296,8 @@
(smex-initialize) (smex-initialize)
(help-at-pt-set-timer) (help-at-pt-set-timer)
(windmove-default-keybindings)
(load-theme 'yoshi t) (global-diff-hl-mode)
(load custom-file) (load custom-file)
;; (load "rudel-loaddefs.el") ;; (load "rudel-loaddefs.el")
@ -408,7 +306,6 @@
(server-start)) (server-start))
(diminish 'auto-fill-function "_") (diminish 'auto-fill-function "_")
(ac-config-default)
(provide 'init) (provide 'init)

View file

@ -1,308 +1,310 @@
#+TITLE: Emacs init #+TITLE: Emacs init
#+STYLE: <link href="http://ryuslash.ninth.su/test2.css" rel="stylesheet"> #+STYLE: <link href="http://ryuslash.ninth.su/test2.css" rel="stylesheet">
#+OPTIONS: author:nil #+OPTIONS: author:nil
#+STARTUP: showall
#+LINK: yoshi-theme http://ryuslash.org/projects/yoshi-theme.html
* Startup * Emacs init
Startup requires a bit of customization to handle all my Before doing anything else I should make sure that both the
customizations. 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.
** Load paths #+BEGIN_SRC emacs-lisp :tangle init2.el
(eval-and-compile
I have two versions of Emacs installed on my main computer. I have (defun oni:path-init (dir)
a daily build of Emacs's ~trunk~ (or currently ~emacs-24~) branch from "Add DIR to `load-path' and all its subdirectories, unless
bazaar and I have the official ~emacs~ package from archlinux DIR is already in `load-path'."
installed. I keep that second one around so that the occasional (unless (or (member dir load-path) (not (file-exists-p dir)))
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)) (let ((default-directory dir))
(normal-top-level-add-subdirs-to-load-path))) (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 #+END_SRC
**** TODO Add load paths in different order depending on version Add my project [[yoshi-theme]] to =custom-theme-load-path= and load it.
The officially installed version should load #+BEGIN_SRC emacs-lisp :tangle init2.el
=/usr/share/emacs/site-lisp= before (add-to-list 'custom-theme-load-path "~/projects/emacs/yoshi-theme/")
=/usr/local/emacs/share/emacs/sit-lisp= and the bzr version should (load-theme 'yoshi t)
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 #+END_SRC
The =oni:add-to-load-path-maybe-load-defs= function just adds the Remove the ~menu-bar~, ~tool-bar~ and ~scroll-bar~ from the UI since I
given directory to the load path and then looks for a file named don't use them at all.
~loaddefs.el~ within that directory, if it exists it loads it.
#+NAME: add-with-loaddefs #+BEGIN_SRC emacs-lisp :tangle init2.el
#+BEGIN_SRC emacs-lisp (menu-bar-mode -1)
(defun oni:add-to-load-path-maybe-load-defs (dir) (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) (add-to-list 'load-path dir)
(let ((loaddefs (concat dir "/loaddefs.el"))) (let ((loaddefs (concat dir "/loaddefs.el")))
(when (file-exists-p loaddefs) (when (file-exists-p loaddefs)
(load loaddefs)))) (load loaddefs))))
'("~/projects/emacs/mode-icons" "~/.emacs.d/site-lisp"
"~/projects/emacs/pony-mode/src" "~/projects/emacs/php-mode"))
#+END_SRC #+END_SRC
*** Themes Don't ask ~yes~ or ~no~, ask ~y~ or ~n~, I've never had an accidental ~y~ so
far.
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.
#+BEGIN_SRC emacs-lisp :tangle init2.el #+BEGIN_SRC emacs-lisp :tangle init2.el
(defalias 'yes-or-no-p 'y-or-n-p) (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) (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) (defalias 'dabbrev-expand 'hippie-expand)
#+END_SRC #+END_SRC
* Faces 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
Define faces for use with ~magit~ log edit mode. only execute once ~eldoc~ has been loaded.
#+BEGIN_SRC emacs-lisp :tangle init2.el #+BEGIN_SRC emacs-lisp :tangle init2.el
(defface git-commit-summary-face (eval-after-load "eldoc" '(diminish 'eldoc-mode))
'((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)
#+END_SRC #+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 #+BEGIN_SRC emacs-lisp :tangle init2.el
keybindings. (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 (add-to-list 'emms-info-functions 'emms-info-mpd)
the [[http://colemak.com][colemak]] keyboard layout and ~C-j~ is used so much more, switch (add-to-list 'emms-player-list 'emms-player-mpd)
them.
#+BEGIN_SRC emacs-lisp tangle init2.el (setq emms-player-mpd-server-name "localhost")
(define-key key-translation-map (kbd "C-j") (kbd "C-l")) (setq emms-player-mpd-server-port "6600")
(define-key key-translation-map (kbd "C-l") (kbd "C-j")) (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 #+END_SRC
* Footnotes
[fn:1] Though it doesn't happen often that ~trunk~ is so messed up that Add some keybindings for EMMS.
I can't use it.
[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 () (defun dzen-update ()
(let ((strl "") (let ((strl "")
(strc metal-express-radio-currently-playing) (strc (if (boundp 'metal-express-radio-currently-playing)
metal-express-radio-currently-playing
""))
(strr (format (strr (format
"jabber: %s ryu: %d gm: %d aet: %d 9n: %d rss: %d\n" "jabber: %s ryu: %d gm: %d aet: %d 9n: %d rss: %d\n"
(oni:current-jabber-status) (oni:current-jabber-status)

View file

@ -27,22 +27,6 @@
(autoload 'notifications-notify "notifications") (autoload 'notifications-notify "notifications")
(autoload 'jabber-send-message "jabber-chat") (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) (defmacro oni:email (user at host dot com)
"Turn arguments into an email address. "Turn arguments into an email address.
The resulting email address will look like: USER@HOST.COM, AT and 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) "." (concat (symbol-name user) "@" (symbol-name host) "."
(symbol-name com))) (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 () (defun oni:after-save-func ()
"Function for `after-save-hook'." "Function for `after-save-hook'."
(oni:compile-el) (oni:compile-el)
@ -81,7 +51,9 @@ DOT are intentionally being skipped."
nil (format "%s%s (in %s minutes)" nil (format "%s%s (in %s minutes)"
new-time appt-msg min-to-app) nil) new-time appt-msg min-to-app) nil)
(appt-disp-window min-to-app new-time appt-msg)) (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 () (defun oni:before-save-func ()
"Function for `before-save-hook'." "Function for `before-save-hook'."
(if (eq major-mode 'html-mode) (if (eq major-mode 'html-mode)
@ -99,6 +71,10 @@ DOT are intentionally being skipped."
(interactive) (interactive)
(server-save-buffers-kill-terminal nil)) (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 () (defun oni:compile-el ()
"Compile the current buffer file if it is an .el file." "Compile the current buffer file if it is an .el file."
(let* ((full-file-name (buffer-file-name)) (let* ((full-file-name (buffer-file-name))
@ -128,12 +104,10 @@ DOT are intentionally being skipped."
"Function for `emacs-lisp-mode-hook'." "Function for `emacs-lisp-mode-hook'."
(eldoc-mode)) (eldoc-mode))
(defun oni:emms-toggle-playing () (defun oni:emacs-startup-func ()
"Toggle between playing/paused states." "Function for `emacs-init-hook'."
(interactive) (require 'auto-complete-config)
(if (eq emms-player-playing-p nil) (ac-config-default))
(emms-start)
(emms-pause)))
(defun oni:erc-mode-func () (defun oni:erc-mode-func ()
"Function for `erc-mode-hook'." "Function for `erc-mode-hook'."
@ -141,44 +115,6 @@ DOT are intentionally being skipped."
(visual-line-mode) (visual-line-mode)
(setq truncate-lines nil)) (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 () (defun oni:go-mode-func ()
"Function for `go-mode-hook'." "Function for `go-mode-hook'."
(setq indent-tabs-mode nil) (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-tag)
(local-set-key "\M-." 'gtags-find-rtag)) (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 () (defun oni:html-mode-func ()
"Function for `html-mode-hook'." "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) (defun oni:indent-shift-left (start end &optional count)
"Rigidly indent region. "Rigidly indent region.
@ -245,6 +200,10 @@ If COUNT has been specified indent by that much, otherwise look at
'(global-mode-string)) '(global-mode-string))
header-line-format nil)) 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 () (defun oni:jabber-roster-mode-func ()
"Function for `jabber-roster-mode-hook'." "Function for `jabber-roster-mode-hook'."
(setq mode-line-format (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 () (defun oni:js-mode-func ()
"Function for `js-mode-hook'." "Function for `js-mode-hook'."
(rainbow-delimiters-mode) (rainbow-delimiters-mode)
(local-set-key "\C-j" 'oni:newline-and-indent) (local-set-key "\C-j" 'oni:newline-and-indent))
(pretty-symbols-mode -1))
(defun oni:js2-mode-func () (defun oni:js2-mode-func ()
"Function for `js2-mode-hook'." "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'." "Function for `lua-mode-hook'."
(local-unset-key (kbd ")")) (local-unset-key (kbd ")"))
(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 () (defun oni:magit-log-edit-mode-func ()
"Function for `magit-log-edit-mode-hook'." "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 () (defun oni:php-mode-func ()
"Function for `php-mode-hook'." "Function for `php-mode-hook'."
(flymake-mode)
(local-set-key "\C-j" 'oni:newline-and-indent) (local-set-key "\C-j" 'oni:newline-and-indent)
(c-set-offset 'arglist-intro '+) (c-set-offset 'arglist-intro '+)
(c-set-offset 'arglist-close '0) (c-set-offset 'arglist-close '0)
(rainbow-delimiters-mode) (rainbow-delimiters-mode)
(setq fci-rule-column 80)) (setq-local fci-rule-column 80)
(flycheck-mode))
(defun oni:pretty-control-l-function (win) (defun oni:pretty-control-l-function (win)
"Just make a string of either `fci-rule-colum' or `fill-column' "Just make a string of either `fci-rule-column' or
length -1. Use the `-' character. WIN is ignored." `fill-column' length -1. Use the `-' character. WIN is ignored."
(make-string (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 () (defun oni:prog-mode-func ()
"Function for `prog-mode-hook'." "Function for `prog-mode-hook'."
(rainbow-delimiters-mode) (rainbow-delimiters-mode)
(fci-mode) (fci-mode)
(pretty-symbols-mode) (yas-minor-mode)
(auto-fill-mode)) (auto-fill-mode))
(defun oni:python-mode-func () (defun oni:python-mode-func ()
"Function for `python-mode-hook'." "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-right)
(local-set-key (kbd "C-<") 'python-indent-shift-left) (local-set-key (kbd "C-<") 'python-indent-shift-left)
(set (make-local-variable 'electric-indent-chars) nil) (set (make-local-variable 'electric-indent-chars) nil)
@ -436,6 +396,10 @@ length -1. Use the `-' character. WIN is ignored."
(fci-mode) (fci-mode)
(whitespace-mode)) (whitespace-mode))
(defun oni:rainbow-mode-init ()
"Initialization function for rainbow-mode."
(diminish 'rainbow-mode))
(defun oni:raise-ansi-term (arg) (defun oni:raise-ansi-term (arg)
"Create or show an `ansi-term' buffer." "Create or show an `ansi-term' buffer."
(interactive "P") (interactive "P")
@ -444,19 +408,6 @@ length -1. Use the `-' character. WIN is ignored."
(switch-to-buffer buffer) (switch-to-buffer buffer)
(call-interactively 'ansi-term)))) (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) (defun oni:raise-scratch (&optional mode)
"Show the *scratch* buffer. "Show the *scratch* buffer.
If called with a universal argument, ask the user which mode to 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 ") default-directory "' request-pull " (when patchp "-p ")
from " " url " " to)))))) 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 () (defun oni:rst-mode-func ()
"Function for `rst-mode-hook'." "Function for `rst-mode-hook'."
(auto-fill-mode)) (auto-fill-mode))
@ -559,6 +500,16 @@ insert at the end of the region and at the beginning."
(interactive) (interactive)
(message (format "%d:%d" (line-number-at-pos) (current-column)))) (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) (defun oni:split-window-interactive (dir)
"Split windows in direction DIR. "Split windows in direction DIR.
@ -582,13 +533,16 @@ If no direction is given, don't split."
((?h) (split-window-horizontally)) ((?h) (split-window-horizontally))
(t window)))) (t window))))
(defun oni:start-emms () (defun oni:start-python-test-mail-server ()
"Check to see if the function `emms' exists, if not call "Run the python test mailserver."
`emms-player-mpd-connect' and assume that will have loaded it."
(interactive) (interactive)
(unless (fboundp 'emms) (start-process "python-test-mail-server" "*py-mail-server*" "python" "-m"
(emms-player-mpd-connect)) "smtpd" "-n" "-c" "DebuggingServer" "localhost:1025"))
(emms))
(defun oni:stop-python-test-mail-server ()
"Stop the python test mailserver."
(interactive)
(kill-process "python-test-mail-server"))
(defun oni:term-mode-func () (defun oni:term-mode-func ()
"Function for `term-mode-hook'." "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) (setq-local comment-auto-fill-only-comments nil)
(auto-fill-mode)) (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 () (defun oni:write-file-func ()
"Function for `write-file-hooks'." "Function for `write-file-hooks'."
(time-stamp)) (time-stamp))
@ -623,11 +563,25 @@ for easy selection."
(define-key yas-minor-mode-map [(tab)] nil) (define-key yas-minor-mode-map [(tab)] nil)
(define-key yas-minor-mode-map (kbd "C-\\") 'yas-expand)) (define-key yas-minor-mode-map (kbd "C-\\") 'yas-expand))
(define-skeleton html-tag (defun oni:yasnippet-init ()
"Testing creation of an html tag" "Initialization function for yasnippet."
"Tagname:" (diminish 'yas-minor-mode))
"<" str ("Attribute: " " " str "=\"" (skeleton-read "Value: ") "\"") ">\n"
"</" str ">\n") (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) (provide 'oni)
;;; oni.el ends here ;;; oni.el ends here

View file

@ -30,16 +30,73 @@
(require 'org-habit) (require 'org-habit)
(require 'org-protocol) (require 'org-protocol)
(autoload 'org-clocking-p "org-clock")
(eval-after-load "org-crypt" (eval-after-load "org-crypt"
'(org-crypt-use-before-save-magic)) '(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 (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 (setq org-agenda-prefix-format
'((agenda . " %i %-12:c%?-12t% s") '((agenda . " %i %-12:c%?-12t% s")
(timeline . " % s") (timeline . " % s")
(todo . " %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 %(concat \"[ \"(org-format-outline-path (org-get-outline-path)) \" ]\") ") (tags . " %i %-12:c %(oni:org-maybe-outline-path)")
(search . " %i %-12:c"))) (search . " %i %-12:c")))
(setq org-agenda-sorting-strategy (setq org-agenda-sorting-strategy
'((agenda habit-down time-up priority-down category-keep) '((agenda habit-down time-up priority-down category-keep)
@ -47,23 +104,19 @@
(tags priority-down category-keep) (tags priority-down category-keep)
(search category-keep))) (search category-keep)))
(setq org-agenda-tags-column -101) (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 (setq org-capture-templates
'(("t" "Task" entry (file "~/documents/org/tasks") `(("t" "Task" entry (file "~/documents/org/tasks")
"* TODO %?") "* TODO %?")
("T" "Linked task" entry (file "~/documents/org/tasks") ("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-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-show-outline-path nil)
(setq org-agenda-todo-ignore-deadlines 'far) (setq org-agenda-todo-ignore-deadlines 'far)
(setq org-agenda-todo-ignore-scheduled t) (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-export-htmlize-output-type 'css)
(setq org-feed-alist (setq org-feed-alist
'(("MyEpisodes" '(("MyEpisodes"
@ -103,5 +156,9 @@
(org-agenda-to-appt) (org-agenda-to-appt)
(ad-activate 'org-agenda-redo) (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) (provide 'org-init)
;;; org-init.el ends here ;;; org-init.el ends here

View file

@ -1,4 +1,4 @@
DESTDIR:=$(DESTDIR)/org-mode DESTDIR:=$(DESTDIR)/org-mode
objects=codeblock heading objects=codeblock heading project snippet
include ../../../dotfiles.mk 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 # Playlist
autocenter_mode = "yes" autocenter_mode = "yes"
centered_cursor = "yes" centered_cursor = "yes"

View file

@ -97,7 +97,7 @@
(set-float-focus-color (colour :black)) (set-float-focus-color (colour :black))
(set-float-unfocus-color (colour :aluminium-6)) (set-float-unfocus-color (colour :aluminium-6))
(set-focus-color (colour :black)) (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-unfocus-color (colour :aluminium-6))
(set-win-bg-color (colour :background)) (set-win-bg-color (colour :background))
@ -105,16 +105,14 @@
:butter-1 :sky-blue-1 :plum-1 :cyan :butter-1 :sky-blue-1 :plum-1 :cyan
:aluminium-1))) :aluminium-1)))
(setf *input-window-gravity* :bottom-left) (setf *input-window-gravity* :bottom-left)
(setf *maxsize-border-width* 1)
(setf *message-window-gravity* :top-right) (setf *message-window-gravity* :top-right)
(setf *mode-line-background-color* (colour :background)) (setf *mode-line-background-color* (colour :background))
(setf *mode-line-border-color* (colour :aluminium-6)) (setf *mode-line-border-color* (colour :aluminium-6))
(setf *mode-line-foreground-color* (colour :aluminium-1)) (setf *mode-line-foreground-color* (colour :aluminium-1))
(setf *normal-border-width* 1)
(setf *shell-program* (getenv "SHELL")) (setf *shell-program* (getenv "SHELL"))
(setf *transient-border-width* 1) (setf *transient-border-width* 1)
(setf *window-border-style* :tight)
(setf *window-format* "%m%50t") (setf *window-format* "%m%50t")
(setf *window-border-style* :thin)
(setf *screen-mode-line-format* (setf *screen-mode-line-format*
(list "[%n]" (list "[%n]"
'(:eval '(:eval
@ -127,15 +125,9 @@
(format-expand *window-formatters* *window-format* (format-expand *window-formatters* *window-format*
(current-window))))) (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 "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") "raise-urxvt")
(define-key *root-map* (kbd "C") "run-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 unset f
fi fi
emacs --daemon & xflux -l 51.1180 -g 4.0012
fehlstart & 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 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 \ objects=chpwd_show_todo chpwd_update_git_vars env get_cnt line \
precmd_maybe_festival precmd_update_git_vars precmd_update_updates \ precmd_maybe_festival precmd_update_git_vars precmd_update_updates \
preexec_update_vars prompt prompt_git_info rprompt \ preexec_update_vars prompt prompt_git_info rprompt \
update_current_git_vars welcome update_current_git_vars welcome venv
include ../../dotfiles.mk 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) autoload -U $HOME/.zsh/functions/*(:t)
# Setup variables # Setup variables
HISTFILE=$ZDOTDIR/histfile HISTFILE=$HOME/.zsh/histfile
HISTSIZE=1000 HISTSIZE=1000
SAVEHIST=1000 SAVEHIST=1000
LESSCMD="/usr/bin/less -FXRS" LESSCMD="/usr/bin/less -FXRS"
@ -30,8 +30,9 @@ alias grep="grep --color=always"
alias less=$LESSCMD alias less=$LESSCMD
alias ls="ls -F --color=always" alias ls="ls -F --color=always"
alias mysql="mysql --pager" alias mysql="mysql --pager"
alias reboot="systemctl reboot"
alias poweroff="systemctl poweroff" # Suffix aliases
alias -s pdf="zathura"
setopt notify setopt notify
setopt PROMPT_SUBST # Allow for functions in the prompt setopt PROMPT_SUBST # Allow for functions in the prompt

View file

@ -1,10 +1,12 @@
export DESTDIR:=$(HOME) export DESTDIR:=$(HOME)
modules=.emacs.d .config .conkerorrc .local .moc .mutt .ncmpcpp \ 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 \ objects=.bash_profile .beetsconfig .conky_box.lua .conkyrc .gitconfig \
.guile .hgrc .offlineimap.py .offlineimaprc .screenrc .scwmrc \ .guile .hgrc .offlineimap.py .offlineimaprc .screenrc .scwmrc \
.slrnrc .stumpwmrc .tmux.conf .urlview .xbindkeysrc.scm .Xdefaults \ .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 include dotfiles.mk

View file

@ -16,47 +16,77 @@ define older =
$(shell if [ "$(1)" -ot "$(DESTDIR)/$(1)" ]; then echo "older"; fi) $(shell if [ "$(1)" -ot "$(DESTDIR)/$(1)" ]; then echo "older"; fi)
endef endef
install-objects=$(addprefix install-,$(objects))
uninstall-objects=$(addprefix uninstall-,$(objects))
check-objects=$(addprefix check-,$(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)) 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) \ .PHONY: all install uninstall check uninstall $(modules) \
$(install-objects) $(uninstall-objects) $(check-objects) \ $(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) all: $(modules) $(objects)
install: $(install-modules) $(install-objects)
ifeq ($(MAKEROOT),y)
check: $(check-modules) $(check-objects) check: $(check-modules) $(check-objects)
install: $(install-modules) $(install-objects)
reverse: $(reverse-modules) $(reverse-objects)
uninstall: $(uninstall-modules) $(uninstall-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): %: $(modules): %:
@echo $(MAKEFILES) $(MAKE) -C $*
@$(MAKE) -C $*
$(install-objects): install-%: % $(install-objects): install-%: %
$(if $(call newer,$*), \ @$(if $(call newer,$*), \
install -pDm $(MODE) "$*" "$(DESTDIR)/$*") 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-%: $(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-%: $(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-%: $(uninstall-modules): uninstall-%:
@$(MAKE) -C $* uninstall @$(MAKE) -C $* uninstall MKDPREFIX=$(MKDPREFIX)$*/
$(check-objects): check-%: $(check-objects): check-%:
@$(if $(call newer,$*), \ @$(if $(call newer,$*), \
echo -e "$(FG_YEL)$* $(FG_GRE)newer$(CLR_RE)!", \ echo -e "$(FG_GRE)+ $(FG_YEL)$(MKDPREFIX)$*$(CLR_RE)", \
$(if $(call older,$*), \ $(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-%: $(check-modules): check-%:
@$(MAKE) -C $* check @$(MAKE) -s -C $* check MKDPREFIX=$(MKDPREFIX)$*/
$(filter %.elc,$(objects)): %.elc: %.el $(filter %.elc,$(objects)): %.elc: %.el
$(call compile,$^) $(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") ]