summaryrefslogtreecommitdiffstats
path: root/emacs
diff options
context:
space:
mode:
authorGravatar Tom Willemse2015-10-03 00:19:21 +0200
committerGravatar Tom Willemse2015-10-03 00:19:21 +0200
commit71751ca88d76ca9ce34ffc5fca48593666770182 (patch)
tree739004e3faccbb7bcc1efa5801611619ab2e8463 /emacs
parent168807b974731edccb2a013a9793c61342ee8b8b (diff)
downloaddotfiles-71751ca88d76ca9ce34ffc5fca48593666770182.tar.gz
dotfiles-71751ca88d76ca9ce34ffc5fca48593666770182.zip
Move Circe settings to literate init
Diffstat (limited to 'emacs')
-rw-r--r--emacs/.emacs.d/Makefile13
-rw-r--r--emacs/.emacs.d/init.el92
-rw-r--r--emacs/.emacs.d/init.org228
-rw-r--r--emacs/.emacs.d/site-lisp/.gitignore1
4 files changed, 238 insertions, 96 deletions
diff --git a/emacs/.emacs.d/Makefile b/emacs/.emacs.d/Makefile
index 1ec758a..a5ab771 100644
--- a/emacs/.emacs.d/Makefile
+++ b/emacs/.emacs.d/Makefile
@@ -1,8 +1,13 @@
EMACS = cask exec emacs
EARGS = -Q -batch -l package
+AUTOLOADS_FILE=site-lisp/site-autoloads.el
+UNWANTED=$(AUTOLOADS_FILE) site-lisp/flycheck_% site-lisp/flycheck-%
+SITE_LISPS = $(addsuffix c,$(filter-out $(UNWANTED),$(wildcard site-lisp/*.el))) \
+ site-lisp/circe-init.elc
+
.PHONY: all site-lisp snippets
-all: init2.elc init.elc site-lisp/site-autoloads.el snippets
+all: init2.elc init.elc $(AUTOLOADS_FILE) $(SITE_LISPS) snippets
### Init
@@ -11,17 +16,13 @@ all: init2.elc init.elc site-lisp/site-autoloads.el snippets
@$(EMACS) $(EARGS) -eval "(byte-compile-file \"$<\")"
init.el: init2.el
-init2.el: init.org
+init2.el site-lisp/circe-init.el: init.org
@echo "OBT $<"
@$(EMACS) $(EARGS) -l "ob-tangle" \
-eval "(org-babel-tangle-file \"init.org\")"
### Site Lisp
-AUTOLOADS_FILE=site-lisp/site-autoloads.el
-UNWANTED=$(AUTOLOADS_FILE) site-lisp/flycheck_% site-lisp/flycheck-%
-SITE_LISPS = $(addsuffix c,$(filter-out $(UNWANTED),$(wildcard site-lisp/*.el)))
-
$(AUTOLOADS_FILE): $(SITE_LISPS)
@echo "GEN $@"
@$(EMACS) $(EARGS) \
diff --git a/emacs/.emacs.d/init.el b/emacs/.emacs.d/init.el
index 3ef4a46..8b68969 100644
--- a/emacs/.emacs.d/init.el
+++ b/emacs/.emacs.d/init.el
@@ -236,13 +236,6 @@ But only if it is a maildir inbox."
"Function for `diary-display-hook'."
(diary-fancy-display))
-(defun oni:display-in-minibufferless-frame (buffer _)
- (let ((default-frame-alist default-frame-alist))
- (push '(minibuffer . nil) default-frame-alist)
- (let ((frame (make-frame)))
- (select-frame frame)
- (switch-to-buffer buffer))))
-
(defun oni:downcase-prev (num)
(interactive "p")
(oni:change-prev-case num 'down))
@@ -977,85 +970,7 @@ from myaethon2.core.decorators import (
c-lineup-gnu-DEFUN-intro-cont))))
(stante-after circe
- (defvar oni:circe-longest-nick 0)
- (make-variable-buffer-local 'oni:circe-longest-nick)
-
- (defun oni:circe-prompt (&rest keywords)
- (let* ((nick (plist-get keywords :nick))
- (l (length nick)))
- (when (> l oni:circe-longest-nick)
- (setq oni:circe-longest-nick l)
- (setq-local lui-fill-type (make-string (+ l 3) ?\ )))
- (format "%s %s" (s-pad-left oni:circe-longest-nick " " nick)
- (plist-get keywords :body))))
-
- (defun oni:circe-action-prompt (&rest keywords)
- (format "%s %s %s" (s-pad-left oni:circe-longest-nick " " "*")
- (plist-get keywords :nick)
- (plist-get keywords :body)))
-
- (defun oni:circe-server-prompt (&rest keywords)
- (format "%s %s" (s-pad-left oni:circe-longest-nick " " "***")
- (plist-get keywords :body)))
-
- (defun oni:circe-server-join-in-channel (&rest keywords)
- (format "%s Join: %s (%s) joined %s"
- (s-pad-left oni:circe-longest-nick " " "***")
- (plist-get keywords :nick)
- (plist-get keywords :userinfo)
- (plist-get keywords :channel)))
-
- (defun oni:circe-server-join (&rest keywords)
- (format "%s %s joined the channel"
- (s-pad-left oni:circe-longest-nick " " "***")
- (plist-get keywords :nick)))
-
- (defun oni:circe-server-quit (&rest keywords)
- (format "%s %s quit IRC: %s"
- (s-pad-left oni:circe-longest-nick " " "***")
- (plist-get keywords :nick)
- (plist-get keywords :reason)))
-
- (defun oni:circe-server-quit-channel (&rest keywords)
- (format "%s %s left %s: %s"
- (s-pad-left oni:circe-longest-nick " " "***")
- (plist-get keywords :nick)
- (plist-get keywords :channel)
- (plist-get keywords :reason)))
-
- (defun oni:circe-server-part (&rest keywords)
- (format "%s %s parted %s: %s"
- (s-pad-left oni:circe-longest-nick " " "***")
- (plist-get keywords :nick)
- (plist-get keywords :channel)
- (plist-get keywords :reason)))
-
- (defun oni:circe-server-nick-change (&rest keywords)
- (format "%s %s is now known as %s"
- (s-pad-left oni:circe-longest-nick " " "***")
- (plist-get keywords :old-nick)
- (plist-get keywords :new-nick)))
-
- (setq circe-format-self-say #'oni:circe-prompt)
- (setq circe-format-say #'oni:circe-prompt)
- (setq circe-format-self-action #'oni:circe-action-prompt)
- (setq circe-format-action #'oni:circe-action-prompt)
- (setq circe-format-server-message #'oni:circe-server-prompt)
- (setq circe-format-server-join-in-channel #'oni:circe-server-join-in-channel)
- (setq circe-format-server-join #'oni:circe-server-join)
- (setq circe-format-server-quit #'oni:circe-server-quit)
- (setq circe-format-server-quit-channel #'oni:circe-server-quit-channel)
- (setq circe-format-server-part #'oni:circe-server-part)
- (setq circe-format-server-nick-change #'oni:circe-server-nick-change)
- (setq circe-network-options
- `(("Freenode"
- :nick "ryuslash"
- :channels ("#emacs" "#mowedline" "#ninthfloor"))))
- (setq lui-time-stamp-position 'right-margin)
- (setq lui-time-stamp-format "%H:%M")
- (setq lui-fill-type 'variable)
- (add-hook 'lui-mode-hook (lambda () (setq right-margin-width 5)))
- (add-hook 'circe-channel-mode-hook (lambda () (setq mode-line-format nil))))
+ (require 'circe-init))
(stante-after compile
(setq compilation-scroll-output t))
@@ -1333,10 +1248,7 @@ from myaethon2.core.decorators import (
'("^\\*Help\\*$" display-buffer-in-side-window))
(add-to-list
'display-buffer-alist
- `(,(rx bol "*helm") display-buffer-in-side-window (side . right))
-
- (add-to-list 'display-buffer-alist
- '("^\#mowedline$" oni:display-in-minibufferless-frame))))
+ `(,(rx bol "*helm") display-buffer-in-side-window (side . right))))
(stante-after woman
(setq woman-fill-column 72))
diff --git a/emacs/.emacs.d/init.org b/emacs/.emacs.d/init.org
index 8aa09d8..03630c9 100644
--- a/emacs/.emacs.d/init.org
+++ b/emacs/.emacs.d/init.org
@@ -1293,6 +1293,234 @@
<<magit-diff-refine-hunk>>)
#+END_SRC
+** Circe
+ :PROPERTIES:
+ :header-args: :tangle site-lisp/circe-init.el
+ :END:
+
+ I used to use ERC mostly because I didn't really use IRC at all and
+ it was basically the first IRC client in Emacs that was presented
+ to me, it being built-in and all. When I started to use IRC more
+ and wanted to customize the way it looks more I was surprised to
+ find that it wasn't all that easy. A friend of mine was using Circe
+ and he helped me figure out how to get started with customizing
+ Circe the way I wanted it. So now I use Circe.
+
+ These settings will be tangled to =site-lisp/circe-init.el= and
+ loaded when Circe is loaded.
+
+*** Require the needed libraries
+
+ In order to keep compiler warnings to a minimum, require the
+ libraries that are used in the configuration of Circe.
+
+ #+BEGIN_SRC emacs-lisp
+ (require 'lui)
+ (require 'circe)
+ (require 's)
+ #+END_SRC
+
+*** Clean-up the display of messages
+
+ I once saw a very clean and simple weechat configuration on
+ [[https://www.reddit.com/r/unixporn][/r/unixporn]] and really wanted to have something similar. This was
+ the start of my disappointment in ERC, I couldn't figure out how
+ to change the way messages were printed. With a little help I did
+ find out how to do it in Circe.
+
+ First we create a variable to store the length of the longest
+ known nick, so we can properly align all messages. This variable
+ should be buffer-local because each IRC chat will have different
+ users with different length names. We start with a length of ~0~
+ because we don't know what the shortest nick there is going to be.
+
+ #+BEGIN_SRC emacs-lisp
+ (defvar oni:circe-longest-nick 0)
+ (make-variable-buffer-local 'oni:circe-longest-nick)
+ #+END_SRC
+
+ Then we write the function that will print the most important
+ messages, the ones people send, including me. Whenever we get a
+ message or send a message, we check the length of the nick with
+ the last recorded maximum length. If the new nick is longer that
+ any previous ones we set this new length as the longest known
+ length and adjust =lui-fill-type= accordingly. This ensures that
+ continuation lines are indented to the correct column.
+
+ #+BEGIN_SRC emacs-lisp
+ (defun oni:circe-say-formatter (&rest keywords)
+ (let* ((nick (plist-get keywords :nick))
+ (len (length nick)))
+ (when (> len oni:circe-longest-nick)
+ (setq oni:circe-longest-nick len)
+ (setq-local lui-fill-type (make-string (+ len 3) ?\ )))
+ (format "%s %s" (s-pad-left oni:circe-longest-nick " " nick)
+ (plist-get keywords :body))))
+ #+END_SRC
+
+ I use this formatter both for messages I send myself and incoming
+ messages, because they should basically look the same.
+
+ #+BEGIN_SRC emacs-lisp
+ (setq circe-format-self-say #'oni:circe-say-formatter
+ circe-format-say #'oni:circe-say-formatter)
+ #+END_SRC
+
+ The rest of the formatting functions are basically the same,
+ except they don't need to change the known size of nicks because
+ they don't print the nick in the same column, instead they usually
+ print something like "***" to indicate that it is a system message
+ and not a user message. We do pad whatever they print with the
+ same number of spaces to keep them right-justified with the nicks.
+
+ #+BEGIN_SRC emacs-lisp
+ (defun oni:circe-action-formatter (&rest keywords)
+ (format "%s %s %s" (s-pad-left oni:circe-longest-nick " " "*")
+ (plist-get keywords :nick)
+ (plist-get keywords :body)))
+
+ (defun oni:circe-server-message-formatter (&rest keywords)
+ (format "%s %s" (s-pad-left oni:circe-longest-nick " " "***")
+ (plist-get keywords :body)))
+
+ (defun oni:circe-server-join-in-channel-formatter (&rest keywords)
+ (format "%s Join: %s (%s) joined %s"
+ (s-pad-left oni:circe-longest-nick " " "***")
+ (plist-get keywords :nick)
+ (plist-get keywords :userinfo)
+ (plist-get keywords :channel)))
+
+ (defun oni:circe-server-join-formatter (&rest keywords)
+ (format "%s %s joined the channel"
+ (s-pad-left oni:circe-longest-nick " " "***")
+ (plist-get keywords :nick)))
+
+ (defun oni:circe-server-quit-formatter (&rest keywords)
+ (format "%s %s quit IRC: %s"
+ (s-pad-left oni:circe-longest-nick " " "***")
+ (plist-get keywords :nick)
+ (plist-get keywords :reason)))
+
+ (defun oni:circe-server-quit-channel-formatter (&rest keywords)
+ (format "%s %s left %s: %s"
+ (s-pad-left oni:circe-longest-nick " " "***")
+ (plist-get keywords :nick)
+ (plist-get keywords :channel)
+ (plist-get keywords :reason)))
+
+ (defun oni:circe-server-part-formatter (&rest keywords)
+ (format "%s %s parted %s: %s"
+ (s-pad-left oni:circe-longest-nick " " "***")
+ (plist-get keywords :nick)
+ (plist-get keywords :channel)
+ (plist-get keywords :reason)))
+
+ (defun oni:circe-server-nick-change-formatter (&rest keywords)
+ (format "%s %s is now known as %s"
+ (s-pad-left oni:circe-longest-nick " " "***")
+ (plist-get keywords :old-nick)
+ (plist-get keywords :new-nick)))
+
+ (setq circe-format-self-action #'oni:circe-action-formatter)
+ (setq circe-format-action #'oni:circe-action-formatter)
+ (setq circe-format-server-message #'oni:circe-server-message-formatter)
+ (setq circe-format-server-join-in-channel
+ #'oni:circe-server-join-in-channel-formatter)
+ (setq circe-format-server-join #'oni:circe-server-join-formatter)
+ (setq circe-format-server-quit #'oni:circe-server-quit-formatter)
+ (setq circe-format-server-quit-channel
+ #'oni:circe-server-quit-channel-formatter)
+ (setq circe-format-server-part #'oni:circe-server-part-formatter)
+ (setq circe-format-server-nick-change
+ #'oni:circe-server-nick-change-formatter)
+ #+END_SRC
+
+*** Automatically join some channels
+
+ I started using IRC because #mowedline was started and I felt
+ obligated to join it as I was one of two known Mowedline users at
+ the time. So now that's the one I'm usually active in. I do like
+ to keep an eye on #emacs from time to time and #ninthfloor in case
+ something happens there, though usually not.
+
+ #+BEGIN_SRC emacs-lisp
+ (setq circe-network-options
+ `(("Freenode"
+ :nick "ryuslash"
+ :channels ("#emacs" "#mowedline" "#ninthfloor"))))
+ #+END_SRC
+
+*** Change the time-stamp
+
+ I use only a small window to view the IRC channel I'm in usually,
+ the default format put the time-stamp just a little too far to the
+ right and would always cause either line truncation or filling to
+ the next line. So I put the time-stamp in the right margin so it's
+ always to the right of all messages and no messages can run under
+ it, so essentially it has it's own column.
+
+ #+BEGIN_SRC emacs-lisp
+ (setq lui-time-stamp-position 'right-margin)
+ (setq lui-time-stamp-format "%H:%M")
+ #+END_SRC
+
+ Give the right margin just enough room to show the time-stamps, no
+ more, no less.
+
+ #+BEGIN_SRC emacs-lisp
+ (defun oni:set-circe-margin-width ()
+ (setq right-margin-width 5))
+
+ (add-hook 'lui-mode-hook #'oni:set-circe-margin-width)
+ #+END_SRC
+
+*** Clean-up the channel buffers further
+
+ When chatting with people in an IRC channel, there really isn't
+ much need for any information in the mode-line. This is mostly
+ because the channel I'm most active on always has its own window.
+ Visual line mode is very handy to have in chats, in case I type
+ very long lines. And the =wrap-prefix= is set so that when I do type
+ long lines, they are filled nicely to the circe prompt.
+
+ #+BEGIN_SRC emacs-lisp
+ (defun oni:remove-mode-line ()
+ (setq mode-line-format nil))
+
+ (defun oni:set-circe-prompt-wrap-prefix ()
+ (setq wrap-prefix " "))
+
+ (add-hook 'circe-channel-mode-hook #'oni:remove-mode-line)
+ (add-hook 'circe-channel-mode-hook #'oni:set-circe-prompt-wrap-prefix)
+ (add-hook 'circe-channel-mode-hook 'visual-line-mode)
+ #+END_SRC
+
+*** Show #mowedline in a frame without minibuffer
+
+ When I'm chatting on #mowedline I do so in a separate small
+ window. This window needs no minibuffer as I do very little
+ actualy Emacsy things in it. Just typing a little and reading. So
+ far I only do this with #mowedline. In order to specifically show
+ it in a frame without a minibuffer I use =display-buffer-alist= to
+ specify how to show it. The function called dynamically binds
+ =default-frame-alist= to add a =minibuffer= element with the value
+ =nil= (meaning, no minibuffer). I can't do this in the regular
+ =default-frame-alist= because I want all other frames to show up
+ /with/ a minibuffer. It then creates a new frame and switches to the
+ given buffer in it.
+
+ #+BEGIN_SRC emacs-lisp
+ (defun oni:display-in-minibufferless-frame (buffer _)
+ (let ((default-frame-alist default-frame-alist))
+ (push '(minibuffer . nil) default-frame-alist)
+ (let ((frame (make-frame)))
+ (select-frame frame)
+ (switch-to-buffer buffer))))
+
+ (add-to-list 'display-buffer-alist
+ '("^\#mowedline$" oni:display-in-minibufferless-frame))
+ #+END_SRC
+
* Minor mode customization
Many minor modes also offer a bit of customization possibilities.
diff --git a/emacs/.emacs.d/site-lisp/.gitignore b/emacs/.emacs.d/site-lisp/.gitignore
index a327303..36bf5d4 100644
--- a/emacs/.emacs.d/site-lisp/.gitignore
+++ b/emacs/.emacs.d/site-lisp/.gitignore
@@ -1,2 +1,3 @@
rudel/
site-autoloads.el
+circe-init.el