Автоматическое изменение кодировки в konsole
Опубликовано 21.11.2007
У нас в организации есть несколько серверов со старыми линуксами, которые используют кодировку KOI8-R. С того момента, как я поставил на свой рабочий компьютер Федору, меня очень раздражала необходимость вручную переключать кодировку для каждого сеанса в konsole. Сегодня под впечатлением от заметки про установку away в ICQ в зависимости от достижимости телефона по bluetooth наконец придумал, как это сделать.
Как и всякая программа KDE, konsole использует DCOP для внутрисистемных коммуникаций. Это означает, что запущенной программой можно управлять из командной строки командами типа «dcop konsole-2115 konsole setFullScreen true
«. Здесь konsole-2115
— название программы + её pid, все остальные аргументы — это, говоря языком ООП, объект, методы и параметры. Список программ, которыми можно рулить подобным образом, и их объектов с методами можно получить, выполняя последовательно команды dcop, dcop konsole-2115, dcop konsole-2115 konsole и т.д.
Вернёмся к нашим баранам. Konsole при запуске устанавливает две переменные окружения: KONSOLE_DCOP, в которой хранится ссылка на текущий экземпляр программы, и KONSOLE_DCOP_SESSION — ссылка на текущий сеанс. Для установки кодировки текущего сеанса нужно использовать такую команду:
dcop $KONSOLE_DCOP_SESSION setEncoding KOI8-R
Собственно, на этом задачу можно считать решённой, осталось правильно оформить ответ :)
В качестве быстрого решения подойдёт прописывание в .bashrc alias’ов для всех интересующих хостов:
alias 01='dcop $KONSOLE_DCOP_SESSION setEncoding KOI8-R;ssh bpp@192.168.0.1 $*;dcop $KONSOLE_DCOP_SESSION setEncoding UTF8;'
alias 02='dcop $KONSOLE_DCOP_SESSION setEncoding KOI8-R;ssh bpp@192.168.0.2 $*;dcop $KONSOLE_DCOP_SESSION setEncoding UTF8;'
alias 03='dcop $KONSOLE_DCOP_SESSION setEncoding KOI8-R;ssh bpp@192.168.0.3 $*;dcop $KONSOLE_DCOP_SESSION setEncoding UTF8;'
Более правильное решение — оформить это в виде небольшого скрипта ~/bin/ssh-launcher.sh, который умеет переименовывать сеанс и проверять, выполняется ли команда в konsole, а не, например, в xterme, который dcop не поддерживает. Кроме того, скрипт можно расширять, добавляя установку различных параметров konsole в зависимости от хоста назначения.
#!/bin/bash
if !([[ "$1" ]] && [[ "$2" ]]) ; thenecho Usage: $0 username hostname \[ ssh parameters \]
exit 1fi
ssh_params=( $* )
ssh_user=${ssh_params[0]}
ssh_host=${ssh_params[1]}
unset ssh_params[0]
unset ssh_params[1]
ssh_parameters=${ssh_params[*]}if [[ x"$KONSOLE_DCOP" != "x" ]] ; then # если мы в konsole
dcop $KONSOLE_DCOP_SESSION setEncoding KOI8-R
dcop $KONSOLE_DCOP_SESSION renameSession $ssh_user@$ssh_host
ssh $ssh_user@$ssh_host $ssh_parameters
dcop $KONSOLE_DCOP_SESSION renameSession `whoami`@`hostname`
dcop $KONSOLE_DCOP_SESSION setEncoding UTF8else
kdialog –text «run this from konsole»
fi
Теперь в ~/.bashrc можно прописать alias’ы длы вызова этого скрипта:
alias 01='ssh-launcher bpp 192.168.0.1 $*'
alias 02='ssh-launcher bpp 192.168.0.1 $*'
alias 03='ssh-launcher bpp 192.168.0.1 $*'
...
alias bpp='ssh-launcher bappoy bappoy.pp.ru $*'
P.S. Обратите внимание на $*
в конце alias’а — благодаря этой переменной можно очень быстро выполнять команды на указанном сервере:
01 ps -ax\|grep httpd\|wc -l
Ссылки про DCOP
KDE DIY – Building Your Own Tools
Using DCOP from the command line (Linux Gazette #97)
DCOP @Wikipedia
[...] В продолжение темы konsole + dcop. [...]