2011-02-03

vi - das unbekannte Wesen

Ich benutze unter Unix vi (heutzutage als vim) als einzigen Editor für alles -- und das seit mehr 20 Jahren. Trotzdem (oder grade desshalb) gibt es Ecken im vi, die ich mir noch nie so richtig angesehen haben.

Irgendwann bin ich mal über autocmd gestolpert. autocmd oder 'automatic commands' dienen dazu, bestimmte Kommandos automatisch auszuführen.

Einfache Anwendungen dafür sind
autocmd BufReadPost,FileReadPost Makefile set noexpandtab
wenn ich ein Makefile bearbeite, dann hätte ich gerne richtige Tabs, oder
autocmd BufWritePre *.py :%s/\s\+$//e
wenn ich ein .py file schreibe, dann möchte ich keine Leerzeichen am Zeilenende haben.

Soweit, sogut.

Was aber daran wirklich toll ist, findet sich in der Dokumentation zu autocmd - ein Beispiel, wie man ein gzip Komprimiertes File editieren kann, welches beim lese automatisch ausgepackt und beim schreiben wieder gepackt wird.

Das kann man auch für sinvolleres benutzen, und so finden sich seit ein paar Jahren folgende Zeilen - dich ich irgendwoher aus dem Netz habe - in meiner .vimrc:


augroup encrypted
:au!
" First make sure nothing is written to ~/.viminfo
" while editing an encrypted file.
au BufReadPre,FileReadPre      *.gpg set viminfo=
" We don't want a swap file, as it writes unencrypted data to disk
au BufReadPre,FileReadPre      *.gpg set noswapfile
" Switch to binary mode to read the encrypted file
au BufReadPre,FileReadPre      *.gpg set bin
au BufReadPre,FileReadPre      *.gpg let ch_save = &ch|set ch=2
au BufReadPost,FileReadPost    *.gpg '[,']!gpg --decrypt 2> /dev/null
" Switch to normal mode for editing
au BufReadPost,FileReadPost    *.gpg set nobin
au BufReadPost,FileReadPost    *.gpg let &ch = ch_save|unlet ch_save
au BufReadPost,FileReadPost    *.gpg execute ":doautocmd BufReadPost " . expand("%:r")
" Convert all text to encrypted text before writing
au BufWritePre,FileWritePre    *.gpg   '[,']!gpg --default-key KEYID --default-recipient-self -ae 2>/dev/null
" Undo the encryption so we are back in the normal text, directly
" after the file has been written.
au BufWritePost,FileWritePost    *.gpg   u  
augroup END


Als KEYID ist hier die ID des PGP Keys anzugeben. Einfaches Lesen und schreiben von mit PGP verschlüsselten Textdateien.

$ vi foo.gpg
... editiere foo ....
$ cat foo.gpg
-----BEGIN PGP MESSAGE----- hQQOAx86mItHGziREBAA0EzP6msleRqcYS/2KLmMgNHEn9EukJOSgPahHJtE8Ni5