1 ;; 13-misc-sy.el --- Miscellaneous Settings -*- Emacs-Lisp -*-
3 ;; Copyright (C) 2007 - 2013 Steve Youngs
5 ;; Author: Steve Youngs <steve@sxemacs.org>
6 ;; Maintainer: Steve Youngs <steve@sxemacs.org>
7 ;; Created: <2007-12-02>
8 ;; Time-stamp: <Saturday Jun 6, 2015 16:26:13 steve>
9 ;; Download: <http://bastard.steveyoungs.com/~steve/SXEmacs/inits/>
10 ;; HTMLised: <http://bastard.steveyoungs.com/~steve/SXEmacs/htmlinits/13-misc-sy.html>
11 ;; Git Repo: git clone http://git.sxemacs.org/syinit
12 ;; Keywords: init, compile
14 ;; This file is part of SYinit
16 ;; Redistribution and use in source and binary forms, with or without
17 ;; modification, are permitted provided that the following conditions
20 ;; 1. Redistributions of source code must retain the above copyright
21 ;; notice, this list of conditions and the following disclaimer.
23 ;; 2. Redistributions in binary form must reproduce the above copyright
24 ;; notice, this list of conditions and the following disclaimer in the
25 ;; documentation and/or other materials provided with the distribution.
27 ;; 3. Neither the name of the author nor the names of any contributors
28 ;; may be used to endorse or promote products derived from this
29 ;; software without specific prior written permission.
31 ;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
32 ;; IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
33 ;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
34 ;; DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
35 ;; FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
36 ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
37 ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
38 ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
39 ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
40 ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
41 ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
45 ;; For stuff that just doesn't seem to fit anywhere else.
50 ;; The HTML version of this file was created with Hrvoje Niksic's
51 ;; htmlize.el which is part of the XEmacs "text-modes" package.
59 ;:*=======================
60 ;:* Why type 'y e s RET' or 'n o RET' when 'y' or 'n' will do.
61 (fset 'yes-or-no-p 'y-or-n-p)
63 (setq x-allow-sendevents t)
65 ;:*======================
66 ;: Enable the command `narrow-to-region' ("C-x n n")
67 ;(setq narrow-to-region t)
68 (put 'narrow-to-region 'disabled nil)
70 ;:*======================
71 ;:* Enable `erase-buffer'
72 (put 'erase-buffer 'disabled nil)
74 ;:*======================
75 ;:* Put the mouse selection in the kill buffer
76 ;: Jan Vroonhof <vroonhof@frege.math.ethz.ch>
77 (defun mouse-track-drag-copy-to-kill (event count)
78 "Copy the dragged region to the kill ring"
79 (let ((region (default-mouse-track-return-dragged-selection event)))
81 (copy-region-as-kill (car region)
84 (add-hook 'mouse-track-drag-up-hook 'mouse-track-drag-copy-to-kill)
86 ;:*=======================
87 ;:* manual follows xref instead of opening a new buffer
88 ;: Glynn Clements <glynn@sensei.co.uk>
89 (defun Manual-follow-xref (&optional name-or-event)
90 "Invoke `manual-entry' on the cross-reference under the mouse.
91 When invoked noninteractively, the arg may be an xref string to parse
94 (if (eventp name-or-event)
95 (let* ((p (event-point name-or-event))
96 (extent (and p (extent-at p
97 (event-buffer name-or-event)
99 (data (and extent (extent-property extent 'man))))
100 (if (eq (car-safe data) 'Manual-follow-xref)
102 (error "no manual cross-reference there.")))
103 (let ((buff (current-buffer)))
104 (or (and (manual-entry name-or-event)
105 (or (eq (current-buffer) buff)
107 ;: If that didn't work, maybe it's in a different section than the
108 ;: man page writer expected. For example, man pages tend assume
109 ;: that all user programs are in section 1, but X tends to generate
110 ;: makefiles that put things in section "n" instead...
111 (and (string-match "[ \t]*([^)]+)\\'" name-or-event)
113 (message "No entries found for %s; checking other sections..."
116 (substring name-or-event 0 (match-beginning 0)) nil t)
117 (or (eq (current-buffer) buff)
118 (kill-buffer buff)))))))))
120 ;:*=======================
122 (setq frame-title-format
124 (construct-emacs-version-name)
126 (and-boundp 'sxemacs-codename
130 ;:*======================
131 ;:* Additions to the menubar.
132 (when (featurep 'menubar)
133 (require 'big-menubar)
134 (add-menu-button nil ["Fr%_ame" make-frame t] "Help"))
136 ;:*======================
137 ;:* create a Kill-Ring menu
138 (when (featurep 'menubar)
140 (defvar yank-menu-length 40
141 "*Maximum length of an item in the menu for select-and-yank.")
142 (defun select-and-yank-filter (menu)
147 (if (> (length str) yank-menu-length)
148 (setq str (substring str 0 yank-menu-length)))
155 (list 'insert (list 'current-kill count t)))
157 (setq count (1+ count))))
159 (add-submenu nil '("Kill-Ring"
161 :filter select-and-yank-filter)))
163 ;:*======================
164 ;: resize-minibuffer-mode makes the minibuffer automatically
165 ;: resize as necessary when it's too big to hold its contents.
166 ;(autoload 'resize-minibuffer-mode "rsz-minibuf" nil t)
167 ;(resize-minibuffer-mode)
168 ;(setq resize-minibuffer-window-exactly nil)
169 ;(setq minibuffer-max-depth nil)
170 (setq resize-minibuffer-mode t)
171 ;:*======================
172 ;:* don't invert colors when grabbing a password
173 ;: (because sometimes it screws up and leaves the frame
174 ;: with dorked up colors).
175 (setq passwd-invert-frame-when-keyboard-grabbed nil)
177 ;:*=======================
178 ;:* VI-style matching parenthesis
179 ;: From Eric Hendrickson edh @ med.umn.edu
180 (defun match-paren (arg)
181 "Go to the matching parenthesis if on parenthesis otherwise insert %."
183 (cond ((looking-at "[([{]") (forward-sexp 1) (backward-char))
184 ((looking-at "[])}]") (forward-char) (backward-sexp 1))))
185 (global-set-key '(control f1) 'match-paren)
187 ;:*======================
188 ;:* Inserting elisp Comments
189 ; by Jonas Luster <mailto:jonas @ nethammer.qad.org>
190 (defun elispcomment ()
191 ;:*=====================
193 (insert ";:*=======================\n")
194 (insert ";:* " (setq str (read-input "Comment: ")) "\n")
196 (global-set-key '(control f3) 'elispcomment)
198 ;:*======================
200 (require 'time-stamp)
201 (add-hook 'write-file-hooks 'time-stamp)
202 (set 'time-stamp-active t)
203 (set 'time-stamp-format "%a %3b %2d, %4y %02H:%02M:%02S %u")
205 ;:*======================
207 (require 'image-mode)
209 (Wand-find-file-enable)
211 ;:*======================
212 ;:* Dired enhancements.
214 (setq dired-ls-locale "POSIX")
216 ;; Pack and Unpack tarballs
218 (setq dired-tar-compress-with 'xz)
220 ;; FFI/libWand for image files in Dired
221 (defun sy-dired-wand ()
223 (let ((file (dired-get-filename)))
224 (Wand-display file)))
226 (define-key dired-mode-map [?b] #'sy-dired-wand)
228 ;; Play audio files directly from dired.
229 (defun sy-dired-play-audio ()
231 (let ((file (dired-get-filename)))
232 (when (string-match #r"\.\(wav\|au\|ogg\|mp3\|flac\)$" file)
233 (let ((stream (make-media-stream :file file)))
234 (play-media-stream stream)))))
236 (define-key dired-mode-map [(control ?c) ?p] #'sy-dired-play-audio)
238 ;(setq dired-use-ls-dired t)
239 ;(setq dired-listing-switches "-alih")
241 ;:*======================
242 ;:* Change some modeline indicators
243 (setq pending-delete-modeline-string " PD")
244 (setq filladapt-mode-line-string "")
245 (add-minor-mode 'abbrev-mode " Ab")
246 (add-hook 'lisp-interaction-mode-hook #'(lambda () (setq mode-name "LI")))
248 ;:*======================
249 ;:* Force efs into passive ftp because of my firewall
250 (setq efs-use-passive-mode t)
252 ;:*======================
253 ;:* ibuffer - replacement for buffer-menu
257 ibuffer-default-sorting-mode 'major-mode
258 ibuffer-fontification-level t
259 ibuffer-saved-filter-groups
263 (mode . change-log-mode))
268 (mode . emacs-lisp-mode)
278 (mode . hyper-apropos-help-mode)
279 (mode . hyper-apropos-mode)
281 (mode . Manual-mode)))
284 (mode . eicq-buddy-mode)
285 (mode . eicq-log-mode)
286 (mode . eicq-network-mode)
288 (mode . eicq-history-mode)
289 (name . "\\*eicq-debug\\*")
290 (filename . "/home/steve/\\.eicq/history/.*")))
293 (mode . emchat-buddy-mode)
294 (mode . emchat-log-mode)
295 (mode . emchat-network-mode)
297 (mode . emchat-history-mode)
298 (name . "\\*emchat-debug\\*")
299 (filename . "/home/steve/\\.emchat/history/.*")))
302 (mode . riece-channel-list-mode)
303 (mode . riece-channel-mode)
304 (mode . riece-command-mode)
305 (mode . riece-dialogue-mode)
306 (mode . riece-others-mode)
307 (mode . riece-user-list-mode)))
310 (mode . message-mode)
312 (mode . gnus-group-mode)
313 (mode . gnus-summary-mode)
314 (mode . gnus-article-mode)))
316 (mode . fundamental-mode))
319 (add-hook 'ibuffer-mode-hooks
321 (ibuffer-switch-to-saved-filter-groups "My-ibuffer-grps")
322 (ibuffer-add-to-tmp-hide "\\*scratch\\*")))
324 ;:*======================
327 (add-to-list 'auto-mode-alist '("\\.sawfishrc$" . sawfish-mode))
328 (add-to-list 'auto-mode-alist '("\\.jl$" . sawfish-mode))
330 ;:*======================
331 ;:* from.el - check whose sent us mail
336 ; from-use-other-window nil
337 ; from-quit-command 'kill-buffer
338 ; from-highlight-regexp
339 ; #r"Merge-Req\|e\(icq\|mchat\)\|pa\(?:ckages\|tch\)\|sxemacs\|x\(?:e\(?:macs\|tla\)\|wem\)")
341 ;:*======================
343 ;; FIXME: make this work, it looks interesting!
350 ; '("/usr/share/fonts/bdf")
351 ; ps-multibyte-buffer 'bdf-font-except-latin
353 ; printer-name "/dev/lp0"
355 ; ps-print-color-p nil)
357 ;:*======================
358 ;:* Line and Column numbers.
360 (column-number-mode 1)
362 ;:*======================
363 ;:* Setting initial default-directory.
364 (setq default-directory (file-name-as-directory (user-home-directory)))
366 ;:*======================
368 (when (featurep 'mule)
369 (add-to-list 'file-coding-system-alist '("ChangeLog" . binary)))
371 ;:*======================
372 ;:* Directory Abbrevs
373 (setq directory-abbrev-alist
374 `(("^/instcore" . ,(concat (car emacs-roots)
376 emacs-program-version))
377 ("^/instpkg" . ,(concat (car emacs-roots)
379 ("^/prog" . "~/programming")
380 ("^/linux" . "/usr/src/kernel/linux")
381 ("^/src" . "/usr/src")
382 ("^/sxe" . "/home/steve/programming/SXEmacs")
383 ("^/core" . "/home/steve/programming/SXEmacs/core/sxemacs.git")
384 ("^/web" . "/home/steve/programming/SXEmacs/web/website")))
386 ;:*======================
387 ;:* The beginnings of procmail-mode.el.
389 ;; I can't remember who I stole this from, but if it was you, please
390 ;; let me know so I can give you the credit you deserve.
391 (defvar procmail-font-lock-keywords)
393 (define-derived-mode procmail-mode fundamental-mode "Procmail"
394 "Major mode for editing procmail recipes."
396 (setq comment-start "#")
397 (setq comment-start-skip "#[ \t]*")
400 (setq procmail-font-lock-keywords
402 . font-lock-comment-face)
404 . font-lock-type-face)
406 . font-lock-keyword-face)
408 . font-lock-doc-string-face)
410 . font-lock-function-name-face)))
413 (add-to-list 'auto-mode-alist '("\\.procmailrc$" . procmail-mode))
415 ;; And because my ~/.procmailrc has lots of high ASCII to defeat
416 ;; Chinese SPAM I set its coding to binary.
417 (when (featurep 'mule)
418 (add-to-list 'file-coding-system-alist '("\\.procmailrc$" . binary)))
420 ;:*======================
423 build-rpt-prompts '(("Status?: "
425 "Success (tests fail)"
427 "Failure (tests fail)"
428 "OK (with issues)")))
429 build-rpt-use-gnus-group "nnml:sxemacs.builds"
430 build-rpt-use-gnus-p t
431 build-rpt-make-output-files
432 '(;"~/programming/SXEmacs/core/sxemacs.git/=build/,,vars.out"
433 ;"~/programming/SXEmacs/core/sxemacs.git/=build/,,beta.out"
434 ;"~/programming/SXEmacs/core/sxemacs.git/=build/,,make-all.out"
435 ;"~/programming/SXEmacs/core/sxemacs.git/=build/,,make-check-temacs.out"
436 ;"~/programming/SXEmacs/core/sxemacs.git/=build/,,make-check.out"
437 ;"~/programming/SXEmacs/core/sxemacs.git/=build/,,make-install.out"
438 "/usr/src/sxemacs/make.err"
439 "/usr/src/sxemacs/check.err"
440 "/usr/src/sxemacs/install.err"
443 ;:*======================
444 ;:* Set the frame geometry
445 (unless (getenv "XWEM_RUNNING")
446 (setq initial-frame-plist '(top 23 left 26 width 95 height 40)
447 default-frame-plist '(top 3 left 26 width 95 height 40 name "SXEFrame")))
449 ;:*======================
450 ;:* The Beginnings of a Finance package
453 emoney-bank-url "https://internetbanking.suncorpbank.com.au/"
454 emoney-date-format "%Y-%m-%d"
455 emoney-default-account "scorp-main.emy"
456 emoney-recalculate-on-quit t
457 emoney-save-after-recalculate t
458 emoney-use-new-frame t)
460 ;:*======================
461 ;:* Modeline enhancements.
463 ;; Reorganise the modeline so that the line and column numbers are on
464 ;; the left where you can see them. Also add a bit of colour to the
465 ;; left and right ID extents so they stand out.
466 (when (or (< emacs-minor-version 5)
468 (setq-default modeline-buffer-identification
469 (list (cons modeline-buffer-id-left-extent
471 (list 'line-number-mode "L%l ")
472 (list 'column-number-mode "C%c ")
473 (list (cons -3 (list "%p")))
475 (cons modeline-buffer-id-right-extent "%17b")))
481 (if (boundp 'modeline-multibyte-status)
482 "%C" ;modeline-multibyte-status
484 (cons modeline-modified-extent 'modeline-modified)
485 (cons modeline-buffer-id-extent 'modeline-buffer-identification)
489 (cons modeline-minor-mode-extent
490 (list "" 'mode-name 'minor-mode-alist))
491 (cons modeline-narrowed-extent "%n")
496 (set-extent-face modeline-buffer-id-left-extent 'font-lock-warning-face)
497 (set-extent-face modeline-buffer-id-right-extent 'font-lock-comment-face))
499 ;:*======================
500 ;:* Enable funky completion.
502 ;; This allows you to do things like type "M-x b-c-f RET" and it will
503 ;; expand to `byte-compile-file'.
506 ;:*======================
507 ;:* Misc Stuff that I haven't yet put anywhere permanent
509 ;; I used to have my browse-url setting here, but because of xdg that
510 ;; really isn't necessary anymore.
513 allow-deletion-of-last-visible-frame t
515 complex-buffers-menu-p t
516 etalk-process-file "talk"
517 find-function-source-path nil
518 font-menu-ignore-scaled-fonts nil
520 mail-user-agent 'message-user-agent
521 modeline-scrolling-method 'scrollbar
522 progress-feedback-use-echo-area t
523 report-xemacs-bug-no-explanations t
525 lookup-syntax-properties nil)
527 (quietly-read-abbrev-file)
528 (add-hook 'text-mode-hook 'turn-on-auto-fill)
529 ;(customize-set-variable 'gutter-buffers-tab-visible-p nil)
530 (setq gutter-buffers-tab-enabled nil)
531 (customize-set-variable 'user-mail-address "steve@steveyoungs.com")
532 (setq query-user-mail-address nil)
533 (blink-cursor-mode 1)
534 (when (featurep 'mule)
535 (set-language-environment "Latin-1"))
536 (unless (gnuserv-running-p)
540 ;:*=======================
544 (setq toolbar-info-frame-plist
546 (name . "InfoFrame")))
548 (unless (fboundp 'Info-search-next)
549 (defun Info-search-next ()
550 "Repeat search starting from point with last regexp used in `Info-search'."
552 (Info-search Info-last-search))
553 (define-key Info-mode-map "z" 'Info-search-next))
557 '("/home/steve/.local/share/sxemacs/site-packages/info"
559 ;; "/usr/share/sxemacs/site-packages/info"
560 ;; "/usr/share/sxemacs/sxemacs-packages/info"
561 "/usr/share/sxemacs/xemacs-packages/info"
562 "/usr/share/sxemacs/mule-packages/info")
563 Info-dir-contents-directory
564 "/home/steve/.local/share/sxemacs/site-packages/info"
565 Info-save-auto-generated-dir 'always)
567 ;:*=======================
569 (add-hook 'gdb-mode-hook #'(lambda () (require 'gdb-highlight)))
571 ;:*=======================
574 (defun sy-find-tag-regex (tagname)
575 "Use `igrep-find' command to find all occurances of tag with TAGNAME."
576 (interactive (if current-prefix-arg (list (current-word))
577 (list (find-tag-tag "Find tag: "))))
578 (let ((dir (file-name-directory tags-file-name)))
579 (igrep-find "grep" tagname (concat dir "/*"))))
581 ;:*=======================
583 (require 'google-query)
584 (setq google-query-mirror "https://www.google.com.au"
585 google-query-result-count 100)
586 (global-set-key [(control f9)] 'google-query)
587 (global-set-key [(meta f9)] 'google-query-region)
589 ;:*=======================
590 ;:* What the fuck does that acronym mean?
591 ;; This requires wtf(6). No idea where you get it from, but it comes
593 ;; (wtf "lol") => LOL: laughing out loud
595 "What the fuck is... ACRONYM"
596 (interactive "sWhat the fuck is: ")
597 (let* ((wtf (executable-find "wtf"))
598 (term (substring (shell-command-to-string
599 (concat wtf " " acronym)) 0 -1)))
601 (if current-prefix-arg
606 ;:*=======================
607 ;:* Interactively append to the latest kill
609 (defun sy-add-to-kill (start end &optional prepend)
610 "Copy region START END and append it to the latest kill.
612 Or, PREPEND with prefix arg.
614 With this you could select \"THIS \" word, `\\[kill-ring-save]' to save it
615 to the kill ring, then select this \"WORD \" and do `\\[sy-add-to-kill]',
616 then select this word \"HERE\", do `\\[sy-add-to-kill]', then select these
617 words \"DON'T WANT \", do `\\[universal-argument] \\[sy-add-to-kill]', and
618 finally do `\\[yank]' and you'd get...
620 DON'T WANT THIS WORD HERE"
622 (let ((prepend (or prepend
623 current-prefix-arg)))
625 (kill-append (buffer-substring start end) 'before)
626 (kill-append (buffer-substring start end) nil))))
628 (global-set-key [(meta ?W)] 'sy-add-to-kill)
630 ;:*=======================
632 (add-to-list 'auto-mode-alist '("/var/chroot/named/etc/zones/.*$" . dns-mode))
634 (defun dig-mx (domain)
635 "View MX records for DOMAIN.
637 With a prefix arg, prompt for a server to query."
638 (interactive "sDomain: ")
639 (unless (interactive-p)
640 (error 'invalid-operation "`dig-mx' must be called interactively"))
641 (if current-prefix-arg
642 (dig domain "MX" nil nil nil
643 (format "%s" (read-string "Server: " nil nil "localhost")))
646 (defun dig-ns (domain)
647 "View NS records for DOMAIN.
649 With a prefix arg, prompt for a server to query."
650 (interactive "sDomain: ")
651 (unless (interactive-p)
652 (error 'invalid-operation "`dig-ns' must be called interactively"))
653 (if current-prefix-arg
654 (dig domain "NS" nil nil nil
655 (format "%s" (read-string "Server: " nil nil "localhost")))
658 (defun dig-any (domain)
659 "View DNS records for DOMAIN.
661 With a prefix arg, prompt for a server to query."
662 (interactive "sDomain: ")
663 (unless (interactive-p)
664 (error 'invalid-operation "`dig-any' must be called interactively"))
665 (if current-prefix-arg
666 (dig domain "ANY" nil nil nil
667 (format "%s" (read-string "Server: " nil nil "localhost")))
670 ;:*=======================
671 ;:* Hard disk temperature!
672 ;(or (ignore-errors (require 'hddtemp))
674 ; (load-module "cl-loop")
675 ; (require 'hddtemp)))
677 ;;; get fancy and stick it in the modeline
678 ;(defvar hddtemp-global-mode-string "sda:0°C"
679 ; "Default hddtemp modeline string.")
680 ;(setq global-mode-string (append global-mode-string
681 ; (list hddtemp-global-mode-string)))
683 ;(defun hddtemp-modeline-string ()
684 ; (let* ((disc0 (hddtemp 0))
685 ; (str (format "sda:%s°%s"
686 ; (nth 2 disc0) (nth 3 disc0))))
687 ; (setq hddtemp-global-mode-string str)))
689 ;(start-itimer "hdd-modeline"
692 ; (setq global-mode-string
693 ; (delq hddtemp-global-mode-string global-mode-string))
694 ; (hddtemp-modeline-string)
695 ; (setq global-mode-string
696 ; (append global-mode-string
697 ; (list hddtemp-global-mode-string)))))
700 ;:*=======================
702 ; M-x term usually gives really horrid "staircase" output. This fixes
704 (add-hook 'term-exec-hook
706 (set-buffer-process-coding-system 'binary 'binary)))
708 ;:*=======================
709 ;:* Phonetic Alphabet
710 (defvar phonetics-hash
711 #s(hash-table test equal
749 "Hash table of phonetic alphabet.")
751 (defun phoneticise (string)
752 "Return STRING rewritten using the phonetic alphabet.
754 For example: \"cat\" => \"charlie alpha tango\".
755 With a prefix arg, insert phoneticised string at point.
756 It ignores punctuation."
757 (interactive "sString to phoneticise: ")
758 (let ((str (string-to-list (downcase string)))
762 (insert (or (gethash (char-to-string (car str)) phonetics-hash)
763 (char-to-string (car str))) " ")
764 (setq str (cdr str)))
765 (setq phonetics (buffer-string)))
766 (if current-prefix-arg
769 (message "%s" phonetics)
772 ;:*=======================
773 ;:* Copy the text without the extents
774 (defun sy-extent-kill-save ()
775 "Save the extent under point's string to kill ring."
777 (kill-new (extent-string (extent-at (point)))))
779 ;:*=======================
783 ;:*=======================
784 ;:* There's a new sexy rc.d style init in SXEmacs, and this is how I
787 ;; I now have my init files named with a 2 digit numerical prefix.
788 ;; This is that I can control which order `lisp-initd-compile-and-load'
789 ;; will load my stuff. Consequently, finding a particular init file is
790 ;; much harder now because I can never remember what bloody number it
791 ;; has. This takes the remembering out of the equation.
792 (defvar sy-init-hash (make-hash-table :test #'equal :size 20)
793 "A hash table of my numbered init files.")
795 (defvar sy-init-files
796 (directory-files lisp-initd-dir nil ".*\.el$" 'sorted-list t)
797 "List of my init files.")
801 (let ((key (substring value 3 -3)))
802 (puthash key value sy-init-hash)))
805 (defvar sy-init-hash-vector (hash-keys-to-vector sy-init-hash)
806 "A vector from my init file hash to use for completion.")
808 (defvar sy-init-history nil
809 "History for `sy-init-file-other-window'.")
811 (defun sy-init-file-other-window (initf &optional codesys)
812 "Basically, `find-file-other-window', but for my init files.
814 Argument INITF is the \"base\" name of the init file.
815 Optional prefix arg, CODESYS, is to specify a coding system to use.
817 I have this because I've prefixed all of my init files with a 2
818 digit number so I can ensure they get loaded in the right order with
819 `lisp-initd-compile-and-load'. And I can never remember what init
820 files are assigned what numbers."
821 (interactive (list (completing-read "Init file: "
822 (mapcar #'list sy-init-hash-vector)
823 nil nil nil sy-init-history)
824 (when current-prefix-arg
825 (read-coding-system "Coding System: "))))
826 (let* ((lib (gethash initf sy-init-hash))
827 (expanded (expand-file-name lib lisp-initd-dir)))
828 (find-file-other-window expanded codesys)))
830 (global-set-key [(control ?x) ?4 ?i] #'sy-init-file-other-window)
831 ;:*=======================
833 ;; Nifty little thing that hides the menubar and makes it visible when
834 ;; the rat is on the toolbar.
836 ;(require 'active-menu)
839 ;:*=======================
840 ;:* LiveJournal posting thingy
842 (setq lj-cookie-flavour 'chrome)
843 ;(setq lj-cookie-flavour 'firefox)
844 (setq lj-user-id "bastard_blog")
845 (setq lj-archive-posts t)
846 (setq lj-bcc-address "Steve Youngs <steve@localhost>")
847 (setq lj-default-location "Brisbane, Australia")
850 <p style=\"color:#FD00FD;font-size:10pt;font-weight:bold;\">
851 Till next time...<br />
854 (add-hook 'lj-before-post-hook #'lj-validate)
855 (add-hook 'lj-after-post-hook #'lj-get-tags)
857 ;:*=======================
860 ;; numpoints -- make numbered list points. Before using, initialise
861 ;; numeric register `n' to zero
862 (number-to-register 0 ?n)
864 (read-kbd-macro "2*RET 2*SPC C-x r + n C-x r i n C-e ) SPC"))
865 (global-set-key [(control ?c) (control ?n)] #'numpoints)
866 (define-key message-mode-map [(hyper ?n)] #'numpoints)
868 ;:*=======================
869 ;:* Do things with environment variables let-bound
871 ;; (with-environment-variables (("VAR" "VALUE") ("VAR2" "VALUE2"))
874 ;(require 'with-environment-variables)
876 ;:*=======================
879 (setq sudoku-level 'easy)
881 ;:*=======================
882 ;:* Stupid fucking Google Chrome is MIME-illiterate
883 (defun sy-browse-url-of-file (&optional file)
884 "Ask a WWW browser to display FILE.
886 Display the current buffer's file if FILE is nil or if called
887 interactively. Turn the filename into a URL with function
888 `browse-url-file-url'. Pass the URL to a browser using the
889 `browse-url' function then run `browse-url-of-file-hook'.
891 This has been reworked a little to cater for Google Chrome not knowing
892 anything about MIME types."
896 (setq file (buffer-file-name))
897 (error "Current buffer has no file"))
898 (unless (string-match "^\\.html?$" (file-name-extension file t))
900 (rename-file file (concat file ".html"))
901 (setq file (concat file ".html")))
902 (let ((buf (get-file-buffer file)))
906 (cond ((not (buffer-modified-p)))
907 (browse-url-save-file (save-buffer))
908 (t (message "%s modified since last save" file))))))
911 (browse-url (browse-url-file-url file))
913 (and oldfile (rename-file file oldfile))))
914 (run-hooks 'browse-url-of-file-hook))
916 (fset #'browse-url-of-file #'sy-browse-url-of-file)
918 ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*
919 (message "miscellaneous initialised")