IRC является достаточно популярным сервисом в среде пользователей Unix, которых много среди пользователей Emacs, и это привело к появлению нескольких пакетов, поддерживающих данный сервис. В настоящее время наиболее активно развивающимся является пакет Erc, но существует и альтернативная реализация, Zenirc, которая также имеет много возможностей, но уже практически не поддерживается (если вы хотите посмотреть на него, то вы можете найти исходные тексты по адресу ftp://ftp.splode.com/pub/zenirc).
Дальнейший рассказ будет в основном про пакет Erc, хотя может быть я буду упоминать и его конкурента.
Пакет Erc предоставляет для пользователя множество возможностей, вот основные:
Поддержку работы с несколькими каналами и серверами. Каждый канал работает в своем буфере;
Уведомления;
Дополнения имен пользователей;
Поддержку разных языков;
Отслеживание активности на каналах;
Расширение возможностей, за счет написания скриптов;
Подсветку ключевых слов и различных действий;
Взаимодействовать с другими средствами обмена сообщениями, используя BitlBee (более подробно о настройке Erc для использования вместе с BitlBee смотрите страницу http://www.emacswiki.org/cgi-bin/wiki?BitlBee;
и многое, многое другое.
Пакет работает как с GNU Emacs, так и с XEmacs.
Исходные тексты Erc доступны по адресу http://sourceforge.net/projects/erc/. Необходимо только раскрыть полученный архив, и поместить несколько команд в ваш файл инициализации, например вот так:
(add-to-list 'load-path "path_to_erc_dir") (require 'erc)
Это минимальный набор команд, необходимых для загрузки данного пакета. Но Erc предоставляет намного больше возможностей, поэтому у человека, который часто пользуется данным пакетом, файл инициализации выглядит намного сложнее. вы можете найти такие примеры на Emacs WiKi, или в разделе Пример файла инициализации Erc. А более подробно про настройку я расскажу в разделе Настройка клиента.
Начала работы вам необходимо набрать команды
M+x
erc-select
, которая запросит у вас имя сервера, порт
и другие параметры. Вы можете задать эти параметры один раз
произведя настройку клиента (см. раздел Настройка клиента). В зависимости от настройки, клиент может сразу подключиться к нужным вам каналам — это выполняется пакетом erc-autojoin, который
поставляется с Erc.
После того, как вы подключились к IRC-серверу, вы можете выполняться обычные команды IRC — подключение к новым каналам, получение информации и много других вещей. Команды вводятся в строке, которая начинается с ERC>. Окно канала может выглядеть как изображено на рисунке Окно сеанса Erc, кроме того, вы можете использовать стандартные команды Emacs для разделения фрейма на несколько окон и отображать в них разные каналы.
Во время работы, erc изменяет строку состояния, в которой
отображает имя канала и сервера, а также изменение статуса
других каналов, в виде сокращения #
и первой буквы имени канала, и разным цветом, синим — когда кто-то
заходит на канал или покидает в него, и красным когда кто-то
беседует на канале. В верхней строке окна отображается название
канала, текущий лаг, и тема канала. Кроме этого, erc позволяет
использовать стандартные механизмы дополнения имен пользователей
и каналов, при их наборе.
Для того, чтобы закончить работу с IRC, наберите команды
erc-quit-server
.
В составе Erc идет некоторое
количество модулей, которые расширяют основную функциональность
пакета. Для каждого из этих модулей пользователь может выполнить
дополнительную настройку, управляющую его поведением. Часть
модулей загружается автоматически, а некоторые требуют
индивидуальной загрузки. Список автоматически загружаемых
модулей хранится в переменной
erc-modules
.
Ниже приведен список наиболее часто используемых модулей, и того какие настройки для них могут выполняться.
Данный пакет позволяет запоминать на какие каналы
заходил пользователь используя команды
/JOIN
и /PART
, и при
следующем сеансе использования erc восстановить сохраненную
конфигурацию. Список автоматически подключаемых каналов
сохраняется в переменной
erc-autojoin-channels-alist
. Данная
переменная состоит из списков вида "имя сервера" "канал1"
"канал2"..., например:
(setq erc-autojoin-channels-alist '(("freenode.net" "#emacs" "#arch" "#squiddev")))
По умолчанию, данный режим включен, и используется.
Данный модуль позволяет создать нажимаемые кнопки на основе текста буфера. По умолчанию данный режим включен, и используется для организации нажимаемых кнопок для самых разных объектов, таких как:
адресов сайтов (URL's);
запросов к Google;
имен пользователей IRC;
RFC (что позволяет сразу перейти к нужному документу);
разделов документации в формате Info;
интернет-времени.
Пользователи могут определять и свои типы, используя механизм сокращений (abbrevs). Кроме этого, пользователь имеет возможность перехода между кнопками, используя сочетание C+c C+w C+b для перехода на предыдущую кнопку, и C+c C+w C+f для перехода на следующую.
Данный модуль позволяет отслеживать изменения в буферах erc — данный режим включен по умолчанию. При использовании данного модуля, в строке статуса отображается список каналов, в которых произошли изменения. По умолчанию, отслеживается вся активность — вход новых посетителей,
выход с канала, и изменение имени, что не всегда нужно
знать. С помощью переменной
erc-track-exclude-types
вы можете исключить
некоторые команды из списка отслеживаемой
активности. Например, вот так:
(setq erc-track-exclude-types '("JOIN" "NICK" "PART" "QUIT"))
Для перехода в буфер, в котором, в последнем была какая-либо активность, вы можете использовать сочетание клавиш C+c C+space или C+c C+@. В том случае, если нет больше активных каналов, данное сочетание переключает вас в тот буфер, в котором вы работали перед этим.
Данный модуль позволяет использовать дополнение имен
каналов и посетителей, а также команд
Erc, используя клавишу
TAB. Этот модуль разрешен по умолчанию, и
для своей работы использует программируемый механизм
дополнений, который реализуется библиотекой
pcomplete
, которая обычно поставляется с Emacs. В том случае, если у вас нет этой библиотеки, вы все равно можете воспользоваться возможностями дополнения, переключившись на использование старого механизма, правда это не рекомендуется делать — лучше установите
библиотеку pcomplete.
По умолчанию Erc позволяет
красиво заполнять и выравнивать отображаемый текст. По
умолчанию используется режим заполнения, с переменным
префиксом, зависящим от длины имени посетителя, который
написал данное сообщение. Однако вы можете изменить эту
настройку с помощью установки переменной
erc-fill-prefix
, в которой вы можете задать данные для заполнения — например, несколько
пробелов подряд. Кроме этого, существуют и другие варианты
заполнения, про которые вы можете прочитать на Emacs WiKi.
Кроме всего прочего, Erc позволяет вам вставлять в текст буферов временные пометки, для того, чтобы вам было удобней просматривать журналы бесед, или точно находить нужную беседу. По умолчанию данный модуль не подгружается автоматически, так что вам необходимо добавить его к списку загружаемых модулей. Для настройки отображения можно задать несколько переменных, которые будут описывать вид отображаемых временных пометок, и другие параметры.
Данный модуль обеспечивает определение отключение от
сети целых IRC-серверов (так называемый netsplit), и
подключение ранее отключенных серверов. Вы можете выполнять
свой код в данных случаях, воспользовавшись хуками
erc-netsplit-hook
и
erc-netjoin-hook
.
Иногда вы отходите от клавиатуры на длительный срок, и можете забыть сообщить серверу, что вы отсутствуете. Чтобы это делалось автоматически, с Erc поставляется модуль erc-autoaway, который сам изменит режим после заданного отрезка времени. Данный модуль не загружается автоматически, так что вам нужно самим подключить его, с помощью команд, подобных этим:
(require 'erc-autoaway) (setq erc-autoaway-idle-seconds 600) (setq erc-auto-discard-away t)
первая команда подгружает сам модуль, вторая задает через сколько времени вы будете считаться отсутствующим, а последняя задает режим автоматического выхода из режима отсутствия, если вы что-то напишете в каком-либо из буферов.
Erc позволяет вам сохранять журналы бесед на IRC. Для этого существует модуль erc-log. Однако, данная возможность не подключается автоматически, а требует ручной загрузки, например вот так:
(require 'erc-log) (setq erc-log-channels-directory "~/.irc/logs/")
первая команда загружает нужный модуль, а вторая задает расположение для журнальных файлов.
Сохранение журналов может производиться несколькими способами. Для обычных пользователей, наиболее приемлемым будет использование команды
(setq erc-save-buffer-on-part t)
что приведет к сохранению журналов при выходе из канала. Однако
пользователи могут явно сохранить журналы с помощью сочетания клавиш
C+c
C+l или
явно выполнив команду
M+x
erc-save-buffer-in-logs
. Вы можете также поместить временные метки в сохраняемые журналы — это
контролируется с помощью переменной
erc-hide-timestamps
.
Erc умеет восстанавливать часть содержимого предыдущих
сессий используя журнальные файлы. Если вы хотите, чтобы в буфере
отображались старые разговоры, то установите переменную
erc-log-insert-log-on-open
в истинное
значение. По умолчанию, данная переменная равна
nil
.
Более подробную информацию о настройке журналирования, а также о возможных проблемах, и способах их решения читайте на Emacs WiKi.
В некоторых IRC-сетях вы можете зарегистрировать свое имя, и таким образом избежать возможных конфликтов между пользователями. Эта возможность реализуется с помощью сервиса под названием NickServ. По умолчанию, когда вы входите в такую сеть, в ответ на приглашение сервера, erc в мини-буфере запрашивает у вас пароль для регистрации. Чтобы избежать повторяющихся действий, был разработан модуль erc-nickserv, который идет в поставке erc, но не загружается автоматически. Настройку этого модуля можно выполнить с помощью следующих команд:
(require 'erc-nickserv) (erc-nickserv-mode t) (setq erc-prompt-for-nickserv-password nil) (setq erc-nickserv-passwords '((freenode (("nick" . "password")))))
Первые две команды загружают модуль и включают соответствующий
режим. Третья команда отключает запрос пароля у пользователя при
запросе от сервера. Ну а четвертая команда задает параметры
ассоциативного списка, описывающего сервера, имена и пароли для
них. Для каждого из серверов, вы можете задать одно или несколько
имен, и соответствующие пароли для них. Заметьте, что в качестве
ключа списка задается символ, соответствующий IRC-сети. Отображение
между именами сетей и доменными именами серверов хранится в
переменной erc-networks
, которую вы при
необходимости можете изменять.
В том случае, если вы постоянно пользуетесь IRC, размеры буферов с разговорами, могут расти очень быстро, и поэтому может быть желательно держать их в рамках определенных размеров. Для этого используется модуль erc-truncate, которые следит за размерами буферов каналов, и при необходимости выбрасывает лишние данные. Данный модуль поставляется с erc, но не загружается автоматически.
Параметры модуль контролируются несколькими переменными.
Переменная erc-max-buffer-size
задает
максимальный размер буфера, в байтах. А если установлена
переменная erc-truncate-buffer-on-save
, то
обрезание буферов будет происходить при сохранении журналов. вы
также можете явно выполнить обрезание буферов, используя команду
M+x
erc-truncate-buffer
.
Для Erc реализована поддержка прямой передачи данных между
клиентами (DCC), которая реализуется с помощью
модуля erc-dcc. Данный модуль не загружается
автоматически, так что вы должны сделать это сами. После загрузки
этого модуля, вам будут доступны команды /dcc
,
которые вы можете использовать для разговоров, и для передачи файлов
между клиентами.
Кроме этого, в Erc реализована возможность организации файловых сервисов, на основе IRC. Эта возможность реализуется с помощью модуля erc-xdcc.
Кроме описанных выше модулей существуют еще и другие:
erc-bbdb — для интеграции erc и BBDB;
erc-notify — для организации оповещения, когда определенный пользователь входит или выходит из сети;
erc-smileys — для преобразования smileys в изображения с соответствующими эмоциями;
erc-sound — для проигрывания звуков при некоторых событиях;
erc-nicklist — отображает список имен для данного канала в отдельном буфере;
erc-speedbar — обеспечивает интеграцию erc и speedbar;
erc-chess — позволяет играть в шахматы с другими пользователями на IRC;
erc-lang — реализует новую команду /lang для выбора языка на канале;
erc-list — обеспечивает быстрый механизм получения списка каналов;
erc-menu — добавляет меню к буферам Erc, что может быть очень удобно, особенно для начинающих пользователей;
erc-speak — позволяет проговаривать содержимое разговоров с помощью Emacspeak;
erc-page — обеспечивает обработку /ctcp page команд;
erc-replace — выполняет замены в тексте сообщений.
Настройку Erc можно выполнить используя команду
M+x
customize-group
erc
.
Появившееся окно настройки позволяет вам задать основные
параметры клиента, а также перейти к настройку разных подсистем
клиента. Но кроме визуальной настройки, вы можете и сами
определять порядок инициализации, используя Emacs Lisp.
Erc позволяет настроить свое поведение в отношении личных
сообщений. По умолчанию, они отображаются в буфере сервера, что не
всегда удобно, когда ты разговариваешь с несколькими людьми.
Однако, с помощью переменной erc-auto-query
вы
можете изменить поведение Erc. Среди разрешенных значений:
'buffer
—
показывать личные сообщения в отдельном
буфере;
'window
—
показывать новые сообщения в новом, выбранном
окне;
'window-noselect
—
то же, что и предыдущее, но без перехода в новое
окно;
'bury
—
создает новый буфер, но не переходит в
него;
'frame
—
открывает новый фрейм.
вы можете создавать такие буфера не только для личных сообщений, но и для уведомлений сервера. Это делается добавлением соответствующего хука.
С помощью Erc вы можете делать часть информации невидимой. Это относится как к посетителям серверов, так и к различным уведомлениям, поступающим от самих серверов.
Например, чтобы не отображать данные о входе и выходе с
каналов, вы можете использовать переменную
erc-hide-list
, в качестве значения которой
задается список игнорируемых команд. Например, вот так:
(setq erc-hide-list '("JOIN" "PART"))
Для временного игнорирования сообщений от какого-либо
посетителя, вы можете использовать команду
/IGNORE
, но она будет действовать только до
окончания сессии. Для установки постоянного игнорирования,
вам необходимо в переменной erc-ignore-list
задать список имен пользователей, или регулярных выражений, которые будут
приводить к игнорированию сообщений от посетителей, чьи имена и
сетевые адреса подпадают под заданное выражение.
Кроме этого, вы можете скрывать часть содержимого, основываясь на более сложных вещах, например, если кто-то произносит определенные фразы, или разговаривает с роботами, засоряя канал ненужным текстом. Как это сделать описано на странице Emacs WiKi.
Erc позволяет вам подсвечивать различные части сообщений на
канале. Вы можете подсвечивать текст, имена пользователей, при этом
по умолчанию есть разделение на "друзей" и "дураков" :-) вы можете
задать список имен, и они будут отображаться с заданным
оформлением. По умолчанию этот режим отключен, но вы можете его
легко включить с помощью команды
M+x
customize-group
erc-match
. В этой группе вы
также обнаружите опции для настройки списков друзей, подсветки
вашего собственного имени, а также можете задать подсветку
произвольного текста. Для настройки параметров отображения,
воспользуйтесь группой настройки
erc-faces
.
Erc позволяет своим пользователям использовать разные
кодовые страницы для разных каналов (конечно, это только для тех
пользователей, которые используют Emacs с поддержкой mule).
Используя переменную erc-encoding-coding-alist
вы
можете задать соответствие между именами каналов, и кодировками,
которые используются на этих каналах. Например, я могу нормально
общаться на немецко-говорящих каналах, хотя на остальных каналах
будет использоваться кодировка koi8-r.
По реализации Erc, по большей части управляется событиями, которые обрабатываются соответствующими хуками. Существующие хуки можно разделить на несколько больших групп:
Хуки для сообщений сервера;
Хуки для /ctcp
команд;
Хуки для отображения и ввода;
Прочие хуки.
Стандарт для IRC определяет, что сервер должен
посылать команды клиентам в специальном формате. Сама
команда может быть либо трехзначным числом, либо именем
команды. При получении данных команд Erc запускает
соответствующий обработчик, и при его выполнении также
запускает соответствующий хук, который именуется
erc-server-команда-hook
.
Для команд /ctcp
существует два вида хуков — когда вы получаете запрос на выполнение
команды, и когда вы получаете ответ о выполнении команды.
Соответственно запускаются хуки
erc-ctcp-query-команда-hook
и
erc-ctcp-reply-команда-hook
.
Эти хуки также делятся на две группы — для отображения, и для обработки ввода.
К хукам отображения относятся:
erc-insert-pre-hook
—
вызывается перед вставкой сообщения в
буфер;
erc-insert-modify-hook
—
вызывается когда текст уже вставлен, но при этом, буфер в
которые вставлен текст, сужается до самого
текста;
erc-insert-post-hook
—
вызывается после вставки текста, но может обрабатывать
весь буфер.
К хукам ввода относятся:
erc-send-pre-hook
—
вызывается перед отправкой введенного пользователем
сообщения;
erc-send-modify-hook
—
вызывается после вставки текста в буфер, но при этом,
буфер в которые вставлен текст, сужается до самого
текста;
erc-send-post-hook
—
вызывается после вставки текста, но может обрабатывать
весь буфер.
erc-send-modify-hook
и
erc-send-post-hook
никаким образом не
влияют на отправляемый на сервер текст, и в основном могут
использоваться для изменения параметров отображения текста
в буфере.
erc-mode-hook
— вызывается для каждого буфера erc — буферов
каналов, буферов серверов и т.п.;
erc-timer-hook
—
вызывается при получении любого события от
сервера;
erc-before-connect
и erc-after-connect
— вызываются
перед подключением к конкретному серверу, а также после выдачи
сервером сообщения дня (MOTD).
Ниже приведен пример настройки Erc, который используется у меня. Я буду писать комментарии сразу в коде, чтобы сделать его понятным:
;; здесь мы просто загружаем erc (add-to-list 'load-path "~/emacs/erc") (require 'erc) ;; загружаем авто-подключение к каналам, и задаем список каналов для ;; подключения (require 'erc-autojoin) (erc-autojoin-mode t) (setq erc-autojoin-channels-alist '(("relay2" "#dansguardian" "#emacs" "#arch" "#linux.de" "#c.de" "#squiddev"))) ;; (require 'erc-fill) (erc-fill-mode t) ;; задаем персональные данные, хотя их можно задать и через ;; M-x customize-group erc (setq erc-user-full-name "Alex Ott") (setq erc-email-userid "alexott@gmail.com") ;; часть относящаяся к логированию переговоров на каналах ;; нужно ли вставлять старый лог в окно канала? (setq erc-log-insert-log-on-open nil) ;; логировать переговоры на каналах? (setq erc-log-channels t) ;; где будут храниться логи (setq erc-log-channels-directory "~/.irclogs/") ;; сохранять ли логи при возникновении PART (setq erc-save-buffer-on-part t) ;; убирать или нет временные отметки? (setq erc-hide-timestamps nil) ;; максимальный размер буфера канала (setq erc-max-buffer-size 500000)
большую часть использованных переменных можно установить воспользовавшись командами настройки Emacs, я показал этот пример только для наглядности. вы можете найти большое количество примеров настройки на страницах Emacs WiKi.
Вы можете найти огромное количество информации о Erc на страницах Emacs WiKi по адресу http://www.emacswiki.org/cgi-bin/emacs-en/EmacsIRCClient. Там вы сможете найти множество советов по настройке клиента, а также по интеграции его с различными приложениями, например, клиентом для игры в шахматы.