summaryrefslogtreecommitdiffstats
path: root/.emacs.d/init.org
blob: 2cd3696e3b634be84edd584776895bccd1c5158b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
#+TITLE: ryuslash's Emacs init
#+PROPERTY: tangle init2.el
#+STARTUP: showall
#+OPTIONS: author:nil num:nil toc:nil
#+MACRO: key   @@html:<kbd>$1</kbd>@@@@ascii:`$1'@@
#+HTML_HEAD: <link href="https://ryuslash.org/org.css" rel="stylesheet" type="text/css">

* Cleanup basic UI

  The tool-bar, menu-bar and scroll-bar aren't particularly
  keyboard-friendly and just take up space if you don't use them.
  Anything in the tool-bar or menu-bar can be accessed just as easily
  with {{{key(M-x)}}}. The scroll-bar is almost just as informative as
  the current line number and buffer position information.

  #+BEGIN_SRC emacs-lisp :padline no
    (menu-bar-mode -1)
    (tool-bar-mode -1)
    (scroll-bar-mode -1)
  #+END_SRC

* Stop blinking!

  Blinking cursors are a distraction.

  #+BEGIN_SRC emacs-lisp
    (blink-cursor-mode -1)
  #+END_SRC

* Buffer position

  As I'm currently using svg-mode-line-themes[fn:1] for my ~mode-line~ I
  don't need to show these. Also I didn't really use them much, I
  don't often need to know what line I'm on.

  #+BEGIN_SRC emacs-lisp
    (column-number-mode -1)
    (line-number-mode -1)
  #+END_SRC

* Don't show tooltips

  Tooltips are another one of those UI elements that aren't quite
  keyboard-friendly. As usually this information is shown just as well
  in the echo area, this is not necessary.

  #+BEGIN_SRC emacs-lisp
    (tooltip-mode -1)
  #+END_SRC

* Add org-mode appointments to the diary

  Diary offers reminders, which can be useful when scheduling
  appointments.

  #+BEGIN_SRC emacs-lisp
    (defadvice org-agenda-redo (after ext:org-agenda-redo-add-appts)
      "Pressing `r' on the agenda will also add appointments."
      (setq appt-time-msg-list nil)
      (org-agenda-to-appt))
  #+END_SRC

* Close ansi-term buffer after exit

  After the ansi-term process ends it leaves a buffer. I don't use
  ansi term in such a way that this has ever been useful, so just kill
  the ansi-term buffer after the process quits, no matter the exit
  status. Usually this comes about when I press {{{kbd(C-d)}}} at the
  command prompt.

  #+BEGIN_SRC emacs-lisp
    (defadvice term-handle-exit (after oni:kill-buffer-after-exit activate)
      "Kill the term buffer if the process finished."
      (kill-buffer (current-buffer)))
  #+END_SRC

* Stumpwm integration

  This variable, macro and function help with integrating Emacs and
  Stumpwm. They are used by several other functions to make the two
  seem extra connected. An example of this can be found in [[Fall back
  on stumpwm when moving around]].

  #+BEGIN_SRC emacs-lisp
    (defvar oni:stumpish-program
      (expand-file-name
       "~/.local/share/quicklisp/local-projects/stumpwm/contrib/util/stumpish/stumpish")
      "The location of the stumpish executable.")

    (defmacro oni:stumpwm (&rest body)
      "Execute BODY in stumpwm."
      (declare (indent 0))
      `(call-process oni:stumpish-program nil nil nil
                     ,(format "eval '%S'" `(progn ,@body))))

    (defun oni:stumpwm-command (cmd)
      "Execute CMD in stumpwm."
      (call-process oni:stumpish-program nil nil nil cmd))

    (defun oni:stumpwm-echo (message)
      (call-process oni:stumpish-program nil nil nil (format "echo %s" message)))
  #+END_SRC

* Fall back on stumpwm when moving around

  Using the function specified in [[Stumpwm integration]] wrap the
  =windmove-do-window-select= function and catch any error produced,
  hoping it's the error that there's no more window to move to and
  then request that stumpwm move the focus in the same direction as
  windmove would have.

  #+BEGIN_SRC emacs-lisp
    (defadvice windmove-do-window-select
        (around oni:windmove-stumpwm activate)
      "If no window can be moved to, move stumpwm."
      (condition-case err
          ad-do-it
        (error (oni:stumpwm-command
                (format "move-focus %s" (ad-get-arg 0))))))
  #+END_SRC

* Don't just quit Emacs with {{{key(C-x C-c)}}} in the daemon

  When working with Emacs as a daemon, which I do almost all of the
  time, I prefer using {{{key(C-x C-c)}}} to close the current frame
  instead of the entire session. Before this change I would
  occasionally close my session by mistake.

  #+BEGIN_SRC emacs-lisp
    (defun oni:close-client-window ()
      "Close a client's frames."
      (interactive)
      (server-save-buffers-kill-terminal nil))

    (when (daemonp)
      (global-set-key (kbd "C-x C-c") 'oni:close-client-window))
  #+END_SRC

* Don't minimize the frame with {{{key(C-z)}}}

  One of the more annoying things that can happen is accidentally
  minimizing the frame you're working with. This doesn't really matter
  if you're working on a normal stacking window manager, but with a
  tiling window manager and no task bar this just causes the Emacs
  frame to hang until it is refocused or disappear with no way to get
  it back.

  #+BEGIN_SRC emacs-lisp
    (when (or window-system (daemonp))
      (global-unset-key (kbd "C-z")))
  #+END_SRC

* Use the right dictionary

  One of the caveats of using two (or more) languages in a single
  installation of Gnus is that ispell sometimes gets confused. Having
  come across a stackoverflow question[fn:2] about just this subject
  it was easy to modify the source code posted there to come up with
  this.

  #+BEGIN_SRC emacs-lisp
    (defun oni:switch-ispell-dictionary ()
      (save-excursion
        (message-narrow-to-headers-or-head)
        (let ((from (message-fetch-field "From")))
          (ispell-change-dictionary
           (if (string-match (rx "@aethon.nl>" eol) from) "nl" "en")))))

    (add-hook 'message-setup-hook 'oni:switch-ispell-dictionary)
  #+END_SRC

* Don't let shr use background color

  Reading mail in Gnus is very nice, but shr has become a little too
  good at its job. Add to this the many occasions when a background is
  specified without specifying a foreground, plus a color theme that
  is the inverse of what is usually expected, and you can get
  hard-to-read HTML messages, gray foreground and gray background.

  I've looked at the other possible renderers, but they don't look
  very nice compared to shr. So just remove its ability to add
  background colors.

  #+BEGIN_SRC emacs-lisp
    (defun oni:shr-colorize-remove-last-arg (args)
      "If ARGS has more than 3 items, remove the last one."
      (if (> (length args) 3)
          (butlast args)
        args))

    (with-eval-after-load 'shr
      (advice-add #'shr-colorize-region :filter-args
                  #'oni:shr-colorize-remove-last-arg))
  #+END_SRC

* Optimized ~with-eval-after-load~

  First offered [[http://www.lunaryorn.com/2013/05/01/byte-compiling-eval-after-load.html][here]] and then later updated [[http://www.lunaryorn.com/2013/06/25/introducing-with-eval-after-load.html][here]] (when
  ~with-eval-after-load~ was added). Makes for very nice on-demand
  settings loading.

  #+BEGIN_SRC emacs-lisp
    ;; http://www.lunaryorn.com/2013/06/25/introducing-with-eval-after-load/
    (defmacro stante-after (feature &rest forms)
      "After FEATURE is loaded, evaluate FORMS.

    FEATURE may be an unquoted feature symbol or a file name, see
    `eval-after-load'."
      (declare (indent 1) (debug t))
      `(,(if (or (not byte-compile-current-file)
                 (if (symbolp feature)
                     (require feature nil :noerror)
                   (load feature :no-message :no-error)))
             `progn
           (message "stante-after: cannot find %s" feature)
           'with-no-warnings)
        (with-eval-after-load ',feature ,@forms)))
  #+END_SRC

* Remember SQL input

  Remembering input between sessions is a good thing.

  #+BEGIN_SRC emacs-lisp
    (stante-after sql
      (setf sql-input-ring-file-name
            (expand-file-name "~/.emacs.d/sqliinput")))
  #+END_SRC

* Lazily load some buffers

  Don't load all buffers right away. Having a lot of buffers and
  switching between projects a lot can take up quite a bit of time.

  #+BEGIN_SRC emacs-lisp
    (setq desktop-restore-eager 5)
  #+END_SRC

* Footnotes

[fn:1] https://github.com/sabof/svg-mode-line-themes

[fn:2] http://stackoverflow.com/questions/22175214/automatically-switch-language-in-gnus-depending-on-recipient