1 ;; 13-misc-sy.el --- Miscellaneous Settings -*- Emacs-Lisp -*-
3 ;; Copyright (C) 2007 - 2012 Steve Youngs
5 ;; Author: Steve Youngs <steve@sxemacs.org>
6 ;; Maintainer: Steve Youngs <steve@sxemacs.org>
7 ;; Created: <2007-12-02>
8 ;; Time-stamp: <Sunday Jun 10, 2012 10:59:16 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)
128 (and-boundp 'sxemacs-codename
132 ;:*======================
133 ;:* Additions to the menubar.
134 (when (featurep 'menubar)
135 (require 'big-menubar)
136 (add-menu-button nil ["Fr%_ame" make-frame t] "Help"))
138 ;:*======================
139 ;:* create a Kill-Ring menu
140 (when (featurep 'menubar)
142 (defvar yank-menu-length 40
143 "*Maximum length of an item in the menu for select-and-yank.")
144 (defun select-and-yank-filter (menu)
149 (if (> (length str) yank-menu-length)
150 (setq str (substring str 0 yank-menu-length)))
157 (list 'insert (list 'current-kill count t)))
159 (setq count (1+ count))))
161 (add-submenu nil '("Kill-Ring"
163 :filter select-and-yank-filter)))
165 ;:*======================
166 ;: resize-minibuffer-mode makes the minibuffer automatically
167 ;: resize as necessary when it's too big to hold its contents.
168 ;(autoload 'resize-minibuffer-mode "rsz-minibuf" nil t)
169 ;(resize-minibuffer-mode)
170 ;(setq resize-minibuffer-window-exactly nil)
171 ;(setq minibuffer-max-depth nil)
172 (setq resize-minibuffer-mode t)
173 ;:*======================
174 ;:* don't invert colors when grabbing a password
175 ;: (because sometimes it screws up and leaves the frame
176 ;: with dorked up colors).
177 (setq passwd-invert-frame-when-keyboard-grabbed nil)
179 ;:*=======================
180 ;:* VI-style matching parenthesis
181 ;: From Eric Hendrickson edh @ med.umn.edu
182 (defun match-paren (arg)
183 "Go to the matching parenthesis if on parenthesis otherwise insert %."
185 (cond ((looking-at "[([{]") (forward-sexp 1) (backward-char))
186 ((looking-at "[])}]") (forward-char) (backward-sexp 1))))
187 (global-set-key '(control f1) 'match-paren)
189 ;:*======================
190 ;:* Inserting elisp Comments
191 ; by Jonas Luster <mailto:jonas @ nethammer.qad.org>
192 (defun elispcomment ()
193 ;:*=====================
195 (insert ";:*=======================\n")
196 (insert ";:* " (setq str (read-input "Comment: ")) "\n")
198 (global-set-key '(control f3) 'elispcomment)
200 ;:*======================
202 (require 'time-stamp)
203 (add-hook 'write-file-hooks 'time-stamp)
204 (set 'time-stamp-active t)
205 (set 'time-stamp-format "%a %3b %2d, %4y %02H:%02M:%02S %u")
207 ;:*======================
209 (require 'image-mode)
211 (Wand-find-file-enable)
213 ;:*======================
214 ;:* Dired enhancements.
216 (setq dired-ls-locale "POSIX")
218 ;; Pack and Unpack tarballs
220 (setq dired-tar-compress-with 'bzip2)
222 ;; FFI/libWand for image files in Dired
223 (defun sy-dired-wand ()
225 (let ((file (dired-get-filename)))
226 (Wand-display file)))
228 (define-key dired-mode-map [?b] #'sy-dired-wand)
230 ;; Play audio files directly from dired.
231 (defun sy-dired-play-audio ()
233 (let ((file (dired-get-filename)))
234 (when (string-match #r"\.\(wav\|au\|ogg\|mp3\|flac\)$" file)
235 (let ((stream (make-media-stream :file file)))
236 (play-media-stream stream)))))
238 (define-key dired-mode-map [(control ?c) ?p] #'sy-dired-play-audio)
240 ;(setq dired-use-ls-dired t)
241 ;(setq dired-listing-switches "-alih")
243 ;:*======================
244 ;:* Change some modeline indicators
245 (setq pending-delete-modeline-string " PD")
246 (setq filladapt-mode-line-string "")
247 (add-minor-mode 'abbrev-mode " Ab")
248 (add-hook 'lisp-interaction-mode-hook #'(lambda () (setq mode-name "LI")))
250 ;:*======================
251 ;:* Force efs into passive ftp because of my firewall
252 (setq efs-use-passive-mode t)
254 ;:*======================
255 ;:* ibuffer - replacement for buffer-menu
259 ibuffer-default-sorting-mode 'major-mode
260 ibuffer-fontification-level t
261 ibuffer-saved-filter-groups
265 (mode . change-log-mode))
270 (mode . emacs-lisp-mode)
280 (mode . hyper-apropos-help-mode)
281 (mode . hyper-apropos-mode)
283 (mode . Manual-mode)))
286 (mode . eicq-buddy-mode)
287 (mode . eicq-log-mode)
288 (mode . eicq-network-mode)
290 (mode . eicq-history-mode)
291 (name . "\\*eicq-debug\\*")
292 (filename . "/home/steve/\\.eicq/history/.*")))
295 (mode . emchat-buddy-mode)
296 (mode . emchat-log-mode)
297 (mode . emchat-network-mode)
299 (mode . emchat-history-mode)
300 (name . "\\*emchat-debug\\*")
301 (filename . "/home/steve/\\.emchat/history/.*")))
304 (mode . riece-channel-list-mode)
305 (mode . riece-channel-mode)
306 (mode . riece-command-mode)
307 (mode . riece-dialogue-mode)
308 (mode . riece-others-mode)
309 (mode . riece-user-list-mode)))
312 (mode . message-mode)
314 (mode . gnus-group-mode)
315 (mode . gnus-summary-mode)
316 (mode . gnus-article-mode)))
318 (mode . fundamental-mode))
321 (add-hook 'ibuffer-mode-hooks
323 (ibuffer-switch-to-saved-filter-groups "My-ibuffer-grps")
324 (ibuffer-add-to-tmp-hide "\\*scratch\\*")))
326 ;:*======================
329 (add-to-list 'auto-mode-alist '("\\.sawfishrc$" . sawfish-mode))
330 (add-to-list 'auto-mode-alist '("\\.jl$" . sawfish-mode))
332 ;:*======================
333 ;:* from.el - check whose sent us mail
338 ; from-use-other-window nil
339 ; from-quit-command 'kill-buffer
340 ; from-highlight-regexp
341 ; #r"Merge-Req\|e\(icq\|mchat\)\|pa\(?:ckages\|tch\)\|sxemacs\|x\(?:e\(?:macs\|tla\)\|wem\)")
343 ;:*======================
345 ;; FIXME: make this work, it looks interesting!
352 ; '("/usr/share/fonts/bdf")
353 ; ps-multibyte-buffer 'bdf-font-except-latin
355 ; printer-name "/dev/lp0"
357 ; ps-print-color-p nil)
359 ;:*======================
360 ;:* Line and Column numbers.
362 (column-number-mode 1)
364 ;:*======================
365 ;:* Setting initial default-directory.
366 (setq default-directory (file-name-as-directory (user-home-directory)))
368 ;:*======================
370 (when (featurep 'mule)
371 (add-to-list 'file-coding-system-alist '("ChangeLog" . binary)))
373 ;:*======================
374 ;:* Directory Abbrevs
375 (setq directory-abbrev-alist
376 `(("^/instcore" . ,(concat (car emacs-roots)
378 emacs-program-version))
379 ("^/instpkg" . ,(concat (car emacs-roots)
381 ("^/prog" . "~/programming")
382 ("^/linux" . "/usr/src/linux")
383 ("^/src" . "/usr/src")
384 ("^/sexy" . "~/programming/SXEmacs")
385 ("^/sexycore" . "~/programming/SXEmacs/core")
386 ("^/sexyweb" . "~/programming/SXEmacs/web")))
388 ;:*======================
389 ;:* The beginnings of procmail-mode.el.
391 ;; I can't remember who I stole this from, but if it was you, please
392 ;; let me know so I can give you the credit you deserve.
393 (defvar procmail-font-lock-keywords)
395 (define-derived-mode procmail-mode fundamental-mode "Procmail"
396 "Major mode for editing procmail recipes."
398 (setq comment-start "#")
399 (setq comment-start-skip "#[ \t]*")
402 (setq procmail-font-lock-keywords
404 . font-lock-comment-face)
406 . font-lock-type-face)
408 . font-lock-keyword-face)
410 . font-lock-doc-string-face)
412 . font-lock-function-name-face)))
415 (add-to-list 'auto-mode-alist '("\\.procmailrc$" . procmail-mode))
417 ;; And because my ~/.procmailrc has lots of high ASCII to defeat
418 ;; Chinese SPAM I set its coding to binary.
419 (when (featurep 'mule)
420 (add-to-list 'file-coding-system-alist '("\\.procmailrc$" . binary)))
422 ;:*======================
425 build-rpt-prompts '(("Status?: "
427 "Success (tests fail)"
429 "Failure (tests fail)"
430 "OK (with issues)")))
431 build-rpt-use-gnus-group "nnml:sxemacs.builds"
432 build-rpt-use-gnus-p t
433 build-rpt-make-output-files
434 '(;"~/programming/SXEmacs/core/sxemacs.git/=build/,,vars.out"
435 ;"~/programming/SXEmacs/core/sxemacs.git/=build/,,beta.out"
436 ;"~/programming/SXEmacs/core/sxemacs.git/=build/,,make-all.out"
437 ;"~/programming/SXEmacs/core/sxemacs.git/=build/,,make-check-temacs.out"
438 ;"~/programming/SXEmacs/core/sxemacs.git/=build/,,make-check.out"
439 ;"~/programming/SXEmacs/core/sxemacs.git/=build/,,make-install.out"
440 "/usr/src/sxemacs/make.err"
441 "/usr/src/sxemacs/check.err"
442 "/usr/src/sxemacs/install.err"
445 ;:*======================
446 ;:* Set the frame geometry
447 (unless (getenv "XWEM_RUNNING")
448 (setq initial-frame-plist '(top 23 left 26 width 95 height 40)
449 default-frame-plist '(top 3 left 26 width 95 height 40)))
451 ;:*======================
452 ;:* The Beginnings of a Finance package
455 emoney-bank-url "https://internetbanking.suncorpbank.com.au/"
456 emoney-date-format "%Y-%m-%d"
457 emoney-default-account "metway-main.emy"
458 emoney-recalculate-on-quit t
459 emoney-save-after-recalculate t
460 emoney-use-new-frame t)
462 ;:*======================
463 ;:* Modeline enhancements.
465 ;; Reorganise the modeline so that the line and column numbers are on
466 ;; the left where you can see them. Also add a bit of colour to the
467 ;; left and right ID extents so they stand out.
468 (when (or (< emacs-minor-version 5)
470 (setq-default modeline-buffer-identification
471 (list (cons modeline-buffer-id-left-extent
473 (list 'line-number-mode "L%l ")
474 (list 'column-number-mode "C%c ")
475 (list (cons -3 (list "%p")))
477 (cons modeline-buffer-id-right-extent "%17b")))
483 (if (boundp 'modeline-multibyte-status)
484 "%C" ;modeline-multibyte-status
486 (cons modeline-modified-extent 'modeline-modified)
487 (cons modeline-buffer-id-extent 'modeline-buffer-identification)
491 (cons modeline-minor-mode-extent
492 (list "" 'mode-name 'minor-mode-alist))
493 (cons modeline-narrowed-extent "%n")
498 (set-extent-face modeline-buffer-id-left-extent 'font-lock-warning-face)
499 (set-extent-face modeline-buffer-id-right-extent 'font-lock-comment-face))
501 ;:*======================
502 ;:* Enable funky completion.
504 ;; This allows you to do things like type "M-x b-c-f RET" and it will
505 ;; expand to `byte-compile-file'.
508 ;:*======================
509 ;:* Misc Stuff that I haven't yet put anywhere permanent
512 allow-deletion-of-last-visible-frame t
515 ;; browse-url-browser-function #'browse-url-mozilla
516 ;; browse-url-new-window-flag t
517 ;; browse-url-mozilla-new-window-is-tab t
519 ;; browse-url-browser-function #'browse-url-firefox
520 ;; browse-url-new-window-flag t
521 ;; browse-url-firefox-new-window-is-tab t
523 ;; browse-url-browser-function #'browse-url-firefox
524 ;; browse-url-new-window-flag t
525 ;; browse-url-firefox-new-window-is-tab t
527 ;; browse-url-browser-function #'browse-url-seamonkey
528 ;; browse-url-new-window-flag t
529 ;; browse-url-seamonkey-new-window-is-tab t
531 ;; browse-url-generic-program "midori"
532 ;; browse-url-browser-function #'browse-url-generic
534 browse-url-generic-program "google-chrome"
535 browse-url-browser-function #'browse-url-generic
536 browse-url-netscape-version 7
537 browse-url-save-file t
538 ;; browse-url-xterm-program "xterm"
539 complex-buffers-menu-p t
540 etalk-process-file "talk"
541 find-function-source-path nil
542 font-menu-ignore-scaled-fonts nil
544 mail-user-agent 'message-user-agent
545 modeline-scrolling-method 'scrollbar
546 progress-feedback-use-echo-area t
547 report-xemacs-bug-no-explanations t
549 lookup-syntax-properties nil)
551 (quietly-read-abbrev-file)
552 (add-hook 'text-mode-hook 'turn-on-auto-fill)
553 ;(customize-set-variable 'gutter-buffers-tab-visible-p nil)
554 (setq gutter-buffers-tab-enabled nil)
555 (customize-set-variable 'user-mail-address "steve@sxemacs.org")
556 (setq query-user-mail-address nil)
557 (blink-cursor-mode 1)
558 (when (featurep 'mule)
559 (set-language-environment "Latin-1"))
560 (when (eq 0 (length (shell-command-to-string "ps -U steve|grep gnuserv||false")))
564 ;:*=======================
568 (setq toolbar-info-frame-plist
570 (name . "InfoFrame")))
572 (unless (fboundp 'Info-search-next)
573 (defun Info-search-next ()
574 "Repeat search starting from point with last regexp used in `Info-search'."
576 (Info-search Info-last-search))
577 (define-key Info-mode-map "z" 'Info-search-next))
581 '("/home/steve/.sxemacs/site-packages/info"
583 "/usr/share/sxemacs/site-packages/info"
584 "/usr/share/sxemacs/sxemacs-packages/info"
585 "/usr/share/sxemacs/xemacs-packages/info"
586 "/usr/share/sxemacs/mule-packages/info")
587 Info-dir-contents-directory
588 "/home/steve/.sxemacs/site-packages/info"
589 Info-save-auto-generated-dir 'always)
591 ;:*=======================
593 (add-hook 'gdb-mode-hook #'(lambda () (require 'gdb-highlight)))
595 ;:*=======================
598 (defun sy-find-tag-regex (tagname)
599 "Use `igrep-find' command to find all occurances of tag with TAGNAME."
600 (interactive (if current-prefix-arg (list (current-word))
601 (list (find-tag-tag "Find tag: "))))
602 (let ((dir (file-name-directory tags-file-name)))
603 (igrep-find "grep" tagname (concat dir "/*"))))
605 ;:*=======================
607 (require 'google-query)
608 (setq google-query-mirror "www.google.com.au"
609 google-query-result-count 100)
610 (global-set-key [(control f9)] 'google-query)
611 (global-set-key [(meta f9)] 'google-query-region)
613 ;:*=======================
614 ;:* What the fuck does that acronym mean?
615 ;; This requires wtf(6). No idea where you get it from, but it comes
617 ;; (wtf "lol") => LOL: laughing out loud
619 "What the fuck is... ACRONYM"
620 (interactive "sWhat the fuck is: ")
621 (let* ((wtf (executable-find "wtf"))
622 (term (substring (shell-command-to-string
623 (concat wtf " " acronym)) 0 -1)))
625 (if current-prefix-arg
630 ;:*=======================
631 ;:* Interactively append to the latest kill
633 (defun sy-add-to-kill (start end &optional prepend)
634 "Copy region START END and append it to the latest kill.
636 Or, PREPEND with prefix arg.
638 With this you could select \"THIS \" word, `\\[kill-ring-save]' to save it
639 to the kill ring, then select this \"WORD \" and do `\\[sy-add-to-kill]',
640 then select this word \"HERE\", do `\\[sy-add-to-kill]', then select these
641 words \"DON'T WANT \", do `\\[universal-argument] \\[sy-add-to-kill]', and
642 finally do `\\[yank]' and you'd get...
644 DON'T WANT THIS WORD HERE"
646 (let ((prepend (or prepend
647 current-prefix-arg)))
649 (kill-append (buffer-substring start end) 'before)
650 (kill-append (buffer-substring start end) nil))))
652 (global-set-key [(meta ?W)] 'sy-add-to-kill)
654 ;:*=======================
656 (add-to-list 'auto-mode-alist '("/var/chroot/named/etc/zones/.*$" . dns-mode))
658 (defun dig-mx (domain)
659 "View MX 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-mx' must be called interactively"))
665 (if current-prefix-arg
666 (dig domain "MX" nil nil nil
667 (format "%s" (read-string "Server: " nil nil "localhost")))
670 (defun dig-ns (domain)
671 "View NS records for DOMAIN.
673 With a prefix arg, prompt for a server to query."
674 (interactive "sDomain: ")
675 (unless (interactive-p)
676 (error 'invalid-operation "`dig-ns' must be called interactively"))
677 (if current-prefix-arg
678 (dig domain "NS" nil nil nil
679 (format "%s" (read-string "Server: " nil nil "localhost")))
682 (defun dig-any (domain)
683 "View DNS records for DOMAIN.
685 With a prefix arg, prompt for a server to query."
686 (interactive "sDomain: ")
687 (unless (interactive-p)
688 (error 'invalid-operation "`dig-any' must be called interactively"))
689 (if current-prefix-arg
690 (dig domain "ANY" nil nil nil
691 (format "%s" (read-string "Server: " nil nil "localhost")))
694 ;:*=======================
695 ;:* Hard disk temperature!
696 ;(or (ignore-errors (require 'hddtemp))
698 ; (load-module "cl-loop")
699 ; (require 'hddtemp)))
701 ;;; get fancy and stick it in the modeline
702 ;(defvar hddtemp-global-mode-string "sda:0°C"
703 ; "Default hddtemp modeline string.")
704 ;(setq global-mode-string (append global-mode-string
705 ; (list hddtemp-global-mode-string)))
707 ;(defun hddtemp-modeline-string ()
708 ; (let* ((disc0 (hddtemp 0))
709 ; (str (format "sda:%s°%s"
710 ; (nth 2 disc0) (nth 3 disc0))))
711 ; (setq hddtemp-global-mode-string str)))
713 ;(start-itimer "hdd-modeline"
716 ; (setq global-mode-string
717 ; (delq hddtemp-global-mode-string global-mode-string))
718 ; (hddtemp-modeline-string)
719 ; (setq global-mode-string
720 ; (append global-mode-string
721 ; (list hddtemp-global-mode-string)))))
724 ;:*=======================
726 ; M-x term usually gives really horrid "staircase" output. This fixes
728 (add-hook 'term-exec-hook
730 (set-buffer-process-coding-system 'binary 'binary)))
732 ;:*=======================
733 ;:* Phonetic Alphabet
734 (defvar phonetics-hash
735 #s(hash-table test equal
773 "Hash table of phonetic alphabet.")
775 (defun phoneticise (string)
776 "Return STRING rewritten using the phonetic alphabet.
778 For example: \"cat\" => \"charlie alpha tango\".
779 With a prefix arg, insert phoneticised string at point.
780 It ignores punctuation."
781 (interactive "sString to phoneticise: ")
782 (let ((str (string-to-list (downcase string)))
786 (insert (or (gethash (char-to-string (car str)) phonetics-hash)
787 (char-to-string (car str))) " ")
788 (setq str (cdr str)))
789 (setq phonetics (buffer-string)))
790 (if current-prefix-arg
793 (message "%s" phonetics)
796 ;:*=======================
797 ;:* Copy the text without the extents
798 (defun sy-extent-kill-save ()
799 "Save the extent under point's string to kill ring."
801 (kill-new (extent-string (extent-at (point)))))
803 ;:*=======================
807 ;:*=======================
808 ;:* There's a new sexy rc.d style init in SXEmacs, and this is how I
811 ;; I now have my init files named with a 2 digit numerical prefix.
812 ;; This is that I can control which order `lisp-initd-compile-and-load'
813 ;; will load my stuff. Consequently, finding a particular init file is
814 ;; much harder now because I can never remember what bloody number it
815 ;; has. This takes the remembering out of the equation.
816 (defvar sy-init-hash (make-hash-table :test #'equal :size 20)
817 "A hash table of my numbered init files.")
819 (defvar sy-init-files
820 (directory-files lisp-initd-dir nil ".*\.el$" 'sorted-list t)
821 "List of my init files.")
825 (let ((key (substring value 3 -3)))
826 (puthash key value sy-init-hash)))
829 (defvar sy-init-hash-vector (hash-keys-to-vector sy-init-hash)
830 "A vector from my init file hash to use for completion.")
832 (defvar sy-init-history nil
833 "History for `sy-init-file-other-window'.")
835 (defun sy-init-file-other-window (initf &optional codesys)
836 "Basically, `find-file-other-window', but for my init files.
838 Argument INITF is the \"base\" name of the init file.
839 Optional prefix arg, CODESYS, is to specify a coding system to use.
841 I have this because I've prefixed all of my init files with a 2
842 digit number so I can ensure they get loaded in the right order with
843 `lisp-initd-compile-and-load'. And I can never remember what init
844 files are assigned what numbers."
845 (interactive (list (completing-read "Init file: "
846 (mapcar #'list sy-init-hash-vector)
847 nil nil nil sy-init-history)
848 (when current-prefix-arg
849 (read-coding-system "Coding System: "))))
850 (let* ((lib (gethash initf sy-init-hash))
851 (expanded (expand-file-name lib lisp-initd-dir)))
852 (find-file-other-window expanded codesys)))
854 (global-set-key [(control ?x) ?4 ?i] #'sy-init-file-other-window)
855 ;:*=======================
857 ;; Nifty little thing that hides the menubar and makes it visible when
858 ;; the rat is on the toolbar.
860 ;(require 'active-menu)
863 ;:*=======================
864 ;:* LiveJournal posting thingy
866 (setq lj-cookie-flavour 'chrome)
867 ;(setq lj-cookie-flavour 'firefox)
868 (setq lj-user-id "bastard_blog")
869 (setq lj-archive-posts t)
870 (setq lj-bcc-address "Steve Youngs <steve@localhost>")
871 (setq lj-default-location "Brisbane, Australia")
874 <p style=\"color:#FD00FD;font-size:10pt;font-weight:bold;\">
875 Till next time...<br />
878 (add-hook 'lj-before-post-hook #'lj-validate)
879 (add-hook 'lj-after-post-hook #'lj-get-tags)
881 ;:*=======================
884 ;; numpoints -- make numbered list points. Before using, initialise
885 ;; numeric register `n' to zero
886 (number-to-register 0 ?n)
888 (read-kbd-macro "2*RET 2*SPC C-x r + n C-x r i n C-f ) SPC"))
889 (global-set-key [(control ?c) (control ?n)] #'numpoints)
891 ;:*=======================
892 ;:* Do things with environment variables let-bound
894 ;; (with-environment-variables (("VAR" "VALUE") ("VAR2" "VALUE2"))
897 ;(require 'with-environment-variables)
899 ;:*=======================
902 (setq sudoku-level 'easy)
904 ;:*=======================
905 ;:* Stupid fucking Google Chrome is MIME-illiterate
906 (defun sy-browse-url-of-file (&optional file)
907 "Ask a WWW browser to display FILE.
909 Display the current buffer's file if FILE is nil or if called
910 interactively. Turn the filename into a URL with function
911 `browse-url-file-url'. Pass the URL to a browser using the
912 `browse-url' function then run `browse-url-of-file-hook'.
914 This has been reworked a little to cater for Google Chrome not knowing
915 anything about MIME types."
919 (setq file (buffer-file-name))
920 (error "Current buffer has no file"))
921 (unless (string-match "^\\.html?$" (file-name-extension file t))
923 (rename-file file (concat file ".html"))
924 (setq file (concat file ".html")))
925 (let ((buf (get-file-buffer file)))
929 (cond ((not (buffer-modified-p)))
930 (browse-url-save-file (save-buffer))
931 (t (message "%s modified since last save" file))))))
934 (browse-url (browse-url-file-url file))
936 (and oldfile (rename-file file oldfile))))
937 (run-hooks 'browse-url-of-file-hook))
939 (when (equal browse-url-generic-program "google-chrome")
940 (fset #'browse-url-of-file #'sy-browse-url-of-file))
942 ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*
943 (message "miscellaneous initialised")