Sunday, March 22, 2009

Narrowing down to a region in Emacs

Emacs is awesome! What a piece of software! Recently, I discovered a very useful feature in Emacs.

Let's say, you are writing some documentation in text-mode. Inside it, you need to write a piece of C code with proper indentation. You can switch to c-mode, but then the rest of your text starts looking weird with colors and all, and this is very distracting (to me at least). But Emacs, as usual, has a solution to this problem.

Select a few blank lines (where you want to insert your code) within the text, and give the command M-x narrow-to-region (the keyboard shortcut for this is C-x n n). You will find yourself in a buffer with only the region you selected. Then you can enter c-mode and write the code. When done, you can go back to your original full view by using the command M-x widen (or C-x n w) and switch back to whatever mode you were in (text-mode in this case).

I find this pretty useful.

Using "Abbreviated Skeletons" in Emacs

In Emacs, you can use code templates (using 'skeleton's in emacs) as abbreviations to speed up your coding. Here is an example:

Suppose I want to create a code-template for the for loop in c-mode in Emacs. To create the template, I can put the following function in my .emacs file:

(define-skeleton c-for
"Inserts a C for loop template."
> "for (;;){" \n
> _ \n
"}" > \n

(see the Autotype section of the emacs info)

After that, I can edit the abbreviation table by using the command M-x edit-abbrevs (i.e., Press Alt+x, and then give the command edit-abbrevs and press enter).

Then, under the heading (c-mode-abbrev-table), leaving a blank line, I can enter the following line:

"forst" 0 "" c-for

Then, I can save the changes by pressing C-c C-c (i.e., press Control+c twice). That's it.

Now, whenever I am writing a C program, if I need to use the template, I will just type "forst" (without the quotes), and if the abbrev-mode is turned on, then as soon as I enter a space, my template for the for statement gets entered with the cursor inside the for loop as follows:

for (;;){

(If the abbrev-mode is turned off, "forst" can still be expanded to the template by pressing "C-x a e", which basically stands for "abbreviation expand".

Oh, of course I need to save my abbreviations using M-x write-abbrevs-file if I want to use them in future emacs sessions. But that is obvious... although I have forgotten that on many occassions :-)

Wednesday, March 11, 2009

How I connected to Internet from Linux via Airtel GPRS

First of all, I needed to activate Airtel's MO (Mobile Office) GPRS service. At the moment, they provide a form of this service by which I will be charged @ 30p/50KB (at least that's what I understood from their website). So, here is what I did:

Activating the MO service

Dialed *567*1# to activate (*567*2# to deactivate) the service on my prepaid Airtel connection.

Configuring the mobile

To configure the mobile for the MO service, I needed to set the active GPRS access point to I have a Nokia 3220. There I had to set under Settings -> Connectivity -> GPRS -> GPRS Modem Settings -> Edit Active Access Point -> GPRS Access Point. Also, I set the Alias for Access Point, and Active Access Point to That was all I had to do on the mobile side.

Connecting the Mobile to my Linux box

I connected the mobile (Nokia 3220) using the Nokia CA-42 cable to an USB port on my 4 yr old Compaq Presario 2203AL Laptop running Fedora 10. I made sure that the kernel had recognized my mobile as an USB modem. I checked that using the command dmesg. Among the several lines of output, the following lines appeared:

usb 2-2: new full speed USB device using uhci_hcd and address 2
usb 2-2: configuration #1 chosen from 1 choice
usb 2-2: New USB device found, idVendor=0421, idProduct=0802
usb 2-2: New USB device strings: Mfr=0, Product=0, SerialNumber=0
cdc_acm: This device cannot do calls on its own. It is no modem.
cdc_acm 2-2:1.0: ttyACM0: USB ACM device
usbcore: registered new interface driver cdc_acm
cdc_acm: v0.26:USB Abstract Control Model driver for USB modems and ISDN adapters

Thus, my mobile was detected as an USB modem with device name ttyACM0 under the /dev directory.

Linux side configuration

First of all, I made sure that I had turned off my wi-fi connectivity on this laptop. Also, I don't use ethernet on this laptop. So, basically, I got totally offline. All I had to do now was to use wvdial program to connect to the internet via the mobile. For that I needed to create the file wvdial.conf in /etc/ directory, and put the following lines in it:

[Dialer Defaults]
Init2 = ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
Modem Type = USB Modem
Phone = *99***1#
Stupid Mode = 1
ISDN = 0
Username = "none"
Init1 = ATZ
Password = "none"
Modem = /dev/ttyACM0
Baud = 230400

Once that was done, I ran the command wvdial from a terminal with root privileges. (Of course, later I intend to write a suitable udev rules file so that the permissions of the ttyACM0 device will be set such that I will be able to run wvdial as a normal user.) Connectivity was established, ppp was started, and along with several lines of output from wvdial, I found the following lines of information:

--> local IP address
--> remote IP address
--> primary DNS address
--> secondary DNS address

I checked using ifconfig that ppp was up. Also, the command route -n showed that my default gateway was as expected from the above output. I then manually set the nameservers in the file /etc/resolv.conf.

That's all I had to do. I could now successfully ping any website, and surf the net, although very slowly... but who cares, it was fun :-)

To stop the connection, I just had to stop wvdial by pressing Control-C.

Sunday, March 8, 2009

Making Xmonad to show up in gdm session list

I am now for some reason having to use Fedora 10 on my home laptop... partly by choice, partly due to circumstances. As I expected, xmonad is not in yum repos (neither Fedora nor RPMFusion)... but thankfully, ghc and haskell libraries are. Anyways, I found an easy way to install haskell packages once ghc and friends are installed (more about that in a later post... probably). Well, installed xmonad, xmobar, etc. along with gmrun (this was in yum repos).

But now that I have xmonad installed, I needed xmonad to show up in gdm session list so that I could choose it over gnome. I had done this quite a while ago, before I started using debian based distros... so I had to re-learn the process (Xmonad FAQ page made the process trivial). Now that I know how it works, I thought I should blog about it so that I can look it up here again in case I forget again.

Well, after so much blah blah, the process is pretty straightforward. As with most Unixy ways of doing things, you just have to add a .desktop file, say, xmonad.desktop to "/usr/share/xsessions/".
The contents of this file is also quite straightforward:

[Desktop Entry]
Comment=This session starts xmonad

(OK, so you (assuming somebody other than me reads this) probably figured out by now that I used cabal to install xmonad... well, that saves me a blog post I guess :-)

xmonad should show up along with others in your gdm session list.