i3 4.4 on Slackware

i3wmEverybody knows that tiling window managers are the cure to all the world’s problems.

…and with the recent release of i3 v. 4.4, the world should sigh with relief. Having thoroughly inspected i3 source code, I can assure everyone that the world is NOT going to end tomorrow or any time soon.

Now that I have hopefully put your mind at rest, we can focus on the new i3 release. As I blogged a few months ago, the 4.3 introduced the pango support for rendering text which resulted in the package not compiling on the stock Slackware installation (see details). The situation has not changed with the release 4.4. At the moment of writing this, Slackbuilds.org offers i3 4.2 which is the last version that works flawlessly without any hacks. If you would, however, like to run i3 4.3+ you can either recompile the stock Slackware cairo package with enabled xcb support or disable pango support in i3. Again, I have chosen the latter option as being less intrusive on a Slackware system.

Below are my updated SlackBuilds scripts for the most recent stable version of i3. The Slackbuild is not written for any particular version of i3, such as 4.3 or 4.4. It automatically pulls the source from the ‘master’ branch of i3 git repository, which is the most recent “stable” release + any bug fixes.

i3 master branch SlackBuilds

One of the new features included in this release is i3-dmenu-desktop, a dmenu wrapper for .desktop files. The feature was discussed in one of the threads of i3 mailing list. To see the full list of changes and bug fixes, please visit 4.4 release notes.

Update: See the update to this article here.
Happy tiling!!!

dwb on Slackware

Being a big fan of lightweight and keyboard driven applications, I have always felt some kind of distrust towards bloated software that relies heavily on mouse clicks. For most tasks, using well configured keyboard shortcuts can be a much more efficient means of interacting with software. It is particularly true of command line software that I use on a daily basis. Since most of my activities involve keyboard driven interaction, it has always felt somewhat inefficient to keep switching between the ‘keyboard’ and ‘mouse’ modes, which is required when using a traditional web browser. It looks like dwb partially solves this nuisance. Edit: I say partially as it does not seem as lightweight as one would wish. As pointed out in the comments, its memory consumption is rather huge for a supposedly lightweight browser. On my system it looks similar to that of Firefox. Still, it is at least worth a try.

What is dwb?

dwb is a highly configurable WebKit web browser. It makes a heavy use of keybindings and employs vi-like modes (normal/insert/hint/command modes). Not only does it provide you with a great number of commands and settings, but also it lets you create custom commands as well as userscripts (via an available javascript API).

Install dwb on Slackware 14

Full Slackware 14 install provides you with most of the required dependencies with the exception of webkitgtk. Once you’ve installed webkitgtk, you can use a SlackBuild script that I have writen to install dwb on Slackware 14. The script (as well as a precompiled package for Slackware64) is available here:

dwb Slackbuild script and package downloads

Please make yourself familiar with dwb documentation before you start using it.

Happy browsing.

i3 4.3 on Slackware

I welcomed yesterday’s release of i3 4.3 with excitement. Having been busy elsewhere, I did not follow the ‘next’ branch of i3 git repository and, therefore, was not aware of what’s cooking. The moment I started building a new shiny package, my excitement somewhat subsided.

Pango support

Version 4.3 introduces pango support for rendering text, which would be a great news if not for the fact that an XCB backend support was still an experimental feature (and, therefore, disabled by default) in cairo 1.10.2, the version that Slackware (14rc5) ships with. In consequence, for i3 >= 4.3 to build on Slackware, one would have to upgrade the stock cairo package. The XCB backend has apparently reached a stable status and is enabled by default in cairo version 1.12.2+. As always, Pat is the person to decide whether it is mature enough for Slackware. Hopefully, it is and it’ll enter the -current branch of Slackware in the next development cycle. (Update: See Pat’s comments on the issue).

An alternative solution (which I have chosen) was to disable pango support in i3 4.3. As this feature is an integral part of i3wm 4.3, disabling it is not recommended by Michael Stapelberg, i3 author and main developer (4.3 release notes):

Another very important change is that we now support pango for rendering text. The default is still to use misc-fixed (X core fonts), but you can use a font specification starting with “xft:” now, such as “xft:DejaVu Sans Mono 10″ and i3 will use pango. The sole motivation for this is NOT to have fancier window decorations, but to support fonts which have more glyphs (think Japanese for example) and to support right-to-left rendering (open http://www.ftpal.net/ for an example). Supporting users from all over the planet is important, and as such I would strongly advise distribution packagers to leave pango support enabled. In case you are working on a very low-spec embedded device, it is easy enough to disable pango support, see common.mk.

Personally I do not need it so am going to run 4.3 (pango disabled) until cairo gets upgraded in Slackware (I’m not in a hurry:)). You can do the same but don’t say you haven’t been warned!!!

Here is my SlackBuild script for i3 v 4.3 (pango disabled). Please note that I pointed it to the master branch of i3’s git repository which basically is the latest stable release + bug fixes, which at the moment of writing is 4.3. Should a new version be released, eg. 4.4, the script will automatically pull it from the git repository. Unlike with standard SlackBuilds there’s no need to manually download the source code.

Feel free to use it but bear in mind that, at the moment of writing it, a recommended version of i3 to be run on Slackware is i3 4.2 which is available from SlackBuilds.org so if you don’t like living on the edge, please stop reading now and stay with 4.2!

Now for the fun part.

What’s new?

Apart from the above mentioned pango support (which we have disabled) there are lots of bug fixes and some new features available with this release. I particularly like the ability to specify the layout for the parent split container:

 for_window [class="XTerm"] layout tabbed

When I start i3 both Firefox and Thunderbird start on Window 2. Up until now it was not possible (or easy) to make them automatically open in a tabbed mode. This ensures that Window 2 (and only 2) starts in a tabbed mode.

assign [class="Firefox"] 2
assign [class="Thunderbird"] 2
for_window [class="Firefox"] layout tabbed
exec firefox
exec thunderbird

Layout toggle

In 4.3 you can still use the old “split h” and “split v” commands. On top of that, the old “layout default” command has been replaced with “layout toggle split”, which changes the orientation (horizontal/vertical) of windows. If you have an old config file, find “layout default” and change it to “layout toggle split”. On my system it’s bound to “Mod1+e”. Open a few terminal windows and play with this command changing the focused window from time to time.

Efficient CLI Navigation

The CLI (Command Line Interface) is a very powerful, flexible and extremely programmable environment that lets you do anything you can ever think of …well, perhaps except for slaying the Dragon of Isengard. To harness its power, one’s mind needs to be as clear as the cloudless hour, and thoughts as pure as mountain dew. Although the road to enlightenment is long and arduous, there are some shortcuts that will help keep what’s left of your sanity.

Below you’ll find some tips on efficient navigation in the CLI.

Go Back Home

The cd command takes you back to your /home directory:

$ pwd
/home/user/data/documents/work
$ cd
$ pwd
/home/user

Go Back to the Previous Directory

To go back to the previous directory, you can use cd with a dash (-):

$ pwd
/home/user/.i3/config
$ cd ~/data/projects/dotfiles/i3
$ pwd
/home/user/data/projects/dotfiles/i3
$ cd -
/home/user/.i3/config
$ pwd
/home/user/.i3/config

Use the Last Argument of the Previous Command

The $_ variable returns the last argument of the previous command. This can be helpful in a variety of scenarios:

$ pwd
/home/user/downloads/
$ cp i3status.tar.gz ~/data/builds/i3/i3status
$ cd $_
$ pwd
/home/user/data/builds/i3/i3status
$ chmod +x /path/to/my/script/script.sh
$ $_
(This will execute script.sh)

Bash Aliases

You can make your life easier by creating aliases (= shortcuts) for commands that you use often. The syntax is very simple:

name_of_the_alias='value'

You can place your aliases in ~/.bashrc. You might need to create this file. Each time you edit this file you need to source it afterwards for the changes to take effect:

source ~/.bashrc

or

. ~/.bashrc

When it comes to navigation, one could, for example, create a few aliases to speed up navigating up the directory tree:

alias 1.='cd .. ; pwd'
alias 2.='cd ../.. ; pwd'
alias 3.='cd ../../.. ; pwd'
alias 4.='cd ../../../.. ; pwd'

The value of an alias can be quite complex. As you can see, 4. will first change directories (cd ../../../..) and then print the current working directory – pwd. Please note a semi-colon (;) separating the commands.

$ cd data/projects/python-dir/euler/
$ 4.
/home/user
$ cd -
/home/user/data/projects/python-dir/euler
$ 3.
/home/user/data

Aliases can be used in a number of different ways. A few more examples:

alias epyt='emacs -nw /home/user/data/projects/python-dir/32-problem.py'
alias slacktop='ssh user@slacktop'

Directory Stack

BASH features some helpful directory stack buildins that help you navigate recently visited directories.

pushd – push a directory into the directory stack and cd to it.
popd – remove a directory from the directory stack and cd to it.
dirs – display the list of the directories in the stack.

How does it work in practice?

First of all, add a directory to the stack. Please note that it also automatically switches to the directory (the -n flag suppresses this behaviour).

user@darkstar:~$ pushd data/projects/programming/
~/data/projects/programming ~
user@darkstar:~/data/projects/programming$

Alternatively, you can cd to a given directory and issue:

pushd .

After adding a few directories you can display the content of the stack:

user@darkstar:~$ dirs -v
0 ~/projects/web-develop/project-eden/includes
1 ~/projects/web-develop/project-eden/includes
2 ~/projects/web-develop/project-eden/pages/en
3 ~/projects/web-develop/project-eden/css
4 ~/projects/designs
5 ~/projects/notes
6 ~/public_html/project_eden

Please note that the first entry always displays the current working directory so if it also sits at the top of the stack, you’ll see what seems like duplicate lines. The -v flag is responsible for a nicely indexed output.

To switch to one of the directories in the stack you could issue:

user@darkstar:~$ cd $(dirs +2 -l)
user@darkstar:~/projects/web-develop/project-eden/pages/en$

Admittedly, this is not the most concise way of changing directories. To make it shorter we can add an alias and a function to the ~/.bashrc file.

alias dv='dirs -v'

List the current stack by simply typing dv.

cdd()
{
    position=$1
    if [ -z $position ]; then
        echo "You need to specify a directory in the stack"
    else
        cd $(dirs +$1 -l)
    fi
}

The cdd function (based on this one) makes it possible to cd to a given directory from the stack by typing:

cdd 3

Hope this will help you in your quest to become a CLI wizard.

ThinkPad E530 with Slackware

Recently I have purchased Lenovo ThinkPad E530. Unfortunately, I can see a big difference between it and my previous Lenovo laptop, ThinkPad T410. Straight away you notice that they belong to different categories. But then again, as opposed to a budget class E530, the T-series is a business class model (and is therefore appropriately priced) so the comparison would not be fair.

Still, I like it; especially the fact that everything seems to work out of the box on Slackware 14 (still -current at the moment of writing). It appears that the purchase was timed quite well. E530 features the following wifi chip:

03:00:0 Network controller: Intel Corporation Centrino Wireless-N 2230 (rev c4)

The iwlwifi module supporting this chip has been added with kernel 3.2.0 so it looks like the wifi card wouldn’t work out of the box on Slackware 13.37 and older.

Thunar doesn’t automount usb drives in i3 (Slackware-current)

Monitoring Slackware’s irc channel has always been a pleasurable experience. Most of the time it is also extremely informative. Yesterday on #slackware someone reported that Thunar doesn’t automount usb drives under i3 any longer. It also applies to some other window managers. The solution involves adding dbus-launch –exit-with-session to your .xinitrc:

# Start the window manager:
if [ -z "$DESKTOP_SESSION" -a -x /usr/bin/ck-launch-session ]; then
  exec ck-launch-session dbus-launch --exit-with-session /usr/bin/i3
else
  exec /usr/bin/i3
fi

Task integration into the i3 statusbar

Recently I have been playing with TaskWarrior which is a very powerful command line todo list manager. I’ve decided to integrate it with my i3 statusbar and enable key bindings for some basic list management.

Here’s a very basic sample of Task’s output:

[sycamorex]~% task ls

ID Project Pri Description
4         H   Create a blog post
1             Configure Mutt
2             id3 tags
3             Email Linus T.
5             zsh prompt

5 tasks

i3status bar configuration
I’ve added some customised code to the i3statusbar.conf file to display the most urgent task in the statusbar.

Please note that the LG line below might safely be removed as it’s responsible for printing they current keyboard layout.

#!/bin/sh
i3status | while :
do
    read line
    echo "TODO:$(task ls | sed -n '4s/[[:blank:]]\+/ /pg' )\
| LG: $(setxkbmap -print | grep xkb_symbols | awk -F"+" '{print $2}') \
| $line" || exit 1
done

The above file will be executed from i3’s main config file ~/i3/config:

bar {
        status_command ~/.i3/i3status.sh
}

i3statusbar

As you can see from the screenshot, it is task number 4. The H letter after the task number indicates that the task is of a high priority which results in it being displayed at the top.

Furthermore, you can use some keybindings to mark the task completed and therefore remove it from the status bar displaying another task in the queue.

bindsym $ms+Shift+D exec task $(task ls | awk 'NR==4  { print $1 }') done
bindsym $ms+t exec urxvt -title taskwin -e sh ~/.i3/display_tasks.sh
for_window [title="taskwin"] floating enable

As you can see, I have also created a keybinding (MS + t) to quickly view all my task in a floating window. It works similarly to i3’s idea of scratchpad and I might actually have used it here. Below is the contents of display_tasks.sh:

#!/bin/sh
task ls
read -p "Press Enter to close the window."

It all works fine if you use a simple and linear structure of todo lists. If, on the other hand, they include a number of projects/categories with each of them having their own set of priorities, you could modify the task command. The following command will display the most urgent task from the “work” project/category.

task project:work ls | sed -n '4s/[[:blank:]]\+/ /pg'

A better approach would be to be able to switch between categories using keys but that’s not what I personally need.

HTH

Slackware current ISO size

For the last year or so I have used Eric’s excellent mirror-slackware-current script (as a cronjob). This is a great way of staying up to date with the development in the -current branch of Slackware, as well as creating ISO images of Slackware-current snapshots. As Slackware is getting bigger, so is its ISO image. Fortunately, Eric has updated his script to make it possible to exclude some directories from the DVD. Before the upgrade, a Slackware-current’s ISO image exceeded 5GB of data. This obviously wasn’t ideal bearing in mind that a standard DVD medium can only hold 4.x GB. After the exclusion of /testing and /pasture the image takes as little as 2.2GB. Here’s the relevant snippet of the script:

# If you want to exclude more from the DVD ISO than just the ./testing                                    
# directory, you can add the directories to DVD_EXCLUDES.                                                
# The pathnames must be local to the top level and must start with ./                                    
DVD_EXCLUDES=${DVD_EXCLUDES:-"-x ./testing -x ./pasture -x ./source"}

Thanks Eric.

Simple CLI Minecraft Server Manager

Recently I have set up a Minecraft server on Slackware 13.37. Multiplayer takes a crafting joy to a new level. What I found a pain in the back was the necessity to manually edit the config file each time I wanted to change the world I’m in. The lack of any kind of world management encouraged me to write a basic ncurses world management script. At the moment it has the following functionality:

Minecraft Server Manager

Not much but it does exactly what I want it to do:) If you’d like to try it out, make sure you modify the script options.