]> git.donarmstrong.com Git - emacs.git/blobdiff - .emacs
use latexmk for everything; fix package list
[emacs.git] / .emacs
diff --git a/.emacs b/.emacs
index 84e93835cf00d45b042c80f71a5de9df7c0cc398..d56140bc9f20880f371801fc87fe322df659313a 100644 (file)
--- a/.emacs
+++ b/.emacs
@@ -1,15 +1,15 @@
 (custom-set-variables
 ;; custom-set-variables was added by Custom.
 ;; If you edit it by hand, you could mess it up, so be careful.
 ;; Your init file should contain only one such instance.
 ;; If there is more than one, they won't work right.
+ ;; custom-set-variables was added by Custom.
+ ;; If you edit it by hand, you could mess it up, so be careful.
+ ;; Your init file should contain only one such instance.
+ ;; If there is more than one, they won't work right.
  '(bibtex-user-optional-fields (quote (("annote" "Personal annotation (ignored)") ("abstract" "") ("pmid" "") ("doi" ""))))
  '(calendar-latitude [33 57 north])
  '(calendar-longitude [117 24 west])
  '(case-fold-search t)
  '(confirm-kill-emacs (quote y-or-n-p))
  '(cperl-lazy-help-time nil)
- '(debian-changelog-mailing-address "don@debian.org")
+ '(debian-changelog-mailing-address "don@debian.org" t)
  '(display-time t)
  '(display-time-24hr-format t)
  '(display-time-day-and-date t)
@@ -48,6 +48,9 @@
  '(vc-delete-logbuf-window nil)
  '(vc-follow-symlinks t))
 
+;; use git before SVN; use CVS earlier, because I have CVS
+;; repositories inside of git directories
+(setq vc-handled-backends (quote (CVS Git RCS SVN SCCS Bzr Hg Mtn Arch)))
 
 ;; switch back to the old primary selection method
 (setq x-select-enable-clipboard nil)
 (require 'org-google-weather)
 (setq-default org-google-weather-format "%i %c, [%l,%h] %s %C")
 
+; http://julien.danjou.info/projects/emacs-packages#rainbow-mode
+; this colorizes color strings
+(require 'rainbow-mode)
+; add ess to the x major mode
+(add-to-list 'rainbow-x-colors-major-mode-list 'ESS[S])
+(add-to-list 'rainbow-x-colors-major-mode-list 'ESS[R])
+
 ; org mode agenda files
 (setq org-agenda-files
       (quote ("~/projects/debbugs/debbugs.org"
              "~/projects/origins_of_life/ool.org"
              "~/projects/sysadmin/sndservers/sndservers.org"
              "~/projects/chaim/chaim.org"
+             "~/projects/chaim/papers/gwas_paper_2012/gwas_paper.org"
+          "~/projects/reviews/reviews.org"
              "~/projects/fh/fh.org")))
 
 (setq org-global-properties '(("Effort_ALL 0 0:10 0:30 1:00 2:00 3:00 4:00 5:00 6:00 7:00")))
-(setq org-global-columns-default-format "%40ITEM(Task) %TAGS %PRIORITY %TODO %17Effort(Estimated Effort){:} %CLOCKSUM")
+(setq org-columns-default-format "%40ITEM(Task) %TAGS %PRIORITY %TODO %13SCHEDULED %13DEADLINE %6Effort{:}  %CLOCKSUM")
 
 (setq org-default-notes-file "~/projects/notes/notes.org")
 (setq org-capture-templates  ;; mail-specific note template, identified by "m"
 (add-hook 'org-clock-out-hook 'bh/remove-empty-drawer-on-clock-out 'append)
 
 
+; resolve clocks after 10 minutes of idle; use xprintidle
+(setq org-clock-idle-time 10)
+(setq org-clock-x11idle-program-name "xprintidle")
+
 ; this is from http://doc.norang.ca/org-mode.html#Capture
 ; use C-M-r for org mode capture
 (global-set-key (kbd "C-M-r") 'org-capture)
   "Delete frame at remember finalization"
   (progn (if my-org-protocol-flag (delete-frame))
          (setq my-org-protocol-flag nil)))
+(defadvice org-capture-refile (around delete-frame-after-refile activate)
+  "Delete frame at remember refile"
+  (if my-org-protocol-flag
+      (progn
+        (setq my-org-protocol-flag nil)
+        ad-do-it
+        (delete-frame))
+    ad-do-it)
+  )
 (defadvice org-capture-kill (after delete-frame-at-end activate)
   "Delete frame at remember abort"
   (progn (if my-org-protocol-flag (delete-frame))
   (setq my-org-protocol-flag t))
 
 
+;; org modules
+(add-to-list 'org-modules 'org-habit)
+
 ; this comes from http://upsilon.cc/~zack/blog/posts/2010/02/integrating_Mutt_with_Org-mode/
 (defun open-mail-in-mutt (message)
   "Open a mail message in Mutt, using an external terminal.
@@ -200,15 +228,56 @@ Maildir, or by Message-ID."
 (add-to-list 'interpreter-mode-alist '("perl5" . cperl-mode))
 (add-to-list 'interpreter-mode-alist '("miniperl" . cperl-mode))
 
-(add-to-list 'auto-mode-alist '("muttng-[a-z0-9]+-[0-9]+-" . post-mode))
+; use markdown mode for mdwn files
+(add-to-list 'auto-mode-alist '("\\.mdwn$" . markdown-mode))
+
+
+
+
+; mail configuration
+(add-to-list 'auto-mode-alist '("muttng-[a-z0-9]+-[0-9]+-" . message-mode))
 (add-to-list 'auto-mode-alist '("muttngrc" . muttrc-mode))
 
-(add-to-list 'auto-mode-alist '("mutt-[a-z0-9]+-[0-9]+-" . post-mode))
+(add-to-list 'auto-mode-alist '("mutt-[a-z0-9]+-[0-9]+-" . message-mode))
 (add-to-list 'auto-mode-alist '("muttrc" . muttrc-mode))
+(defun my-message-mode-settings ()
+  (font-lock-add-keywords nil
+                          '(("^[ \t]*>[ \t]*>[ \t]*>.*$"
+                             (0 'message-multiply-quoted-text-face))
+                            ("^[ \t]*>[ \t]*>.*$"
+                             (0 'message-double-quoted-text-face))))
+  (local-set-key (kbd "C-c C-a") 'my-post-attach-file)
+  )
+(add-hook 'message-mode-hook 'my-message-mode-settings)
+
+(defun my-post-attach-file ()
+  "Prompt for an attachment."
+  (interactive)
+  (let ((file (read-file-name "Attach file: " nil nil t nil))
+        (description (string-read "Description: ")))
+    (my-header-attach-file file description)))
+
+(symbol-function 'my-post-attach-file)
+
+(defun my-header-attach-file (file description)
+  "Attach a FILE to the current message (works with Mutt).
+Argument DESCRIPTION MIME description."
+  (interactive "fAttach file: \nsDescription: ")
+  (when (> (length file) 0)
+    (save-excursion
+      (save-match-data
+        (save-restriction
+          (widen)
+          (goto-char (point-min))
+          (search-forward-regexp "^$")
+          (insert (concat "Attach: " (replace-regexp-in-string "\\([[:space:]\\]\\)" "\\\\\\1" (file-truename file)) " "
+                          description "\n"))
+          (message (concat "Attached '" file "'."))
+          (setq post-has-attachment t))))))
 
-(add-to-list 'auto-mode-alist '("\\.mdwn$" . markdown-mode))
 
 
+(setq mail-yank-prefix "> ")
 
 (global-unset-key "\M-g")
 (global-set-key "\M-g" 'goto-line)
@@ -223,31 +292,34 @@ Maildir, or by Message-ID."
 ;;   which really should be,
 ;;   if (-!-) {
 ;;   }
-(setq-default cperl-hairy t
+(setq cperl-hairy t
       cperl-indent-level 4
-;;      cperl-auto-newline t
-;;      cperl-auto-newline-after-colon t
+      cperl-auto-newline nil
+      cperl-auto-newline-after-colon nil
       cperl-continued-statement-offset 4
-      cperl-brace-offset -4
+      cperl-brace-offset -1
+      cperl-continued-brace-offset 0
       cperl-label-offset -4
       cperl-highlight-variables-indiscriminately t
       cperl-electric-lbrace-space nil
-      )
-(add-hook 'cperl-mode-hook (lambda () (cperl-set-style "PerlStyle")))
+      cperl-indent-parens-as-block nil
+      cperl-close-paren-offset -1
+      cperl-tab-always-indent t)
+;(add-hook 'cperl-mode-hook (lambda () (cperl-set-style "PerlStyle")))
 
 
 
 ;(load-library "php-mode")
 
-(setq-default c-indent-level 8)
+(setq-default c-indent-level 4)
 (setq-default c-brace-imaginary-offset 0)
-(setq-default c-brace-offset -8)
-(setq-default c-argdecl-indent 8)
-(setq-default c-label-offset -8)
-(setq-default c-continued-statement-offset 8)
+(setq-default c-brace-offset -4)
+(setq-default c-argdecl-indent 4)
+(setq-default c-label-offset -4)
+(setq-default c-continued-statement-offset 4)
 ; tabs are annoying
 (setq-default indent-tabs-mode nil)
-(setq-default tab-width 8)
+(setq-default tab-width 4)
 
 
 ;; (autoload 'php-mode "php-mode" "PHP editing mode" t)
@@ -267,6 +339,11 @@ Maildir, or by Message-ID."
 (add-hook 'LaTeX-mode-hook 'outline-minor-mode)   ; with AUCTeX LaTeX mode
 (add-hook 'latex-mode-hook 'outline-minor-mode)   ; with Emacs latex mode
 
+; use smart quotes by default instead of `` and ''
+; taken from http://kieranhealy.org/esk/kjhealy.html
+(setq TeX-open-quote "“")
+(setq TeX-close-quote "”")
+
 ;; (TeX-add-style-hook
 ;;  "latex"
 ;;  (lambda ()
@@ -280,30 +357,47 @@ Maildir, or by Message-ID."
 ;; ) 
 
 (require 'font-latex)
-(add-to-list 'font-latex-match-reference-keywords "fref")
-(add-to-list 'font-latex-match-reference-keywords "Fref")
-(add-to-list 'font-latex-match-reference-keywords "citep")
-(add-to-list 'font-latex-match-reference-keywords "citet")
-(font-latex-match-reference-make)
-(add-to-list 'font-latex-match-function-keywords "DLA")
-(add-to-list 'font-latex-match-function-keywords "RZ")
-(add-to-list 'font-latex-match-function-keywords "OM")
-(add-to-list 'font-latex-match-function-keywords "DL")
-(add-to-list 'font-latex-match-function-keywords "fixme")
-(add-to-list 'font-latex-match-function-keywords "acs")
-(add-to-list 'font-latex-match-function-keywords "acsp")
-(add-to-list 'font-latex-match-function-keywords "ac")
-(add-to-list 'font-latex-match-function-keywords "acp")
-(add-to-list 'font-latex-match-function-keywords "acl")
-(add-to-list 'font-latex-match-function-keywords "aclp")
-(add-to-list 'font-latex-match-function-keywords "acsu")
-(add-to-list 'font-latex-match-function-keywords "aclu")
-(add-to-list 'font-latex-match-function-keywords "acused")
-(font-latex-match-function-make)
+(setq font-latex-match-reference-keywords
+      '(
+        ("fref" "{")
+        ("Fref" "{")
+        ("citep" "{")
+        ("citet" "{")
+        ("acs" "{")
+        ("acsp" "{")
+        ("ac" "{")
+        ("acp" "{")
+        ("acl" "{")
+        ("aclp" "{")
+        ("acsu" "{")
+        ("aclu" "{")
+        ("acused" "{")
+;         ))
+; (setq font-latex-match-warning-keywords
+;       '(
+        ("DLA" "{")
+        ("RZ" "{")
+        ("OM" "{")
+        ("DL" "{")
+        ("fixme" "{")))
+      
 (setq-default TeX-parse-self t)
 (setq-default TeX-auto-save t)
 (setq-default TeX-master nil)
 
+;; this doesn't seem to work; not currently sure why
+; (setq font-latex-user-keyword-classes
+;       '(("my-warning-commands"
+;          (("DLA" "{")
+;           ("RZ" "{")
+;           ("OM" "{")
+;           ("DL" "{")
+;           ("fixme" "{")
+;           )
+;          (:foreground "red" :weight bold :underline (:color foreground-color :style line)))
+;         ))
+
+
 (defun insert-date ()
   "Insert date at point."
   (interactive)
@@ -350,9 +444,23 @@ Maildir, or by Message-ID."
 (add-hook 'post-mode-hook
          (auto-fill-mode nil)
          )
+; abbrev mode settings
+; load abbreviations from 
+(setq abbrev-file-name       
+      "~/.emacs_abbrev_def")
 
-(fset 'insert-function-documentation
-   [?\C-x ?i home ?\C-k ?/ ?h ?o ?m ?e ?/ ?d ?o ?n ?/ ?l ?i ?b ?/ ?t ?e ?m ?p ?l ?a ?t ?e ?s ?/ ?p ?e ?r ?l ?_ ?f ?u ?n ?c ?t ?i ?o ?n ?_ ?d ?o ?c ?u ?m ?e ?n ?t ?a ?t ?i ?o ?n return])
+; read the abbrev file if it exists
+(if (file-exists-p abbrev-file-name)
+    (quietly-read-abbrev-file))
+
+; for now, use abbrev mode everywhere
+(setq default-abbrev-mode t)
+
+
+(defun insert-function-documentation ()
+  "Insert function documentation"
+  (interactive)
+  (insert-file-contents "/home/don/lib/templates/perl_function_documentation" nil))
 (global-set-key "\M-f" 'insert-function-documentation)
 
 (eval-after-load "lilypond-mode" 
@@ -366,10 +474,10 @@ Maildir, or by Message-ID."
 (desktop-read)
 '(iswitchb-mode on)
 (custom-set-faces
 ;; custom-set-faces was added by Custom.
 ;; If you edit it by hand, you could mess it up, so be careful.
 ;; Your init file should contain only one such instance.
 ;; If there is more than one, they won't work right.
+ ;; custom-set-faces was added by Custom.
+ ;; If you edit it by hand, you could mess it up, so be careful.
+ ;; Your init file should contain only one such instance.
+ ;; If there is more than one, they won't work right.
  '(menu ((((type x-toolkit)) (:background "black" :foreground "grey90")))))
 
 (defun ess-change-directory (path)
@@ -409,12 +517,15 @@ Maildir, or by Message-ID."
 
 ;;; outlining support for ess modes
 (add-hook 'ess-mode-hook
-         '(lambda ()
-            (outline-minor-mode)
-            (setq outline-regexp "\\(^#\\{4,5\\} \\)\\|\\(^[a-zA-Z0-9_\.]+ ?<- ?function(.*{\\)")
-            (defun outline-level
-              (lambda () (interactive) (cond ((looking-at "^##### ") 1)((looking-at "^#### ") 2)((looking-at "^[a-zA-Z0-9_\.]+ ?<- ?function(.*{") 3) (t 1000)))
-               )))
+      '(lambda ()
+         (outline-minor-mode)
+         (setq outline-regexp "\\(^#\\{4,5\\} \\)\\|\\(^[a-zA-Z0-9_\.]+ ?<- ?function\\)")
+         (defun outline-level ()
+           (cond ((looking-at "^##### ") 1)
+             ((looking-at "^#### ") 2)
+             ((looking-at "^[a-zA-Z0-9_\.]+ ?<- ?function(.*{") 3)
+             (t 1000)))
+         ))
 
  ; Outline-minor-mode key map
  (define-prefix-command 'cm-map nil "Outline-")
@@ -440,32 +551,175 @@ Maildir, or by Message-ID."
  (global-set-key "\M-o" cm-map)
 
 (defun my-org-mode-setup ()
- (when (and (buffer-file-name)
-            (file-exists-p (buffer-file-name)))
   (load-library "reftex")
   (and (buffer-file-name)
-        (file-exists-p (buffer-file-name))
-        (reftex-parse-all))
-   (reftex-set-cite-format
-     '((?b . "[[bib::%l]]")
-       (?n . "[[note::%l]]"))))
-   (define-key org-mode-map "\C-c\C-g" 'reftex-citation)
-)
+       (file-exists-p (buffer-file-name))
+       (progn
+         (reftex-parse-all)
+         (reftex-set-cite-format
+          '((?b . "[[bib::%l][%l-bib]]")
+            (?n . "[[note::%l][%l-notes]]")
+            (?c . "\\cite{%l}")
+            (?h . "*** %t\n:PROPERTIES:\n:Custom_ID: %l\n:END:\n[[papers:%l][%l paper]]")))
+         ))
+  (define-key org-mode-map (kbd "C-c )") 'reftex-citation)
+  (define-key org-mode-map (kbd "C-c [") 'reftex-citation)
+  (define-key org-mode-map (kbd "C-c (") 'org-mode-reftex-search)
+  (define-key org-mode-map (kbd "C-c 0") 'reftex-view-crossref)
+  )
 (add-hook 'org-mode-hook 'my-org-mode-setup)
 
+(defun org-mode-reftex-search ()
+  (interactive)
+  (org-open-link-from-string (format "[[notes:%s]]" (reftex-citation t))))
+
+(defun open-research-paper (bibtexkey)
+  "Open a paper by bibtex key"
+  (interactive "bibtex key: ")
+  (shell-command
+   (format "%s %s"
+       (substitute-in-file-name "$HOME/bin/bibtex_to_paper") bibtexkey)))
+(org-add-link-type "papers" 'open-research-paper)
+
+
+;; stolen from
+;; http://www-public.it-sudparis.eu/~berger_o/weblog/2012/03/23/how-to-manage-and-export-bibliographic-notesrefs-in-org-mode/
+(defun my-rtcite-export-handler (path desc format)
+  (message "my-rtcite-export-handler is called : path = %s, desc = %s, format = %s" path desc format)
+  (let* ((search (when (string-match "::#?\\(.+\\)\\'" path)
+                   (match-string 1 path)))
+         (path (substring path 0 (match-beginning 0))))
+    (cond ((eq format 'latex)
+           (if (or (not desc) 
+                   (equal 0 (search "rtcite:" desc)))
+               (format "\\cite{%s}" search)
+             (format "\\cite[%s]{%s}" desc search))))))
+
+(org-add-link-type "rtcite" 
+                   'org-bibtex-open
+                   'my-rtcite-export-handler)
+
+
 (setq-default org-mobile-directory "/rzlab.ucr.edu:/sites/dav.donarmstrong.com/root/org/")
 (setq-default org-directory "/home/don/org-mode/")
 (setq-default org-mobile-inbox-for-pull "/home/don/org-mode/from-mobile.org")
 
+;; org mode ical export
+(setq org-icalendar-timezone "America/Los_Angeles")
+(setq org-icalendar-use-scheduled '(todo-start event-if-todo))
+(setq org-icalendar-store-UID t)
+
+;; org babel support
+(org-babel-do-load-languages
+ 'org-babel-load-languages
+ '((emacs-lisp . t )
+   (R . t)
+   (latex . t)))
+;; org-babel-by-backend
+(defmacro org-babel-by-backend (&rest body)
+   `(case (if (boundp 'backend) 
+              (org-export-backend-name backend)
+            nil) ,@body))
+
+
+
+;; org latex
+;; stolen from http://kieranhealy.org/esk/kjhealy.html
+(require 'org-latex)   
+;; Choose either listings or minted for exporting source code blocks.
+;; Using minted (as here) requires pygments be installed. To use the
+;; default listings package instead, use
+;; (setq org-latex-listings t)
+;; and change references to "minted" below to "listings"
+; (setq org-latex-listings 'minted)
+
+;; default settings for minted code blocks
+(setq org-latex-minted-options
+      '(;("frame" "single")
+        ("bgcolor" "bg") ; bg will need to be defined in the preamble of your document. It's defined in org-preamble-pdflatex.sty and org-preamble-xelatex.sty below.
+        ("fontsize" "\\small")
+        ))
+;; turn off the default toc behavior; deal with it properly in headers to files.
+(defun org-latex-no-toc (depth)  
+  (when depth
+    (format "%% Org-mode is exporting headings to %s levels.\n"
+            depth)))
+(setq org-latex-format-toc-function 'org-latex-no-toc)
+
+(require 'ox-latex)
+(add-to-list 'org-latex-classes
+             '("memarticle"
+               "\\documentclass[11pt,oneside,article]{memoir}\n"
+               ("\\section{%s}" . "\\section*{%s}")
+               ("\\subsection{%s}" . "\\subsection*{%s}")
+               ("\\subsubsection{%s}" . "\\subsubsection*{%s}")
+               ("\\paragraph{%s}" . "\\paragraph*{%s}")
+               ("\\subparagraph{%s}" . "\\subparagraph*{%s}")))
+
+(add-to-list 'org-latex-classes
+             '("membook"
+               "\\documentclass[11pt,oneside]{memoir}\n"
+               ("\\chapter{%s}" . "\\chapter*{%s}")
+               ("\\section{%s}" . "\\section*{%s}")
+               ("\\subsection{%s}" . "\\subsection*{%s}")
+               ("\\subsubsection{%s}" . "\\subsubsection*{%s}")))
+
+(add-to-list 'org-latex-classes
+             '("letter"
+               "\\documentclass[11pt]{letter}"
+               ("\\section{%s}" . "\\section*{%s}")
+               ("\\subsection{%s}" . "\\subsection*{%s}")
+               ("\\subsubsection{%s}" . "\\subsubsection*{%s}")
+               ("\\paragraph{%s}" . "\\paragraph*{%s}")
+               ("\\subparagraph{%s}" . "\\subparagraph*{%s}")))
+
+;; Originally taken from Bruno Tavernier: http://thread.gmane.org/gmane.emacs.orgmode/31150/focus=31432
+;; but adapted to use latexmk 4.22 or higher.  
+(setq org-latex-pdf-process '("latexmk -pdflatex=xelatex -bibtex -use-make -pdf %f"))
+
+;; Default packages included in /every/ tex file, latex, pdflatex or xelatex
+(setq org-latex-default-packages-alist
+      '(("" "fontspec" t)
+        ("" "xunicode" t)
+        ))
+(setq org-latex-packages-alist
+      '(("" "graphicx" t)
+        ("" "fontspec" t)
+        ("" "xunicode" t)
+        ("" "hyperref" t)
+        ("" "url" t)
+        ("" "rotating" t)
+        ("" "longtable" nil)
+        ("" "float" )))
+
+; support ignoring headers in org mode export to latex
+; from http://article.gmane.org/gmane.emacs.orgmode/67692
+(defadvice org-latex-headline (around my-latex-skip-headlines
+                                      (headline contents info) activate)
+  (if (member "ignoreheading" (org-element-property :tags headline))
+      (setq ad-return-value contents)
+    ad-do-it))
+
 ; debian stuff
 (setq-default debian-changelog-mailing-address "don@debian.org")
 (setq-default debian-changelog-full-name "Don Armstrong")
 
+; ediff configuration
+; don't use the multi-window configuration
+(setq ediff-window-setup-function 'ediff-setup-windows-plain)
+
 ; use iedit
 (require 'iedit)
 (define-key global-map (kbd "C-;") 'iedit-mode)
 (global-set-key  (kbd "C-;") 'iedit-mode)
 
+; fix up css mode to not be silly
+; from http://www.stokebloke.com/wordpress/2008/03/21/css-mode-indent-buffer-fix/
+(setq cssm-indent-level 4)
+(setq cssm-newline-before-closing-bracket t)
+(setq cssm-indent-function #'cssm-c-style-indenter)
+(setq cssm-mirror-mode nil)
+
 (require 'multi-web-mode)
 (setq mweb-default-major-mode 'html-mode)
 (setq mweb-tags '((php-mode "<\\?php\\|<\\? \\|<\\?=" "\\?>")
@@ -530,6 +784,101 @@ want to use in the modeline *in lieu of* the original.")
     (setq flymake-mode-line mode-line)
     (force-mode-line-update)))
 
+; load sql-indent when sql is loaded
+(eval-after-load "sql"
+  '(load-library "sql-indent"))
+
+; fix up tmux xterm keys
+; stolen from http://unix.stackexchange.com/questions/24414/shift-arrow-not-working-in-emacs-within-tmux
+(if (getenv "TMUX")
+    (progn
+      (let ((x 2) (tkey ""))
+        (while (<= x 8)
+          ;; shift
+          (if (= x 2)
+              (setq tkey "S-"))
+          ;; alt
+          (if (= x 3)
+              (setq tkey "M-"))
+          ;; alt + shift
+          (if (= x 4)
+              (setq tkey "M-S-"))
+          ;; ctrl
+          (if (= x 5)
+              (setq tkey "C-"))
+          ;; ctrl + shift
+          (if (= x 6)
+              (setq tkey "C-S-"))
+          ;; ctrl + alt
+          (if (= x 7)
+              (setq tkey "C-M-"))
+          ;; ctrl + alt + shift
+          (if (= x 8)
+              (setq tkey "C-M-S-"))
+          
+          ;; arrows
+          (define-key key-translation-map (kbd (format "M-[ 1 ; %d A" x)) (kbd (format "%s<up>" tkey)))
+          (define-key key-translation-map (kbd (format "M-[ 1 ; %d B" x)) (kbd (format "%s<down>" tkey)))
+          (define-key key-translation-map (kbd (format "M-[ 1 ; %d C" x)) (kbd (format "%s<right>" tkey)))
+          (define-key key-translation-map (kbd (format "M-[ 1 ; %d D" x)) (kbd (format "%s<left>" tkey)))
+          ;; home
+          (define-key key-translation-map (kbd (format "M-[ 1 ; %d H" x)) (kbd (format "%s<home>" tkey)))
+          ;; end
+          (define-key key-translation-map (kbd (format "M-[ 1 ; %d F" x)) (kbd (format "%s<end>" tkey)))
+          ;; page up
+          (define-key key-translation-map (kbd (format "M-[ 5 ; %d ~" x)) (kbd (format "%s<prior>" tkey)))
+          ;; page down
+          (define-key key-translation-map (kbd (format "M-[ 6 ; %d ~" x)) (kbd (format "%s<next>" tkey)))
+          ;; insert
+          (define-key key-translation-map (kbd (format "M-[ 2 ; %d ~" x)) (kbd (format "%s<delete>" tkey)))
+          ;; delete
+          (define-key key-translation-map (kbd (format "M-[ 3 ; %d ~" x)) (kbd (format "%s<delete>" tkey)))
+          ;; f1
+          (define-key key-translation-map (kbd (format "M-[ 1 ; %d P" x)) (kbd (format "%s<f1>" tkey)))
+          ;; f2
+          (define-key key-translation-map (kbd (format "M-[ 1 ; %d Q" x)) (kbd (format "%s<f2>" tkey)))
+          ;; f3
+          (define-key key-translation-map (kbd (format "M-[ 1 ; %d R" x)) (kbd (format "%s<f3>" tkey)))
+          ;; f4
+          (define-key key-translation-map (kbd (format "M-[ 1 ; %d S" x)) (kbd (format "%s<f4>" tkey)))
+          ;; f5
+          (define-key key-translation-map (kbd (format "M-[ 15 ; %d ~" x)) (kbd (format "%s<f5>" tkey)))
+          ;; f6
+          (define-key key-translation-map (kbd (format "M-[ 17 ; %d ~" x)) (kbd (format "%s<f6>" tkey)))
+          ;; f7
+          (define-key key-translation-map (kbd (format "M-[ 18 ; %d ~" x)) (kbd (format "%s<f7>" tkey)))
+          ;; f8
+          (define-key key-translation-map (kbd (format "M-[ 19 ; %d ~" x)) (kbd (format "%s<f8>" tkey)))
+          ;; f9
+          (define-key key-translation-map (kbd (format "M-[ 20 ; %d ~" x)) (kbd (format "%s<f9>" tkey)))
+          ;; f10
+          (define-key key-translation-map (kbd (format "M-[ 21 ; %d ~" x)) (kbd (format "%s<f10>" tkey)))
+          ;; f11
+          (define-key key-translation-map (kbd (format "M-[ 23 ; %d ~" x)) (kbd (format "%s<f11>" tkey)))
+          ;; f12
+          (define-key key-translation-map (kbd (format "M-[ 24 ; %d ~" x)) (kbd (format "%s<f12>" tkey)))
+          ;; f13
+          (define-key key-translation-map (kbd (format "M-[ 25 ; %d ~" x)) (kbd (format "%s<f13>" tkey)))
+          ;; f14
+          (define-key key-translation-map (kbd (format "M-[ 26 ; %d ~" x)) (kbd (format "%s<f14>" tkey)))
+          ;; f15
+          (define-key key-translation-map (kbd (format "M-[ 28 ; %d ~" x)) (kbd (format "%s<f15>" tkey)))
+          ;; f16
+          (define-key key-translation-map (kbd (format "M-[ 29 ; %d ~" x)) (kbd (format "%s<f16>" tkey)))
+          ;; f17
+          (define-key key-translation-map (kbd (format "M-[ 31 ; %d ~" x)) (kbd (format "%s<f17>" tkey)))
+          ;; f18
+          (define-key key-translation-map (kbd (format "M-[ 32 ; %d ~" x)) (kbd (format "%s<f18>" tkey)))
+          ;; f19
+          (define-key key-translation-map (kbd (format "M-[ 33 ; %d ~" x)) (kbd (format "%s<f19>" tkey)))
+          ;; f20
+          (define-key key-translation-map (kbd (format "M-[ 34 ; %d ~" x)) (kbd (format "%s<f20>" tkey)))
+
+          (setq x (+ x 1))
+          ))
+      )
+  )
+
 ; apparently things like to step on C-;, so we'll use a hack from
 ; http://stackoverflow.com/questions/683425/globally-override-key-binding-in-emacs/5340797#5340797 to fix this