Keeping multitags persistent

From awesome
Jump to: navigation, search

Summary

This configuration snipper/lua code will enable persistent multitags, for example :

  • type F1 to go to tag 1 ;
  • type Ctrl+F2 to add tag 2 to your view (you'll have clients of tags 1 and 2);
  • type F3 to switch to tag 3 (you'll have only clients from tag 3);
  • now, type F1 to go back to tag 1 : with this code, you'll be back to having tags 1 and 2, until you press Ctrl+F2 to remove tag 2.

Disclaimers

  • I use Fx keys to access tags, adjust if you want to keep the default (Mod4+numbers) or anything else.
  • This is my first lua code, so there may be more elegant ways of writing it.
  • If you restart awesome, everything will be forgotten (which is actually a good way of resetting if it gets lost, which it shouldn't but well...).
  • It only works if you switch with keyboard, not with mouse. That may be considered a feature ;)

The code

-- Bind all key numbers to F keys.
-- Keep a (semi-)persistant mapping of active multitags
-- This should map on the top row of your keyboard, usually F1 to F9.
extra_tags = {}
for i = 1, keynumber do
    extra_tags[i] = {}
    globalkeys = awful.util.table.join(globalkeys,
        awful.key({ }, "F" .. i,
                  function ()
		     local screen = mouse.screen
		     local curtag = tags[screen][i]
		     if curtag then
			awful.tag.viewonly(curtag)
		     end
		     for tag,v in pairs(extra_tags[i]) do 
			if v then
			   awful.tag.viewtoggle(tags[screen][tag])
			end
		     end
                  end),
        awful.key({ "Control" }, "F" .. i,
                  function ()
		     local screen = mouse.screen
		     local curtag = awful.tag.getidx(awful.tag.selected(screen))
		     local selected = awful.tag.selectedlist(screen)
		     local found = false
		     for i_,v in ipairs(selected) do 
			v = awful.tag.getidx(v)
			if v == i then
			   found = true
			   break
			end
		     end
		     if found then
			extra_tags[curtag][i] = false
		     else
			extra_tags[curtag][i] = true
		     end
		     if tags[screen][i] then
			awful.tag.viewtoggle(tags[screen][i])
		     end
                  end),
        awful.key({ "Shift" }, "F" .. i,
                  function ()
                      if client.focus and tags[client.focus.screen][i] then
                          awful.client.movetotag(tags[client.focus.screen][i])
                      end
                  end),
        awful.key({ "Control", "Shift" }, "F" .. i,
                  function ()
                      if client.focus and tags[client.focus.screen][i] then
                          awful.client.toggletag(tags[client.focus.screen][i])
                      end
                  end))
end
Personal tools