;;; prelude-erc.el --- Emacs Prelude: ERC mode configuration. ;; ;; Copyright (c) 2011 Bozhidar Batsov ;; ;; Author: Bozhidar Batsov ;; URL: http://www.emacswiki.org/cgi-bin/wiki/Prelude ;; Version: 1.0.0 ;; Keywords: convenience ;; This file is not part of GNU Emacs. ;;; Commentary: ;; Some basic configuration for ERC mode, which should make your ;; IRC experience a bit more pleasant. ;;; License: ;; This program is free software; you can redistribute it and/or ;; modify it under the terms of the GNU General Public License ;; as published by the Free Software Foundation; either version 3 ;; of the License, or (at your option) any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, ;; Boston, MA 02110-1301, USA. ;;; Code: (require 'erc) (require 'erc-log) (require 'erc-notify) (require 'erc-spelling) (require 'erc-autoaway) ;; Interpret mIRC-style color commands in IRC chats (setq erc-interpret-mirc-color t) ;; The following are commented out by default, but users of other ;; non-Emacs IRC clients might find them useful. ;; Kill buffers for channels after /part (setq erc-kill-buffer-on-part t) ;; Kill buffers for private queries after quitting the server (setq erc-kill-queries-on-quit t) ;; Kill buffers for server messages after quitting the server (setq erc-kill-server-buffer-on-quit t) ;; open query buffers in the current window (setq erc-query-display 'buffer) ;; exclude boring stuff from tracking (erc-track-mode t) (setq erc-track-exclude-types '("JOIN" "NICK" "PART" "QUIT" "MODE" "324" "329" "332" "333" "353" "477")) ;; logging (setq erc-log-channels-directory "~/.erc/logs/") (if (not (file-exists-p erc-log-channels-directory)) (mkdir erc-log-channels-directory t)) (setq erc-save-buffer-on-part t) (defadvice save-buffers-kill-emacs (before save-logs (arg) activate) (save-some-buffers t (lambda () (when (eq major-mode 'erc-mode) t)))) ;; truncate long irc buffers (erc-truncate-mode +1) ;; enable spell checking (erc-spelling-mode 1) ;; set different dictionaries by different servers/channels ;;(setq erc-spelling-dictionaries '(("#emacs" "american"))) ;; TODO - replace this with use of notify.el ;; Notify my when someone mentions my nick. (defun call-libnotify (matched-type nick msg) (let* ((cmsg (split-string (clean-message msg))) (nick (first (split-string nick "!"))) (msg (mapconcat 'identity (rest cmsg) " "))) (shell-command-to-string (format "notify-send -u critical '%s says:' '%s'" nick msg)))) (when (eq system-type 'linux) (add-hook 'erc-text-matched-hook 'call-libnotify)) (defvar erc-notify-nick-alist nil "Alist of nicks and the last time they tried to trigger a notification") (defvar erc-notify-timeout 10 "Number of seconds that must elapse between notifications from the same person.") (defun erc-notify-allowed-p (nick &optional delay) "Return non-nil if a notification should be made for NICK. If DELAY is specified, it will be the minimum time in seconds that can occur between two notifications. The default is `erc-notify-timeout'." (unless delay (setq delay erc-notify-timeout)) (let ((cur-time (time-to-seconds (current-time))) (cur-assoc (assoc nick erc-notify-nick-alist)) (last-time nil)) (if cur-assoc (progn (setq last-time (cdr cur-assoc)) (setcdr cur-assoc cur-time) (> (abs (- cur-time last-time)) delay)) (push (cons nick cur-time) erc-notify-nick-alist) t))) ;; private message notification (defun erc-notify-on-private-msg (proc parsed) (let ((nick (car (erc-parse-user (erc-response.sender parsed)))) (target (car (erc-response.command-args parsed))) (msg (erc-response.contents parsed))) (when (and (erc-current-nick-p target) (not (erc-is-message-ctcp-and-not-action-p msg)) (erc-notify-allowed-p nick)) (shell-command-to-string (format "notify-send -u critical '%s says:' '%s'" nick msg)) nil))) (add-hook 'erc-server-PRIVMSG-functions 'erc-notify-on-private-msg) ;; autoaway setup (setq erc-auto-discard-away t) (setq erc-autoaway-idle-seconds 600) (setq erc-autoaway-use-emacs-idle t) ;; utf-8 always and forever (setq erc-server-coding-system '(utf-8 . utf-8)) (defun start-irc () "Connect to IRC." (interactive) (when (y-or-n-p "Do you want to start IRC? ") (erc :server "irc.freenode.net" :port 6667 :nick erc-nick))) (defun filter-server-buffers () (delq nil (mapcar (lambda (x) (and (erc-server-buffer-p x) x)) (buffer-list)))) (defun stop-irc () "Disconnects from all irc servers" (interactive) (dolist (buffer (filter-server-buffers)) (message "Server buffer: %s" (buffer-name buffer)) (with-current-buffer buffer (erc-quit-server "Asta la vista")))) (provide 'prelude-erc) ;;; prelude-erc.el ends here