After years of using centericq for ICQ and Jabber I switched to gajim (ICQ via transport), because centericq didn’t have any useable UTF8 support. I was never really satisfied with gajim though, because I happen to switch between my PC and my Notebook multiple times a day, resulting in inconsistent chat-histories etc - a console based solution in a screen is so much nicer.
So I tried MCabber, that turned out to be really great once you’ve configured it to your needs. After installing MCabber (most Linux/BSD distributions should have a package or port) you’ll want to configure it to your needs.
Create a .mcabber/
directory in your home-dir, with subdirs histo/
and otr/
. Those directories should be only accessible by yourself (chmod 700) or MCabber will print out a warning at startup.
You’ll also need to put a mcabberrc
file into ~/.mcabber/
, the one that comes with mcabber (debian users will find it at /usr/share/doc/mcabber/examples/) is a good start and documented.
mcabberrc
should have chmod 600.
I enhanced it a bit to suit my needs:
- If you have a lot of contacts, a quick search function may come in handy. Usually its "/roster search somename". I prefer just "/rs somename" so add
alias rs = roster search
to your mcabberrc. - Sometimes I want to scroll up the history - and don't want it to scroll down if my buddy sends me a message. You can use "/buffer scroll_lock" and "/buffer scroll_unlock" or just "/buffer scroll_toggle" to achieve that. Just bind the toggling to F6, so you can enable and disable scroll lock with F6: Put
bind 270 = buffer scroll_toggle
in your mcabberrc.
[21:26:16] Unknown key=270
will appear in mcabbers log window.
MCabbers way of sending multi line messages is a bit unusual: First you have to start multiline mode ("/msay begin" or “/msay toggle”), then you write your message (just hit return once you’ve finished one line) and, when you’re done you send the message ("/msay send" or Ctrl-d).
- I want to start multiline-mode with Alt-Enter (keycode M13 on my system), so I add the following binding:
bind M13 = msay toggle
But there was one thing still that annoyed me: Going through the roster (contact list) is bound to PageUp/PageDown - and this is done in MCabbers code, not in the mcabberrc. My problem was, that the PageUp/Down-keys are next to the Enter-key on my Notebook. If I missed the enter key and pressed both PageUp/Down and Enter, the message would be sent to the next/previous contact in my roaster.. that sucks.
I decided to make PageUp/Down scroll the chat history and use Ctrl-PageUp/Down to move within the roster. To do that I need the keycodes of Ctrl-PageUp/Down (easy, because there is no hardcoded binding on them: MK3 and MK4 on my system) and of PageUp/Down - not easy, because MCabber doesn’t show the keycodes of bound keys.
The Solution: The curses keycodes are defined in /usr/include/curses.h
- look for KEY_NPAGE and KEY_PPAGE. If you can’t find curses.h, you probably haven’t installed the curses development package (on debian it’s called libncurses5-dev).
You’ll get octal values (like 0522 and 0523 in my case) that need to be translated to decimal values to get a keycode for MCabber:
PageDown: #define KEY_NPAGE 0522
0522 is an octal value, convert to decimal (right to left): 28^0+28^1+58^2 = 21+28+564 = 338
PageUp is KEY_PPAGE, defined as 0523 (on my system), which translates to 339. Add the following to your mcabberrc to change the semantics of PageUp/Down and Ctrl-PageUp/Down:
# Ctrl-PGUP/DN -> move in contact list
bind MK3 = roster up
bind MK4 = roster down
# PGUP/DN -> scroll in message history
bind 339 = buffer up
bind 338 = buffer down
Last but not least: I find it convenient to have a sensible window-title in the terminal running MCabber (in screen). Most common terminal emulators (xterm, urxvt, Gnome Terminal, xfce terminal, …) can handle the xterm escape sequence to set the title (see this page for more information).
So I created a simple shellscript settitle.sh
to execute before starting mcabber, like this:
$ settitle.sh “MCabber” && mcabber
settitle.sh looks like this:
#!/bin/sh
printf '33]2;%s07' $1