thirdparty/clojure-mode.el
author Luke Hoersten <Luke@Hoersten.org>
Sun, 25 Mar 2012 20:03:12 -0500
changeset 51 c4e0668a2c87
parent 50 6590d340a568
permissions -rw-r--r--
Updated zencoding mode.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
50
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
     1
;;; clojure-mode.el --- Major mode for Clojure code
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
     2
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
     3
;; Copyright (C) 2007-2011 Jeffrey Chu, Lennart Staflin, Phil Hagelberg
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
     4
;;
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
     5
;; Authors: Jeffrey Chu <[email protected]>
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
     6
;;          Lennart Staflin <[email protected]>
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
     7
;;          Phil Hagelberg <[email protected]>
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
     8
;; URL: http://github.com/technomancy/clojure-mode
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
     9
;; Version: 1.11.5
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    10
;; Keywords: languages, lisp
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    11
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    12
;; This file is not part of GNU Emacs.
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    13
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    14
;;; Commentary:
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    15
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    16
;; Provides font-lock, indentation, and navigation for the Clojure
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    17
;; language. (http://clojure.org)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    18
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    19
;; Users of older Emacs (pre-22) should get version 1.4:
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    20
;; http://github.com/technomancy/clojure-mode/tree/1.4
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    21
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    22
;;; Installation:
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    23
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    24
;; Use package.el. You'll need to add Marmalade to your archives:
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    25
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    26
;; (require 'package)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    27
;; (add-to-list 'package-archives
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    28
;;              '("marmalade" . "http://marmalade-repo.org/packages/"))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    29
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    30
;; If you use a version of Emacs prior to 24 that doesn't include
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    31
;; package.el, you can get it from http://bit.ly/pkg-el23. If you have
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    32
;; an older package.el installed from tromey.com, you should upgrade
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    33
;; in order to support installation from multiple sources.
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    34
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    35
;; Of course, it's possible to just place it on your load-path and
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    36
;; require it as well if you don't mind missing out on
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    37
;; byte-compilation and autoloads.
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    38
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    39
;; Using clojure-mode with paredit is highly recommended. It is also
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    40
;; available using package.el from the above archive.
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    41
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    42
;; Use paredit as you normally would with any other mode; for instance:
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    43
;;
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    44
;;   ;; require or autoload paredit-mode
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    45
;;   (defun turn-on-paredit () (paredit-mode 1))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    46
;;   (add-hook 'clojure-mode-hook 'turn-on-paredit)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    47
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    48
;; See Swank Clojure (http://github.com/technomancy/swank-clojure) for
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    49
;; better interaction with subprocesses via SLIME.
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    50
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    51
;;; License:
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    52
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    53
;; This program is free software; you can redistribute it and/or
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    54
;; modify it under the terms of the GNU General Public License
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    55
;; as published by the Free Software Foundation; either version 3
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    56
;; of the License, or (at your option) any later version.
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    57
;;
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    58
;; This program is distributed in the hope that it will be useful,
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    59
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    60
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    61
;; GNU General Public License for more details.
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    62
;;
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    63
;; You should have received a copy of the GNU General Public License
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    64
;; along with GNU Emacs; see the file COPYING.  If not, write to the
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    65
;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    66
;; Boston, MA 02110-1301, USA.
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    67
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    68
;;; Code:
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    69
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    70
(require 'cl)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    71
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    72
(defgroup clojure-mode nil
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    73
  "A mode for Clojure"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    74
  :prefix "clojure-mode-"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    75
  :group 'applications)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    76
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    77
(defcustom clojure-mode-font-lock-comment-sexp nil
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    78
  "Set to non-nil in order to enable font-lock of (comment...)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    79
forms. This option is experimental. Changing this will require a
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    80
restart (ie. M-x clojure-mode) of existing clojure mode buffers."
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    81
  :type 'boolean
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    82
  :group 'clojure-mode)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    83
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    84
(defcustom clojure-mode-load-command  "(clojure.core/load-file \"%s\")\n"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    85
  "*Format-string for building a Clojure expression to load a file.
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    86
This format string should use `%s' to substitute a file name
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    87
and should result in a Clojure expression that will command the inferior
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    88
Clojure to load that file."
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    89
  :type 'string
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    90
  :group 'clojure-mode)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    91
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    92
(defcustom clojure-mode-use-backtracking-indent t
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    93
  "Set to non-nil to enable backtracking/context sensitive indentation."
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    94
  :type 'boolean
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    95
  :group 'clojure-mode)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    96
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    97
(defcustom clojure-max-backtracking 3
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    98
  "Maximum amount to backtrack up a list to check for context."
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    99
  :type 'integer
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   100
  :group 'clojure-mode)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   101
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   102
(defvar clojure-mode-map
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   103
  (let ((map (make-sparse-keymap)))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   104
    (set-keymap-parent map lisp-mode-shared-map)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   105
    (define-key map "\e\C-x" 'lisp-eval-defun)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   106
    (define-key map "\C-x\C-e" 'lisp-eval-last-sexp)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   107
    (define-key map "\C-c\C-e" 'lisp-eval-last-sexp)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   108
    (define-key map "\C-c\C-l" 'clojure-load-file)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   109
    (define-key map "\C-c\C-r" 'lisp-eval-region)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   110
    (define-key map "\C-c\C-z" 'clojure-display-inferior-lisp-buffer)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   111
    (define-key map (kbd "RET") 'reindent-then-newline-and-indent)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   112
    (define-key map (kbd "C-c t") 'clojure-jump-to-test)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   113
    (define-key map (kbd "C-c M-q") 'clojure-fill-docstring)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   114
    map)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   115
  "Keymap for Clojure mode. Inherits from `lisp-mode-shared-map'.")
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   116
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   117
(defvar clojure-mode-syntax-table
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   118
  (let ((table (copy-syntax-table emacs-lisp-mode-syntax-table)))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   119
    (modify-syntax-entry ?~ "'   " table)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   120
    ;; can't safely make commas whitespace since it will apply even
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   121
    ;; inside string literals--ick!
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   122
    ;; (modify-syntax-entry ?, "    " table)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   123
    (modify-syntax-entry ?\{ "(}" table)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   124
    (modify-syntax-entry ?\} "){" table)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   125
    (modify-syntax-entry ?\[ "(]" table)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   126
    (modify-syntax-entry ?\] ")[" table)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   127
    (modify-syntax-entry ?^ "'" table)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   128
    table))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   129
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   130
(defvar clojure-mode-abbrev-table nil
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   131
  "Abbrev table used in clojure-mode buffers.")
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   132
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   133
(define-abbrev-table 'clojure-mode-abbrev-table ())
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   134
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   135
(defvar clojure-prev-l/c-dir/file nil
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   136
  "Record last directory and file used in loading or compiling.
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   137
This holds a cons cell of the form `(DIRECTORY . FILE)'
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   138
describing the last `clojure-load-file' or `clojure-compile-file' command.")
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   139
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   140
(defvar clojure-test-ns-segment-position -1
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   141
  "Which segment of the ns is \"test\" inserted in your test name convention.
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   142
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   143
Customize this depending on your project's conventions. Negative
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   144
numbers count from the end:
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   145
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   146
  leiningen.compile -> leiningen.test.compile (uses 1)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   147
  clojure.http.client -> clojure.http.test.client (uses -1)")
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   148
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   149
(defun clojure-mode-version ()
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   150
  "Currently package.el doesn't support prerelease version numbers."
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   151
  "1.11.5")
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   152
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   153
;;;###autoload
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   154
(defun clojure-mode ()
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   155
  "Major mode for editing Clojure code - similar to Lisp mode.
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   156
Commands:
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   157
Delete converts tabs to spaces as it moves back.
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   158
Blank lines separate paragraphs.  Semicolons start comments.
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   159
\\{clojure-mode-map}
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   160
Note that `run-lisp' may be used either to start an inferior Lisp job
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   161
or to switch back to an existing one.
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   162
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   163
Entry to this mode calls the value of `clojure-mode-hook'
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   164
if that value is non-nil."
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   165
  (interactive)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   166
  (kill-all-local-variables)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   167
  (use-local-map clojure-mode-map)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   168
  (setq mode-name "Clojure"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   169
        major-mode 'clojure-mode
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   170
        imenu-create-index-function
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   171
        (lambda ()
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   172
          (imenu--generic-function '((nil clojure-match-next-def 0))))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   173
        local-abbrev-table clojure-mode-abbrev-table
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   174
        indent-tabs-mode nil)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   175
  (lisp-mode-variables nil)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   176
  (set-syntax-table clojure-mode-syntax-table)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   177
  (set (make-local-variable 'comment-start-skip)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   178
       "\\(\\(^\\|[^\\\\\n]\\)\\(\\\\\\\\\\)*\\)\\(;+\\|#|\\) *")
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   179
  (set (make-local-variable 'lisp-indent-function)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   180
       'clojure-indent-function)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   181
  (when (< emacs-major-version 24)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   182
    (set (make-local-variable 'forward-sexp-function)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   183
         'clojure-forward-sexp))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   184
  (set (make-local-variable 'lisp-doc-string-elt-property)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   185
       'clojure-doc-string-elt)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   186
  (set (make-local-variable 'inferior-lisp-program) "lein repl")
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   187
  (set (make-local-variable 'parse-sexp-ignore-comments) t)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   188
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   189
  (clojure-mode-font-lock-setup)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   190
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   191
  (run-mode-hooks 'clojure-mode-hook)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   192
  (run-hooks 'prog-mode-hook)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   193
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   194
  ;; Enable curly braces when paredit is enabled in clojure-mode-hook
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   195
  (when (and (featurep 'paredit) paredit-mode (>= paredit-version 21))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   196
    (define-key clojure-mode-map "{" 'paredit-open-curly)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   197
    (define-key clojure-mode-map "}" 'paredit-close-curly)))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   198
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   199
(defun clojure-display-inferior-lisp-buffer ()
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   200
  "Display a buffer bound to `inferior-lisp-buffer'."
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   201
  (interactive)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   202
  (if (and inferior-lisp-buffer (get-buffer inferior-lisp-buffer))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   203
      (pop-to-buffer inferior-lisp-buffer t)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   204
      (run-lisp inferior-lisp-program)))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   205
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   206
(defun clojure-load-file (file-name)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   207
  "Load a Lisp file into the inferior Lisp process."
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   208
  (interactive (comint-get-source "Load Clojure file: "
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   209
                                  clojure-prev-l/c-dir/file
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   210
                                  '(clojure-mode) t))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   211
  (comint-check-source file-name) ; Check to see if buffer needs saved.
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   212
  (setq clojure-prev-l/c-dir/file (cons (file-name-directory file-name)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   213
                                        (file-name-nondirectory file-name)))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   214
  (comint-send-string (inferior-lisp-proc)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   215
                      (format clojure-mode-load-command file-name))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   216
  (switch-to-lisp t))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   217
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   218
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   219
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   220
(defun clojure-match-next-def ()
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   221
  "Scans the buffer backwards for the next top-level definition.
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   222
Called by `imenu--generic-function'."
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   223
  (when (re-search-backward "^\\s *(def\\S *[ \n\t]+" nil t)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   224
    (save-excursion
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   225
      (goto-char (match-end 0))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   226
      (when (looking-at "#?\\^")
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   227
        (let (forward-sexp-function) ; using the built-in one
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   228
          (forward-sexp)))           ; skip the metadata
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   229
      (re-search-forward "[^ \n\t)]+"))))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   230
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   231
(defun clojure-mode-font-lock-setup ()
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   232
  "Configures font-lock for editing Clojure code."
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   233
  (interactive)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   234
  (set (make-local-variable 'font-lock-multiline) t)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   235
  (add-to-list 'font-lock-extend-region-functions
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   236
               'clojure-font-lock-extend-region-def t)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   237
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   238
  (when clojure-mode-font-lock-comment-sexp
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   239
    (add-to-list 'font-lock-extend-region-functions
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   240
                 'clojure-font-lock-extend-region-comment t)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   241
    (make-local-variable 'clojure-font-lock-keywords)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   242
    (add-to-list 'clojure-font-lock-keywords
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   243
                 'clojure-font-lock-mark-comment t)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   244
    (set (make-local-variable 'open-paren-in-column-0-is-defun-start) nil))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   245
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   246
  (setq font-lock-defaults
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   247
        '(clojure-font-lock-keywords    ; keywords
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   248
          nil nil
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   249
          (("+-*/.<>=!?$%_&~^:@" . "w")) ; syntax alist
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   250
          nil
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   251
          (font-lock-mark-block-function . mark-defun)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   252
          (font-lock-syntactic-face-function
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   253
           . lisp-font-lock-syntactic-face-function))))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   254
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   255
(defun clojure-font-lock-def-at-point (point)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   256
  "Find the position range between the top-most def* and the
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   257
fourth element afterwards. Note that this means there's no
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   258
gaurantee of proper font locking in def* forms that are not at
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   259
top-level."
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   260
  (goto-char point)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   261
  (condition-case nil
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   262
      (beginning-of-defun)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   263
    (error nil))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   264
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   265
  (let ((beg-def (point)))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   266
    (when (and (not (= point beg-def))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   267
               (looking-at "(def"))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   268
      (condition-case nil
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   269
          (progn
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   270
            ;; move forward as much as possible until failure (or success)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   271
            (forward-char)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   272
            (dotimes (i 4)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   273
              (forward-sexp)))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   274
        (error nil))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   275
      (cons beg-def (point)))))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   276
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   277
(defun clojure-font-lock-extend-region-def ()
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   278
  "Move fontification boundaries to always include the first four
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   279
elements of a def* forms."
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   280
  (let ((changed nil))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   281
    (let ((def (clojure-font-lock-def-at-point font-lock-beg)))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   282
      (when def
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   283
        (destructuring-bind (def-beg . def-end) def
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   284
          (when (and (< def-beg font-lock-beg)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   285
                     (< font-lock-beg def-end))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   286
            (setq font-lock-beg def-beg
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   287
                  changed t)))))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   288
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   289
    (let ((def (clojure-font-lock-def-at-point font-lock-end)))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   290
      (when def
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   291
        (destructuring-bind (def-beg . def-end) def
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   292
          (when (and (< def-beg font-lock-end)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   293
                     (< font-lock-end def-end))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   294
            (setq font-lock-end def-end
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   295
                  changed t)))))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   296
    changed))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   297
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   298
(defun clojure-font-lock-extend-region-comment ()
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   299
  "Move fontification boundaries to always contain
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   300
  entire (comment ..) sexp. Does not work if you have a
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   301
  white-space between ( and comment, but that is omitted to make
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   302
  this run faster."
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   303
  (let ((changed nil))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   304
    (goto-char font-lock-beg)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   305
    (condition-case nil (beginning-of-defun) (error nil))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   306
    (let ((pos (re-search-forward "(comment\\>" font-lock-end t)))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   307
      (when pos
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   308
        (forward-char -8)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   309
        (when (< (point) font-lock-beg)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   310
          (setq font-lock-beg (point)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   311
                changed t))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   312
        (condition-case nil (forward-sexp) (error nil))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   313
        (when (> (point) font-lock-end)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   314
          (setq font-lock-end (point)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   315
                changed t))))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   316
    changed))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   317
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   318
(defun clojure-font-lock-mark-comment (limit)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   319
  "Marks all (comment ..) forms with font-lock-comment-face."
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   320
  (let (pos)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   321
    (while (and (< (point) limit)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   322
                (setq pos (re-search-forward "(comment\\>" limit t)))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   323
      (when pos
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   324
        (forward-char -8)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   325
        (condition-case nil
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   326
            (add-text-properties (1+ (point)) (progn
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   327
                                                (forward-sexp) (1- (point)))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   328
                                 '(face font-lock-comment-face multiline t))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   329
          (error (forward-char 8))))))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   330
  nil)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   331
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   332
(defconst clojure-font-lock-keywords
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   333
  (eval-when-compile
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   334
    `( ;; Definitions.
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   335
      (,(concat "(\\(?:clojure.core/\\)?\\("
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   336
                (regexp-opt '("defn" "defn-" "def" "def-" "defonce"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   337
                              "defmulti" "defmethod" "defmacro"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   338
                              "defstruct" "deftype" "defprotocol"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   339
                              "defrecord" "deftest"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   340
                              "slice" "def\\[a-z\\]"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   341
                              "defalias" "defhinted" "defmacro-"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   342
                              "defn-memo" "defnk" "defonce-"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   343
                              "defstruct-" "defunbound" "defunbound-"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   344
                              "defvar" "defvar-"))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   345
                ;; Function declarations.
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   346
                "\\)\\>"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   347
                ;; Any whitespace
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   348
                "[ \r\n\t]*"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   349
                ;; Possibly type or metadata
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   350
                "\\(?:#?^\\(?:{[^}]*}\\|\\sw+\\)[ \r\n\t]*\\)*"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   351
                "\\(\\sw+\\)?")
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   352
       (1 font-lock-keyword-face)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   353
       (2 font-lock-function-name-face nil t))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   354
      ;; Deprecated functions
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   355
      (,(concat
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   356
         "(\\(?:clojure.core/\\)?"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   357
         (regexp-opt
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   358
          '("add-watcher" "remove-watcher" "add-classpath") t)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   359
         "\\>")
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   360
       1 font-lock-warning-face)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   361
      ;; Control structures
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   362
      (,(concat
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   363
         "(\\(?:clojure.core/\\)?"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   364
         (regexp-opt
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   365
          '("let" "letfn" "do"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   366
            "case" "cond" "condp"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   367
            "for" "loop" "recur"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   368
            "when" "when-not" "when-let" "when-first"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   369
            "if" "if-let" "if-not"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   370
            "." ".." "->" "->>" "doto"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   371
            "and" "or"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   372
            "dosync" "doseq" "dotimes" "dorun" "doall"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   373
            "load" "import" "unimport" "ns" "in-ns" "refer"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   374
            "try" "catch" "finally" "throw"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   375
            "with-open" "with-local-vars" "binding"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   376
            "gen-class" "gen-and-load-class" "gen-and-save-class"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   377
            "handler-case" "handle") t)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   378
         "\\>")
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   379
       1 font-lock-builtin-face)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   380
      ;; Built-ins
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   381
      (,(concat
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   382
         "(\\(?:clojure.core/\\)?"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   383
         (regexp-opt
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   384
          '("*" "*1" "*2" "*3" "*agent*"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   385
        "*allow-unresolved-vars*" "*assert*" "*clojure-version*" "*command-line-args*" "*compile-files*"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   386
        "*compile-path*" "*e" "*err*" "*file*" "*flush-on-newline*"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   387
        "*in*" "*macro-meta*" "*math-context*" "*ns*" "*out*"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   388
        "*print-dup*" "*print-length*" "*print-level*" "*print-meta*" "*print-readably*"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   389
        "*read-eval*" "*source-path*" "*use-context-classloader*" "*warn-on-reflection*" "+"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   390
        "-" "/"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   391
        "<" "<=" "=" "==" ">"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   392
        ">=" "accessor" "aclone"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   393
        "agent" "agent-errors" "aget" "alength" "alias"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   394
        "all-ns" "alter" "alter-meta!" "alter-var-root" "amap"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   395
        "ancestors" "and" "apply" "areduce" "array-map"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   396
        "aset" "aset-boolean" "aset-byte" "aset-char" "aset-double"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   397
        "aset-float" "aset-int" "aset-long" "aset-short" "assert"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   398
        "assoc" "assoc!" "assoc-in" "associative?" "atom"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   399
        "await" "await-for" "await1" "bases" "bean"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   400
        "bigdec" "bigint" "binding" "bit-and" "bit-and-not"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   401
        "bit-clear" "bit-flip" "bit-not" "bit-or" "bit-set"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   402
        "bit-shift-left" "bit-shift-right" "bit-test" "bit-xor" "boolean"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   403
        "boolean-array" "booleans" "bound-fn" "bound-fn*" "butlast"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   404
        "byte" "byte-array" "bytes" "case" "cast" "char"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   405
        "char-array" "char-escape-string" "char-name-string" "char?" "chars"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   406
        "chunk" "chunk-append" "chunk-buffer" "chunk-cons" "chunk-first"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   407
        "chunk-next" "chunk-rest" "chunked-seq?" "class" "class?"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   408
        "clear-agent-errors" "clojure-version" "coll?" "comment" "commute"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   409
        "comp" "comparator" "compare" "compare-and-set!" "compile"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   410
        "complement" "concat" "cond" "condp" "conj"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   411
        "conj!" "cons" "constantly" "construct-proxy" "contains?"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   412
        "count" "counted?" "create-ns" "create-struct" "cycle"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   413
        "dec" "decimal?" "declare" "definline" "defmacro"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   414
        "defmethod" "defmulti" "defn" "defn-" "defonce"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   415
        "defstruct" "delay" "delay?" "deliver" "deref"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   416
        "derive" "descendants" "destructure" "disj" "disj!"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   417
        "dissoc" "dissoc!" "distinct" "distinct?" "doall"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   418
        "doc" "dorun" "doseq" "dosync" "dotimes"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   419
        "doto" "double" "double-array" "doubles" "drop"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   420
        "drop-last" "drop-while" "empty" "empty?" "ensure"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   421
        "enumeration-seq" "eval" "even?" "every?"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   422
        "extend" "extend-protocol" "extend-type" "extends?" "extenders"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   423
        "false?" "ffirst" "file-seq" "filter" "find" "find-doc"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   424
        "find-ns" "find-var" "first" "flatten" "float" "float-array"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   425
        "float?" "floats" "flush" "fn" "fn?"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   426
        "fnext" "for" "force" "format" "future"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   427
        "future-call" "future-cancel" "future-cancelled?" "future-done?" "future?"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   428
        "gen-class" "gen-interface" "gensym" "get" "get-in"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   429
        "get-method" "get-proxy-class" "get-thread-bindings" "get-validator" "hash"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   430
        "hash-map" "hash-set" "identical?" "identity" "if-let"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   431
        "if-not" "ifn?" "import" "in-ns" "inc"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   432
        "init-proxy" "instance?" "int" "int-array" "integer?"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   433
        "interleave" "intern" "interpose" "into" "into-array"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   434
        "ints" "io!" "isa?" "iterate" "iterator-seq"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   435
        "juxt" "key" "keys" "keyword" "keyword?"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   436
        "last" "lazy-cat" "lazy-seq" "let" "letfn"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   437
        "line-seq" "list" "list*" "list?" "load"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   438
        "load-file" "load-reader" "load-string" "loaded-libs" "locking"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   439
        "long" "long-array" "longs" "loop" "macroexpand"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   440
        "macroexpand-1" "make-array" "make-hierarchy" "map" "map?"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   441
        "mapcat" "max" "max-key" "memfn" "memoize"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   442
        "merge" "merge-with" "meta" "method-sig" "methods"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   443
        "min" "min-key" "mod" "name" "namespace"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   444
        "neg?" "newline" "next" "nfirst" "nil?"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   445
        "nnext" "not" "not-any?" "not-empty" "not-every?"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   446
        "not=" "ns" "ns-aliases" "ns-imports" "ns-interns"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   447
        "ns-map" "ns-name" "ns-publics" "ns-refers" "ns-resolve"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   448
        "ns-unalias" "ns-unmap" "nth" "nthnext" "num"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   449
        "number?" "odd?" "or" "parents" "partial"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   450
        "partition" "pcalls" "peek" "persistent!" "pmap"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   451
        "pop" "pop!" "pop-thread-bindings" "pos?" "pr"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   452
        "pr-str" "prefer-method" "prefers" "primitives-classnames" "print"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   453
        "print-ctor" "print-doc" "print-dup" "print-method" "print-namespace-doc"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   454
        "print-simple" "print-special-doc" "print-str" "printf" "println"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   455
        "println-str" "prn" "prn-str" "promise" "proxy"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   456
        "proxy-call-with-super" "proxy-mappings" "proxy-name" "proxy-super" "push-thread-bindings"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   457
        "pvalues" "quot" "rand" "rand-int" "range"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   458
        "ratio?" "rational?" "rationalize" "re-find" "re-groups"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   459
        "re-matcher" "re-matches" "re-pattern" "re-seq" "read"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   460
        "read-line" "read-string" "reify" "reduce" "ref" "ref-history-count"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   461
        "ref-max-history" "ref-min-history" "ref-set" "refer" "refer-clojure"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   462
        "release-pending-sends" "rem" "remove" "remove-method" "remove-ns"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   463
        "repeat" "repeatedly" "replace" "replicate"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   464
        "require" "reset!" "reset-meta!" "resolve" "rest"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   465
        "resultset-seq" "reverse" "reversible?" "rseq" "rsubseq"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   466
        "satisfies?" "second" "select-keys" "send" "send-off" "seq"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   467
        "seq?" "seque" "sequence" "sequential?" "set"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   468
        "set-validator!" "set?" "short" "short-array" "shorts"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   469
        "shutdown-agents" "slurp" "some" "sort" "sort-by"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   470
        "sorted-map" "sorted-map-by" "sorted-set" "sorted-set-by" "sorted?"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   471
        "special-form-anchor" "special-symbol?" "split-at" "split-with" "str"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   472
        "stream?" "string?" "struct" "struct-map" "subs"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   473
        "subseq" "subvec" "supers" "swap!" "symbol"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   474
        "symbol?" "sync" "syntax-symbol-anchor" "take" "take-last"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   475
        "take-nth" "take-while" "test" "the-ns" "time"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   476
        "to-array" "to-array-2d" "trampoline" "transient" "tree-seq"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   477
        "true?" "type" "unchecked-add" "unchecked-dec" "unchecked-divide"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   478
        "unchecked-inc" "unchecked-multiply" "unchecked-negate" "unchecked-remainder" "unchecked-subtract"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   479
        "underive" "unquote" "unquote-splicing" "update-in" "update-proxy"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   480
        "use" "val" "vals" "var-get" "var-set"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   481
        "var?" "vary-meta" "vec" "vector" "vector?"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   482
        "when" "when-first" "when-let" "when-not" "while"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   483
        "with-bindings" "with-bindings*" "with-in-str" "with-loading-context" "with-local-vars"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   484
        "with-meta" "with-open" "with-out-str" "with-precision" "xml-seq" "zipmap"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   485
        ) t)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   486
         "\\>")
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   487
       1 font-lock-variable-name-face)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   488
      ;; (fn name? args ...)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   489
      (,(concat "(\\(?:clojure.core/\\)?\\(fn\\)[ \t]+"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   490
                ;; Possibly type
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   491
                "\\(?:#?^\\sw+[ \t]*\\)?"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   492
                ;; Possibly name
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   493
                "\\(\\sw+\\)?" )
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   494
       (1 font-lock-keyword-face)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   495
       (2 font-lock-function-name-face nil t))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   496
      ;;Other namespaces in clojure.jar
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   497
      (,(concat
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   498
         "(\\(?:\.*/\\)?"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   499
         (regexp-opt
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   500
          '(;; clojure.inspector
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   501
        "atom?" "collection-tag" "get-child" "get-child-count" "inspect"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   502
        "inspect-table" "inspect-tree" "is-leaf" "list-model" "list-provider"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   503
        ;; clojure.main
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   504
        "load-script" "main" "repl" "repl-caught" "repl-exception"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   505
        "repl-prompt" "repl-read" "skip-if-eol" "skip-whitespace" "with-bindings"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   506
        ;; clojure.set
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   507
        "difference" "index" "intersection" "join" "map-invert"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   508
        "project" "rename" "rename-keys" "select" "union"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   509
        ;; clojure.stacktrace
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   510
        "e" "print-cause-trace" "print-stack-trace" "print-throwable" "print-trace-element"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   511
        ;; clojure.template
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   512
        "do-template" "apply-template"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   513
        ;; clojure.test
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   514
        "*initial-report-counters*" "*load-tests*" "*report-counters*" "*stack-trace-depth*" "*test-out*"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   515
        "*testing-contexts*" "*testing-vars*" "are" "assert-any" "assert-expr"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   516
        "assert-predicate" "compose-fixtures" "deftest" "deftest-" "file-position"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   517
        "function?" "get-possibly-unbound-var" "inc-report-counter" "is" "join-fixtures"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   518
        "report" "run-all-tests" "run-tests" "set-test" "successful?"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   519
        "test-all-vars" "test-ns" "test-var" "testing" "testing-contexts-str"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   520
        "testing-vars-str" "try-expr" "use-fixtures" "with-test" "with-test-out"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   521
        ;; clojure.walk
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   522
        "keywordize-keys" "macroexpand-all" "postwalk" "postwalk-demo" "postwalk-replace"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   523
        "prewalk" "prewalk-demo" "prewalk-replace" "stringify-keys" "walk"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   524
        ;; clojure.xml
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   525
        "*current*" "*sb*" "*stack*" "*state*" "attrs"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   526
        "content" "content-handler" "element" "emit" "emit-element"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   527
        ;; clojure.zip
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   528
        "append-child" "branch?" "children" "down" "edit"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   529
        "end?" "insert-child" "insert-left" "insert-right" "left"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   530
        "leftmost" "lefts" "make-node" "next" "node"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   531
        "path" "prev" "remove" "replace" "right"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   532
        "rightmost" "rights" "root" "seq-zip" "up"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   533
        ) t)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   534
         "\\>")
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   535
       1 font-lock-type-face)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   536
      ;; Constant values (keywords), including as metadata e.g. ^:static
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   537
      ("\\<^?:\\(\\sw\\|#\\)+\\>" 0 font-lock-constant-face)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   538
      ;; Meta type annotation #^Type or ^Type
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   539
      ("#?^\\sw+" 0 font-lock-type-face)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   540
      ("\\<io\\!\\>" 0 font-lock-warning-face)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   541
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   542
      ;;Java interop highlighting
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   543
      ("\\<\\.[a-z][a-zA-Z0-9]*\\>" 0 font-lock-preprocessor-face) ;; .foo .barBaz .qux01
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   544
      ("\\<[A-Z][a-zA-Z0-9]*/[a-zA-Z0-9/$_]+\\>" 0 font-lock-preprocessor-face) ;; Foo Bar$Baz Qux_
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   545
      ("\\<[a-zA-Z]+\\.[a-zA-Z0-9._]*[A-Z]+[a-zA-Z0-9/.$]*\\>" 0 font-lock-preprocessor-face) ;; Foo/Bar foo.bar.Baz foo.Bar/baz
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   546
      ("[a-z]*[A-Z]+[a-z][a-zA-Z0-9$]*\\>" 0 font-lock-preprocessor-face) ;; fooBar
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   547
      ("\\<[A-Z][a-zA-Z0-9$]*\\.\\>" 0 font-lock-preprocessor-face))) ;; Foo. BarBaz. Qux$Quux. Corge9.
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   548
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   549
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   550
  "Default expressions to highlight in Clojure mode.")
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   551
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   552
;; Docstring positions
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   553
(put 'defn 'clojure-doc-string-elt 2)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   554
(put 'defn- 'clojure-doc-string-elt 2)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   555
(put 'defmulti 'clojure-doc-string-elt 2)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   556
(put 'defmacro 'clojure-doc-string-elt 2)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   557
(put 'definline 'clojure-doc-string-elt 2)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   558
(put 'defprotocol 'clojure-doc-string-elt 2)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   559
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   560
;; Docstring positions - contrib
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   561
(put 'defalias 'clojure-doc-string-elt 3)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   562
(put 'defmacro- 'clojure-doc-string-elt 2)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   563
(put 'defn-memo 'clojure-doc-string-elt 2)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   564
(put 'defnk 'clojure-doc-string-elt 2)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   565
(put 'defonce- 'clojure-doc-string-elt 3)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   566
(put 'defunbound 'clojure-doc-string-elt 2)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   567
(put 'defunbound- 'clojure-doc-string-elt 2)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   568
(put 'defvar 'clojure-doc-string-elt 3)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   569
(put 'defvar- 'clojure-doc-string-elt 3)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   570
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   571
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   572
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   573
(defun clojure-forward-sexp (n)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   574
  "Treat record literals like #user.Foo[1] and #user.Foo{:size 1}
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   575
as a single sexp so that slime will send them properly. Arguably
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   576
this behavior is unintuitive for the user pressing (eg) C-M-f
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   577
himself, but since these are single objects I think it's right."
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   578
  (let ((dir (if (> n 0) 1 -1))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   579
        (forward-sexp-function nil)) ; force the built-in version
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   580
    (while (not (zerop n))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   581
      (forward-sexp dir)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   582
      (when (save-excursion ; move back to see if we're in a record literal
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   583
              (and
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   584
               (condition-case nil
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   585
                   (progn (backward-sexp) 't)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   586
                 ('scan-error nil))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   587
               (looking-at "#\\w")))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   588
        (forward-sexp dir)) ; if so, jump over it
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   589
      (setq n (- n dir)))))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   590
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   591
(defun clojure-indent-function (indent-point state)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   592
  "This function is the normal value of the variable `lisp-indent-function'.
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   593
It is used when indenting a line within a function call, to see if the
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   594
called function says anything special about how to indent the line.
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   595
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   596
INDENT-POINT is the position where the user typed TAB, or equivalent.
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   597
Point is located at the point to indent under (for default indentation);
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   598
STATE is the `parse-partial-sexp' state for that position.
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   599
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   600
If the current line is in a call to a Lisp function
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   601
which has a non-nil property `lisp-indent-function',
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   602
that specifies how to do the indentation.  The property value can be
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   603
* `defun', meaning indent `defun'-style;
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   604
* an integer N, meaning indent the first N arguments specially
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   605
  like ordinary function arguments and then indent any further
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   606
  arguments like a body;
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   607
* a function to call just as this function was called.
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   608
  If that function returns nil, that means it doesn't specify
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   609
  the indentation.
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   610
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   611
This function also returns nil meaning don't specify the indentation."
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   612
  (let ((normal-indent (current-column)))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   613
    (goto-char (1+ (elt state 1)))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   614
    (parse-partial-sexp (point) calculate-lisp-indent-last-sexp 0 t)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   615
    (if (and (elt state 2)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   616
             (not (looking-at "\\sw\\|\\s_")))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   617
        ;; car of form doesn't seem to be a symbol
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   618
        (progn
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   619
          (if (not (> (save-excursion (forward-line 1) (point))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   620
                      calculate-lisp-indent-last-sexp))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   621
              (progn (goto-char calculate-lisp-indent-last-sexp)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   622
                     (beginning-of-line)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   623
                     (parse-partial-sexp (point)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   624
                                         calculate-lisp-indent-last-sexp 0 t)))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   625
          ;; Indent under the list or under the first sexp on the same
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   626
          ;; line as calculate-lisp-indent-last-sexp.  Note that first
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   627
          ;; thing on that line has to be complete sexp since we are
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   628
          ;; inside the innermost containing sexp.
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   629
          (backward-prefix-chars)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   630
          (if (and (eq (char-after (point)) ?\[)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   631
                   (eq (char-after (elt state 1)) ?\())
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   632
              (+ (current-column) 2) ;; this is probably inside a defn
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   633
            (current-column)))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   634
      (let ((function (buffer-substring (point)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   635
                                        (progn (forward-sexp 1) (point))))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   636
            (open-paren (elt state 1))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   637
            method)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   638
        (setq method (get (intern-soft function) 'clojure-indent-function))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   639
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   640
        (cond ((member (char-after open-paren) '(?\[ ?\{))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   641
               (goto-char open-paren)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   642
               (1+ (current-column)))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   643
              ((or (eq method 'defun)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   644
                   (and (null method)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   645
                        (> (length function) 3)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   646
                        (string-match "\\`\\(?:\\S +/\\)?def\\|with-"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   647
                                      function)))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   648
               (lisp-indent-defform state indent-point))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   649
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   650
              ((integerp method)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   651
               (lisp-indent-specform method state
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   652
                                     indent-point normal-indent))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   653
              (method
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   654
               (funcall method indent-point state))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   655
              (clojure-mode-use-backtracking-indent
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   656
               (clojure-backtracking-indent
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   657
                indent-point state normal-indent)))))))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   658
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   659
(defun clojure-backtracking-indent (indent-point state normal-indent)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   660
  "Experimental backtracking support. Will upwards in an sexp to
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   661
check for contextual indenting."
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   662
  (let (indent (path) (depth 0))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   663
    (goto-char (elt state 1))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   664
    (while (and (not indent)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   665
                (< depth clojure-max-backtracking))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   666
      (let ((containing-sexp (point)))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   667
        (parse-partial-sexp (1+ containing-sexp) indent-point 1 t)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   668
        (when (looking-at "\\sw\\|\\s_")
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   669
          (let* ((start (point))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   670
                 (fn (buffer-substring start (progn (forward-sexp 1) (point))))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   671
                 (meth (get (intern-soft fn) 'clojure-backtracking-indent)))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   672
            (let ((n 0))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   673
              (when (< (point) indent-point)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   674
                (condition-case ()
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   675
                    (progn
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   676
                      (forward-sexp 1)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   677
                      (while (< (point) indent-point)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   678
                        (parse-partial-sexp (point) indent-point 1 t)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   679
                        (incf n)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   680
                        (forward-sexp 1)))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   681
                  (error nil)))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   682
              (push n path))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   683
            (when meth
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   684
              (let ((def meth))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   685
                (dolist (p path)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   686
                  (if (and (listp def)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   687
                           (< p (length def)))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   688
                      (setq def (nth p def))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   689
                    (if (listp def)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   690
                        (setq def (car (last def)))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   691
                      (setq def nil))))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   692
                (goto-char (elt state 1))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   693
                (when def
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   694
                  (setq indent (+ (current-column) def)))))))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   695
        (goto-char containing-sexp)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   696
        (condition-case ()
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   697
            (progn
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   698
              (backward-up-list 1)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   699
              (incf depth))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   700
          (error (setq depth clojure-max-backtracking)))))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   701
    indent))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   702
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   703
;; clojure backtracking indent is experimental and the format for these
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   704
;; entries are subject to change
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   705
(put 'implement 'clojure-backtracking-indent '(4 (2)))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   706
(put 'letfn 'clojure-backtracking-indent '((2) 2))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   707
(put 'proxy 'clojure-backtracking-indent '(4 4 (2)))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   708
(put 'reify 'clojure-backtracking-indent '((2)))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   709
(put 'deftype 'clojure-backtracking-indent '(4 4 (2)))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   710
(put 'defrecord 'clojure-backtracking-indent '(4 4 (2)))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   711
(put 'defprotocol 'clojure-backtracking-indent '(4 (2)))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   712
(put 'extend-type 'clojure-backtracking-indent '(4 (2)))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   713
(put 'extend-protocol 'clojure-backtracking-indent '(4 (2)))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   714
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   715
(defun put-clojure-indent (sym indent)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   716
  (put sym 'clojure-indent-function indent))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   717
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   718
(defmacro define-clojure-indent (&rest kvs)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   719
  `(progn
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   720
     ,@(mapcar (lambda (x) `(put-clojure-indent
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   721
                        (quote ,(first x)) ,(second x))) kvs)))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   722
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   723
(defun add-custom-clojure-indents (name value)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   724
  (setq clojure-defun-indents value)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   725
  (mapcar (lambda (x)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   726
            (put-clojure-indent x 'defun))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   727
          value))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   728
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   729
(defcustom clojure-defun-indents nil
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   730
  "List of symbols to give defun-style indentation to in Clojure
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   731
code, in addition to those that are built-in. You can use this to
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   732
get emacs to indent your own macros the same as it does the
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   733
built-ins like with-open. To set manually from lisp code,
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   734
use (put-clojure-indent 'some-symbol 'defun)."
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   735
  :type '(repeat symbol)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   736
  :group 'clojure-mode
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   737
  :set 'add-custom-clojure-indents)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   738
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   739
(define-clojure-indent
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   740
  ;; built-ins
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   741
  (ns 1)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   742
  (fn 'defun)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   743
  (def 'defun)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   744
  (defn 'defun)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   745
  (bound-fn 'defun)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   746
  (if 1)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   747
  (if-not 1)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   748
  (case 1)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   749
  (condp 2)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   750
  (when 1)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   751
  (while 1)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   752
  (when-not 1)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   753
  (when-first 1)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   754
  (do 0)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   755
  (future 0)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   756
  (comment 0)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   757
  (doto 1)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   758
  (locking 1)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   759
  (proxy 2)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   760
  (with-open 1)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   761
  (with-precision 1)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   762
  (with-local-vars 1)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   763
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   764
  (reify 'defun)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   765
  (deftype 2)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   766
  (defrecord 2)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   767
  (defprotocol 1)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   768
  (extend 1)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   769
  (extend-protocol 1)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   770
  (extend-type 1)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   771
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   772
  (try 0)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   773
  (catch 2)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   774
  (finally 0)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   775
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   776
  ;; binding forms
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   777
  (let 1)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   778
  (letfn 1)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   779
  (binding 1)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   780
  (loop 1)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   781
  (for 1)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   782
  (doseq 1)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   783
  (dotimes 1)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   784
  (when-let 1)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   785
  (if-let 1)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   786
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   787
  ;; data structures
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   788
  (defstruct 1)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   789
  (struct-map 1)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   790
  (assoc 1)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   791
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   792
  (defmethod 'defun)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   793
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   794
  ;; clojure.test
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   795
  (testing 1)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   796
  (deftest 'defun)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   797
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   798
  ;; contrib
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   799
  (handler-case 1)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   800
  (handle 1)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   801
  (dotrace 1)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   802
  (deftrace 'defun))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   803
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   804
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   805
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   806
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   807
;;
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   808
;; Better docstring filling for clojure-mode
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   809
;;
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   810
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   811
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   812
(defun clojure-string-start ()
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   813
  "Return the position of the \" that begins the string at point."
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   814
  (save-excursion
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   815
    (save-match-data
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   816
      ;; Find a quote that appears immediately after whitespace,
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   817
      ;; beginning of line, or an open paren, brace, or bracket
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   818
      (re-search-backward "\\(\\s-\\|^\\|(\\|\\[\\|{\\)\\(\"\\)")
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   819
      (match-beginning 2))))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   820
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   821
(defun clojure-char-at-point ()
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   822
  "Return the char at point or nil if at buffer end."
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   823
  (when (not (= (point) (point-max)))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   824
   (buffer-substring-no-properties (point) (1+ (point)))))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   825
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   826
(defun clojure-char-before-point ()
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   827
  "Return the char before point or nil if at buffer beginning."
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   828
  (when (not (= (point) (point-min)))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   829
    (buffer-substring-no-properties (point) (1- (point)))))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   830
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   831
;; TODO: Deal with the fact that when point is exactly at the
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   832
;; beginning of a string, it thinks that is the end.
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   833
(defun clojure-string-end ()
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   834
  "Return the position of the \" that ends the string at point.
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   835
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   836
Note that point must be inside the string - if point is
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   837
positioned at the opening quote, incorrect results will be
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   838
returned."
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   839
  (save-excursion
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   840
    (save-match-data
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   841
      ;; If we're at the end of the string, just return point.
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   842
      (if (and (string= (clojure-char-at-point) "\"")
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   843
               (not (string= (clojure-char-before-point) "\\")))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   844
          (point)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   845
        ;; We don't want to get screwed by starting out at the
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   846
        ;; backslash in an escaped quote.
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   847
        (when (string= (clojure-char-at-point) "\\")
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   848
          (backward-char))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   849
        ;; Look for a quote not preceeded by a backslash
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   850
        (re-search-forward "[^\\]\\\(\\\"\\)")
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   851
        (match-beginning 1)))))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   852
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   853
(defun clojure-docstring-start+end-points ()
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   854
  "Return the start and end points of the string at point as a cons."
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   855
  (if (and (fboundp 'paredit-string-start+end-points) paredit-mode)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   856
      (paredit-string-start+end-points)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   857
    (cons (clojure-string-start) (clojure-string-end))))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   858
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   859
(defun clojure-mark-string ()
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   860
  "Mark the string at point."
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   861
  (interactive)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   862
  (goto-char (clojure-string-start))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   863
  (forward-char)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   864
  (set-mark (clojure-string-end)))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   865
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   866
(defun clojure-fill-docstring (&optional argument)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   867
  "Fill the definition that the point is on appropriate for Clojure.
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   868
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   869
  Fills so that every paragraph has a minimum of two initial spaces,
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   870
  with the exception of the first line. Fill margins are taken from
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   871
  paragraph start, so a paragraph that begins with four spaces will
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   872
  remain indented by four spaces after refilling."
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   873
  (interactive "P")
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   874
  (if (and (fboundp 'paredit-in-string-p) paredit-mode)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   875
      (unless (paredit-in-string-p)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   876
        (error "Must be inside a string")))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   877
  ;; Oddly, save-excursion doesn't do a good job of preserving point.
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   878
  ;; It's probably because we delete the string and then re-insert it.
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   879
  (let ((old-point (point)))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   880
    (save-restriction
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   881
      (save-excursion
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   882
        (let* ((string-region (clojure-docstring-start+end-points))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   883
               (string-start (1+ (car string-region)))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   884
               (string-end (cdr string-region))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   885
               (string (buffer-substring-no-properties (1+ (car string-region))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   886
                                                       (cdr string-region))))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   887
          (delete-region string-start string-end)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   888
          (insert
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   889
           (with-temp-buffer
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   890
             (insert string)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   891
             (let ((left-margin 2))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   892
               (delete-trailing-whitespace)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   893
               (fill-region (point-min) (point-max))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   894
               (buffer-substring-no-properties (+ 2 (point-min)) (point-max))))))))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   895
    (goto-char old-point)))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   896
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   897
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   898
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   899
(defconst clojure-namespace-name-regex
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   900
  (rx line-start
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   901
      "("
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   902
      (zero-or-one (group (regexp "clojure.core/")))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   903
      (zero-or-one (submatch "in-"))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   904
      "ns"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   905
      (zero-or-one "+")
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   906
      (one-or-more (any whitespace "\n"))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   907
      (zero-or-more (or (submatch (zero-or-one "#")
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   908
                                  "^{"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   909
                                  (zero-or-more (not (any "}")))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   910
                                  "}")
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   911
                        (zero-or-more "^:"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   912
                                      (one-or-more (not (any whitespace)))))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   913
                    (one-or-more (any whitespace "\n")))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   914
      ;; why is this here? oh (in-ns 'foo) or (ns+ :user)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   915
      (zero-or-one (any ":'"))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   916
      (group (one-or-more (not (any "()\"" whitespace))) word-end)))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   917
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   918
;; for testing clojure-namespace-name-regex, you can evaluate this code and make
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   919
;; sure foo (or whatever the namespace name is) shows up in results. some of
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   920
;; these currently fail.
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   921
;; (mapcar (lambda (s) (let ((n (string-match clojure-namespace-name-regex s)))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   922
;;                       (if n (match-string 4 s))))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   923
;;         '("(ns foo)"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   924
;;           "(ns
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   925
;; foo)"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   926
;;           "(ns foo.baz)"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   927
;;           "(ns ^:bar foo)"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   928
;;           "(ns ^:bar ^:baz foo)"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   929
;;           "(ns ^{:bar true} foo)"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   930
;;           "(ns #^{:bar true} foo)"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   931
;;           "(ns #^{:fail {}} foo)"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   932
;;           "(ns ^{:fail2 {}} foo.baz)"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   933
;;           "(ns ^{} foo)"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   934
;;           "(ns ^{:skip-wiki true}
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   935
;;   aleph.netty
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   936
;; "
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   937
;;           "(ns
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   938
;;  foo)"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   939
;;     "foo"))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   940
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   941
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   942
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   943
(defun clojure-insert-ns-form ()
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   944
  (interactive)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   945
  (goto-char (point-min))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   946
  (let* ((rel (car (last (split-string buffer-file-name "src/\\|test/"))))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   947
         (relative (car (split-string rel "\\.clj")))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   948
         (segments (split-string relative "/")))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   949
    (insert (format "(ns %s)" (mapconcat #'identity segments ".")))))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   950
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   951
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   952
;;; Slime help
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   953
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   954
(defvar clojure-project-root-file "project.clj")
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   955
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   956
;; Pipe to $SHELL to work around mackosecks GUI Emacs $PATH issues.
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   957
(defcustom clojure-swank-command
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   958
  (if (or (locate-file "lein" exec-path) (locate-file "lein.bat" exec-path))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   959
      "lein jack-in %s"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   960
    "echo \"lein jack-in %s\" | $SHELL -l")
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   961
  "The command used to start swank via clojure-jack-in.
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   962
For remote swank it is lein must be in your PATH and the remote
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   963
proc is launched via sh rather than bash, so it might be necessary
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   964
to specific the full path to it. The argument is the port to connect on.
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   965
Localhost is assumed."
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   966
  :type 'string
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   967
  :group 'clojure-mode)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   968
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   969
(defcustom clojure-generate-remote-swank-command-function
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   970
  'clojure-generate-remote-swank-command-ssh-tunnel
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   971
  "A function that is called to determine the swank command that
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   972
`clojure-jack-in` will execute and the hostname/port that slime
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   973
should connect to for remote projects that are opened via tramp.
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   974
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   975
The arguments are dir, hostname, and port.  The return value should be an `alist` of the form
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   976
(:cmd \"command string\" :hostname \"hostname\" :port 1234)"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   977
  :type 'function
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   978
  :group 'clojure-mode)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   979
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   980
(defun clojure-generate-local-swank-command-default (dir hostname port)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   981
  (if (not (string-equal "localhost" hostname))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   982
      (error (concat
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   983
              "If you need to jack-in to remote projects/jvms over tramp, "
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   984
              "you need to define a custom `clojure-generate-swank-command-function`"))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   985
    (list :cmd (format clojure-swank-command port)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   986
          :hostname hostname
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   987
          :port port)))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   988
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   989
(defun clojure-generate-remote-swank-command-ssh-tunnel (dir hostname port)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   990
  (destructuring-bind (_method user host localname)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   991
      (append (tramp-dissect-file-name dir) nil)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   992
    (list :cmd (format-spec
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   993
                "ssh -L %p:localhost:%p -l '%u' '%h' 'cd \'%d\'; lein jack-in \'%p\''"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   994
                `((?p . ,port)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   995
                  (?h . ,host)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   996
                  (?u . ,(or user (getenv "USER")))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   997
                  (?d . ,localname)))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   998
          :hostname "localhost"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
   999
          :port port)))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1000
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1001
(defun clojure-generate-swank-cmd (dir hostname port)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1002
  (if (file-remote-p dir)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1003
      (if (functionp clojure-generate-remote-swank-command-function)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1004
          (funcall clojure-generate-remote-swank-command-function dir hostname port)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1005
        (error (concat
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1006
                "If you need to jack-in to remote projects/jvms over tramp "
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1007
                "you need to define a custom `clojure-generate-remote-swank-command-function`")))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1008
    (clojure-generate-local-swank-command-default dir hostname port)))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1009
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1010
(defun clojure-jack-in-sentinel (process event)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1011
  (let ((debug-on-error t))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1012
    (error "Could not start swank server: %s"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1013
           (let ((b (process-buffer process)))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1014
             (if (and b (buffer-live-p b))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1015
                 (with-current-buffer b
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1016
                   (buffer-substring (point-min) (point-max))))))))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1017
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1018
(defun clojure-eval-bootstrap-region (process)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1019
  "Eval only the elisp in between the markers."
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1020
  (with-current-buffer (process-buffer process)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1021
    (save-excursion
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1022
      (goto-char 0)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1023
      (search-forward ";;; Bootstrapping bundled version of SLIME")
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1024
      (let ((begin (point)))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1025
        (when (not (search-forward ";;; Done bootstrapping." nil t))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1026
          ;; fall back to possibly-ambiguous string if above isn't found
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1027
          (search-forward "(run-hooks 'slime-load-hook)"))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1028
        (eval-region begin (point))))))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1029
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1030
(defun clojure-kill-swank-buffer (swank-buffer-name)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1031
  (when (get-buffer swank-buffer-name)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1032
    (let ((process (get-buffer-process (get-buffer swank-buffer-name))))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1033
      (if process
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1034
          (set-process-query-on-exit-flag process nil))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1035
      (kill-buffer swank-buffer-name))))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1036
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1037
(defun clojure-generate-swank-connection-name (dir hostname)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1038
  "swank")
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1039
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1040
(defun clojure-jack-in-start-process (swank-connection-name swank-buffer-name dir hostname)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1041
  ;; The buffer has to be created before the proc if
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1042
  ;; `start-file-process-shell-command` is used. It doesn't hurt to do
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1043
  ;; it now even if `start-process-shell-command` is used:
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1044
  (get-buffer-create swank-buffer-name)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1045
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1046
  (let ((port (- 65535 (mod (caddr (current-time)) 4096))))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1047
    (destructuring-bind (&key cmd hostname port)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1048
        (clojure-generate-swank-cmd dir hostname port)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1049
      (lexical-let* ((proc (start-process-shell-command
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1050
                            ;; this command runs locally
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1051
                            ;; `start-file-process-shell-command` would
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1052
                            ;; run remote for tramp buffers
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1053
                            swank-connection-name
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1054
                            swank-buffer-name
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1055
                            cmd))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1056
                     (dir dir)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1057
                     (hostname hostname)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1058
                     (port port)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1059
                     (connect-callback (lambda () (slime-connect hostname port))))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1060
        (set-process-sentinel proc 'clojure-jack-in-sentinel)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1061
        (set-process-query-on-exit-flag proc nil)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1062
        (set-process-filter proc
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1063
                            (lambda (process output)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1064
                              (with-current-buffer (process-buffer process)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1065
                                (insert output))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1066
                              (when (string-match "proceed to jack in" output)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1067
                                (clojure-eval-bootstrap-region process)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1068
                                (with-current-buffer
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1069
                                    ;; this block is an attempt to avoid
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1070
                                    ;; creating duplicate repl windows
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1071
                                    (or
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1072
                                     (get-buffer "*slime-repl clojure*")
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1073
                                     (get-buffer "*slime-repl nil*")
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1074
                                     (current-buffer))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1075
                                  (funcall connect-callback)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1076
                                  (when (string-match "slime-repl" (buffer-name))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1077
                                    ;; this is most likely an old repl
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1078
                                    ;; buffer that existed prior to the
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1079
                                    ;; jack-in call.
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1080
                                    (setq default-directory dir)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1081
                                    (goto-char (point-max))))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1082
                                (set-process-sentinel process nil)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1083
                                (set-process-filter process nil))))))))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1084
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1085
;;;###autoload
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1086
(defun clojure-jack-in ()
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1087
  (interactive)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1088
  (setq slime-net-coding-system 'utf-8-unix)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1089
  (let* ((dir default-directory)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1090
         (hostname (if (file-remote-p default-directory)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1091
                       tramp-current-host "localhost"))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1092
         (connection-name (clojure-generate-swank-connection-name dir hostname))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1093
         (swank-buffer-name (format "*%s*" connection-name)))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1094
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1095
    (when (and (functionp 'slime-disconnect)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1096
               (slime-current-connection)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1097
               ;; TODO: ask for permission once jack-in supports multiple connections
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1098
               ;; (and (interactive-p) (y-or-n-p "Close old connections first? "))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1099
               )
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1100
      (slime-disconnect))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1101
    (clojure-kill-swank-buffer swank-buffer-name)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1102
    (clojure-jack-in-start-process connection-name swank-buffer-name dir hostname))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1103
  (message "Starting swank server..."))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1104
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1105
(defun clojure-find-ns ()
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1106
  (let ((regexp clojure-namespace-name-regex))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1107
    (save-excursion
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1108
      (when (or (re-search-backward regexp nil t)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1109
                (re-search-forward regexp nil t))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1110
        (match-string-no-properties 4)))))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1111
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1112
(defalias 'clojure-find-package 'clojure-find-ns)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1113
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1114
(defun clojure-enable-slime ()
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1115
  (slime-mode t)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1116
  (set (make-local-variable 'slime-find-buffer-package-function)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1117
       'clojure-find-ns))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1118
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1119
;;;###autoload
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1120
(defun clojure-enable-slime-on-existing-buffers ()
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1121
  (interactive)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1122
  (add-hook 'clojure-mode-hook 'clojure-enable-slime)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1123
  (save-window-excursion
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1124
    (dolist (buffer (buffer-list))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1125
      (with-current-buffer buffer
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1126
        (when (eq major-mode 'clojure-mode)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1127
          (clojure-enable-slime))))))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1128
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1129
;; Test navigation:
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1130
(defun clojure-in-tests-p ()
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1131
  (or (string-match-p "test\." (clojure-find-ns))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1132
      (string-match-p "/test" (buffer-file-name))))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1133
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1134
(defun clojure-underscores-for-hyphens (namespace)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1135
  (replace-regexp-in-string "-" "_" namespace))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1136
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1137
(defun clojure-test-for (namespace)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1138
  (let* ((namespace (clojure-underscores-for-hyphens namespace))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1139
         (segments (split-string namespace "\\."))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1140
         (before (subseq segments 0 clojure-test-ns-segment-position))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1141
         (after (subseq segments clojure-test-ns-segment-position))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1142
         (test-segments (append before (list "test") after)))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1143
    (mapconcat 'identity test-segments "/")))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1144
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1145
(defun clojure-jump-to-test ()
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1146
  "Jump from implementation file to test."
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1147
  (interactive)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1148
  (find-file (format "%stest/%s.clj"
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1149
                     (file-name-as-directory
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1150
                      (locate-dominating-file buffer-file-name "src/"))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1151
                     (clojure-test-for (clojure-find-ns)))))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1152
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1153
(defun clojure-jump-between-tests-and-code ()
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1154
  (interactive)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1155
  (if (clojure-in-tests-p)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1156
      (clojure-test-jump-to-implementation)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1157
    (clojure-jump-to-test)))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1158
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1159
;;; slime filename translation for tramp
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1160
(defun clojure-slime-tramp-local-filename (f)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1161
  (if (file-remote-p f)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1162
      (tramp-file-name-localname
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1163
       (tramp-dissect-file-name f))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1164
    f))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1165
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1166
(defun clojure-slime-tramp-remote-filename (f)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1167
  (if (file-remote-p default-directory)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1168
      (tramp-make-tramp-file-name
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1169
       (tramp-file-name-method
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1170
        (tramp-dissect-file-name default-directory))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1171
       (tramp-file-name-user
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1172
        (tramp-dissect-file-name default-directory))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1173
       (tramp-file-name-host
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1174
        (tramp-dissect-file-name default-directory))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1175
       f)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1176
    f))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1177
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1178
(defun clojure-slime-remote-file-name-hook ()
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1179
  (setq slime-from-lisp-filename-function
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1180
        'clojure-slime-tramp-remote-filename)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1181
  (setq slime-to-lisp-filename-function
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1182
        'clojure-slime-tramp-local-filename))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1183
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1184
(add-hook 'slime-connected-hook 'clojure-slime-remote-file-name-hook)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1185
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1186
;;;###autoload
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1187
(add-hook 'slime-connected-hook 'clojure-enable-slime-on-existing-buffers)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1188
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1189
(add-hook 'slime-indentation-update-hooks 'put-clojure-indent)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1190
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1191
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1192
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1193
;;;###autoload
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1194
(add-to-list 'auto-mode-alist '("\\.clj$" . clojure-mode))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1195
(add-to-list 'interpreter-mode-alist '("jark" . clojure-mode))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1196
(add-to-list 'interpreter-mode-alist '("cake" . clojure-mode))
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1197
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1198
(provide 'clojure-mode)
6590d340a568 Added clojure mode.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
  1199
;;; clojure-mode.el ends here