diff --git a/.Xdefaults b/.Xdefaults index ebbbd9c..ebe9d51 100644 --- a/.Xdefaults +++ b/.Xdefaults @@ -1,4 +1,3 @@ - urxvt.internalBorder: 0 urxvt.loginShell: true @@ -21,11 +20,12 @@ urxvt.keysym.M-s: perl:keyboard-select:search urxvt.keysym.M-u: perl:url-select:select_next -urxvt.font: xft:Monaco:weight=medium:pixelsize=18 -urxvt.boldFont: xft:Monaco:weight=black:pixelsize=18 -! urxvt.italicFont: xft:Monaco:slant=italic:pixelsize=18 +urxvt.font: xft:Envy Code R:weight=medium:pixelsize=18 +urxvt.boldFont: xft:Envy Code R:weight=bold:pixelsize=18 +urxvt.italicFont: xft:Envy Code R:slant=italic:pixelsize=18 -urxvt.background: #111113 +urxvt.depth: 32 +urxvt.background: [90]#111113 urxvt.foreground: #eeeeec urxvt.color0: #171719 diff --git a/.config/awesome/rc.lua b/.config/awesome/rc.lua index 1c6e4fe..4056944 100644 --- a/.config/awesome/rc.lua +++ b/.config/awesome/rc.lua @@ -1,16 +1,62 @@ -require("awful") -require("awful.autofocus") -require("awful.rules") -require("beautiful") -require("bowl") -require("keychain") -require("naughty") -require("ext") -require("oni") +-- Standard awesome library +local gears = require("gears") +local awful = require("awful") +-- Widget and layout library +local wibox = require("wibox") +-- Theme handling library +local beautiful = require("beautiful") +-- Notification library +local naughty = require("naughty") +local menubar = require("menubar") +local lfs = require("lfs") ---- Error handling --- Check if awesome encountered an error during startup and fell back to --- another config (This code will only ever execute for the fallback config) +awful.rules = require("awful.rules") +require("awful.autofocus") + +local maildir_base = os.getenv("HOME") .. "/documents/mail/" + +function ror(program, cls) + local rorfunc = function () + local matcher = function (c) + return awful.rules.match(c, { class = cls }) + end + + awful.client.run_or_raise(program, matcher) + end + + return rorfunc +end + +function ror_combo(mod, key, program, class) + return awful.util.table.join( + awful.key(mod, key, ror(program, class)), + awful.key(awful.util.table.join(mod, { "Shift" }), key, + function () awful.util.spawn(program) end)) +end + +function new_mail(maildir) + local count = 0 + + for file in lfs.dir(maildir_base .. maildir .. "/new") do + if file ~= "." and file ~= ".." then + count = count + 1 + end + end + + for file in lfs.dir(maildir_base .. maildir .. "/cur") do + if string.sub(file, -1) ~= "S" and file ~= "." + and file ~= ".." then + count = count + 1 + end + end + + return count +end + +----- Error handling +-- Check if awesome encountered an error during startup and fell back +-- to another config (This code will only ever execute for the +-- fallback config) if awesome.startup_errors then naughty.notify({ preset = naughty.config.presets.critical, title = "Oops, there were errors during startup!", @@ -20,7 +66,7 @@ end -- Handle runtime errors after startup do local in_error = false - awesome.add_signal("debug::error", function (err) + awesome.connect_signal("debug::error", function (err) -- Make sure we don't go into an endless error loop if in_error then return end in_error = true @@ -31,33 +77,26 @@ do in_error = false end) end - --- {{{ Variable definitions + +----- Variable definitions -- Themes define colours, icons, and wallpapers -beautiful.init("/home/slash/.config/awesome/themes/custom/theme.lua") - -bowl.init({ use_timers = true, timeout = 1 }) -bowl.default_setup() - -keychain.init({ escapes = { - keychain.keystroke ({ }, "Escape"), - keychain.keystroke ({ "Control", }, "g") -} }) +beautiful.init("/usr/share/awesome/themes/default/theme.lua") -- This is used later as the default terminal and editor to run. terminal = "urxvt" editor = os.getenv("EDITOR") or "nano" editor_cmd = terminal .. " -e " .. editor --- Default modkey. --- Usually, Mod4 is the key with a logo between Control and Alt. --- If you do not like this or do not have such a key, --- I suggest you to remap Mod4 to another key using xmodmap or other tools. --- However, you can use another modifier like Mod1, but it may interact with others. +----- Default modkey. +-- Usually, Mod4 is the key with a logo between Control and Alt. If +-- you do not like this or do not have such a key, I suggest you to +-- remap Mod4 to another key using xmodmap or other tools. However, +-- you can use another modifier like Mod1, but it may interact with +-- others. modkey = "Mod4" -- Table of layouts to cover with awful.layout.inc, order matters. -layouts = +local layouts = { awful.layout.suit.magnifier, awful.layout.suit.tile, @@ -66,22 +105,29 @@ layouts = awful.layout.suit.tile.top, awful.layout.suit.fair, awful.layout.suit.fair.horizontal, + awful.layout.suit.spiral, + awful.layout.suit.spiral.dwindle, awful.layout.suit.max, awful.layout.suit.max.fullscreen, awful.layout.suit.floating } --- }}} - --- {{{ Tags + +----- Wallpaper +if beautiful.wallpaper then + for s = 1, screen.count() do + gears.wallpaper.maximized(beautiful.wallpaper, s, true) + end +end + +----- Tags -- Define a tag table which hold all screen tags. tags = {} for s = 1, screen.count() do -- Each screen has its own tag table. tags[s] = awful.tag({ 1, 2, 3, 4, 5, 6, 7, 8, 9 }, s, layouts[1]) end --- }}} - --- {{{ Menu + +----- Menu -- Create a laucher widget and a main menu myawesomemenu = { { "manual", terminal .. " -e man awesome" }, @@ -90,294 +136,289 @@ myawesomemenu = { { "quit", awesome.quit } } -mymainmenu = awful.menu({ items = { { "awesome", myawesomemenu, beautiful.awesome_icon }, - { "open terminal", terminal } - } - }) +mymainmenu = awful.menu( + { items = { { "awesome", myawesomemenu, beautiful.awesome_icon }, + { "open terminal", terminal } } }) -mylauncher = awful.widget.launcher({ image = image(beautiful.awesome_icon), +mylauncher = awful.widget.launcher({ image = beautiful.awesome_icon, menu = mymainmenu }) --- }}} --- {{{ Wibox +-- Menubar configuration +menubar.utils.terminal = terminal -- Set the terminal for applications + -- that require it + +----- Wibox -- Create a textclock widget -mytextclock = awful.widget.textclock({ align = "right" }) - --- Create a systray -mysystray = widget({ type = "systray" }) +mytextclock = awful.widget.textclock() -- Create a wibox for each screen and add it mywibox = {} mypromptbox = {} mylayoutbox = {} mytaglist = {} -mytaglist.buttons = awful.util.table.join( - awful.button({ }, 1, awful.tag.viewonly), - awful.button({ modkey }, 1, awful.client.movetotag), - awful.button({ }, 3, awful.tag.viewtoggle), - awful.button({ modkey }, 3, awful.client.toggletag), - awful.button({ }, 4, awful.tag.viewnext), - awful.button({ }, 5, awful.tag.viewprev) - ) mytasklist = {} -mytasklist.buttons = awful.util.table.join( - awful.button({ }, 1, function (c) - if c == client.focus then - c.minimized = true - else - if not c:isvisible() then - awful.tag.viewonly(c:tags()[1]) - end - -- This will also un-minimize - -- the client, if needed - client.focus = c - c:raise() - end - end), - awful.button({ }, 3, function () - if instance then - instance:hide() - instance = nil - else - instance = awful.menu.clients({ width=250 }) - end - end), - awful.button({ }, 4, function () - awful.client.focus.byidx(1) - if client.focus then client.focus:raise() end - end), - awful.button({ }, 5, function () - awful.client.focus.byidx(-1) - if client.focus then client.focus:raise() end - end)) + +mymaillist = wibox.widget.textbox() +mymaillist:set_text( + string.format(" ryu: %d gmail: %d aethon: %d 9f: %d", + new_mail('ryuslash.org/inbox'), + new_mail('gmail/inbox'), + new_mail('aethon/inbox'), + new_mail('ninthfloor/inbox'))) +mymaillisttimer = timer({ timeout = 60 }) +mymaillisttimer:connect_signal( + "timeout", + function () + mymaillist:set_text( + string.format(" ryu: %d gmail: %d aethon: %d 9f: %d", + new_mail('ryuslash.org/inbox'), + new_mail('gmail/inbox'), + new_mail('aethon/inbox'), + new_mail('ninthfloor/inbox'))) + end) +mymaillisttimer:start() + +mytodolist = wibox.widget.textbox() +mytodolist:set_text( + string.format(" ptodo: %d wtodo: %d", + awful.util.pread("todo-count t"), + awful.util.pread("todo-count w"))) +mytodolisttimer = timer({ timeout = 60 * 60 }) +mytodolisttimer:connect_signal( + "timeout", + function () + mytodolist:set_text( + string.format(" pers: %d work: %d", + awful.util.pread("todo-count t"), + awful.util.pread("todo-count w"))) + end) +mytodolisttimer:start() for s = 1, screen.count() do -- Create a promptbox for each screen - mypromptbox[s] = awful.widget.prompt({ layout = awful.widget.layout.horizontal.leftright }) - -- Create an imagebox widget which will contains an icon indicating which layout we're using. - -- We need one layoutbox per screen. + mypromptbox[s] = awful.widget.prompt() + -- Create an imagebox widget which will contains an icon + -- indicating which layout we're using. We need one layoutbox per + -- screen. mylayoutbox[s] = awful.widget.layoutbox(s) - mylayoutbox[s]:buttons(awful.util.table.join( - awful.button({ }, 1, function () awful.layout.inc(layouts, 1) end), - awful.button({ }, 3, function () awful.layout.inc(layouts, -1) end), - awful.button({ }, 4, function () awful.layout.inc(layouts, 1) end), - awful.button({ }, 5, function () awful.layout.inc(layouts, -1) end))) -- Create a taglist widget - mytaglist[s] = awful.widget.taglist(s, awful.widget.taglist.label.all, mytaglist.buttons) + mytaglist[s] = awful.widget.taglist( + s, awful.widget.taglist.filter.all, mytaglist.buttons) -- Create a tasklist widget - mytasklist[s] = awful.widget.tasklist(function(c) - return awful.widget.tasklist.label.currenttags(c, s) - end, mytasklist.buttons) + mytasklist[s] = awful.widget.tasklist( + s, awful.widget.tasklist.filter.currenttags, mytasklist.buttons) -- Create the wibox mywibox[s] = awful.wibox({ position = "top", screen = s }) - -- Add widgets to the wibox - order matters - mywibox[s].widgets = { - { - mylauncher, - mytaglist[s], - mypromptbox[s], - layout = awful.widget.layout.horizontal.leftright - }, - mylayoutbox[s], - mytextclock, - s == 1 and mysystray or nil, - mytasklist[s], - layout = awful.widget.layout.horizontal.rightleft - } + + -- Widgets that are aligned to the left + local left_layout = wibox.layout.fixed.horizontal() + left_layout:add(mylauncher) + left_layout:add(mytaglist[s]) + left_layout:add(mypromptbox[s]) + + -- Widgets that are aligned to the right + local right_layout = wibox.layout.fixed.horizontal() + if s == 1 then + right_layout:add(mytodolist) + right_layout:add(mymaillist) + right_layout:add(wibox.widget.systray()) + end + right_layout:add(mytextclock) + right_layout:add(mylayoutbox[s]) + + -- Now bring it all together (with the tasklist in the middle) + local layout = wibox.layout.align.horizontal() + layout:set_left(left_layout) + layout:set_middle(mytasklist[s]) + layout:set_right(right_layout) + + mywibox[s]:set_widget(layout) end --- }}} - --- {{{ Mouse bindings -root.buttons(awful.util.table.join( - awful.button({ }, 3, function () mymainmenu:toggle() end), - awful.button({ }, 4, awful.tag.viewnext), - awful.button({ }, 5, awful.tag.viewprev) -)) --- }}} - --- {{{ Key bindings -local bind = keychain -local sub = keychain.sub + +----- Key bindings globalkeys = awful.util.table.join( - bind({ "Control", }, "i", - { sub({ }, "space", ext.next_client), - sub({ }, ",", - function () awful.screen.focus_relative(1) end), - sub({ }, ".", - function () awful.screen.focus_relative(-1) end), - sub({ "Shift", }, "1", - function () mypromptbox[mouse.screen]:run() end), - sub({ }, "f", function () oni.focus_raise("right") end), - sub({ }, "b", function () oni.focus_raise("left") end), - sub({ }, "n", function () oni.focus_raise("down") end), - sub({ }, "p", function () oni.focus_raise("up") end), - sub({ }, "c", oni.ror_term), - sub({ "Shift", }, "c", oni.run_term), - sub({ }, "e", oni.ror_editor), - sub({ "Shift", }, "e", oni.run_editor), - sub({ }, "w", oni.ror_browser), - sub({ "Shift", }, "w", oni.run_browser), - sub({ "Control", }, "i", ext.prev_client) }), - awful.key({ "Control", "Mod1" }, "l", - function () awful.util.spawn("i3lock -c 000000") end), - awful.key({ modkey, }, "Left", awful.tag.viewprev ), - awful.key({ modkey, }, "Right", awful.tag.viewnext ), - awful.key({ modkey, }, "Escape", awful.tag.history.restore), + awful.key({ modkey, }, "Left", awful.tag.viewprev), + awful.key({ modkey, }, "Right", awful.tag.viewnext), + awful.key({ modkey, }, "Escape", awful.tag.history.restore), - -- awful.key({ modkey, }, "w", function () mymainmenu:show({keygrabber=true}) end), + awful.key({ modkey, }, "n", + function () + awful.client.focus.byidx(1) + if client.focus then client.focus:raise() end + end), + awful.key({ modkey, }, "p", + function () + awful.client.focus.byidx(-1) + if client.focus then client.focus:raise() end + end), -- Layout manipulation - awful.key({ modkey, "Shift" }, "j", function () awful.client.swap.byidx( 1) end), - awful.key({ modkey, "Shift" }, "k", function () awful.client.swap.byidx( -1) end), - awful.key({ modkey, }, "u", awful.client.urgent.jumpto), + awful.key({ modkey, "Shift" }, "n", + function () awful.client.swap.byidx(1) end), + awful.key({ modkey, "Shift" }, "p", + function () awful.client.swap.byidx(-1) end), + awful.key({ modkey, "Control" }, "n", + function () awful.screen.focus_relative(1) end), + awful.key({ modkey, "Control" }, "p", + function () awful.screen.focus_relative(-1) end), + awful.key({ modkey, }, "u", awful.client.urgent.jumpto), + awful.key({ modkey, }, "Tab", + function () + awful.client.focus.history.previous() + if client.focus then + client.focus:raise() + end + end), -- Standard program - awful.key({ modkey, }, "Return", function () awful.util.spawn(terminal) end), + awful.key({ modkey, }, "Return", + function () awful.util.spawn(terminal) end), awful.key({ modkey, "Control" }, "r", awesome.restart), - awful.key({ modkey, "Shift" }, "q", awesome.quit), + awful.key({ modkey, "Shift" }, "q", awesome.quit), - awful.key({ modkey, }, "l", function () awful.tag.incmwfact( 0.05) end), - awful.key({ modkey, }, "h", function () awful.tag.incmwfact(-0.05) end), - awful.key({ modkey, "Shift" }, "h", function () awful.tag.incnmaster( 1) end), - awful.key({ modkey, "Shift" }, "l", function () awful.tag.incnmaster(-1) end), - awful.key({ modkey, "Control" }, "h", function () awful.tag.incncol( 1) end), - awful.key({ modkey, "Control" }, "l", function () awful.tag.incncol(-1) end), - awful.key({ modkey, }, "space", function () awful.layout.inc(layouts, 1) end), - awful.key({ modkey, "Shift" }, "space", function () awful.layout.inc(layouts, -1) end), + awful.key({ modkey, }, "l", + function () awful.tag.incmwfact( 0.05) end), + awful.key({ modkey, }, "h", + function () awful.tag.incmwfact(-0.05) end), + awful.key({ modkey, "Shift" }, "h", + function () awful.tag.incnmaster(1) end), + awful.key({ modkey, "Shift" }, "l", + function () awful.tag.incnmaster(-1) end), + awful.key({ modkey, "Control" }, "h", + function () awful.tag.incncol(1) end), + awful.key({ modkey, "Control" }, "l", + function () awful.tag.incncol(-1) end), + awful.key({ modkey, }, "space", + function () awful.layout.inc(layouts, 1) end), + awful.key({ modkey, "Shift" }, "space", + function () awful.layout.inc(layouts, -1) end), - awful.key({ modkey, "Control" }, "n", awful.client.restore), + awful.key({ modkey, "Control" }, "j", awful.client.restore), -- Prompt - awful.key({ modkey }, "r", function () mypromptbox[mouse.screen]:run() end), + awful.key({ modkey }, "r", + function () mypromptbox[mouse.screen]:run() end), awful.key({ modkey }, "x", function () - awful.prompt.run({ prompt = "Run Lua code: " }, - mypromptbox[mouse.screen].widget, - awful.util.eval, nil, - awful.util.getdir("cache") .. "/history_eval") - end) -) + awful.prompt.run( + { prompt = "Run Lua code: " }, + mypromptbox[mouse.screen].widget, + awful.util.eval, nil, + awful.util.getdir("cache") .. "/history_eval") + end), + + ror_combo({ modkey }, "e", 'emacsclient -ca emacs', 'Emacs'), + ror_combo({ modkey }, "c", 'urxvt', 'URxvt'), + ror_combo({ modkey }, "w", 'conkeror', 'Conkeror'), + awful.key({ "Control", "Mod1" }, "l", + function () awful.util.spawn('i3lock -c 000000') end)) clientkeys = awful.util.table.join( - awful.key({ modkey, }, "f", function (c) c.fullscreen = not c.fullscreen end), - awful.key({ modkey, "Shift" }, "c", function (c) c:kill() end), - awful.key({ modkey, "Control" }, "space", awful.client.floating.toggle ), - awful.key({ modkey, "Control" }, "Return", function (c) c:swap(awful.client.getmaster()) end), - awful.key({ modkey, }, "o", awful.client.movetoscreen ), - awful.key({ modkey, "Shift" }, "r", function (c) c:redraw() end), - awful.key({ modkey, }, "t", function (c) c.ontop = not c.ontop end), - awful.key({ modkey, }, "n", - function (c) - -- The client currently has the input focus, so it cannot be - -- minimized, since minimized clients can't have the focus. - c.minimized = true - end), - awful.key({ modkey, }, "m", - function (c) - c.maximized_horizontal = not c.maximized_horizontal - c.maximized_vertical = not c.maximized_vertical - end) -) + awful.key({ modkey, }, "f", + function (c) c.fullscreen = not c.fullscreen end), + awful.key({ modkey, "Shift" }, "c", + function (c) c:kill() end), + awful.key({ modkey, "Control" }, "space", + awful.client.floating.toggle), + awful.key({ modkey, "Control" }, "Return", + function (c) c:swap(awful.client.getmaster()) end), + awful.key({ modkey, }, "o", + function () awful.screen.focus_relative(1) end), + awful.key({ modkey, "Shift" }, "o", awful.client.movetoscreen), + awful.key({ modkey, }, "t", function (c) c.ontop = not c.ontop end), + awful.key({ modkey, }, "m", + function (c) + c.maximized_horizontal = not c.maximized_horizontal + c.maximized_vertical = not c.maximized_vertical + end)) -- Compute the maximum number of digit we need, limited to 9 keynumber = 0 for s = 1, screen.count() do - keynumber = math.min(9, math.max(#tags[s], keynumber)); + keynumber = math.min(9, math.max(#tags[s], keynumber)) end --- Bind all key numbers to tags. --- Be careful: we use keycodes to make it works on any keyboard layout. --- This should map on the top row of your keyboard, usually 1 to 9. +-- Bind all key numbers to tags. Be careful: we use keycodes to make +-- it works on any keyboard layout. This should map on the top row of +-- your keyboard, usually 1 to 9. for i = 1, keynumber do - globalkeys = awful.util.table.join(globalkeys, - awful.key({ modkey }, "#" .. i + 9, - function () - local screen = mouse.screen - if tags[screen][i] then - awful.tag.viewonly(tags[screen][i]) - end - end), - awful.key({ modkey, "Control" }, "#" .. i + 9, - function () - local screen = mouse.screen - if tags[screen][i] then - awful.tag.viewtoggle(tags[screen][i]) - end - end), - awful.key({ modkey, "Shift" }, "#" .. i + 9, - function () - if client.focus and tags[client.focus.screen][i] then - awful.client.movetotag(tags[client.focus.screen][i]) - end - end), - awful.key({ modkey, "Control", "Shift" }, "#" .. i + 9, - function () - if client.focus and tags[client.focus.screen][i] then - awful.client.toggletag(tags[client.focus.screen][i]) - end - end)) + globalkeys = awful.util.table.join( + globalkeys, + awful.key({ modkey }, "#" .. i + 9, + function () + local screen = mouse.screen + if tags[screen][i] then + awful.tag.viewonly(tags[screen][i]) + end + end), + awful.key({ modkey, "Control" }, "#" .. i + 9, + function () + local screen = mouse.screen + if tags[screen][i] then + awful.tag.viewtoggle(tags[screen][i]) + end + end), + awful.key({ modkey, "Shift" }, "#" .. i + 9, + function () + if client.focus and tags[client.focus.screen][i] then + awful.client.movetotag(tags[client.focus.screen][i]) + end + end), + awful.key({ modkey, "Control", "Shift" }, "#" .. i + 9, + function () + if client.focus and tags[client.focus.screen][i] then + awful.client.toggletag(tags[client.focus.screen][i]) + end + end)) end -clientbuttons = awful.util.table.join( - awful.button({ }, 1, function (c) client.focus = c; c:raise() end), - awful.button({ modkey }, 1, awful.mouse.client.move), - awful.button({ modkey }, 3, awful.mouse.client.resize)) - -- Set keys root.keys(globalkeys) --- }}} - --- {{{ Rules + +----- Rules awful.rules.rules = { - -- All clients will match this rule. - { rule = { }, - properties = { border_width = beautiful.border_width, - border_color = beautiful.border_normal, - focus = true, - keys = clientkeys, - buttons = clientbuttons } }, - { rule = { class = "MPlayer" }, - properties = { floating = true } }, - { rule = { class = "pinentry" }, - properties = { floating = true } }, - { rule = { class = "gimp" }, - properties = { floating = true } }, - -- Set Firefox to always map on tags number 2 of screen 1. - -- { rule = { class = "Firefox" }, - -- properties = { tag = tags[1][2] } }, + -- All clients will match this rule. + { rule = { }, + properties = { border_width = beautiful.border_width, + border_color = beautiful.border_normal, + focus = awful.client.focus.filter, + keys = clientkeys } }, + { rule = { class = "pinentry" }, + properties = { floating = true } }, + { rule = { class = "gimp" }, + properties = { floating = true } }, + { rule = { class = "Conkeror" }, + properties = { floating = false, + tag = tags[2][1] } }, + -- Set Firefox to always map on tags number 2 of screen 1. + -- { rule = { class = "Firefox" }, + -- properties = { tag = tags[1][2] } }, } --- }}} - --- {{{ Signals + +----- Signals -- Signal function to execute when a new client appears. -client.add_signal("manage", function (c, startup) - -- Add a titlebar - -- awful.titlebar.add(c, { modkey = modkey }) +client.connect_signal( + "manage", + function (c, startup) + if not startup then + -- Set the windows at the slave, i.e. put it at the end of + -- others instead of setting it master. + -- awful.client.setslave(c) - -- Enable sloppy focus - c:add_signal("mouse::enter", function(c) - if awful.layout.get(c.screen) ~= awful.layout.suit.magnifier - and awful.client.focus.filter(c) then - client.focus = c - end - end) + -- Put windows in a smart way, only if they does not set an + -- initial position. + if not c.size_hints.user_position + and not c.size_hints.program_position then + awful.placement.no_overlap(c) + awful.placement.no_offscreen(c) + end + end + end) - if not startup then - -- Set the windows at the slave, - -- i.e. put it at the end of others instead of setting it master. - -- awful.client.setslave(c) - - -- Put windows in a smart way, only if they does not set an initial position. - if not c.size_hints.user_position and not c.size_hints.program_position then - awful.placement.no_overlap(c) - awful.placement.no_offscreen(c) - end - end -end) - -client.add_signal("focus", function(c) c.border_color = beautiful.border_focus end) -client.add_signal("unfocus", function(c) c.border_color = beautiful.border_normal end) --- }}} +client.connect_signal( + "focus", function(c) c.border_color = beautiful.border_focus end) +client.connect_signal( + "unfocus", function(c) c.border_color = beautiful.border_normal end) diff --git a/.conkerorrc/Makefile b/.conkerorrc/Makefile index d2bc0db..8161f39 100644 --- a/.conkerorrc/Makefile +++ b/.conkerorrc/Makefile @@ -1,5 +1,5 @@ DESTDIR:=$(DESTDIR)/.conkerorrc -modules=themes -objects=gtk2rc init.js +modules=themes styles +objects=gtk2rc init.js ext_restore.js include ../dotfiles.mk diff --git a/.conkerorrc/ext_restore.js b/.conkerorrc/ext_restore.js new file mode 100644 index 0000000..39b125e --- /dev/null +++ b/.conkerorrc/ext_restore.js @@ -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"); + } + }); diff --git a/.conkerorrc/init.js b/.conkerorrc/init.js index 6594523..157f125 100644 --- a/.conkerorrc/init.js +++ b/.conkerorrc/init.js @@ -1,10 +1,10 @@ require("content-policy.js"); require("favicon"); -load_paths.push("file:///home/slash/var/src/linkwave/conkeror/"); +load_paths.push("file:///home/slash/projects/markam/conkeror/"); theme_load_paths.push("/home/slash/.conkerorrc/themes/"); -require("linkwave"); +require("markam"); define_browser_object_class( "history-url", null, @@ -23,6 +23,15 @@ function ext_title_format(window) { + window.buffers.current.description; } +function oni_add_sheet(css) { + let (sheet = get_home_directory()) { + sheet.append(".conkerorrc"); + sheet.append("styles"); + sheet.append(css); + register_user_stylesheet(make_uri(sheet)); + }; +} + function oni_before_quit_func() { var w = get_recent_conkeror_window(); var result = (w == null) || @@ -112,18 +121,43 @@ define_webjump("arch/packages", "https://www.archlinux.org/packages/?sort=&q=%s&limit=50", $alternative="https://packages.archlinux.org"); +/// Chickadee +// From http://conkeror.org/Webjumps +function chickadee_completer (input, cursor_position, conservative) { + var completions = []; + var content = yield send_http_request( + load_spec({uri: "http://api.call-cc.org/cdoc/ajax/prefix?q="+ + encodeURIComponent(input)})); + if (content.responseText) { + var parser = Cc["@mozilla.org/xmlextras/domparser;1"] + .createInstance(Ci.nsIDOMParser); + var doc = parser.parseFromString(content.responseText, "text/xml"); + var res = doc.getElementsByTagName("li"); + for (let i = 0, n = res.length; i < n; ++i) { + completions.push(res[i].textContent); + } + } + yield co_return(prefix_completer($completions = completions) + (input, cursor_position, conservative)); +} +define_webjump("chickadee", + "http://api.call-cc.org/cdoc?q=%s&query-name=Lookup", + $alternative = "http://api.call-cc.org/doc/", + $completer = chickadee_completer); +/// /Chickadee + // content_policy_bytype_table.object = oni_block_flash; cwd = make_file("/home/slash/downloads/"); hint_digits = "arstdhneio"; read_buffer_show_icons = true; title_format_fn = ext_title_format; url_remoting_fn = load_url_in_new_buffer; +markam_program = "/home/slash/projects/markam/src/markam"; -define_key(content_buffer_normal_keymap, "h", - "find-url-from-history-new-buffer"); -define_key(content_buffer_normal_keymap, "H", - "find-url-from-history"); define_key(content_buffer_normal_keymap, "C-x C-b", "switch-to-buffer"); +define_key(content_buffer_normal_keymap, "C-y", "paste-url-new-buffer"); +define_key(content_buffer_normal_keymap, "H", "find-url-from-history"); +define_key(content_buffer_normal_keymap, "h", "find-url-from-history-new-buffer"); define_key(default_base_keymap, "C-x f", "follow-new-buffer"); add_hook("before_quit_hook", oni_before_quit_func); @@ -227,14 +261,47 @@ function read_url_github_command_handler(input) function read_url_local_port_handler(input) { - var m = /^lh (\d{1,5})$/.exec(input); + var m = /^lh (\d{1,5})(?:\s+([a-zA-Z0-9%/]+))?$/.exec(input), + rv = null; if (m) { - return "http://localhost:" + m[1]; + rv = "http://localhost:" + m[1]; + + if (m[2]) + rv += "/" + m[2]; } - return null; + return rv; } read_url_handler_list = [read_url_local_port_handler, read_url_github_command_handler]; + +// Mozrepl +let (mozrepl_init = get_home_directory()) { + mozrepl_init.appendRelativePath(".mozrepl-conkeror.js"); + session_pref('extensions.mozrepl.initUrl', make_uri(mozrepl_init).spec); +}; + +if ('@hyperstruct.net/mozlab/mozrepl;1' in Cc) { + let mozrepl = Cc['@hyperstruct.net/mozlab/mozrepl;1'] + .getService(Ci.nsIMozRepl); + if (!mozrepl.isActive()) + mozrepl.start(4242); +} + +register_user_stylesheet( + "data:text/css," + + escape( + "@namespace url(\"http://www.w3.org/1999/xhtml\");\n" + + "span.__conkeror_hint {\n" + + " font-family: \"Envy Code R\" !important;\n" + + " font-size: 12px !important;\n" + + " line-height: 12px !important;\n" + + " padding: 0 2px !important;\n" + + "}" + ) +); + +oni_add_sheet("github.css"); +oni_add_sheet("help.css"); diff --git a/.conkerorrc/styles/Makefile b/.conkerorrc/styles/Makefile new file mode 100644 index 0000000..fb44500 --- /dev/null +++ b/.conkerorrc/styles/Makefile @@ -0,0 +1,4 @@ +DESTDIR:=$(DESTDIR)/styles +objects=github.css help.css + +include ../../dotfiles.mk diff --git a/.conkerorrc/styles/github.css b/.conkerorrc/styles/github.css new file mode 100644 index 0000000..ff3a643 --- /dev/null +++ b/.conkerorrc/styles/github.css @@ -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; + } +} diff --git a/.conkerorrc/styles/help.css b/.conkerorrc/styles/help.css new file mode 100644 index 0000000..03888b6 --- /dev/null +++ b/.conkerorrc/styles/help.css @@ -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; + } +} diff --git a/.emacs.d/init.el b/.emacs.d/init.el index d2d68bc..21ecce6 100644 --- a/.emacs.d/init.el +++ b/.emacs.d/init.el @@ -8,13 +8,6 @@ (load (concat user-emacs-directory "init2")) -(define-key key-translation-map (kbd "C-j") (kbd "C-l")) -(define-key key-translation-map (kbd "C-l") (kbd "C-j")) - -(defalias 'yes-or-no-p 'y-or-n-p) -(defalias 'list-buffers 'ibuffer) -(defalias 'dabbrev-expand 'hippie-expand) - (defface git-commit-summary-face '((t (:inherit org-level-1))) "Face for the git title line." @@ -30,69 +23,31 @@ "Face for the supposedly empty line in commit messages." :group 'local) -(eval-after-load "eldoc" - '(diminish 'eldoc-mode)) +(eval-after-load "ido" '(oni:ido-init)) +(eval-after-load "jabber" '(oni:jabber-init)) +(eval-after-load "newst-treeview" '(require 'newsticker-init)) +(eval-after-load "org" '(require 'org-init)) +(eval-after-load "rainbow-mode" '(oni:rainbow-mode-init)) +(eval-after-load "smex" '(oni:smex-init)) +(eval-after-load "yasnippet" '(oni:yasnippet-init)) -(eval-after-load "em-term" - '(add-to-list 'eshell-visual-commands "unison")) +(autoload 'define-slime-contrib "slime") +(autoload 'gtags-mode "gtags" nil t) +(autoload 'jabber-connect "jabber" nil t) +(autoload 'php-mode "php-mode" nil t) +(autoload 'po-mode "po-mode" nil t) +(autoload 'pony-mode "pony-mode" nil t) +(autoload 'sawfish-mode "sawfish" nil t) +(autoload 'server-running-p "server") +(autoload 'slime-js-minor-mode "slime-js" nil t) +(autoload 'xmodmap-mode "xmodmap-mode" nil t) +(autoload 'w3m-bookmark-view "w3m" nil t) +(autoload 'w3m-goto-url "w3m" nil t) -(eval-after-load "emms-source-file" - '(progn - (require 'emms-setup) - (require 'emms-player-mpd) - - (emms-standard) - - (add-to-list 'emms-info-functions 'emms-info-mpd) - (add-to-list 'emms-player-list 'emms-player-mpd) - - (setq emms-player-mpd-server-name "localhost") - (setq emms-player-mpd-server-port "6600") - (setq emms-player-mpd-music-directory "/mnt/music/mp3"))) - -(eval-after-load "flymake" - '(progn - (require 'flymake-cursor) - - (add-to-list ; Make sure pyflakes is loaded - 'flymake-allowed-file-name-masks ; for python files. - '("\\.py\\'" ext:flymake-pyflakes-init)) - - (add-to-list ; Error line repexp for go - 'flymake-err-line-patterns ; compilation. - '("^\\([a-zA-Z0-9_]+\\.go\\):\\([0-9]+\\):\\(.*\\)$" - 1 2 nil 3)) - - (add-to-list ; Go uses makefiles, makes - 'flymake-allowed-file-name-masks ; flymaking 'easy'. - '("\\.go$" flymake-simple-make-init)))) - -(eval-after-load "ido" - '(setq ido-ignore-buffers `(,@ido-ignore-buffers - "^\\*.*\\*$" "^irc\\." "^\\#"))) - -(eval-after-load "jabber" - '(remove-hook 'jabber-alert-presence-hooks 'jabber-presence-echo)) - -(eval-after-load "newst-treeview" - '(require 'newsticker-init)) - -(eval-after-load "org" - '(require 'org-init)) - -(eval-after-load "pretty-symbols-mode" - '(diminish 'pretty-symbols-mode)) - -(eval-after-load "rainbow-mode" - '(diminish 'rainbmow-mode)) - -(eval-after-load "smex" - '(progn - (global-set-key (kbd "M-x") 'smex) - (global-set-key (kbd "C-M-x") 'smex-major-mode-commands))) - -(eval-after-load "yasnippet" - '(diminish 'yas-minor-mode)) +(require 'geiser-install) +(require 'uniquify) +(require 'ext) +(require 'oni) (put 'upcase-region 'disabled nil) (put 'downcase-region 'disabled nil) @@ -112,11 +67,9 @@ (setq appt-disp-window-function #'oni:appt-display-window-and-jabber) (setq appt-display-diary nil) (setq auto-mode-case-fold nil) -(setq auto-save-file-name-transforms - `((".*" ,temporary-file-directory t))) +(setq auto-save-file-name-transforms oni:auto-save-name-transforms) (setq avandu-article-render-function #'avandu-view-w3m) -(setq backup-directory-alist - `((".*" . ,temporary-file-directory))) +(setq backup-directory-alist oni:backup-directory-alist) (setq browse-url-browser-function 'browse-url-generic) (setq browse-url-generic-program (getenv "BROWSER")) (setq c-offsets-alist '((statement-block-intro . +) @@ -141,75 +94,30 @@ (vertical-scroll-bars . nil) (menu-bar-lines . nil) (tool-bar-lines . nil) - (font . "monaco-12"))) -(setq emms-source-file-default-directory "/mnt/music/") + (font . "Envy Code R:pixelsize=18") + (alpha 90 90))) +(setq elnode-do-init nil) (setq erc-autojoin-channels-alist - '(("freenode.net" "#ninthfloor" "#emacs" "#dispass"))) + '(("freenode.net" "#ninthfloor" "#emacs"))) (setq erc-hide-list '("JOIN" "PART" "QUIT")) (setq erc-insert-timestamp-function 'erc-insert-timestamp-left) (setq erc-nick "ryuslash") (setq erc-timestamp-format "[%H:%M] ") (setq erc-timestamp-only-if-changed-flag nil) -(setq eshell-highlight-prompt nil) -(setq eshell-prompt-function 'oni:eshell-prompt-function) -(setq eshell-prompt-regexp "^[#$]> ") (setq fci-rule-color "darkred") -(setq flymake-gui-warnings-enabled nil) -(setq flymake-info-line-regexp - (eval-when-compile - (regexp-opt - '("Invalid name" - "String statement has no effect" - "Missing docstring" - "Empty docstring" - "multiple imports on one line" - "expected 2 blank lines, found 1" - "expected 2 blank lines, found 0" - "TODO:" - "whitespace after '{'" - "whitespace before '}'" - "whitespace before ':'" - "whitespace after '('" - "whitespace before ')'" - "whitespace after '['" - "whitespace before ']'" - "the backslash is redundant between brackets" - "continuation line over-indented for visual indent" - "continuation line under-indented for visual indent" - "Too many statements" - "comparison to None should be" - "missing whitespace around operator" - "missing whitespace after ','" - "line too long" - "at least two spaces before inline comment" - "trailing whitespace" - "imported but unused" - "Unused import" - "too many blank lines")))) -(setq flymake-log-file-name (expand-file-name "~/.emacs.d/flymake.log")) -(setq flymake-log-level 0) -(setq flymake-warn-line-regexp - (eval-when-compile - (regexp-opt '("warning" - "Warning" - "redefinition of unused" - "Redefining built-in" - "Redefining name" - "Unused argument" - "Unused variable" - "Dangerous default value {} as argument" - "no newline at end of file" - "Access to a protected member")))) (setq frame-title-format '(:eval (concat "emacs: " (buffer-name)))) (setq geiser-repl-history-filename "~/.emacs.d/geiser-history") (setq gnus-init-file "~/.emacs.d/gnus") (setq gtags-auto-update t) (setq help-at-pt-display-when-idle t) +(setq highlight-80+-columns 72) +(setq identica-enable-striping t) (setq ido-auto-merge-delay-time 1000000) (setq ido-default-buffer-method 'selected-window) (setq ido-max-window-height 1) (setq ido-save-directory-list-file nil) -(setq ido-ubiquitous-command-exceptions '(org-refile)) +(setq ido-ubiquitous-command-exceptions + '(org-refile org-capture-refile)) (setq inferior-lisp-program "sbcl") (setq inhibit-default-init t) (setq inhibit-local-menu-bar-menus t) @@ -217,15 +125,16 @@ (setq initial-major-mode 'emacs-lisp-mode) (setq initial-scratch-message nil) (setq jabber-account-list '(("ryuslash@jabber.org") - ("tom@ryuslash.org" + ("tom@ryuslash.org/Emacs" (:connection-type . ssl)))) -(setq jabber-chat-buffer-format "*jabber:%n*") +(setq jabber-chat-buffer-format "*jab:%n*") (setq jabber-chat-buffer-show-avatar nil) (setq jabber-chat-fill-long-lines nil) -(setq jabber-chat-foreign-prompt-format "%t <\n") -(setq jabber-chat-local-prompt-format "%t >\n") +(setq jabber-chat-foreign-prompt-format "%t %u/%r <\n") +(setq jabber-chat-local-prompt-format "%t %u/%r >\n") (setq jabber-chatstates-confirm nil) (setq jabber-history-dir "~/.emacs.d/jabber") +(setq jabber-muc-autojoin '("aethon@muc.ryuslash.org")) (setq jabber-roster-show-bindings nil) (setq jit-lock-defer-time 0.2) (setq magit-repo-dirs '("~/projects/" "~/var/src/")) @@ -234,9 +143,8 @@ (setq message-sendmail-extra-arguments '("-a" "ryuslash")) (setq package-archives '(("melpa" . "http://melpa.milkbox.net/packages/") - ("ELPA" . "http://tromey.com/elpa/") - ("gnu" . "http://elpa.gnu.org/packages/") - ("marmalade" . "http://marmalade-repo.org/packages/"))) + ("marmalade" . "http://marmalade-repo.org/packages/") + ("gnu" . "http://elpa.gnu.org/packages/"))) (setq package-load-list '((htmlize "1.39") (lua-mode "20111107") all)) @@ -249,6 +157,7 @@ (setq redisplay-dont-pause t) (setq send-mail-function 'smtpmail-send-it) (setq sendmail-program "/usr/bin/msmtp") +(setq sentence-end-double-space nil) (setq smex-key-advice-ignore-menu-bar t) (setq smex-save-file "~/.emacs.d/smex-items") (setq split-height-threshold 40) @@ -272,12 +181,12 @@ (add-hook 'c-mode-hook 'oni:c-mode-func) (add-hook 'css-mode-hook 'oni:css-mode-func) (add-hook 'diary-display-hook 'oni:diary-display-func) +(add-hook 'emacs-startup-hook 'oni:emacs-startup-func) (add-hook 'emacs-lisp-mode-hook 'oni:emacs-lisp-mode-func) (add-hook 'erc-mode-hook 'oni:erc-mode-func) -(add-hook 'eshell-mode-hook 'oni:eshell-mode-func) -(add-hook 'flymake-mode-hook 'oni:flymake-mode-func) (add-hook 'go-mode-hook 'oni:go-mode-func) (add-hook 'gtags-mode-hook 'oni:gtags-mode-func) +(add-hook 'haskell-mode-hook 'oni:haskell-mode-func) (add-hook 'html-mode-hook 'oni:html-mode-func) (add-hook 'jabber-alert-message-hooks 'oni:jabber-alert-message-func) (add-hook 'jabber-chat-mode-hook 'oni:jabber-chat-mode-func) @@ -299,19 +208,17 @@ (add-hook 'write-file-hooks 'oni:write-file-func) (add-hook 'yas-minor-mode-hook 'oni:yas-minor-mode-func) +(define-key key-translation-map (kbd "C-j") (kbd "C-l")) +(define-key key-translation-map (kbd "C-l") (kbd "C-j")) + (global-set-key (kbd "'") 'oni:self-insert-dwim) -(global-set-key (kbd "") 'emms-next) -(global-set-key (kbd "") 'oni:emms-toggle-playing) -(global-set-key (kbd "") 'emms-previous) -(global-set-key (kbd "") 'emms-stop) (global-set-key (kbd "") 'oni:raise-scratch) (global-set-key (kbd "") 'oni:view-mail) -(global-set-key (kbd "") 'oni:start-emms) (global-set-key (kbd "") 'git-project-show-files) (global-set-key (kbd "") 'ext:reload-buffer) (global-set-key (kbd "") 'jabber-switch-to-roster-buffer) (global-set-key (kbd "") 'magit-status) -(global-set-key (kbd "") 'oni:raise-eshell) +(global-set-key (kbd "") 'oni:show-org-index) (global-set-key (kbd "C-<") 'oni:indent-shift-left) (global-set-key (kbd "C->") 'oni:indent-shift-right) (global-set-key (kbd "C-M-4") 'split-window-vertically) @@ -329,14 +236,14 @@ (global-set-key (kbd "C-e") 'oni:move-end-of-dwim) (global-set-key (kbd "C-k") 'oni:kill-region-or-line) (global-set-key (kbd "C-w") 'oni:kill-region-or-backward-char) -(global-set-key (kbd "M-4") 'split-window-horizontally) -(global-set-key (kbd "M-n") 'idomenu) -(global-set-key (kbd "\"") 'oni:self-insert-dwim) -(global-set-key (kbd "M-o") 'other-window) +(global-set-key (kbd "M-0") 'delete-window) (global-set-key (kbd "M-1") 'delete-other-windows) (global-set-key (kbd "M-2") 'split-window-below) (global-set-key (kbd "M-3") 'split-window-right) -(global-set-key (kbd "M-0") 'delete-window) +(global-set-key (kbd "M-4") 'split-window-horizontally) +(global-set-key (kbd "M-n") 'idomenu) +(global-set-key (kbd "M-o") 'other-window) +(global-set-key (kbd "\"") 'oni:self-insert-dwim) (if (daemonp) (global-set-key "\C-x\C-c" 'oni:close-client-window)) @@ -369,24 +276,15 @@ 'display-buffer-alist '("^\\*magit: .*\\*$" . ((display-buffer-same-window . nil)))) -(unless (oni:required-packages-installed-p) - (message "%s" "Refreshing package database...") - (package-refresh-contents) - (message "%s" " done.") - (mapc #'(lambda (package) - (when (not (package-installed-p package)) - (package-install package))) - oni:required-packages)) - (blink-cursor-mode -1) (column-number-mode -1) (line-number-mode -1) -(menu-bar-mode -1) -(scroll-bar-mode -1) -(tool-bar-mode -1) (tooltip-mode -1) +(package-initialize) + (auto-insert-mode) +(cua-selection-mode t) (electric-indent-mode) (electric-pair-mode) (ido-mode) @@ -398,8 +296,8 @@ (smex-initialize) (help-at-pt-set-timer) - -(load-theme 'yoshi t) +(windmove-default-keybindings) +(global-diff-hl-mode) (load custom-file) ;; (load "rudel-loaddefs.el") @@ -408,7 +306,6 @@ (server-start)) (diminish 'auto-fill-function "_") -(ac-config-default) (provide 'init) diff --git a/.emacs.d/init.org b/.emacs.d/init.org index 6cd2032..f4acfca 100644 --- a/.emacs.d/init.org +++ b/.emacs.d/init.org @@ -1,308 +1,310 @@ #+TITLE: Emacs init #+STYLE: #+OPTIONS: author:nil - -* Startup - - Startup requires a bit of customization to handle all my - customizations. - -** Load paths - - I have two versions of Emacs installed on my main computer. I have - a daily build of Emacs's ~trunk~ (or currently ~emacs-24~) branch from - bazaar and I have the official ~emacs~ package from archlinux - installed. I keep that second one around so that the occasional - emacs package that I install using ~pacman~ will recognize it as a - dependency and so that if there has been some horrible mistake in - the ~trunk~ branch I still have a stable version to fall back - on[fn:1]. - -*** Package initialization - - In order for packages installed through ELPA to be included - without having to mess with load paths and such, use: - - #+NAME: package-initialize - #+BEGIN_SRC emacs-lisp - (package-initialize) - #+END_SRC - -*** site-lisp - - Because of the setup I wrote about I need to have both the - self-built ~site-lisp~ directory in my load path *and* the "official" - one. - - The =oni:add-all-to-load-path= function just binds =default-directory= - to the given directory and calls - =normal-top-level-add-subdirs-to-load-path= to add it and all its - subdirectories to the load path. - - #+NAME: add-all - #+BEGIN_SRC emacs-lisp - (defun oni:add-all-to-load-path (dir) - (add-to-list 'load-path dir) - (let ((default-directory dir)) - (normal-top-level-add-subdirs-to-load-path))) - #+END_SRC - -**** TODO Add load paths in different order depending on version - - The officially installed version should load - =/usr/share/emacs/site-lisp= before - =/usr/local/emacs/share/emacs/sit-lisp= and the bzr version should - do the reversed. - -*** Projects - - Then there are some projects I'm working on, which I use on a - daily basis, these should also be added so I don't have to - constantly remove and re-install them through ~package.el~ when - working on them. And there is the ~load-defs.el~ in my personal - ~site-lisp~ directory of course. - - #+NAME: load-projects - #+BEGIN_SRC emacs-lisp - (mapc #'oni:add-to-load-path-maybe-load-defs - '("~/projects/emacs/dispass.el" "~/var/src/emacs/mode-icons" - "~/.emacs.d/site-lisp")) - #+END_SRC - - The =oni:add-to-load-path-maybe-load-defs= function just adds the - given directory to the load path and then looks for a file named - ~loaddefs.el~ within that directory, if it exists it loads it. - - #+NAME: add-with-loaddefs - #+BEGIN_SRC emacs-lisp - (defun oni:add-to-load-path-maybe-load-defs (dir) - (add-to-list 'load-path dir) - (let ((loaddefs (concat dir "/loaddefs.el"))) - (when (file-exists-p loaddefs) - (load loaddefs)))) - #+END_SRC - -*** Themes - - And, finally, I'm also working on a color theme for emacs, this - should be added to ~custom-theme-load-path~. By using =mapc= here as - well I'm keeping in mind that this isn't the first theme I've - worked on and it might not be the last either. - - #+NAME: load-themes - #+BEGIN_SRC emacs-lisp - (mapc #'oni:add-to-custom-theme-load-path - '("~/projects/emacs/yoshi-theme")) - #+END_SRC - - The =oni:add-to-custom-theme-load-path= just adds the given - directory to the cutom theme load path. - - #+NAME: add-themes - #+BEGIN_SRC emacs-lisp - (defun oni:add-to-custom-theme-load-path (dir) - (add-to-list 'custom-theme-load-path dir)) - #+END_SRC - -*** Evaluation - - Because during byte-compilation certain parts loaded so far might - also be required I put it in an =eval-and-compile= form, so that all - components are loaded with ~emacs -Q~ as well. Without this - compilation might fail at certain points. - - #+BEGIN_SRC emacs-lisp :tangle init2.el :noweb yes - (eval-and-compile - <> - - <> - - <> - - <> - <> - <> - <>) - #+END_SRC - -** Modules - - While I try to use =eval-after-load= and =autoload= as much as - possible, some things require direct =require='ing to be of use. - -*** Require - - - ~auto-complete-config~ :: This sets up some default settings to - make ~auto-complete~ work for most[fn:2] of the modes it - supports. - - #+BEGIN_SRC emacs-lisp :tangle init2.el - (require 'auto-complete-config) - #+END_SRC - - - ~geiser-install~ :: Sets up geiser autoloads and such. - - #+BEGIN_SRC emacs-lisp :tangle init2.el - (require 'geiser-install) - #+END_SRC - - - ~uniquify~ :: Provides more helpful buffer name uniquification. - The default of using ~buffer-name<2>~ is boring and - uninformative, ~uniquify~ fixes this. - - #+BEGIN_SRC emacs-lisp :tangle init2.el - (require 'uniquify) - #+END_SRC - - - ~ext~ :: Functions from external sources. - - ~oni~ :: Functions written personally. - - #+BEGIN_SRC emacs-lisp :tangle init2.el - (require 'ext) - (require 'oni) - #+END_SRC - -*** Autoload - - These might not be used at all in a session, so they should only - be loaded when necessary. - - =define-slime-contrib= was used by some module that didn't autoload - or require it[fn:3]. But since I don't use whichever model it - was every day, it is of no use to load it every single time. - - #+BEGIN_SRC emacs-lisp :tangle init2.el - (autoload 'define-slime-contrib "slime") - #+END_SRC - - I installed ~global~ with ~pacman~, but this doesn't add anything to - any =loaddefs.el=, so doesn't create any autoloads. - - #+BEGIN_SRC emacs-lisp :tangle init2.el - (autoload 'gtags-mode "gtags" nil t) - #+END_SRC - - ~jabber.el~ does create ~jabber-autoloads.el~, but I only ever start - using it through ~jabber-connect~, so anything else isn't really - necessary. - - #+BEGIN_SRC emacs-lisp :tangle init2.el - (autoload 'jabber-connect "jabber" nil t) - #+END_SRC - - I used to work a bit on ~php-mode~, but that was a while ago, so - it's still in my ~site-lisp~ directory. - - #+BEGIN_SRC emacs-lisp :tangle init2.el - (autoload 'php-mode "php-mode" nil t) - #+END_SRC - - The same that goes for ~gtags.el~ also goes for ~po-mode.el~. - - #+BEGIN_SRC emacs-lisp :tangle init2.el - (autoload 'po-mode "po-mode" nil t) - #+END_SRC - - And the same that went for ~php-mode~ also goes for ~pony-mode~, - except I'm still working on it and I was too lazy to put it with - my other projects. I should still do that. - - #+BEGIN_SRC emacs-lisp :tangle init2.el - (autoload 'pony-mode "pony-mode" nil t) - #+END_SRC - - ~sawfish.el~ has the same problem that ~gtags.el~ and ~po-mode.el~ have. - - #+BEGIN_SRC emacs-lisp :tangle init2.el - (autoload 'sawfish-mode "sawfish" nil t) - #+END_SRC - - I use =server-running-p= to check whether or not I should start a - new server, but this function isn't autoloaded by default. - - #+BEGIN_SRC emacs-lisp :tangle init2.el - (autoload 'server-running-p "server") - #+END_SRC - - I was starting to try ~slime-js~ to make JavaScript programming - more interesting, but I haven't gotten around to trying it out - fully, yet. It shares issues with ~gtags.el~, ~po-mode.el~ and - ~sawfish.el~. - - #+BEGIN_SRC emacs-lisp :tangle init2.el - (autoload 'slime-js-minor-mode "slime-js" nil t) - #+END_SRC - - I found ~xmodmap-mode~ on the [[http://emacswiki.org][EmacsWiki]] some time ago, it was - simple and a good example of how to use ~define-generic-mode~, but - since it's not really my project and it's really small it just - sits in my ~site-lisp~ directory. - - #+BEGIN_SRC emacs-lisp :tangle init2.el - (autoload 'xmodmap-mode "xmodmap-mode" nil t) - #+END_SRC - - ~w3m~ also has a setup module like ~geiser-install~, but since I only - ever use these two functions to start it, there is no real need - for anything else. - - #+BEGIN_SRC emacs-lisp :tangle init2.el - (autoload 'w3m-bookmark-view "w3m" nil t) - (autoload 'w3m-goto-url "w3m" nil t) - #+END_SRC - -* Aliases - - There are some functions that are just better than others, no - matter how politically incorrect it might be to admit. +#+STARTUP: showall +#+LINK: yoshi-theme http://ryuslash.org/projects/yoshi-theme.html + +* Emacs init + + Before doing anything else I should make sure that both the + directories ~/usr/local/emacs/share/emacs/site-lisp~ and + ~/usr/share/emacs/site-list~ are included in =load-path=, along with + their subdirectories, but only if they haven't already been added + and exist. Place them at the end of =load-path= so they don't mess up + package precedence. + + #+BEGIN_SRC emacs-lisp :tangle init2.el + (eval-and-compile + (defun oni:path-init (dir) + "Add DIR to `load-path' and all its subdirectories, unless + DIR is already in `load-path'." + (unless (or (member dir load-path) (not (file-exists-p dir))) + (let ((default-directory dir)) + (add-to-list 'load-path dir t) + (normal-top-level-add-subdirs-to-load-path)))) + (oni:path-init "/usr/share/emacs/site-lisp") + (oni:path-init "/usr/local/emacs/share/emacs/site-lisp")) + #+END_SRC + + Add my project [[yoshi-theme]] to =custom-theme-load-path= and load it. + + #+BEGIN_SRC emacs-lisp :tangle init2.el + (add-to-list 'custom-theme-load-path "~/projects/emacs/yoshi-theme/") + (load-theme 'yoshi t) + #+END_SRC + + Remove the ~menu-bar~, ~tool-bar~ and ~scroll-bar~ from the UI since I + don't use them at all. + + #+BEGIN_SRC emacs-lisp :tangle init2.el + (menu-bar-mode -1) + (scroll-bar-mode -1) + (tool-bar-mode -1) + #+END_SRC + + Add any other interesting paths to =load-path= and, if it exists, + load the ~loaddefs.el~ file from these directories. + + #+BEGIN_SRC emacs-lisp :tangle init2.el + (mapc #'(lambda (dir) + (add-to-list 'load-path dir) + (let ((loaddefs (concat dir "/loaddefs.el"))) + (when (file-exists-p loaddefs) + (load loaddefs)))) + '("~/projects/emacs/mode-icons" "~/.emacs.d/site-lisp" + "~/projects/emacs/pony-mode/src" "~/projects/emacs/php-mode")) + #+END_SRC + + Don't ask ~yes~ or ~no~, ask ~y~ or ~n~, I've never had an accidental ~y~ so + far. #+BEGIN_SRC emacs-lisp :tangle init2.el (defalias 'yes-or-no-p 'y-or-n-p) + #+END_SRC + + Use =ibuffer= instead of the default =list-buffers= because it has many + more features. + + #+BEGIN_SRC emacs-lisp :tangle init2.el (defalias 'list-buffers 'ibuffer) + #+END_SRC + + Do the same with =hippie-expand= and =dabbrev-expand=. + + #+BEGIN_SRC emacs-lisp :tangle init2.el (defalias 'dabbrev-expand 'hippie-expand) #+END_SRC -* Faces - - Define faces for use with ~magit~ log edit mode. + Don't show it when ~eldoc~ is running, I almost assume that it is + whenever I'm working in a mode that supports it anyway. This should + only execute once ~eldoc~ has been loaded. #+BEGIN_SRC emacs-lisp :tangle init2.el - (defface git-commit-summary-face - '((t (:inherit org-level-1))) - "Face for the git title line." - :group 'local) - - (defface git-commit-overlong-summary-face - '((t (:background "#873732"))) - "Face for commit titles that are too long." - :group 'local) - - (defface git-commit-nonempty-second-line-face - '((t (:inherit git-commit-overlong-summary-face))) - "Face for the supposedly empty line in commit messages." - :group 'local) + (eval-after-load "eldoc" '(diminish 'eldoc-mode)) #+END_SRC -* Keys + Use the standard EMMS configuration and add some MPD settings. - With the awesome power of Emacs comes the need for lots of - keybindings. + #+BEGIN_SRC emacs-lisp :tangle init2.el + (defun oni:emms-init () + "Initialization function for EMMS." + (require 'emms-setup) + (require 'emms-player-mpd) -** Translation + (emms-standard) - Since the ~C-l~ combination is so much easier than ~C-j~ when using - the [[http://colemak.com][colemak]] keyboard layout and ~C-j~ is used so much more, switch - them. + (add-to-list 'emms-info-functions 'emms-info-mpd) + (add-to-list 'emms-player-list 'emms-player-mpd) - #+BEGIN_SRC emacs-lisp tangle init2.el - (define-key key-translation-map (kbd "C-j") (kbd "C-l")) - (define-key key-translation-map (kbd "C-l") (kbd "C-j")) + (setq emms-player-mpd-server-name "localhost") + (setq emms-player-mpd-server-port "6600") + (setq emms-player-mpd-music-directory "/mnt/music/mp3")) + + (eval-after-load "emms-source-file" '(oni:emms-init)) + (setq emms-source-file-default-directory "/mnt/music/") #+END_SRC -* Footnotes -[fn:1] Though it doesn't happen often that ~trunk~ is so messed up that -I can't use it. + Add some keybindings for EMMS. -[fn:2] Or perhaps all. + #+BEGIN_SRC emacs-lisp :tangle init2.el + (defun oni:emms-toggle-playing () + "Toggle between playing/paused states." + (interactive) + (if (eq emms-player-playing-p nil) + (emms-start) + (emms-pause))) -[fn:3] I think it was ~slime-js-minor-mode~, but I'm not sure. + (defun oni:start-emms () + "Check to see if the function `emms' exists, if not call + `emms-player-mpd-connect' and assume that will have loaded it." + (interactive) + (unless (fboundp 'emms) + (emms-player-mpd-connect)) + (emms)) + + (global-set-key (kbd "") 'emms-next) + (global-set-key (kbd "") 'oni:emms-toggle-playing) + (global-set-key (kbd "") 'emms-previous) + (global-set-key (kbd "") 'emms-stop) + (global-set-key (kbd "") '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 "") 'oni:raise-eshell) + #+END_SRC diff --git a/.emacs.d/site-lisp/dzen.el b/.emacs.d/site-lisp/dzen.el index 2d43f95..6cc3eae 100644 --- a/.emacs.d/site-lisp/dzen.el +++ b/.emacs.d/site-lisp/dzen.el @@ -39,7 +39,9 @@ (defun dzen-update () (let ((strl "") - (strc metal-express-radio-currently-playing) + (strc (if (boundp 'metal-express-radio-currently-playing) + metal-express-radio-currently-playing + "")) (strr (format "jabber: %s ryu: %d gm: %d aet: %d 9n: %d rss: %d\n" (oni:current-jabber-status) diff --git a/.emacs.d/site-lisp/oni.el b/.emacs.d/site-lisp/oni.el index 979e804..ea64d3f 100644 --- a/.emacs.d/site-lisp/oni.el +++ b/.emacs.d/site-lisp/oni.el @@ -27,22 +27,6 @@ (autoload 'notifications-notify "notifications") (autoload 'jabber-send-message "jabber-chat") -(defmacro oni:define-mailbox (name email &optional signature longname) - "Define a mailbox function for mailbox NAME with address EMAIL. -Optionally set signature to SIGNATURE and use LONGNAME as the -actual account name." - `(defun ,(make-symbol (concat "oni:" name "-mailbox")) () - ,(concat "Settings for " name " mailbox") - (setq mu4e-mu-home ,(expand-file-name (concat "~/.mu/" name)) - mu4e-maildir ,(expand-file-name (concat "~/documents/mail/" - (or longname name))) - mu4e-get-mail-command ,(concat "offlineimap -oa " (or longname - name)) - mu4e~main-buffer-name ,(concat "*mu4e-" name "*") - user-mail-address ,email - message-sendmail-extra-arguments '("-a" ,name) - message-signature-file ,signature))) - (defmacro oni:email (user at host dot com) "Turn arguments into an email address. The resulting email address will look like: USER@HOST.COM, AT and @@ -50,20 +34,6 @@ DOT are intentionally being skipped." (concat (symbol-name user) "@" (symbol-name host) "." (symbol-name com))) -(defvar oni:mailbox-map - '("top" ("menu" - ("ryulash.org" . "ryuslash") - ("ninthfloor" . "ninthfloor") - ("gmail" . "gmail") - ("aethon" . "aethon"))) - "A mailbox map for use with `tmm-prompt'.") - -(defvar oni:required-packages - '(graphviz-dot-mode htmlize magit rainbow-delimiters rainbow-mode - yasnippet markdown-mode flymake flymake-cursor sauron expand-region - fill-column-indicator git-auto-commit-mode idomenu magit smex) - "List of all the packages I have (want) installed.") - (defun oni:after-save-func () "Function for `after-save-hook'." (oni:compile-el) @@ -81,7 +51,9 @@ DOT are intentionally being skipped." nil (format "%s%s (in %s minutes)" new-time appt-msg min-to-app) nil) (appt-disp-window min-to-app new-time appt-msg)) - +;; (jabber-send-message (car jabber-connections) +;; "aethon@muc.ryuslash.org" nil "Hi, I'm a programmatic message; this +;; upens up possibilities :)" "groupchat") (defun oni:before-save-func () "Function for `before-save-hook'." (if (eq major-mode 'html-mode) @@ -99,6 +71,10 @@ DOT are intentionally being skipped." (interactive) (server-save-buffers-kill-terminal nil)) +(defun oni:color-for (object) + "Generate a hex color by taking the first 6 characters of OBJECT's MD5 sum." + (format "#%s" (substring (md5 object) 0 6))) + (defun oni:compile-el () "Compile the current buffer file if it is an .el file." (let* ((full-file-name (buffer-file-name)) @@ -128,12 +104,10 @@ DOT are intentionally being skipped." "Function for `emacs-lisp-mode-hook'." (eldoc-mode)) -(defun oni:emms-toggle-playing () - "Toggle between playing/paused states." - (interactive) - (if (eq emms-player-playing-p nil) - (emms-start) - (emms-pause))) +(defun oni:emacs-startup-func () + "Function for `emacs-init-hook'." + (require 'auto-complete-config) + (ac-config-default)) (defun oni:erc-mode-func () "Function for `erc-mode-hook'." @@ -141,44 +115,6 @@ DOT are intentionally being skipped." (visual-line-mode) (setq truncate-lines nil)) -(defun oni:eshell-mode-func () - "Function for `eshell-mode-hook'." - (setq truncate-lines nil)) - -(defun oni:eshell-prompt-function () - "Show a pretty shell prompt." - (let ((status (if (zerop eshell-last-command-status) ?+ ?-)) - (hostname (shell-command-to-string "hostname")) - (dir (abbreviate-file-name (eshell/pwd))) - (branch - (shell-command-to-string - "git branch --contains HEAD 2>/dev/null | sed -e '/^[^*]/d'")) - (userstatus (if (zerop (user-uid)) ?# ?$))) - (concat - (propertize (char-to-string status) - 'face `(:foreground ,(if (= status ?+) - "green" - "red"))) - " " - (propertize (substring hostname 0 -1) 'face 'mode-line-buffer-id) - " " - (propertize (oni:shorten-dir dir) 'face 'font-lock-string-face) - " " - (when (not (string= branch "")) - (propertize - ;; Cut off "* " and "\n" - (substring branch 2 -1) - 'face 'font-lock-function-name-face)) - " \n" - (propertize (char-to-string userstatus) - 'face `(:foreground "blue")) - "> "))) - -(defun oni:flymake-mode-func () - "Function for `flymake-mode-hook'." - (local-set-key [M-P] 'flymake-goto-prev-error) - (local-set-key [M-N] 'flymake-goto-next-error)) - (defun oni:go-mode-func () "Function for `go-mode-hook'." (setq indent-tabs-mode nil) @@ -189,9 +125,28 @@ DOT are intentionally being skipped." (local-set-key "\M-," 'gtags-find-tag) (local-set-key "\M-." 'gtags-find-rtag)) +(defun oni:haskell-mode-func () + "Function for `haskell-mode-hook'." + (turn-on-haskell-indentation)) + (defun oni:html-mode-func () "Function for `html-mode-hook'." - (fci-mode)) + (yas-minor-mode) + (fci-mode) + (flycheck-mode)) + +(defun oni:ido-init () + "Initialization functionn for ido." + (setq ido-ignore-buffers + (list "^\\` " "^irc\\." "^\\#" "^\\*Customize Option:" + (eval-when-compile + (regexp-opt + '("*-jabber-roster-*" + "*Messages*" + "*fsm-debug*" + "*magit-process*" + "*magit-edit-log*" + "*Backtrace*")))))) (defun oni:indent-shift-left (start end &optional count) "Rigidly indent region. @@ -245,6 +200,10 @@ If COUNT has been specified indent by that much, otherwise look at '(global-mode-string)) header-line-format nil)) +(defun oni:jabber-init () + "Initialization function for jabber." + (remove-hook 'jabber-alert-presence-hooks 'jabber-presence-echo)) + (defun oni:jabber-roster-mode-func () "Function for `jabber-roster-mode-hook'." (setq mode-line-format @@ -257,8 +216,7 @@ If COUNT has been specified indent by that much, otherwise look at (defun oni:js-mode-func () "Function for `js-mode-hook'." (rainbow-delimiters-mode) - (local-set-key "\C-j" 'oni:newline-and-indent) - (pretty-symbols-mode -1)) + (local-set-key "\C-j" 'oni:newline-and-indent)) (defun oni:js2-mode-func () "Function for `js2-mode-hook'." @@ -292,7 +250,8 @@ If COUNT has been specified indent by that much, otherwise look at "Function for `lua-mode-hook'." (local-unset-key (kbd ")")) (local-unset-key (kbd "]")) - (local-unset-key (kbd "}"))) + (local-unset-key (kbd "}")) + (flycheck-mode)) (defun oni:magit-log-edit-mode-func () "Function for `magit-log-edit-mode-hook'." @@ -403,29 +362,30 @@ When dealing with braces, add another line and indent that too." (defun oni:php-mode-func () "Function for `php-mode-hook'." - (flymake-mode) (local-set-key "\C-j" 'oni:newline-and-indent) (c-set-offset 'arglist-intro '+) (c-set-offset 'arglist-close '0) (rainbow-delimiters-mode) - (setq fci-rule-column 80)) + (setq-local fci-rule-column 80) + (flycheck-mode)) (defun oni:pretty-control-l-function (win) - "Just make a string of either `fci-rule-colum' or `fill-column' -length -1. Use the `-' character. WIN is ignored." + "Just make a string of either `fci-rule-column' or +`fill-column' length -1. Use the `-' character. WIN is ignored." (make-string - (1- (if (boundp 'fci-rule-column) fci-rule-column fill-column)) ?-)) + (1- (if (boundp 'fci-rule-column) + fci-rule-column fill-column)) ?-)) (defun oni:prog-mode-func () "Function for `prog-mode-hook'." (rainbow-delimiters-mode) (fci-mode) - (pretty-symbols-mode) + (yas-minor-mode) (auto-fill-mode)) (defun oni:python-mode-func () "Function for `python-mode-hook'." - (flymake-mode) + (flycheck-mode) (local-set-key (kbd "C->") 'python-indent-shift-right) (local-set-key (kbd "C-<") 'python-indent-shift-left) (set (make-local-variable 'electric-indent-chars) nil) @@ -436,6 +396,10 @@ length -1. Use the `-' character. WIN is ignored." (fci-mode) (whitespace-mode)) +(defun oni:rainbow-mode-init () + "Initialization function for rainbow-mode." + (diminish 'rainbow-mode)) + (defun oni:raise-ansi-term (arg) "Create or show an `ansi-term' buffer." (interactive "P") @@ -444,19 +408,6 @@ length -1. Use the `-' character. WIN is ignored." (switch-to-buffer buffer) (call-interactively 'ansi-term)))) -(defun oni:raise-eshell () - "Start or switch back to `eshell'. -Also change directories to current working directory." - (interactive) - (let ((dir (file-name-directory - (or (buffer-file-name) "~/"))) - (hasfile (not (eq (buffer-file-name) nil)))) - (eshell) - (if (and hasfile (eq eshell-process-list nil)) - (progn - (eshell/cd dir) - (eshell-reset))))) - (defun oni:raise-scratch (&optional mode) "Show the *scratch* buffer. If called with a universal argument, ask the user which mode to @@ -519,16 +470,6 @@ use. If MODE is not nil, open a new buffer with the name default-directory "' request-pull " (when patchp "-p ") from " " url " " to)))))) -(defun oni:required-packages-installed-p () - "Check if all the packages I need are installed." - (let ((tmp-packages oni:required-packages) - (result t)) - (while (and tmp-packages result) - (if (not (package-installed-p (car tmp-packages))) - (setq result nil)) - (setq tmp-packages (cdr tmp-packages))) - result)) - (defun oni:rst-mode-func () "Function for `rst-mode-hook'." (auto-fill-mode)) @@ -559,6 +500,16 @@ insert at the end of the region and at the beginning." (interactive) (message (format "%d:%d" (line-number-at-pos) (current-column)))) +(defun oni:show-org-index () + "Show the index of my org files." + (interactive) + (find-file "~/documents/org/index.org")) + +(defun oni:smex-init () + "Initialization function for smex." + (global-set-key (kbd "M-x") 'smex) + (global-set-key (kbd "C-M-x") 'smex-major-mode-commands)) + (defun oni:split-window-interactive (dir) "Split windows in direction DIR. @@ -582,13 +533,16 @@ If no direction is given, don't split." ((?h) (split-window-horizontally)) (t window)))) -(defun oni:start-emms () - "Check to see if the function `emms' exists, if not call -`emms-player-mpd-connect' and assume that will have loaded it." +(defun oni:start-python-test-mail-server () + "Run the python test mailserver." (interactive) - (unless (fboundp 'emms) - (emms-player-mpd-connect)) - (emms)) + (start-process "python-test-mail-server" "*py-mail-server*" "python" "-m" + "smtpd" "-n" "-c" "DebuggingServer" "localhost:1025")) + +(defun oni:stop-python-test-mail-server () + "Stop the python test mailserver." + (interactive) + (kill-process "python-test-mail-server")) (defun oni:term-mode-func () "Function for `term-mode-hook'." @@ -599,20 +553,6 @@ If no direction is given, don't split." (setq-local comment-auto-fill-only-comments nil) (auto-fill-mode)) -(defun oni:view-mail (inbox) - "Show a menu with all mailbox options from `oni:mailbox-map' -for easy selection." - (interactive - (list (progn - (require 'tmm) - (let ((tmm-completion-prompt "Choose a mailbox\n")) - (tmm-prompt oni:mailbox-map))))) - (if inbox - (progn - (require 'mu4e) - (funcall (intern (concat "oni:" inbox "-mailbox"))) - (mu4e)))) - (defun oni:write-file-func () "Function for `write-file-hooks'." (time-stamp)) @@ -623,11 +563,25 @@ for easy selection." (define-key yas-minor-mode-map [(tab)] nil) (define-key yas-minor-mode-map (kbd "C-\\") 'yas-expand)) -(define-skeleton html-tag - "Testing creation of an html tag" - "Tagname:" - "<" str ("Attribute: " " " str "=\"" (skeleton-read "Value: ") "\"") ">\n" - "\n") +(defun oni:yasnippet-init () + "Initialization function for yasnippet." + (diminish 'yas-minor-mode)) + +(defvar oni:auto-save-name-transforms + `((".*" ,temporary-file-directory t)) + "Place all auto-save files in `temporary-file-directory'.") + +(defvar oni:backup-directory-alist + `((".*" . ,temporary-file-directory)) + "Palce all backup files in `temporary-file-directory'.") + +(defvar oni:mailbox-map + '("top" ("menu" + ("ryulash.org" . "ryuslash") + ("ninthfloor" . "ninthfloor") + ("gmail" . "gmail") + ("aethon" . "aethon"))) + "A mailbox map for use with `tmm-prompt'.") (provide 'oni) ;;; oni.el ends here diff --git a/.emacs.d/site-lisp/org-init.el b/.emacs.d/site-lisp/org-init.el index 23ae6a5..4033c30 100644 --- a/.emacs.d/site-lisp/org-init.el +++ b/.emacs.d/site-lisp/org-init.el @@ -30,16 +30,73 @@ (require 'org-habit) (require 'org-protocol) +(autoload 'org-clocking-p "org-clock") + (eval-after-load "org-crypt" '(org-crypt-use-before-save-magic)) +(defun oni:note-template () + (concat + "* %<%c>\n" + " :DIRECTORY: =" default-directory "=\n" + (when (buffer-file-name) " :FILE: [[file:%F][%F]]\n") + (when (org-clocking-p) " :TASK: %K\n") + "\n %?")) + +(defun oni:org-maybe-outline-path () + (let ((outline-path (org-format-outline-path (org-get-outline-path)))) + (unless (string= outline-path "") + (setq outline-path (concat "[ " outline-path " ] "))) + outline-path)) + +(defun oni:set-org-agenda-files () + "Set `org-agenda-files` according to the current time." + (interactive) + (let* ((current-time (decode-time)) + (current-hour (nth 2 current-time)) + (current-dow (nth 6 current-time))) + (if (or (= current-dow 6) (= current-dow 0) ; Saturday or Sunday + (< current-hour 9) (>= current-hour 17)) + (setq org-agenda-files + (append oni:personal-agenda-files oni:common-agenda-files)) + (setq org-agenda-files + (append oni:work-agenda-files oni:common-agenda-files))))) + +(defvar oni:personal-agenda-files + (list (expand-file-name "~/documents/org/tasks")) + "My personal agenda, should only show up at times I don't have + to work.") + +(defvar oni:work-agenda-files + (list (expand-file-name "~/documents/org/work")) + "My work agenda, should only show up at times I work.") + +(defvar oni:common-agenda-files + (list (expand-file-name "~/documents/org/dailies") + (expand-file-name "~/documents/org/misc/contacts.org") + (expand-file-name "~/documents/org/misc/bookmarks.org")) + "Agenda files that are work-agnostic, should always show up.") + (setq org-agenda-custom-commands - '(("w" "Work todo." tags-todo "work"))) + '(("P" . "Personal only") + ("Pa" "Personal agenda" agenda "" + ((org-agenda-files (append oni:personal-agenda-files + oni:common-agenda-files)))) + ("Pt" "Personal todo" todo "" + ((org-agenda-files (append oni:personal-agenda-files + oni:common-agenda-files)))) + ("W" . "Work only") + ("Wa" "Work agenda" agenda "" + ((org-agenda-files (append oni:work-agenda-files + oni:common-agenda-files)))) + ("Wt" "Work todo" todo "" + ((org-agenda-files (append oni:work-agenda-files + oni:common-agenda-files)))))) (setq org-agenda-prefix-format '((agenda . " %i %-12:c%?-12t% s") (timeline . " % s") - (todo . " %i %-12:c %(concat \"[ \"(org-format-outline-path (org-get-outline-path)) \" ]\") ") - (tags . " %i %-12:c %(concat \"[ \"(org-format-outline-path (org-get-outline-path)) \" ]\") ") + (todo . " %i %-12:c %(oni:org-maybe-outline-path)") + (tags . " %i %-12:c %(oni:org-maybe-outline-path)") (search . " %i %-12:c"))) (setq org-agenda-sorting-strategy '((agenda habit-down time-up priority-down category-keep) @@ -47,23 +104,19 @@ (tags priority-down category-keep) (search category-keep))) (setq org-agenda-tags-column -101) +(setq org-directory (expand-file-name "~/documents/org")) +(setq org-default-notes-file (concat org-directory "/org")) (setq org-capture-templates - '(("t" "Task" entry (file "~/documents/org/tasks") + `(("t" "Task" entry (file "~/documents/org/tasks") "* TODO %?") ("T" "Linked task" entry (file "~/documents/org/tasks") - "* TODO %?\n\n %a"))) + "* TODO %?\n\n %a") + ("n" "General note" entry (file ,org-default-notes-file) + (function oni:note-template)))) (setq org-contacts-files '("~/documents/org/misc/contacts.org")) -(setq org-directory (expand-file-name "~/documents/org")) -(setq org-agenda-files - (append - `(,(concat org-directory "/tasks") - ,(concat org-directory "/misc/contacts.org") - ,(concat org-directory "/misc/bookmarks.org")) - org-agenda-files)) (setq org-agenda-show-outline-path nil) (setq org-agenda-todo-ignore-deadlines 'far) (setq org-agenda-todo-ignore-scheduled t) -(setq org-default-notes-file (concat org-directory "/org")) (setq org-export-htmlize-output-type 'css) (setq org-feed-alist '(("MyEpisodes" @@ -103,5 +156,9 @@ (org-agenda-to-appt) (ad-activate 'org-agenda-redo) +(oni:set-org-agenda-files) +(run-at-time "09:01" (* 60 60 24) 'oni:set-org-agenda-files) +(run-at-time "17:01" (* 60 60 24) 'oni:set-org-agenda-files) + (provide 'org-init) ;;; org-init.el ends here diff --git a/.emacs.d/snippets/org-mode/Makefile b/.emacs.d/snippets/org-mode/Makefile index e913708..34d4cd9 100644 --- a/.emacs.d/snippets/org-mode/Makefile +++ b/.emacs.d/snippets/org-mode/Makefile @@ -1,4 +1,4 @@ DESTDIR:=$(DESTDIR)/org-mode -objects=codeblock heading +objects=codeblock heading project snippet include ../../../dotfiles.mk diff --git a/.emacs.d/snippets/org-mode/project b/.emacs.d/snippets/org-mode/project new file mode 100644 index 0000000..269d655 --- /dev/null +++ b/.emacs.d/snippets/org-mode/project @@ -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 + + +#+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...} \ No newline at end of file diff --git a/.emacs.d/snippets/org-mode/snippet b/.emacs.d/snippets/org-mode/snippet new file mode 100644 index 0000000..67f15d5 --- /dev/null +++ b/.emacs.d/snippets/org-mode/snippet @@ -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 \ No newline at end of file diff --git a/.ncmpcpp/config b/.ncmpcpp/config index 289318d..6d8655f 100644 --- a/.ncmpcpp/config +++ b/.ncmpcpp/config @@ -1,4 +1,3 @@ -# -*- eval: (git-auto-commit-mode 1) -*- # Playlist autocenter_mode = "yes" centered_cursor = "yes" diff --git a/.stumpwmrc b/.stumpwmrc index 8c258e7..bdc7395 100644 --- a/.stumpwmrc +++ b/.stumpwmrc @@ -97,7 +97,7 @@ (set-float-focus-color (colour :black)) (set-float-unfocus-color (colour :aluminium-6)) (set-focus-color (colour :black)) -(set-font "-*-dejavu sans mono-medium-r-*-*-15-*-*-*-*-*-iso10646-*") +(set-font "-*-tamsyn-medium-r-normal-*-17-*-*-*-*-0-iso8859-1") (set-unfocus-color (colour :aluminium-6)) (set-win-bg-color (colour :background)) @@ -105,16 +105,14 @@ :butter-1 :sky-blue-1 :plum-1 :cyan :aluminium-1))) (setf *input-window-gravity* :bottom-left) -(setf *maxsize-border-width* 1) (setf *message-window-gravity* :top-right) (setf *mode-line-background-color* (colour :background)) (setf *mode-line-border-color* (colour :aluminium-6)) (setf *mode-line-foreground-color* (colour :aluminium-1)) -(setf *normal-border-width* 1) (setf *shell-program* (getenv "SHELL")) (setf *transient-border-width* 1) -(setf *window-border-style* :tight) (setf *window-format* "%m%50t") +(setf *window-border-style* :thin) (setf *screen-mode-line-format* (list "[%n]" '(:eval @@ -127,15 +125,9 @@ (format-expand *window-formatters* *window-format* (current-window))))) -(set-prefix-key (kbd "C-i")) +(set-prefix-key (kbd "C-z")) (define-key *top-map* (kbd "C-M-l") "run-i3lock") -(define-key *top-map* (kbd "KP_Begin") "vsplit") -(define-key *top-map* (kbd "KP_Divide") "remove") -(define-key *top-map* (kbd "KP_Left") "only") -(define-key *top-map* (kbd "KP_Multiply") "fnext") -(define-key *top-map* (kbd "KP_Right") "hsplit") -(define-key *top-map* (kbd "KP_End") "pull-hidden-next") (define-key *root-map* (kbd "c") "raise-urxvt") (define-key *root-map* (kbd "C") "run-urxvt") diff --git a/.xinitrc b/.xinitrc index 9684c80..66b10f0 100755 --- a/.xinitrc +++ b/.xinitrc @@ -9,8 +9,11 @@ if [ -d /etc/X11/xinit/xinitrc.d ]; then unset f fi -emacs --daemon & -fehlstart & +xflux -l 51.1180 -g 4.0012 +unclutter & +mowedline & +xcompmgr -n -r 0 & +feh --bg-tile ~/pictures/wallpapers/wallpaper-864137.jpg -test -n "$1" && wm=$1 || wm="sawfish" +test -n "$1" && wm=$1 || wm="xmonad" exec $wm diff --git a/.zile b/.zile new file mode 100644 index 0000000..76abb70 --- /dev/null +++ b/.zile @@ -0,0 +1,5 @@ +;; -*- mode: lisp; -*- +(setq inhibit-splash-screen t) +(setq tab-width 4) +(setq indent-tabs-mode nil) +(setq backup-directory "/tmp") diff --git a/.zsh/functions/Makefile b/.zsh/functions/Makefile index 670c57c..baf5c6b 100644 --- a/.zsh/functions/Makefile +++ b/.zsh/functions/Makefile @@ -2,6 +2,6 @@ DESTDIR:=$(DESTDIR)/functions objects=chpwd_show_todo chpwd_update_git_vars env get_cnt line \ precmd_maybe_festival precmd_update_git_vars precmd_update_updates \ preexec_update_vars prompt prompt_git_info rprompt \ - update_current_git_vars welcome + update_current_git_vars welcome venv include ../../dotfiles.mk diff --git a/.zsh/functions/venv b/.zsh/functions/venv new file mode 100644 index 0000000..03ec83d --- /dev/null +++ b/.zsh/functions/venv @@ -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 diff --git a/.zshrc b/.zshrc index bc94c2e..1d167ee 100644 --- a/.zshrc +++ b/.zshrc @@ -9,7 +9,7 @@ fpath=($HOME/.zsh/functions $fpath) autoload -U $HOME/.zsh/functions/*(:t) # Setup variables -HISTFILE=$ZDOTDIR/histfile +HISTFILE=$HOME/.zsh/histfile HISTSIZE=1000 SAVEHIST=1000 LESSCMD="/usr/bin/less -FXRS" @@ -30,8 +30,9 @@ alias grep="grep --color=always" alias less=$LESSCMD alias ls="ls -F --color=always" alias mysql="mysql --pager" -alias reboot="systemctl reboot" -alias poweroff="systemctl poweroff" + +# Suffix aliases +alias -s pdf="zathura" setopt notify setopt PROMPT_SUBST # Allow for functions in the prompt diff --git a/Makefile b/Makefile index e032b22..d0deef8 100644 --- a/Makefile +++ b/Makefile @@ -1,10 +1,12 @@ export DESTDIR:=$(HOME) modules=.emacs.d .config .conkerorrc .local .moc .mutt .ncmpcpp \ - .pentadactyl .sawfish .ssh .w3m .weechat .zsh + .pentadactyl .sawfish .ssh .w3m .weechat .zsh xmonad objects=.bash_profile .beetsconfig .conky_box.lua .conkyrc .gitconfig \ .guile .hgrc .offlineimap.py .offlineimaprc .screenrc .scwmrc \ .slrnrc .stumpwmrc .tmux.conf .urlview .xbindkeysrc.scm .Xdefaults \ - .xinitrc .Xmodmap .xsession .zprofile .zshrc + .xinitrc .Xmodmap .xsession .zprofile .zshrc .zile + +export MAKEROOT=y include dotfiles.mk diff --git a/dotfiles.mk b/dotfiles.mk index 77afcee..0d1e70b 100644 --- a/dotfiles.mk +++ b/dotfiles.mk @@ -16,47 +16,77 @@ define older = $(shell if [ "$(1)" -ot "$(DESTDIR)/$(1)" ]; then echo "older"; fi) endef -install-objects=$(addprefix install-,$(objects)) -uninstall-objects=$(addprefix uninstall-,$(objects)) check-objects=$(addprefix check-,$(objects)) +install-objects=$(addprefix install-,$(objects)) +reverse-objects=$(addprefix reverse-,$(objects)) +uninstall-objects=$(addprefix uninstall-,$(objects)) -install-modules=$(addprefix install-,$(modules)) -uninstall-modules=$(addprefix uninstall-,$(modules)) check-modules=$(addprefix check-,$(modules)) +install-modules=$(addprefix install-,$(modules)) +reverse-modules=$(addprefix reverse-,$(modules)) +uninstall-modules=$(addprefix uninstall-,$(modules)) .PHONY: all install uninstall check uninstall $(modules) \ $(install-objects) $(uninstall-objects) $(check-objects) \ - $(install-modules) $(uninstall-modules) $(check-modules) + $(install-modules) $(uninstall-modules) $(check-modules) \ + $(reverse) $(reverse-objects) $(reverse-modules) all: $(modules) $(objects) -install: $(install-modules) $(install-objects) + +ifeq ($(MAKEROOT),y) check: $(check-modules) $(check-objects) +install: $(install-modules) $(install-objects) +reverse: $(reverse-modules) $(reverse-objects) uninstall: $(uninstall-modules) $(uninstall-objects) +else +check: + @$(MAKE) -s -C ../ check +install: + @$(MAKE) -s -C ../ install +reverse: + @$(MAKE) -s -C ../ reverse +uninstall: + @$(MAKE) -s -C ../ uninstall +endif $(modules): %: - @echo $(MAKEFILES) - @$(MAKE) -C $* + $(MAKE) -C $* $(install-objects): install-%: % - $(if $(call newer,$*), \ - install -pDm $(MODE) "$*" "$(DESTDIR)/$*") + @$(if $(call newer,$*), \ + echo -e "$(FG_GRE)+ $(FG_YEL)$(MKDPREFIX)$* $(CLR_RE)to $(DESTDIR) as $(MODE)"; \ + install -pDm $(MODE) "$*" "$(DESTDIR)/$*", \ + echo -e "$(FG_RED)- $(FG_YEL)$(MKDPREFIX)$*$(CLR_RE)") $(install-modules): install-%: - @$(MAKE) -C $* install + @$(MAKE) -s -C $* install MKDPREFIX=$(MKDPREFIX)$*/ + +$(reverse-objects): reverse-%: + @$(if $(call older,$*), \ + echo -e "$(FG_GRE)+ $(FG_YEL)$(MKDPREFIX)$*$(CLR_RE)"; \ + cp -a "$(DESTDIR)/$*" "$*", \ + echo -e "$(FG_RED)- $(FG_YEL)$(MKDPREFIX)$*$(CLR_RE)") + +$(reverse-modules): reverse-%: + @$(MAKE) -s -C $* reverse MKDPREFIX=$(MKDPREFIX)$*/ $(uninstall-objects): uninstall-%: - $(if $(call newer,$*),rm -f "$(DESTDIR)/$*") + @$(if $(call older,$*), \ + echo -e "$(FG_RED)+ $(FG_YEL)$(MKDPREFIX)$*$(CLR_RE)", \ + echo -e "$(FG_GRE)- $(FG_YEL)$(MKDPREFIX)$*$(CLR_RE)"; \ + rm -f "$(DESTDIR)/$*") $(uninstall-modules): uninstall-%: - @$(MAKE) -C $* uninstall + @$(MAKE) -C $* uninstall MKDPREFIX=$(MKDPREFIX)$*/ $(check-objects): check-%: @$(if $(call newer,$*), \ - echo -e "$(FG_YEL)$* $(FG_GRE)newer$(CLR_RE)!", \ + echo -e "$(FG_GRE)+ $(FG_YEL)$(MKDPREFIX)$*$(CLR_RE)", \ $(if $(call older,$*), \ - echo -e "$(FG_YEL)$* $(FG_RED)older$(CLR_RE).")) + echo -e "$(FG_RED)- $(FG_YEL)$(MKDPREFIX)$*$(CLR_RE)", \ + echo -e "$(FG_BLU)= $(FG_YEL)$(MKDPREFIX)$*$(CLR_RE)")) $(check-modules): check-%: - @$(MAKE) -C $* check + @$(MAKE) -s -C $* check MKDPREFIX=$(MKDPREFIX)$*/ $(filter %.elc,$(objects)): %.elc: %.el $(call compile,$^) diff --git a/xmonad/.gitignore b/xmonad/.gitignore new file mode 100644 index 0000000..11a024e --- /dev/null +++ b/xmonad/.gitignore @@ -0,0 +1,3 @@ +*.o +xmonad-x86_64-linux +xmonad.hi diff --git a/xmonad/Makefile b/xmonad/Makefile new file mode 100644 index 0000000..9b8d3c3 --- /dev/null +++ b/xmonad/Makefile @@ -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 diff --git a/xmonad/xmonad.hs b/xmonad/xmonad.hs new file mode 100644 index 0000000..40ec269 --- /dev/null +++ b/xmonad/xmonad.hs @@ -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") ]