;; Date: Aug 19, 2010 ;; Author: Collin J. Doering ;; Description: Emacs configuration file (in emacs lisp) ;; TODO: clean up backages (prefer ELPA to AUR and archlinux packages); also denote which ;; source is being used after require or autoload sexp's. ;; E.g (require 'pkg) ;; PKG_SRC ;; (autoload ...) ;; PKG_SRC ;; For packages that are installed through the ELPA (and thus they are loaded ;; auto-magically) that do not require any changes to this file (.emacs) and/or ;; are changed using customize simply note (in a comment) at the beginning of this file ;; the package ;; ELPA packages that do not require modification of this file other then Customize ;; * psgml ;; * caml (required by tuareg) ;; * tuareg ;; * project-mode ;; * register-list ;; ELPA packages configured explicitly below: ;; * php-mode ;; * python-mode ;; * ipython ;; * lua-mode ;; * erlang ;; * clojure-mode ;; * ..more ;; TODO: document and cleanup file; specifically remove requires and autoloads of packages ;; that are autoloaded by package.el's package-initialize. Also ensure that each ;; file type and respective mode are added to auto-mode-alist along with a call to ;; autoload to give the user documentation. Eg: ;; (autoload 'foo-mode "foo" "Some documentation." t) ;; (add-to-list 'auto-mode-alist '("\\.foo\\'" . foo-mode)) ;; Set repos for package.el (setq package-archives '(("gnu" . "http://elpa.gnu.org/packages/") ("marmalade" . "http://marmalade-repo.org/packages/") ("melpa" . "http://melpa.milkbox.net/packages/") ("ELPA" . "http://tromey.com/elpa/"))) ;; This needs to be a the start of ~/.emacs since package-initialize is run after the user ;; init file is read but before after-init-hook. It autoloads packages installed by ;; package.el including updating the load-path and running/loading/requiring ;; pkgname-autoload.el for all packages (where pkgname is replaced with the appropriate ;; package name). To disable package.el's autoloading functionality use: ;; (setq package-enabled-at-startup nil) ;; The reason to use package-initialize here is so one can modify the installed modules ;; later in this .emacs file but still retain the autoloading functionality of package.el (package-initialize) ;; stop renaming of saved files to filename~ which ends up breaking hardlinks (setq backup-by-copying-when-linked t) ;; Turn off indentation (use spaces instead) (setq-default indent-tabs-mode nil) ;; Turn on electric-indent-mode (electric-indent-mode 1) ;; Show column number in status bar (column-number-mode) ;; Set the fill-column for text filling (setq fill-column 95) ;; fixes color output issues; see: http://wiki.archlinux.org/index.php/Emacs#Colored_output_issues (add-hook 'shell-mode-hook 'ansi-color-for-comint-mode-on) ;; Automatically open some config files with an associated major mode ;; Note: regexp's used to match buffer filenames are intentionally left ;; unbounded (without '$') to catch cases where the filename may ;; take the format: filename~ (add-to-list 'auto-mode-alist '("\\.conkerorrc" . js-mode)) (add-to-list 'auto-mode-alist '("\\.xmobarrc" . haskell-mode)) (add-to-list 'auto-mode-alist '("\\.screenrc" . conf-mode)) (add-to-list 'auto-mode-alist '("\\.stumpwmrc" . lisp-mode)) (add-to-list 'auto-mode-alist '("\w*\\.service" . conf-mode)) (add-to-list 'auto-mode-alist '("\w*\\.socket" . conf-mode)) (add-to-list 'auto-mode-alist '("\\.mpdconf" . conf-mode)) (add-to-list 'auto-mode-alist '("dunstrc" . conf-mode)) ;; bind M-g to M-x goto-line (global-set-key "\M-g" 'goto-line) ;; Make C-x O cycle backwards a pane (oposite to C-x o) (global-set-key "\C-xO" #'(lambda () (interactive) (other-window -1))) ;; Setup browse-key-ring (require 'browse-kill-ring) ;; ELPA (global-set-key "\C-cy" 'browse-kill-ring) ;; adds the given function mode to each element of the given-hooks (defun activate-mode-with-hooks (mode given-hooks) (while given-hooks (add-hook (car given-hooks) mode) (setq given-hooks (cdr given-hooks)))) ;; linum mode for pretty line numbering (require 'linum) ;; Built-in ;; right justify the numbers and add a space between them and the text in the given buffer (setq linum-format (lambda (line) (propertize (format (let ((w (length (number-to-string (count-lines (point-min) (point-max)))))) (concat "%" (number-to-string w) "d ")) line) 'face 'linum))) ;; code-modes is a list of mode hooks (for programming langs only) (defvar code-modes '(sml-mode-hook scheme-mode-hook emacs-lisp-mode-hook c-mode-hook c++-mode-hook python-mode-hook lua-mode-hook python-mode-hook haskell-mode-hook php-mode-hook perl-mode-hook lisp-mode-hook clojure-mode-hook ruby-mode-hook erlang-mode-hook sh-mode-hook java-mode-hook scala-mode-hook js-mode-hook)) ;; activate linum-mode in all buffers used for programming (activate-mode-with-hooks (lambda () (linum-mode 1)) code-modes) ;; activate flyspell-prog-mode for all buffers used for programming (activate-mode-with-hooks 'flyspell-prog-mode code-modes) ;; use flyspell-mode in org-mode and magit-log-edit-mode buffers (activate-mode-with-hooks 'flyspell-mode '(org-mode-hook magit-log-edit-mode-hook)) ;; Enjoy a game of Sudoku on some downtime (require 'sudoku) ;; ELPA ;; Add collection of themes path (add-to-list 'custom-theme-load-path "~/.emacs.d/themes") ;; Use the built-in theming in emacs 24 (load-theme 'manoj-transparent t) ;; On the creation of each frame checks whether it is a XWindow and if so sets ;; the background to black and the foreground to WhiteSmoke ;; (add-hook 'after-make-frame-functions ;; (lambda (frames) ;; (select-frame frame) ;; (if window-system (progn ;; (set-background-color "black") ;; (set-foreground-color "WhiteSmoke"))))) ;; Set default tramp method to ssh (for security purposes) (setq tramp-default-method "ssh") ;; Set the prompt pattern tramp searches for in order to send commands to the remote shell (setq tramp-shell-prompt-pattern "^[^$>\n]*[#$%>] *\\(\[[0-9;]*[a-zA-Z] *\\)*") ;; Setup ibuffer (interactive buffer) (global-set-key "\C-x\C-b" 'ibuffer) (autoload 'ibuffer "ibuffer" "List buffers." t) ;; Setup ido-mode (ido-mode t) ;; Require ibuffer extentions (used for ibuffer-never-show-predicates) (require 'ibuf-ext) ;; Built-in (add-to-list 'ibuffer-never-show-predicates "^\\*slime-events\\*$") (add-to-list 'ibuffer-never-show-predicates "^\\*Completions\\*$") (add-to-list 'ibuffer-never-show-predicates "^\\*tramp/.*\\*$") ;; Enable ibuffer-vc extension ;; TODO: enable along side my pre existing filter groups using (ibuffer-vc-generate-filter-groups-by-vc-root). ;; This cannot be done in the ibuffer-saved-filters because ibuffer-vc-generate... returns a list of cons ;; cells but we need this to be dynamic (use a hook like ibuffer-load-hook) (require 'ibuffer-vc) ;; Filter ibuffers (similar to gnus) (setq ibuffer-saved-filter-groups '(("default" ("dired" (mode . dired-mode)) ("config" (or (name . "^\\.xinitrc") (name . "^\\.bashrc") (name . "^\\.bash_profile") (name . "^\\.zshrc") (name . "^xmonad\\.hs") (name . "^\\.emacs") (name . "^\\.gnus") (name . "^\\.xmobarrc") (name . "^\\.Xdefaults") (name . "^\\.Xresources") (name . "^\\.screenrc") (name . "^\\.xbindkeysrc") (name . "^\\.racketrc") (name . "^\\.ghci") (name . "\w*\\.service") (name . "\w*\\.socket") (name . "^dunstrc") (name . "^\\.mpdconf") (name . "^\\.conkerorrc"))) ("code" (or (mode . c-mode) (mode . c++-mode) (mode . perl-mode) (mode . lua-mode) (mode . clojure-mode) (mode . java-mode) (mode . python-mode) (mode . ruby-mode) (mode . emacs-lisp-mode) (mode . lisp-mode) (mode . sh-mode) (mode . scheme-mode) (mode . haskell-mode) (mode . scala-mode) (mode . php-mode) (mode . xml-mode) (mode . html-mode) (mode . css-mode) (mode . haml-mode) (mode . sass-mode) (mode . scss-mode) (mode . js-mode))) ("REPL" (or (mode . geiser-mode) (mode . slime-repl-mode) (mode . inferior-python-mode) (mode . ipython-mode) (mode . inferior-haskell-mode) (mode . inferior-lisp-mode) (mode . eshell-mode) (mode . inferior-scheme-mode) (mode . inferior-tcl) (mode . erlang-shell-mode) (name . "^\\*inferior-lisp\\*$") (name . "^\\* Racket REPL \\*$"))) ("git" (or (name . "^\\*magit: ") ;; this regxp could be better (mode . magit-mode) (mode . magit-diff-mode) (mode . magit-log-mode) (mode . magit-commit-mode) (mode . magit-log-mode))) ("planner" (or (name . "^\\*Calendar\\*$") (name . "^diary$") (mode . muse-mode))) ("emacs" (or (name . "^\\*scratch\\*$") (name . "^\\*Messages\\*$") (name . "^\\*Backtrace\\*$") (mode . package-menu-mode) (mode . compilation-mode))) ("org" (or (mode . org-mode) (name . "^\\.org$") (name . "^\\.org.gpg$"))) ("gnus" (or (mode . message-mode) (mode . bbdb-mode) (mode . mail-mode) (mode . gnus-group-mode) (mode . gnus-summary-mode) (mode . gnus-article-mode) (name . "^\\.bbdb$") (name . "^\\.newsrc-dribble")))))) (add-hook 'ibuffer-mode-hook (lambda () (ibuffer-switch-to-saved-filter-groups "default"))) ;; Setup oauth2 (required by google-contacts) (require 'oauth2-autoloads) ;; ELPA ;; Setup google-contact (require 'google-contacts) ;; AUR: emacs-google-contacts (require 'google-contacts-gnus) ;; AUR: emacs-google-contacts ;; Setup nav (require 'nav) ;; ELPA (nav-disable-overeager-window-splitting) (global-set-key "\C-cn" 'nav-toggle) ;; setup html renderer w3m and external browser conkeror (require 'w3m-load) ;; AUR: emacs-w3m-cvs (setq browse-url-browser-function 'w3m-browse-url browse-url-generic-program "conkeror" w3m-use-cookies t) (autoload 'w3m-browse-url "w3m" "Ask a WWW browser to show a URL." t) ;; setup magit for git (being used though elpa [auto-loaded]) ;;(require 'magit) ;; ELPA (global-set-key "\C-xS" 'magit-status) (setq magit-commit-signoff t) ;;setup vc-darcs ;; ELPA (add-to-list 'vc-handled-backends 'DARCS) (autoload 'vc-darcs-find-file-hook "vc-darcs") (add-hook 'find-file-hooks 'vc-darcs-find-file-hook) ;; Setup PKGBUILD mode ;; Community (archlinux) (autoload 'pkgbuild-mode "pkgbuild-mode.el" "PKGBUILD mode." t) (setq auto-mode-alist (append '(("/PKGBUILD$" . pkgbuild-mode)) auto-mode-alist)) ;; setup php-mode (autoload 'php-mode "php-mode.el" "Php mode." t) ;; ELPA (setq auto-mode-alist (append '(("/*.\.php[345]?$" . php-mode)) auto-mode-alist)) ;; Setup zencoding-mode (require 'emmet-mode) ;; Disable C-j keybinding set by zencoding-mode and replace it with 'C-c j' (define-key emmet-mode-keymap "\C-j" nil) (define-key emmet-mode-keymap "\C-cj" 'emmet-expand-line) ;; Add appropriate hooks to sgml-mode (add-hook 'sgml-mode-hook 'emmet-mode) ;; Auto-start on any markup modes (add-hook 'css-mode-hook 'emmet-mode) ;; enable Emmet's css abbreviation. (add-hook 'emmet-mode-hook (lambda () (setq emmet-indentation 2))) ;; indent 2 spaces. ;; Setup mmm-mode for multiple mode regions in the same buffer ;;(require 'mmm-mode) ;;(setq mmm-global-mode 'maybe) ;; Set default lisp program (setq inferior-lisp-program "/usr/bin/sbcl") ;; Since there is no support for the kawa implementation of scheme (defun run-kawa () "Run Kawa Scheme in an Emacs buffer." (interactive) (require 'cmuscheme) ;; Built-in (let ((scheme-program-name "/usr/bin/kawa")) (run-scheme scheme-program-name))) ;; Set usable lisp implementations (setq slime-lisp-implementations '((sbcl ("/usr/bin/sbcl" "")) (clisp ("/usr/bin/clisp" "-K base")) (clojure ("/usr/bin/clj" "")))) ;; Function to start and/or connect to slime (defun start-slime () (interactive) (unless (slime-connected-p) (save-excursion (slime)))) ;; Setup slime mode *TODO* drop in slime from ELPA (add-to-list 'load-path "/usr/share/emacs/site-lisp/slime/") (require 'slime) ;; AUR: emacs-slime-cvs (slime-setup '(slime-fancy)) ;; Setup swank-clojure-mode (add-to-list 'load-path "/usr/share/emacs/site-lisp/swank-clojure") (require 'swank-clojure) ;; ELPA (add-hook 'clojure-mode-hook '(lambda () (define-key clojure-mode-map "\C-c\C-e" 'lisp-eval-last-sexp) (define-key clojure-mode-map "\C-x\C-e" 'lisp-eval-last-sexp))) ;; TODO: functionality needs to be re-written; assoc library obsolete ;; (eval-after-load "slime" ;; `(progn ;; (require 'assoc) ;; Built-in (OBSOLETE) ;; (setq swank-clojure-classpath ;; (list "/usr/share/clojure/clojure.jar" ;; "/usr/share/clojure/clojure-contrib.jar" ;; "/usr/share/emacs/site-lisp/swank-clojure/src")) ;; (aput 'slime-lisp-implementations 'clojure ;; (list (swank-clojure-cmd) :init 'swank-clojure-init)))) ;; Setup emacs-org-mode (add-to-list 'auto-mode-alist '("\\.org\\'" . org-mode)) (add-hook 'org-mode-hook 'turn-on-font-lock) ; not needed when global-font-lock-mode is on (setq org-return-follows-link t org-log-done 'time org-src-fontify-natively t org-enforce-todo-dependencies t) ;; Enable org-mode capture (setq org-default-notes-file "~/.org/notes.org") ;; (concat org-directory "/notes.org")) (define-key global-map "\C-cc" 'org-capture) (setq org-capture-templates '(("t" "General Todo" entry (file+olp "~/.org/notes.org" "Notes" "Tasks" "General") "* TODO %?\n %i\n" :kill-buffer) ("f" "Todo in current file" entry (file+olp "~/.org/notes.org" "Notes" "Tasks" "Per-File") "* TODO %? %i\n See: %a") ("r" "Remember something" entry (file+olp "~/.org/notes.org" "Notes" "Things to Remember") "* %?" :kill-buffer) ("j" "Journal" entry (file+datetree "~/.org/notes.org") "* %?\nEntered on %U\n %i\n %a" :kill-buffer))) ;; Add additional languages for org-babel (now part of org-mode) (org-babel-do-load-languages 'org-babel-load-languages '((haskell . t))) ;; Set keybindings for org-mode (global-set-key "\C-cl" 'org-store-link) (global-set-key "\C-ca" 'org-agenda) (global-set-key "\C-cb" 'org-iswitchb) ;; Setup coq-mode ;; AUR: coq (require 'coq) ;; Setup haskell-mode ;; ELPA (add-hook 'haskell-mode-hook 'turn-on-haskell-doc-mode) (add-hook 'haskell-mode-hook 'turn-on-haskell-indentation) ;;(add-hook 'haskell-mode-hook 'turn-on-haskell-indent) ;;(add-hook 'haskell-mode-hook 'turn-on-haskell-simple-indent) ;; Set inferior haskell default executable (setq haskell-program-name "/usr/bin/ghci") ;; Setup hlint ;; ELPA ;; (require 'flymake-hlint) ;; (add-hook 'haskell-mode-hook 'flymake-hlint-load) ;; Setup ghc (requires ghc-mod from cabal) ;; ELPA (autoload 'ghc-init "ghc" nil t) (add-hook 'haskell-mode-hook (lambda () (ghc-init))) ;; Setup ensime ;; AUR (add-to-list 'load-path "/usr/share/ensime/elisp") (add-to-list 'exec-path "/usr/share/ensime") (require 'ensime) (add-hook 'scala-mode-hook 'ensime-scala-mode-hook) ;; Setup python-mode auto-required by package.el (ELPA) (setq auto-mode-alist (append '(("/*.\.py$" . python-mode)) auto-mode-alist)) ;; Setup ipython-mode ;; (setq py-python-command "/usr/bin/ipython") (require 'ipython) ;; ELPA ;; Setup emacs-lua-mode (setq auto-mode-alist (cons '("\.lua$" . lua-mode) auto-mode-alist)) ;; ELPA (autoload 'lua-mode "lua-mode" "Lua editing mode." t) ;; Setup emacs-erlang-mode (ELPA) (setq erlang-root-dir "/usr/lib/erlang") (setq exec-path (cons "/usr/lib/erlang/bin" exec-path)) (setq auto-mode-alist (append '(("\.erl$" . erlang-mode)) auto-mode-alist)) ;; Setup enhanced scheme/racket mode consisting of geiser, quack and paredit ;; Setup geiser (require 'geiser) ;; ELPA ;; Setup auto-completion for geiser (ELPA) (require 'ac-geiser) (add-hook 'geiser-mode-hook 'ac-geiser-setup) (add-hook 'geiser-repl-mode-hook 'ac-geiser-setup) (eval-after-load "auto-complete" '(add-to-list 'ac-modes 'geiser-repl-mode)) ;; Setup quack (require 'quack) ;; ELPA ;; Setup paredit (require 'paredit) ;; ELPA (defvar lispy-langs-hooks '(lisp-mode-hook lisp-interaction-mode-hook emacs-lisp-mode-hook scheme-mode-hook c-mode-hook c++-mode-hook python-mode-hook)) ;; Apply paredit-mode to modes listed in lispy-langs-hooks (activate-mode-with-hooks (lambda () (paredit-mode 1)) lispy-langs-hooks) ;; Paredit binds to C-j globally and thus disables the binding to ;; eval-print-last-sexp in emacs-lisp-mode (e.g *scratch*, etc..) (add-hook 'emacs-lisp-mode-hook '(lambda () (define-key emacs-lisp-mode-map "\C-xj" 'eval-print-last-sexp))) ;; Highlight paren's in given modes [to apply globally do (show-paren-mode 1)] (activate-mode-with-hooks (lambda () (show-paren-mode)) lispy-langs-hooks) ;; Setup rainbow-delimiters *BROKEN* (require 'rainbow-delimiters) ;; ELPA (add-hook 'prog-mode-hook 'rainbow-delimiters-mode) ;;(activate-mode-with-hooks (lambda () (with-current-buffer buf (rainbow-delimiters-mode))) lispy-langs-hooks) ;; Setup rainbow-mode ;; ELPA (require 'rainbow-mode) (add-hook 'css-mode-hook 'rainbow-mode) ;; upcomming functionallity: toggle paredit-mode due to annoying things like wrapping parens when a mistake is made ;; known issue..if paredit-mode is turned on when there are unbalanced parens an error is reported (defun toggle-paredit-mode () (let ((active-minor-modes (list))) (mapatoms (lambda (sym) (when (and (symbolp sym) (assq sym minor-mode-alist) (symbol-value sym)) (push sym active-minor-modes)))) (if (member 'paredit-mode active-minor-modes) (paredit-mode -1) (paredit-mode 1)))) (setq geiser-repl-use-other-window nil) (setq geiser-active-implementations '(racket)) ;; setup pastebin.el for use with pastebin.com *BROKEN* ;(require 'pastebin) ;; ELPA ;; yasnippet, auto-complete-mode and flyspell do not play nicely with one another due to ;; a conflict with the context of their tab binding *OLD* ;; hideshow-org being depreciated in my config due to conflicting key bindings with yasnippet ;; and flyspell *TODO* ;; Make hs-minor-mode act like org-mode for code folding ;;(add-to-list 'load-path "/usr/share/emacs/site-lisp/hideshow-org") ;; (require 'hideshow-org) ;; (global-set-key "\C-ch" 'hs-org/minor-mode) ;; Add automatic activation of hs-org/minor-mode in the below major-modes ;; (add-hook 'c-mode-common-hook 'hs-org/minor-mode) ;; (add-hook 'emacs-lisp-mode-hook 'hs-org/minor-mode) ;; (add-hook 'java-mode-hook 'hs-org/minor-mode) ;; (add-hook 'lisp-mode-hook 'hs-org/minor-mode) ;; (add-hook 'sh-mode-hook 'hs-org/minor-mode) ;; (add-hook 'python-mode-hook 'hs-org/minor-mode) ;; (add-hook 'scheme-mode-hook 'hs-org/minor-mode) ;; Setup isearch+ (require 'isearch+) ;; Setup ace-jump-mode (autoload 'ace-jump-mode "ace-jump-mode" "Emacs quick move minor mode" t) (define-key global-map (kbd "C-c SPC") 'ace-jump-mode) ;; Setup expand-region ;; ELPA (require 'expand-region) (global-set-key (kbd "C-=") 'er/expand-region) ;; Setup multiple-cursons ;; ELPA (require 'multiple-cursors) (global-set-key (kbd "C-S-c C-S-c") 'mc/edit-lines) (global-set-key (kbd "C->") 'mc/mark-next-like-this) (global-set-key (kbd "C-<") 'mc/mark-previous-like-this) (global-set-key (kbd "C-c C-<") 'mc/mark-all-like-this) ;; Setup fancy auto-complete (require 'auto-complete-config) ;; ELPA ;;(add-to-list 'ac-dictionary-directories "/usr/share/emacs/site-lisp/auto-complete/ac-dict") (ac-config-default) ;; Set trigger keys so yasnippet and auto-complete play nicely. If tab is pressed and the word at point exists ;; in yasnippet, then yassippet will be used; otherwise auto-complete will be used. (ac-set-trigger-key "TAB") (ac-set-trigger-key "") ;; Setup yasnippet-mode (not yasnippet-bundle) (require 'yasnippet) ;; ELPA (yas/load-directory "~/.emacs.d/elpa/yasnippet-20140106.1009") (yas-global-mode 1) ;; Enable flyspell-mode (ac-flyspell-workaround) ;; Known Bug: flyspell-mode doesn't play nice with auto-complete-mode ;;(flyspell-mode) ;; Enable autoinsert feature to automagically insert (require 'autoinsert) ;; Built-in (auto-insert-mode) ;;; Adds hook to find-files-hook (setq auto-insert-directory "~/.emacs.d/templates/") ;;; Or use custom, *NOTE* Trailing slash important (setq auto-insert-query nil) ;;; If you don't want to be prompted before insertion ;; auto-insert options template and auto-completion (add-hook 'find-file-hooks 'auto-insert) (setq auto-insert-directory (concat (getenv "HOME") "/.emacs.d/templates/")) (setq auto-insert-alist '(("\\.c$" . ["c-template.c" auto-update-generic-template]) ("\\.cc\\|cpp$" . ["cpp-template.c" auto-update-generic-template]) ("\\.php$" . ["php-template.php" auto-update-generic-template]) ("\\.rb$" . ["ruby-template.rb" auto-update-generic-template]) ("\\.lua$" . ["lua-template.lua" auto-update-generic-template]) ("\\.erl$" . ["erlang-template.erl" auto-update-generic-template]) ("\\.sh$" . ["shell-template.sh" auto-update-generic-template]) ("\\.rkt$" . ["racket-template.rkt" auto-update-generic-template]) ("\\.scm$" . ["scheme-template.scm" auto-update-generic-template]) ("\\.clj$" . ["clojure-template.clj" auto-update-generic-template]) ("\\.lisp$" . ["lisp-template.lisp" auto-update-generic-template]) ("\\.el$" . ["emacs-lisp-template.el" auto-update-generic-template]) ("\\.hs$" . ["haskell-template.hs" auto-update-generic-template]) ("\\.ml$" . ["ocaml-template.ml" auto-update-generic-template]) ("\\.sml$" . ["sml-template.sml" auto-update-generic-template]) ("\\.py$" . ["python-template.py" auto-update-generic-template]) ("\\.java$" . ["java-template.java" auto-update-generic-template]) ("\\.scala$" . ["scala-template.scala" auto-update-generic-template]) ("\\.htm\\|html$" . ["html-template.html" auto-update-generic-template]) ("\\.js$" . ["java-script-template.js" auto-update-generic-template]) ("\\.css$" . ["css-template.css" auto-update-generic-template]) ("\\.scss$" . ["scss-template.scss" auto-update-generic-template]) ("\\.sass$" . ["sass-template.sass" auto-update-generic-template]) ("\\.haml$" . ["haml-template.haml" auto-update-generic-template]) ("\\.markdown$" . ["markdown-template.markdown" auto-update-generic-template]) ("\\.latex$" . ["latex-template.latex" auto-update-generic-template]))) (setq auto-insert 'other) (defun auto-update-generic-template () (save-excursion ;; Replace @!@FILENAME@!@ with file name sans suffix (while (search-forward "@!@FILENAME@!@" nil t) (save-restriction (narrow-to-region (match-beginning 0) (match-end 0)) (replace-match (file-name-sans-extension (file-name-nondirectory buffer-file-name)) t)))) (save-excursion ;; Replace @!@FILE@!@ with file name (while (search-forward "@!@FILE@!@" nil t) (save-restriction (narrow-to-region (match-beginning 0) (match-end 0)) (replace-match (file-name-nondirectory buffer-file-name) t)))) (save-excursion ;; replace @!@DATE@!@ with today's date (while (search-forward "@!@DATE@!@" nil t) (save-restriction (narrow-to-region (match-beginning 0) (match-end 0)) (replace-match "") (insert-date)))) (save-excursion ;; Replace @!@YEAR@!@ with the current year (while (search-forward "@!@YEAR@!@" nil t) (save-restriction (narrow-to-region (match-beginning 0) (match-end 0)) (replace-match (format-time-string "%Y" (current-time))))))) ;; Insert current date at cursor in the currently active buffer (defun insert-date () "Insert today's date into buffer" (interactive) (insert (format-time-string "%b %e, %Y" (current-time)))) ;; (defun open-scratch-buffer () ;; "Opens the scratch buffer; if none exists creates one." ;; (interactive) ;; (let ((scratch-buffer (get-buffer "*scratch*"))) ;; (if (null scratch-buffer) (with-current-buffer (get-buffer-create "*scratch*") ;; (insert initial-scratch-message) ;; (lisp-interaction-mode))) ;; (switch-to-buffer "*scratch*"))) (defvar scratch-buffer-alist '((python-mode . "# This buffer is for notes you don't want to save, and for Lisp evaluation.\n# If you want to create a file, visit that file with C-x C-f,\n# then enter the text in that file's own buffer."))) (defun open-scratch-buffer (&optional buf-mode buf-name msg) "Opens a scratch buffer; if none exists creates one. When called with the universal argument (C-u) will ask what mode to use for the scratch buffer." (interactive (cond ((equal current-prefix-arg nil) ;; universal argument not called (list initial-major-mode "*scratch*" initial-scratch-message)) ((equal current-prefix-arg '(4)) ;; Universal argument called (C-u) (let* ((buf-mode (read-command "Mode: " initial-major-mode)) (buf-name (if (equal buf-mode initial-major-mode) "*scratch*" (concat "*scratch:" (symbol-name buf-mode) "*"))) (msg "")) (list buf-mode buf-name msg))))) (let* ((scratch-buffer (get-buffer buf-name))) ;; check if the scratchpad is open. If not create it, change its mode and insert message text at the top of the buffer (if (null scratch-buffer) (with-current-buffer (get-buffer-create buf-name) (funcall buf-mode) (insert msg))) (switch-to-buffer buf-name))) ;; Bind a key to grab a scratchpad (define-key ctl-x-4-map "s" 'open-scratch-buffer) ;; TODO: make a function to toggle the eshell; given a the universal argument the following can occur: ;; - if numerical then opens the nth scratch buffer "*eshell*" ;; - if no args then open a new eshell ;; Bind a key to switch to eshell (define-key ctl-x-4-map "e" 'eshell) ;; Toggles windows split orientation of 2 adjecent windows ;; Thanks to http://www.emacswiki.org/cgi-bin/wiki?ToggleWindowSplit (defun toggle-window-split () (interactive) (if (= (count-windows) 2) (let* ((this-win-buffer (window-buffer)) (next-win-buffer (window-buffer (next-window))) (this-win-edges (window-edges (selected-window))) (next-win-edges (window-edges (next-window))) (this-win-2nd (not (and (<= (car this-win-edges) (car next-win-edges)) (<= (cadr this-win-edges) (cadr next-win-edges))))) (splitter (if (= (car this-win-edges) (car (window-edges (next-window)))) 'split-window-horizontally 'split-window-vertically))) (delete-other-windows) (let ((first-win (selected-window))) (funcall splitter) (if this-win-2nd (other-window 1)) (set-window-buffer (selected-window) this-win-buffer) (set-window-buffer (next-window) next-win-buffer) (select-window first-win) (if this-win-2nd (other-window 1)))))) ;; TODO: Modify the below function to accept the universal argument. ;; Specifically an integer argument (n) where: ;; - if negative denotes backwards rotation repeated |n| times ;; - if positive denotes forwards rotation repeated n times ;; - otherwise, no numerical value is given for the universal argument; ignore. ;; Rotates windows ;; Thanks to http://www.emacswiki.org/emacs/TransposeWindows (defun rotate-windows () "Rotate your windows" (interactive) (cond ((not (> (count-windows) 1)) (message "You can't rotate a single window!")) (t (let ((i 0) (num-windows (count-windows))) (while (< i (- num-windows 1)) (let* ((w1 (elt (window-list) i)) (w2 (elt (window-list) (% (+ i 1) num-windows))) (b1 (window-buffer w1)) (b2 (window-buffer w2)) (s1 (window-start w1)) (s2 (window-start w2))) (set-window-buffer w1 b2) (set-window-buffer w2 b1) (set-window-start w1 s2) (set-window-start w2 s1) (setq i (1+ i)))))))) ;; Assign keybinding to toggle split orientation of 2 adjacent windows, and to rotate windows (define-key ctl-x-4-map "t" 'toggle-window-split) (global-set-key "\C-cr" 'rotate-windows) ;; Force ediff sessions to run in the same frame (setq ediff-window-setup-function 'ediff-setup-windows-plain) ;; This is now done ine ~/.Xresources ;; Remove menu-bar, tool-bar, and scroll-bars (menu-bar-mode -1) ;;(tool-bar-mode -1) ;;(scroll-bar-mode -1) ;;(set-default-font "Terminus-12") ;; Stop startup screen (setq inhibit-startup-screen t) ;; Set some eshell options (setq eshell-scroll-to-bottom-on-input t) ;; *BROKEN* ;;(setq eshell-scroll-to-bottom-on-output t) ;; Commands that require a little more then a dumb-term (setq eshell-visual-commands '("vi" "screen" "top" "less" "more" "lynx" "ncftp" "vim" "ncmpcpp" "irssi" "mc" "alsamixer" "/usr/bin/sudo")) (defun eshell/catbuf (buffer-name) "Given a buffer-name returns the contents of said buffer" (interactive "bBuffer: ") (save-excursion (let ((code-buf (get-buffer buffer-name))) (if (null code-buf) (concat "The buffer given \"" buffer-name "\" does not exist") (set-buffer code-buf) (buffer-string))))) (defun eshell/find-file-ext (fp) "Finds a single file or a list of files matching a regxp and returns a list of their respective buffers" (interactive) (if (listp fp) (mapcar #'find-file fp) (list (find-file fp)))) (defun eshell/ff (fp &rest other-fps) "A FP is either a file path (relative or absolute) or a regexp which eshell converts to a list of stings (file paths) which match the regexp (likely using file-expand-widcards). eshell/ff takes one or more file paths and opens them in the current buffer returning a list consisting of lists of buffers opened by each respective FP argument." (interactive) (mapcar #'eshell/find-file-ext (cons fp other-fps))) (defun eshell/clear () "04Dec2001 - sailor, to clear the eshell buffer." (interactive) (let ((inhibit-read-only t)) (erase-buffer))) ;; (add-to-list 'load-path "~/.emacs.d/el-get/el-get") ;; *BROKEN*..can't connect to dbus for some reason? ;; ;; Setup el-get ;; (unless (require 'el-get nil t) ;; (with-current-buffer ;; (url-retrieve-synchronously ;; "https://raw.github.com/dimitri/el-get/master/el-get-install.el") ;; (end-of-buffer) ;; (eval-print-last-sexp))) ;; ;; Synchronize el-get ;; (el-get 'sync) (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. '(coffee-tab-width 2) '(custom-safe-themes (quote ("fc5fcb6f1f1c1bc01305694c59a1a861b008c534cae8d0e48e4d5e81ad718bc6" "b5aaedbcd4d81925c8b2bc21dbed6d0a5a6854b6ad745e948efd55e42b48bd04" "8aebf25556399b58091e533e455dd50a6a9cba958cc4ebb0aab175863c25b9a4" "36a309985a0f9ed1a0c3a69625802f87dee940767c9e200b89cdebdb737e5b29" "dc8693659115ea453f849f47509b903da3801b5f1521a73fa31556a9a3558517" default))) '(fill-column 95) '(highlight-current-line-globally t nil (highlight-current-line)) '(highlight-current-line-ignore-regexp "Faces\\|Colors\\| \\*Mini\\|\\**\\*") '(magit-commit-signoff t t) '(org-agenda-files (quote ("~/.org/tech/notes.org" "~/.org/todo/rekahsoft-mini-todo.org" "~/.org/todo/rekahsoft-todo.org" "~/.org/todo/general.org" "~/.org/todo/work.org"))) '(quack-default-program "racket") '(quack-fontify-style (quote plt)) '(quack-programs (quote ("mzscheme" "bigloo" "csi" "csi -hygienic" "gosh" "gracket" "gsi" "gsi ~~/syntax-case.scm -" "guile" "kawa" "mit-scheme" "racket" "racket -il typed/racket" "rs" "scheme" "scheme48" "scsh" "sisc" "stklos" "sxi"))) '(scroll-bar-mode nil) '(send-mail-function (quote smtpmail-send-it)) '(show-paren-mode t) '(w3m-content-type-alist (quote (("text/plain" "\\.\\(?:txt\\|tex\\|el\\)\\'" nil nil) ("text/html" "\\.s?html?\\'" ("conkeror" file) nil) ("text/sgml" "\\.sgml?\\'" nil "text/plain") ("text/xml" "\\.xml\\'" nil "text/plain") ("image/jpeg" "\\.jpe?g\\'" ("/usr/bin/display" file) nil) ("image/png" "\\.png\\'" ("/usr/bin/display" file) nil) ("image/gif" "\\.gif\\'" ("/usr/bin/display" file) nil) ("image/tiff" "\\.tif?f\\'" ("/usr/bin/display" file) nil) ("image/x-xwd" "\\.xwd\\'" ("/usr/bin/display" file) nil) ("image/x-xbm" "\\.xbm\\'" ("/usr/bin/display" file) nil) ("image/x-xpm" "\\.xpm\\'" ("/usr/bin/display" file) nil) ("image/x-bmp" "\\.bmp\\'" ("/usr/bin/display" file) nil) ("video/mpeg" "\\.mpe?g\\'" nil nil) ("video/quicktime" "\\.mov\\'" nil nil) ("application/dvi" "\\.dvi\\'" ("xdvi" file) nil) ("application/postscript" "\\.e?ps\\'" ("gs" file) nil) ("application/pdf" "\\.pdf\\'" nil nil) ("application/x-pdf" "\\.pdf\\'" nil nil) ("application/xml" "\\.xml\\'" nil w3m-detect-xml-type) ("application/rdf+xml" "\\.rdf\\'" nil "text/plain") ("application/rss+xml" "\\.rss\\'" nil "text/plain") ("application/xhtml+xml" nil nil "text/html"))) t)) (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. '(highlight-current-line-face ((t (:background "gray10"))))) (put 'dired-find-alternate-file 'disabled nil)