Last active
January 1, 2016 17:39
-
-
Save salmonmoose/8179021 to your computer and use it in GitHub Desktop.
AwesomeWM Config
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-- default rc.lua for shifty | |
-- | |
-- Standard awesome library | |
require("awful") | |
require("awful.autofocus") | |
-- Theme handling library | |
require("beautiful") | |
-- Notification library | |
require("naughty") | |
-- shifty - dynamic tagging library | |
require("shifty") | |
-- useful for debugging, marks the beginning of rc.lua exec | |
print("Entered rc.lua: " .. os.time()) | |
theme_path = "/usr/share/awesome/themes/default/theme.lua" --ok | |
-- theme_path = "/usr/share/awesome/themes/sky/theme.lua" --ok | |
-- theme_path = "/usr/share/awesome/themes/zenburn/theme.lua" --ok | |
-- theme_path = "/usr/share/awesome/themes/powerarrow/theme.lua" | |
-- Actually load theme | |
beautiful.init(theme_path) | |
-- This is used later as the default terminal and editor to run. | |
browser = "google-chrome" | |
mail = "thunderbird" | |
terminal = "x-terminal-emulator" | |
editor = os.getenv("EDITOR") or "subl" | |
editor_cmd = terminal .. " -e " .. editor | |
-- Default modkey. | |
-- Usually, Mod4 is the key with a logo between Control and Alt. | |
-- If you do not like this or do not have such a key, I suggest you to remap | |
-- Mod4 to another key using xmodmap or other tools. However, you can use | |
-- another modifier like Mod1, but it may interact with others. | |
modkey = "Mod4" | |
-- Table of layouts to cover with awful.layout.inc, order matters. | |
layouts = | |
{ | |
awful.layout.suit.tile, | |
awful.layout.suit.tile.left, | |
awful.layout.suit.tile.bottom, | |
awful.layout.suit.tile.top, | |
awful.layout.suit.fair, | |
awful.layout.suit.fair.horizontal, | |
awful.layout.suit.max, | |
awful.layout.suit.max.fullscreen, | |
awful.layout.suit.magnifier, | |
awful.layout.suit.floating | |
} | |
-- Define if we want to use titlebar on all applications. | |
use_titlebar = false | |
-- Shifty configured tags. | |
shifty.config.tags = { | |
-- ["1:workspace"] = { | |
-- layout = awful.layout.suit.max, | |
-- mwfact = 0.60, | |
-- exclusive = false, | |
-- position = 1, | |
-- init = true, | |
-- screen = 1, | |
-- slave = true, | |
-- }, | |
["2:shell"] = { | |
layout = awful.layout.suit.tile, | |
position = 2, | |
screen = math.max(screen.count(), 1), | |
persist = false, | |
}, | |
["3:code"] = { | |
layout = awful.layout.suit.max, | |
position = 3, | |
screen = math.max(screen.count(), 1), | |
persist = false, | |
}, | |
["4:web"] = { | |
layout = awful.layout.suit.max, | |
exclusive = true, | |
max_clients = 1, | |
screen = 1, | |
position = 4, | |
persist = false, | |
}, | |
["5:mail"] = { | |
layout = awful.layout.suit.fair.horizontal, | |
mwfact = 0.55, | |
exclusive = false, | |
persist = false, | |
position = 5, | |
screen = 1, | |
slave = true | |
}, | |
["6:chat"] = { | |
layouts = awful.layout.suit.max, | |
exclusive = true, | |
screen = 1, | |
position = 6 | |
}, | |
["7:vm"] = { | |
layouts = awful.layout.suit.max, | |
exclusive = true, | |
max_clients = 1, | |
screen = math.max(screen.count(), 1), | |
position = 7, | |
persist = false | |
} | |
} | |
-- SHIFTY: application matching rules | |
-- order here matters, early rules will be applied first | |
shifty.config.apps = { | |
{ | |
match = { | |
class = { | |
"google%-chrome", | |
"Google%-chrome" | |
} | |
}, | |
tag = "4:web", | |
}, | |
{ | |
match = { | |
"Thunderbird", | |
}, | |
tag = "5:mail", | |
}, | |
{ | |
match = { | |
"pcmanfm", | |
}, | |
slave = true | |
}, | |
{ | |
match = { | |
class = { | |
"gnome%-terminal", | |
"Gnome%-terminal" | |
} | |
}, | |
tag = "2:shell", | |
screen = math.max(screen.count(), 1), | |
}, | |
{ | |
match = { | |
"Profanity", | |
"MCabber" | |
}, | |
tag = "6:chat" | |
}, | |
{ | |
match = { | |
class = { | |
"VirtualBox", | |
"virtualbox", | |
"Qt%-subapplication", | |
"qt%-subapplication" | |
} | |
}, | |
tag = "7:vm", | |
screen = math.max(screen.count(), 1), | |
}, | |
{ | |
match = { | |
class = { | |
"sublime_text", | |
"Sublime_text" | |
} | |
}, | |
tag = "3:code", | |
screen = math.max(screen.count(), 1), | |
}, | |
{ | |
match = {""}, | |
buttons = awful.util.table.join( | |
awful.button({}, 1, function (c) client.focus = c; c:raise() end), | |
awful.button({modkey}, 1, function(c) | |
client.focus = c | |
c:raise() | |
awful.mouse.client.move(c) | |
end), | |
awful.button({modkey}, 3, awful.mouse.client.resize) | |
) | |
}, | |
} | |
-- SHIFTY: default tag creation rules | |
-- parameter description | |
-- * floatBars : if floating clients should always have a titlebar | |
-- * guess_name : should shifty try and guess tag names when creating | |
-- new (unconfigured) tags? | |
-- * guess_position: as above, but for position parameter | |
-- * run : function to exec when shifty creates a new tag | |
-- * all other parameters (e.g. layout, mwfact) follow awesome's tag API | |
shifty.config.defaults = { | |
layout = awful.layout.suit.tile.bottom, | |
ncol = 1, | |
mwfact = 0.60, | |
floatBars = true, | |
guess_name = true, | |
guess_position = true, | |
} | |
-- Wibox | |
-- Create a textbox widget | |
mytextclock = awful.widget.textclock({align = "right"}) | |
-- Create a laucher widget and a main menu | |
myawesomemenu = { | |
{"manual", terminal .. " -e man awesome"}, | |
{"edit config", | |
editor_cmd .. " " .. awful.util.getdir("config") .. "/rc.lua"}, | |
{"restart", awesome.restart}, | |
{"quit", awesome.quit} | |
} | |
mymainmenu = awful.menu( | |
{ | |
items = { | |
{"web", browser}, | |
{"edit", "subl"}, | |
{"mail", "thunderbird"}, | |
{"chat", terminal .. " -T MCabber -e mcabber"}, | |
{"awesome", myawesomemenu, beautiful.awesome_icon}, | |
{"open terminal", terminal} | |
} | |
} | |
) | |
mylauncher = awful.widget.launcher({image = image(beautiful.awesome_icon), | |
menu = mymainmenu}) | |
-- Configure MCabber Status | |
naughty.config.presets.online = { | |
bg = "#1f880e80", | |
fg = "#ffffff", | |
} | |
naughty.config.presets.chat = naughty.config.presets.online | |
naughty.config.presets.away = { | |
bg = "#eb4b1380", | |
fg = "#ffffff", | |
} | |
naughty.config.presets.xa = { | |
bg = "#65000080", | |
fg = "#ffffff", | |
} | |
naughty.config.presets.dnd = { | |
bg = "#65340080", | |
fg = "#ffffff", | |
} | |
naughty.config.presets.invisible = { | |
bg = "#ffffff80", | |
fg = "#000000", | |
} | |
naughty.config.presets.offline = { | |
bg = "#64636380", | |
fg = "#ffffff", | |
} | |
naughty.config.presets.requested = naughty.config.presets.offline | |
naughty.config.presets.error = { | |
bg = "#ff000080", | |
fg = "#ffffff", | |
} | |
muc_nick = "your_muc_nickname" | |
function mcabber_event_hook(kind, direction, jid, msg) | |
if kind == "MSG" then | |
if direction == "IN" or direction == "MUC" then | |
local filehandle = io.open(msg) | |
local txt = filehandle:read("*all") | |
filehandle:close() | |
awful.util.spawn("rm "..msg) | |
if direction == "MUC" and txt:match("^<" .. muc_nick .. ">") then | |
return | |
end | |
naughty.notify{ | |
icon = "chat_msg_recv", | |
text = awful.util.escape(txt), | |
title = jid | |
} | |
end | |
elseif kind == "STATUS" then | |
local mapping = { | |
[ "O" ] = "online", | |
[ "F" ] = "chat", | |
[ "A" ] = "away", | |
[ "N" ] = "xa", | |
[ "D" ] = "dnd", | |
[ "I" ] = "invisible", | |
[ "_" ] = "offline", | |
[ "?" ] = "error", | |
[ "X" ] = "requested" | |
} | |
local status = mapping[direction] | |
local iconstatus = status | |
if not status then | |
status = "error" | |
end | |
naughty.notify{ | |
preset = naughty.config.presets[status], | |
text = jid, | |
icon = iconstatus | |
} | |
end | |
end | |
-- Create a systray | |
mysystray = widget({type = "systray", align = "right"}) | |
-- 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, function(tag) tag.selected = not tag.selected end), | |
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 not c:isvisible() then | |
awful.tag.viewonly(c:tags()[1]) | |
end | |
client.focus = c | |
c:raise() | |
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)) | |
for s = 1, screen.count() do | |
-- Create a promptbox for each screen | |
mypromptbox[s] = | |
awful.widget.prompt({layout = awful.widget.layout.leftright}) | |
-- 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.new(s, | |
awful.widget.taglist.label.all, | |
mytaglist.buttons) | |
-- Create a tasklist widget | |
mytasklist[s] = awful.widget.tasklist.new(function(c) | |
return awful.widget.tasklist.label.currenttags(c, s) | |
end, | |
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 | |
} | |
mywibox[s].screen = s | |
end | |
-- SHIFTY: initialize shifty | |
-- the assignment of shifty.taglist must always be after its actually | |
-- initialized with awful.widget.taglist.new() | |
shifty.taglist = mytaglist | |
shifty.init() | |
-- Mouse bindings | |
root.buttons(awful.util.table.join( | |
awful.button({}, 3, function() mymainmenu:toggle() end), | |
awful.button({}, 4, awful.tag.viewnext), | |
awful.button({}, 5, awful.tag.viewprev) | |
)) | |
-- Key bindings | |
globalkeys = awful.util.table.join( | |
-- Tags | |
awful.key({modkey,}, "Left", awful.tag.viewprev), | |
awful.key({modkey,}, "Right", awful.tag.viewnext), | |
awful.key({modkey,}, "Escape", awful.tag.history.restore), | |
-- Shifty: keybindings specific to shifty | |
awful.key({modkey, "Shift"}, "d", shifty.del), -- delete a tag | |
awful.key({modkey, "Shift"}, "n", shifty.send_prev), -- client to prev tag | |
awful.key({modkey}, "n", shifty.send_next), -- client to next tag | |
awful.key({modkey, "Control"}, | |
"n", | |
function() | |
local t = awful.tag.selected() | |
local s = awful.util.cycle(screen.count(), t.screen + 1) | |
awful.tag.history.restore() | |
t = shifty.tagtoscr(s, t) | |
awful.tag.viewonly(t) | |
end), | |
awful.key({modkey}, "a", shifty.add), -- creat a new tag | |
awful.key({modkey,}, "r", shifty.rename), -- rename a tag | |
awful.key({modkey, "Shift"}, "a", -- nopopup new tag | |
function() | |
shifty.add({nopopup = true}) | |
end), | |
awful.key({modkey,}, "j", | |
function() | |
awful.client.focus.byidx(1) | |
if client.focus then client.focus:raise() end | |
end), | |
awful.key({modkey,}, "k", | |
function() | |
awful.client.focus.byidx(-1) | |
if client.focus then client.focus:raise() end | |
end), | |
awful.key({modkey,}, "w", function() mymainmenu:show(true) end), | |
-- Layout manipulation | |
awful.key({modkey, "Shift"}, "j", | |
function() awful.client.swap.byidx(1) end), | |
awful.key({modkey, "Shift"}, "k", | |
function() awful.client.swap.byidx(-1) end), | |
awful.key({modkey, "Control"}, "j", function() awful.screen.focus(1) end), | |
awful.key({modkey, "Control"}, "k", function() awful.screen.focus(-1) end), | |
awful.key({modkey,}, "u", awful.client.urgent.jumpto), | |
awful.key({modkey,}, "Tab", | |
function() | |
awful.client.focus.history.previous() | |
if client.focus then | |
client.focus:raise() | |
end | |
end), | |
-- Standard program | |
awful.key({modkey,}, "Return", function() awful.util.spawn(terminal) end), | |
awful.key({modkey, "Control"}, "r", awesome.restart), | |
awful.key({modkey, "Shift"}, "q", awesome.quit), | |
awful.key({modkey,}, "l", function() awful.tag.incmwfact(0.05) end), | |
awful.key({modkey,}, "h", function() awful.tag.incmwfact(-0.05) end), | |
awful.key({modkey, "Shift"}, "h", function() awful.tag.incnmaster(1) end), | |
awful.key({modkey, "Shift"}, "l", function() awful.tag.incnmaster(-1) end), | |
awful.key({modkey, "Control"}, "h", function() awful.tag.incncol(1) end), | |
awful.key({modkey, "Control"}, "l", function() awful.tag.incncol(-1) end), | |
awful.key({modkey,}, "space", function() awful.layout.inc(layouts, 1) end), | |
awful.key({modkey, "Shift"}, "space", | |
function() awful.layout.inc(layouts, -1) end), | |
-- Prompt | |
awful.key({modkey}, "F1", function() | |
awful.prompt.run({prompt = " Run: "}, | |
mypromptbox[mouse.screen].widget, | |
awful.util.spawn, awful.completion.shell, | |
awful.util.getdir("cache") .. "/history") | |
end), | |
awful.key({modkey}, "F4", function() | |
awful.prompt.run({prompt = "Run Lua code: "}, | |
mypromptbox[mouse.screen].widget, | |
awful.util.eval, nil, | |
awful.util.getdir("cache") .. "/history_eval") | |
end), | |
awful.key({ "Control" }, "Escape", function() | |
if (screen.count() > 1) then | |
awful.util.spawn("xrandr --output eDP1 --mode 1440x900") | |
awful.util.spawn("xrandr --output DP1 --off") | |
else | |
awful.util.spawn("xrandr --output eDP1 --mode 1440x900") | |
awful.util.spawn("xrandr --output DP1 --mode 2560x1440 --right-of eDP1") | |
end | |
end), | |
awful.key({ "Control" }, "F12", function() | |
awful.util.spawn("xtrlock") end) | |
) | |
-- Client awful tagging: this is useful to tag some clients and then do stuff | |
-- like move to tag on them | |
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", awful.client.togglemarked), | |
awful.key({modkey,}, "m", | |
function(c) | |
c.maximized_horizontal = not c.maximized_horizontal | |
c.maximized_vertical = not c.maximized_vertical | |
end) | |
) | |
-- SHIFTY: assign client keys to shifty for use in | |
-- match() function(manage hook) | |
shifty.config.clientkeys = clientkeys | |
shifty.config.modkey = modkey | |
-- Compute the maximum number of digit we need, limited to 9 | |
for i = 1, (shifty.config.maxtags or 9) do | |
globalkeys = awful.util.table.join(globalkeys, | |
awful.key({modkey}, i, function() | |
local t = awful.tag.viewonly(shifty.getpos(i)) | |
end), | |
awful.key({modkey, "Control"}, i, function() | |
local t = shifty.getpos(i) | |
t.selected = not t.selected | |
end), | |
awful.key({modkey, "Control", "Shift"}, i, function() | |
if client.focus then | |
awful.client.toggletag(shifty.getpos(i)) | |
end | |
end), | |
-- move clients to other tags | |
awful.key({modkey, "Shift"}, i, function() | |
if client.focus then | |
t = shifty.getpos(i) | |
awful.client.movetotag(t) | |
awful.tag.viewonly(t) | |
end | |
end)) | |
end | |
-- Set keys | |
root.keys(globalkeys) | |
-- Hook function to execute when focusing a client. | |
client.add_signal("focus", function(c) | |
if not awful.client.ismarked(c) then | |
c.border_color = beautiful.border_focus | |
end | |
end) | |
-- Hook function to execute when unfocusing a client. | |
client.add_signal("unfocus", function(c) | |
if not awful.client.ismarked(c) then | |
c.border_color = beautiful.border_normal | |
end | |
end) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment