;; Date: Aug 19, 2010 ;; Author: Collin J. Doering ;; Description: Emacs configuration file (in emacs lisp) ;; stop renaming of saved files to filename~ which ends up breaking hardlinks (setq backup-by-copying-when-linked t) ;; 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" . javascript-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)) ;; 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))) ;; Thanks to lauren michelle for this one (defun pretty-lambdas () (font-lock-add-keywords nil `(("(\\(lambda\\>\\)" (0 (progn (compose-region (match-beginning 1) (match-end 1) ,(make-char 'greek-iso8859-7 107)) nil)))))) ;; 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)))) ;; Make lambda appear as the greek character (activate-mode-with-hooks 'pretty-lambdas '(scheme-mode-hook lisp-mode-hook lisp-interaction-mode geiser-repl-mode python-mode emacs-lisp-mode)) ;; linum mode for pretty line numbering (require 'linum) ;; 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 '(scheme-mode-hook emacs-lisp-mode-hook c-mode-hook c++-mode-hook python-mode-hook lua-mode-hook haskell-mode-hook php-mode-hook perl-mode-hook lisp-mode-hook ruby-mode-hook sh-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) ;; *DEPRECIATED* as of emacs24; when it goes live remove this as well as package emacs-color-theme ;; load color-theme and initialize ;;(require 'color-theme) ;;(color-theme-initialize) ;; use a global color theme ;;(color-theme-tty-dark) ;; make color-theme not applied globally and not cumunitive ;;(setq color-theme-is-cumulative nil) ;;(setq color-theme-is-global nil) ;; given a frame colorizes the frame ;; if its window-system is X Windows the tty-dark theme will be applied otherwise it will be colorized tty-dark ;;(defun apply-color-theme (frame) ;; (select-frame frame) ;; (if (eq (window-system frame) 'x) ;; (color-theme-tty-dark) ;; (color-theme-tty-dark))) ;; add the apply-color-theme function (hook) to be executed on the creation of a new frame ;;(add-hook 'after-make-frame-functions 'apply-color-theme) ;; Use the built-in themeing in emacs24 (load-theme 'manoj-dark) ;; Set default tramp method to ssh (for security purposes) (setq tramp-default-method "ssh") ;; Setup ibuffer (interactive buffer) (global-set-key "\C-x\C-b" 'ibuffer) (autoload 'ibuffer "ibuffer" "List buffers." t) ;; Require ibuffer extentions (used for ibuffer-never-show-predicates) (require 'ibuf-ext) (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/.*\\*$") ;; Filter ibuffers (similar to gnus) (setq ibuffer-saved-filter-groups (quote (("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 . "^\\.screenrc$") (name . "^\\.xbindkeysrc$"))) ("code" (or (mode . c-mode) (mode . c++-mode) (mode . perl-mode) (mode . python-mode) (mode . ruby-mode) (mode . emacs-lisp-mode) (mode . lisp-mode) (mode . sh-mode) (mode . scheme-mode) (mode . php-mode) (mode . xml-mode))) ("REPL" (or (mode . geiser-mode) (mode . slime-repl-mode) (name . "^\\*inferior-lisp\\*$") (name . "^\\* Racket REPL \\*$"))) ("planner" (or (name . "^\\*Calendar\\*$") (name . "^diary$") (mode . muse-mode))) ("emacs" (or (name . "^\\*scratch\\*$") (name . "^\\*Messages\\*$"))) ("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 html renderer w3m (require 'w3m-load) (setq browse-url-browser-function 'w3m-browse-url) (autoload 'w3m-browse-url "w3m" "Ask a WWW browser to show a URL." t) ;; setup magit for git *DISABLED* ;;(autoload 'magit-status magit nil t) ;;(require 'magit) ;; setup php-mode (autoload 'php-mode "php-mode.el" "Php mode." t) (setq auto-mode-alist (append '(("/*.\.php[345]?$" . php-mode)) auto-mode-alist)) ;; 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) (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 () (unless (slime-connected-p) (save-excursion (slime)))) ;; Setup slime mode (add-to-list 'load-path "/usr/share/emacs/site-lisp/slime/") (require 'slime) (slime-setup '(slime-fancy)) ;; Setup clojure mode (add-to-list 'load-path "/usr/share/emacs/site-lisp/clojure-mode") (require 'clojure-mode) ;; Setup swank-clojure-mode (add-to-list 'load-path "/usr/share/emacs/site-lisp/swank-clojure") (require 'swank-clojure) (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))) (eval-after-load "slime" `(progn (require 'assoc) (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 (global-set-key "\C-cl" 'org-store-link) (global-set-key "\C-ca" 'org-agenda) (global-set-key "\C-cb" 'org-iswitchb) ;; Setup emacs-haskell-mode (load "/usr/share/emacs/site-lisp/haskell-mode/haskell-site-file") (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 emacs-python-mode (autoload 'python-mode "/usr/share/emacs/site-lisp/python-mode.el" "Python mode." t) (setq auto-mode-alist (append '(("/*.\.py$" . python-mode)) auto-mode-alist)) ;; Setup emacs-lua-mode (setq auto-mode-alist (cons '("\.lua$" . lua-mode) auto-mode-alist)) (autoload 'lua-mode "lua-mode" "Lua editing mode." t) ;; Setup emacs-erlang-mode (setq erlang-root-dir "/usr/lib/erlang") (setq exec-path (cons "/usr/lib/erlang/bin" exec-path)) (require 'erlang-start) ;; Setup enhanced scheme/racket mode consisting of geiser, quack and paredit (require 'geiser-install) ;(require 'quack) (require 'paredit) (defvar paredit-hooks '(lisp-mode-hook lisp-interaction-mode-hook emacs-lisp-mode scheme-mode-hook c-mode-hook c++-mode-hook python-mode-hook)) ;; Apply paredit-mode to modes listed in paredit-hooks (activate-mode-with-hooks (lambda () (paredit-mode 1)) paredit-hooks) ;; Highlight paren's in given modes [to apply globally do (show-paren-mode 1)] (activate-mode-with-hooks (lambda () (show-paren-mode 1)) paredit-hooks) ;; 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 (require 'pastebin) ;; 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 fancy auto-complete (add-to-list 'load-path "/usr/share/emacs/site-lisp/auto-complete") (require 'auto-complete-config) (add-to-list 'ac-dictionary-directories "/usr/share/emacs/site-lisp/auto-complete/ac-dict") (ac-config-default) ;; 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) (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]) ("\\.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]) ("\\.py$" . ["python-template.py" 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) (progn (get-buffer-create "*scratch*") (insert initial-scratch-message) (lisp-interaction-mode))) (switch-to-buffer "*scratch*"))) ;; Bind a key to grab a scratchpad (global-set-key "\C-x4s" 'open-scratch-buffer) ;; Bind a key to switch to eshell (global-set-key "\C-x4e" '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)))))) ;; Assign keybinding to toggle split orientation of 2 adjacent windows (define-key ctl-x-4-map "t" 'toggle-window-split) ;; Force ediff sessions to run in the same frame (setq ediff-window-setup-function 'ediff-setup-windows-plain) ;; Remove menu-bar (menu-bar-mode -1) ;; Remove tool-bar (tool-bar-mode -1) ;; Remove scroll bars (scroll-bar-mode -1) ;; 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) (defun eshell/clear () "04Dec2001 - sailor, to clear the eshell buffer." (interactive) (let ((inhibit-read-only t)) (erase-buffer))) ;; Set repos for package.el (setq package-archives '(("ELPA" . "http://tromey.com/elpa/") ("gnu" . "http://elpa.gnu.org/packages/") ("marmalade" . "http://marmalade-repo.org/packages/"))) (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. '(org-agenda-files nil) '(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) '(show-paren-mode 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. )