Mercurial > dotfiles
changeset 86:68f53fa09e99
Moving all clojure stuff to a more self-contained area.
author | Augie Fackler <durin42@gmail.com> |
---|---|
date | Wed, 15 Apr 2009 22:28:20 -0500 |
parents | 4b9b90486260 |
children | b958738c16f3 f34d90569fdc |
files | .elisp/clojure-auto.el .elisp/clojure-mode.el .elisp/clojure-paredit.el .elisp/settings/10.require.el .elisp/settings/40.modes.el .hgrc |
diffstat | 6 files changed, 4 insertions(+), 517 deletions(-) [+] |
line wrap: on
line diff
deleted file mode 100644 --- a/.elisp/clojure-auto.el +++ /dev/null @@ -1,9 +0,0 @@ -;;;; Clojure mode auto loads - -;; Autoload Clojure -(autoload 'clojure-mode "clojure-mode" "A mode for clojure lisp" t) - -;; Automode for clojure -(add-to-list 'auto-mode-alist '("\\.clj$" . clojure-mode)) - -(provide 'clojure-auto) \ No newline at end of file
deleted file mode 100644 --- a/.elisp/clojure-mode.el +++ /dev/null @@ -1,488 +0,0 @@ -;;; clojure-mode.el -- Major mode for Clojure code - -;; Copyright (C) 2008 Jeffrey Chu -;; -;; Author: Jeffrey Chu <jochu0@gmail.com> -;; -;; Originally by: Lennart Staflin <lenst@lysator.liu.se> -;; Copyright (C) 2007, 2008 Lennart Staflin -;; -;; This program is free software; you can redistribute it and/or -;; modify it under the terms of the GNU General Public License -;; as published by the Free Software Foundation; either version 3 -;; of the License, or (at your option) any later version. -;; -;; This program is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. -;; -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, -;; Boston, MA 02110-1301, USA. - -(require 'cl) - -(defgroup clojure-mode nil - "A mode for Clojure" - :prefix "clojure-mode-" - :group 'applications) - -(defcustom clojure-mode-font-lock-multiline-def t - "Set to non-nil in order to enable font-lock of -multi-line (def...) forms. Changing this will require a -restart (ie. M-x clojure-mode) of existing clojure mode buffers." - :type 'boolean - :group 'clojure-mode) - -(defcustom clojure-mode-font-lock-comment-sexp nil - "Set to non-nil in order to enable font-lock of (comment...) -forms. This option is experimental. Changing this will require a -restart (ie. M-x clojure-mode) of existing clojure mode buffers." - :type 'boolean - :group 'clojure-mode) - -(defcustom clojure-mode-load-command "(clojure/load-file \"%s\")\n" - "*Format-string for building a Clojure expression to load a file. -This format string should use `%s' to substitute a file name -and should result in a Clojure expression that will command the inferior Clojure -to load that file." - :type 'string - :group 'clojure-mode) - -(defcustom clojure-mode-use-backtracking-indent nil - "Set to non-nil to enable backtracking/context sensitive -indentation." - :type 'boolean - :group 'clojure-mode) - -(defcustom clojure-max-backtracking 3 - "Maximum amount to backtrack up a list to check for context." - :type 'integer - :group 'clojure-mode) - - -(defvar clojure-mode-map - (let ((map (make-sparse-keymap))) - (set-keymap-parent map lisp-mode-shared-map) - (define-key map "\e\C-x" 'lisp-eval-defun) - (define-key map "\C-x\C-e" 'lisp-eval-last-sexp) - (define-key map "\C-c\C-e" 'lisp-eval-last-sexp) - (define-key map "\C-c\C-l" 'clojure-load-file) - (define-key map "\C-c\C-r" 'lisp-eval-region) - (define-key map "\C-c\C-z" 'run-lisp) - map) - "Keymap for ordinary Clojure mode. -All commands in `lisp-mode-shared-map' are inherited by this map.") - - -(easy-menu-define clojure-menu clojure-mode-map "Menu used in `clojure-mode'." - '("Clojure" - ["Eval defun" lisp-eval-defun t] - ["Eval defun and go" lisp-eval-defun-and-go t] - ["Eval last sexp" lisp-eval-last-sexp t] - ["Eval region" lisp-eval-region t] - ["Eval region and go" lisp-eval-region-and-go t] - ["Load file..." clojure-load-file t] - ["Run Lisp" run-lisp t])) - - -(defvar clojure-mode-syntax-table - (let ((table (copy-syntax-table emacs-lisp-mode-syntax-table))) - (modify-syntax-entry ?~ "' " table) - (modify-syntax-entry ?, " " table) - (modify-syntax-entry ?\{ "(}" table) - (modify-syntax-entry ?\} "){" table) - (modify-syntax-entry ?\[ "(]" table) - (modify-syntax-entry ?\] ")[" table) - (modify-syntax-entry ?^ "'" table) - (modify-syntax-entry ?= "'" table) - table)) - - -(defvar clojure-prev-l/c-dir/file nil - "Record last directory and file used in loading or compiling. -This holds a cons cell of the form `(DIRECTORY . FILE)' -describing the last `clojure-load-file' or `clojure-compile-file' command.") - - -(defun clojure-mode () - "Major mode for editing Clojure code - similar to Lisp mode.. -Commands: -Delete converts tabs to spaces as it moves back. -Blank lines separate paragraphs. Semicolons start comments. -\\{clojure-mode-map} -Note that `run-lisp' may be used either to start an inferior Lisp job -or to switch back to an existing one. - -Entry to this mode calls the value of `clojure-mode-hook' -if that value is non-nil." - (interactive) - (kill-all-local-variables) - (use-local-map clojure-mode-map) - (setq major-mode 'clojure-mode) - (setq mode-name "Clojure") - (lisp-mode-variables nil) - (set-syntax-table clojure-mode-syntax-table) - - (set (make-local-variable 'comment-start-skip) - "\\(\\(^\\|[^\\\\\n]\\)\\(\\\\\\\\\\)*\\)\\(;+\\|#|\\) *") - (set (make-local-variable 'lisp-indent-function) - 'clojure-indent-function) - (set (make-local-variable 'font-lock-multiline) t) - - (if (and (not (boundp 'font-lock-extend-region-functions)) - (or clojure-mode-font-lock-multiline-def - clojure-mode-font-lock-comment-sexp)) - (message "Clojure mode font lock extras are unavailable, please upgrade to atleast version 22 ") - - (when clojure-mode-font-lock-multiline-def - (add-to-list 'font-lock-extend-region-functions 'clojure-font-lock-extend-region-def t)) - - (when clojure-mode-font-lock-comment-sexp - (add-to-list 'font-lock-extend-region-functions 'clojure-font-lock-extend-region-comment t) - (make-local-variable 'clojure-font-lock-keywords) - (add-to-list 'clojure-font-lock-keywords 'clojure-font-lock-mark-comment t) - (set (make-local-variable 'open-paren-in-column-0-is-defun-start) nil))) - - (setq font-lock-defaults - '(clojure-font-lock-keywords ; keywords - nil nil - (("+-*/.<>=!?$%_&~^:@" . "w")) ; syntax alist - nil - (font-lock-mark-block-function . mark-defun) - (font-lock-syntactic-face-function . lisp-font-lock-syntactic-face-function))) - - (run-mode-hooks 'clojure-mode-hook)) - -(defun clojure-font-lock-def-at-point (point) - "Find the position range between the top-most def* and the -fourth element afterwards. Note that this means there's no -gaurantee of proper font locking in def* forms that are not at -top-level." - (goto-char point) - (condition-case nil - (beginning-of-defun) - (error nil)) - - (let ((beg-def (point))) - (when (and (not (= point beg-def)) - (looking-at "(def")) - (condition-case nil - (progn - ;; move forward as much as possible until failure (or success) - (forward-char) - (dotimes (i 4) - (forward-sexp))) - (error nil)) - (cons beg-def (point))))) - -(defun clojure-font-lock-extend-region-def () - "Move fontification boundaries to always include the first four -elements of a def* forms." - (let ((changed nil)) - (let ((def (clojure-font-lock-def-at-point font-lock-beg))) - (when def - (destructuring-bind (def-beg . def-end) def - (when (and (< def-beg font-lock-beg) - (< font-lock-beg def-end)) - (setq font-lock-beg def-beg - changed t))))) - - (let ((def (clojure-font-lock-def-at-point font-lock-end))) - (when def - (destructuring-bind (def-beg . def-end) def - (when (and (< def-beg font-lock-end) - (< font-lock-end def-end)) - (setq font-lock-end def-end - changed t))))) - changed)) - -(defun clojure-font-lock-extend-region-comment () - "Move fontification boundaries to always contain - entire (comment ..) sexp. Does not work if you have a - white-space between ( and comment, but that is omitted to make - this run faster." - (let ((changed nil)) - (goto-char font-lock-beg) - (condition-case nil (beginning-of-defun) (error nil)) - (let ((pos (re-search-forward "(comment\\>" font-lock-end t))) - (when pos - (forward-char -8) - (when (< (point) font-lock-beg) - (setq font-lock-beg (point) - changed t)) - (condition-case nil (forward-sexp) (error nil)) - (when (> (point) font-lock-end) - (setq font-lock-end (point) - changed t)))) - changed)) - - -(defun clojure-font-lock-mark-comment (limit) - "Marks all (comment ..) forms with font-lock-comment-face." - (let (pos) - (while (and (< (point) limit) - (setq pos (re-search-forward "(comment\\>" limit t))) - (when pos - (forward-char -8) - (condition-case nil - (add-text-properties (1+ (point)) (progn (forward-sexp) (1- (point))) - '(face font-lock-comment-face multiline t)) - (error (forward-char 8)))))) - nil) - -(defconst clojure-font-lock-keywords - (eval-when-compile - `( ;; Definitions. - (,(concat "(\\(?:clojure/\\)?\\(def" - ;; Function declarations. - "\\(n-?\\|multi\\|macro\\|method\\|" - ;; Variable declarations. - "struct\\|once\\|" - "\\)\\)\\>" - ;; Any whitespace - "[ \r\n\t]*" - ;; Possibly type or metadata - "\\(?:#^\\(?:{[^}]*}\\|\\sw+\\)[ \r\n\t]*\\)?" - - "\\(\\sw+\\)?") - (1 font-lock-keyword-face) - (3 font-lock-function-name-face nil t)) - ;; Control structures - (,(concat - "(\\(?:clojure/\\)?" - (regexp-opt - '("cond" "for" "loop" "let" "recur" "do" "binding" "with-meta" - "when" "when-not" "when-let" "when-first" "if" "if-let" - "delay" "lazy-cons" "." ".." "->" "and" "or" "locking" - "dosync" "load" - "sync" "doseq" "dotimes" "import" "unimport" "ns" "in-ns" "refer" - "implement" "proxy" "time" "try" "catch" "finally" "throw" - "doto" "with-open" "with-local-vars" "struct-map" - "gen-class" "gen-and-load-class" "gen-and-save-class") t) - "\\>") - . 1) - ;; (fn name? args ...) - (,(concat "(\\(?:clojure/\\)?\\(fn\\)[ \t]+" - ;; Possibly type - "\\(?:#^\\sw+[ \t]*\\)?" - ;; Possibly name - "\\(\\sw+\\)?" ) - (1 font-lock-keyword-face) - (2 font-lock-function-name-face nil t)) - ;; Constant values. - ("\\<:\\sw+\\>" 0 font-lock-builtin-face) - ;; Meta type annotation #^Type - ("#^\\sw+" 0 font-lock-type-face) - )) - "Default expressions to highlight in Clojure mode.") - - -(defun clojure-load-file (file-name) - "Load a Lisp file into the inferior Lisp process." - (interactive (comint-get-source "Load Clojure file: " clojure-prev-l/c-dir/file - '(clojure-mode) t)) - (comint-check-source file-name) ; Check to see if buffer needs saved. - (setq clojure-prev-l/c-dir/file (cons (file-name-directory file-name) - (file-name-nondirectory file-name))) - (comint-send-string (inferior-lisp-proc) - (format clojure-mode-load-command file-name)) - (switch-to-lisp t)) - - - -(defun clojure-indent-function (indent-point state) - "This function is the normal value of the variable `lisp-indent-function'. -It is used when indenting a line within a function call, to see if the -called function says anything special about how to indent the line. - -INDENT-POINT is the position where the user typed TAB, or equivalent. -Point is located at the point to indent under (for default indentation); -STATE is the `parse-partial-sexp' state for that position. - -If the current line is in a call to a Lisp function -which has a non-nil property `lisp-indent-function', -that specifies how to do the indentation. The property value can be -* `defun', meaning indent `defun'-style; -* an integer N, meaning indent the first N arguments specially - like ordinary function arguments and then indent any further - arguments like a body; -* a function to call just as this function was called. - If that function returns nil, that means it doesn't specify - the indentation. - -This function also returns nil meaning don't specify the indentation." - (let ((normal-indent (current-column))) - (goto-char (1+ (elt state 1))) - (parse-partial-sexp (point) calculate-lisp-indent-last-sexp 0 t) - (if (and (elt state 2) - (not (looking-at "\\sw\\|\\s_"))) - ;; car of form doesn't seem to be a symbol - (progn - (if (not (> (save-excursion (forward-line 1) (point)) - calculate-lisp-indent-last-sexp)) - (progn (goto-char calculate-lisp-indent-last-sexp) - (beginning-of-line) - (parse-partial-sexp (point) - calculate-lisp-indent-last-sexp 0 t))) - ;; Indent under the list or under the first sexp on the same - ;; line as calculate-lisp-indent-last-sexp. Note that first - ;; thing on that line has to be complete sexp since we are - ;; inside the innermost containing sexp. - (backward-prefix-chars) - (if (and (eq (char-after (point)) ?\[) - (eq (char-after (elt state 1)) ?\()) - (+ (current-column) 2) ;; this is probably inside a defn - (current-column))) - (let ((function (buffer-substring (point) - (progn (forward-sexp 1) (point)))) - (open-paren (elt state 1)) - method) - (setq method (get (intern-soft function) 'clojure-indent-function)) - - (cond ((member (char-after open-paren) '(?\[ ?\{)) - (goto-char open-paren) - (1+ (current-column))) - ((or (eq method 'defun) - (and (null method) - (> (length function) 3) - (string-match "\\`\\(?:clojure/\\)?def" function))) - (lisp-indent-defform state indent-point)) - - ((integerp method) - (lisp-indent-specform method state - indent-point normal-indent)) - (method - (funcall method indent-point state)) - (clojure-mode-use-backtracking-indent - (clojure-backtracking-indent indent-point state normal-indent))))))) - -(defun clojure-backtracking-indent (indent-point state normal-indent) - "Experimental backtracking support. Will upwards in an sexp to -check for contextual indenting." - (let (indent (path) (depth 0)) - (goto-char (elt state 1)) - (while (and (not indent) - (< depth clojure-max-backtracking)) - (let ((containing-sexp (point))) - (parse-partial-sexp (1+ containing-sexp) indent-point 1 t) - (when (looking-at "\\sw\\|\\s_") - (let* ((start (point)) - (fn (buffer-substring start (progn (forward-sexp 1) (point)))) - (meth (get (intern-soft fn) 'clojure-backtracking-indent))) - (let ((n 0)) - (when (< (point) indent-point) - (condition-case () - (progn - (forward-sexp 1) - (while (< (point) indent-point) - (parse-partial-sexp (point) indent-point 1 t) - (incf n) - (forward-sexp 1))) - (error nil))) - (push n path)) - (when meth - (let ((def meth)) - (dolist (p path) - (if (and (listp def) - (< p (length def))) - (setq def (nth p def)) - (if (listp def) - (setq def (car (last def))) - (setq def nil)))) - (goto-char (elt state 1)) - (when def - (setq indent (+ (current-column) def))))))) - (goto-char containing-sexp) - (condition-case () - (progn - (backward-up-list 1) - (incf depth)) - (error (setq depth clojure-max-backtracking))))) - indent)) - -;; (defun clojure-indent-defn (indent-point state) -;; "Indent by 2 if after a [] clause that's at the beginning of a -;; line" -;; (if (not (eq (char-after (elt state 2)) ?\[)) -;; (lisp-indent-defform state indent-point) -;; (goto-char (elt state 2)) -;; (beginning-of-line) -;; (skip-syntax-forward " ") -;; (if (= (point) (elt state 2)) -;; (+ (current-column) 2) -;; (lisp-indent-defform state indent-point)))) - -;; (put 'defn 'clojure-indent-function 'clojure-indent-defn) -;; (put 'defmacro 'clojure-indent-function 'clojure-indent-defn) - -;; clojure backtracking indent is experimental and the format for these - -;; entries are subject to change -(put 'implement 'clojure-backtracking-indent '(4 (2))) -(put 'proxy 'clojure-backtracking-indent '(4 4 (2))) - - -(defun put-clojure-indent (sym indent) - (put sym 'clojure-indent-function indent) - (put (intern (format "clojure/%s" (symbol-name sym))) 'clojure-indent-function indent)) - -(defmacro define-clojure-indent (&rest kvs) - `(progn - ,@(mapcar (lambda (x) `(put-clojure-indent (quote ,(first x)) ,(second x))) kvs))) - -(define-clojure-indent - (catch 2) - (defmuti 1) - (do 0) - (for 1) ; FIXME (for seqs expr) and (for seqs filter expr) - (if 1) - (let 1) - (loop 1) - (struct-map 1) - (assoc 1) - - (fn 'defun)) - -;; built-ins -(define-clojure-indent - (ns 1) - (binding 1) - (comment 0) - (defstruct 1) - (doseq 1) - (dotimes 1) - (doto 1) - (implement 1) - (let 1) - (when-let 1) - (if-let 1) - (locking 1) - (proxy 2) - (sync 1) - (when 1) - (when-first 1) - (when-let 1) - (when-not 1) - (with-local-vars 1) - (with-open 1) - (with-precision 1)) - -;; macro indent (auto generated) - -;; Things that just aren't right (manually removed) -; (put '-> 'clojure-indent-function 2) -; (put '.. 'clojure-indent-function 2) -; (put 'and 'clojure-indent-function 1) -; (put 'defmethod 'clojure-indent-function 2) -; (put 'defn- 'clojure-indent-function 1) -; (put 'memfn 'clojure-indent-function 1) -; (put 'or 'clojure-indent-function 1) -; (put 'lazy-cat 'clojure-indent-function 1) -; (put 'lazy-cons 'clojure-indent-function 1) - -(provide 'clojure-mode) - -;;; clojure-mode.el ends here
deleted file mode 100644 --- a/.elisp/clojure-paredit.el +++ /dev/null @@ -1,13 +0,0 @@ -(require 'clojure-auto) - -(autoload 'paredit-mode "paredit" "Parenthesis editing minor mode" t) - -(eval-after-load "clojure-mode" - '(progn - (defun clojure-paredit-hook () (paredit-mode +1)) - (add-hook 'clojure-mode-hook 'clojure-paredit-hook) - - (define-key clojure-mode-map "{" 'paredit-open-brace) - (define-key clojure-mode-map "}" 'paredit-close-brace))) - -(provide 'clojure-paredit) \ No newline at end of file
--- a/.elisp/settings/10.require.el +++ b/.elisp/settings/10.require.el @@ -11,9 +11,6 @@ (require 'diff-mode-) (require 'midnight) -(require 'clojure-auto) -(add-to-list 'auto-mode-alist '("\\.clj$" . clojure-mode)) - (require 'textmate) (textmate-mode) (textmate-also-ignore "eggs|cover|daisy|.*.pyc")
--- a/.elisp/settings/40.modes.el +++ b/.elisp/settings/40.modes.el @@ -17,7 +17,6 @@ point." (add-hook 'c-mode-hook 'af-tab-fix) (add-hook 'sh-mode-hook 'af-tab-fix) (add-hook 'emacs-lisp-mode-hook 'af-tab-fix) -(add-hook 'clojure-mode-hook 'af-tab-fix) (add-hook 'rst-mode-hook '(lambda () (make-variable-buffer-local 'af-cleanup-whitespace) (set-variable 'af-cleanup-whitespace nil)))
--- a/.hgrc +++ b/.hgrc @@ -13,8 +13,8 @@ hgext.purge= hgext.rebase= hgext.record= hgext.transplant= -hgext.zeroconf= -hgsubversion= +# hgext.zeroconf= +hgsubversion=/Stuff/hgsubversion hggit= histedit= @@ -33,7 +33,8 @@ annotate = -nu heads = --style default serve = -v outgoing = --graph -incoming = --graph +# --graph is breaking incoming, need to investigate +# incoming = --graph diff = -p [diff]