===== Awesome WM integration =====
You would think using awful.layout.suit.max is enough, but you can do other awesome things.
==== Using awful.prompt ====
The following is a fairly generic lua function that displays a prompt in the ''mypromptbox'' textbox (change it below to whatever you've called it), and sends the result back with uzblctrl. More details below
function uzbl_prompt(prompt, text, socket, command)
if command then
-- if a command prefix is provided
command = command .. ' '
else
command = ""
end
awful.prompt.run({prompt=prompt, text=text},
mypromptbox[mouse.screen],
function(input)
awful.util.spawn(string.format("uzblctrl -s '%s' -c '%s%s'", socket, command, input))
end)
end
Parameters
* ''prompt'': Something like "uzbl: "
* ''text'': Editable text that is already in the textbox, such as the current uri ($6). Could be an empty string.
* ''socket'': The full path to the current instance socket ($5)
* ''command'': A uzbl command that prefixes the user input
Examples:
bind o = sh 'echo \'uzbl_prompt("uzbl uri: ", "\'$6\'", "\'$5\'", "uri")\' | awesome-client'
This replaces the "o" bind and uses the prompt awesome editing capabilities to allow you to edit the current uri.
Note the ugly backslashes everywhere, having to use sh sucks.
bind !js = sh 'echo \'uzbl_prompt("uzbl js: ", "", "\'$5\'", "js")\' | awesome-client'
This does not include ''text'' field, but it is an empty string.
bind : = sh 'echo \'uzbl_prompt("uzbl cmd: ", "", "\'$5\'")\' | awesome-client'
This does not include ''command'' field, but it is not an empty string. (FIXME: This is inconsistent and sucks)
==== Using awful.prompt for url completion ====
With this uzbl command binding
@cbind q = sh 'printf '"'"'uzbl_prompt("uri: ", "", "%1s", "uri")\\\\\\\\n'"'"' "$4" | awesome-client'
and this awesome function, you can do tab-completion of URLs from your history
function uzbl_prompt(prompt, text, fifo, command)
if command then
-- if a command prefix is provided
command = command .. ' '
else
command = ""
end
awful.prompt.run({prompt='uzbl '..prompt, text=text},
mypromptbox[mouse.screen].widget,
function(input)
awful.util.spawn_with_shell(string.format("echo '%s%s' >%s", command, input, fifo))
end,
function(cmd, cur_pos, ncomp)
-- get the url
local urls = {}
f = io.popen('awk \'{print $3}\' '.. os.getenv("HOME") .. '/.local/share/uzbl/history | sort -u')
for url in f:lines() do
table.insert(urls, url)
end
f:close()
-- abort completion under certain circumstances
if #cmd == 0 or (cur_pos ~= #cmd + 1 and cmd:sub(cur_pos, cur_pos) ~= " ") then
return cmd, cur_pos
end
-- match
local matches = {}
table.foreach(urls, function(x)
if urls[x]:find(cmd:sub(1,cur_pos)) then
table.insert(matches, urls[x])
end
end)
-- if there are no matches
if #matches == 0 then
return
end
-- cycle
while ncomp > #matches do
ncomp = ncomp - #matches
end
-- return match and position
return matches[ncomp], cur_pos
end)
end
==== Something like tabs ====
Simple script that displays list of all instances of uzbl in dmenu, then raises and focuses the chosen one. I believe it can be easily adapted for other WM. Is it possible to replace awesome lua code with some XTest scrip (xdotool/xte), and make it WM-independent?
#!/bin/sh
xwininfo -int -root -children \
| awk -vFS='"' '/Uzbl browser/ {
gsub("^ ", "");
sub("^", "'"'"'", $2);
sub("$", "'"'"'", $2);
print $2
}' \
| dmenu -b -i -l 30 \
| awk '{
print "a=clientfind({name="$0"})\n\
awful.client.movetotag(uzbl_tag, a)\n\
client.focus=a\n\
a:raise()"
}' \
| awesome-client
You also need following function defined in your rc.lua:
function clientfind (properties)
local clients = client.get()
local rv = nil
for i, c in pairs(clients) do
if match(properties, c) then
rv = c
end
end
return rv
end
-- Returns true if all pairs in table1 are present in table2
function match (table1, table2)
for k, v in pairs(table1) do
if table2[k] ~= v then
return false
end
end
return true
end
Note, there are multiple incompatibile versions of dmenu-vertical patch around. "dmenu -b -i -l 30" is compatibile with PLD version of vertical patch. If you use other linux distribution, probably you'll have to modify this line.
==== Using the max layout ====
== Spawn new uzbl instances unfocused, in their specific tag ==
In the rules section of your rc.lua, add the following rule:
{ rule = { class = "Uzbl" },
properties = { tag = tags[1][2],
focus = false,
lower = true
} },
== Switch between uzbl instances using 'h' and 'l' ==
Install xdotool and bind h and l to your mapping in awesome to switch between windows:
@cbind h = sh 'xdotool key "Super_L+k"'
@cbind l = sh 'xdotool key "Super_L+j"'
== Automatically focus new uzbl instances when opened with 't' ==
If you like [[url-from-surfraw-or-history]], you may want to focus the instance that you just opened. In your uzbl config file, add:
@cbind t = sh 'uri=$($HOME/.local/share/uzbl/scripts/load_url_from_surfraw.sh) && $HOME/.local/share/uzbl/scripts/launch-and-raise-uzbl.sh $uri'
And here is the script launch-and-raise-uzbl.sh:
#!/bin/sh
if test -z $1; then
echo usage: $0 uri
exit 1
else
uri=$1
uzbl-browser -u $uri &
sleep 1
echo " \
for k, c in pairs(client.get()) \
do if c.pid == $! then \
client.focus = c ;\
c:raise () \
end \
end \
" | awesome-client
fi