spacemacs/layers/+chat/erc/packages.el
Miciah Masters e0b751bee3 Avoid non-idempotent use of push in init code
Replace push with add-to-list in layer init functions and related code.

Modify spacemacs|add-toggle to check for and update an existing toggle in
spacemacs-toggles and only create a new toggle if none already existed.

Replace a conditional push onto erc-packages with use of :toggle.

When initializing which-key, set which-key-replacement-alist to its default
or customized setting before adding all the Spacemacs replacements.  We
want to keep the stock replacements but avoid adding duplicates of the
Spacemacs replacements.

Replace the emacs-lisp-mode-hook lambda with a named function to avoid
adding duplicate hooks (which can add duplicate definitions of the
evil-surround pair).
2018-06-05 22:17:13 -04:00

248 lines
8.2 KiB
EmacsLisp

;;; packages.el --- erc Layer packages File for Spacemacs
;;
;; Copyright (c) 2012-2018 Sylvain Benner & Contributors
;;
;; Author: Sylvain Benner <sylvain.benner@gmail.com>
;; URL: https://github.com/syl20bnr/spacemacs
;;
;; This file is not part of GNU Emacs.
;;
;;; License: GPLv3
(defconst erc-packages
'(
company
company-emoji
emoji-cheat-sheet-plus
erc
(erc-gitter :location (recipe
:fetcher github
:repo "jleechpe/erc-gitter")
:excluded t)
erc-hl-nicks
erc-image
(erc-sasl :location local)
erc-social-graph
(erc-terminal-notifier :toggle (spacemacs/system-is-mac))
(erc-tex :location local)
erc-view-log
(erc-yank :location local :excluded t)
erc-yt
linum
persp-mode
))
(defun erc/post-init-company ()
(spacemacs|add-company-backends :backends company-capf :modes erc-mode))
(defun erc/post-init-company-emoji ()
(spacemacs|add-company-backends :backends company-emoji :modes erc-mode))
(defun erc/post-init-emoji-cheat-sheet-plus ()
(add-hook 'erc-mode-hook 'emoji-cheat-sheet-plus-display-mode))
(defun erc/init-erc ()
"Initialize ERC"
(use-package erc
:defer t
:init
(progn
(spacemacs/set-leader-keys
"aie" 'erc
"aiE" 'erc-tls
"aii" 'erc-track-switch-buffer
"aiD" 'erc/default-servers)
;; utf-8 always and forever
(setq erc-server-coding-system '(utf-8 . utf-8)))
:config
(progn
(use-package erc-autoaway
:defer t
:init
(setq erc-auto-discard-away t
erc-autoaway-idle-seconds 600
erc-autoaway-use-emacs-idle t))
(erc-services-mode 1)
(defun erc-list-command ()
"execute the list command"
(interactive)
(insert "/list")
(erc-send-current-line))
(setq erc-kill-buffer-on-part t
erc-kill-queries-on-quit t
erc-kill-server-buffer-on-quit t)
(add-hook 'erc-connect-pre-hook (lambda (x) (erc-update-modules)))
(erc-track-mode t)
(setq erc-track-exclude-types '("JOIN" "NICK" "PART" "QUIT" "MODE")
erc-server-coding-system '(utf-8 . utf-8))
(setq erc-prompt (lambda () (concat "[" (buffer-name) "]")))
;; Notifications are enabled if erc-enable-notifications is non-nil, and
;; D-BUS is available (i.e. Linux/BSD).
(when (and erc-enable-notifications (boundp 'dbus-compiled-version))
(require 'notifications)
(defun erc-global-notify (match-type nick message)
"Notify when a message is received."
(notifications-notify
:title nick
:body message
:app-icon (concat spacemacs-assets-directory "spacemacs.svg")
:urgency 'low))
(add-hook 'erc-text-matched-hook 'erc-global-notify))
;; keybindings
(spacemacs/set-leader-keys-for-major-mode 'erc-mode
"b" 'erc-switch-to-buffer
"d" 'erc-input-action
"j" 'erc-join-channel
"n" 'erc-channel-names
"l" 'erc-list-command
"p" 'erc-part-from-channel
"q" 'erc-quit-server))))
(defun erc/init-erc-gitter ()
(use-package erc-gitter
:config
(add-to-list 'erc-modules 'gitter)))
(defun erc/pre-init-erc-hl-nicks ()
(spacemacs|use-package-add-hook erc
:post-config
(use-package erc-hl-nicks)))
(defun erc/init-erc-hl-nicks ())
(defun erc/pre-init-erc-sasl ()
(spacemacs|use-package-add-hook erc
:post-config
(use-package erc-sasl
:defer t
:if erc-enable-sasl-auth
;; Following http://www.emacswiki.org/emacs/ErcSASL
;; Maybe an advice would be better?
:config
(progn
;; Add any server like this
;; (add-to-list 'erc-sasl-server-regexp-list "host\\.server\\.com")
(add-to-list 'erc-sasl-server-regexp-list "irc\\.freenode\\.net")
(defun erc-login ()
"Perform user authentication at the IRC server."
(erc-log (format "login: nick: %s, user: %s %s %s :%s"
(erc-current-nick)
(user-login-name)
(or erc-system-name (system-name))
erc-session-server
erc-session-user-full-name))
(if erc-session-password
(erc-server-send (format "PASS %s" erc-session-password))
(message "Logging in without password"))
(when (and (featurep 'erc-sasl) (erc-sasl-use-sasl-p))
(erc-server-send "CAP REQ :sasl"))
(erc-server-send (format "NICK %s" (erc-current-nick)))
(erc-server-send
(format "USER %s %s %s :%s"
;; hacked - S.B.
(if erc-anonymous-login erc-email-userid (user-login-name))
"0" "*"
erc-session-user-full-name))
(erc-update-mode-line))))))
(defun erc/init-erc-sasl ())
(defun erc/pre-init-erc-social-graph ()
(spacemacs|use-package-add-hook erc
:post-config
(use-package erc-social-graph
:init
(progn
;; does not exist ?
;; (erc-social-graph-enable)
(setq erc-social-graph-dynamic-graph t)
(spacemacs/set-leader-keys-for-major-mode 'erc-mode
"D" 'erc-social-graph-draw)))))
(defun erc/init-erc-social-graph ())
(defun erc/pre-init-erc-tex ()
(spacemacs|use-package-add-hook erc
:post-config
(require 'erc-tex)))
(defun erc/init-erc-tex ())
(defun erc/pre-init-erc-yt ()
(spacemacs|use-package-add-hook erc
:post-config
(use-package erc-yt
:init (with-eval-after-load 'erc
(add-to-list 'erc-modules 'youtube)))))
(defun erc/init-erc-yt ())
(defun erc/pre-init-erc-yank ()
(spacemacs|use-package-add-hook erc
:post-config
(use-package erc-yank
:if (configuration-layer/package-used-p 'gist)
:init (evil-define-key 'normal erc-mode-map "p" 'erc-yank))))
(defun erc/init-erc-yank ())
(defun erc/init-erc-view-log ()
(use-package erc-view-log
:defer t
:init
(progn
(setq erc-log-channels-directory
(expand-file-name
(concat spacemacs-cache-directory
"erc-logs")))
(unless (file-exists-p erc-log-channels-directory)
(make-directory erc-log-channels-directory))
(add-to-list 'auto-mode-alist
`(,(format "%s/.*\\.[log|txt]"
(regexp-quote
(expand-file-name
erc-log-channels-directory))) . erc-view-log-mode))
(with-eval-after-load 'erc (add-to-list 'erc-modules 'log)))
:config
;; ERC Logging
(progn
;; Following https://raw.githubusercontent.com/Niluge-KiWi/erc-view-log/master/erc-view-log.el
;; installation instructions
(add-hook 'erc-view-log-mode-hook 'turn-on-auto-revert-tail-mode)
(spacemacs|define-transient-state erc-log
:title "ERC Log Transient State"
:doc "\n[_r_] reload the log file [_>_/_<_] go to the next/prev mention"
:evil-leader-for-mode (erc-mode . ".")
:bindings
("r" erc-view-log-reload-file)
(">" erc-view-log-next-mention)
("<" erc-view-log-previous-mention)))))
(defun erc/init-erc-image ()
(use-package erc-image
:defer t
:init (with-eval-after-load 'erc
(require 'erc-image)
(add-to-list 'erc-modules 'image))))
(defun erc/init-erc-terminal-notifier ()
(use-package erc-terminal-notifier
:if (executable-find "terminal-notifier")))
(defun erc/post-init-linum ()
(spacemacs/add-to-hooks 'spacemacs/no-linum '(erc-mode-hook
erc-insert-pre-hook)))
(defun erc/pre-init-persp-mode ()
(spacemacs|use-package-add-hook persp-mode
:post-config
(progn
(add-to-list 'persp-filter-save-buffers-functions
'spacemacs//erc-persp-filter-save-buffers-function)
(spacemacs|define-custom-layout erc-spacemacs-layout-name
:binding erc-spacemacs-layout-binding
:body
(progn
(add-hook 'erc-mode-hook #'spacemacs//erc-buffer-to-persp)
(if erc-server-list
(erc/default-servers)
(call-interactively 'erc)))))))