various fixes, new keyboard
[dot-emacs] / my-init.org
1 #+TITLE: My Personal Init Customization
2 #+OPTIONS: toc:nil num:nil ^:nil
3 * copyright
4 # Copyright (C) 2017 Ian Kelling
5
6 # This program is free software: you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation, either version 3 of the License, or
9 # (at your option) any later version.
10
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
15
16 # You should have received a copy of the GNU General Public License
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
18
19 * things that should be at the beginning
20 #+begin_src emacs-lisp
21 ;; todo, evaluating this manually disables debug on error instead of toggling it
22 ;(toggle-debug-on-error) ;uncomment to help debug and catch errors
23
24
25 #+end_src
26
27
28 packages installed from package manager: i pretty much prioritize repos this way: gnu, then melpa, then marmalade.
29
30 package-activated-list:
31 ac-dabbrev ac-haskell-process ack-and-a-half alect-themes auctex bash-completion bbdb csv-mode cyberpunk-theme dot-mode expand-region f find-file-in-project flycheck foreign-regexp ggtags ghc gnuplot-mode goto-chg haskell-mode heroku-theme highlight-indentation highlight-symbol htmlize inf-ruby info+ inkpot-theme jedi auto-complete jedi-core epc ctable concurrent key-chord leuven-theme logstash-conf magit git-commit magit-popup misc-fns mouse+ naquadah-theme nginx-mode occidental-theme org paredit pcsv php-mode pkg-info epl popup py-autopep8 python-environment deferred python-info python-mode rainbow-mode rust-mode rw-hunspell s smartparens smex smooth-scroll sr-speedbar strings swiper ivy tabulated-list tangotango-theme thingatpt+ undo-tree vimrc-mode volatile-highlights web-mode with-editor dash async ws-butler yasnippet
32
33 alternate keyboards
34 #+begin_src emacs-lisp
35 ;; todo, figure out an easy way to disable this when using external keyboard
36 (if (display-graphic-p)
37 (setq
38 enter-key (kbd "<return>")
39 s-enter-key (kbd "<S-return>")
40 c-m-enter-key (kbd "<C-M-return>")
41 m-enter (kbd "<M-return>")
42 c-enter (kbd "<C-return>"))
43 (setq
44 enter-key (kbd "C-m")
45 s-enter-key (kbd "C-8")
46 c-m-enter-key (kbd "C-M-8")
47 m-enter (kbd "M-m")
48 c-enter (kbd "C-8")))
49
50 (setq tp (string= (system-name) "tp"))
51 (setq x200 (string= (system-name) "x2"))
52 (setq laptop-keyboard (or tp x200))
53 #+end_src
54
55 - Ubiquitous Packages which should be loaded on startup rather than
56 autoloaded on demand since they are likely to be used in every
57 session.
58 #+name: starter-kit-load-on-startup
59 #+begin_src emacs-lisp
60 (require 'saveplace)
61 (require 'ffap)
62 (require 'uniquify)
63 (require 'ansi-color)
64 (require 'recentf)
65
66 #+end_src
67
68
69 - Better to have a list of packages in here vs installed manually.
70 However, I install manually because sometimes there are two
71 versions and it is not necessarily easy to reconcile that.
72 #+begin_src emacs-lisp
73 ;; based on marmalage website front page.
74 (require 'package)
75
76 ;; little kit to help remove a down server
77 ;; (setq package-archives nil)
78
79 (add-to-list 'package-archives
80 '("marmalade" .
81 "http://marmalade-repo.org/packages/"))
82
83 (add-to-list 'package-archives
84 '("melpa" . "http://melpa.milkbox.net/packages/") t)
85 (add-to-list 'package-archives '("org" . "http://orgmode.org/elpa/") t)
86
87 ;; if this is a new machine/config, get package list
88 ;; not sure why we need it, but it is recommended in starter kit,
89 ;; and doesn't seem like a bad thing
90 (unless package-archive-contents (package-refresh-contents))
91
92 #+end_src
93
94
95 keep our init.el clean, by moving customization elisp to it's own file
96 #+name: m-x-customize-customizations
97 #+begin_src emacs-lisp
98 (setq custom-file "~/.emacs.d/custom.el")
99 (load custom-file 'noerror)
100 #+end_src
101
102 undo tree stuff
103 #+begin_src emacs-lisp
104 ;; more resilient undo-tree-history if we have their locations set up front.
105 (setq undo-tree-history-directory-alist '(("." . "~/.undo-tree-history")))
106 ;; Undo in region just happens accidentally, and throws me off, and it's been buggy in the past
107 (setq undo-tree-enable-undo-in-region nil)
108 #+end_src
109
110 * Stuff that I do not recommend that others use without reading,
111 understanding, and customizing themselves are
112
113 all mouse stuff disabled till i have time to figure it out again.
114 #+begin_src emacs-lisp :tangle no
115 (defun xterm-mouse-translate-1 (&optional extension)
116 (save-excursion
117 (let* ((event (xterm-mouse-event extension))
118 (ev-command (nth 0 event))
119 (ev-data (nth 1 event))
120 (ev-where (nth 1 ev-data))
121 (vec (vector event))
122 (is-down (string-match "down-" (symbol-name ev-command))))
123
124 (cond
125 ((null event) nil) ;Unknown/bogus byte sequence!
126 (is-down
127 (setf (terminal-parameter nil 'xterm-mouse-last-down) event)
128 vec)
129 (t
130 (let* ((down (terminal-parameter nil 'xterm-mouse-last-down))
131 (down-data (nth 1 down))
132 (down-where (nth 1 down-data)))
133 (setf (terminal-parameter nil 'xterm-mouse-last-down) nil)
134 (cond
135 ((null down)
136 ;; This is an "up-only" event. Pretend there was an up-event
137 ;; right before and keep the up-event for later.
138 (push event unread-command-events)
139 (vector (cons (intern (replace-regexp-in-string
140 "\\`\\([ACMHSs]-\\)*" "\\&down-"
141 (symbol-name ev-command) t))
142 (cdr event))))
143 ((equal ev-where down-where) vec)
144 (t
145 (let ((drag (if (symbolp ev-where)
146 0 ;FIXME: Why?!?
147 (list (intern (replace-regexp-in-string
148 "\\`\\([ACMHSs]-\\)*" "\\&drag-"
149 (symbol-name ev-command) t))
150 down-data ev-data))))
151 (if (null track-mouse)
152 (vector drag)
153 (push drag unread-command-events)
154 (vector (list 'mouse-movement ev-data))))))))))))
155
156 #+end_src
157 * how to find auto-saved files that need recovering
158 find a recently dated file in ~/.emacs.d/auto-save-list/, and see the files listed in it.
159 #file# is an auto-save file. It may or may not be different than the file is corresponds to.
160 If it is different, emacs will give a message about recovering it when you open it.
161
162
163 * TODO see if there are more cool functions in sh-script
164 like sh-cd-here, and bind that to a key
165 * TODO assign a key to append-next-kill
166 * TODO keybinds to remember
167
168 keys worth memorizing
169
170 c-2
171 c-m-3
172
173 s-return
174
175 in isearch, C-o
176 isearch-occur
177
178 org, C-c / t
179 make just todo items visible
180
181 C-mouse-1
182 buffer list menu
183
184 C-up/down
185 move up/down fast
186
187 M-right-scroll
188 forward/back sexp
189
190 C-M-right-scroll
191 scroll
192
193 C-S-scroll
194 change text size
195
196 how to control+left scroll on kinesis
197 right shift = control
198
199 C-left-scroll
200 forward/backward word
201
202 C-M-d
203 swap buffers across windows
204
205 shell-cd-to-file
206 M-2
207
208 * TODO add simpler keybind for make-frame-command
209 current one is C-x 5 2.
210
211 * TODO learn some more ivy mode stuff
212 * TODO declarative package installations,
213 with documentation.
214 * TODO shell mode reverse search hides 2nd+ line of multi-line result
215 * TODO figure out browsing files with broken nfs mount
216 causes emacs to freeze until I kill -9 it.
217 * TODO make a keybind to print var under cursor
218 and actually, putting the start of it in th emodeline might be cool
219 * TODO make recent files save periodically,
220 normally it just saves on exit, but half the time I don't exit cleanly
221 so they don't get saved, because I leave emacs running until it crashes
222 * TODO fix undo tree outside visible buffer bug
223 * TODO c-<delete> in shell mode should send over
224 previous line if current line is empty
225 * TODO make c-m-s be just a control key for easier use
226 * TODO try out avy mode for laptop
227 i used to have ace jump mode, but google says avy is better.
228 * TODO bind a in group mode of gnus to c-u a,
229 also, make a default for number of articles
230 * TODO make auto-complete be on by default in sql-mode
231 * TODO make an easy bind for open previous buffer
232 * TODO i think my autosave for sudo-edit might be too fast
233 it sometimes leaves #_asdfjasdf files littered
234 * TODO readline-compleste doesn't work when you cat a file without a newline,
235 and so the prompt is messed up. not sure exactly what needs to be in end, or if its anything
236 * TODO figure out how to paste a path into find file
237 probably have to use the old kind of find file
238 * TODO readline-complete doesn't escape special chars in filenames
239 * TODO readline-complete dev
240
241
242
243 ** misc fixes
244
245 bad code, the comment this relates to was removed, but not the comment
246 /* If waiting for this channel, arrange to return as
247 soon as no more input to be processed. No more
248 waiting. */
249
250
251 (status_notify): New arg WAIT_PROC. this is unused, this is a bug.
252 The change in status_notify's return is just passing more information
253 from what it did already. No changes at all inside this function.
254
255 * TODO consider whether to bind indent-for-tab-command
256 I removed it from m-tab for terminal compatibility.
257 It's the default tab command, which yasnippet replaces.
258 * TODO readline-complete: remove the hardcoded rlc-no-readline-hook
259 * TODO isearch doesn't automatically wrap in info
260 * TODO look into fixing shell mode reverse search
261 and why auto-complete dies
262 caveat is that it doesn't work well with certain unusual prompts, for example if $/# is not used at the end
263 see if we can load history, or reverse search with history commands
264 * TODO keybinds for s-delete/tab etc
265 * TODO fix bbdb info packaging in melpa
266 * TODO figure out why my emacs startup script doesn't work from dmenu
267 * TODO post idea to make customize group show function var names so we can read doc strings
268 * TODO report/fix bug that kill-whole-line doesn't work right with append kill
269 * TODO make bash keybind for copy paste interoperate with x windows
270 * TODO fix org stderr redirection
271 make this produce output of "ok"
272 #+begin_src sh
273 echo ok >&2
274
275 #+end_src
276 * TODO make ido keybinds better
277 * TODO fix indenting in org
278
279 (defun my-org-indent-region (start end)
280 "Indent region."
281 (interactive "r")
282 (save-excursion
283 (let ((line-end (org-current-line end)))
284 (goto-char start)
285 (while (< (org-current-line) line-end)
286 (cond ((org-in-src-block-p) (org-babel-do-in-edit-buffer (indent-according-to-mode)))
287 (t (call-interactively 'org-indent-line)))
288 (move-beginning-of-line 2)))))
289
290
291
292 org-indent-region is broken for source blocks
293 the above function works, but has several problems.
294 first: it should not have separate logic from org-indent-line
295 second: it runs way too slow, mainly the command
296 (org-babel-do-in-edit-buffer (indent-according-to-mode)))
297
298
299 * TODO figure out newline in prompt shell issue
300 setting this before readline-complete is loaded allows completion to work,
301 but auto-completion still fails. Need to debug readline-complete to figure this out.
302 (setq shell-prompt-pattern "^[^#$%>]*[#$]\n")
303 * TODO setup bind for find tag / lisp function at point
304
305 * TODO org-delete-char should also work for the delete/backspace keys!
306 fix and send patch
307
308 * TODO checkout projectile / graphene's project settings
309
310 * TODO check up on recent changes to 3rd party default configs
311 - last checked apr 24
312 https://github.com/eschulte/emacs24-starter-kit/commits/master
313
314 last checked mayish
315 https://github.com/bbatsov/prelude
316 - redefined mouse functions from this file
317
318 * TODO figure out how to setup emacs to format text nicely like thunderbird
319 * TODO it appears impossible make C-[ not be the same as escape
320 * TODO movement within info buffer after opening a link doesn't cancel isearch
321 leads to many frustrations
322 * TODO fix org resolve clock message. it is innacurate
323 i is not the same, becuase it does not make org realize there is an active clock
324
325 * TODO add apropos commands to help prefix, from
326 http://stackoverflow.com/questions/3124844/what-are-your-favorite-global-key-bindings-in-emacs
327 * TODO my autosave goes into an endless prompting loop
328 when running save buffer, and the buffer has been changed
329 outside of emacs
330 * TODO smart peren does not see ?\\) as a valid paren
331
332 * TODO why does org-end-of-line not go all the way to the end on a closed headline?
333 * TODO org makes random ... things, and delete right before them does ctrl-i
334 * TODO try mark word, which might be a useful keybind
335 * TODO fix org-cycle: it assumes which key it is bound to for its last alternative
336 * TODO checkout lisp-complete-symbol to augment auto-complete
337 * TODO emacs keylogger to optimize key binds
338 * TODO remap/investigate find tag, find tag at point
339 * TODO set key to cycle buffers by mode, example below
340
341 (defun cycle-buffer-by-mode (p-mode)
342 "Cycle buffers by mode name"
343 (interactive)
344 (dolist (buffer (buffer-list))
345 (with-current-buffer buffer
346 (when (buffer-live-p buffer)
347 (if (string-match p-mode mode-name) ;(regexp-quote p-mode)
348 (setq switch2buffer buffer)))))
349 (when (boundp 'switch2buffer)
350 (switch-to-buffer switch2buffer)))
351
352 And I have bound this to my F9 key
353
354 (global-set-key [f9] '(lambda () (interactive) (cycle-buffer-by-mode "Shell$")))
355
356 * TODO test out usefulness of forward/back sexp in different languages
357
358 * TODO major mode settings to check out in future
359 ** emacs24 starter kit
360 - Nxhtml -- utilities for web development
361 [[http://ourcomments.org/Emacs/nXhtml/doc/nxhtml.html][Nxhtml]] is a large package of utilities for web development and for
362 embedding multiple major modes in a single buffer.
363
364 Nxhtml is not installed in this version of the starter-kit by default,
365 for information on installing nxhtml see [[http://www.emacswiki.org/emacs/NxhtmlMode][EmacsWiki-Nxhtml]].
366
367 web-mode is competing package and actively developed, so i'm using that instead
368
369
370 (dolist (package '(yaml-mode js2-mode))
371 (unless (package-installed-p package)
372
373 - Associate modes with file extensions
374
375 (add-to-list 'auto-mode-alist '("COMMIT_EDITMSG$" . diff-mode))
376 (add-to-list 'auto-mode-alist '("\\.css$" . css-mode))
377 (require 'yaml-mode)
378 (add-to-list 'auto-mode-alist '("\\.ya?ml$" . yaml-mode))
379 (add-to-list 'auto-mode-alist '("\\.rb$" . ruby-mode))
380 (add-to-list 'auto-mode-alist '("Rakefile$" . ruby-mode))
381 (add-to-list 'auto-mode-alist '("\\.js\\(on\\)?$" . js2-mode))
382 ;; (add-to-list 'auto-mode-alist '("\\.xml$" . nxml-mode))
383
384 - clojure in starter-kit-lisp.org
385
386 - others = gnus, js, publish, perl, python, perl, ruby
387 they each have their own starter kit file.
388
389 - snippets for various modes other than org-mode
390
391 * TODO update yasnippet documentation
392 yas expand key customization is rediculously hard to figure out
393 and completely undocumented
394 * TODO fix org source indenting, send patch
395 * TODO check out bundling aka compiling yasnippet
396 * TODO try xml/html mode url func
397
398 (defun view-url ()
399 "Open a new buffer containing the contents of URL."
400 (interactive)
401 (let* ((default (thing-at-point-url-at-point))
402 (url (read-from-minibfer "URL: " default)))
403 (switch-to-buffer (url-retrieve-synchronously url))
404 (rename-buffer url t)
405 ;; TODO: switch to nxml/nxhtml mode
406 (cond ((search-forward "<?xml" nil t) (xml-mode))
407 ((search-forward "<html" nil t) (html-mode)))))
408
409 * TODO flyspell-buffer automatically
410
411 * TODO respond to ediff thread
412 * TODO fix horizontal mouse resizing
413 resizing a window horizontally with the mouse should be allowed in more places
414
415 * TODO try using / making abbreviations
416
417 * abbreviations
418 #+begin_src emacs-lisp
419
420 ;; turn on abbrev mode globally
421 (setq-default abbrev-mode t)
422
423 #+end_src
424 default abbreviation mode file is .emacs.d/abbrev_defs.
425 add-global-abbrev, add-mode-abbrev for expansion at point
426 if all else fails, edit the abbrev file
427
428 * auto-complete
429
430 #+begin_src emacs-lisp
431 ;; auto-completion in minibuffer
432 ;; disabled while I look for another alternative
433 ;;(icomplete-mode)
434
435 (require 'auto-complete-config)
436 (ac-config-default)
437
438
439 ;; complete after 1 char instead of default 2
440 (setq ac-auto-start 1)
441 (setq ac-delay 0.001)
442
443 (add-to-list 'ac-modes 'org-mode 'sql-mode)
444
445 (defun ac-common-setup ()
446 (add-to-list 'ac-sources 'ac-source-yasnippet))
447
448 ;; for org mode completion source taken from wiki.
449 ;; it did not work. no idea why. todo, investigate
450 ;; the ac-sources code is at http://www.emacswiki.org/emacs/AutoCompleteSources
451 ;; i've deleted it here so as to save space and not spam this file
452 ;;(defun my-ac-org-mode ()
453 ;; (setq ac-sources (append ac-sources '(ac-source-org))))
454
455
456 ;; this makes the org-self-insert command not do a flyspell spell check.
457 ;; low priority thing to look into sometime
458 (ac-flyspell-workaround)
459
460
461 (define-key ac-completing-map (kbd "<up>") nil)
462 (define-key ac-completing-map (kbd "<down>") nil)
463 (define-key ac-completing-map (kbd "<S-return>") 'ac-expand)
464 (define-key ac-completing-map "\t" 'ac-complete)
465 (define-key ac-completing-map (kbd "<tab>") 'ac-complete)
466
467
468
469 #+end_src
470 * auto-complete readline-complete
471 #+begin_src emacs-lisp
472
473 (add-to-list 'load-path "~/.emacs.d/src/readline-complete")
474 (require 'readline-complete)
475 ;; not sure how I made these, but I deleted, and
476 ;; it would be nice to make them again sometime
477 ;;(require 'src-loaddefs)
478
479 ;; disabled cuz broken
480 ;; redefining function in readline-complete so ac-complete only uses readline as a source
481 (defun ac-rlc-setup-sources ()
482 "Add me to shell-mode-hook!"
483 (setq ac-sources '(ac-source-shell)))
484 (add-hook 'shell-mode-hook 'ac-rlc-setup-sources)
485
486 ;; generally unnecessary, but why not
487 (setq explicit-shell-file-name "bash")
488
489 ;; readline-complete says to add this line.
490 ;; however, it up my procfs directory tracking hook
491 ;; because get-process doesn't notice the child shell.
492 ;; instead, I've removed export EMACS=t from
493 ;; comint-exec-1 (the function which initially sets it)
494 ;; by finding it in emacs sources and redefinind it here
495 ;; and done stty echo in my bashrc
496 ;;(setq explicit-bash-args '("-c" "export EMACS=; stty echo; bash"))
497
498 (setenv "EMACS" "")
499 (setq explicit-bash-args nil)
500 (setq comint-process-echoes t)
501 ;; default of 30 is way too slow. todo, consider pushing this upstream
502 (setq rlc-attempts 5)
503
504 (add-to-list 'ac-modes 'shell-mode)
505
506 ;; readline-complete recommends this (i assume this format),
507 ;; but greping finds no reference in emacs or my .emacs.d
508 ;; so I'm assuming it is for an older emacs
509 ;;(setq explicit-ssh-args '("-t"))
510
511 (add-hook 'shell-mode-hook
512 (lambda ()
513 (define-key shell-mode-map (kbd "<tab>") 'auto-complete)))
514
515
516 #+end_src
517 #+RESULTS:
518 : comint-exec-1
519
520 ** readline complete fix
521
522 I need this function here, where INSIDE_EMACS is replaced with RLC_INSIDE_EMACS.
523 #+begin_src emacs-lisp
524 ;; ian: last update 2017-1-7. update this periodically from upstream
525 ;; like when we do a major emacs update
526 (defun comint-exec-1 (name buffer command switches)
527 (let ((process-environment
528 (nconc
529 ;; If using termcap, we specify `emacs' as the terminal type
530 ;; because that lets us specify a width.
531 ;; If using terminfo, we specify `dumb' because that is
532 ;; a defined terminal type. `emacs' is not a defined terminal type
533 ;; and there is no way for us to define it here.
534 ;; Some programs that use terminfo get very confused
535 ;; if TERM is not a valid terminal type.
536 ;; ;; There is similar code in compile.el.
537 (if (and (boundp 'system-uses-terminfo) system-uses-terminfo)
538 (list "TERM=dumb" "TERMCAP="
539 (format "COLUMNS=%d" (window-width)))
540 (list "TERM=emacs"
541 (format "TERMCAP=emacs:co#%d:tc=unknown:" (window-width))))
542 (list (format "RLC_INSIDE_EMACS=%s,comint" emacs-version))
543 process-environment))
544 (default-directory
545 (if (file-accessible-directory-p default-directory)
546 default-directory
547 "/"))
548 proc decoding encoding changed)
549 (let ((exec-path (if (and command (file-name-directory command))
550 ;; If the command has slashes, make sure we
551 ;; first look relative to the current directory.
552 (cons default-directory exec-path) exec-path)))
553 (setq proc (apply 'start-file-process name buffer command switches)))
554 ;; Some file name handler cannot start a process, fe ange-ftp.
555 (unless (processp proc) (error "No process started"))
556 (let ((coding-systems (process-coding-system proc)))
557 (setq decoding (car coding-systems)
558 encoding (cdr coding-systems)))
559 ;; Even if start-file-process left the coding system for encoding data
560 ;; sent from the process undecided, we had better use the same one
561 ;; as what we use for decoding. But, we should suppress EOL
562 ;; conversion.
563 (if (and decoding (not encoding))
564 (setq encoding (coding-system-change-eol-conversion decoding 'unix)
565 changed t))
566 (if changed
567 (set-process-coding-system proc decoding encoding))
568 proc))
569
570 #+end_src
571
572 * auto save & backup
573 #+begin_src emacs-lisp
574 (setq auto-save-timeout 1) ; idle time before auto-save.
575
576 ;; main hook for my auto save
577 (add-hook 'auto-save-hook 'my-auto-save)
578 ;; additional hook to try to deal with emacs not auto-saving when a buffer isn't active
579 (add-hook 'window-configuration-change-hook 'my-auto-save-win)
580
581 ;; this function from mu4e really does not like buffer saving
582 (advice-add 'message-send-and-exit :before 'my-as-off)
583 (advice-add 'message-send-and-exit :after 'my-as-on)
584
585 ;; avoid window config hook saving too much, it can
586 ;; get into loops in some random situations
587 (setq my-auto-save-last nil)
588 (defun my-auto-save-win ()
589 (unless (eq (current-buffer) my-auto-save-last)
590 (my-auto-save (current-buffer))))
591
592 (defun my-auto-save (&optional last)
593 (when (and
594 my-as
595 (buffer-file-name)
596 ;; mu4e has a bug right now, undo breaks when saving drafts
597 (not (string= (buffer-file-name) "*draft*"))
598 (buffer-modified-p)
599 (not (org-src-edit-buffer-p)))
600 ;; serial is incremented on each save, so let's do a bit less of them
601 (not (derived-mode-p 'dns-mode))
602 (setq my-auto-save-last last)
603 (let (message-log-max)
604 ;; a bit of a hack to partially suppress the constant saving in the echo area
605 (with-temp-message ""
606 (basic-save-buffer)))))
607
608 (defun my-as-off ()
609 (interactive)
610 (setq my-as nil))
611
612 (defun my-as-off-local ()
613 (interactive)
614 (setq-local my-as nil))
615
616 (defun my-as-on ()
617 (interactive)
618 (setq my-as t))
619
620 (defun my-as-on-local ()
621 (interactive)
622 (setq-local my-as on))
623
624 ;; based on suggestion in the emacs docs, redefine these 2 functions
625 ;; to avoid prompt spamming the user when we do auto-save
626 (defun ask-user-about-supersession-threat (fn)
627 (discard-input)
628 (message
629 "File for %s has changed on disk outside of emacs. Auto-save is overwriting it, however
630 a backup is being created in case that is not what you intended." buffer-file-name)
631 (setq buffer-backed-up nil))
632
633 (defadvice ask-user-about-lock (before lock-deactivate-as activate)
634 (make-local-variable 'my-as)
635 (setq my-as nil)
636 (message "proper autosave has been turned off for this buffer because of lock file problem.
637 In this buffer, do M-x my-as-on to reenable"))
638
639 ;; todo, this doesn't work consistently to override the auto-save message
640 (defalias 'do-auto-save-original (symbol-function 'do-auto-save))
641 (defun do-auto-save (&optional no-message current-only)
642 "This function has been modified to wrap the original so that NO-MESSAGE
643 is always set to t, since we auto-save a lot, it spams otherwise.
644 The original doc string is as follows:
645
646 Auto-save all buffers that need it.
647 This is all buffers that have auto-saving enabled
648 and are changed since last auto-saved.
649 Auto-saving writes the buffer into a file
650 so that your editing is not lost if the system crashes.
651 This file is not the file you visited; that changes only when you save.
652 Normally we run the normal hook `auto-save-hook' before saving.
653
654
655 A non-nil NO-MESSAGE argument means do not print any message if successful.
656 A non-nil CURRENT-ONLY argument means save only current buffer."
657 (interactive)
658 (do-auto-save-original t current-only))
659
660 ;; enable MY auto-save
661 (my-as-on)
662
663 #+end_src
664
665
666 backups, separate from auto-save
667
668 #+begin_src emacs-lisp
669
670 ;; set backup file location
671 (setq backup-directory-alist '(("." . "~/.editor-backups")))
672 (setq auto-save-file-name-transforms
673 '((".*" "~/.editor-backups/" t)))
674
675 (setq version-control t ;; Use version numbers for backups
676 kept-new-versions 100
677 kept-old-versions 2
678 delete-old-versions t ;; delete old versions silently
679 ;; assume hard linked files are done on purpose, don't screw them up
680 backup-by-copying-when-linked t)
681
682 ;; todo, the time needs to be an integer, not a vector type thing
683 (defun constant-backup ()
684 "Backup conditioned on some time passing since last one.
685 Hooked into 'before-save-hook."
686 (cl-flet ((b-time (minutes)
687 (< last-backup-time
688 (- (current-time) (* 60 minutes)))))
689 (when (or (not (boundp 'last-backup-time)) (and (< (buffer-size) 10000000) (b-time 5)) (b-time 30))
690 (setq buffer-backed-up nil)
691 (setq-local last-backup-time (current-time)))))
692
693 ;; make a backup on auto-save, because the backup feature is not
694 ;; utilized with my-auto-save, only normal interactive save.
695 ;; todo, enable when fixed
696 ;;(add-hook 'before-save-hook 'constant-backup)
697
698 (add-hook 'auto-save-hook 'auto-save-size-limit)
699
700 (defun auto-save-size-limit ()
701 (when (and (not backup-inhibited) (> (buffer-size) 2000000))
702 (message "Backups disabled for this buffer due to size > 2 megs")
703 (make-local-variable 'backup-inhibited)
704 (setq backup-inhibited t)))
705
706 #+end_src
707
708
709
710 background:
711 the faq suggests to auto-save using
712 (setq auto-save-visited-file-name t)
713 and to toggle auto-saving in the current buffer, type `M-x auto-save-mode'
714
715 however, this is buggy.
716 it leaves around lock files, which can be disabled with
717 (setq create-lockfiles nil)
718 but it is also buggy on other things that appear to hook onto file saving
719 so i created my own function, which originally had bugs,
720 but new emacs version fixed all that, yay!.
721
722
723 ; not using, but here for documentation,
724 ; alternate way to enable and specify how long between autosaves.
725 ; number of input events between autosave.
726 ; lowest bound of functionality is actually about 15 input events
727 ;(setq auto-save-interval
728 ** todo keep an eye out for why/when and fix the fact that normal auto-save files are being made soemtimes
729 they are #filename#
730 seems they are created
731
732 * bbdb
733 #+begin_src emacs-lisp
734 ;; based on bbdb manual
735 ;; also has instructions to initialize upon launching gnus, etc
736 ;; but I figure try this to make sure everything works all the time first
737 (require 'bbdb)
738 (bbdb-initialize 'message)
739
740 ;; recommended by gnus,
741 ;; but seems like it could be good to have set for other stuff
742 (setq user-full-name "Ian Kelling")
743 ;; general email setting? recommended by mu4e
744 (setq message-kill-buffer-on-exit t)
745
746
747 ;; based on emacs24-starter-kit
748 (setq bbdb-offer-save 'auto
749 bbdb-notice-auto-save-file t
750 bbdb-expand-mail-aliases t
751 bbdb-canonicalize-redundant-nets-p t
752 bbdb-complete-name-allow-cycling t)
753
754 ;; use d instead
755 (add-hook 'bbdb-mode-hook
756 (lambda () (define-key bbdb-mode-map (kbd "C-k") nil)))
757
758 (add-to-list 'load-path "~/.emacs.d/src/bbdb-csv-import")
759 (require 'bbdb-csv-import)
760
761 #+end_src
762
763 * bookmark settings
764 #+begin_src emacs-lisp
765 ; save bookmarks whenever they are changed instead of just when emacs quits
766 (setq bookmark-save-flag 1)
767 ; increase bookmark context size for better functionality
768 (setq bookmark-search-size 2000)
769 #+end_src
770 * c-like settings
771 #+begin_src emacs-lisp
772 ;; change last thing from gnu.
773 ;; notably this avoids brace indent after if, and 4 space indent
774 (setq c-default-style '((java-mode . "java")
775 (awk-mode . "awk")
776 (other . "stroustrup")))
777 ;; for emacs itself, use
778 ;; (setq c-default-style '((java-mode . "java")
779 ;; (awk-mode . "awk")
780 ;; (other . "gnu")))
781 ;; (setq-default c-basic-offset 2)
782 #+end_src
783 * color theme
784
785 A Theme builder is available at http://elpa.gnu.org/themes/ along with
786 a list of pre-built themes at http://elpa.gnu.org/themes/view.html and
787 themes are available through ELPA.
788
789
790 interesting light themes
791
792
793 #+begin_src emacs-lisp
794 (defun override-theme (arg)
795 (interactive)
796 (while custom-enabled-themes
797 (disable-theme (car custom-enabled-themes)))
798 (load-theme arg t))
799 (setq color-theme-is-global t)
800
801 (defun toggle-night ()
802 (interactive)
803 (cond ((equal (car custom-enabled-themes) 'naquadah)
804 ;; background off white to be better on the eyes. took this
805 ;; color from gitweb.
806 (custom-set-faces `(default ((t (:background "#F6F6F0")))))
807 (override-theme 'leuven))
808 (t
809 ;; revert previous background change
810 (custom-set-faces `(default ((t (:background nil)))))
811 (override-theme 'naquadah))))
812
813 (custom-set-faces `(default ((t (:background "#F6F6F0")))))
814 (override-theme 'leuven) ;; org mode features, with monitor darkened. part of org-mode i think
815
816
817 ;; disable color thing with this:
818 ;;(disable-theme (car custom-enabled-themes))
819
820 ;; decent dark themes
821
822 ;;(override-theme 'tangotango)
823 ;;(override-theme 'deeper-blue)
824 ;;(override-theme 'tango-dark)
825 ;;(override-theme 'tsdh-dark)
826
827 ;;(override-theme 'heroku)
828 ;;(override-theme 'inkpot) ;; part of inkpot-theme package
829 ;;(override-theme 'naquadah) ; org mode features, part of naquadah-theme package
830 ;;(override-theme 'spolsky) ;; part of sublime-themes package
831 ;;(override-theme 'twilight-anti-bright) ;; from twilight-anti-bright-theme package
832
833 ;; interesting but not usable colors
834 ;;(override-theme 'cyberpunk) ; cool org mode features, from cyberpunk-theme package
835 ;;(override-theme 'wombat) ; cursor not visible enough. from a wombat package, not sure which
836 ;;(override-theme 'misterioso) ; cursor not visible enough
837
838
839
840 ;;decent light themes
841 ;;(override-theme 'alect-light) ; theres a -alt version, don't see a dif. could use this without dimming. from alect-something package
842 ;;(override-theme 'occidental) ; from occidental-theme package
843
844
845 ;;color-theme is deprecated in emacs 24.
846
847 ;; theme packages i tried then removed:
848 ;; ignored ones that didn't use the new theme engine
849
850 ;;66 packages (zenburn-theme-2.1, zen-and-art-theme-1.0.1, waher-theme-20130917.7, ujelly-theme-1.0.35, twilight-theme-1.0.0, twilight-bright-theme-20130605.143, twilight-anti-bright-theme-20120713.316, tronesque-theme-1.3, tron-theme-12, toxi-theme-0.1.0, tommyh-theme-1.2, tango-2-theme-1.0.0, sunny-day-theme-20131203.1250, sublime-themes-20140117.323, subatomic-theme-20131011.1048, soothe-theme-0.3.16, soft-morning-theme-20131211.1342, soft-charcoal-theme-20130924.1206, sea-before-storm-theme-0.3, purple-haze-theme-20130929.1751, phoenix-dark-pink-theme-20130905.941, phoenix-dark-mono-theme-20130306.1215, pastels-on-dark-theme-0.3, obsidian-theme-20130920.937, nzenburn-theme-20130513, noctilux-theme-20131019.31, mustang-theme-20130920.939, monokai-theme-0.0.10, molokai-theme-20130828.0, late-night-theme-0.0, jujube-theme-0.1, ir-black-theme-20130302.2355, gruvbox-theme-20131229.1458, gruber-darker-theme-0.6, grandshell-theme-20140118.1003, github-theme-0.0.3, gandalf-theme-0.1, flatland-theme-20131204.858, django-theme-20131022.202, deep-thought-theme-0.1.1, dakrone-theme-20131212.1159, colorsarenice-theme-20131128.1106, color-theme-wombat+-0.0.2, color-theme-wombat-0.0.1, color-theme-twilight-0.1, color-theme-tango-0.0.2, color-theme-solarized-20120301, color-theme-sanityinc-solarized-2.25, color-theme-railscasts-0.0.2, color-theme-monokai-0.0.5, color-theme-molokai-0.1, color-theme-ir-black-1.0.1, color-theme-heroku-1.0.0, color-theme-github-0.0.3, color-theme-eclipse-0.0.2, color-theme-dpaste-0.0.1, color-theme-dawn-night-1.0, color-theme-colorful-obsolescence-0.0.1, color-theme-cobalt-0.0.2, color-theme-20080305.34, clues-theme-20130908.801, busybee-theme-20130920.942, bubbleberry-theme-0.1.2, mblage-theme-20130715.621, anti-zenburn-theme-20140104.1542, ample-zen-theme-0.2)
851
852
853
854 #+end_src
855
856 * yasnippet
857 cd ~/.emacs.d/src
858 git clone --recursive https://github.com/capitaomorte/yasnippet
859 touch snippets/.yas-make-groups
860
861 This all makes it so I can look through the default snippets
862 in the menu bar, but they don't show up elsewhere, because they are
863 mostly things I don't want.
864
865 #+begin_src emacs-lisp
866
867 (require 'yasnippet)
868 ;; this needs to be before yas-global-mode
869 (setq yas-snippet-dirs (list "~/.emacs.d/snippets"))
870 (yas-global-mode 1)
871
872 (setq
873 yas-also-auto-indent-first-line t
874 yas-choose-tables-first t
875 yas-use-menu (quote full)
876 ;; this sets ido-prompt as first function
877 yas-prompt-functions
878 '(yas-ido-prompt yas-dropdown-prompt yas-x-prompt yas-completing-prompt yas-no-prompt))
879
880 ;; todo, explore this option for wrapping region
881 ;; '(yas/wrap-around-region t))
882
883 #+end_src
884
885 #+RESULTS:
886 | yas-ido-prompt | yas-dropdown-prompt | yas-x-prompt | yas-completing-prompt | yas-no-prompt |
887
888 * cross session settings
889 #+begin_src emacs-lisp
890
891 ;; Save a list of recent files visited.
892 (recentf-mode 1)
893 (setq recentf-max-saved-items 200
894 recentf-max-menu-items 15)
895
896
897 (setq save-place t
898 save-place-version-control 'nospecial
899 save-place-limit 40000
900 save-place-file "~/.emacs.d/places")
901
902
903
904 ;; savehist keeps track of some history
905 ;; search entries
906 (setq savehist-additional-variables '(kill-ring search-ring regexp-search-ring)
907 ;; save every minute
908 savehist-autosave-interval 60
909 ;; keep the home clean
910 savehist-file "~/.emacs.d/.savehist")
911 (savehist-mode 1)
912
913 #+end_src
914
915 * ediff
916 #+begin_src emacs-lisp
917 ;; ediff-buffers is the main command to use
918
919 ;; ediff - don't start another frame for the control panel
920 ;; unfortunately, this doesn't allow me to use 2 frames for the diff buffers
921 ;; so disable this temporarily with the next line if you want that
922 ;; sometime I should setup 2 functions to explicitly do each type
923 (setq ediff-window-setup-function 'ediff-setup-windows-plain)
924 ;;(setq ediff-window-setup-function 'ediff-setup-windows-default)
925
926 ;; do side by side diffs
927 (setq ediff-split-window-function 'split-window-horizontally)
928
929
930 #+end_src
931
932
933
934 Things I tried which didn't work, which intuitively I think should work better: I can open the second diff buffer in a new frame, and close it's window in the first frame after starting ediff, but when I hit n to go to the next diff, it restores the window in the first frame. Another thing I tried is to open 2 new frames and set them up as I want. However, if I try to open the *Ediff Control Panel* buffer in a different window from its original one, my mouse jumps to one of the diff frames, or if that isn't visible, the buffer just hangs until I select the original ediff control panel window. This seems like a bug to me. I am using a very recent development version of emacs.
935
936 * dired
937 #+begin_src emacs-lisp
938
939 ;; dired - reuse current buffer by pressing 'a'
940 (put 'dired-find-alternate-file 'disabled nil)
941 #+end_src
942
943 * mu4e
944 [[info:org#External links]]
945 [[info:mu4e#Keybindings]]
946
947 alsot tried notmuch, it had some glitches, and it's config
948 has a list of folders which i'd rather not publish, so it's config is archived.
949
950 #+begin_src emacs-lisp
951 ;;(add-to-list 'load-path "/usr/local/share/emacs/site-lisp/mu4e")
952 (require 'mu4e)
953
954 ;; (setq mu4e-headers-results-limit 2000)
955
956 (setq send-mail-function (quote sendmail-send-it) ;; common to gnus also
957 ;; use the standard imap folders
958 mu4e-sent-folder "/Sent"
959 mu4e-drafts-folder "/Drafts"
960 mu4e-trash-folder "/Trash"
961 ;; reindex new mail this often in seconds
962 ;; show addresses instead of just names
963 mu4e-view-show-addresses t
964 mu4e-use-fancy-chars t
965 mu4e-confirm-quit nil
966 mu4e-headers-leave-behavior 'apply ;; dont ask, do whatever was marked
967 mu4e-headers-fields (delq (assoc :mailing-list mu4e-headers-fields) mu4e-headers-fields)
968 ;; default 500.
969 mu4e-headers-results-limit 1000
970
971 ;; looking up the list of maildirs when doing jo from summary
972 ;; can take a few seconds if we have a ton of messages.
973 ;; Only take that time for the first lookup.
974 ;; if we add a new maildir, just restart mu4e for it to be in that list.
975 mu4e-cache-maildir-list t
976 ;; default is 8, way too small for my big monitors
977 mu4e-headers-visible-lines 50
978 )
979
980 ;; fucks up reading unread bookmark. when that is fixed, enable it
981 ;; (setq mu4e-update-interval 60)
982
983
984 ;; this file includes setting up my email addresses, which are not public,
985 ;; including
986 ;; mu4e-user-mail-address-list
987 ;; and a function
988 ;; inspired by mu4e info manual, search for mu4e-compose-pre-hook.
989 (load "/p/c/mu4e.el")
990
991 (defun my-decrypt ()
992 ;; use for decrypting in mu4e
993 (interactive)
994 (beginning-of-buffer)
995 (when (search-forward "-----BEGIN PGP MESSAGE-----" nil t)
996 (read-only-mode 0)
997 (let ((start (match-beginning 0))
998 (end (search-forward "-----END PGP MESSAGE-----" nil t)))
999 (shell-command-on-region start end "gpg -dq" nil t shell-command-default-error-buffer t)
1000 )))
1001 (add-hook 'mu4e-view-mode-hook 'my-decrypt)
1002
1003 (defun mu-set-from-name (regexes)
1004 "If we find an address matching regex, then set that address as the to,
1005 and whatever was used"
1006 (when mu4e-compose-parent-message
1007 (let ((found nil))
1008 (while (and regexes (not found))
1009 (setq re (car regexes)
1010 regexes (cdr regexes)
1011 found (mu4e-message-contact-field-matches
1012 mu4e-compose-parent-message :to re)))
1013 (when found (setq user-mail-address (cdr found)
1014 user-full-name (car found)))
1015 found)))
1016 (defun mu-set-from (regexes)
1017 "If we find an address matching regex, then set that address as the to,
1018 and Ian Kelling as the name"
1019 (when mu4e-compose-parent-message
1020 (let ((found nil))
1021 (while (and regexes (not found))
1022 (setq re (car regexes)
1023 regexes (cdr regexes)
1024 found (cdr (mu4e-message-contact-field-matches
1025 mu4e-compose-parent-message :to re))))
1026 (when found (setq user-mail-address found
1027 user-full-name "Ian Kelling"))
1028 found)))
1029
1030
1031 (defun my-mu4e-to-fsf ()
1032 "inspired by mu4e info manual, search for mu4e-compose-pre-hook."
1033 (cond
1034 ((mu-set-from '("iank@fsf.org"
1035 "iank@gnu.org")))
1036 ((setq user-mail-address "iank@fsf.org"
1037 user-full-name "Ian Kelling"))))
1038
1039
1040 ;; on first run mkdir -p /nocow/user/.mufsf; mu index --maildir=/nocow/user/fsfmd
1041 (defun mu-exit-wait ()
1042 (interactive)
1043 (let ((wait (= 0 (call-process "/bin/pidof" nil nil nil "mu"))))
1044 (mu4e-quit)
1045 ;; without sleep, we get database locked by another process error when hitting u
1046 ;; if another mu was running.
1047 (when wait (sleep-for 0 300))))
1048 (defun fsf-mu4e ()
1049 (interactive)
1050 (unless (equal mu4e-maildir "/nocow/user/fsfmd") (mu-exit-wait))
1051 (setq
1052 ;; fsf monitor is smaller
1053 mu4e-headers-visible-lines 15
1054 mu4e-maildir "/nocow/user/fsfmd"
1055 mu4e-refile-folder "/Spam"
1056 mu4e-get-mail-command "/a/bin/distro-setup/fsf-get-mail"
1057 user-mail-address "iank@fsf.org"
1058 mail-signature "
1059
1060 --
1061 Ian Kelling | Senior Systems Administrator, Free Software Foundation
1062 GPG Key: B125 F60B 7B28 7FF6 A2B7 DF8F 170A F0E2 9542 95DF
1063 https://fsf.org | https://gnu.org
1064 "
1065
1066 mu4e-user-mail-address-list '("iank@fsf.org"
1067 "iank@gnu.org")
1068 mu4e-maildir-shortcuts
1069 '( ("/INBOX" . ?i)
1070 ("/sysadmin" . ?a)
1071 ("/sec" . ?x)
1072 ("/rtcc" . ?c)
1073 ("/Drafts" . ?d)
1074 ("/Sent" . ?s)
1075 )
1076 ) ;; end setq
1077 (call-process "/a/exe/lnf" nil nil nil "-T" "/nocow/user/.mufsf" (concat (getenv "HOME") "/.mu"))
1078 (add-hook 'mu4e-compose-pre-hook 'my-mu4e-to-fsf)
1079 (remove-hook 'mu4e-compose-pre-hook 'my-mu4e-to)
1080 (mu4e)) ;; end defun fsf-mu4e
1081
1082
1083 ;; it's implemented in mu4e, but not in the actions list for
1084 ;; some reason.
1085 (add-to-list 'mu4e-view-actions
1086 '("browser view" . mu4e-action-view-in-browser) t)
1087
1088 ;; normally, you would add to this, but we want to
1089 ;; modify unread messages. the first 4 are defined by default.
1090 (setq mu4e-bookmarks
1091 `( ,(make-mu4e-bookmark
1092 :name "Unread messages"
1093 :query "flag:unread AND NOT flag:trashed AND NOT maildir:/Junk AND NOT maildir:/fwfw AND NOT maildir:/log"
1094 :key ?u)
1095 ,(make-mu4e-bookmark
1096 :name "Today's messages"
1097 :query "date:today..now"
1098 :key ?t)
1099 ,(make-mu4e-bookmark
1100 :name "Last 7 days"
1101 :query "date:7d..now"
1102 :key ?w)
1103 ,(make-mu4e-bookmark
1104 :name "Messages with images"
1105 :query "mime:image/*"
1106 :key ?p))
1107 )
1108
1109
1110 (defun mu4e-action-msgs-by-this-sender (msg)
1111 "In header view, view messages by the sender of the message under point."
1112 (let ((from (mu4e-message-field msg :from)))
1113 (unless from
1114 (mu4e-error "No from header for this message"))
1115 ;; from is structured like: (("Anacron" . "root@x2.lan"))
1116 (mu4e-headers-search (concat "f:" (cdar from)))))
1117
1118 (add-to-list 'mu4e-headers-actions
1119 '("from this sender" . mu4e-action-msgs-by-this-sender) t)
1120 (add-to-list 'mu4e-view-actions
1121 '("from this sender" . mu4e-action-msgs-by-this-sender) t)
1122 #+end_src
1123
1124
1125
1126 * disabled but saved for documentation purposes
1127 :PROPERTIES:
1128 :header-args: :tangle no
1129 :END:
1130
1131 ** ido keybinds
1132 *** C-j
1133 ido-find-file create file
1134 *** //]
1135 ido goto root
1136 *** C-k]
1137 ido kill buffer/file
1138 *** C-d]
1139 ido open dired buffer
1140 *** M-d]
1141 ido search within all subdirectories
1142 *** M-m]
1143 ido create subdirectory
1144 *** M-s]
1145 ido search recently used directories
1146 *** M-n/p]
1147 ido next/previous recently used directory
1148 *** C-s]
1149 **** TODO implement this keybind, normally ctrl-space
1150 ido use current pattern and start a new one
1151
1152
1153 ** indent settings for git's perl code
1154 don't have a way to set this automatically or a good place to put this
1155 #+begin_src emacs-lisp
1156 (setq
1157 perl-indent-level 8
1158 perl-continued-statement-offset 8
1159 perl-continued-brace-offset -8
1160 perl-brace-offset 0
1161 perl-brace-imaginary-offset 0
1162 indent-tabs-mode t
1163 )
1164 #+end_src
1165 ** org mode website
1166
1167 #+begin_src emacs-lisp
1168 ;; use org-publish-current-project with a project file open
1169 (setq org-publish-project-alist
1170 '(("org"
1171 :base-directory "/a/h/src"
1172 :publishing-directory "/a/h/output"
1173 :base-extension "org"
1174 ;;:publishing-function org-org-publish-to-org
1175 :publishing-function org-html-publish-to-html
1176 :preserve-breaks t
1177 :html-postamble "Everything here is <a rel=\"license\"
1178 href=\"http://creativecommons.org/licenses/by-sa/4.0/\"><img
1179 alt=\"Creative Commons License\" style=\"border-width:0\"
1180 src=\"http://i.creativecommons.org/l/by-sa/4.0/80x15.png\" /></a>"
1181 :html-head "<link rel=\"stylesheet\"
1182 href=\"style.css\"
1183 type=\"text/css\"/>"
1184 :htmlized-source t)
1185 ("othersrc"
1186 :base-directory "/a/h/src"
1187 :base-extension "css\\|el\\|"
1188 :publishing-directory "/a/h/output"
1189 :publishing-function org-publish-attachment)
1190 ("other"
1191 :base-directory "/a/h/other"
1192 :base-extension ".*"
1193 :publishing-directory "/a/h/output"
1194 :publishing-function org-publish-attachment)))
1195 ;; default is xhtml-strict. don't really care, but this is more common
1196 (setq org-html-doctype "html4-strict")
1197
1198 ;; this is needed for worg
1199 ;; todo: for my own site, I need to define the css in a separate file
1200 ;; in order to use this setting. see the variable help for info
1201 (setq org-export-htmlize-output-type t)
1202
1203
1204 #+end_src
1205
1206 ** bash-completion
1207 #+begin_src emacs-lisp
1208 ;; this eventually gets set in
1209 ;; comint-dynamic-complete-functions
1210 ;; (car comint-dynamic-complete-functions)
1211 (autoload 'bash-completion-dynamic-complete "bash-completion"
1212 "BASH completion hook")
1213 (add-hook 'shell-dynamic-complete-functions
1214 'bash-completion-dynamic-complete)
1215
1216 ;; this appears useless, but was in the recommended init code
1217 (add-hook 'shell-command-complete-functions
1218 'bash-completion-dynamic-complete)
1219
1220 (defun ac-rlc-setup-sources ()
1221 "Add me to shell-mode-hook!"
1222 (setq ac-sources '(ac-source-shell)))
1223 (add-hook 'shell-mode-hook 'ac-rlc-setup-sources)
1224
1225 #+end_src
1226
1227 ** misc stuff
1228 It is an awesome mode for keyboard navigation.
1229 However, using the mouse takes less thought and works as well
1230
1231 #+begin_src emacs-lisp
1232
1233
1234 ;; whitespace-mode config. minimal for bad whitespace
1235 ;(setq whitespace-line-column 80) ; for style of lines-tail, but I have it disabled
1236 (setq whitespace-style '(face tabs empty trailing))
1237 ;to enable whitespace mode
1238 (whitespace-mode +1)
1239
1240
1241
1242 (defun org-set-mark-command (arg)
1243 "Do set-mark-command and then org-show-context if the point
1244 moves to invisible text."
1245 (interactive "P")
1246 (let ((initial-point (point)))
1247 (setq this-command 'set-mark-command)
1248 (set-mark-command (arg))
1249 (if (and (not (= (point) initial-point))
1250 (or (outline-invisible-p) (org-invisible-p2)))
1251 (org-show-context 'mark-goto))))
1252
1253 (defun org-exchange-point-and-mark (&optional arg)
1254 (interactive "P")
1255 (let ((initial-point (point)))
1256 (exchange-point-and-mark)
1257 (if (and (not (= (point) initial-point))
1258 (or (outline-invisible-p) (org-invisible-p2)))
1259 (org-show-context 'mark-goto))))
1260
1261
1262 (defun toggle-mode-line ()
1263 "Toggle mode line on and off."
1264 (interactive)
1265 (if mode-line-format
1266 (progn (setq my-saved-mode-line-format mode-line-format)
1267 (setq mode-line-format nil))
1268 (setq mode-line-format my-saved-mode-line-format))
1269 (force-mode-line-update))
1270 (toggle-mode-line)
1271 (global-set-key (kbd "M-m") 'toggle-mode-line)
1272 (add-hook 'after-change-major-mode-hook
1273 (lambda () (setq my-saved-mode-line-format mode-line-format)
1274 (setq mode-line-format nil)))
1275
1276
1277 #+end_src
1278
1279 ** Copy mode-line to the top
1280 #+begin_src emacs-lisp
1281 ;; Copy mode-line to the top
1282 (setq-default header-line-format mode-line-format
1283 mode-line-format nil)
1284 ;; copied the mode-line theme into the header theme, else it is unreadable
1285 ;; this goes after loading the theme
1286 (let ((class '((class color) (min-colors 89))))
1287 (custom-theme-set-faces
1288 'leuven
1289 `(header-line ((,class (:box (:line-width 1 :color "#1A2F54") :foreground "#85CEEB" :background "#335EA8"))))))
1290
1291 #+end_src
1292
1293 ** tab bindings for when I wanted to make tab be for search
1294 #+begin_src emacs-lisp
1295
1296 (define-key emacs-lisp-mode-map (kbd "<tab>") nil)
1297 (define-key button-buffer-map "\t" nil)
1298 (define-key button-buffer-map (kbd "f") 'forward-button)
1299 (define-key Info-mode-map "\t" nil)
1300 (define-key widget-keymap "\t" nil)
1301 (define-key widget-keymap (kbd "<tab>") nil)
1302
1303 (add-hook 'compilation-mode-hook (lambda ()
1304 (define-key compilation-mode-map (kbd "<tab>") nil)
1305 (define-key compilation-mode-map "\t" nil)))
1306
1307 ;; unbind c-i for yas. it already separately binds <tab>
1308 (add-hook 'yas-minor-mode-hook (lambda ()
1309 (define-key yas-minor-mode-map "\t" nil)))
1310
1311 (add-hook 'haskell-interactive-mode-hook
1312 (lambda ()
1313 (define-key haskell-interactive-mode-map "\t" nil)
1314 (define-key haskell-interactive-mode-map (kbd "<tab>") 'haskell-interactive-mode-tab)))
1315
1316 (define-key minibuffer-local-must-match-map "\t" nil)
1317 (define-key minibuffer-local-must-match-map (kbd "<tab>") 'minibuffer-complete)
1318 (define-key minibuffer-local-completion-map (kbd "<tab>") 'minibuffer-complete)
1319 (define-key minibuffer-local-completion-map "\t" 'minibuffer-complete)
1320
1321 (add-hook 'ido-setup-hook
1322 (lambda()
1323 (define-key ido-completion-map (kbd "<tab>") 'ido-complete)
1324 (define-key ido-completion-map "\t" nil)))
1325
1326 #+end_src
1327
1328 ** kill buffer and window
1329 #+begin_src emacs-lisp
1330 (defun kill-buffer-and-window ()
1331 "Close the current window and kill the buffer it's visiting."
1332 (interactive)
1333 (progn
1334 (kill-buffer)
1335 (delete-window)))
1336 #+end_src
1337 ** sending multiple commands to a comint buffer
1338 without waiting for commands to finish is unreliable.
1339 seems like 1 in 100 times, an invisible command to restore prompt didn't work
1340 #+begin_src emacs-lisp
1341 (setq shell-unset-prompt "unset PROMPT_COMMAND; unset PS1")
1342 (setq shell-set-prompt "PROMPT_COMMAND=prompt_command")
1343
1344 (if (boundp 'shell-unset-prompt)
1345 (send-invisible-string proc shell-unset-prompt))
1346 (if (boundp 'shell-set-prompt)
1347 (send-invisible-string proc shell-set-prompt))
1348
1349
1350 (defun send-invisible-string (proc string)
1351 "Like send-invisible, but non-interactive"
1352 (comint-snapshot-last-prompt)
1353 (funcall comint-input-sender proc string))
1354
1355 #+end_src
1356
1357
1358
1359
1360 ** org-mode auto-complete source
1361
1362 todo, someday take a look at this. it is broken.
1363
1364 ;(defvar ac-source-eshell-pcomplete
1365 ; '((candidates . (pcomplete-completions))))
1366 ;(defun ac-complete-eshell-pcomplete ()
1367 ; (interactive)
1368 ; (auto-complete '(ac-source-eshell-pcomplete)))
1369
1370 ;(add-hook 'org-mode-hook (lambda () (setq ac-sources (cons 'ac-source-eshell-pcomplete ac-sources))))
1371 ;(add-to-list 'ac-modes 'eshell-mode)
1372
1373
1374 ** gnus nice unicode
1375
1376
1377 this looks nice, but it lags gnus just a bit
1378 #+begin_src emacs-lisp
1379
1380 (defun gnus-pretty-chars-setup ()
1381 (when window-system
1382 (setq gnus-sum-thread-tree-indent " "
1383 gnus-sum-thread-tree-root "● "
1384 gnus-sum-thread-tree-false-root "◯ "
1385 gnus-sum-thread-tree-single-indent "◎ "
1386 gnus-sum-thread-tree-leaf-with-other "├─► "
1387 gnus-sum-thread-tree-vertical "│"
1388 gnus-sum-thread-tree-single-leaf "╰─► ")))
1389 ;; dunno why, but this didn't work just setting on startup
1390 (add-hook 'gnus-startup-hook 'gnus-pretty-chars-setup)
1391
1392 #+end_src
1393
1394 ** misc
1395 #+begin_src emacs-lisp
1396
1397 ;; this makes more ergonomic sense, since our eyes are mostly on the left,
1398 ;; but after using it a while, it's too much cognitive dissonance that
1399 ;; every other program has it on the right
1400 ;;(set-scroll-bar-mode 'left)
1401
1402
1403
1404 ; todo, is this require things necessary?
1405 ; (require 'flyspell)
1406
1407
1408
1409 ; whenever M-tab is completion, swap it with tab
1410 ;(define-key emacs-lisp-mode-map (kbd "<tab>") 'completion-at-point)
1411 ;(define-key emacs-lisp-mode-map (kbd "C-M-i") 'indent-for-tab-command)
1412 ;(define-key lisp-interaction-mode-map (kbd "<tab>") 'completion-at-point)
1413 ;(define-key lisp-interaction-mode-map (kbd "C-M-i") 'indent-for-tab-command)
1414 ;the global tab keyind. for some reason this totally screws up mini-buffer tab.
1415 ; disabled until I actually find myself using this, and find a fix for the above problem
1416 ;(global-set-key (kbd "<tab>") 'complete-symbol)
1417
1418
1419 ; todo, make my custom overlays have an underline if they are
1420 ; overriding a paren matching overlay
1421 ; make right click set the mark
1422 ; make search tab do completion instead of meta-tab
1423 ; in isearch, move C-y to C-v
1424 ; in isearch, move c-s to c-f
1425
1426 ; some testing to figure out the underlining when paren highlight conflicts
1427 ; (let ((extra-overlays (overlays-at (1+ end-point))))
1428 ; (when extra-overlays (print extra-overlays)))
1429
1430
1431
1432
1433 ; commented out because it messes up yank-pop.
1434 ; todo, fix it someday
1435 ; make yank linewise if it ends in a newline
1436 ;(defadvice yank (before linewise-yank-advice activate)
1437 ; (let ((arg (ad-get-arg 0)))
1438 ; (when (string-match "\n[ \t]*$" (current-kill (cond
1439 ;; ((listp arg) 0)
1440 ;; ((eq arg '-) -2)
1441 ;; (t (1- arg))) t))
1442 ;; (move-beginning-of-line nil))))
1443
1444
1445
1446 ; todo, look into augmenting auto-complete with hippie expand.
1447 ; starter kit has some hippie expand settings to look into:
1448 ; (when (boundp 'hippie-expand-try-functions-list)
1449 ; (delete 'try-expand-line hippie-expand-try-functions-list)
1450 ; (delete 'try-expand-list hippie-expand-try-functions-list))
1451
1452
1453 ;; hippie expand is dabbrev expand on steroids
1454 ;(setq hippie-expand-try-functions-list '(try-expand-dabbrev
1455 ; try-expand-dabbrev-all-buffers
1456 ; try-expand-dabbrev-from-kill
1457 ; try-complete-file-name-partially
1458 ; try-complete-file-name
1459 ; try-expand-all-abbrevs
1460 ; try-expand-list
1461 ; try-expand-line
1462 ; try-complete-lisp-symbol-partially
1463 ; try-complete-lisp-symbol))
1464 ;; use hippie-expand instead of dabbrev
1465 ;(global-set-key (kbd "M-/") 'hippie-expand)
1466
1467
1468 ; commented because i haven't had time to check it out yet
1469 ;; shorter aliases for ack-and-a-half commands
1470 ;(defalias 'ack 'ack-and-a-half)
1471 ;(defalias 'ack-same 'ack-and-a-half-same)
1472 ;(defalias 'ack-find-file 'ack-and-a-half-find-file)
1473 ;(defalias 'ack-find-file-same 'ack-and-a-half-find-file-same)
1474
1475
1476
1477
1478 ; todo. take a look at fixing this
1479 ;delete-old-versions t ; fix description in http://www.emacswiki.org/emacs/ForceBackups
1480
1481
1482
1483
1484 ;; prelude uses paredit mode.
1485 ;; paredit has some useful stuff but also annoying stuff.
1486 ;; if I ever do a ton of lisp coding, I should look into it
1487
1488
1489
1490
1491
1492
1493 ; random notes and example code
1494
1495
1496 ; usefull thing
1497 ;(map 'list #'list tabSwapKeys (reverse (getBinds tabSwapKeys)))
1498
1499 ; example of getting keymap info
1500 ;(car (car (minor-mode-key-binding (kbd "C-/") t)))
1501 ;(cdr (car (minor-mode-key-binding (kbd "C-/") t)))
1502 ;(global-key-binding (kbd "C-M-i") t)
1503 ;(minor-mode-key-binding (kbd "<tab>") t)
1504 ;(local-key-binding (kbd "C-M-i") t)
1505 ;(current-minor-mode-maps)
1506 ;(cdr (assq 'undo-tree-mode minor-mode-map-alist))
1507
1508
1509 ; center on incremental search, instead of being at top or bottom of screen.
1510 ; i'm hoping that setting Isearch Allow Scroll is good enough to fix this annoyance
1511 ;from http://stackoverflow.com/questions/11052678/emacs-combine-iseach-forward-and-recenter-top-bottom
1512
1513 ;example of constant definition of an overlay and propreries
1514 ;(defface mouse-flash-position '((t (:background "Yellow")))
1515 ; "*Face used to highlight mouse position temporarily."
1516 ; :group 'mouse)
1517 ;(defface mouse-flash-position '((t (:background "Yellow")))
1518 ; "*Face used to highlight mouse position temporarily."
1519 ; :group 'mouse)
1520 ;(defconst mouse-flash-posn-overlay
1521 ; ;; Create and immediately delete, to get "overlay in no buffer".
1522 ; (let ((ol (make-overlay (point-min) (point-max))))
1523 ; ;(delete-overlay ol)
1524 ; ;(overlay-put ol 'face 'mouse-flash-position)
1525 ; (overlay-put ol 'mouse-face 'mouse-flash-position)
1526 ; (overlay-put ol 'priority 1000000)
1527 ; ol)
1528 ; "Overlay to highlight current mouse position.")
1529
1530
1531 ;tip, put the last interactive command as elisp on the kill ring:
1532 ;C-x <ESC> <ESC> C-a C-k C-g
1533
1534 ; example of overlay testing
1535 ;(setq foo (make-overlay 2 3 nil t nil))
1536 ;(setq foo2 (make-overlay 3 4 nil t nil))
1537 ;(overlay-put foo 'face '(:background "red3" :foreground "black"))
1538 ;(overlay-put foo2 'face '(:background "red1" :foreground "black"))
1539 ;(overlay-put foo 'face 'visible-mark-face)
1540 ;(overlay-put foo 'face visible-mark-face2)
1541
1542
1543 #+end_src
1544
1545
1546 ** SQL
1547
1548 disabled, as I haven't used it in a long time. I think it was good for learning some sql stuff.
1549 #+begin_src emacs-lisp :tangle no
1550 (require 'sqlup-mode)
1551 (add-hook 'sql-mode-hook 'sqlup-mode)
1552 (add-hook 'sql-interactive-mode-hook 'sqlup-mode)
1553
1554 (setq sql-product 'postgres)
1555 #+end_src
1556
1557
1558 ** icomplete
1559 #+begin_src emacs-lisp
1560 ;; without this, on partial completion return would exit the minibuffer, and i had to
1561 ;; keep typing out letters do a full completion before pressing enter.
1562 ;; super annoying. So I picked ctrl-j as a free key to put exit,
1563 ;; but in practice, I would just use ctrl-g to quit. Anyways,
1564 ;; ivy is doing all the minibuffer stuff, so removed this as it's
1565 ;; unused, so it can't cause any problems in future
1566 (when (boundp 'icomplete-minibuffer-map)
1567 (define-key icomplete-minibuffer-map (kbd "C-j") 'exit-minibuffer)
1568 (define-key icomplete-minibuffer-map (kbd "<return>")
1569 'minibuffer-force-complete-and-exit))
1570
1571
1572 #+end_src
1573 * elisp settings
1574 #+begin_src emacs-lisp
1575 ; when manually evaluating lisp, go into debugger on error
1576 (setq eval-expression-debug-on-error t)
1577 ;reminder of useful var: debug-on-error
1578 #+end_src
1579
1580
1581
1582
1583
1584 * gnus
1585
1586 good info http://www.emacswiki.org/emacs/GnusTutorial
1587 good info http://www.emacs.uniyar.ac.ru/doc/em24h/emacs183.htm
1588
1589
1590 After downloading mailing list archives, once you have an mbox file,
1591 there are rather straightforward ways to get it into any mail program,
1592 but I will cover gnus, which I use and is a bit tricky.
1593
1594 gnus has a native search (limited, too slow for body text searches), and external search engine integration.
1595 gnus manual recommends converting to maildir for searching local mail, but importing lots of maildir messages to gnus
1596 takes 10+ minutes, so scratch that option. it suggests 2 alternate options
1597 mairix. for mbox, it doesn't integrate 100% with gnus, it copies the search results to a mbox
1598 and tells gnus to make a group of that mbox and display it. This means the read state won't be persistent, but otherwise
1599 works great.
1600
1601 local imap server which will use the mbox and provide search.
1602 dovecot is modular, theres a dovecot-common which uses recommends to install i guess it's most used modules. Its
1603 description is completely not useful. Anyways, I'm not sure if there is any benefit to installing this over just the
1604 module we need.
1605 pi dovecot-imapd
1606
1607 dovecot by default also makes a an inbox folder based on the normal local mail location /var/mail/<username>
1608 those locations are adjustable and well documented via the var mail_location in
1609 /etc/dovecot/conf.d/10-mail.conf
1610 I forward my local mail, didn't see immediately how to turn off the inbox, but it will always be empty, so I left as
1611 is. you could make the var be empty, which apparently has the same effect.
1612
1613 Originally just linked the default location ~/.mail, but I changed to altering the config since ~/.mail since it seems
1614 other things like postfix use that location
1615
1616 based on http://roland.entierement.nu/blog/2010/09/08/gnus-dovecot-offlineimap-search-a-howto.html
1617 other links that poped up contained outdated, innacurate information
1618 http://sachachua.com/blog/2008/05/geek-how-to-use-offlineimap-and-the-dovecot-mail-server-to-read-your-gmail-in-emacs-efficiently/
1619 http://www.emacswiki.org/emacs/JamesFerguson
1620 http://www.sanityinc.com/articles/read-mailing-lists-in-emacs-over-imap/
1621
1622 Within emacs you can move messages between mbox and maildir etc, which is a nice flexibility.
1623
1624
1625
1626 doc group for mbox:
1627 in gnus, do gnus-group-make-doc-group (G f in groups buffer) and point to the file
1628
1629 info about groups created within gnus is stored in ~/.newsrc.eld
1630 also stored is a duplication of what email messages are read/unread,
1631 what newsgroups are subsribed to and read/unread,
1632 probably more stuff, everything that gnus saves.
1633
1634
1635 searching the body of the messages, i cut off after a few minutes.
1636 i can grep the file in just a couple seconds
1637
1638
1639 random side note
1640 we can also get mbox from gmane
1641 http://notmuchmail.org/howto/#index7h2
1642
1643
1644 gnus can't search mboxes except with its builtin search which is extremely slow. mairix can do mbox files from the command
1645 line, but not from within gnus, but from mairix.el, which can then open the results in gnus
1646
1647 mbox can be converted to maildir easily, but gnus loads lots of maildir messages extremely slow. it parses all the
1648 headers and generates a nov file for each.
1649
1650 nnfolder-generate-active-file
1651
1652 to reset things, when changing mail group. I duno all the proper way, but it works to delete
1653 ~/Mail ~/.newsrc.eld ~/.dribble (or something)
1654
1655
1656 ** mail sources vs select methods background
1657 I found this very confusing when first reading through the manual. "mail sources" is a term that does not simply mean
1658 sources of mail, it is much narrower for gnus. sources of mail can be either "mail sources" or select methods. Mail
1659 sources will move mail to ~/Mail (not sure what format), and split it into groups according to variables. You can use
1660 "mail sources" for maildir / imap, but those can also be read via select methods, which do not move the mail from their
1661 location, but use them in their native format. This is what I want to do, and I can simply ignore mail
1662 sources. Confusing terminology is that "fetching mail" "scanning mail", lots of things mail doesn't mean all mail, it
1663 means specifically from "mail sources". The words "articles" and "news" is used in connection with select methods, aka my actual mail.
1664
1665
1666
1667 ** caching background
1668
1669 caching:
1670 there is also ~/News/cache, filled with a bunch of articles, like 300 megs. can't figure out why.
1671 Grepped for caching in the manual, found 2 main things.
1672 cache is for 2 purposes. to cache locally, and to keep articles from expiring, called persistence
1673 gnus-use-cache, which puts things if they are
1674 gnus-cache-enter-articles
1675 things go in cache when they are marked certain ways by default, ticked and dormant
1676 and read articles are moved out of the cache
1677 still no idea why i have a bunch in the cache, but I set a var so that my mail won't get cached
1678 I'm gonna delete the cache, and check on it later see what exactly is going in there
1679 And of course, I moved ~/News to my encrypted drive and symlinked it
1680
1681
1682 * haskell
1683 :LOGBOOK:
1684 :END:
1685
1686 useful comint-shell mode commands. If not prefaced with *, it means it is not in the haskell custom repl
1687 *todo: setup haskell c-t toggle arrow keys
1688 tab completion
1689 C-q insert prev arg
1690 C-( history search
1691 c-m-left/right move to next/prev prompts
1692 *c-enter, multi-line input
1693 *s-delete, send input across windows. (i can implement this)
1694 *c-m-l clear screen
1695 *haskell-process-interrupt, c-cc terminate job (i can implement this maybe)
1696
1697 nice bash/readline functions missing in comint:
1698 yank-nth-arg
1699 operate-get-next
1700 menu-complete
1701
1702 usefull comint commands:
1703 c-cl : list historic command in temp buffer
1704 C-c C-o comint-delete-output
1705 comint-restore-input, todo: put this on a randomish c-c key
1706
1707
1708
1709 todo:
1710 checkout haskell repl functions:
1711 c-cv haskell-check, hlint
1712 C-M-q prog-indent-sexp
1713 c-c. haskell-mode-format-imports
1714 C-c M-/ haskell-doc-check-active
1715 haskell-process-generate-tags
1716 haskell-process-cabal-build
1717 haskell-cabal-command.. or something
1718 haskell-process-restart
1719 C-h v haskell-process-log
1720 C-h v haskell-process-show-debug-tips
1721
1722 various not immediately useful functions:
1723 haskell-process-add-dependency
1724 haskell-process-touch-buffer
1725 haskell-process-cd
1726 haskell-process-unignore
1727 haskell-process-reload-devel-main
1728
1729
1730 rebind
1731 home: C-a haskell-interactive-mode-beginning
1732 c-return: C-j haskell-interactive-mode-newline-indent
1733 up/down: <C-down> haskell-interactive-mode-history-next
1734
1735 todo haskell mode better binds for:
1736 'haskell-process-load-file
1737 'haskell-process-do-type
1738 'haskell-process-do-info
1739 'inferior-haskell-send-decl
1740
1741
1742 commands which don't work in haskell-interactive-mode(hi) vs inferior-haskell-mode(ih, default)
1743 functions not in hi:
1744 inferior-haskell-find-definition, use tags instead
1745 inferior-haskell-find-haddock, todo, test if this works
1746
1747 redefined ih to hi
1748 switch-to-haskell -> 'haskell-interactive-switch
1749 haskell-process-load-file -> inferior-haskell-load-file
1750 haskell-process-do-type -> inferior-haskell-type
1751 switch-to-haskell -> haskell-interactive-switch
1752 inferior-haskell-load-file -> 'haskell-process-load-file
1753
1754
1755 haskell-mode installation from source, based on its readme
1756 in the git directory,
1757 make all
1758
1759 #+begin_src emacs-lisp
1760
1761
1762
1763 ;; remove default option to not link the file
1764 (setq haskell-compile-command "ghc -Wall -ferror-spans -fforce-recomp %s")
1765 (add-hook 'haskell-indentation-mode-hook
1766 (lambda ()
1767 (define-key haskell-indentation-mode-map [?\C-d] nil)
1768 (define-key haskell-indentation-mode-map
1769 (kbd "<deletechar>")
1770 'haskell-indentation-delete-char)))
1771
1772 ;;copied from haskell-mode docs in order to use the new, better, nondefault
1773 ;;interactive mode.
1774 (eval-after-load "haskell-mode"
1775 '(progn
1776 (define-key haskell-mode-map (kbd "C-x C-d") nil)
1777 (define-key haskell-mode-map (kbd "C-c C-z") 'haskell-interactive-switch)
1778 (define-key haskell-mode-map (kbd "C-c C-l") 'haskell-process-load-file)
1779 (define-key haskell-mode-map (kbd "C-c C-b") 'haskell-interactive-switch)
1780 (define-key haskell-mode-map (kbd "C-c C-t") 'haskell-process-do-type)
1781 (define-key haskell-mode-map (kbd "C-c C-i") 'haskell-process-do-info)
1782 (define-key haskell-mode-map (kbd "C-c M-.") nil)
1783 (define-key haskell-mode-map (kbd "C-c C-d") nil)))
1784
1785 ;; ghc-mod install http://www.mew.org/~kazu/proj/ghc-mod/en/emacs.html
1786 ;; todo, try this out
1787 ;; (autoload 'ghc-init "ghc" nil t)
1788 ;;(add-hook 'haskell-mode-hook (lambda () (ghc-init) (flymake-mode)))
1789
1790
1791
1792 (add-to-list 'load-path "~/.emacs.d/src/ghci-completion")
1793 ;; from the package readme for ghci-completion
1794 (require 'ghci-completion)
1795 (add-hook 'inferior-haskell-mode-hook 'turn-on-ghci-completion)
1796
1797
1798 ;; disable some rebinds. they are set to appropriate keys in the keybinds section
1799 (eval-after-load "haskell-mode"
1800 '(progn
1801 (define-key haskell-mode-map (kbd "C-a") 'nil)
1802 (define-key haskell-mode-map (kbd "C-j") 'nil)))
1803
1804 (defun pretty-lambdas-haskell ()
1805 (font-lock-add-keywords
1806 nil `((,(concat "(?\\(" (regexp-quote "\\") "\\)")
1807 (0 (progn (compose-region (match-beginning 1) (match-end 1)
1808 ,(make-char 'greek-iso8859-7 107))
1809 nil))))))
1810 ;; from haskell-mode manual
1811 (add-hook 'haskell-mode-hook 'turn-on-haskell-decl-scan)
1812 (when (window-system)
1813 (add-hook 'haskell-mode-hook 'pretty-lambdas-haskell))
1814
1815 ;; added from haskell-mode website install instructions
1816 ;(load "/usr/share/emacs/site-lisp/haskell-mode/haskell-site-file")
1817 (add-hook 'haskell-mode-hook 'turn-on-haskell-doc-mode)
1818 ;;the three indentation modules are mutually exclusive - add at most one. Trying out the "most advanced"
1819 (add-hook 'haskell-mode-hook 'turn-on-haskell-indentation)
1820 ;;(add-hook 'haskell-mode-hook 'turn-on-haskell-indent)
1821 ;;(add-hook 'haskell-mode-hook 'turn-on-haskell-simple-indent)
1822
1823
1824 ;; todo, set this to some other key
1825 ;; (local-set-key (kbd "C-e") 'my-haskell-load-and-run)
1826
1827 (defun my-haskell-load-and-run ()
1828 "Loads and runs the current Haskell file."
1829 (interactive)
1830 (let ((start-buffer (current-buffer)))
1831 (inferior-haskell-load-and-run inferior-haskell-run-command)
1832 (sleep-for 0 100)
1833 (end-of-buffer)
1834 (pop-to-buffer start-buffer)))
1835
1836 ;; show haskell function in mode line
1837 ;; todo, this broke after updating emacs
1838 ;;(eval-after-load "which-func"
1839 ;; '(add-to-list 'which-func-modes 'haskell-mode))
1840
1841
1842
1843 (add-hook 'interactive-haskell-mode-hook 'ac-haskell-process-setup)
1844 (add-hook 'haskell-interactive-mode-hook 'ac-haskell-process-setup)
1845 (eval-after-load "auto-complete"
1846 '(add-to-list 'ac-modes 'haskell-interactive-mode))
1847
1848 (add-hook 'haskell-mode-hook
1849 (lambda () (define-key haskell-mode-map (kbd "C-(")
1850 (lambda () (interactive)
1851 (basic-save-buffer)
1852 (haskell-compile)
1853 (run-with-timer .3 nil 'repeat-shell)))))
1854 (add-hook 'haskell-cabal-mode-hook
1855 (lambda () (define-key haskell-cabal-mode-map (kbd "C-(") 'haskell-compile)))
1856
1857
1858
1859 (add-hook 'haskell-interactive-mode-hook
1860 (lambda ()
1861 (define-key haskell-interactive-mode-map "\r" nil)
1862 (define-key haskell-interactive-mode-map (kbd "<return>") 'haskell-interactive-mode-return)))
1863 (add-hook 'haskell-indentation-mode-hook (lambda () (define-key haskell-indentation-mode-map "\r" nil)))
1864
1865
1866
1867 (add-hook 'haskell-interactive-mode-hook
1868 (lambda ()
1869 (define-key haskell-interactive-mode-map (kbd "<C-M-return>") 'haskell-interactive-mode-newline-indent)))
1870
1871 #+end_src
1872
1873 #+RESULTS:
1874 | (lambda nil (define-key haskell-interactive-mode-map (kbd <C-M-return>) (quote haskell-interactive-mode-newline-indent))) | (lambda nil (define-key haskell-interactive-mode-map \n nil) (define-key haskell-interactive-mode-map (kbd <return>) (quote haskell-interactive-mode-return))) | ac-haskell-process-setup |
1875
1876 * isearch
1877 #+begin_src emacs-lisp
1878 (setq
1879 isearch-allow-scroll t
1880 search-ring-update t) ;; dont start an edit when going to previous search
1881
1882 (defun isearch-yank-regexp (regexp)
1883 "Pull REGEXP into search regexp."
1884 (let ((isearch-regexp nil)) ;; Dynamic binding of global.
1885 (isearch-yank-string regexp))
1886 (isearch-search-and-update))
1887
1888 (defun isearch-yank-symbol (&optional partialp backward)
1889 "Put symbol at current point into search string.
1890
1891 If PARTIALP is non-nil, find all partial matches."
1892 (interactive "P")
1893
1894 (let (from to bound sym)
1895 (setq sym
1896 ; this block taken directly from find-tag-default
1897 ; we couldn't use the function because we need the internal from and to values
1898 (when (or (progn
1899 ;; Look at text around `point'.
1900 (save-excursion
1901 (skip-syntax-backward "w_") (setq from (point)))
1902 (save-excursion
1903 (skip-syntax-forward "w_") (setq to (point)))
1904 (> to from))
1905 ;; Look between `line-beginning-position' and `point'.
1906 (save-excursion
1907 (and (setq bound (line-beginning-position))
1908 (skip-syntax-backward "^w_" bound)
1909 (> (setq to (point)) bound)
1910 (skip-syntax-backward "w_")
1911 (setq from (point))))
1912 ;; Look between `point' and `line-end-position'.
1913 (save-excursion
1914 (and (setq bound (line-end-position))
1915 (skip-syntax-forward "^w_" bound)
1916 (< (setq from (point)) bound)
1917 (skip-syntax-forward "w_")
1918 (setq to (point)))))
1919 (buffer-substring-no-properties from to)))
1920 (cond ((null sym)
1921 (message "No symbol at point"))
1922 ((null backward)
1923 (goto-char (1+ from)))
1924 (t
1925 (goto-char (1- to))))
1926 (isearch-search)
1927 (if partialp
1928 (isearch-yank-string sym)
1929 (isearch-yank-regexp
1930 (concat "\\_<" (regexp-quote sym) "\\_>")))))
1931
1932 (defun isearch-current-symbol (&optional partialp)
1933 "Incremental search forward with symbol under point.
1934
1935 Prefixed with \\[universal-argument] will find all partial
1936 matches."
1937 (interactive "P")
1938 (let ((start (point)))
1939 (isearch-forward-regexp nil 1)
1940 (isearch-yank-symbol partialp)))
1941 ;; todo, make this
1942
1943 (defun isearch-backward-current-symbol (&optional partialp)
1944 "Incremental search backward with symbol under point.
1945
1946 Prefixed with \\[universal-argument] will find all partial
1947 matches."
1948 (interactive "P")
1949 (let ((start (point)))
1950 (isearch-backward-regexp nil 1)
1951 (isearch-yank-symbol partialp)))
1952
1953
1954
1955 ; lets look through emacs starter kit before we throw this out.
1956
1957
1958 ; automatically wrap to the top of the buffer when isearch fails
1959 (defadvice isearch-search (after isearch-no-fail activate)
1960 (unless isearch-success
1961 (ad-disable-advice 'isearch-search 'after 'isearch-no-fail)
1962 (ad-activate 'isearch-search)
1963 (isearch-repeat (if isearch-forward 'forward))
1964 (ad-enable-advice 'isearch-search 'after 'isearch-no-fail)
1965 (ad-activate 'isearch-search)))
1966
1967 ;; Activate occur easily inside isearch
1968 (define-key isearch-mode-map (kbd "C-o")
1969 (lambda () (interactive)
1970 (let ((case-fold-search isearch-case-fold-search))
1971 (occur (if isearch-regexp
1972 isearch-string
1973 (regexp-quote isearch-string))))))
1974
1975
1976 #+end_src
1977
1978 * lisp / elisp mode setings
1979 #+begin_src emacs-lisp
1980
1981 (add-hook 'emacs-lisp-mode-hook 'starter-kit-remove-elc-on-save)
1982 (defun starter-kit-remove-elc-on-save ()
1983 "If you're saving an elisp file, likely the .elc is no longer valid."
1984 (make-local-variable 'after-save-hook)
1985 (add-hook 'after-save-hook
1986 (lambda ()
1987 (if (file-exists-p (concat buffer-file-name "c"))
1988 (delete-file (concat buffer-file-name "c"))))))
1989
1990
1991 (defun emacs-lisp-mode-defaults ()
1992 ;; checkdoc has an annoying feature that wants a header and footer
1993 ;; in every elisp buffer as if they all were packages
1994 ;; todo, see if there is a way
1995 ;; to make checkdoc usable instead of just disabling it as I do here
1996 (if (boundp 'flycheck-checkers)
1997 (setq flycheck-checkers (remove 'emacs-lisp-checkdoc flycheck-checkers)))
1998 (eldoc-mode 1))
1999 (add-hook 'emacs-lisp-mode-hook 'emacs-lisp-mode-defaults)
2000
2001 (define-key lisp-mode-map (kbd "<M-up>") 'backward-up-list)
2002 (define-key lisp-mode-map (kbd "<M-down>") 'down-list)
2003 (define-key emacs-lisp-mode-map (kbd "<M-up>") 'backward-up-list)
2004 (define-key emacs-lisp-mode-map (kbd "<M-down>") 'down-list)
2005 (define-key emacs-lisp-mode-map (kbd "<M-escape>") 'find-function-at-point)
2006
2007 ;; interactive modes don't need whitespace checks
2008 (defun interactive-lisp-coding-defaults ()
2009 (whitespace-mode -1))
2010 (setq prelude-interactive-lisp-coding-hook 'prelude-interactive-lisp-coding-defaults)
2011
2012
2013 ;; ielm is an interactive Emacs Lisp shell
2014 (defun ielm-mode-defaults ()
2015 (run-hooks 'prelude-interactive-lisp-coding-hook)
2016 (turn-on-eldoc-mode))
2017 (add-hook 'ielm-mode-hook 'ielm-mode-defaults)
2018
2019 #+end_src
2020
2021
2022 * java eclim
2023
2024 based on https://github.com/senny/emacs-eclim
2025
2026
2027 eclim: eclipse completion, searching, validation, etc inside emacs
2028 install
2029 #+begin_src sh :tangle no
2030 cd ~/opt
2031 git clone git://github.com/ervandew/eclim.git
2032 cd eclim
2033 pi ant
2034 ant -Declipse.home=/a/opt/eclipse
2035 #+end_src
2036
2037
2038 currently makes emacs hang a bunch. dunno why. just using eclipse instead
2039 #+begin_src emacs-lisp :tangle no
2040 (require 'eclim)
2041 (global-eclim-mode)
2042
2043 ;; just do java
2044 (setq eclim-accepted-file-regexps
2045 '("\\.java"))
2046
2047 (custom-set-variables
2048 '(eclim-eclipse-dirs '("/a/opt/eclipse"))
2049 '(eclim-executable "/a/opt/eclipse/eclim"))
2050
2051 (setq help-at-pt-display-when-idle t)
2052 (setq help-at-pt-timer-delay 0.1)
2053 (help-at-pt-set-timer)
2054
2055 ;; dunno if this line is needed
2056 (require 'eclimd)
2057 (setq eclimd-default-workspace "/a/bin/eclipse-workspace")
2058
2059 ;;add the emacs-eclim source
2060 (require 'ac-emacs-eclim-source)
2061 (add-hook 'java-mode-hook 'ac-emacs-eclim-java-setup)
2062
2063 #+end_src
2064
2065 #+RESULTS:
2066 | ac-emacs-eclim-java-setup |
2067
2068 * mediawiki
2069 #+begin_src emacs-lisp
2070
2071 (add-to-list 'load-path "~/.emacs.d/src/mediawiki-el")
2072 (eval-after-load "mediawiki"
2073 '(progn
2074 (remove-hook 'outline-minor-mode-hook 'mediawiki-outline-magic-keys)
2075 (add-hook 'mediawiki-mode-hook
2076 (lambda () (define-key mediawiki-mode-map (kbd "C-(") 'mediawiki-save-reload)))
2077
2078 ;; mediawiki mode has a bug that it will claim an edit conflict unless you reload after saving.
2079 ;; I also like to save with no edit summary for previewing on my local mw instance
2080 (defun mediawiki-save-reload ()
2081 (interactive)
2082 (and (mediawiki-save "") (mediawiki-reload)))))
2083 #+end_src
2084 * modes with little configuration needed
2085 #+begin_src emacs-lisp
2086
2087 (setq org-caldav-url "https://cal.iankelling.org"
2088 org-caldav-calendar-id "ian"
2089 org-caldav-inbox "/p/cal.org")
2090 ;;(org-caldav-sync)
2091
2092
2093 ;;(require 'dtrt-indent)
2094 ;;(setq dtrt-indent-mode t)
2095
2096 (setq css-indent-offset 2)
2097
2098 (load-file "/a/h/iank-mod.el")
2099
2100 ;; from when i was running my own patches
2101 ;;(add-to-list 'load-path "/a/opt/ws-butler")
2102
2103 (require 'ws-butler)
2104 ;; todo: I think this is broken, it keeps collapsing the last line
2105 ;; for empty messages.
2106
2107 ;; the main problem is when it deletes the blank line at the end
2108 ;; of a message with an empty body. but I might also
2109 ;; be pasting whitespace significant things in here, so
2110 ;; just don't do anything.
2111 ;; todo: propose this upstream
2112 (add-to-list 'ws-butler-global-exempt-modes 'message-mode)
2113
2114 (ws-butler-global-mode)
2115
2116
2117
2118 (require 'nginx-mode)
2119 ;;The mode should automatically activate for files called nginx.conf and files under /etc/nginx - if not, you can add something like this to your init file:
2120 ;;(add-to-list 'auto-mode-alist '("/etc/nginx/sites-available/.*" . nginx-mode))
2121
2122 ;; todo, put this on a hook with prog mode
2123 ;;(highlight-indentation-mode 1)
2124
2125 (add-hook 'auto-revert-tail-mode-hook
2126 (lambda ()
2127 (when (string=
2128 buffer-file-name
2129 "/var/log/cloudman/development/cm-service.log")
2130 (setq-local prev-auto-revert-max 0)
2131 ;; set buffer-local hook
2132 (add-hook 'after-revert-hook 'tail-colorize nil t))))
2133 (defun tail-colorize ()
2134 (ansi-color-apply-on-region prev-auto-revert-max (point-max))
2135 (setq-local prev-auto-revert-max (point-max)))
2136
2137
2138 ;; gnu global
2139 (require 'ggtags)
2140 (add-hook 'c-mode-common-hook
2141 (lambda () (ggtags-mode 1)
2142 (setq c-label-minimum-indentation 0)))
2143
2144 ;; specific to my unusual keybind setup, you may want to
2145 ;; pick different keys
2146 (define-key ggtags-mode-map (kbd "C-M-o") 'ggtags-find-tag-dwim)
2147 (define-key ggtags-mode-map (kbd "C-M-m") 'ggtags-grep)
2148
2149 (defun gtags-update-single(filename)
2150 "Update Gtags database for changes in a single file"
2151 (interactive)
2152 (start-process "update-gtags" "update-gtags" "bash" "-c" (concat "cd " ggtags-project-root " ; gtags --single-update " filename )))
2153
2154 (defun gtags-update-current-file()
2155 (interactive)
2156 (let ((rel-filename (replace-regexp-in-string
2157 ggtags-project-root "."
2158 (buffer-file-name (current-buffer)))))
2159 (gtags-update-single rel-filename)))
2160
2161 (defun gtags-update-hook()
2162 "Update GTAGS file incrementally upon saving a file"
2163 (when (and ggtags-mode ggtags-project-root)
2164 (gtags-update-current-file)))
2165
2166 (add-hook 'after-save-hook 'gtags-update-hook)
2167
2168 ;; i'd like to make some elisp which modifies a keymap to remove
2169 ;; all binds which don't match a predicate.
2170 ;; I tried setting a keymap to a new keymap,
2171 ;; but that didn't register as functional.
2172 ;; so I'd need to modify the list in place.
2173
2174 (require 'magit)
2175
2176
2177 ;; colorize hex colors: use rainbow mode
2178
2179
2180 ;; message mode prompted me on first message.
2181 ;; a function which describes options then sets this
2182 ;; the other options were to use smtp directly or pass to another mail client
2183 ;; here we use the standard sendmail interface, which I use postfix for
2184 (setq send-mail-function (quote sendmail-send-it))
2185
2186 (add-to-list 'load-path "~/.emacs.d/src/spray")
2187 (require 'spray)
2188 (global-set-key (kbd "C-M-w") 'spray-mode)
2189 ;; remember, h/l = move. f/s = faster/slower, space = pause, all others quit
2190
2191 ;; delete active selection with self-insert commands
2192 (delete-selection-mode t)
2193
2194 ;; Transparently open compressed files
2195 (auto-compression-mode t)
2196
2197 ;; Highlight matching parenthesesq when the pointq is on them.
2198 ;; not needed since smart paren mode?
2199 ;; (show-paren-mode 1)
2200
2201
2202 ;; not documented, but looking at the source, I find this
2203 ;; stops me from being asked what command on every C-c-c
2204 ;; when doing a latex document.
2205 (setq TeX-command-force "LaTeX")
2206
2207 ;; dot mode, repeats last action
2208 (require 'dot-mode)
2209 (add-hook 'find-file-hooks 'dot-mode-on)
2210
2211
2212 ;; clean up obsolete buffers automatically at midnight
2213 (require 'midnight)
2214
2215
2216 ;; disabled because it takes 400ms on startup
2217 ;; ;; emacs regexes are too limited.
2218 ;; (require 'foreign-regexp)
2219 ;; ;; perl is most powerful, but javascript is pretty close and
2220 ;; ;; I'd rather know javascript stuff than perl
2221 ;; (custom-set-variables
2222 ;; '(foreign-regexp/regexp-type 'javascript) ;; Choose by your preference.
2223 ;; '(reb-re-syntax 'foreign-regexp)) ;; Tell re-builder to use foreign regexp.
2224 ;; ;; it would be nice to add documentation to do this for more commands to that package
2225 ;; ;; disabled because it's too slow. but I'd still m-x it for advanced replacements
2226 ;; ;;(define-key global-map [remap isearch-forward-regexp] 'foreign-regexp/isearch-forward)
2227
2228
2229 ;; saner regex syntax
2230 (require 're-builder)
2231 (setq reb-re-syntax 'string)
2232
2233
2234 ;; use shift + arrow keys to switch between visible buffers
2235 ;; todo, set these keys to something else
2236 (require 'windmove)
2237 (windmove-default-keybindings)
2238
2239
2240 ;; show the name of the current function definition in the modeline
2241 (require 'which-func)
2242 (setq which-func-modes t)
2243 (which-function-mode 1)
2244
2245
2246 ;; enable winner-mode to manage window configurations
2247 (winner-mode +1)
2248
2249 ;; meaningful names for buffers with the same name
2250 (require 'uniquify)
2251 (setq uniquify-buffer-name-style 'forward
2252 uniquify-separator "/"
2253 ;; for sdx work. until I figure out a better way.
2254 ;; maybe something like projectile can do it,
2255 ;; or hacking around the status bar
2256 uniquify-min-dir-content 2
2257 uniquify-after-kill-buffer-p t ; rename after killing uniquified
2258 uniquify-ignore-buffers-re "^\\*") ; don't muck with special buffers
2259
2260
2261 ;; makefiles require tabs
2262 ;; todo: find a makefile indent function that works,
2263 ;; best I could find is this one which means don't indent at all
2264 ;;
2265 (add-hook 'makefile-mode-hook
2266 (lambda ()
2267 (setq indent-tabs-mode t)
2268 (setq indent-line-function (lambda () 'no-indent))))
2269
2270
2271 ;; todo, turn on auto-fill just for txt files
2272 ;;(add-hook 'text-mode-hook 'turn-on-auto-fill)
2273 (add-hook 'text-mode-hook 'turn-on-flyspell)
2274
2275
2276 ;; auto indent shell script comments
2277 (setq sh-indent-comment t)
2278
2279 ;; random extra highlights
2280 (require 'volatile-highlights)
2281 (volatile-highlights-mode t)
2282
2283
2284 ;; make help buffers smaller when it makes sense
2285 (temp-buffer-resize-mode 1)
2286
2287
2288 (require 'info+)
2289 ;; based on suggestions in info+.el, I also installed misc-fns, strings, and thingatpt+
2290 ;; remove some bad keybinds from info+
2291 (define-key Info-mode-map [mouse-4] nil)
2292 (define-key Info-mode-map [mouse-5] nil)
2293
2294
2295 (require 'smooth-scroll)
2296 ;; long gnus summary buffers lags too much with this,
2297 ;; but I like it enough to leave it enabled by default
2298 ;; and crank up the step size to be faster
2299 ;; and it doesn't have a way to enable it only for certain modes etc.
2300 ;; todo sometime, make it work for certain modes only
2301 (smooth-scroll-mode t)
2302 ;; its too slow with the default of 2
2303 (setq smooth-scroll/vscroll-step-size 7)
2304 ;; sublimity doesn't work as good going fast by default
2305 ;; smooth-scrolling.el, does not do smooth scrolling. its about cursor location
2306
2307
2308 (setq sh-here-document-word "'EOF'")
2309
2310 (setq tramp-default-method "ssh")
2311 #+end_src
2312 * misc general settings
2313
2314 #+begin_src emacs-lisp
2315
2316 (setq vc-follow-symlinks t)
2317
2318 ;; give us a shell to start instead of scratch
2319 ;;(setq initial-buffer-choice (lambda () (new-shell)))
2320
2321 ;; disable this nasty function, as I always use a gui
2322 (defun suspend-frame() (interactive))
2323
2324 ;; Seed the random-number generator
2325 (random t)
2326
2327 ;; easier to remember than keybinds
2328 (defalias 'scrypt 'mml-secure-message-encrypt-pgpmime)
2329 (defalias 'sign 'mml-secure-message-sign-pgpmime)
2330 (defun encrypt ()
2331 (interactive)
2332 (mml-secure-message-encrypt-pgpmime 'dontsign))
2333
2334 ;; don't highlight the region.
2335 (set-face-background 'region nil)
2336
2337 ;; this fixes save error for python example code
2338 (define-coding-system-alias 'UTF-8 'utf-8)
2339
2340 ;; i don't use frame titles, but if I ever do
2341 ;; this starter kit setting is probably good
2342 (if window-system (setq frame-title-format '(buffer-file-name "%f" ("%b"))))
2343
2344
2345 ;;(prefer-coding-system 'utf-8-unix)
2346
2347 ;; remove ugly 3d box feature
2348 (set-face-attribute 'mode-line nil :box nil)
2349
2350 (add-to-list 'default-frame-alist
2351 '(font . "DejaVu Sans Mono-11"))
2352 ; the default will jump 2 sizes.
2353 (setq text-scale-mode-step 1.1)
2354 (setq font-lock-maximum-decoration t
2355 inhibit-startup-message t
2356 transient-mark-mode t
2357 delete-by-moving-to-trash t
2358 shift-select-mode nil
2359 truncate-partial-width-windows nil
2360 uniquify-buffer-name-style 'forward
2361 oddmuse-directory "~/.emacs.d/oddmuse"
2362 echo-keystrokes 0.1
2363 mark-ring-max 160
2364 sort-fold-case t ; case insensitive line sorting
2365 global-mark-ring-max 1000
2366 ;; the visible bell seems to lag the ui
2367 ;;visible-bell t
2368 ;; turn off audible bell
2369 ;; https://www.emacswiki.org/emacs/AlarmBell
2370 ring-bell-function 'ignore
2371 case-replace nil
2372 revert-without-query '(".*")
2373 ;; don't pause display code on input.
2374 ;; smoother display performance at slight cost of input performance
2375 redisplay-dont-pause t
2376 font-lock-maximum-decoration t) ; probably default and not necesary
2377
2378
2379 (setq-default indent-tabs-mode nil ;; don't use tabs to indent
2380 cursor-type 'box
2381 fill-column 72
2382
2383 ;; wrap at word boundaries instead of mid-word
2384 word-wrap t
2385 imenu-auto-rescan t
2386 indicate-empty-lines t) ; mark end of buffer
2387
2388
2389 (blink-cursor-mode '(-4))
2390 (menu-bar-mode -1)
2391 (tool-bar-mode -1)
2392
2393
2394 ;; enable various commands
2395 (put 'narrow-to-region 'disabled nil)
2396 (put 'narrow-to-page 'disabled nil)
2397 (put 'narrow-to-defun 'disabled nil)
2398 (put 'upcase-region 'disabled nil)
2399 (put 'downcase-region 'disabled nil)
2400 (put 'scroll-left 'disabled nil)
2401 ;; these from graphene, haven't read about them yet
2402 (put 'ido-complete 'disabled nil)
2403 (put 'ido-exit-minibuffer 'disabled nil)
2404 (put 'dired-find-alternate-file 'disabled nil)
2405 (put 'autopair-newline 'disabled nil)
2406
2407
2408
2409 ;;disable and minimize various prompts/messages
2410 (fset 'yes-or-no-p 'y-or-n-p)
2411 (setq confirm-nonexistent-file-or-buffer nil
2412 inhibit-startup-message t
2413 inhibit-startup-echo-area-message t
2414 inhibit-startup-screen t
2415 compilation-read-command nil ;; just don't compile with unsafe file local vars
2416 kill-buffer-query-functions (remq 'process-kill-buffer-query-function
2417 kill-buffer-query-functions))
2418
2419
2420 ;; exit without bothering me
2421 ;; http://stackoverflow.com/questions/2706527/make-emacs-stop-asking-active-processes-exist-kill-them-and-exit-anyway/2708042#2708042
2422 (add-hook 'comint-exec-hook
2423 (lambda () (set-process-query-on-exit-flag (get-buffer-process (current-buffer)) nil)))
2424 ;; based on save-buffers-kill-emacs help string, don't ask about clients when exiting
2425 ;; apparently this would need to be in some later hook. dunno where is best, but this works
2426 (defadvice save-buffers-kill-emacs (before no-client-prompt-advice activate)
2427 (setq kill-emacs-query-functions (delq 'server-kill-emacs-query-function kill-emacs-query-functions)))
2428
2429
2430
2431 ;; (custom-set-faces
2432 ;; ;; setting header-line-format to " " as a hack for a top margin the oly thning I could find to do a top margin
2433 ;; '(header-line ((t (:background "default" :foreground "default" :overline nil :underline nil))))
2434 ;; ;; don't highlight the region
2435 ;; '(region ((t nil))))
2436 (setq-default header-line-format " ")
2437
2438
2439 (setq initial-scratch-message nil)
2440 #+end_src
2441
2442
2443 vertical margin background.
2444 google turned up: http://lists.gnu.org/archive/html/help-gnu-emacs/2014-03/msg00544.html
2445 the xresource doesn't work for me, probably an xmonad thing.
2446
2447 figured out I needed to customize the header line face. To find the face, M-x list-faces-display or just google / search
2448 info,
2449 then M-x customize-face
2450 header-line
2451 unchecked some stuff so that it inherits from default.
2452
2453 * misc function definitions
2454 #+begin_src emacs-lisp
2455
2456
2457
2458
2459
2460 (defun next-backup-dir ()
2461 "In a directory listing from rsync -n,
2462 Go to the next directory based on where the cursor is."
2463 (interactive)
2464 (let* ((start-col (current-column))
2465 (end-col (progn (skip-chars-forward "^/\n") (current-column)))
2466 (dir (progn
2467 (beginning-of-line 1)
2468 (buffer-substring-no-properties (point) (+ (point) end-col)))))
2469 (message dir)
2470 (forward-line 1)
2471 (while (and (not (eobp))
2472 (string= dir (buffer-substring-no-properties (point) (+ (point) end-col))))
2473 (forward-line 1))
2474 (forward-char-same-line start-col)))
2475 ;; copy paste this for fast keybind
2476 ;;(local-set-key (kbd "<kp-enter>"))
2477
2478
2479 (defun goto-buffer-or-find-file (file-name)
2480 "If buffer is with FILE-NAME exists, go to it, else open the file using full path."
2481 (interactive)
2482 (let ((b (get-buffer (file-name-nondirectory file-name))))
2483 (if b
2484 (switch-to-buffer b)
2485 (find-file file-name))))
2486
2487
2488
2489
2490 ;; todo, i think this is broken. perhaps the last goto-char is not accounting for buffer or something
2491 (defun unpop-global-mark ()
2492 "Unpop off global mark ring. Does nothing if mark ring is empty."
2493 (interactive)
2494 (when global-mark-ring
2495 (setq global-mark-ring (cons (copy-marker (mark-marker)) global-mark-ring))
2496 (let ((lm (car (last global-mark-ring))))
2497 (set-marker (mark-marker) (marker-position lm) (marker-buffer lm)))
2498 (when (null (mark t)) (ding))
2499 (setq global-mark-ring (nbutlast global-mark-ring))
2500 (goto-char (marker-position (mark-marker)))))
2501
2502 (defun indent-buffer ()
2503 "Indents the entire buffer."
2504 (interactive)
2505 (cond ((derived-mode-p 'org-mode)
2506 (org-indent-region (point-min) (point-max)))
2507 ((derived-mode-p 'python-mode)
2508 (py-autopep8))
2509 (t
2510 (indent-region (point-min) (point-max)))))
2511
2512
2513 ;; TODO doesn't work with uniquify
2514 (defun rename-file-and-buffer ()
2515 "Renames current buffer and file it is visiting."
2516 (interactive)
2517 (let ((name (buffer-name))
2518 (filename (buffer-file-name)))
2519 (if (not (and filename (file-exists-p filename)))
2520 (message "Buffer '%s' is not visiting a file!" name)
2521 (let ((new-name (read-file-name "New name: " filename)))
2522 (cond ((get-buffer new-name)
2523 (message "A buffer named '%s' already exists!" new-name))
2524 (t
2525 (rename-file name new-name 1)
2526 (rename-buffer new-name)
2527 (set-visited-file-name new-name)
2528 (set-buffer-modified-p nil)))))))
2529
2530
2531
2532 (defun sudo-edit (&optional arg)
2533 (interactive "P")
2534 (if (or arg (not buffer-file-name))
2535 (find-file (concat "/sudo:root@localhost:" (ido-read-file-name "File: ")))
2536 (find-alternate-file (concat "/sudo:root@localhost:" buffer-file-name))))
2537
2538
2539
2540 (defun backward-symbol (arg)
2541 (interactive "p")
2542 (forward-symbol (- arg)))
2543
2544 #+end_src
2545
2546 * mode line
2547 #+begin_src emacs-lisp
2548 ;; make window title be the buffer name
2549 (setq frame-title-format "%b")
2550
2551 ; -----------------------------
2552 ; fixing up the mode line
2553 ; modified from mastering emacs blog
2554 ; ----------------------------
2555
2556 (defvar mode-line-cleaner-alist
2557 `((auto-complete-mode . "")
2558 (yas/minor-mode . "")
2559 (paredit-mode . "")
2560 (auto-fill-function . "")
2561 (eldoc-mode . "")
2562 (abbrev-mode . "")
2563 (flyspell-mode . "")
2564 (glasses-mode . "")
2565 (dot-mode . "")
2566 (yas-global-mode . "")
2567 (yas-minor-mode . "")
2568 (undo-tree-mode . "")
2569 (volatile-highlights-mode . "")
2570 (highlight-symbol-mode . "")
2571 ;; Major modes
2572 (lisp-interaction-mode . "λ")
2573 (hi-lock-mode . "")
2574 (python-mode . "Py")
2575 (emacs-lisp-mode . "EL")
2576 (nxhtml-mode . "nx"))
2577 "Alist for `clean-mode-line'.
2578
2579 When you add a new element to the alist, keep in mind that you
2580 must pass the correct minor/major mode symbol and a string you
2581 want to use in the modeline *in lieu of* the original.")
2582
2583
2584 (defun clean-mode-line ()
2585 (interactive)
2586 (loop for cleaner in mode-line-cleaner-alist
2587 do (let* ((mode (car cleaner))
2588 (mode-str (cdr cleaner))
2589 (old-mode-str (cdr (assq mode minor-mode-alist))))
2590 (when old-mode-str
2591 (setcar old-mode-str mode-str))
2592 ;; major mode
2593 (when (eq mode major-mode)
2594 (setq mode-name mode-str)))))
2595
2596 ; disabled
2597 ; (add-hook 'after-change-major-mode-hook 'clean-mode-line)
2598
2599
2600 ;;; alias the new `flymake-report-status-slim' to
2601 ;;; `flymake-report-status'
2602 (defalias 'flymake-report-status 'flymake-report-status-slim)
2603 (defun flymake-report-status-slim (e-w &optional status)
2604 "Show \"slim\" flymake status in mode line."
2605 (when e-w
2606 (setq flymake-mode-line-e-w e-w))
2607 (when status
2608 (setq flymake-mode-line-status status))
2609 (let* ((mode-line " Φ"))
2610 (when (> (length flymake-mode-line-e-w) 0)
2611 (setq mode-line (concat mode-line ":" flymake-mode-line-e-w)))
2612 (setq mode-line (concat mode-line flymake-mode-line-status))
2613 (setq flymake-mode-line mode-line)
2614 (force-mode-line-update)))
2615
2616
2617 (defun my-after-change-major-mode-hook ()
2618 (setq mode-line-mule-info nil
2619 minor-mode-alist nil
2620 mode-line-position nil)) ; todo, make only flymake status show up
2621
2622 (add-hook 'after-change-major-mode-hook 'my-after-change-major-mode-hook)
2623 #+end_src
2624
2625 * mouse related
2626 ** settings
2627 #+begin_src emacs-lisp
2628 (setq focus-follows-mouse t
2629 mouse-autoselect-window t
2630 xterm-mouse-mode t)
2631 #+end_src
2632 ** move-mouse-to-point
2633 todo, this is buggy with multiple windows open.
2634 #+begin_src emacs-lisp
2635 (defun move-mouse-to-point ()
2636 (interactive)
2637 (let* ((pos (posn-col-row (posn-at-point)))
2638 (x (+ (car pos) 2)) ; no idea why this is off by 1-2
2639 (y (cdr pos)))
2640 (set-mouse-position (selected-frame) x y)))
2641 #+end_src
2642 ** cursor highlight
2643 disabled until fixed
2644 #+begin_src emacs-lisp :tangle no
2645 (defun mouse-follow-cursor ()
2646 ;(if (not (equal this-command last-command)) (print this-command))
2647 ;debug
2648 ; (print this-command)
2649 (when (and this-command (not (string= this-command "show-pointer")))
2650 (let* ((pos (posn-col-row (posn-at-point)))
2651 (x (1+ (car pos))) ; no idea why this is off by 1
2652 (y (cdr pos)))
2653 (setq ignore-mouse-visibility t)
2654 (set-mouse-position (selected-frame) x y))
2655 ;(sleep-for 0 100)
2656 (frame-make-pointer-invisible)))
2657
2658 ; (when this-command
2659 ; (if (string= this-command "show-pointer")
2660 ; (frame-make-pointer-visible)
2661 ;))
2662
2663
2664
2665 (defun show-pointer ()
2666 (interactive)
2667 (if ignore-mouse-visibility
2668 (setq ignore-mouse-visibility nil)
2669 ; (print "visible")
2670 (frame-make-pointer-visible)))
2671
2672 (setq ignore-mouse-visibility t)
2673 ; disabled
2674 ; (global-set-key (kbd "<mouse-movement>") 'show-pointer)
2675
2676 ; (add-hook 'post-command-hook 'mouse-follow-cursor t)
2677
2678
2679 ; status. working, except that all scroll wheel actions send a mouse-movement command before doing their actual command, which makes the pointer flicker.
2680 ; this is just an artifact of xbindkeys. when i do my own mouse chip, it will fix this.
2681
2682 ; we could set track-mouse to nil, then do the command, then set it back. i like that idea a bit better.
2683 ; we could do the same thing in the other case of ignore-mouse-visibility.
2684
2685 ; there are also other issues, it doesn't work with changing buffers on a split screen.
2686 ; i think a good idea along with this would be for the cursor to follow the mouse all the time.
2687 ; i have done code for that in my mouse 1 function,
2688 ; i just need to read it again and try it out.
2689
2690
2691
2692
2693 ; this does not take care of scrolling,
2694 ; a post-command hook function below does,
2695 ; but it breaks when the frame is split.
2696 ; the bug is specifically in mouse-pixel-position
2697 ; todo, fix this eventually
2698 (defun mouse-highlight-event (event)
2699 (interactive "e")
2700 (when (or (not event) (mouse-movement-p event)
2701 (memq (car-safe event) '(switch-frame select-window)))
2702 (let ((pos (posn-point (event-end event))))
2703 (if (eq (overlay-buffer mouse-hi-ov) (current-buffer))
2704 (move-overlay mouse-hi-ov pos (1+ pos))
2705 (delete-overlay mouse-hi-ov)
2706 (setq mouse-hi-ov
2707 (make-overlay pos (1+ pos)))
2708 (overlay-put mouse-hi-ov
2709 'insert-in-front-hooks (list 'mouse-hi-modification))
2710 (overlay-put mouse-hi-ov 'priority 1001))
2711 (cond ((save-excursion (goto-char pos) (eolp))
2712 (overlay-put mouse-hi-ov 'face nil)
2713 (overlay-put mouse-hi-ov 'before-string
2714 (propertize
2715 " "
2716 'cursor t
2717 'face 'mouse-cursor-face)))
2718 (t
2719 (overlay-put mouse-hi-ov 'face 'mouse-cursor-face)
2720 (overlay-put mouse-hi-ov 'before-string nil))))))
2721
2722
2723 ; overlay changed hook function
2724 (defun mouse-hi-modification (ov timing beginning end &optional length)
2725 "Make an overlay of length 1 not expand when text is inserted at the front."
2726 (when timing
2727 (let ((start (overlay-start ov)))
2728 (move-overlay ov start (1+ start)))))
2729
2730
2731
2732
2733 (defun mouse-hi-command-hook ()
2734 ; not sure if I need to deal with case of a nil mouse position in some unforseen situation.
2735 (let ((x-y (cdr (mouse-pixel-position))))
2736 (when (wholenump (car x-y))
2737 (let ((pos (posn-point (posn-at-x-y (car x-y) (cdr x-y) nil t))))
2738 (when pos
2739 (if (eq (overlay-buffer mouse-hi-ov) (current-buffer))
2740 (move-overlay mouse-hi-ov pos (1+ pos))
2741 (delete-overlay mouse-hi-ov)
2742 (setq mouse-hi-ov
2743 (make-overlay pos (1+ pos)))
2744
2745 (overlay-put mouse-hi-ov 'priority 1001))
2746 (cond ((save-excursion (goto-char pos) (eolp))
2747
2748 (overlay-put mouse-hi-ov 'face nil)
2749 (overlay-put mouse-hi-ov 'before-string
2750 (propertize
2751 " "
2752 'cursor t
2753 'face 'mouse-cursor-face)))
2754 (t
2755 (overlay-put mouse-hi-ov 'face 'mouse-cursor-face)
2756 (overlay-put mouse-hi-ov 'before-string nil))))))))
2757 ; (pcase-let ((`(,_ ,x . ,y) (mouse-pixel-position)))
2758 ; (posn-point (posn-at-x-y x y)))))
2759 ; equivalent of above to find pos. todo, learn about the above syntax
2760
2761 (setq mouse-hi-ov (make-overlay 1 1))
2762 (delete-overlay mouse-hi-ov)
2763 ; initialized overlay
2764 ; temporarily set to nil instead of t because it is broken and
2765 ; also has a bug that makes emacs not remember the column when
2766 ; doing up and down movements.
2767 ; it also messes up yas/insert-snippet, dunno why.
2768 ; i should test out whether it is something in the post-command hook
2769 ; (setq track-mouse t)
2770 ;(add-hook 'post-command-hook 'mouse-hi-command-hook)
2771
2772 ;(mouse-hi-command-hook)
2773 ;(setq debug-on-error nil)
2774
2775 #+end_src
2776 ** mouse 1 drag func
2777
2778 disabled as it breaks in newer emacs versions with this error, when
2779 clicking on info links
2780
2781 "and: Symbol's function definition is void: mouse--remap-link-click-p"
2782
2783 #+begin_src emacs-lisp :tangle no
2784
2785 ; Copied from mouse.el and modified.
2786 ; my modifications have comments prefaced by "ian"
2787 (defun mouse-drag-track (start-event &optional
2788 do-mouse-drag-region-post-process)
2789 "Track mouse drags by highlighting area between point and cursor.
2790 The region will be defined with mark and point.
2791 DO-MOUSE-DRAG-REGION-POST-PROCESS should only be used by
2792 `mouse-drag-region'."
2793 (mouse-minibuffer-check start-event)
2794 (setq mouse-selection-click-count-buffer (current-buffer))
2795 ; ian. removed as unneeded since I don't use TMM
2796 ;(deactivate-mark)
2797 (let* ((scroll-margin 0) ; Avoid margin scrolling (Bug#9541).
2798 (original-window (selected-window))
2799 ;; We've recorded what we needed from the current buffer and
2800 ;; window, now let's jump to the place of the event, where things
2801 ;; are happening.
2802 (_ (mouse-set-point start-event))
2803 (echo-keystrokes 0)
2804 (start-posn (event-start start-event))
2805 (start-point (posn-point start-posn))
2806 (start-window (posn-window start-posn))
2807 (start-window-start (window-start start-window))
2808 (start-hscroll (window-hscroll start-window))
2809 (bounds (window-edges start-window))
2810 (make-cursor-line-fully-visible nil)
2811 (top (nth 1 bounds))
2812 (bottom (if (window-minibuffer-p start-window)
2813 (nth 3 bounds)
2814 ;; Don't count the mode line.
2815 (1- (nth 3 bounds))))
2816 (on-link (and mouse-1-click-follows-link
2817 ;; Use start-point before the intangibility
2818 ;; treatment, in case we click on a link inside
2819 ;; intangible text.
2820 (mouse-on-link-p start-posn)))
2821 (click-count (1- (event-click-count start-event)))
2822 (remap-double-click (and on-link
2823 (eq mouse-1-click-follows-link 'double)
2824 (= click-count 1)))
2825 ;; Suppress automatic hscrolling, because that is a nuisance
2826 ;; when setting point near the right fringe (but see below).
2827 (auto-hscroll-mode-saved auto-hscroll-mode)
2828 (auto-hscroll-mode nil)
2829 moved-off-start event end end-point)
2830
2831 (setq mouse-selection-click-count click-count)
2832 ;; In case the down click is in the middle of some intangible text,
2833 ;; use the end of that text, and put it in START-POINT.
2834 (if (< (point) start-point)
2835 (goto-char start-point))
2836 (setq start-point (point))
2837 (if remap-double-click
2838 (setq click-count 0))
2839
2840 ;; Activate the region, using `mouse-start-end' to determine where
2841 ;; to put point and mark (e.g., double-click will select a word).
2842 (setq transient-mark-mode
2843 (if (eq transient-mark-mode 'lambda)
2844 '(only)
2845 (cons 'only transient-mark-mode)))
2846 (delete-overlay mouse-hi-ov) ; ian, added this.
2847
2848 (let ((range (mouse-start-end start-point start-point click-count)))
2849 (push-mark (nth 0 range) t t)
2850 (goto-char (nth 1 range)))
2851
2852 ;; Track the mouse until we get a non-movement event.
2853 (track-mouse
2854 (while (progn
2855 (setq event (read-event))
2856 (or (mouse-movement-p event)
2857 (memq (car-safe event) '(switch-frame select-window))))
2858 (unless (memq (car-safe event) '(switch-frame select-window))
2859 ;; Automatic hscrolling did not occur during the call to
2860 ;; `read-event'; but if the user subsequently drags the
2861 ;; mouse, go ahead and hscroll.
2862 (let ((auto-hscroll-mode auto-hscroll-mode-saved))
2863 (redisplay))
2864 (setq end (event-end event)
2865 end-point (posn-point end))
2866 ;; Note whether the mouse has left the starting position.
2867 (unless (eq end-point start-point)
2868 (setq moved-off-start t))
2869 (if (and (eq (posn-window end) start-window)
2870 (integer-or-marker-p end-point))
2871 (mouse--drag-set-mark-and-point start-point
2872 end-point click-count)
2873 (let ((mouse-row (cdr (cdr (mouse-position)))))
2874 (cond
2875 ((null mouse-row))
2876 ((< mouse-row top)
2877 (mouse-scroll-subr start-window (- mouse-row top)
2878 nil start-point))
2879 ((>= mouse-row bottom)
2880 (mouse-scroll-subr start-window (1+ (- mouse-row bottom))
2881 nil start-point))))))
2882 (visible-mark-move-overlays))) ; ian, added this
2883
2884
2885 ;; Handle the terminating event if possible.
2886 (when (consp event)
2887 ;; Ensure that point is on the end of the last event.
2888 (when (and (setq end-point (posn-point (event-end event)))
2889 (eq (posn-window end) start-window)
2890 (integer-or-marker-p end-point)
2891 (/= start-point end-point))
2892 (mouse--drag-set-mark-and-point start-point
2893 end-point click-count))
2894
2895 ;; Find its binding.
2896 (let* ((fun (key-binding (vector (car event))))
2897 (do-multi-click (and (> (event-click-count event) 0)
2898 (functionp fun)
2899 (not (memq fun '(mouse-set-point
2900 mouse-set-region))))))
2901 (if (and (/= (mark) (point))
2902 (not do-multi-click))
2903
2904 ;; If point has moved, finish the drag.
2905 (let* (last-command this-command)
2906 (and mouse-drag-copy-region
2907 do-mouse-drag-region-post-process
2908 (let (deactivate-mark)
2909 (copy-region-as-kill (mark) (point)))))
2910
2911 ;; Otherwise, run binding of terminating up-event.
2912 (if do-multi-click
2913 (goto-char start-point)
2914 (deactivate-mark)
2915 (unless moved-off-start
2916 ;; ian: poping the mark is a poor choice of behavior.
2917 ;; we should delete the mark instead.
2918 ;; The first way I found to delete it is to pop it first
2919 (pop-mark)
2920 (setq mark-ring (nbutlast mark-ring))))
2921
2922 (when (and (functionp fun)
2923 (= start-hscroll (window-hscroll start-window))
2924 ;; Don't run the up-event handler if the window
2925 ;; start changed in a redisplay after the
2926 ;; mouse-set-point for the down-mouse event at
2927 ;; the beginning of this function. When the
2928 ;; window start has changed, the up-mouse event
2929 ;; contains a different position due to the new
2930 ;; window contents, and point is set again.
2931 (or end-point
2932 (= (window-start start-window)
2933 start-window-start)))
2934
2935 (when (and on-link
2936 (= start-point (point))
2937 (mouse--remap-link-click-p start-event event))
2938
2939 ;; If we rebind to mouse-2, reselect previous selected
2940 ;; window, so that the mouse-2 event runs in the same
2941 ;; situation as if user had clicked it directly. Fixes
2942 ;; the bug reported by juri@jurta.org on 2005-12-27.
2943 (if (or (vectorp on-link) (stringp on-link))
2944 (setq event (aref on-link 0))
2945 (select-window original-window)
2946 (setcar event 'mouse-2)
2947 ;; If this mouse click has never been done by the
2948 ;; user, it doesn't have the necessary property to be
2949 ;; interpreted correctly.
2950 (put 'mouse-2 'event-kind 'mouse-click)))
2951 (push event unread-command-events)))))))
2952 #+end_src
2953
2954 ** mouse 3
2955 #+begin_src emacs-lisp :tangle no
2956
2957
2958 (defun mouse3-range-mark (start click click-count)
2959 (let* ((range (mouse-start-end start click click-count))
2960 (beg (nth 0 range))
2961 (end (nth 1 range)))
2962 (cond ((<= click start)
2963 (set-mark beg))
2964 (t
2965 (set-mark end))))
2966 (visible-mark-move-overlays))
2967
2968
2969 (defun mouse3-set-mark (event)
2970 "in development"
2971 (interactive "e")
2972 (mouse-minibuffer-check event)
2973 ;; Use event-end in case called from mouse-drag-region.
2974 ;; If EVENT is a click, event-end and event-start give same value.
2975 (set-mark (posn-point (event-end event)))
2976 (visible-mark-move-overlays))
2977
2978
2979 (defun mouse3-func (start-event)
2980 "in development"
2981 (interactive "e")
2982
2983 (run-hooks 'mouse-leave-buffer-hook)
2984
2985 (mouse-minibuffer-check start-event)
2986 (setq mouse-selection-click-count-buffer (current-buffer))
2987 (push-mark (posn-point (event-end start-event)))
2988
2989 (let* ((scroll-margin 0) ; Avoid margin scrolling (Bug#9541).
2990 (original-window (selected-window))
2991 ;; We've recorded what we needed from the current buffer and
2992 ;; window, now let's jump to the place of the event, where things
2993 ;; are happening.
2994 ;(_ (mouse-set-point start-event)) ; ian: commented, replaced
2995 (echo-keystrokes 0)
2996 (start-posn (event-start start-event))
2997 (start-point (posn-point start-posn))
2998 (start-window (posn-window start-posn))
2999 (start-window-start (window-start start-window))
3000 (start-hscroll (window-hscroll start-window))
3001 (bounds (window-edges start-window))
3002 (make-cursor-line-fully-visible nil)
3003 (top (nth 1 bounds))
3004 (bottom (if (window-minibuffer-p start-window)
3005 (nth 3 bounds)
3006 ;; Don't count the mode line.
3007 (1- (nth 3 bounds))))
3008 (click-count (1- (event-click-count start-event)))
3009 ;; Suppress automatic hscrolling, because that is a nuisance
3010 ;; when setting point near the right fringe (but see below).
3011 (auto-hscroll-mode-saved auto-hscroll-mode)
3012 (auto-hscroll-mode nil)
3013 moved-off-start event end end-point)
3014
3015 (setq mouse-selection-click-count click-count)
3016 ;; In case the down click is in the middle of some intangible text,
3017 ;; use the end of that text, and put it in START-POINT.
3018 (if (< (mark) start-point) ; ian: change point to the mark
3019 (set-mark start-point)
3020 (visible-mark-move-overlays))
3021 (setq start-point (mark))
3022
3023 (delete-overlay mouse-hi-ov) ; ian, added this.
3024
3025 ;; Activate the region, using `mouse-start-end' to determine where
3026 ;; to put point and mark (e.g., double-click will select a word).
3027 (let ((range (mouse-start-end start-point start-point click-count)))
3028 (set-mark (nth 1 range)))
3029 (visible-mark-move-overlays)
3030
3031
3032 ;; Track the mouse until we get a non-movement event.
3033 (track-mouse
3034
3035 (while (progn
3036 (setq event (read-event))
3037 (or (mouse-movement-p event)
3038 (memq (car-safe event) '(switch-frame select-window))))
3039 (unless (memq (car-safe event) '(switch-frame select-window))
3040
3041 ;; Automatic hscrolling did not occur during the call to
3042 ;; `read-event'; but if the user subsequently drags the
3043 ;; mouse, go ahead and hscroll.
3044 (let ((auto-hscroll-mode auto-hscroll-mode-saved))
3045 (redisplay))
3046 (setq end (event-end event)
3047 end-point (posn-point end))
3048 ;; Note whether the mouse has left the starting position.
3049
3050 (unless (eq end-point start-point)
3051 (setq moved-off-start t))
3052 (if (and (eq (posn-window end) start-window)
3053 (integer-or-marker-p end-point))
3054 (mouse3-range-mark start-point end-point click-count); ian, set mark
3055
3056 ; do scrolling if needed
3057 (let ((mouse-row (cdr (cdr (mouse-position)))))
3058 (cond
3059 ((null mouse-row))
3060 ((< mouse-row top)
3061 (mouse-scroll-subr start-window (- mouse-row top)
3062 nil start-point))
3063 ((>= mouse-row bottom)
3064 (mouse-scroll-subr start-window (1+ (- mouse-row bottom))
3065 nil start-point))))))))
3066
3067 ;; Handle the terminating event if possible.
3068 (when (consp event)
3069 ;; Ensure that point is on the end of the last event.
3070 (when (and (setq end-point (posn-point (event-end event)))
3071 (eq (posn-window end) start-window)
3072 (integer-or-marker-p end-point)
3073 (/= start-point end-point))
3074 ;(mouse--drag-set-mark-and-point start-point ; ian, set mark
3075 ;end-point click-count))
3076 (mouse3-range-mark start-point end-point click-count)); ian, set mark
3077
3078 ;; Find its binding.
3079 (let* ((fun (key-binding (vector (car event))))
3080 (do-multi-click (and (> (event-click-count event) 0)
3081 (functionp fun)
3082 (not (memq fun '(mouse3-set-mark))))))
3083 (if (and (/= end-point start-point)
3084 (not do-multi-click))
3085
3086 ;; If point has moved, finish the drag.
3087 (let* (last-command this-command)
3088 (and mouse-drag-copy-region
3089 do-mouse-drag-region-post-process
3090 (let (deactivate-mark)
3091 (copy-region-as-kill (mark) (point)))))
3092
3093 ;; Otherwise, run binding of terminating up-event.
3094 (when do-multi-click
3095 (set-mark start-point)) ; ian, change this. why?
3096 (visible-mark-move-overlays)
3097
3098
3099 (when (and (functionp fun)
3100 (= start-hscroll (window-hscroll start-window))
3101 ;; Don't run the up-event handler if the window
3102 ;; start changed in a redisplay after the
3103 ;; mouse-set-point for the down-mouse event at
3104 ;; the beginning of this function. When the
3105 ;; window start has changed, the up-mouse event
3106 ;; contains a different position due to the new
3107 ;; window contents, and point is set again.
3108 (or end-point
3109 (= (window-start start-window)
3110 start-window-start)))
3111
3112 (push event unread-command-events)))))))
3113
3114 #+end_src
3115
3116
3117
3118
3119
3120 * org mode
3121
3122 #+begin_src emacs-lisp
3123
3124 ;; todo work on org-cycle-emulate-tab
3125
3126 ;; todo, this doesn't work for a non-standard keybind
3127 ;;(setq org-special-ctrl-k t)
3128
3129 ;; todo, generally fix org mode keys
3130 ;; todo, org-mark-element, unbdind from M-h, bind to mark defun key
3131
3132 ;(org-babel-do-load-languages
3133 ; 'org-babel-load-languages
3134 ; '((emacs-lisp . t)
3135 ; (sh . t)))
3136
3137 ;; make shell work like interactive bash shell
3138 (setq org-babel-default-header-args:sh
3139 '((:results . "output") (:shebang . "#!/bin/bash -l")))
3140
3141 ;; my patch to output stderr
3142 (setq org-babel-use-error-buffer nil)
3143
3144 ;
3145 ;; org-mode manual suggests these, but I haven't used them.
3146 ;;(global-set-key "\C-cl" 'org-store-link)
3147 ;;(global-set-key "\C-ca" 'org-agenda)
3148 ;; this got in the way of a haskell mode command
3149 ;;(global-set-key "\C-cb" 'org-iswitchb)
3150
3151
3152
3153 ;; org-src-tab-acts-natively t ; broken option. using next instead, todo fix
3154
3155 (setq org-src-fontify-natively t ; make babel blocks nice
3156 org-adapt-indentation nil
3157 org-src-preserve-indentation t
3158 ;; The most basic logging is to keep track of when a TODO item was finished.
3159 org-log-done 'time
3160 ;; use a drawer to keep the logs tidy
3161 org-log-into-drawer t
3162 org-extend-today-until 0
3163 org-startup-truncated nil
3164 org-clock-persist t
3165 org-clock-mode-line-total 'today
3166 ;; global STYLE property values for completion
3167 org-global-properties (quote (("STYLE_ALL" . "habit")))
3168 org-special-ctrl-a/e t ;; home and end work special in headlines
3169 org-completion-use-ido t
3170 org-catch-invisible-edits 'smart)
3171
3172 ;; non universally recommended settings
3173 (setq
3174 org-default-notes-file (concat org-directory "/a/t.org")
3175 org-agenda-files (quote ("/a/t.org"))
3176 org-mobile-directory "/p/org-mobile"
3177 org-mobile-inbox-for-pull "/p/from-mobile.org"
3178 org-directory "/p")
3179
3180 ;; modeilne populated from (org-clock-get-clocked-time)
3181 ;; which is populated from the var org-clock-total-time
3182 ;; which is populated by a function which starts from (org-clock-get-sum-start)
3183 ;;
3184
3185 (org-clock-persistence-insinuate)
3186
3187
3188 (defun time-to-org-day (time)
3189 (round (time-to-number-of-days
3190 (time-subtract time (list 0 (* 3600 org-extend-today-until) 0)))))
3191
3192
3193 (defun my-org-confirm-babel-evaluate (lang body)
3194 (not (or (string= (buffer-file-name) "/a/t.org")
3195 (string= (buffer-file-name) "/home/iank/.emacs.d/my-init.org")
3196 )))
3197 (setq org-confirm-babel-evaluate 'my-org-confirm-babel-evaluate)
3198
3199
3200 (defun org-time-stamp-with-time (arg)
3201 (interactive "P")
3202 ;; '(4) is the argument passed by universal prefix
3203 (org-time-stamp (if arg arg '(4)) t))
3204
3205 (defun ian-org-work-time ()
3206 (interactive)
3207 (save-excursion
3208 (set-buffer "t.org")
3209 (goto-char (org-find-entry-with-id "ian-identifier-1"))
3210 (org-clock-in)))
3211
3212 (defun ian-org-idle-time ()
3213 (interactive)
3214 (save-excursion
3215 (goto-char (org-find-entry-with-id "ian-identifier-2"))
3216 (set-buffer "t.org")
3217 (org-clock-in)))
3218
3219
3220
3221 ;; based on http://stackoverflow.com/questions/3758139/variable-pitch-for-org-mode-fixed-pitch-for-tables
3222 ;; keywords: proportional font, monospace
3223
3224 (defun variable-pitch-on ()
3225 (variable-pitch-mode 1))
3226 (add-hook 'fundamental-mode-hook 'variable-pitch-on)
3227 (add-hook 'org-mode-hook 'variable-pitch-on)
3228 (add-hook 'text-mode-hook 'variable-pitch-on)
3229
3230 (set-face-attribute 'org-table nil :family (face-attribute 'fixed-pitch :family))
3231 (set-face-attribute 'org-code nil :family (face-attribute 'fixed-pitch :family))
3232 (set-face-attribute 'org-formula nil :family (face-attribute 'fixed-pitch :family))
3233 (set-face-attribute 'org-link nil :family (face-attribute 'fixed-pitch :family))
3234 (set-face-attribute 'org-block nil :family (face-attribute 'fixed-pitch :family))
3235 (set-face-attribute 'org-date nil :family (face-attribute 'fixed-pitch :family))
3236
3237
3238 (defun remove-org-binds ()
3239 (define-key org-mode-map (kbd "<M-return>") nil)
3240 (define-key org-mode-map (kbd "C-'") nil)
3241 (define-key org-mode-map (kbd "C-y") nil)
3242 (define-key org-mode-map (kbd "<C-return>") nil)
3243 (define-key org-mode-map (kbd "<C-M-kp-enter>") nil)
3244 (define-key org-mode-map (kbd "C-,") nil)
3245 (define-key org-mode-map (kbd "C-M-m") nil)
3246 (define-key org-mode-map (kbd "C-k") nil)
3247 (define-key org-mode-map (kbd "C-j") nil)
3248 (define-key org-mode-map (kbd "C-M-i") nil)
3249 (define-key org-mode-map (kbd "C-M-t") nil)
3250 (define-key org-mode-map (kbd "M-a") 'nil)
3251 (define-key org-mode-map (kbd "C-a") nil)
3252 (define-key org-mode-map (kbd "M-e") nil)
3253 (define-key org-mode-map (kbd "C-e") nil)
3254 (define-key org-mode-map (kbd "C-3") nil)
3255 (define-key org-mode-map (kbd "<M-left>") nil)
3256 (define-key org-mode-map (kbd "<M-right>") nil)
3257 (define-key org-mode-map (kbd "<S-return>") nil)
3258 (define-key org-mode-map (kbd "<tab>") nil)
3259 (define-key org-mode-map (kbd "<C-S-down>") nil)
3260 (define-key org-mode-map (kbd "<C-S-up>") nil)
3261 (define-key org-mode-map (kbd "<S-down>") nil)
3262 (define-key org-mode-map (kbd "<S-up>") nil)
3263 (define-key org-mode-map "\t" nil))
3264 (add-hook 'org-mode-hook 'remove-org-binds)
3265
3266 #+end_src
3267
3268
3269 * org drill
3270
3271
3272 #+begin_src emacs-lisp :tangle no
3273
3274 (setq
3275 ;; account actual time, not just scheduled time
3276 org-drill-adjust-intervals-for-early-and-late-repetitions-p t
3277
3278 ;; still show leeches, but warn
3279 org-drill-leech-method (quote warn)
3280 ;; increased from default 20
3281 org-drill-maximum-duration 60
3282 ;; especially when starting, I want to drill hard
3283 org-drill-maximum-items-per-session nil
3284 ;; don't prompt to save buffer, auto-save will do that
3285 org-drill-save-buffers-after-drill-sessions-p nil
3286 ;; this one deals with varying difficulty items better
3287 ;; sm2 is similar, but more simplistic
3288 org-drill-spaced-repetition-algorithm (quote simple8)
3289 )
3290 #+end_src
3291 ;; todo, make the prompting text reflect this number.
3292 ;; org-drill-failure-quality
3293
3294 * os specific settings
3295
3296 disabled cuz I have none yet
3297 #+begin_src emacs-lisp :tangle no
3298 (cond ((eq system-type 'darwin))
3299 ((eq system-type 'gnu/linux))
3300 ((eq system-type 'windows-nt))
3301 (t ))
3302 #+end_src
3303
3304
3305 * prog-mode-defaults
3306
3307 #+begin_src emacs-lisp
3308
3309
3310 (defun prog-mode-defaults ()
3311 "Default coding hook, useful with any programming language."
3312 ;; so that I can do completion before the dialog pops up
3313 (local-set-key (kbd "<tab>") 'auto-complete)
3314 ;; todo, this is causing error message on loading file, prolly not working
3315 ;;(flycheck-mode +1)
3316 (setq ac-sources (delq 'ac-source-dictionary ac-sources))
3317 (highlight-symbol-mode)
3318 (make-local-variable 'column-number-mode)
3319 ;; this says do autofilling using newcomment.el. The "only" is a misnomer.
3320 (set (make-local-variable 'comment-auto-fill-only-comments) t)
3321 (column-number-mode t)
3322 (turn-on-smartparens-mode)
3323
3324 ;; prettify lambdas
3325 (font-lock-add-keywords
3326 nil `(("(\\(lambda\\>\\)"
3327 (0 (progn (compose-region (match-beginning 1) (match-end 1)
3328 ,(make-char 'greek-iso8859-7 107))
3329 nil))))))
3330 (add-hook 'prog-mode-hook 'prog-mode-defaults)
3331
3332 ;; enable flyspell in prog mode. text mode is handled
3333 (add-hook 'prog-mode-hook 'flyspell-prog-mode)
3334
3335
3336
3337 #+end_src
3338
3339 ** yank auto-indent
3340 #+begin_src emacs-lisp
3341 ;; automatically indenting yanked text if in programming-modes
3342 (defvar yank-indent-modes
3343 '(LaTeX-mode TeX-mode)
3344 "Modes in which to indent regions that are yanked (or yank-popped).
3345 Only modes that don't derive from `prog-mode' should be listed here.")
3346
3347 (defvar yank-indent-blacklisted-modes
3348 '(python-mode slim-mode haml-mode)
3349 "Modes for which auto-indenting is suppressed.")
3350
3351 (defvar yank-advised-indent-threshold 2000
3352 "Threshold (# chars) over which indentation does not automatically occur.")
3353
3354 (defun yank-advised-indent-function (beg end)
3355 "Do indentation, as long as the region isn't too large."
3356 (if (<= (- end beg) yank-advised-indent-threshold)
3357 (indent-region beg end nil)))
3358
3359 (defadvice yank (after yank-indent activate)
3360 "If current mode is one of 'yank-indent-modes,
3361 indent yanked text (with prefix arg don't indent)."
3362 (if (and (not (ad-get-arg 0))
3363 (not (member major-mode yank-indent-blacklisted-modes))
3364 (or (derived-mode-p 'prog-mode)
3365 (member major-mode yank-indent-modes)))
3366 (let ((transient-mark-mode nil))
3367 (yank-advised-indent-function (region-beginning) (region-end)))))
3368
3369 (defadvice yank-pop (after yank-pop-indent activate)
3370 "If current mode is one of 'yank-indent-modes,
3371 indent yanked text (with prefix arg don't indent)."
3372 (if (and (not (ad-get-arg 0))
3373 (not (member major-mode yank-indent-blacklisted-modes))
3374 (or (derived-mode-p 'prog-mode)
3375 (member major-mode yank-indent-modes)))
3376 (let ((transient-mark-mode nil))
3377 (yank-advised-indent-function (region-beginning) (region-end)))))
3378
3379 #+end_src
3380
3381
3382 * shell mode
3383 #+begin_src emacs-lisp
3384 ;; avoid stupid git crap like "warning, terminal not fully functional"
3385 (setenv "PAGER" "cat")
3386 ;; don't store successive duplicates in comint command history
3387 (setq comint-input-ignoredups t)
3388
3389 (defun add-mode-line-dirtrack ()
3390 (add-to-list 'mode-line-buffer-identification
3391 '(:propertize (" " default-directory " ") face dired-directory)))
3392 (add-hook 'shell-mode-hook 'add-mode-line-dirtrack)
3393
3394
3395 ;; don't fully understand it, but it works.
3396 ;; http://www.emacswiki.org/emacs/ShellDirtrackByProcfs
3397 (defun track-shell-directory/procfs ()
3398 (shell-dirtrack-mode 0)
3399 (add-hook 'comint-preoutput-filter-functions
3400 (lambda (str)
3401 (prog1 str
3402 (when (string-match comint-prompt-regexp str)
3403 (cd (file-symlink-p
3404 (format "/proc/%s/cwd" (process-id
3405 (get-buffer-process
3406 (current-buffer)))))))))
3407 nil t))
3408 (setq comint-buffer-maximum-size 100000)
3409 (add-to-list 'comint-output-filter-functions 'comint-truncate-buffer)
3410 (defun new-shell ()
3411 (interactive)
3412 (shell (generate-new-buffer-name "*shell*")))
3413 ;;
3414 (defun shell-wrap (prefix)
3415 "wrap the shell function, automatically generate a new name for a prefix arg"
3416 (interactive "P")
3417 (if prefix
3418 (new-shell)
3419 (shell)))
3420
3421 (add-hook 'shell-mode-hook 'track-shell-directory/procfs)
3422 #+end_src
3423 * smartparens
3424 the melpa git version had a catastrophic bug I reported.
3425 downgraded to marmalade version and everything is working fine.
3426 #+begin_src emacs-lisp
3427 (require 'smartparens-config)
3428 (show-smartparens-global-mode t)
3429
3430
3431 (defun gp/sp/pair-on-newline-and-indent (id action context)
3432 "Open a new brace or bracket expression, with relevant newlines and indent. "
3433 (save-excursion
3434 (newline)
3435 (indent-according-to-mode))
3436 (indent-according-to-mode))
3437
3438 ;; when opening a pair, and then inserting a newline, push the closing pair to another newline
3439 (sp-pair "{" nil :post-handlers
3440 '(:add ((lambda (id action context)
3441 (gp/sp/pair-on-newline-and-indent id action context)) (kbd "<return>"))))
3442 (sp-pair "[" nil :post-handlers
3443 '(:add ((lambda (id action context)
3444 (gp/sp/pair-on-newline-and-indent id action context)) (kbd "<return>"))))
3445
3446
3447 ;; in my version, this is not a pairing.
3448 ;; not sure if it is in a future version since I reverted to marmalade
3449 ;; Don't need c-comments in strings -- they frustrate filename globs
3450 ;; (sp-pair "/*" nil :unless '(sp-in-string-p))
3451
3452 ;; Don't need quotes to pair next to words
3453 (sp-pair "\"" nil :unless '(sp-point-before-word-p sp-point-after-word-p))
3454 (sp-pair "'" nil :unless '(sp-point-before-word-p sp-point-after-word-p))
3455
3456
3457 ;; todo, testout these mode specific settings from graphene.
3458 ;; Ruby-specific pairs and handlers
3459 (require 'smartparens-ruby)
3460
3461 ;; Markdown
3462 (sp-local-pair '(markdown-mode gfm-mode) "*" "*"
3463 :unless '(sp-in-string-p)
3464 :actions '(insert wrap))
3465
3466 ;; Except in HTML
3467 (sp-local-pair 'html-mode "\"" nil :unless '(:rem sp-point-after-word-p))
3468
3469
3470 #+end_src
3471 * smex
3472 todo; check out smex-show-unbound-commands shows frequently used commands that have no key bindings.
3473 #+begin_src emacs-lisp
3474 ; these must be before smex-initialize
3475 (setq
3476 smex-save-file "~/.emacs.d/.smex-items")
3477
3478 (smex-initialize)
3479 #+end_src
3480 * speedbar
3481 (sr-speedbar-close)
3482 (sr-speedbar-open)
3483
3484 ** todo, disabled cuz of broken package
3485 #+begin_src emacs-lisp :tangle no
3486 (require 'sr-speedbar)
3487 (setq speedbar-hide-button-brackets-flag t ;; didn't notice a diff
3488 speedbar-file-unshown-regexp "flycheck-.*"
3489 sr-speedbar-width 40
3490 sr-speedbar-width-x 40
3491 sr-speedbar-auto-refresh nil
3492 sr-speedbar-skip-other-window-p t
3493 sr-speedbar-right-side nil
3494 speedbar-hide-button-brackets-flag nil)
3495 #+end_src
3496 * spell correction
3497 #+begin_src emacs-lisp
3498 (setq
3499 ispell-program-name "hunspell"
3500 ispell-silently-savep t) ; don't prompt to save personal dictionary
3501
3502 (require 'rw-hunspell)
3503 #+end_src
3504 rw-hunspell sets up hunspell dictionary automagically.
3505
3506
3507 Rant: Hunspell SHOULD be standard. its used by firefox and openoffice and
3508 osx. In contrast, the first few words I added to aspell dictionary were
3509 "emacs" "customizable" and "timestamp". Hunspell already has those,
3510 thank god.
3511
3512 ispell-personal-dictionary does not document where the hunspell
3513 dictionary goes by default, but it is ~/.hunspell_en_US for me
3514
3515
3516 * tex
3517 #+begin_src emacs-lisp
3518 (setq-default TeX-PDF-mode t) ; use pdf
3519
3520 ; more sensible defaults based on info manual quickstart
3521 (setq TeX-auto-save t)
3522 (setq TeX-parse-self t)
3523
3524
3525 #+end_src
3526 * undo tree
3527 #+begin_src emacs-lisp
3528
3529 ;; undo-tree checks for minor modes which override
3530 ;; its minor mode keymap, and sets global keybinds if
3531 ;; that happens. this will prevent that, but I have no
3532 ;; reason to do that, so it is commented.
3533 ;; (defun undo-tree-overridden-undo-bindings-p () nil)
3534
3535 ;; todo, send patch undo-tree-visualize should scroll with the scroll key, instead of just pgup pgdn (aka next/prior)
3536 (global-undo-tree-mode)
3537 ;; disabled due to bug, something like unknown entry in undo tree canary
3538 ;; (setq undo-tree-auto-save-history t)
3539 (setq undo-outer-limit 100000000 ; per undo command
3540 undo-limit 500000000 ; undo history limit
3541 undo-strong-limit 600000000) ; undo history limit plus some extra
3542
3543
3544 #+end_src
3545
3546 * visible mark mode
3547
3548 these colors were better for dark theme
3549 #+begin_src emacs-lisp :tangle no
3550
3551
3552
3553 (defface visible-mark-face1
3554 '((((type tty) (class mono)))
3555 (t (:background "LimeGreen"))) "")
3556 (defface visible-mark-face2
3557 '((((type tty) (class mono)))
3558 (t (:background "red4"))) "")
3559 (defface visible-mark-forward-face1
3560 '((((type tty) (class mono)))
3561 (t (:background "dark magenta"))) "")
3562 (defface visible-mark-active
3563 '((((type tty) (class mono)))
3564 (t (:background "gold"))) "")
3565 (defface mouse-cursor-face
3566 '((((type tty) (class mono)))
3567 (t (:background "DeepPink1"))) "")
3568
3569 #+end_src
3570
3571
3572 #+begin_src emacs-lisp
3573
3574 (add-to-list 'load-path "~/.emacs.d/src/visible-mark")
3575
3576 ;; since it is not easy to change the mark overlay priority, I change this one.
3577 (setq show-paren-priority 999)
3578
3579
3580 (defface visible-mark-active
3581 '((((type tty) (class mono)))
3582 (t (:background "magenta"))) "")
3583
3584
3585
3586 (defface mouse-cursor-face
3587 '((((type tty) (class mono)))
3588 (t (:background "DeepPink1"))) "")
3589
3590
3591 (require 'visible-mark)
3592
3593 (setq visible-mark-faces '(visible-mark-face1 visible-mark-face2))
3594 (setq visible-mark-forward-faces '(visible-mark-forward-face1))
3595
3596
3597 ; highlight the last 2 marks
3598 (setq visible-mark-max 2)
3599 ; highlight 1 forward mark
3600 (setq visible-mark-forward-max 1)
3601 ; globally activate visible-mark-mode
3602 (global-visible-mark-mode +1)
3603
3604
3605 ;; todo, it doesn't seem to be exposed in elisp, but it would be nice
3606 ;; if I could define overlay faces to use inverse foreground color
3607
3608
3609 #+end_src
3610
3611 #+RESULTS:
3612 : t
3613
3614 * zrc
3615 #+begin_src emacs-lisp
3616 (require 'znc)
3617 ;; from https://www.emacswiki.org/emacs/ErcSound
3618 (defun erc-my-privmsg-sound (proc parsed)
3619 (let* ((tgt (car (erc-response.command-args parsed)))
3620 (privp (erc-current-nick-p tgt)))
3621 (and
3622 privp
3623 (start-process-shell-command "ignoreme" nil "mpv --no-terminal --vo=null --volume=25 /a/bin/data/bird.mp3")
3624 ;; We must return nil. See help for `erc-server-PRIVMSG-functions'
3625 nil)))
3626 (add-hook 'erc-server-PRIVMSG-functions
3627 'erc-my-privmsg-sound)
3628
3629 (defun erc-sound-if-not-server (match-type nickuserhost msg)
3630 (unless (string-match "Server:[0-9]+" nickuserhost)
3631 (start-process-shell-command "ignoreme" nil "mpv --no-terminal --vo=null /a/bin/data/bird.mp3")))
3632 (add-hook 'erc-text-matched-hook 'erc-sound-if-not-server)
3633
3634 (erc-track-mode 1)
3635 (setq
3636 ;; consider invisible frames to be unseen. seems like an obvious default
3637 erc-track-visibility 'visible
3638 ;; switch to buffer where i've been mentioned, etc instead of oldest
3639 erc-track-switch-direction 'importance)
3640
3641 #+end_src
3642
3643
3644 * key binds. keep at end of file
3645 this should come at the end because it depends on key maps being
3646 created in earlier sections.
3647
3648 ** emacs keys notes
3649 commands not needed in ido mode and their replacement in ido mode
3650 spell check fix -> use current pattern and start new one
3651 narrow -> create subdirectory
3652 org-cycle -> M-s search recently used directory
3653 vert split Window -> create file instead of select match
3654 delete-other-windows -> open dired buffer
3655 delete current window -> delete buffer/file
3656 find file -> search within all subdirectories
3657
3658 forward/back error
3659
3660 buffer select -> toggle find file / buffer
3661 up/down -> next/previous history
3662 forward/back -> ido-forward/back
3663
3664
3665 right keyboard attributes: movement, involve typing words
3666 left keyboard attributes: non-typing universal non-movement
3667
3668
3669
3670
3671 todo
3672 fix global unpop mark ring
3673 setup helm
3674 learn cedet and projectile and helm
3675 setup key for pop-global-mark
3676 try out C-M-\ indent region
3677 set quoted insert to some obscure keybind
3678 make currently overrided M-u uppercase word into something obscure
3679 remember mode
3680 bind shell-command to something better
3681 investigate tags
3682 investigate keys in isearch mode and find file mode
3683 try out occur. M-s o
3684 investigate programming modes. M-g n/b next/previous error. gdb?
3685 investigate org mode keys
3686 learn version control
3687 learn mail
3688 check out imenu
3689 bind capitalize-word to something obscure
3690 sentance/paragraph movement/marking should be swapped with sexp/paren movement based on mode
3691 bind fill-paragraph to something obscure
3692 setup linewise paste
3693 install magit (git control)
3694 magpie expansion provides a completion key for acronym expansion based on buffer text
3695 learn ediff
3696 universal google
3697 figure out auto-indent
3698 learn eshell and prelude settings for it
3699 combine register prefix and c-x prefix
3700 note: remember to think of mouse & foot pedals
3701 commands to change: select other window: C-x o.
3702 ** prefix keybind changes
3703 #+begin_src emacs-lisp
3704
3705
3706 ; prefix key binds.
3707 ; good info http://www.masteringemacs.org/articles/2011/02/08/mastering-key-bindings-emacs/
3708 ; rebinding the prefix keys are tricky. apparently, some modes ignore any redefinition of a prefix key and use it explicitly,
3709 ; so you have to dig into their key maps and redo things.
3710 ; There are 2 simpler alternatives which have their own downsides.
3711 ; One is cua mode, which I do not like because it smashes 2 keybinds onto 1 and limits what you can do.
3712 ; The other is keyboard-translate, which translates the key presses before anything else.
3713 ; The downside is that it translates them when you aren't using them as a prefix.
3714 ; Since the swaps I'm using are all very accessible, the only downside is some mental jugling when reading docs etc about these keybinds.
3715
3716 ; I've seen this as an another suggestion, it was a total fail. The prefix command took over both keys.
3717 ; (define-key key-translation-map [f12] "\C-c")
3718 ; (define-key key-translation-map "\C-c" [left])
3719
3720
3721 ;idea to remove the hook later since it is only needed at startup.
3722 ; did not work however, and there is not a real need to fix it, so I did not investigate
3723 ;(defun removeSwapHook ()
3724 ; (remove-hook 'buffer-list-update-hook 'myKeySwap)
3725 ; (remove-hook 'change-major-mode-hook 'removeSwapHook))
3726 ;(add-hook 'change-major-mode-hook 'removeSwapHook)
3727
3728
3729 ; went through almost all the relevant standard hooks,
3730 ; this overcomes a known bug that (keyboard-translate) does not get applied when running emacs daemon
3731 (add-hook 'buffer-list-update-hook (lambda () (interactive)
3732 (keyboard-translate ?\C-x ?\C-s)
3733 (keyboard-translate ?\C-s ?\C-x)
3734 (keyboard-translate ?\C-c ?\C-d)
3735 (keyboard-translate ?\C-d ?\C-c)))
3736
3737
3738
3739 ; these all don't work
3740 ; don't know why this doesn't error but reversing the keys does
3741 ;(keyboard-translate ?\t ?\M-\t)
3742 ;(keyboard-translate [M-tab] [tab])
3743 ; from what i can tell, it wants to use a keyboard-translate-table,
3744 ; which is a char table, which is a vector indexed by chars,
3745 ; and mod+tab is not a char (it has too many bits), it is an integer
3746 ; it actually says it can hold vectors or strings, but that it is obsolete to do so
3747 ;(characterp ?\M-a)
3748 ;(characterp ?\C-a)
3749
3750
3751
3752 #+end_src
3753
3754 ** named commands
3755 *** gdb
3756 gdb-many-windows
3757 *** tramp sudo
3758 /ssh:host|sudo:host:
3759 when in the same session, you can then do:
3760 /sudo:root@host:
3761
3762 *** org insert table row
3763 [org-shiftmetadown/up]
3764 *** toggle line continuation / truncation / wrap
3765 toggle-truncate-lines
3766 *** auto-save on/off
3767 my-as-on/my-as-off
3768 *** toggle menu bar
3769 menu-bar-mode
3770 *** show abbreviations
3771 list-abbrevs
3772
3773 *** rename-file-and-buffer
3774 *** ediff-buffers
3775 *** refill-mode
3776 automatically balance a paragraph with newlines
3777 *** executable-make-buffer-file-executable-if-script-p
3778 make a script executable
3779 *** (setq lazy-highlight-cleanup nil)
3780 keep search highlight on after search is done
3781 *** auto-revert-tail-mode
3782 tail a file
3783 *** trash-file-and-buffer
3784 #+begin_src emacs-lisp
3785 (defun trash-file-and-buffer ()
3786 "Removes file connected to current buffer and kills buffer."
3787 (interactive)
3788 (let ((filename (buffer-file-name))
3789 (buffer (current-buffer))
3790 (name (buffer-name)))
3791 (if (not (and filename (file-exists-p filename)))
3792 (error "Buffer '%s' is not visiting a file!" name)
3793 (delete-file filename)
3794 (kill-buffer buffer)
3795 (message "File '%s' successfully removed" filename))))
3796
3797 #+end_src
3798 *** what-line
3799 *** linum-mode
3800 line numbers
3801
3802 *** sgml-pretty-print
3803 format xml in nxml-mode
3804 *** visual-line-mode
3805 toggle word wrap.
3806 ** compound commands
3807 *** C-xc
3808 exit0
3809 *** C-x s
3810 save file
3811 *** C-x e
3812 eval last sexp
3813 *** C-x u
3814 [undo-tree-visualize]
3815 *** C-j u/U
3816 [undo-tree save/restore state via register]
3817 *** C-c -
3818 [org insert table horizontal line or create list]
3819 *** C-x tab
3820 indent/dedent region
3821
3822 [shift-left and shift-right are default for indenting by tab stop,
3823 and they are only defined as lambdas so I copy them here
3824 to use with up and down.
3825 #+begin_src emacs-lisp
3826 ;; condition cuz emacs24 release doesn't have this yet
3827 (when (boundp 'indent-rigidly-map)
3828 (define-key indent-rigidly-map (kbd "<C-left>")
3829 (lambda (beg end) (interactive "r")
3830 (let* ((current (indent-rigidly--current-indentation beg end))
3831 (next (indent--next-tab-stop current)))
3832 (indent-rigidly beg end (- next current)))))
3833
3834 (define-key indent-rigidly-map (kbd "<C-right>")
3835 (lambda (beg end) (interactive "r")
3836 (let* ((current (indent-rigidly--current-indentation beg end))
3837 (next (indent--next-tab-stop current 'prev)))
3838 (indent-rigidly beg end (- next current))))))
3839 #+end_src
3840 *** C-x *
3841 [calc-dispatch]
3842 *** C-x =
3843 [point information]
3844 *** C-x d
3845 [dired]
3846 *** C-xb
3847 [ibuffer]
3848 #+begin_src emacs-lisp
3849 (global-set-key (kbd "C-x C-b") 'ibuffer)
3850 #+end_src
3851
3852 *** C-x r c
3853 rectangular clear, replace area with whitespace
3854 ** gnus
3855 searching overview.
3856 3 types:
3857 ingroup searching
3858 nnir searching with notmuch, specific group (not sure if it can do multiple)
3859 search all groups with mairix
3860 *** a]
3861 compose new message
3862 *** C-c C-c]
3863 send message
3864 *** s]
3865 save newsrc file, alterations to groups.
3866 *** g]
3867 gnus refresh / get new
3868 *** m]
3869 gnus new message
3870 *** F]
3871 gnus quoted reply all
3872 *** e]
3873 gnus draft edit message
3874 *** delete]
3875 gnus delete draft
3876 #+begin_src emacs-lisp
3877 (add-hook 'gnus-startup-hook
3878 (lambda ()
3879 (define-key gnus-summary-mode-map (kbd "<delete>") 'gnus-summary-delete-article)))
3880 #+end_src
3881
3882 *** b]
3883 mairix search
3884 #+begin_src emacs-lisp
3885 (add-hook 'gnus-startup-hook
3886 (lambda ()
3887 (define-key gnus-group-mode-map "b" 'nnmairix-search)
3888 (define-key gnus-summary-mode-map "b" 'nnmairix-search)))
3889 #+end_src
3890 *** B m]
3891 move message, or messages in region
3892 *** #]
3893 mark article, move with B m
3894 *** B delete]
3895 gnus delete draft
3896 *** / plus x a / b]
3897 search current group (or see info manual for more groups),
3898 using the gnus native search (its slow, do a notmuch or mairix search instead)
3899 x= extra (ie. to)
3900 todo; send in patch to make author search to in sent folder
3901 a = author
3902 / = subject
3903 b = body
3904 see C-h m for a full list
3905 *** G G ]
3906 do a nnir notmuch search, for the group on the current line
3907 *** A T ]
3908 jump to thread from nnir group
3909
3910 *** marks]
3911 ! = saved for later
3912 E = expired
3913 M-& apply process mark to a non-process mark command
3914 *** S D e]
3915 edit as new
3916 *** T k / C-M-k
3917 maybe rebind this to a shorter keybind, like del
3918 gnus-summary-kill-thread
3919 ** message mode
3920 *** C-ck]
3921 discard message
3922 ** notmuch
3923 *** space]
3924 notmuch advance to next message/thread
3925
3926 ** readline / bash / .inputrc
3927 *** C-m
3928 [--------]
3929 #+begin_src emacs-lisp
3930 (add-hook 'comint-mode-hook
3931 (lambda ()
3932 (define-key comint-mode-map "\C-m" nil)))
3933 #+end_src
3934 terminal crap, duplicate of enter
3935
3936 ** isearch
3937 *** C-w
3938 paste word/char under cursor into isearch
3939 *** M-n/p
3940 next/previous isearch history
3941 *** C-o
3942 isearch-occur
3943 Activate occur easily inside isearch
3944 from starter-kit
3945 #+begin_src emacs-lisp
3946 (define-key isearch-mode-map (kbd "C-o")
3947 (lambda () (interactive)
3948 (let ((case-fold-search isearch-case-fold-search))
3949 (occur (if isearch-regexp
3950 isearch-string
3951 (regexp-quote isearch-string))))))
3952 #+end_src
3953 *** m-r
3954 #+begin_src emacs-lisp
3955 (defun my-isearch-toggle-regexp ()
3956 (interactive)
3957 (isearch-toggle-regexp)
3958 (cond (isearch-regexp
3959 (global-set-key (kbd "C-r") 'isearch-backward-regexp)
3960 (define-key global-map (kbd "<f12>") 'isearch-forward-regexp)
3961 (define-key global-map (kbd "<kp-add>") 'isearch-forward-regexp))
3962 (t
3963 (global-set-key (kbd "C-r") 'isearch-backward)
3964 (define-key global-map (kbd "<f12>") 'isearch-forward)
3965 (define-key global-map (kbd "<kp-add>") 'isearch-forward))))
3966 (define-key isearch-mode-map (kbd "M-r") 'my-isearch-toggle-regexp)
3967 #+end_src
3968
3969 ** icomplete
3970 *** C-. C-,
3971 icomplete-forward/backward-completions
3972
3973 ** info
3974 *** [, ]
3975 forward / previous node, descend/ascend tree as needed
3976 *** x
3977 Info-follow-nearest-node
3978 #+begin_src emacs-lisp
3979 (define-key Info-mode-map "x" 'Info-follow-nearest-node)
3980 #+end_src
3981 m, f, n, p or ^ command, depending on where you click.
3982 ** auto-complete
3983 *** S-return
3984 select next completion candidate
3985 ac-expand
3986 ** agenda
3987 *** t]
3988 agenda cycle todo state
3989 ** org
3990 *** C-c / t]
3991 make just todo items visible
3992 *** S-<tab>
3993 org-shifttab global visibility cycle / move table cell
3994 *** C-cs]
3995 schedule todo item
3996 *** C-cx p]
3997 org set property
3998 *** C-c -]
3999 org insert horizontal line
4000 *** C-cq]
4001 org tag
4002 ** calc
4003 i'd like to drill these sometime when I have space in my head, or I
4004 plan to use calc.
4005 *** space
4006 [enter input to the stack, or duplicate top stack item]
4007 *** C-M-i
4008 [cycle 3 elements on stack]
4009 *** tab
4010 [cycle 2 elements on stack]
4011 *** n
4012 [negate]
4013 *** _
4014 [begin negative number]
4015 *** /
4016 [reciprocal]
4017 *** x
4018 [calc named command]
4019 *** M-delete
4020 [delete 2nd from top of stack]
4021 *** C-u [-]0-9
4022 [0=whole stack, 1-9=that many, -1-9=that element]
4023 *** delete
4024 [remove from the top of the stack]
4025 *** '
4026 [algebraic mode. infix expressions are calculated when input to the stack]
4027 *** m a
4028 [auto algebraic mode]
4029 *** $,$$,$$$
4030 [top x of stack reference]
4031 *** s s/t/r/u
4032 [store to variable: store, top, retrieve, unstore. the quick variables 0-9 don't need s prefix]
4033 *** U/D
4034 [undo/redo]
4035 *** t p/n/]/y
4036 [trail prev/next/end/yankh]
4037 *** `
4038 [calc edit mode, to edit the top of stack]
4039
4040 ** single/special keys
4041 *** tab key
4042 isearch
4043 #+begin_src emacs-lisp
4044 (define-key isearch-mode-map (kbd "<tab>") 'isearch-query-replace)
4045 #+end_src
4046 *** tab
4047 isearch-forward
4048 #+begin_src emacs-lisp
4049 ;; explained in http://stackoverflow.com/questions/7411920/how-to-bind-search-and-search-repeat-to-c-f-in-emacs
4050 (global-set-key (kbd "<kp-add>") 'isearch-forward)
4051 (global-set-key (kbd "<f12>") 'isearch-forward)
4052 (define-key isearch-mode-map "\t" nil)
4053 (define-key isearch-mode-map (kbd "<kp-add>") 'isearch-repeat-forward)
4054 (define-key isearch-mode-map (kbd "<f12>") 'isearch-repeat-forward)
4055 ;; get rid of the standard completion binding, always use auto-complete
4056 ;; this didn't work very well
4057 ;;(global-set-key (kbd "TAB") 'auto-complete)
4058 (define-key global-map [remap completion-at-point] 'auto-complete)
4059
4060 #+end_src
4061
4062 *** end
4063 move-end-of-line
4064 #+begin_src emacs-lisp
4065 ;; taken from emacs wiki, along with home function
4066 ;; http://www.emacswiki.org/emacs/BackToIndentationOrBeginning
4067 (defun point-in-comment ()
4068 "Determine if the point is inside a comment"
4069 (interactive)
4070 (let ((syn (syntax-ppss)))
4071 (and (nth 8 syn)
4072 (not (nth 3 syn)))))
4073 (defun end-of-code-or-line (arg)
4074 "Move to end of line, or before start of comments depending on situation.
4075 Toggle back and forth positions if we are already at one.
4076 Comments are recognized in any mode that sets syntax-ppss
4077 properly."
4078 (interactive "P")
4079 (when (catch 'bol
4080 (let ((start (point))
4081 (bol (save-excursion
4082 (beginning-of-line)
4083 (point)))
4084 (eol (progn (move-end-of-line arg) (point))))
4085 (while (point-in-comment)
4086 (backward-char)
4087 (when (= (point) bol)
4088 (throw 'bol t)))
4089 (throw 'bol (and (not (= eol start)) (>= start (point))))))
4090 (move-end-of-line arg)))
4091
4092 (global-set-key (kbd "<end>") 'end-of-code-or-line)(add-hook 'org-mode-hook (lambda () (define-key org-mode-map (kbd "<end>") 'org-end-of-line)))
4093 #+end_src
4094
4095 *** home
4096 back-to-indentation
4097 #+begin_src emacs-lisp
4098 (defun back-to-indentation-or-beginning ()
4099 (interactive)
4100 (if (= (point) (progn (back-to-indentation) (point)))
4101 (if (derived-mode-p 'org-mode)
4102 (org-beginning-of-line)
4103 (beginning-of-line))))
4104 (global-set-key (kbd "<home>") 'back-to-indentation-or-beginning)
4105
4106 #+end_src
4107
4108 *** s-tab
4109 indent-buffer
4110 #+begin_src emacs-lisp
4111 (global-set-key (kbd "<S-iso-lefttab>") 'indent-buffer)
4112 #+end_src
4113 *** s-delete
4114 send-shell
4115 #+begin_src emacs-lisp
4116
4117 (global-set-key (kbd "<S-delete>") 'send-shell)
4118
4119 ;; optional variables used by send-shell
4120 (setq shell-send-yank-key nil)
4121
4122 (defun repeat-shell ()
4123 (interactive)
4124 "Repeat the last command in shell-mode, displaying the window if needed."
4125 (let ((shell-buffer (get-buffer "*shell*")))
4126 (if shell-buffer
4127 (buffer-window-show shell-buffer)
4128 (let ((original-buffer (current-buffer)))
4129 (funcall 'shell)
4130 (setq shell-buffer (current-buffer))
4131 (switch-to-buffer original-buffer)))
4132 (with-current-buffer shell-buffer
4133 (goto-char (point-max))
4134 (call-interactively 'comint-previous-input)
4135 ;; the t flag makes the buffer advance
4136 (comint-send-input nil t))))
4137
4138 (setq compilation-filenames '("Makefile" "makefile"))
4139
4140 (defun get-nearest-compilation-file ()
4141 "Search for the compilation file traversing up the directory tree."
4142 (interactive)
4143 (let ((dir default-directory)
4144 (parent-dir (file-name-directory (directory-file-name default-directory)))
4145 (nearest-compilation-file 'nil))
4146 (while (and (not (string= dir parent-dir))
4147 (not nearest-compilation-file))
4148 (dolist (filename compilation-filenames)
4149 (setq file-path (concat dir filename))
4150 (when (file-readable-p file-path)
4151 (setq nearest-compilation-file file-path)))
4152 (setq dir parent-dir
4153 parent-dir (file-name-directory (directory-file-name parent-dir))))
4154 nearest-compilation-file))
4155 (defun run ()
4156 (interactive)
4157 "call run-fun if it is set, else run make if there is a makefile,
4158 else save and repeat last shell command.
4159 run-fun is meant to store file local variables, which show how to
4160 do the main thing we want on this file, generally compile and
4161 run.
4162
4163 example of setting it in a file:
4164 ;; Local Variables:
4165 ;; run-fun: merge-test
4166 ;; End: "
4167 (basic-save-buffer)
4168 (if (and (boundp 'run-fun) run-fun)
4169 (funcall run-fun)
4170 (let ((makefile (get-nearest-compilation-file)))
4171 (if (and makefile (stringp mode-name) (string= mode-name "C/l"))
4172 (compile (format
4173 "make -f %s" (get-nearest-compilation-file)))
4174 (repeat-shell)))))
4175
4176
4177 (defun send-shell ()
4178 (interactive)
4179 (send-shell-buffer "*shell*" 'shell (kbd "C-v")))
4180
4181 (defun send-python ()
4182 (interactive)
4183 (send-shell-buffer "*Python*" 'py-shell (kbd "C-v")))
4184
4185
4186 (defun send-shell-buffer (buffer-name &optional init shell-send-yank-key)
4187 "Send current line or region to shell-mode buffer.
4188 When in shell-mode, copy the current line to the
4189 most recently visited visible window.
4190
4191 SHELL-SEND-YANK-KEY: key to use instead
4192 of yank to paste into recent window. This allows compatibility with
4193 modes like org-mode which have their own yank function."
4194 (if (string= (buffer-name) buffer-name)
4195 ;; this section is copied out of comint-send-input
4196 (progn
4197 (let ((proc (get-buffer-process (current-buffer))))
4198 (if (not proc) (user-error "Current buffer has no process")
4199 (widen)
4200
4201 (let* ((pmark (process-mark proc))
4202 (intxt (if (>= (point) (marker-position pmark))
4203 (progn (if comint-eol-on-send (end-of-line))
4204 (buffer-substring pmark (point)))
4205 (let ((copy (funcall comint-get-old-input)))
4206 (goto-char pmark)
4207 (insert copy)
4208 copy))))
4209
4210 (if (= (length intxt) 0)
4211 (kill-new (comint-previous-matching-input-string "." 1))
4212 (kill-new intxt)))))
4213 (kill-append "\n" nil)
4214 (select-window (previous-window nil nil 'visible))
4215 (if (and (boundp 'shell-send-yank-key) shell-send-yank-key)
4216 (call-interactively (global-key-binding shell-send-yank-key))
4217 (yank))
4218 (select-window (next-window nil nil 'visible)))
4219 (let (start end)
4220 (if mark-active
4221 (setq start (mark)
4222 end (point))
4223 (setq start (save-excursion (beginning-of-line) (point))
4224 end (save-excursion (end-of-line) (point)))
4225 (let (line-move-visual)
4226 (call-interactively 'next-line)))
4227 (send-comint-input buffer-name start end init))))
4228
4229 ;; supporting functions
4230 (defun send-comint-input (buffer-name start end &optional init)
4231 "Input the region to BUFFER-NAME, assuming it is a comint-derived buffer.
4232 Show BUFFER-NAME if it is not show.
4233 Call INIT if BUFFER-NAME does not exist."
4234 (let ((input (filter-buffer-substring start end)))
4235 (send-comint-string buffer-name input init)))
4236
4237 (defun send-comint-string (buffer-name string &optional init)
4238 "Input the string to BUFFER-NAME, assuming it is a comint-derived buffer.
4239 Show BUFFER-NAME if it is not show.
4240 Call INIT if BUFFER-NAME does not exist."
4241 (let ((buffer (get-buffer buffer-name)))
4242 (unless buffer
4243 (message "nobuffer")
4244 ;; save-excursion etc. don't work for (shell), so I do this instead
4245 (if init (let ((original-buffer (current-buffer)))
4246 (funcall init (and (boundp 'send-shell-buffer-name) send-shell-buffer-name))
4247 (switch-to-buffer original-buffer)
4248 (setq buffer (get-buffer buffer-name)))
4249 (error "No existing buffer found and no init function argument. ")))
4250 (buffer-window-show buffer)
4251 (with-current-buffer buffer
4252 (let ((proc (get-buffer-process buffer)))
4253 (goto-char (process-mark proc))
4254 (insert string)
4255 (comint-send-input nil t)))))
4256
4257 (defun buffer-window-show (&optional buffer action)
4258 "Like temp-buffer-window-show, but removed stuff
4259 relevant to it being temp or help."
4260 (let (window frame)
4261 (with-current-buffer buffer
4262 (when (let ((window-combination-limit
4263 ;; When `window-combination-limit' equals
4264 ;; `temp-buffer' or `temp-buffer-resize' and
4265 ;; `temp-buffer-resize-mode' is enabled in this
4266 ;; buffer bind it to t so resizing steals space
4267 ;; preferably from the window that was split.
4268 (if (or (eq window-combination-limit 'temp-buffer)
4269 (and (eq window-combination-limit
4270 'temp-buffer-resize)
4271 temp-buffer-resize-mode))
4272 t
4273 window-combination-limit)))
4274 ;; debug
4275 ;;(message "window-combination-limit")
4276 ;;(print window-combination-limit)
4277 (setq window (display-buffer buffer action)))
4278 (setq frame (window-frame window))
4279 (unless (eq frame (selected-frame))
4280 (raise-frame frame))
4281 (setq minibuffer-scroll-window window)
4282 (set-window-hscroll window 0)
4283 ;; Return the window.
4284 window))))
4285
4286
4287 ;; when poping help, etc, allow reusing a window in a different frame if it is visible
4288 ;; figured this out after spending quite a while reading doc string for display-buffer
4289 ;; which is the main function which uses this.
4290 ;; it will use other vars or its arg to override this,
4291 ;; but those things are often nil.
4292 ;; aha moments in reading it: ACTION = (FUNCTION-or-FUNCTIONLIST ALIST)
4293 ;; FRAME adds an association to ACTION's alist, but it's not used if ACTION arg is nil.
4294 (setq display-buffer-fallback-action `(,(car display-buffer-fallback-action) . '(reusable-frames . visible)))
4295 ;; stop splitting windows verticallly when I open a buffer or shell
4296 (setq split-height-threshold nil)
4297 #+end_src
4298
4299 *** s-left arrow
4300 shell
4301 #+begin_src emacs-lisp
4302 (global-set-key (kbd "<S-kp-equal>") 'shell-wrap)
4303 (global-set-key (kbd "<S-left>") 'shell-wrap)
4304 #+end_src
4305 *** s-right arrow
4306 previous-buffer
4307 #+begin_src emacs-lisp
4308 (global-set-key (kbd "<S-kp-divide>") 'previous-buffer)
4309 #+end_src
4310 *** esc
4311 *** return
4312 new line
4313
4314 #+begin_src emacs-lisp
4315 ;; todo, this doesn't set the keybind for the help minibuffer
4316
4317
4318 (global-set-key (kbd "\r") 'indent-new-comment-line)
4319
4320 ;; don't use enter for autocomplete, we use tab or something
4321 (define-key ac-completing-map (kbd "<return>") nil)
4322 (define-key ac-completing-map "\r" nil)
4323
4324 (add-hook 'org-mode-hook
4325 (lambda ()
4326 ;; copied from org-mode, replace org-enter with org-enter-indent
4327 (org-defkey org-mode-map "\C-m" 'org-return-indent)))
4328
4329
4330 (add-hook 'comint-mode-hook
4331 (lambda ()
4332 (define-key comint-mode-map "\r" nil)
4333 (define-key comint-mode-map (kbd "<return>") 'comint-send-input)))
4334
4335 (add-hook 'comint-mode-hook
4336 (lambda ()
4337 (define-key comint-mode-map "\C-m" nil)
4338 (define-key comint-mode-map "\C-d" nil)))
4339
4340 #+end_src
4341
4342 *** s-return
4343 auto-correct-prev-word
4344 #+begin_src emacs-lisp
4345 (global-set-key (kbd "<S-return>") 'flyspell-auto-correct-previous-word)
4346 #+end_src
4347
4348 *** down arrow
4349 mark
4350 #+begin_src emacs-lisp
4351 (global-set-key (kbd "<kp-enter>") 'set-mark-command)
4352 #+end_src
4353 *** s-down arrow
4354 extended command
4355 #+begin_src emacs-lisp
4356 (global-set-key (kbd "<S-kp-enter>") 'smex)
4357 #+end_src
4358 *** s-up arrow
4359
4360 ** mouse
4361 *** mouse-2 mode line
4362 mouse-delete-other-windows
4363 *** C-mouse-2 mode line
4364 mouse-split-window-horizontally
4365 *** M-mouse-2 mode line
4366 *** S-mouse-2 mode line
4367 *** C-M-mouse-2 mode line
4368 *** C-S-mouse2 mode line
4369 *** mouse-3 mode line
4370 mouse-delete-window
4371 *** C-mouse-3 mode line
4372 *** M-mouse-3 mode line
4373 *** S-mouse-3 mode line
4374 *** C-M-mouse-3 mode line
4375 *** C-S-mouse-3 mode line
4376 *** mouse-1
4377 set cursor/mark
4378 *** C-mouse-1
4379 buffer list context menu
4380 *** M-mouse-1
4381 *** S-mouse-1
4382 *** C-M-mouse-1
4383 *** C-S-mouse-1
4384 *** mouse-2
4385 paste
4386 *** C-mouse-2
4387 *** M-mouse-2
4388 *** S-mouse-2
4389 *** C-M-mouse-2
4390 *** C-S-mouse-2
4391 *** mouse-3
4392 set-mark
4393 #+begin_src emacs-lisp
4394 (define-key global-map [down-mouse-3] 'mouse3-func)
4395 (global-set-key [mouse-3] 'mouse3-set-mark)
4396 (global-set-key [drag-mouse-3] 'mouse3-set-mark)
4397 #+end_src
4398 *** C-mouse-3
4399 global menu
4400 *** M-mouse-3
4401 *** S-mouse-3
4402 *** C-M-mouse-3
4403 *** C-S-mouse-3
4404 *** mouse-9
4405 move-mouse-to-point
4406 #+begin_src emacs-lisp
4407 (global-set-key (kbd "<mouse-6>") 'move-mouse-to-point)
4408 #+end_src
4409 *** C-mouse-9
4410 *** M-mouse-9
4411 *** S-mouse-9
4412 *** C-M-mouse-9
4413 *** C-S-mouse-9
4414 *** mouse-8
4415 *** C-mouse-8
4416 *** M-mouse-8
4417 *** S-mouse-8
4418 *** C-M-mouse-8
4419 *** C-S-mouse-8
4420 *** 1/kp-end
4421 *** C-1/kp-end
4422 *** M-1/kp-end
4423 *** S-1/kp-end
4424 *** C-M-1/kp-end
4425 *** C-S-1/kp-end
4426 *** 2/kp-down
4427 *** C-2/kp-down
4428 *** M-2/kp-down
4429 smex
4430 #+begin_src emacs-lisp
4431 ;; for when we have a standard keyboard which is not remapped
4432 (global-set-key (kbd "M-2") 'smex)
4433
4434 #+end_src
4435
4436 *** S-2/kp-down
4437 *** C-M-2/kp-down
4438 *** C-S-2/kp-down
4439 *** 3/kp-next
4440 *** C-3/kp-next
4441 *** M-3/kp-next
4442 *** S-3/kp-next
4443 *** C-M-3/kp-next
4444 *** C-S-3/kp-next
4445 *** 4/kp-left
4446 indent-region
4447 #+begin_src emacs-lisp
4448 (global-set-key (kbd "<kp-left>") 'indent-region)
4449 #+end_src
4450 *** C-4/kp-left
4451 *** M-4/kp-left
4452 *** S-4/kp-left
4453 *** C-M-4/kp-left
4454 *** C-S-4/kp-left
4455 *** 5/kp-begin
4456 mark-defun
4457 #+begin_src emacs-lisp
4458 (global-set-key (kbd "<kp-begin>") 'mark-defun)
4459 #+end_src
4460 *** C-5/kp-begin
4461 *** M-5/kp-begin
4462 *** S-5/kp-begin
4463 *** C-M-5/kp-begin
4464 *** C-S-5/kp-begin
4465 *** 6/kp-right
4466 ibuffer
4467 #+begin_src emacs-lisp
4468 (global-set-key (kbd "<kp-right>") 'ibuffer)
4469 #+end_src
4470 *** C-6/kp-right
4471 *** M-6/kp-right
4472 *** S-6/kp-right
4473 *** C-M-6/kp-right
4474 *** C-S-6/kp-right
4475 *** 7/kp-home
4476 *** C-7/kp-home
4477 *** M-7/kp-home
4478 *** S-7/kp-home
4479 *** C-M-7/kp-home
4480 *** C-S-7/kp-home
4481 *** 8/kp-up
4482 *** C-8/kp-up
4483 *** M-8/kp-up
4484 *** S-8/kp-up
4485 *** C-M-8/kp-up
4486 *** C-S-8/kp-up
4487 *** 9/kp-prior
4488 delete-horizontal-space
4489 #+begin_src emacs-lisp
4490 (global-set-key (kbd "<kp-prior>") 'delete-horizontal-space)
4491 #+end_src
4492 *** C-9/kp-prior
4493 *** M-9/kp-prior
4494 *** S-9/kp-prior
4495 *** C-M-9/kp-prior
4496 *** C-S-9/kp-prior
4497 *** 10/kp-insert
4498 *** C-10/kp-insert
4499 *** M-10/kp-insert
4500 *** S-10/kp-insert
4501 *** C-M-10/kp-insert
4502 *** C-S-10/kp-insert
4503 *** 11/kp-subtract
4504 *** C-11/kp-subtract
4505 *** M-11/kp-subtract
4506 *** S-11/kp-subtract
4507 *** C-M-11/kp-subtract
4508 *** C-S-11/kp-subtract
4509 *** 12/kp-add
4510 *** C-12/kp-add
4511 *** M-12/kp-add
4512 *** S-12/kp-add
4513 *** C-M-12/kp-add
4514 *** C-S-12/kp-add
4515 *** scroll
4516 up/dn / scroll
4517 on standard mouse, this scrolls,
4518 because we have the accuracy to pick things up and
4519 down easier, and because it is familiar.
4520 *** C-scroll
4521 cursor up/down fast
4522 #+begin_src emacs-lisp
4523 ;; compiling warns that next-line should be called interactively,
4524 ;; but we would have to do something dumb, like give it a
4525 ;; vector of keys in order to supply the 8 argument
4526 (defun down-fast ()
4527 (interactive)
4528 (next-line 8))
4529 (defun up-fast ()
4530 (interactive)
4531 (next-line -8))
4532
4533 (global-set-key (kbd "<C-up>") 'up-fast)
4534 (global-set-key (kbd "<C-down>") 'down-fast)
4535
4536 (add-hook 'comint-mode-hook
4537 (lambda ()
4538 (define-key comint-mode-map (kbd "<C-mouse-4>") 'comint-previous-prompt)
4539 (define-key comint-mode-map (kbd "<C-mouse-5>") 'comint-next-prompt)))
4540 #+end_src
4541
4542 *** M-scroll
4543 forward/back s-exp
4544 #+begin_src emacs-lisp
4545 (global-set-key (kbd "<M-mouse-4>") 'backward-sexp)
4546 (global-set-key (kbd "<M-mouse-5>") 'forward-sexp)
4547 #+end_src
4548 *** S-scroll
4549 expand/contract region
4550 #+begin_src emacs-lisp
4551 (global-set-key (kbd "<S-mouse-13>") 'my-contract-region)
4552 (global-set-key (kbd "<S-mouse-14>") 'er/expand-region)
4553 (global-set-key (kbd "<S-mouse-4>") 'my-contract-region)
4554 (global-set-key (kbd "<S-mouse-5>") 'er/expand-region)
4555 (global-set-key (kbd "<S-up>") 'my-contract-region)
4556 (global-set-key (kbd "<S-down>") 'er/expand-region)
4557
4558 (defun my-contract-region (arg)
4559 (interactive "p")
4560 (let ((current-prefix-arg '-))
4561 (call-interactively 'er/expand-region)))
4562 #+end_src
4563 *** C-M-scroll
4564 scroll
4565 background: I originally tried to make c-scroll be scroll
4566 , but this made
4567 for better compatibility with the standard mouse
4568 #+begin_src emacs-lisp
4569 (global-set-key (kbd "<C-M-mouse-4>") 'mwheel-scroll)
4570 (global-set-key (kbd "<C-M-mouse-5>") 'mwheel-scroll)
4571 ; (require 'smooth-scroll)
4572 ; (smooth-scroll-mode nil)
4573 ; (global-set-key (kbd "<C-M-mouse-4>") 'scroll-up-1)
4574 ;(global-set-key (kbd "<C-M-mouse-5>") 'scroll-down-1)
4575 #+end_src
4576 *** C-S-scroll
4577 increase / decrease text size
4578 #+begin_src emacs-lisp
4579 (global-set-key (kbd "<C-S-mouse-4>") 'text-scale-increase)
4580 (global-set-key (kbd "<C-S-mouse-5>") 'text-scale-decrease)
4581 (global-set-key (kbd "<C-S-mouse-13>") 'text-scale-increase)
4582 (global-set-key (kbd "<C-S-mouse-14>") 'text-scale-decrease)
4583 (global-set-key (kbd "<C-S-down>") 'text-scale-increase)
4584 (global-set-key (kbd "<C-S-up>") 'text-scale-decrease)
4585 #+end_src
4586 *** left-scroll
4587 left/right
4588 *** C-left-scroll
4589 back / forward word
4590 #+begin_src emacs-lisp
4591 (global-set-key (kbd "<C-left>") 'backward-symbol)
4592 (global-set-key (kbd "<C-right>") 'forward-symbol)
4593 #+end_src
4594 *** M-left-scroll
4595 ---
4596 unreachable
4597 *** S-left-scroll
4598 ---
4599 unreachable
4600 *** C-M-left-scroll
4601 ---
4602 unreachable
4603 *** C-S-left-scroll
4604 ---
4605 unreachable
4606 ** left primary
4607
4608 *** C-2
4609 copy-symbol
4610 #+begin_src emacs-lisp
4611 (global-unset-key (kbd "C-2"))
4612 (defun copy-symbol (&optional arg)
4613 "Copy symbol at point into kill-ring"
4614 (interactive "P")
4615 (kill-new (thing-at-point 'symbol)))
4616
4617 (global-set-key (kbd "C-2") 'copy-symbol)
4618 #+end_src
4619 *** M-2
4620 shell-cd-to-file
4621 #+begin_src emacs-lisp
4622
4623 (defun shell-cd-to-file ()
4624 (interactive)
4625 (let ((file (buffer-file-name)))
4626 (if file
4627 (send-comint-string "*shell*"
4628 (concat "c " (file-name-directory file))
4629 'shell)
4630 (message "%s" "shell-cd-to-file: buffer has no file name"))))
4631 (global-set-key (kbd "M-2") 'shell-cd-to-file)
4632 #+end_src
4633 *** C-M-2
4634 ---
4635 #+begin_src emacs-lisp
4636 (global-unset-key (kbd "C-M-2"))
4637 #+end_src
4638 *** C-S-2
4639 *** C-3
4640 dot-mode-execute
4641 #+begin_src emacs-lisp
4642 (global-set-key (kbd "C-3") 'dot-mode-execute)
4643 #+end_src
4644 *** M-3
4645 *** C-M-3
4646 recenter-top-bottom
4647 #+begin_src emacs-lisp
4648 (global-set-key (kbd "C-M-3") 'recenter-top-bottom)
4649 #+end_src
4650 *** C-S-3
4651 *** C-q
4652 org-cycle, comint previous arg
4653 #+begin_src emacs-lisp
4654 (add-hook 'org-mode-hook
4655 (lambda () (define-key org-mode-map (kbd "C-q") 'org-cycle)))
4656 (define-key widget-keymap (kbd "C-q") 'widget-forward)
4657 (add-hook 'comint-mode-hook
4658 (lambda () (define-key comint-mode-map (kbd "C-q") 'comint-insert-previous-argument)))
4659 #+end_src
4660 *** M-q
4661 org-archive-to-archive-sibling
4662 #+begin_src emacs-lisp
4663 (global-set-key (kbd "M-q") 'org-archive-to-archive-sibling)
4664 #+end_src
4665 *** C-M-q
4666 quoted-insert
4667 #+begin_src emacs-lisp
4668 (global-set-key (kbd "C-M-q") 'quoted-insert)
4669 #+end_src
4670 *** C-S-q
4671 *** C-w
4672 goto-t.org
4673 #+begin_src emacs-lisp
4674 (global-set-key (kbd "C-w") (lambda () (interactive) (goto-buffer-or-find-file "/a/t.org")))
4675 #+end_src
4676 *** M-w
4677 org-clock-in
4678 #+begin_src emacs-lisp
4679 (global-set-key (kbd "M-w") 'org-clock-in)
4680 #+end_src
4681 *** C-M-w
4682 *** C-S-w
4683 *** C-e
4684 copy-line
4685 #+begin_src emacs-lisp
4686 ;; todo, make repeated calls to this append the kills
4687 (defun copy-line (&optional arg)
4688 "Copy lines (as many as prefix argument) in the kill ring.
4689 Ease of use features:
4690 - Move to start of next line.
4691 - Appends the copy on sequential calls.
4692 - Use newline as last char even on the last line of the buffer.
4693 - If region is active, copy its lines."
4694 (interactive "p")
4695 (let ((beg (line-beginning-position))
4696 (end (line-end-position (or arg 1))))
4697 (when mark-active
4698 (if (> (point) (mark))
4699 (setq beg (save-excursion (goto-char (mark)) (line-beginning-position)))
4700 (setq end (save-excursion (goto-char (mark)) (line-end-position)))))
4701 (if (eq last-command 'copy-line)
4702 (kill-append (buffer-substring beg end) (< end beg))
4703 (kill-ring-save beg end)))
4704 (kill-append "\n" nil)
4705 ;; dun need cuz I have yank-better
4706 ;;(beginning-of-line (or (and arg (1+ arg)) 2))
4707 (if (and arg (not (= 1 arg))) (message "%d lines copied" arg)))
4708
4709 (global-set-key (kbd "C-e") 'copy-line)
4710 #+end_src
4711 *** M-e
4712 org-clock-in-last
4713 #+begin_src emacs-lisp
4714 (global-set-key (kbd "M-e") 'org-clock-in-last)
4715 #+end_src
4716 *** C-M-e
4717 *** C-S-e
4718 *** C-r
4719 isearch-backward
4720 #+begin_src emacs-lisp
4721 (global-set-key (kbd "C-r") 'isearch-backward)
4722 (add-hook 'comint-mode-hook
4723 (lambda ()
4724 (define-key comint-mode-map (kbd "C-r") 'comint-history-isearch-backward-regexp)))
4725 #+end_src
4726 *** M-r
4727 org-clock-out
4728 #+begin_src emacs-lisp
4729 (global-set-key (kbd "M-r") 'org-clock-out)
4730 #+end_src
4731 *** C-M-r
4732 *** C-S-r
4733 *** C-a
4734 copy buffer
4735 #+begin_src emacs-lisp
4736 (defun copy-all ()
4737 "Copy entire buffer to clipboard"
4738 (interactive)
4739 (clipboard-kill-ring-save (point-min) (point-max)))
4740 (global-set-key (kbd "C-a") 'copy-all)
4741 #+end_src
4742 *** M-a
4743 macro record
4744 #+begin_src emacs-lisp
4745 (global-set-key (kbd "M-a") 'kmacro-start-macro-or-insert-counter)
4746 #+end_src
4747 *** C-M-a
4748 macro end / call
4749 #+begin_src emacs-lisp
4750 (global-set-key (kbd "C-M-a") 'kmacro-end-or-call-macro)
4751 (add-hook 'perl-mode-hook (lambda () (define-key perl-mode-map (kbd "C-M-a") nil)))
4752 (add-hook 'LaTeX-mode-hook (lambda () (define-key LaTeX-mode-map (kbd "C-M-a") nil)))
4753 (add-hook 'c++-mode-hook
4754 (lambda () (define-key c++-mode-map (kbd "C-M-a") nil)))
4755 (add-hook 'c-mode-hook
4756 (lambda () (define-key c-mode-map (kbd "C-M-a") nil)))
4757
4758
4759 #+end_src
4760 *** C-S-a
4761 *** C-s
4762 c-x prefix
4763
4764 *** M-s
4765 *** C-M-s
4766 split-window-vertically
4767 #+begin_src emacs-lisp
4768 (global-set-key (kbd "C-M-s") 'split-window-vertically)
4769 #+end_src
4770 *** C-S-s
4771 *** C-d
4772 C-c prefix
4773 *** M-d
4774 *** C-M-d
4775 swap buffer across windows
4776 from http://www.emacswiki.org/emacs/TransposeWindows
4777 #+begin_src emacs-lisp
4778 (setq swapping-buffer nil)
4779 (setq swapping-window nil)
4780 (defun swap-buffers-in-windows ()
4781 "Swap buffers between two windows"
4782 (interactive)
4783 (if (and swapping-window
4784 swapping-buffer)
4785 (let ((this-buffer (current-buffer))
4786 (this-window (selected-window)))
4787 (if (and (window-live-p swapping-window)
4788 (buffer-live-p swapping-buffer))
4789 (progn (switch-to-buffer swapping-buffer)
4790 (select-window swapping-window)
4791 (switch-to-buffer this-buffer)
4792 (select-window this-window)
4793 (message "Swapped buffers."))
4794 (message "Old buffer/window killed. Aborting."))
4795 (setq swapping-buffer nil)
4796 (setq swapping-window nil))
4797 (progn
4798 (setq swapping-buffer (current-buffer))
4799 (setq swapping-window (selected-window))
4800 (message "Buffer and window marked for swapping."))))
4801
4802 (global-set-key (kbd "C-M-d") 'swap-buffers-in-windows)
4803 #+end_src
4804 *** C-S-d
4805 *** C-f]
4806 kill-whole-line
4807 #+begin_src emacs-lisp
4808 (global-set-key (kbd "C-f") 'kill-whole-line-wrapper)
4809 (defun kill-whole-line-wrapper (&optional arg)
4810 "If we are at the end of the file, kill backwards instead of doing nothing."
4811 (interactive "P")
4812 (if (= (point) (point-max))
4813 (kill-whole-line -1)
4814 (kill-whole-line arg)))
4815 #+end_src
4816 *** M-f]
4817 print-var-at-point
4818 #+begin_src emacs-lisp
4819 (defun print-var-at-point ()
4820 (interactive)
4821 (let ((v (variable-at-point)))
4822 (if (symbolp v)
4823 (message "%s: %s" v (symbol-value v))
4824 (message "no symbol found at point"))))
4825 (global-set-key (kbd "M-f") 'print-var-at-point)
4826 #+end_src
4827
4828 *** C-M-f]
4829 kill rest of line
4830 #+begin_src emacs-lisp
4831
4832 (add-hook 'org-mode-hook
4833 (lambda ()
4834 (define-key org-mode-map (kbd "C-M-f") 'org-kill-line)))
4835
4836 (global-set-key (kbd "C-M-f") 'kill-line)
4837 #+end_src
4838 *** C-S-f
4839 *** C-g]
4840 cancel / other window
4841 #+begin_src emacs-lisp
4842 (global-set-key (kbd "C-g") 'other-window)
4843 #+end_src
4844 *** M-g]
4845 abort-recursive-edit
4846 #+begin_src emacs-lisp
4847 (global-set-key (kbd "M-g") 'abort-recursive-edit)
4848 #+end_src
4849 *** C-M-g]
4850 gnus
4851 #+begin_src emacs-lisp
4852 (global-set-key (kbd "C-M-g") 'mu4e)
4853 #+end_src
4854 *** C-S-g
4855 *** C-z
4856 #+begin_src emacs-lisp
4857 (global-set-key (kbd "C-z") 'undo-tree-undo)
4858 #+end_src
4859 *** M-z
4860 *** C-M-z]
4861 *** C-S-z
4862 *** C-x
4863 kill-region
4864 #+begin_src emacs-lisp
4865 (global-set-key (kbd "C-s") 'kill-region)
4866 #+end_src
4867 *** M-x]
4868 smex
4869 #+begin_src emacs-lisp
4870 (global-set-key (kbd "M-x") 'smex)
4871 #+end_src
4872 *** C-M-x]
4873 cut-to-register
4874 #+begin_src emacs-lisp
4875 ;; same args as copy-to-register
4876 (defun cut-to-register (register start end &optional delete-flag region)
4877 (interactive (list (register-read-with-preview "Cut to register: ")
4878 (region-beginning)
4879 (region-end)
4880 current-prefix-arg
4881 t))
4882 (copy-to-register register start end t region))
4883
4884 (global-set-key (kbd "C-M-x") 'cut-to-register)
4885 #+end_src
4886 *** C-S-x
4887 *** C-c
4888 copy
4889 #+begin_src emacs-lisp
4890 (global-set-key (kbd "C-d") 'kill-ring-save)
4891 (add-hook 'c-mode-hook
4892 (lambda () (define-key c-mode-map (kbd "C-d") nil)))
4893 (add-hook 'comint-mode-hook
4894 (lambda ()
4895 (define-key comint-mode-map (kbd "C-d") nil)))
4896 ;; the base map is shared by many c-modes, like java
4897 (add-hook 'c-mode-hook
4898 (lambda ()
4899 (define-key c-mode-base-map "\C-d" nil)
4900 (define-key c-mode-base-map (kbd "<deletechar>") 'c-electric-delete-forward)))
4901
4902 #+end_src
4903 *** M-c]
4904 org-capture
4905 #+begin_src emacs-lisp
4906 (define-key global-map "\M-c" 'org-capture)
4907 #+end_src
4908 *** C-M-c]
4909 copy-to-register
4910 #+begin_src emacs-lisp
4911 (global-set-key (kbd "C-M-c") 'copy-to-register)
4912 #+end_src
4913 *** C-S-c
4914 *** C-v
4915 yank
4916 #+begin_src emacs-lisp
4917 (global-set-key (kbd "C-v") 'yank-better)
4918
4919
4920
4921 (defun yank-better (arg)
4922 "Paste, linewise if our kill ends with a newline.
4923 I change the behavior of plain prefix. It makes it not do linewise paste,
4924 because sometimes you want to yank pop and a linewise paste screws that up.
4925 c-u with no number normally makes the point go before the yank.
4926 That is pointless for me, as it would be just as easier and less
4927 thought to pop the mark after yanking cuz it is set to before the mark."
4928 (interactive "*P")
4929 (if (and (not (equal arg '(4))) (string-suffix-p "\n" (current-kill 0 t)))
4930 (beginning-of-line))
4931 (if (and (stringp mode-name) (string= mode-name "Org"))
4932 (call-interactively 'org-yank)
4933 (setq this-command 'yank)
4934 (call-interactively 'yank (and (not (equal arg '(4)))))))
4935
4936 (put 'yank-better 'delete-selection 'yank)
4937 #+end_src
4938 *** M-v]
4939 insert-register
4940 #+begin_src emacs-lisp
4941 (global-set-key (kbd "M-v") 'insert-register)
4942 #+end_src
4943 *** C-M-v]
4944 yank-pop
4945 #+begin_src emacs-lisp
4946 (global-set-key (kbd "C-M-v") 'yank-pop)
4947 #+end_src
4948 *** C-S-v
4949 *** C-b]
4950 delete-other-windows
4951 #+begin_src emacs-lisp
4952 (global-set-key (kbd "C-b") 'delete-other-windows)
4953 #+end_src
4954 *** M-b]
4955 isearch-backward-current-symbol
4956 #+begin_src emacs-lisp
4957 (global-set-key (kbd "M-b") 'isearch-backward-current-symbol)
4958 #+end_src
4959 *** C-M-b]
4960 isearch-current-symbol
4961 #+begin_src emacs-lisp
4962 (global-set-key (kbd "C-M-b") 'isearch-current-symbol)
4963 #+end_src
4964 *** C-S-b
4965 *** C-tab]
4966 ---
4967 in terminal, it's just TAB, duplicate keybind.
4968 *** M-tab]
4969 ---
4970 in terminal it's duplicated of C-M-i
4971 *** C-M-tab
4972 *** C-S-tab
4973 *** C-delete]
4974 kill-symbol
4975 #+begin_src emacs-lisp
4976 (global-set-key (kbd "<C-delete>") 'kill-symbol)
4977 (defun kill-symbol (arg)
4978 (interactive "p")
4979 (kill-region (point) (save-excursion (forward-symbol arg) (point))))
4980
4981 #+end_src
4982 *** M-delete
4983 *** C-M-delete]
4984 kill-sexp
4985 #+begin_src emacs-lisp
4986 (global-set-key (kbd "<C-M-delete>") 'kill-sexp)
4987 #+end_src
4988 *** C-S-delete
4989
4990 *** C-left-arrow]
4991 compile / comint search
4992 #+begin_src emacs-lisp
4993 (defun set-p (var)
4994 (and (bound-and-true-p var)
4995 (not (eq var 'unset))))
4996 (global-set-key (kbd "C-(") 'run)
4997
4998 ;; make compile work from the gtags root dir
4999 (defadvice compile (before pre-compile-advice activate)
5000 (basic-save-buffer)
5001 (when (set-p ggtags-project-root)
5002 (setq-local compile-saved-dir default-directory)
5003 (setq default-directory ggtags-project-root)))
5004 (defadvice compile (after post-compile-advice activate)
5005 (when (bound-and-true-p compile-saved-dir)
5006 (setq default-directory compile-saved-dir)))
5007
5008
5009 (add-hook 'c-mode-hook (lambda () (define-key c-mode-map (kbd "C-(") 'compile)))
5010 (add-hook 'comint-mode-hook
5011 (lambda ()
5012 (define-key isearch-mode-map (kbd "C-(") 'isearch-repeat-backward)
5013 (define-key comint-mode-map (kbd "C-(") 'isearch-backward)))
5014
5015 #+end_src
5016 *** M-left-arrow
5017 *** C-M-left-arrow]
5018 org-shiftup
5019 #+begin_src emacs-lisp
5020 (add-hook 'org-mode-hook
5021 (lambda () (define-key org-mode-map (kbd "C-M-(") 'org-shiftup)))
5022 #+end_src
5023 *** C-S-left-arrow
5024 *** C-right-arrow]
5025 keyboard-yank-primary
5026 #+begin_src emacs-lisp
5027 (defun keyboard-yank-primary ()
5028 (interactive)
5029 (let ((mouse-yank-at-point t))
5030 (mouse-yank-primary nil)))
5031 ;; paste selection
5032 (global-set-key (kbd "C-)") 'keyboard-yank-primary) ;; kinesis binding
5033 (global-set-key (kbd "<S-right>") 'keyboard-yank-primary)
5034 #+end_src
5035 *** M-right-arrow
5036 *** C-M-right-arrow
5037 #+begin_src emacs-lisp
5038 (add-hook 'org-mode-hook
5039 (lambda () (define-key org-mode-map (kbd "C-M-)") 'org-shiftdown)))
5040 #+end_src
5041 *** C-S-right-arrow
5042 *** C-backspace]
5043 backward-kill-symbol
5044 #+begin_src emacs-lisp
5045 (global-set-key (kbd "<C-backspace>") 'backward-kill-symbol)
5046 (add-hook 'comint-mode-hook
5047 (lambda ()
5048 (define-key comint-mode-map (kbd "<C-backspace>") 'backward-kill-word)))
5049 (defun backward-kill-symbol (arg)
5050 (interactive "p")
5051 (kill-region (point) (save-excursion (backward-symbol arg) (point))))
5052 #+end_src
5053 *** M-backspace
5054 *** C-M-backspace]
5055 backward-kill-sexp
5056 #+begin_src emacs-lisp
5057 (global-set-key (kbd "<C-M-backspace>") 'backward-kill-sexp)
5058 #+end_src
5059 *** C-S-backspace
5060 *** C-f7
5061 *** M-f7
5062 *** C-M-f7
5063 *** C-S-f7
5064
5065 ** right primary
5066 *** C-*]
5067 split-window-horizontally
5068 #+begin_src emacs-lisp
5069 (global-set-key (kbd "C-*") 'split-window-horizontally)
5070 #+end_src
5071 *** M-*
5072 *** C-M-*]
5073 calc-dispatch
5074 #+begin_src emacs-lisp
5075 (global-set-key (kbd "C-M-*") 'calc-dispatch)
5076 #+end_src
5077 *** C-S-*
5078 *** C-9]
5079 delete-window-or-exit
5080 #+begin_src emacs-lisp
5081 (global-set-key (kbd "C-9") 'delete-window-or-exit)
5082
5083 (defun delete-window-or-exit ()
5084 "Delete window or exit emacs."
5085 (interactive)
5086 (if (condition-case nil (delete-window) (error t))
5087 (if (or (boundp 'server-process) (> (length (frame-list)) 1))
5088 (progn (basic-save-buffer) (delete-frame))
5089 (save-buffers-kill-terminal t))))
5090 #+end_src
5091 *** M-9]
5092 kill-buffer
5093 #+begin_src emacs-lisp
5094 (defun kill-buffer-no-ido ()
5095 "kill-buffer, avoid the ido remapping"
5096 (interactive)
5097 (kill-buffer))
5098 (global-set-key (kbd "M-9") 'kill-buffer-no-ido)
5099 #+end_src
5100 strangely, in simple mode, this is overridden.
5101 I found this map to override, but it didn't work, so it seems its being bound some other way.
5102 I did a grep of the emacs sources, but couldn't find anything.
5103 (define-key universal-argument-map [?9] nil)
5104
5105 *** C-M-9]
5106 end server edit
5107 ,save & kill buffer if it was opened externally via emacsclient
5108
5109 #+begin_src emacs-lisp
5110 (defun server-edit-save ()
5111 (interactive)
5112 (save-buffer)
5113 (server-edit))
5114 (global-set-key (kbd "C-M-9") 'server-edit-save)
5115 #+end_src
5116 *** C-S-9
5117 *** C-u]
5118 universal-argument
5119 *** M-u
5120 *** C-M-u]
5121 search-keybind
5122 #+begin_src emacs-lisp
5123 (global-set-key (kbd "C-M-u") 'search-keybind)
5124
5125 (defun search-keybind (regexp &optional nlines)
5126 (interactive (occur-read-primary-args))
5127 (save-excursion
5128 (describe-bindings)
5129 (set-buffer "*Help*")
5130 (occur regexp)
5131 (delete-windows-on "*Help*")
5132 ))
5133 #+end_src
5134 *** C-S-u
5135 *** C-i
5136 -----
5137 *** M-i
5138 *** C-M-i]
5139 query-replace-regexp
5140 #+begin_src emacs-lisp
5141 (global-set-key (kbd "C-M-i") 'query-replace-regexp)
5142 (add-hook 'flyspell-mode-hook
5143 (lambda () (define-key flyspell-mode-map (kbd "C-M-i") nil)))
5144 (add-hook 'text-mode-hook
5145 (lambda () (define-key text-mode-map (kbd "C-M-i") nil)))
5146
5147 #+end_src
5148 *** C-S-i
5149 *** C-o]
5150 occur
5151 #+begin_src emacs-lisp
5152 (global-set-key (kbd "C-o") 'occur)
5153 #+end_src
5154 *** M-o
5155 *** C-M-o]
5156 counsel-imenu
5157 #+begin_src emacs-lisp
5158 (global-set-key (kbd "C-M-o") 'counsel-imenu)
5159 #+end_src
5160 *** C-S-o
5161 *** C-p]
5162 move-mouse-to-point
5163 #+begin_src emacs-lisp
5164 (global-set-key (kbd "C-p") 'move-mouse-to-point)
5165 #+end_src
5166 *** M-p
5167 *** C-M-p]
5168 delete-horizontal-space
5169 #+begin_src emacs-lisp
5170 (global-set-key (kbd "C-M-p") 'delete-horizontal-space)
5171 #+end_src
5172 *** C-S-p
5173 *** C-j]
5174 pop-to-mark
5175 #+begin_src emacs-lisp
5176 (defun my-pop-to-mark-command ()
5177 "Jump to mark, and pop a new position for mark off the ring.
5178 \(Does not affect global mark ring\)."
5179 (interactive)
5180 (pop-to-mark-command)
5181 (if (and (derived-mode-p 'org-mode) (outline-invisible-p))
5182 (org-show-context 'mark-goto)))
5183
5184 (global-set-key (kbd "C-j") 'my-pop-to-mark-command)
5185 (define-key ido-common-completion-map (kbd "C-j") 'ido-select-text)
5186 (add-hook 'ido-setup-hook
5187 (lambda () (define-key ido-common-completion-map (kbd "C-j") 'ido-select-text)))
5188 (add-hook 'lisp-interaction-mode-hook
5189 (lambda ()
5190 (define-key lisp-interaction-mode-map (kbd "C-j") nil)))
5191
5192 #+end_src
5193 *** M-j]
5194 previous-error
5195 #+begin_src emacs-lisp
5196 (global-set-key (kbd "M-j") 'previous-error)
5197 #+end_src
5198 *** C-M-j]
5199
5200 register prefix
5201 #+begin_src emacs-lisp
5202 (define-key global-map (kbd "C-M-j") ctl-x-r-map)
5203 (define-key ctl-x-r-map "m" 'kmacro-to-register)
5204 #+end_src
5205
5206 *** C-S-j
5207 *** C-k]
5208 jump-to-register
5209 #+begin_src emacs-lisp
5210
5211 (global-set-key (kbd "C-k") 'jump-to-register)
5212 #+end_src
5213 *** M-k]
5214 next-error
5215 #+begin_src emacs-lisp
5216 (global-set-key (kbd "M-k") 'next-error)
5217 #+end_src
5218 *** C-M-k]
5219 man
5220 #+begin_src emacs-lisp
5221 (global-set-key (kbd "C-M-k") 'man)
5222 #+end_src
5223 *** C-S-k
5224 *** C-l]
5225 ivy-switch-buffer
5226 #+begin_src emacs-lisp
5227 (global-set-key (kbd "C-l") 'ivy-switch-buffer)
5228 #+end_src
5229 *** M-l
5230
5231 *** C-M-l]
5232 move cursor top bottom mid, comint clear screen
5233 #+begin_src emacs-lisp
5234 (global-set-key (kbd "C-M-l") 'move-to-window-line-top-bottom)
5235 #+end_src
5236 *** C-S-l
5237 *** C-;]
5238 used in flyspell, not sure what for, otherwise unbound
5239 *** M-;
5240 comment-dwim
5241 *** C-M-;]
5242 comment-current-line-dwim
5243 #+begin_src emacs-lisp
5244 (defun comment-current-line-dwim ()
5245 "Comment or uncomment the current line."
5246 (interactive)
5247 (save-excursion
5248 (push-mark (beginning-of-line) t t)
5249 (end-of-line)
5250 (comment-dwim nil))
5251 (move-beginning-of-line 2))
5252 (global-set-key (kbd "C-M-;") 'comment-current-line-dwim)
5253 #+end_src
5254 *** C-S-;
5255 *** C-m]
5256 *** M-m
5257 *** C-M-m]
5258 recursive grep
5259 #+begin_src emacs-lisp
5260 (define-key global-map (kbd "C-M-m") 'rgrep)
5261 #+end_src
5262 *** C-S-m
5263 *** C-,]
5264 counsel-find-file
5265 #+begin_src emacs-lisp
5266 (global-set-key (kbd "C-,") 'counsel-find-file)
5267 (add-hook 'flyspell-mode-hook
5268 (lambda () (define-key flyspell-mode-map (kbd "C-,") nil)))
5269 #+end_src
5270 *** M-,
5271 *** C-M-,]
5272 find-file-in-project
5273 #+begin_src emacs-lisp
5274 (global-set-key (kbd "C-M-,") 'find-file-in-project)
5275 #+end_src
5276 *** C-S-,
5277 *** C-.]
5278 find recent file
5279 Taken from starter kit.
5280 #+begin_src emacs-lisp
5281 (defun recentf-ido-find-file ()
5282 "Find a recent file using Ido."
5283 (interactive)
5284 (let* ((file-assoc-list
5285 (mapcar (lambda (x)
5286 (cons (file-name-nondirectory x)
5287 x))
5288 recentf-list))
5289 (filename-list
5290 (remove-duplicates (mapcar #'car file-assoc-list)
5291 :test #'string=))
5292 (filename (ido-completing-read "Choose recent file: "
5293 filename-list
5294 nil
5295 t)))
5296 (when filename
5297 (find-file (cdr (assoc filename
5298 file-assoc-list))))))
5299
5300 (add-hook 'flyspell-mode-hook
5301 (lambda () (define-key flyspell-mode-map (kbd "C-.") nil)))
5302 (define-key dot-mode-map (kbd "C-.") nil)
5303 (global-set-key (kbd "C-.") 'recentf-ido-find-file)
5304 (add-hook 'php-mode-hook
5305 (lambda () (define-key php-mode-map (kbd "C-.") nil)))
5306 #+end_src
5307 *** M-.
5308 *** C-M-.
5309 -
5310 #+begin_src emacs-lisp
5311 (define-key dot-mode-map (kbd "C-M-.") nil)
5312 ;; (global-set-key (kbd "C-M-.") 'execute-extended-command)
5313 #+end_src
5314 *** C-S-.
5315 *** C-/]
5316 join lines
5317 #+begin_src emacs-lisp
5318 (defun vim-style-join-line ()
5319 (interactive)
5320 (join-line '(4)))
5321 (global-set-key (kbd "C-/") 'vim-style-join-line)
5322 (define-key undo-tree-map (kbd "C-/") nil)
5323 #+end_src
5324 *** M-/
5325 *** C-M-/]
5326 copy-buffer-file-name
5327 #+begin_src emacs-lisp
5328 ;; haven't bound this atm, todo, maybe someday?
5329 (defun copy-variable (variable)
5330 (interactive
5331 (let ((v (variable-at-point))
5332 (enable-recursive-minibuffers t)
5333 val)
5334 (setq val (completing-read (if (symbolp v)
5335 (format
5336 "Describe variable (default %s): " v)
5337 "Describe variable: ")
5338 obarray
5339 (lambda (vv)
5340 (or (get vv 'variable-documentation)
5341 (and (boundp vv) (not (keywordp vv)))))
5342 t nil nil
5343 (if (symbolp v) (symbol-name v))))
5344 (list (if (equal val "")
5345 v (intern val)))))
5346 (kill-new (symbol-value variable)))
5347
5348 (defun copy-buffer-file-name ()
5349 (interactive)
5350 (let ((name (cond
5351 ((derived-mode-p 'mu4e-view-mode) (mu4e-message-field-at-point :path))
5352 (t buffer-file-name))
5353 ))
5354 (kill-new name)
5355 (message name)))
5356
5357
5358 (global-set-key (kbd "C-M-/") 'copy-buffer-file-name)
5359
5360
5361 #+end_src
5362 *** C-S-/
5363 *** C-8]
5364 calc-embedded-word
5365 #+begin_src emacs-lisp
5366 (global-set-key (kbd "C-8") 'calc-embedded-word)
5367 #+end_src
5368 *** M-8
5369 *** C-M-8
5370 *** C-S-8
5371 *** C-up-arrow]
5372 org prev headline
5373 #+begin_src emacs-lisp
5374 (define-key undo-tree-map "\C-_" nil)
5375 ;; disabled just because i don't want to accidentally hit it
5376 (define-key global-map "\C-_" nil)
5377 (global-set-key (kbd "<C-_>") 'beginning-of-defun)
5378
5379 (add-hook 'org-mode-hook
5380 (lambda ()
5381 (define-key org-mode-map (kbd "\C-_") 'outline-previous-visible-heading)))
5382
5383 #+end_src
5384
5385
5386 *** M-up-arrow
5387 *** C-M-up-arrow
5388 *** C-S-up-arrow
5389 winner undo
5390 #+begin_src emacs-lisp
5391 (global-set-key (kbd "<C-S-_>") 'winner-undo)
5392 #+end_src
5393 *** C-down-arrow]
5394 org next headline
5395 #+begin_src emacs-lisp
5396 (global-set-key (kbd "<C-kp-enter>") 'end-of-defun)
5397
5398 (add-hook 'org-mode-hook
5399 (lambda ()
5400 (define-key org-mode-map (kbd "<C-kp-enter>") 'outline-next-visible-heading)))
5401
5402 #+end_src
5403
5404
5405 *** M-down-arrow
5406 *** C-M-down-arrow]
5407 toggle-mark-activation
5408 #+begin_src emacs-lisp
5409 (defun toggle-mark-activation ()
5410 (interactive)
5411 (if mark-active
5412 (deactivate-mark t)
5413 (activate-mark)))
5414
5415 (global-set-key (kbd "<C-M-kp-enter>") 'toggle-mark-activation)
5416 #+end_src
5417 winner redo
5418 #+begin_src emacs-lisp
5419 (global-set-key (kbd "<C-S-kp-enter>") 'winner-redo)
5420 #+end_src
5421
5422 *** C-S-down-arrow]
5423 m-x for major mode
5424 #+begin_src emacs-lisp
5425 (global-set-key (kbd "<C-S-kp-enter>") 'smex-major-mode-commands)
5426 #+end_src
5427 *** C-lbracket
5428 ----
5429 *** M-lbracket
5430 *** C-M-lbracket]
5431 scroll-right
5432 #+begin_src emacs-lisp
5433 (global-set-key (kbd "C-M-[") 'scroll-right)
5434 #+end_src
5435 *** C-S-lbracket
5436 *** C-rbracket]
5437 fill-paragraph
5438 #+begin_src emacs-lisp
5439 (global-set-key (kbd "C-]") 'fill-paragraph)
5440 #+end_src
5441 *** M-rbracket
5442 *** C-M-rbracket]
5443 scroll-left
5444 #+begin_src emacs-lisp
5445 (global-set-key (kbd "C-M-]") 'scroll-left)
5446 #+end_src
5447 *** C-S-rbracket
5448 *** C-return]
5449 newline-anywhere
5450 #+begin_src emacs-lisp
5451 (defun newline-anywhere ()
5452 "Add a newline from anywhere in the line."
5453 (interactive)
5454 (end-of-line)
5455 (newline-and-indent))
5456 (global-set-key (kbd "<C-return>") 'newline-anywhere)
5457
5458 #+end_src
5459 *** M-return]
5460 plain newline
5461 #+begin_src emacs-lisp
5462 (defun plain-newline ()
5463 (interactive)
5464 (insert "\n"))
5465 (global-set-key (kbd "<M-return>") 'plain-newline)
5466 #+end_src
5467
5468 *** C-M-return
5469 #+begin_src emacs-lisp
5470 (defun newline-anywhere-previous ()
5471 "Add a newline from anywhere in the line."
5472 (interactive)
5473 (forward-line -1)
5474 (end-of-line)
5475 (newline-and-indent))
5476 (global-set-key (kbd "<C-M-return>") 'newline-anywhere-previous)
5477 #+end_src
5478 *** C-S-return
5479 *** C-space]
5480 org-edit-special
5481 #+begin_src emacs-lisp
5482 ;; (kbd "<C-space>") does not work, (kbd "C-SPC") should work
5483 (add-hook 'org-mode-hook
5484 (lambda ()
5485 (define-key org-mode-map (kbd "C-SPC") 'org-edit-special)
5486 ;; org-src-mode-map is broken in git version of emacs.
5487 ;; temporarily use this for exiting edit-special mode.
5488 (global-set-key (kbd "C-M--") 'org-edit-src-exit)
5489 (define-key org-src-mode-map (kbd "C-SPC") 'org-edit-src-exit)))
5490 #+end_src
5491 *** M-space
5492 *** C-M-space
5493 before or under cursor
5494 #+begin_src emacs-lisp
5495 (global-set-key (kbd "C-M-SPC") 'ispell-word)
5496 #+end_src
5497 *** C-S-space
5498 ** left secondary
5499 *** C-=
5500 *** M-=
5501 *** C-M-=
5502 *** C-S-=
5503 *** C-1
5504 *** M-1
5505 *** C-M-1
5506 *** C-S-1
5507 *** C-4
5508 *** M-4
5509 *** C-M-4
5510 widen
5511 #+begin_src emacs-lisp
5512 (global-set-key (kbd "C-M-4") 'widen)
5513 #+end_src
5514 *** C-S-4
5515 *** C-5
5516 *** M-5
5517 *** C-M-5
5518 *** C-S-5
5519 *** C-tab-key]
5520 query-replace
5521 #+begin_src emacs-lisp
5522
5523 (global-set-key (kbd "<C-kp-add>") 'query-replace)
5524 #+end_src
5525 *** M-tab-key
5526 *** C-M-tab-key
5527 *** C-S-tab-key
5528 *** C-t]
5529 org cycle todo / toggle comint motion
5530 #+begin_src emacs-lisp
5531 (add-hook 'org-mode-hook
5532 (lambda ()
5533 (define-key org-mode-map (kbd "C-t") 'org-todo)))
5534
5535 (defun my-comint-previous-input (arg)
5536 (interactive "*p")
5537 (if (comint-after-pmark-p)
5538 (comint-previous-input arg)
5539 (forward-line -1)))
5540
5541 (defun my-comint-next-input (arg)
5542 (interactive "*p")
5543 (if (comint-after-pmark-p)
5544 (comint-next-input arg)
5545 (forward-line)))
5546
5547 (add-hook 'comint-mode-hook
5548 (lambda ()
5549 (define-key comint-mode-map (kbd "C-t") 'comint-toggle-arrow-keys)
5550 (define-key comint-mode-map (kbd "<up>") 'my-comint-previous-input)
5551 (define-key comint-mode-map (kbd "<down>") 'my-comint-next-input)))
5552
5553
5554 (defun comint-toggle-arrow-keys ()
5555 (interactive)
5556 (toggle-arrow-keys comint-mode-map))
5557
5558 (setq-default comint-arrow-movement nil)
5559 (defun toggle-arrow-keys (map)
5560 (cond ((lookup-key map (kbd "<up>"))
5561 (setq-local comint-arrow-movement t)
5562 (define-key map (kbd "<up>") nil)
5563 (define-key map (kbd "<down>") nil))
5564 (t
5565 (setq-local comint-arrow-movement nil)
5566 (define-key map (kbd "<up>") 'my-comint-previous-input)
5567 (define-key map (kbd "<down>") 'my-comint-next-input)
5568 (goto-char (point-max)))))
5569
5570 (eval-after-load "message"
5571 '(define-key message-mode-map (kbd "C-t") 'mail-signature))
5572 #+end_src
5573 Thanks for the update. I will be enjoying it.
5574
5575 #+RESULTS:
5576 : comint-toggle-arrow-keys
5577 *** M-t
5578 *** C-M-t]
5579 org timestamp
5580 #+begin_src emacs-lisp
5581 (global-set-key (kbd "C-M-t") 'org-time-stamp-with-time)
5582 #+end_src
5583 *** C-S-t
5584 *** C-home
5585 start of buffer
5586 *** M-home
5587 *** C-M-home
5588 *** C-S-home
5589 *** C-end
5590 end of buffer
5591 *** M-end
5592 *** C-M-end
5593 *** C-S-end
5594 *** C-f9
5595 *** M-f9
5596 *** C-M-f9
5597 *** C-S-f9
5598 ** right secondary
5599 *** C-6
5600 save-buffers-kill-emacs
5601 #+begin_src emacs-lisp
5602 (global-set-key (kbd "C-6") 'save-buffers-kill-emacs)
5603 #+end_src
5604 *** M-6
5605 *** C-M-6]
5606 insert-small-copyright
5607 #+begin_src emacs-lisp
5608 (defun insert-small-copyright ()
5609 (interactive)
5610 (beginning-of-line)
5611 (let ((beg (point)))
5612 (insert "Copyright (C) 2017 Ian Kelling\nThis program is under GPL v. 3 or later, see <http://www.gnu.org/licenses/>")
5613 (comment-region beg (point))))
5614
5615 (global-set-key (kbd "C-M-6") 'insert-small-copyright)
5616 #+end_src
5617 *** C-S-6
5618 *** C-7
5619 *** M-7
5620 *** C-M-7]
5621 insert-full-copyright
5622 #+begin_src emacs-lisp
5623 (defun insert-full-copyright ()
5624 (interactive)
5625 (beginning-of-line)
5626 (let ((beg (point)))
5627 (insert "Copyright (C) 2017 Ian Kelling\n")
5628 (insert "\n")
5629 (insert "This program is free software: you can redistribute it and/or modify\n")
5630 (insert "it under the terms of the GNU General Public License as published by\n")
5631 (insert "the Free Software Foundation, either version 3 of the License, or\n")
5632 (insert "(at your option) any later version.\n")
5633 (insert "\n")
5634 (insert "This program is distributed in the hope that it will be useful,\n")
5635 (insert "but WITHOUT ANY WARRANTY; without even the implied warranty of\n")
5636 (insert "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n")
5637 (insert "GNU General Public License for more details.\n")
5638 (insert "\n")
5639 (insert "You should have received a copy of the GNU General Public License\n")
5640 (insert "along with this program. If not, see <http://www.gnu.org/licenses/>.\n")
5641 (comment-region beg (point))))
5642
5643 (global-set-key (kbd "C-M-7") 'insert-full-copyright)
5644
5645 #+end_src
5646 *** C-S-7
5647 *** C-0
5648 text-scale-reset
5649 #+begin_src emacs-lisp
5650 (defun text-scale-reset ()
5651 (interactive)
5652 (text-scale-set 0))
5653 (global-set-key (kbd "C-0") 'text-scale-reset)
5654 #+end_src
5655 *** M-0
5656 *** C-M-0
5657 insert-apache
5658 #+begin_src emacs-lisp
5659 (defun insert-apache ()
5660 (interactive)
5661 (beginning-of-line)
5662 (let ((beg (point)))
5663 (insert "Copyright (C) 2017 Ian Kelling\n")
5664 (insert "\n")
5665 (insert "Licensed under the Apache License, Version 2.0 (the \"License\");\n")
5666 (insert "you may not use this file except in compliance with the License.\n")
5667 (insert "You may obtain a copy of the License at\n")
5668 (insert "\n")
5669 (insert " http://www.apache.org/licenses/LICENSE-2.0\n")
5670 (insert "\n")
5671 (insert "Unless required by applicable law or agreed to in writing, software\n")
5672 (insert "distributed under the License is distributed on an \"AS IS\" BASIS,\n")
5673 (insert "WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n")
5674 (insert "See the License for the specific language governing permissions and\n")
5675 (insert "limitations under the License.\n")
5676 (comment-region beg (point))))
5677 (global-set-key (kbd "C-M-0") 'insert-apache)
5678 #+end_src
5679
5680 *** C-S-0
5681 *** C--
5682 *** M--
5683 *** C-M--
5684 org-edit-src-exit
5685 *** C-S--
5686 *** C-y]
5687 undo-tree-redo
5688 #+begin_src emacs-lisp
5689 (global-set-key (kbd "C-y") 'undo-tree-redo)
5690 #+end_src
5691
5692 *** M-y
5693 *** C-M-y
5694 *** C-S-y
5695 *** C-\
5696 #+begin_src emacs-lisp
5697 (global-set-key (kbd "C-\\") 'sr-speedbar-toggle)
5698 #+end_src
5699 *** M-\
5700 *** C-M-\]
5701 mark-defun
5702 #+begin_src emacs-lisp
5703 (global-set-key (kbd "C-M-\\") 'mark-defun)
5704 #+end_src
5705 *** C-S-\
5706 *** C-h
5707 help-prefix
5708
5709 *** M-h
5710 *** C-M-h
5711 *** C-S-h
5712 *** C-'
5713 eval-expression
5714 #+begin_src emacs-lisp
5715 (global-set-key (kbd "C-'") 'eval-expression)
5716 #+end_src
5717 *** M-'
5718 *** C-M-'
5719 *** C-S-'
5720 *** C-n]
5721 unpop to mark
5722 #+begin_src emacs-lisp
5723 (defun unpop-to-mark-command ()
5724 "Unpop off mark ring. Does nothing if mark ring is empty."
5725 (interactive)
5726 (when mark-ring
5727 (let ((pos (marker-position (car (last mark-ring)))))
5728 (if (not (= (point) pos))
5729 (goto-char pos)
5730 (setq mark-ring (cons (copy-marker (mark-marker)) mark-ring))
5731 (set-marker (mark-marker) pos)
5732 (setq mark-ring (nbutlast mark-ring))
5733 (goto-char (marker-position (car (last mark-ring))))))))
5734
5735 (global-set-key (kbd "C-n") 'unpop-to-mark-command)
5736 #+end_src
5737 *** M-n
5738 *** C-M-n]
5739 narrow-to-region
5740 #+begin_src emacs-lisp
5741 (global-set-key (kbd "C-M-n") 'narrow-to-region)
5742 #+end_src
5743 *** C-S-n
5744 *** C-rshift
5745 *** M-rshift
5746 *** C-M-rshift
5747 *** C-S-rshift
5748 *** C-escape]
5749 find-tag
5750 :ID: a6dd7e4c-1831-4493-bbfd-557dc2f9c856
5751 :CUSTOM_ID: 6901fa1b-c827-4525-b24b-bdb8fe5f638b
5752
5753
5754
5755
5756
5757
5758
5759
5760 :END:
5761 find-tag
5762 #+begin_src emacs-lisp
5763 (global-set-key (kbd "<C-escape>") 'find-tag)
5764 #+end_src
5765 *** M-escape
5766 *** C-M-escape
5767 *** C-S-escape
5768 * keybind table src
5769 not necessary to have at the end, but its convenient to have it next
5770 to its output.
5771 #+NAME: keybind-table-generator
5772 #+BEGIN_SRC emacs-lisp :results silent
5773 (defun org-custom-id-get (&optional pom create prefix)
5774 "Get the CUSTOM_ID property of the entry at point-or-marker POM.
5775 If POM is nil, refer to the entry at point.
5776 If the entry does not have a CUSTOM_ID, the function returns nil.
5777 However, when CREATE is non nil, create an ID if none is present already.
5778 PREFIX will be passed through to `org-id-new'.
5779 In any case, the CUSTOM_ID of the entry is returned."
5780 (org-with-point-at pom
5781 (let ((id (org-entry-get nil "CUSTOM_ID")))
5782 (cond
5783 ((and id (stringp id) (string-match "\\S-" id))
5784 id)
5785 (create
5786 (setq id (org-id-new prefix))
5787 (org-entry-put pom "CUSTOM_ID" id)
5788 (org-id-add-location id (buffer-file-name (buffer-base-buffer)))
5789 id)))))
5790
5791 (defun get-title()
5792 (interactive)
5793 (let ((title (plist-get (cadr (org-element-at-point)) ':title)))
5794 ;; remove brackets from [title]
5795 ;; I was at one point using org-drill for spaces repitition,
5796 ;; and enclosed question and answer by 2 sets of brackets.
5797 (string-match "[^[ ][^]]*" title)
5798 (setq title (match-string 0 title))
5799 (print title)
5800 title))
5801
5802
5803 (defun org-dblock-write:keybind-dblock (arg)
5804 (let (output)
5805 (save-excursion
5806 (goto-char (org-find-entry-with-id "beginning-of-keybind-table-data"))
5807 (let* ((table-level (org-current-level))
5808 (keybind-level (1+ table-level))
5809 (prefixes (list "C-M-S-" "C-M-" "C-S-" "M-S-" "M-" "C-" "S-"))
5810 table-title
5811 previous-prefixes
5812 )
5813 (while (>= (org-current-level) table-level)
5814 (setq table-title (get-title))
5815 (outline-next-heading)
5816 (let (found-prefixes
5817 found-all-prefixes)
5818 ;; go through the first few elements of the table to find out what column headings aka prefixes it should have
5819 (save-excursion
5820 (while (not found-all-prefixes)
5821 (let ((prefixes-copy prefixes)
5822 current-prefix
5823 found-prefix)
5824 (while (and prefixes-copy (not found-prefix))
5825 (setq current-prefix (car prefixes-copy))
5826 (when (and (> (length (get-title)) (length current-prefix))
5827 (string= (substring (get-title) 0 (length current-prefix)) current-prefix))
5828 (setq found-prefix t))
5829 (setq prefixes-copy (cdr prefixes-copy)))
5830 (unless found-prefix
5831 (setq current-prefix ""))
5832 (if (and found-prefixes (string= (car (last found-prefixes)) current-prefix))
5833 (setq found-all-prefixes t)
5834 (push current-prefix found-prefixes)))
5835 (outline-next-heading)))
5836 (setq found-prefixes (reverse found-prefixes))
5837
5838 ;; start a new table or repeat the prefixes in the current table
5839
5840 (if (or (not previous-prefixes) (equal previous-prefixes found-prefixes))
5841 (setq output (concat output "|-|\n| "))
5842 (setq output (concat output "|-|\n\n|-|\n| ")))
5843 (setq output (concat output table-title " | "))
5844 (setq previous-prefixes found-prefixes)
5845
5846 ;; add the prefixes
5847 (dolist (prefix found-prefixes)
5848 (setq output (concat output prefix "|")))
5849 (setq output (concat output "\n|-|\n"))
5850
5851
5852 (let (subtree-end)
5853 (while (>= (org-current-level) keybind-level)
5854 (dotimes (i (length found-prefixes))
5855 ;; add keybind name
5856 (when (= i 0)
5857 (setq output (concat output "| " (substring (get-title) (length (car found-prefixes))) " | ")))
5858 ;; add keybinds by searching for regex [keybind] to the start of the next heading
5859 (save-excursion
5860 (outline-next-heading)
5861 (setq subtree-end (point)))
5862 ;; skip over scheduled line
5863
5864 ;; see comment after source block to understand this regex
5865 (re-search-forward "^\\s-*\\([^*: ].*?$\\)" subtree-end t)
5866 (let ((m (match-string 1)))
5867 (when m
5868 (setq output (concat output "[[#" (org-custom-id-get (point) 'create) "][" m "]]")))
5869 (setq output (concat output " | ")))
5870 ;; advance to next keybind
5871 (outline-next-heading))
5872 (setq output (concat output "\n"))
5873 ))))))
5874 (setq output (concat output "|-|"))
5875 (insert output))
5876 (org-table-map-tables 'org-table-align 'quietly))
5877
5878
5879 #+END_SRC
5880 after source block due to bad parsing of comments in non emacs lisp mode
5881 some easily forgotten regex elements. whitespace: \\s-
5882 non-greedy star: *?
5883 subexpression for close bracket char or nothing: \\(\\]\\|\\)
5884
5885 * keybind tables
5886 :LOGBOOK:
5887 CLOCK: [2016-11-28 Mon 10:59]--[2016-11-28 Mon 10:59] => 0:00
5888 :END:
5889 dunno why but it takes doing ctrl-c twice to update this
5890 #+BEGIN: keybind-dblock
5891 |---------------------+------------------------|
5892 | single/special keys | |
5893 |---------------------+------------------------|
5894 | tab key | [[#6c10a716-1d8e-4ce4-8e26-64468f19c17a][isearch]] |
5895 | tab | [[#51ece189-1840-41a1-8ca0-19f9a0481895][isearch-forward]] |
5896 | end | [[#00d589b7-2b8e-494c-b761-3afefebe6ec6][move-end-of-line]] |
5897 | home | [[#7800e455-c3f6-4a8f-8907-b2292449ab67][back-to-indentation]] |
5898 | s-tab | [[#3072901e-5cf3-4d6e-9ac8-3ef64a5f6ad2][indent-buffer]] |
5899 | s-delete | [[#e53728b6-054d-4443-a03e-6cf02d13724d][send-shell]] |
5900 | s-left arrow | [[#d8c473ac-5507-4a6b-9e5a-46558c17b09f][shell]] |
5901 | s-right arrow | [[#cbae2b27-ff95-4b12-88e0-e1a0f7705db6][previous-buffer]] |
5902 | esc | |
5903 | return | [[#fab6adea-ed20-45ab-a0a3-776c68d5c3a5][new line]] |
5904 | s-return | [[#c433c837-24fa-45e1-8991-a4d380550ea0][auto-correct-prev-word]] |
5905 | down arrow | [[#7a868484-9c63-4a73-abda-7751cb2c02be][mark]] |
5906 | s-down arrow | [[#097b97e0-8ad8-40f7-8388-c4ace1706b38][extended command]] |
5907 | s-up arrow | |
5908 |---------------------+------------------------|
5909
5910 |-------------------+----------------------------+---------------------------------+--------------------+---------------+-------------+-------------|
5911 | mouse | | C- | M- | S- | C-M- | C-S- |
5912 |-------------------+----------------------------+---------------------------------+--------------------+---------------+-------------+-------------|
5913 | mouse-2 mode line | [[#69aaa631-6fb5-4beb-b2d8-c0f3d92c0a98][mouse-delete-other-windows]] | [[#501479ab-e1e2-497e-bd86-071f8afa3378][mouse-split-window-horizontally]] | | | | |
5914 | mouse-3 mode line | [[#917a1844-8c38-4f31-8616-50fc81334f2c][mouse-delete-window]] | | | | | |
5915 | mouse-1 | [[#4e60e2e4-8c2f-4450-8060-2d793ede530c][set cursor/mark]] | [[#b661f84f-57df-4095-9dc1-d1a876a53ee5][buffer list context menu]] | | | | |
5916 | mouse-2 | [[#086b0b50-054f-462d-92fa-b27852f887b0][paste]] | | | | | |
5917 | mouse-3 | [[#0481632e-9c50-4328-9365-c4b5bf967b66][set-mark]] | [[#9623c78f-7705-4cbe-a990-c24eb1067377][global menu]] | | | | |
5918 | mouse-9 | [[#efaec161-b279-4129-86fd-b410430926e4][move-mouse-to-point]] | | | | | |
5919 | mouse-8 | | | | | | |
5920 | 1/kp-end | | | | | | |
5921 | 2/kp-down | | | [[#50db5a06-452e-491f-875b-3de936a4d04a][smex]] | | | |
5922 | 3/kp-next | | | | | | |
5923 | 4/kp-left | [[#c44d0f65-9502-4cc6-9642-96d907f6b093][indent-region]] | | | | | |
5924 | 5/kp-begin | [[#2458c6bc-7113-4d4b-bbdf-206e1cb842a7][mark-defun]] | | | | | |
5925 | 6/kp-right | [[#3b79bc58-6067-43bd-9471-9d592744a25a][ibuffer]] | | | | | |
5926 | 7/kp-home | | | | | | |
5927 | 8/kp-up | | | | | | |
5928 | 9/kp-prior | [[#a3b51adb-4405-4d9f-9b88-a8faa479fbe7][delete-horizontal-space]] | | | | | |
5929 | 10/kp-insert | | | | | | |
5930 | 11/kp-subtract | | | | | | |
5931 | 12/kp-add | | | | | | |
5932 | scroll | [[#33433f0f-5b0e-46ba-8452-d2a51e54769b][up/dn / scroll]] | [[#38c594ca-1d13-441b-833c-ad47b27e7073][cycle recent buffers]] | [[#e1e2e253-450d-4620-af9e-78d378f49ad5][forward/back s-exp]] | [[#945cbcda-9a5a-4a9f-ad5c-4ede9a43656e][expand region]] | [[#10bc56d0-a6fe-4e2e-a287-1d280358ad1c][scroll]] | [[#fc79fff3-259e-416a-a62a-c237b30ade28][zoom]] |
5933 | left-scroll | [[#d2d5c5c7-f0de-4e08-953b-d41d3e282ba7][left/right]] | [[#7bb95aa5-381e-454a-a6c6-aaeec728db08][back / forward word]] | [[#3aeb5be7-6026-42f6-a65b-b00799e44642][winner undo redo]] | [[#ca5cdcd4-b3da-4d7b-86ab-4c7c0ac2caf7][---]] | [[#7f7103f5-2488-46a6-8530-6d8a558e6eff][unreachable]] | [[#7b4f1f49-6d93-4210-a30c-8278d6e63655][unreachable]] |
5934 |-------------------+----------------------------+---------------------------------+--------------------+---------------+-------------+-------------|
5935
5936 |-----------------+--------------------------------+---------------------------------+-------------------------------+--------------------------|
5937 | left primary | C- | M- | C-M- | C-S- |
5938 |-----------------+--------------------------------+---------------------------------+-------------------------------+--------------------------|
5939 | 2 | [[#b7db9f5c-f31d-45fb-ac70-eb3ef9369d3d][copy-symbol]] | [[#53ecfda2-d9f6-4882-b7a2-9b3c859e3bcb][shell-cd-to-file]] | [[#33c4996d-92bc-4df0-b005-11553677be13][---]] | |
5940 | 3 | [[#401f56ff-6aba-4156-b128-f449b18c27af][dot-mode-execute]] | | [[#eb0cc3a8-b62e-4a24-9f84-cc8e854f91dd][recenter-top-bottom]] | |
5941 | q | [[#679fd3cd-c43b-409c-be36-4175a5f27cd3][org-cycle, comint previous arg]] | [[#9a186632-7b04-4af7-b7de-eaec87daf315][org-archive-to-archive-sibling]] | [[#1f5e9b63-7ce0-445c-a426-b41839585d38][quoted-insert]] | |
5942 | w | [[#20005b6d-9a9d-4b58-882c-7ce860c7a395][goto-t.org]] | [[#9531a0da-269f-4359-9124-e83fbf61a92f][org-clock-in]] | | |
5943 | e | [[#11e8f541-f0a0-4058-883a-98bd1e7b8c4d][copy-line]] | [[#74d0ed51-ddb5-488e-bf55-0f033916e319][org-clock-in-last]] | | |
5944 | r | [[#5088a8b2-a772-4660-a3b6-b8cca7099da6][isearch-backward]] | [[#8fe64424-1f11-4086-84b3-07c2af210c1c][org-clock-out]] | | |
5945 | a | [[#d57dd0ac-2251-44af-b232-30f8a2b0b198][copy-all]] | [[#77987ef8-6a18-4123-8ede-77bc766aa2aa][kmacro-start-macro-or-in...]] | [[#dd2c225e-2d18-4b95-bc30-765163a5e368][kmacro-end-or-call-macro]] | |
5946 | s | [[#f26dd0f5-0655-485f-8c76-e6dfc6abd947][C-x prefix]] | | [[#290ea04a-be99-416a-a95f-458045a91c93][split-window-vertically]] | |
5947 | d | [[#b699614a-9994-4fe7-b2c6-f0fe81b7ad2b][C-c prefix]] | | [[#d9f48fbe-0a32-4133-93fb-f43ff6ab0037][swap buffer]] | |
5948 | f | [[#2695ed8a-e0d3-4e84-8688-98e3c50723b0][kill-whole-line]] | [[#869f0aec-c739-4fb7-8e3a-8b55ab637765][print-var-at-point]] | [[#e7e4dd0b-418f-48ee-b366-9e733e3bec61][kill rest of line]] | |
5949 | g | [[#a58a1eda-43ed-437e-b483-5c312e0754a7][other-window / cancel]] | [[#a287d720-4419-4546-8262-1f377bb158d2][abort-recursive-edit]] | [[#327e18af-30b7-47e5-aa53-5f678788b4c1][gnus]] | |
5950 | z | [[#5c30ce7e-8bc6-45bf-b9b1-5c75334a3e27][undo-tree-undo]] | | | |
5951 | x | [[#ec1403d3-528e-41b1-a195-5563bc93e124][kill-region]] | [[#bb7c95d5-dd97-439d-bf1f-cdac98d11543][append-next-kill]] | [[#47cc90e3-335f-4c44-9f39-b732e5440664][append-next-kill]] | |
5952 | c | [[#400f06e1-8e45-443c-8d7b-3d1bb1176aab][copy]] | [[#7a265014-1e9c-4639-ad1d-26b3416379a8][org-capture]] | [[#503e0beb-6fda-4e94-9678-d58bd3cbbc8e][copy-to-register]] | |
5953 | v | [[#16411f68-7fe0-49e8-9a73-212471594f9e][yank]] | [[#fe04fffa-6f85-483a-b329-938531109c35][insert-register]] | [[#c559e9ea-1218-4ccb-9c3a-74cbac4be220][yank pop]] | |
5954 | b | [[#3090fb11-9a11-47e5-bc98-080ebd250d37][delete-other-windows]] | [[#c18b9197-3d52-45a6-9d20-50d18fe1e7a7][isearch-backward-current-symbol]] | [[#e9dd549f-d031-418a-a0d5-30cf85e91c37][isearch-current-symbol]] | |
5955 | tab | [[#928505cb-707c-47ba-af54-5ae1df2ee07d][yas-insert-snippet]] | [[#64f91d86-afa9-4500-8d7d-ce8b2668726b][indent line]] | | |
5956 | delete | [[#e3d8653e-2282-4e3a-a4f5-29211ba2e647][kill-symbol]] | | [[#d9664937-d61c-4cc8-89c6-7f2182655c20][kill-sexp]] | |
5957 | left-arrow | [[#601c8172-f9b7-4e36-88ab-c66c2911b4d7][compile]] | | [[#91ddc121-db27-4f1c-a9ec-a4d29b96a7d2][org-shiftup]] | |
5958 | right-arrow | [[#5f66f60b-adcd-45dc-86b2-5d1225e2455c][paste selection]] | | [[#fc2147b4-a19a-4fde-bb53-e7ac28f0bfa1][org-shiftdown]] | |
5959 | backspace | [[#96f90a00-2260-4340-ae03-f4a86bd65502][backward-kill-symbol]] | | [[#606b0991-7431-4a8a-a909-b872e104cc88][backward-kill-sexp]] | |
5960 | f7 | | | | |
5961 |-----------------+--------------------------------+---------------------------------+-------------------------------+--------------------------|
5962 | right primary | C- | M- | C-M- | C-S- |
5963 |-----------------+--------------------------------+---------------------------------+-------------------------------+--------------------------|
5964 | * | [[#045c374c-b03e-42cb-b274-0f30c81fe3f3][split-window-horizontally]] | | [[#05cf6230-9263-4fd4-9812-4f32009eed46][calc-dispatch]] | |
5965 | 9 | [[#43d14154-2722-4ba5-b547-1b78c6274ebf][delete-window-or-exit]] | [[#ed93f5b8-2c7f-46f8-8d84-2e10d9bc8f87][kill-buffer-and-window]] | [[#37ef629b-fdbc-4d0b-bfa0-335eb1d408ee][kill client buffer]] | |
5966 | u | [[#327992c0-6eba-4935-aec1-49871c2a8619][universal-argument]] | | [[#7af825b1-92d8-4d5d-aaa1-8b4b466ea2e0][search-keybind]] | |
5967 | i | [[#3124e200-1d6e-4ad2-9a36-0d03e1e7dc38][-----]] | | [[#b2cc7cdd-c177-4ef2-af43-28ca7a338fda][query-replace-regexp]] | |
5968 | o | [[#b87a2c8a-7eb3-4661-9b28-589d14206c41][occur]] | | [[#d30ac3cd-1963-4bd0-8052-98e12b6524b0][counsel-imenu]] | |
5969 | p | [[#d84de055-e92e-478d-bb39-bc39acfa1586][move-mouse-to-point]] | | [[#08e65732-2fb1-4a78-9d18-cee87eb867a7][delete-horizontal-space]] | |
5970 | j | [[#ca1ce86b-dcea-45c1-9a8e-dd4f306776e8][pop-to-mark]] | [[#b92414e2-0d5b-4576-8fa5-5e7f1e32819a][previous-error]] | [[#8fe7cac2-ab1a-4b39-aced-10c5e0157e68][register prefix]] | |
5971 | k | [[#eb1c2360-bfd4-4d5c-b789-11b5ca5ba475][jump to register]] | [[#9061b192-735a-4273-ae36-993e6fad9205][next-error]] | [[#e1d768be-6b9b-4322-931f-3e570376ae15][man]] | |
5972 | l | [[#137995db-ee30-4738-90e2-54dcd5cadcf2][ivy-switch-buffer]] | | [[#56fcff3b-ffd9-4280-a226-4b58558906b8][move cursor top bottom mid]] | |
5973 | ; | [[#150bef9a-3faa-4c72-a176-88c3be56f612][comment-dwim]] | [[#211e76d9-d89a-4cc6-abce-69397d456fda][comment-dwim]] | [[#17035e1e-bbe6-44a6-ad54-6a39b04feac3][comment-current-line-dwim]] | |
5974 | m | | | [[#9a6a1998-4ed6-485e-9b2d-c36a42d7ec1a][recursive grep]] | |
5975 | , | [[#e4f617b2-d3f1-47e4-ae7f-2d64c4fd47b9][counsel-find-file]] | | [[#e0691924-11e1-48d2-abee-27945a409676][find-file-in-project]] | |
5976 | . | [[#6e97b7f1-c5cf-48bb-9c09-db1950dc1eae][recentf-ido-find-file]] | | [[#824d422c-67b6-4d68-af11-6a2135e528f5][-]] | |
5977 | / | [[#941a7fa8-84b9-434d-89a0-1487385ec479][join lines]] | | [[#37f67593-4f60-4d3b-9aad-6c9bc4882443][copy-variable]] | |
5978 | 8 | [[#45644cfa-d408-4a69-a97a-545ef46ba656][calc-embedded-word]] | | | |
5979 | up-arrow | [[#2dade04a-8ac7-483c-8675-5268af6eca2b][back defun/headline]] | | | [[#572d6618-471a-43c7-8a50-3f5e56f45cd7][winner undo]] |
5980 | down-arrow | [[#a1f25c12-3523-45bd-9bf5-62bf3cd5ca43][forward dfun/headline]] | | [[#57a09286-94c6-4b9f-953a-7368743f95ec][toggle-mark-activation]] | [[#9c87093b-7e30-44fb-83c9-c1b176074a5d][smex-major-mode-commands]] |
5981 | lbracket | [[#9d9916dd-3280-47dd-aab1-cd28d5ebfe15][----]] | | [[#c10b53e9-657c-48f4-8afb-cad0e709bcd6][scroll-right]] | |
5982 | rbracket | [[#21b38c6b-3a46-4a08-8eca-d44abb148287][fill-paragraph]] | | [[#095c3d97-bc49-419a-a8c0-c7a21d46d980][scroll-left]] | |
5983 | return | [[#db6e4c41-c048-4bef-b0c9-e129464c056d][newline next line]] | [[#10b2591a-5628-46ee-b395-682e91efcb83][non-indented newline]] | [[#1fc4f025-719f-4866-a9ab-23b30e4581b1][open newline on previous line]] | |
5984 | space | [[#b7d5a893-3045-4968-a150-cb813fddfe9e][org-edit-special]] | | [[#47b5912e-edc7-42ec-841b-f0e202b7f593][spell check word]] | |
5985 |-----------------+--------------------------------+---------------------------------+-------------------------------+--------------------------|
5986 | left secondary | C- | M- | C-M- | C-S- |
5987 |-----------------+--------------------------------+---------------------------------+-------------------------------+--------------------------|
5988 | = | | | | |
5989 | 1 | | | | |
5990 | 4 | | | [[#2d4de3c9-9e0c-4ab4-89e3-e41bfed3c9a7][widen]] | |
5991 | 5 | | | | |
5992 | tab-key | [[#2f527321-7f78-421b-b0c4-6fc810da0246][query-replace]] | | | |
5993 | t | [[#3bcdf4a3-f33c-4dad-ba94-e4fd3775eca6][org change todo state]] | | [[#47c64b9c-346d-45ad-8c38-865fe22d31a6][org insert timestamp]] | |
5994 | home | [[#1919659a-b466-4519-9276-8bf06a916066][start of buffer]] | | | |
5995 | end | [[#0a7bd629-cbcc-4761-8fe2-cc9370b985a4][end of buffer]] | | | |
5996 | f9 | | | | |
5997 |-----------------+--------------------------------+---------------------------------+-------------------------------+--------------------------|
5998 | right secondary | C- | M- | C-M- | C-S- |
5999 |-----------------+--------------------------------+---------------------------------+-------------------------------+--------------------------|
6000 | 6 | [[#e44e584b-d925-4036-9ad5-a90d02e74bef][save-buffers-kill-emacs]] | | [[#da73de75-0914-4f48-81d5-9b408433b14b][insert-small-copyright]] | |
6001 | 7 | | | [[#a68c6b8e-9911-475e-ab35-e239771fe881][insert-full-copyright]] | |
6002 | 0 | [[#96ae2fcc-3a0c-40c4-aef8-06aff3fd42be][text-scale-reset]] | | [[#0e7f83a5-600e-4016-af98-95904300c016][insert-apache]] | |
6003 | - | | | [[#6febc7ea-9cc7-488c-af34-538b8e69633b][org-edit-src-exit]] | |
6004 | y | [[#97aee7f1-3647-4602-a65a-45e8a3aa3a7c][undo-tree-redo]] | | | |
6005 | \ | [[#69005926-08ab-4adc-a163-44fed609cc95][sr-speedbar-toggle]] | | [[#27045e96-59a3-45b4-b0ff-6247aa5ed47e][mark-defun]] | |
6006 | h | [[#3c5f241f-fc62-459d-ab85-6b7c1fb04801][help-prefix]] | | | |
6007 | ' | [[#9f252721-a2d5-46c6-b268-8ed597256229][eval-expression]] | | | |
6008 | n | [[#65ac9206-1a67-48dc-8b72-26d763d7bf2b][unpop-to-mark-command]] | | [[#34fb8fbd-42dc-46b0-8c3c-c7e51edc9687][narrow-to-region]] | |
6009 | rshift | | | | |
6010 | escape | [[#da8bae21-a7be-45de-8027-1b26e6285e40][find-tag]] | | | |
6011 |-----------------+--------------------------------+---------------------------------+-------------------------------+--------------------------|
6012 #+END:
6013
6014 * persistent registers
6015 This needs to be at the end, because I visit a file, thus setting a
6016 mode, and the mode hook needs to be setup before that.
6017
6018 I'm using persistent registers instead of bookmarks. I dun use them
6019 much, so the added hassle of having to set it within this file is
6020 worth the benefit of only having one concept in my mind.
6021 #+begin_src emacs-lisp
6022 (dolist
6023 (r `(
6024 (?i (file . ,"~/.emacs.d/my-init.org"))
6025 (?t (file . ,"/a/x.txt"))
6026 ))
6027 (set-register (car r) (cadr r)))
6028 #+end_src
6029
6030 * keybind notes
6031 common keys, which would be better off doing swaps than rebinds:
6032 c-x prefix -> c-s
6033 c-c prefix -> c-d
6034 yank c-y -> c-c
6035 search c-s -> kp-add
6036 kill line c-k -> c-f
6037 undo c-_ -> c-z
6038 set-mark-command c-@ -> kp-enter
6039 quoted-insert c-q -> c-m-q
6040 recenter-top-bottom c-l -> c-m-3
6041 kill-region c-w -> c-x
6042
6043 commands to make less accessible
6044 narrow-to-defun/subtree -> M-2 maybe
6045 occur
6046
6047 command to make more accessible, ...
6048
6049
6050 * misc useful functions I'd rather have in a list than burried
6051 #+begin_src emacs-lisp :tangle no
6052 ;; these are usefull with (goto-char)
6053 ;; find named entity, other than headline
6054 (org-find-entry-with-id "string-number-or-symbol")
6055
6056 (org-find-exact-headline-in-buffer "heading" nil t)
6057
6058 (byte-recompile-file (expand-file-name "~/.emacs.d/my-init.el") t 0)
6059 (byte-recompile-directory (expand-file-name "~/.emacs.d") 0)
6060 (byte-recompile-directory (expand-file-name "~/.emacs.d/src/haskell-mode") 0)
6061
6062 ;; remove any indent level which is throughout the buffer
6063 (org-do-remove-indentation)
6064
6065 #+end_src
6066
6067 * TESTING / DEVELOPMENT AREA
6068
6069 ** new
6070 #+begin_src emacs-lisp
6071
6072
6073 #+end_src
6074
6075 ** key logging
6076 this article convinced me that trying to experiment with modal editing is a waste.
6077 http://chrisdone.com/posts/speculations-on-exclusive-editing
6078 I want to record my emacs commands simply to find optimiaztions, like if I often do some M-x command and should bind it
6079 to a key.
6080
6081
6082 #+begin_src emacs-lisp :tangle no
6083
6084 (setq keylog-list nil)
6085 (setq keylog-mode nil)
6086
6087 (defun keylog-save ()
6088
6089 ;; Check that the lock file does not exist
6090 (when (keyfreq-file-is-unlocked)
6091 ;; Lock the file
6092 (keyfreq-file-claim-lock)
6093
6094 ;; Check that we have the lock
6095 (if (eq (keyfreq-file-owner) (emacs-pid))
6096 (unwind-protect
6097 (progn
6098 ;; Load values and merge them with the current keyfreq-table
6099 (keyfreq-table-load table)
6100
6101 ;; Write the new frequencies
6102 (with-temp-file keyfreq-file
6103 (prin1 (cdr (keyfreq-list table 'no-sort)) (current-buffer))))
6104
6105 ;; Release the lock and reset the hash table.
6106 (keyfreq-file-release-lock)
6107 (clrhash table))
6108 )))
6109
6110 (defun my-keylogger-function ()
6111 (setq keylog-list (cons (list (current-time) current-prefix-arg this-command) keylog-list)))
6112 (add-hook 'pre-command-hook 'my-keylogger-function)
6113
6114 #+end_src
6115
6116 in a lisp expression, ; \\[ throws off forward-sexp
6117 when not in emacs lisp mode,
6118 even with (with-syntax-table emacs-lisp-mode-syntax-table
6119 forward-sexp)
6120 which is found in preceding-sexp
6121 potentially a bug, either in with-syntax-table, or
6122 in scan-lists, which is implemented in C
6123
6124
6125
6126
6127 why did it go to the init file?
6128 change EDITOR to emacsclient
6129 xserver-xorg-core=2:1.14.3-3ubuntu2
6130 (setq-default header-line-format nil) ; Copy mode-line
6131 (setq-default mode-line-format nil) ;
6132
6133
6134 #+RESULTS:
6135 : set-food-completions
6136
6137
6138
6139 useless gnus group keys:
6140 a
6141 c
6142
6143
6144 (add-to-list 'load-path "~/.emacs.d/emacs/site-lisp/org")
6145
6146 #+begin_src emacs-lisp
6147 (add-hook 'org-mode-hook
6148 (lambda () (define-key org-mode-map (kbd "C-y") nil)))
6149
6150 #+end_src
6151
6152
6153
6154
6155 (defun comint-send-string (process string)
6156 "Like `process-send-string', but also does extra bookkeeping for Comint mode."
6157 (if process
6158 (with-current-buffer (if (processp process)
6159 (process-buffer process)
6160 (get-buffer process))
6161 (comint-snapshot-last-prompt))
6162 (comint-snapshot-last-prompt))
6163 (process-send-string process string))
6164
6165
6166 * python
6167 todo: get smart-operator to work
6168 todo, checkout https://github.com/python-rope/ropemacs refactoring python,
6169 todo, try py-autopep8, autoformatter
6170 todo, check out some python linting stuff. pychecker is one, others are in *packages*
6171 todo, finish reading through python-mode.el functions
6172 ;; todo, figure out multi-line input in shell mode
6173
6174
6175 usefull m-x commands:
6176 m-x py-describe-mode: doc for mode which is extensive
6177 m-x py-sort-imports
6178 m-x py-guess-indent-offset: setup indent for code i didn't write
6179
6180 possibly usefull commands:
6181 found via looking through python-mode.el, quit like 1/4 through, cuz its tedious, last spot was at:
6182 (defun py-comment-region (beg end &optional arg)
6183 after finding py-describe-mode, it seemed to do a good job of documenting all the most important stuff
6184
6185 py-switch-to-python
6186 python-shell-completion-complete-or-indent may be usefull to get completion working in the shell
6187 py-insert-default-shebang
6188 py-electric-*
6189 py-indent-line-outmost
6190 py-newline-and-close-block
6191 py-indent-and-forward (indent line, move to next)
6192 py-fill-*
6193 py-which-function (for showing in the modeline)
6194 py-help-at-point
6195 py-execute-import-or-reload
6196 py-execute-def-or-class
6197 various pdb functions
6198
6199
6200 installing jedi
6201 #+begin_src sh :tangle no
6202 pi python-pip
6203 s pip install jedi virtualenv
6204 #+end_src
6205 then do m-x jedi:install-server
6206
6207
6208
6209 disabled because it takes 152 ms to load,
6210 and I don't know how to do it conditioally
6211 #+begin_src emacs-lisp :tangle no
6212
6213 ;; change from default python3 to be compatibile with Pywikibot
6214 (setq py-shell-name "/usr/bin/python")
6215 (require 'python-mode)
6216
6217 (setq py-autopep8-options '("--max-line-length=110"))
6218
6219 (defun py-execute-block-or-clause-create-shell ()
6220 (interactive)
6221 (cond ((get-buffer "*Python*")
6222 (py--execute-prepare "block-or-clause")
6223 (py-execute-block-or-clause)
6224 (call-interactively 'next-line))
6225 (t
6226 (py-shell)
6227 ;; py-shell starts the shell but not display the buffer on the first run
6228 ;; subsequent runs, it does. I grabbed this command from inside to
6229 ;; do just the relevant part from the second run, as a hack.
6230 ;; todo: report a bug on this
6231 (py--shell-manage-windows py-buffer-name))))
6232 (setq py-tab-shifts-region-p t)
6233 (setq py-tab-indents-region-p t)
6234
6235 (defun py-run ()
6236 "default action to run the current buffer"
6237 (basic-save-buffer)
6238 (py-execute-buffer))
6239
6240
6241 (add-hook 'python-mode-hook
6242 (lambda ()
6243 (setq run-fun 'py-run)
6244 (define-key python-mode-map (kbd "C-M-a") nil)
6245 (define-key python-mode-map (kbd "C-M-d") nil)
6246 (define-key python-mode-map (kbd "C-M-e") nil)
6247 (define-key python-mode-map (kbd "C-M-h") nil)
6248 (define-key python-mode-map (kbd "C-M-i") nil)
6249 (define-key python-mode-map (kbd "C-M-u") nil)
6250 (define-key python-mode-map (kbd "C-M-x") nil)
6251 (define-key python-mode-map (kbd "<tab>") 'indent-for-tab-command)
6252 (define-key python-mode-map (kbd "C-j") nil)
6253 (define-key python-mode-map (kbd "<C-backspace>") nil)
6254 ;;(define-key python-mode-map (kbd "C-(") (lambda () (interactive) (basic-save-buffer) (py-execute-buffer)))
6255 ;; fix default return bindings
6256 (define-key python-mode-map (kbd "C-j") nil)
6257 (define-key python-mode-map (kbd "RET") nil)
6258 (define-key python-mode-map (kbd "<return>") 'py-newline-and-indent)
6259 (define-key python-mode-map (kbd "<M-tab>") 'py-indent-line)
6260 (define-key python-mode-map (kbd "C-M-(") 'py-shift-left)
6261 (define-key python-mode-map (kbd "C-M-)") 'py-shift-right)
6262 (define-key python-mode-map (kbd "<home>") 'py-beginning-of-line)
6263 (define-key python-mode-map (kbd "<end>") 'py-end-of-line)
6264 (define-key python-mode-map (kbd "C-t") 'py-execute-block-or-clause-create-shell)
6265 (define-key python-mode-map (kbd "<S-delete>") 'py-ian-execute-line-or-region)
6266 ;; python mode adds these to this list, which is normally empty.
6267 ;; it makes my send-python function not reuse an existing python shell window
6268 ;; there are other ways to override this, but I don't know of any other value of
6269 ;; having this set.
6270 (setq same-window-buffer-names (delete "*Python*" same-window-buffer-names))
6271 (setq same-window-buffer-names (delete "*IPython*" same-window-buffer-names))))
6272
6273 ;; i dunno, why, but this didn't work:
6274 ;; and we can't eval-after-load cuz it is part of the greater python mode file
6275 (add-hook 'py-shell-hook
6276 (lambda ()
6277 (define-key py-shell-map "\r" nil)
6278 (define-key py-shell-map (kbd "<return>") 'comint-send-input)
6279 (define-key py-shell-map (kbd "C-t") 'py-shell-toggle-arrow-keys)
6280 (define-key py-shell-map "\C-d" nil)
6281 (define-key py-shell-map (kbd "<up>") 'my-comint-previous-input)
6282 (define-key py-shell-map (kbd "<down>") 'my-comint-next-input)))
6283
6284
6285 (defun py-ian-execute-line-or-region ()
6286 (interactive)
6287 (cond ((get-buffer "*Python*")
6288 (if mark-active
6289 (py-execute-region)
6290 (py-execute-statement))
6291 (call-interactively 'next-line))
6292 (t (py-shell))))
6293
6294 ;; http://tkf.github.io/emacs-jedi/latest/
6295 (add-hook 'python-mode-hook 'jedi:setup)
6296 (setq jedi:complete-on-dot t)
6297
6298 (defun py-shell-toggle-arrow-keys ()
6299 (interactive)
6300 (toggle-arrow-keys py-shell-map))
6301
6302 #+end_src
6303
6304
6305 ;; py-shell window stuff
6306 ;; it splits the window if the shell is in a different frame
6307 ;; which seems to be a bug, but it can be fixed with this option
6308 ;; (setq py-keep-windows-configuration 'force)
6309 ;; however, with py-execute-block-or-clause, if the shell is in a different frame,
6310 ;; you get errors "buffer is read only", when the point is near the beginning of a command
6311 ;; todo: test with emacs -Q and file a bug
6312 ;; if you execute py-execute-... without a python shell open,
6313 ;; it starts one, doesn't display it, and subsequent py-execute commands
6314 ;; give error "buffer is read only"
6315 ;; these functions fix / improve these problems
6316
6317
6318 ** initial python-mode setup
6319
6320 python-mode seems to be the most canonical package, based on
6321 https://docs.python.org/devguide/emacs.html
6322 much more feature rich than the emacs built in one.
6323
6324 getting it, it wants you to setup an account on launchpad by default,
6325 there is some way to get anonymous bzr access, but google didn't answer it right away,
6326 so fuck it, ill go the happy path.
6327
6328 based on error messages,
6329 add public ssh key to https://launchpad.net/people/+me
6330 bzr launchpad-login iank
6331 cd ~/.emacs.d/src/
6332 bzr branch lp:python-mode
6333
6334 add lines from INSTALL to init
6335
6336
6337 ** background on packages
6338 jedi appears most popular based on github stats
6339 pysmell appears dead
6340 ac-python appears dead
6341 https://github.com/proofit404/anaconda-mode seems to be kicking along
6342
6343
6344 ** misc notes:
6345
6346 python-mode has a TON of functions that are just aliases or verbatim wrappers of other functions.
6347 also has undocumented/unused vars all around. it is quite annoying.
6348
6349 the dedicated argument to py-shell does nothing,
6350 and py-dedicated-shell just sets that, so it is a waste
6351
6352
6353 ** background on sending to python shell
6354
6355 using the builtin python execute shell functions, sending one line doesn't really work well.
6356 The bulit in functions don't wait for further input if a block is not closed.
6357 And doing a copy/paste thing gets messed up because of indents.
6358 With some hacking, I could probably do copy/paste and remove indents, only to a
6359 certain level if we have entered a block and are waiting to finish it.
6360 But just doing the builtin execute block is a decent work around.
6361
6362
6363 Here is the scrapped function for single line built in sending to shell.
6364
6365
6366 (setq w32-enable-num-lock nil)
6367 (global-set-key (kbd "<num_lock>") 'left-char)
6368
6369
6370 (defun sqlup-find-correct-keywords ()
6371 "If emacs is handling the logic for syntax highlighting of SQL keywords, then we piggyback on top of that logic. If not, we use an sql-mode function to create a list of regular expressions and use that."
6372 (mapcar 'car (sql-add-product-keywords sql-product '())))
6373
6374
6375 largest subarray sum, array of pos and neg ints.