;;; -*- lexical-binding: t -*- ;;; ;;; this file: ;;; http://user.it.uu.se/~embe8573/emacs-init/erc-my.el ;;; https://dataswamp.org/~incal/emacs-init/erc-my.el (require 'erc) (require 'erc-fill) (require 'erc-join) (require 'erc-pcomplete) (require 'erc-ring) (require 'erc-stamp) (require 'fill-new) (require 'super) (require 'w3m) ;; user (setq erc-nick user-login-name) (setq erc-user-full-name user-login-name) ;; password (defvar freenode-password) (load "../../passwords.el") ;; servers (setq erc-server "irc.freenode.net") (setq erc-port 6697) ; 6667 no SSL/TLS ; 6697 SSL/TLS, freenode also 7000 and 7070 (defvar dataswamp-server) (defvar freenode-server) (setq dataswamp-server "irc.dataswamp.org") (setq freenode-server erc-server) ;; channels (setq erc-autojoin-channels-alist `((,dataswamp-server "#dataswamp" "#ghost"))) (defun connect-to-dataswamp () (interactive) (erc-tls :server dataswamp-server) ) (defalias 'dataswamp #'connect-to-dataswamp) (defun connect-to-freenode () (interactive) (erc-tls :password freenode-password) ) (defalias 'freenode #'connect-to-freenode) (defun irc-connect-to-all () (interactive) (erc-kill-all-buffers) (connect-to-dataswamp) (connect-to-freenode) ) (defun neq (a b) (not (eq a b) )) (defun erc-channel-and-server () (interactive) (when (eq 'major-mode 'erc-mode) (let*((channel (buffer-name)) (server erc-server) (full (format "%s %s" channel server) )) (kill-new full) (message full) ))) (defun open-irc () (interactive) (let ((irc-buffer (car (erc-buffer-list)))) (if irc-buffer (progn (switch-to-buffer irc-buffer) (erc-scroll-to-bottom-no-blanks)) (irc-connect-to-all) ))) (defun erc-kill-all-buffers () (interactive) (erc-cmd-GQUIT "disconnected") (let ((erc-buffers (erc-buffer-list))) (dolist (b erc-buffers) (kill-buffer b) ))) (defun erc-next-buffer () "Go to the next ERC buffer, if available." (interactive) (let*((erc-buffers (erc-buffer-list)) (current (car erc-buffers)) (next (cadr erc-buffers)) ) (when next (bury-buffer current) (switch-to-buffer next) (erc-scroll-to-bottom-no-blanks) ))) (defun erc-prev-buffer () "Go to the prev ERC buffer, if available." (interactive) (let*((erc-buffers (erc-buffer-list)) (prev (car (last erc-buffers))) ) (when prev (switch-to-buffer prev) (erc-scroll-to-bottom-no-blanks)) )) (defun erc-kill-buffer-cycle () (let ((erc-buffers (erc-buffer-list))) (if (= 1 (length erc-buffers)) (kill-buffer) (cl-loop for b in erc-buffers when (neq b (current-buffer)) do (erc-cmd-PART "") (kill-buffer) (switch-to-buffer b) (cl-return) )))) (defun erc-kill-buffer-stay () "Close the current ERC buffer, i.e. leave the channel or conversation, but stay in ERC." (interactive) (when (or (not (erc-server-process-alive)) (= ?y (read-char "hit `y' to leave"))) (erc-kill-buffer-cycle) )) ;; much improved by Felix Dietrich on ;; gnu.emacs.help and/or gmane.emacs.help (defun erc-cmd-R () "Repeat the last message or command." (if (and erc-input-ring (> (ring-length erc-input-ring) 1) ) (progn (ring-remove erc-input-ring 0) (erc-send-input (ring-ref erc-input-ring 0)) (ring-remove erc-input-ring 0) ) (error "Nothing to repeat") )) (defun ytb () (interactive) (let*((url w3m-current-url) (ytb (replace-regexp-in-string "https://www\\.youtube\\.com/watch\\?v=" "http://yewtu.be/" url) )) (kill-new (format "<%s> = <%s>" url ytb)) )) (defun empty-line-p () (looking-at "^$") ) (defun erc-scroll-to-top-no-blanks () (interactive) (goto-char (point-min)) (when (and (empty-line-p) (re-search-forward "[[:graph:]]" (point-max) t) ) (forward-line 0) (recenter 0) )) (defun erc-scroll-to-bottom-no-blanks () (interactive) (goto-char (point-max)) (recenter -1) ) (defvar erc-do-spell) (setq erc-do-spell t) (defun erc-toggle-spell () (interactive) (setq erc-do-spell (not erc-do-spell)) ) (defun erc-spell-then-send () (interactive) (when erc-do-spell (let ((inhibit-message t)) (ispell-region erc-input-marker (point)) )) (erc-send-current-line) ) (setq erc-hide-list '("JOIN" "KICK" "MODE" "NICK" "PART" "QUIT")) (setq erc-header-line-format nil) (setq erc-interpret-mirc-color t) (setq erc-kill-server-buffer-on-quit t) (setq erc-pcomplete-nick-postfix ",") (setq erc-prompt "$") ;; reconnect (setq erc-server-reconnect-attempts t) ;; mode line (setq erc-mode-line-away-status-format "ERC - away") (setq erc-mode-line-format "%-41t%35S") ;; timestamp (setq erc-timestamp-format nil) (setq erc-timestamp-format-left nil) (setq erc-timestamp-format-right nil) ;; fill (setq erc-fill-function #'erc-fill-static) (setq erc-fill-static-center 12) (defun set-erc-keys () (let ((the-map erc-mode-map)) (disable-super-global-keys the-map) (define-key the-map "\C-oi" #'erc-scroll-to-top-no-blanks) (define-key the-map "\C-ok" #'erc-scroll-to-bottom-no-blanks) (define-key the-map "\M-P" #'erc-previous-command) (define-key the-map "\M-N" #'erc-next-command) (define-key the-map "\C-\M-p" #'erc-prev-buffer) (define-key the-map "\C-\M-n" #'erc-next-buffer) (define-key the-map "\C-xk" #'erc-kill-buffer-stay) (define-key the-map "\r" #'erc-spell-then-send) )) ;; (set-erc-keys) ;; (setq erc-mode-hook nil) (defun erc-mode-hook-f () (visual-line-mode) (abbrev-mode) (erc-scrolltobottom-enable) (set-erc-keys) ) (add-hook 'erc-mode-hook #'erc-mode-hook-f) (provide 'erc-my)