Commits

Tamas Kovacs committed 2991f64

Version 0.9.6

Perform indenting when Tab pressed on whitespace. Added support for newer swank message length counting in bytes. Updated Lisp swank server to version 2012-03-06. Updated Clojure API reference to version 1.3. Identify .cljs files as Clojure type. Enable g:slimv_repl_syntax by default. Restart parenthesis highlighting at each REPL prompt. Scheme: eval buffer and region in a (begin ...) block. Added option g:scheme_builtin_swank for enabling MIT scheme's built-in swank server. Added syntax highlight for Scheme quoted symbol. Keep SLDB buffer if swank stays in debugger upon selecting a restart. When reconnecting the swank server wait for disconnection first. Fixed REPL buffer slowdown caused by re-assigning autocommands. Fixed detection of string and comment when no syntax loaded. Fixed Scheme syntax highlight problems in the REPL buffer. Call :frame-source-location and :frame-call only if swank supports them.

  • Participants
  • Parent commits 252cca6

Comments (0)

Files changed (39)

File doc/slimv.txt

-*slimv.txt*                    Slimv                 Last Change: 10 Mar 2012
+*slimv.txt*                    Slimv                 Last Change: 31 Mar 2012
 
 Slimv                                                                  *slimv*
-                               Version 0.9.5
+                               Version 0.9.6
 
 The Superior Lisp Interaction Mode for Vim.
 This plugin is aimed to help Lisp development by interfacing between Vim and
 For the Paredit options please visit |paredit-options|.
 For the Swank options plese visit |swank-configuration|.
 
+|g:scheme_builtin_swank|     Enable MIT scheme's built-in swank server.
+
 |g:slimv_balloon|            Specifies if tooltips are on.
 
 |g:slimv_browser_cmd|        If nonempty, this command is used to open the
 The SWANK server is connected to port 4005 by default. This can be changed
 using the g:swank_port option.
 
+                                                       *g:scheme_builtin_swank*
+
+Since version 9.1.1 MIT scheme has a built-in swank server that can replace
+contrib/swank-mit-scheme.scm coming with Slime. This option enables the
+built-in swank server.
+Please be aware that this is still experimental, so it is not enabled by
+default. Using it may result in strange errors, but in other areas it also
+may be superior to swank-mit-scheme.scm and it is actively maintained.
+
                                                               *g:slimv_timeout*
 There is a 20 second timeout defined for starting up or connecting to the
 SWANK server. This timeout can be changed via the g:slimv_timeout option.
 is unlimited, i.e. no line is ever erased.
 
                                                           *g:slimv_repl_syntax*
-Enables syntax highlighting for the REPL buffer. Switched off by default for
-two reasons:
-  1. The REPL buffer also contains the REPL output, which is generally not
-     related to s-expressions, therefore may confuse syntax coloring.
+Enables syntax highlighting for the REPL buffer. It is enabled by default but
+one may want to switch it off for these reasons:
+  1. The REPL buffer contains s-expressions and their output mixed. The REPL
+     output is generally not related to s-expressions, therefore may confuse
+     syntax coloring.
   2. REPL output may contain very long lines, which significantly slows down
-     syntax coloring in Vim. If you really want to enable syntax highlighting
-     for the REPL buffer, then it is recommended to adjust the |synmaxcol|
-     parameter to a relatively low value in order to increase syntax coloring
-     speed.
+     syntax coloring in Vim. If you don't want to switch REPL syntax coloring
+     completely off then it is recommended to adjust the |synmaxcol| parameter
+     to a relatively low value to increase syntax coloring speed.
 
                                                             *g:slimv_repl_wrap*
 Set wrap mode for the REPL buffer, which means the lines longer than the
 ===============================================================================
 CHANGE LOG                                                    *slimv-changelog*
 
+0.9.6  - Perform indenting when <Tab> pressed on whitespace.
+       - Added support for newer swank message length counting in bytes.
+       - Updated Lisp swank server to version 2012-03-06.
+       - Updated Clojure API reference to version 1.3.
+       - Identify .cljs files as Clojure type.
+       - Enable g:slimv_repl_syntax by default.
+       - Restart parenthesis highlighting at each REPL prompt.
+       - Scheme: eval buffer and region in a (begin ...) block.
+       - Added option g:scheme_builtin_swank for enabling MIT scheme's built-in
+         swank server.
+       - Added syntax highlight for Scheme quoted symbol.
+       - Keep SLDB buffer if swank stays in debugger upon selecting a restart.
+       - When reconnecting the swank server wait for disconnection first.
+       - Fixed REPL buffer slowdown caused by re-assigning autocommands.
+       - Fixed detection of string and comment when no syntax loaded.
+       - Fixed Scheme syntax highlight problems in the REPL buffer.
+       - Call :frame-source-location and :frame-call only if swank supports them.
+
 0.9.5  - Use correct SLDB level when invoking restart.
        - Autodetect tmux session on Linux (thanks to Brett Kosinski).
        - Enable syntax only once to avoid reload of syntax plugins.

File ftdetect/clojure.vim

 au BufNewFile,BufRead *.clj setf clojure
+au BufNewFile,BufRead *.cljs setf clojure
 

File ftplugin/scheme/slimv-scheme.vim

 " slimv-scheme.vim:
 "               Scheme filetype plugin for Slimv
-" Version:      0.9.5
-" Last Change:  06 Mar 2012
+" Version:      0.9.6
+" Last Change:  25 Mar 2012
 " Maintainer:   Tamas Kovacs <kovisoft at gmail dot com>
 " License:      This file is placed in the public domain.
 "               No warranty, express or implied.
 
 " Try to autodetect SWANK and build the command to load the SWANK server
 function! b:SlimvSwankLoader()
-    let swanks = split( globpath( &runtimepath, 'slime/contrib/swank-mit-scheme.scm'), '\n' )
-    if len( swanks ) == 0
-        return ''
-    endif
     if g:slimv_impl == 'mit'
+        if exists( 'g:scheme_builtin_swank' ) && g:scheme_builtin_swank
+            " MIT Scheme contains a built-in swank server since version 9.1.1
+            return 'scheme --eval "(let loop () (start-swank) (loop))"'
+        endif
+        let swanks = split( globpath( &runtimepath, 'slime/contrib/swank-mit-scheme.scm'), '\n' )
+        if len( swanks ) == 0
+            return ''
+        endif
         return '"' . g:slimv_lisp . '" --load "' . swanks[0] . '"'
     endif
     return ''

File ftplugin/slimv-cljapi.vim

 " slimv-cljapi.vim:
 "               Clojure API lookup support for Slimv
-" Version:      0.7.0
-" Last Change:  23 Sep 2010
+" Version:      0.9.6
+" Last Change:  12 Mar 2012
 " Maintainer:   Tamas Kovacs <kovisoft at gmail dot com>
 " License:      This file is placed in the public domain.
 "               No warranty, express or implied.
 if !exists( 'g:slimv_cljapi_db' )
     let g:slimv_cljapi_db = [
     \["*", "clojure.core-api.html\\#clojure.core/*"],
+    \["*'", "clojure.core-api.html\\#clojure.core/*'"],
     \["*1", "clojure.core-api.html\\#clojure.core/*1"],
     \["*2", "clojure.core-api.html\\#clojure.core/*2"],
     \["*3", "clojure.core-api.html\\#clojure.core/*3"],
     \["*print-meta*", "clojure.core-api.html\\#clojure.core/*print-meta*"],
     \["*print-readably*", "clojure.core-api.html\\#clojure.core/*print-readably*"],
     \["*read-eval*", "clojure.core-api.html\\#clojure.core/*read-eval*"],
+    \["*unchecked-math*", "clojure.core-api.html\\#clojure.core/*unchecked-math*"],
     \["*warn-on-reflection*", "clojure.core-api.html\\#clojure.core/*warn-on-reflection*"],
     \["+", "clojure.core-api.html\\#clojure.core/+"],
+    \["+'", "clojure.core-api.html\\#clojure.core/+'"],
     \["-", "clojure.core-api.html\\#clojure.core/-"],
+    \["-'", "clojure.core-api.html\\#clojure.core/-'"],
     \["->", "clojure.core-api.html\\#clojure.core/->"],
     \["->>", "clojure.core-api.html\\#clojure.core/->>"],
     \["..", "clojure.core-api.html\\#clojure.core/.."],
     \["add-classpath", "clojure.core-api.html\\#clojure.core/add-classpath"],
     \["add-watch", "clojure.core-api.html\\#clojure.core/add-watch"],
     \["agent", "clojure.core-api.html\\#clojure.core/agent"],
+    \["agent-error", "clojure.core-api.html\\#clojure.core/agent-error"],
     \["agent-errors", "clojure.core-api.html\\#clojure.core/agent-errors"],
     \["aget", "clojure.core-api.html\\#clojure.core/aget"],
     \["alength", "clojure.core-api.html\\#clojure.core/alength"],
     \["bean", "clojure.core-api.html\\#clojure.core/bean"],
     \["bigdec", "clojure.core-api.html\\#clojure.core/bigdec"],
     \["bigint", "clojure.core-api.html\\#clojure.core/bigint"],
+    \["biginteger", "clojure.core-api.html\\#clojure.core/biginteger"],
     \["binding", "clojure.core-api.html\\#clojure.core/binding"],
     \["bit-and", "clojure.core-api.html\\#clojure.core/bit-and"],
     \["bit-and-not", "clojure.core-api.html\\#clojure.core/bit-and-not"],
     \["booleans", "clojure.core-api.html\\#clojure.core/booleans"],
     \["bound-fn", "clojure.core-api.html\\#clojure.core/bound-fn"],
     \["bound-fn*", "clojure.core-api.html\\#clojure.core/bound-fn*"],
+    \["bound?", "clojure.core-api.html\\#clojure.core/bound?"],
     \["butlast", "clojure.core-api.html\\#clojure.core/butlast"],
     \["byte", "clojure.core-api.html\\#clojure.core/byte"],
     \["byte-array", "clojure.core-api.html\\#clojure.core/byte-array"],
     \["bytes", "clojure.core-api.html\\#clojure.core/bytes"],
+    \["case", "clojure.core-api.html\\#clojure.core/case"],
     \["cast", "clojure.core-api.html\\#clojure.core/cast"],
     \["char", "clojure.core-api.html\\#clojure.core/char"],
     \["char-array", "clojure.core-api.html\\#clojure.core/char-array"],
     \["create-struct", "clojure.core-api.html\\#clojure.core/create-struct"],
     \["cycle", "clojure.core-api.html\\#clojure.core/cycle"],
     \["dec", "clojure.core-api.html\\#clojure.core/dec"],
+    \["dec'", "clojure.core-api.html\\#clojure.core/dec'"],
     \["decimal?", "clojure.core-api.html\\#clojure.core/decimal?"],
     \["declare", "clojure.core-api.html\\#clojure.core/declare"],
     \["definline", "clojure.core-api.html\\#clojure.core/definline"],
     \["defn", "clojure.core-api.html\\#clojure.core/defn"],
     \["defn-", "clojure.core-api.html\\#clojure.core/defn-"],
     \["defonce", "clojure.core-api.html\\#clojure.core/defonce"],
+    \["defprotocol", "clojure.core-api.html\\#clojure.core/defprotocol"],
+    \["defrecord", "clojure.core-api.html\\#clojure.core/defrecord"],
     \["defstruct", "clojure.core-api.html\\#clojure.core/defstruct"],
+    \["deftype", "clojure.core-api.html\\#clojure.core/deftype"],
     \["delay", "clojure.core-api.html\\#clojure.core/delay"],
     \["delay?", "clojure.core-api.html\\#clojure.core/delay?"],
     \["deliver", "clojure.core-api.html\\#clojure.core/deliver"],
+    \["denominator", "clojure.core-api.html\\#clojure.core/denominator"],
     \["deref", "clojure.core-api.html\\#clojure.core/deref"],
     \["derive", "clojure.core-api.html\\#clojure.core/derive"],
     \["descendants", "clojure.core-api.html\\#clojure.core/descendants"],
     \["distinct", "clojure.core-api.html\\#clojure.core/distinct"],
     \["distinct?", "clojure.core-api.html\\#clojure.core/distinct?"],
     \["doall", "clojure.core-api.html\\#clojure.core/doall"],
-    \["doc", "clojure.core-api.html\\#clojure.core/doc"],
     \["dorun", "clojure.core-api.html\\#clojure.core/dorun"],
     \["doseq", "clojure.core-api.html\\#clojure.core/doseq"],
     \["dosync", "clojure.core-api.html\\#clojure.core/dosync"],
     \["empty?", "clojure.core-api.html\\#clojure.core/empty?"],
     \["ensure", "clojure.core-api.html\\#clojure.core/ensure"],
     \["enumeration-seq", "clojure.core-api.html\\#clojure.core/enumeration-seq"],
+    \["error-handler", "clojure.core-api.html\\#clojure.core/error-handler"],
+    \["error-mode", "clojure.core-api.html\\#clojure.core/error-mode"],
     \["eval", "clojure.core-api.html\\#clojure.core/eval"],
     \["even?", "clojure.core-api.html\\#clojure.core/even?"],
+    \["every-pred", "clojure.core-api.html\\#clojure.core/every-pred"],
     \["every?", "clojure.core-api.html\\#clojure.core/every?"],
+    \["extend", "clojure.core-api.html\\#clojure.core/extend"],
+    \["extend-protocol", "clojure.core-api.html\\#clojure.core/extend-protocol"],
+    \["extend-type", "clojure.core-api.html\\#clojure.core/extend-type"],
+    \["extenders", "clojure.core-api.html\\#clojure.core/extenders"],
+    \["extends?", "clojure.core-api.html\\#clojure.core/extends?"],
     \["false?", "clojure.core-api.html\\#clojure.core/false?"],
     \["ffirst", "clojure.core-api.html\\#clojure.core/ffirst"],
     \["file-seq", "clojure.core-api.html\\#clojure.core/file-seq"],
     \["filter", "clojure.core-api.html\\#clojure.core/filter"],
     \["find", "clojure.core-api.html\\#clojure.core/find"],
-    \["find-doc", "clojure.core-api.html\\#clojure.core/find-doc"],
+    \["find-keyword", "clojure.core-api.html\\#clojure.core/find-keyword"],
     \["find-ns", "clojure.core-api.html\\#clojure.core/find-ns"],
     \["find-var", "clojure.core-api.html\\#clojure.core/find-var"],
     \["first", "clojure.core-api.html\\#clojure.core/first"],
+    \["flatten", "clojure.core-api.html\\#clojure.core/flatten"],
     \["float", "clojure.core-api.html\\#clojure.core/float"],
     \["float-array", "clojure.core-api.html\\#clojure.core/float-array"],
     \["float?", "clojure.core-api.html\\#clojure.core/float?"],
     \["fn", "clojure.core-api.html\\#clojure.core/fn"],
     \["fn?", "clojure.core-api.html\\#clojure.core/fn?"],
     \["fnext", "clojure.core-api.html\\#clojure.core/fnext"],
+    \["fnil", "clojure.core-api.html\\#clojure.core/fnil"],
     \["for", "clojure.core-api.html\\#clojure.core/for"],
     \["force", "clojure.core-api.html\\#clojure.core/force"],
     \["format", "clojure.core-api.html\\#clojure.core/format"],
+    \["frequencies", "clojure.core-api.html\\#clojure.core/frequencies"],
     \["future", "clojure.core-api.html\\#clojure.core/future"],
     \["future-call", "clojure.core-api.html\\#clojure.core/future-call"],
     \["future-cancel", "clojure.core-api.html\\#clojure.core/future-cancel"],
     \["get-proxy-class", "clojure.core-api.html\\#clojure.core/get-proxy-class"],
     \["get-thread-bindings", "clojure.core-api.html\\#clojure.core/get-thread-bindings"],
     \["get-validator", "clojure.core-api.html\\#clojure.core/get-validator"],
+    \["group-by", "clojure.core-api.html\\#clojure.core/group-by"],
     \["hash", "clojure.core-api.html\\#clojure.core/hash"],
     \["hash-map", "clojure.core-api.html\\#clojure.core/hash-map"],
     \["hash-set", "clojure.core-api.html\\#clojure.core/hash-set"],
     \["import", "clojure.core-api.html\\#clojure.core/import"],
     \["in-ns", "clojure.core-api.html\\#clojure.core/in-ns"],
     \["inc", "clojure.core-api.html\\#clojure.core/inc"],
+    \["inc'", "clojure.core-api.html\\#clojure.core/inc'"],
     \["init-proxy", "clojure.core-api.html\\#clojure.core/init-proxy"],
     \["instance?", "clojure.core-api.html\\#clojure.core/instance?"],
     \["int", "clojure.core-api.html\\#clojure.core/int"],
     \["iterate", "clojure.core-api.html\\#clojure.core/iterate"],
     \["iterator-seq", "clojure.core-api.html\\#clojure.core/iterator-seq"],
     \["juxt", "clojure.core-api.html\\#clojure.core/juxt"],
+    \["keep", "clojure.core-api.html\\#clojure.core/keep"],
+    \["keep-indexed", "clojure.core-api.html\\#clojure.core/keep-indexed"],
     \["key", "clojure.core-api.html\\#clojure.core/key"],
     \["keys", "clojure.core-api.html\\#clojure.core/keys"],
     \["keyword", "clojure.core-api.html\\#clojure.core/keyword"],
     \["make-array", "clojure.core-api.html\\#clojure.core/make-array"],
     \["make-hierarchy", "clojure.core-api.html\\#clojure.core/make-hierarchy"],
     \["map", "clojure.core-api.html\\#clojure.core/map"],
+    \["map-indexed", "clojure.core-api.html\\#clojure.core/map-indexed"],
     \["map?", "clojure.core-api.html\\#clojure.core/map?"],
     \["mapcat", "clojure.core-api.html\\#clojure.core/mapcat"],
     \["max", "clojure.core-api.html\\#clojure.core/max"],
     \["ns-unmap", "clojure.core-api.html\\#clojure.core/ns-unmap"],
     \["nth", "clojure.core-api.html\\#clojure.core/nth"],
     \["nthnext", "clojure.core-api.html\\#clojure.core/nthnext"],
+    \["nthrest", "clojure.core-api.html\\#clojure.core/nthrest"],
     \["num", "clojure.core-api.html\\#clojure.core/num"],
     \["number?", "clojure.core-api.html\\#clojure.core/number?"],
+    \["numerator", "clojure.core-api.html\\#clojure.core/numerator"],
+    \["object-array", "clojure.core-api.html\\#clojure.core/object-array"],
     \["odd?", "clojure.core-api.html\\#clojure.core/odd?"],
     \["or", "clojure.core-api.html\\#clojure.core/or"],
     \["parents", "clojure.core-api.html\\#clojure.core/parents"],
     \["partial", "clojure.core-api.html\\#clojure.core/partial"],
     \["partition", "clojure.core-api.html\\#clojure.core/partition"],
+    \["partition-all", "clojure.core-api.html\\#clojure.core/partition-all"],
+    \["partition-by", "clojure.core-api.html\\#clojure.core/partition-by"],
     \["pcalls", "clojure.core-api.html\\#clojure.core/pcalls"],
     \["peek", "clojure.core-api.html\\#clojure.core/peek"],
     \["persistent!", "clojure.core-api.html\\#clojure.core/persistent!"],
     \["prefer-method", "clojure.core-api.html\\#clojure.core/prefer-method"],
     \["prefers", "clojure.core-api.html\\#clojure.core/prefers"],
     \["print", "clojure.core-api.html\\#clojure.core/print"],
-    \["print-namespace-doc", "clojure.core-api.html\\#clojure.core/print-namespace-doc"],
     \["print-str", "clojure.core-api.html\\#clojure.core/print-str"],
     \["printf", "clojure.core-api.html\\#clojure.core/printf"],
     \["println", "clojure.core-api.html\\#clojure.core/println"],
     \["quot", "clojure.core-api.html\\#clojure.core/quot"],
     \["rand", "clojure.core-api.html\\#clojure.core/rand"],
     \["rand-int", "clojure.core-api.html\\#clojure.core/rand-int"],
+    \["rand-nth", "clojure.core-api.html\\#clojure.core/rand-nth"],
     \["range", "clojure.core-api.html\\#clojure.core/range"],
     \["ratio?", "clojure.core-api.html\\#clojure.core/ratio?"],
+    \["rational?", "clojure.core-api.html\\#clojure.core/rational?"],
     \["rationalize", "clojure.core-api.html\\#clojure.core/rationalize"],
     \["re-find", "clojure.core-api.html\\#clojure.core/re-find"],
     \["re-groups", "clojure.core-api.html\\#clojure.core/re-groups"],
     \["read", "clojure.core-api.html\\#clojure.core/read"],
     \["read-line", "clojure.core-api.html\\#clojure.core/read-line"],
     \["read-string", "clojure.core-api.html\\#clojure.core/read-string"],
+    \["realized?", "clojure.core-api.html\\#clojure.core/realized?"],
     \["reduce", "clojure.core-api.html\\#clojure.core/reduce"],
+    \["reductions", "clojure.core-api.html\\#clojure.core/reductions"],
     \["ref", "clojure.core-api.html\\#clojure.core/ref"],
     \["ref-history-count", "clojure.core-api.html\\#clojure.core/ref-history-count"],
     \["ref-max-history", "clojure.core-api.html\\#clojure.core/ref-max-history"],
     \["ref-set", "clojure.core-api.html\\#clojure.core/ref-set"],
     \["refer", "clojure.core-api.html\\#clojure.core/refer"],
     \["refer-clojure", "clojure.core-api.html\\#clojure.core/refer-clojure"],
+    \["reify", "clojure.core-api.html\\#clojure.core/reify"],
     \["release-pending-sends", "clojure.core-api.html\\#clojure.core/release-pending-sends"],
     \["rem", "clojure.core-api.html\\#clojure.core/rem"],
     \["remove", "clojure.core-api.html\\#clojure.core/remove"],
+    \["remove-all-methods", "clojure.core-api.html\\#clojure.core/remove-all-methods"],
     \["remove-method", "clojure.core-api.html\\#clojure.core/remove-method"],
     \["remove-ns", "clojure.core-api.html\\#clojure.core/remove-ns"],
     \["remove-watch", "clojure.core-api.html\\#clojure.core/remove-watch"],
     \["reset-meta!", "clojure.core-api.html\\#clojure.core/reset-meta!"],
     \["resolve", "clojure.core-api.html\\#clojure.core/resolve"],
     \["rest", "clojure.core-api.html\\#clojure.core/rest"],
+    \["restart-agent", "clojure.core-api.html\\#clojure.core/restart-agent"],
     \["resultset-seq", "clojure.core-api.html\\#clojure.core/resultset-seq"],
     \["reverse", "clojure.core-api.html\\#clojure.core/reverse"],
     \["reversible?", "clojure.core-api.html\\#clojure.core/reversible?"],
     \["rseq", "clojure.core-api.html\\#clojure.core/rseq"],
     \["rsubseq", "clojure.core-api.html\\#clojure.core/rsubseq"],
+    \["satisfies?", "clojure.core-api.html\\#clojure.core/satisfies?"],
     \["second", "clojure.core-api.html\\#clojure.core/second"],
     \["select-keys", "clojure.core-api.html\\#clojure.core/select-keys"],
     \["send", "clojure.core-api.html\\#clojure.core/send"],
     \["sequence", "clojure.core-api.html\\#clojure.core/sequence"],
     \["sequential?", "clojure.core-api.html\\#clojure.core/sequential?"],
     \["set", "clojure.core-api.html\\#clojure.core/set"],
+    \["set-error-handler!", "clojure.core-api.html\\#clojure.core/set-error-handler!"],
+    \["set-error-mode!", "clojure.core-api.html\\#clojure.core/set-error-mode!"],
     \["set-validator!", "clojure.core-api.html\\#clojure.core/set-validator!"],
     \["set?", "clojure.core-api.html\\#clojure.core/set?"],
     \["short", "clojure.core-api.html\\#clojure.core/short"],
     \["short-array", "clojure.core-api.html\\#clojure.core/short-array"],
     \["shorts", "clojure.core-api.html\\#clojure.core/shorts"],
+    \["shuffle", "clojure.core-api.html\\#clojure.core/shuffle"],
     \["shutdown-agents", "clojure.core-api.html\\#clojure.core/shutdown-agents"],
     \["slurp", "clojure.core-api.html\\#clojure.core/slurp"],
     \["some", "clojure.core-api.html\\#clojure.core/some"],
+    \["some-fn", "clojure.core-api.html\\#clojure.core/some-fn"],
     \["sort", "clojure.core-api.html\\#clojure.core/sort"],
     \["sort-by", "clojure.core-api.html\\#clojure.core/sort-by"],
     \["sorted-map", "clojure.core-api.html\\#clojure.core/sorted-map"],
     \["sorted-set", "clojure.core-api.html\\#clojure.core/sorted-set"],
     \["sorted-set-by", "clojure.core-api.html\\#clojure.core/sorted-set-by"],
     \["sorted?", "clojure.core-api.html\\#clojure.core/sorted?"],
-    \["special-form-anchor", "clojure.core-api.html\\#clojure.core/special-form-anchor"],
     \["special-symbol?", "clojure.core-api.html\\#clojure.core/special-symbol?"],
+    \["spit", "clojure.core-api.html\\#clojure.core/spit"],
     \["split-at", "clojure.core-api.html\\#clojure.core/split-at"],
     \["split-with", "clojure.core-api.html\\#clojure.core/split-with"],
     \["str", "clojure.core-api.html\\#clojure.core/str"],
-    \["stream?", "clojure.core-api.html\\#clojure.core/stream?"],
     \["string?", "clojure.core-api.html\\#clojure.core/string?"],
     \["struct", "clojure.core-api.html\\#clojure.core/struct"],
     \["struct-map", "clojure.core-api.html\\#clojure.core/struct-map"],
     \["symbol", "clojure.core-api.html\\#clojure.core/symbol"],
     \["symbol?", "clojure.core-api.html\\#clojure.core/symbol?"],
     \["sync", "clojure.core-api.html\\#clojure.core/sync"],
-    \["syntax-symbol-anchor", "clojure.core-api.html\\#clojure.core/syntax-symbol-anchor"],
     \["take", "clojure.core-api.html\\#clojure.core/take"],
     \["take-last", "clojure.core-api.html\\#clojure.core/take-last"],
     \["take-nth", "clojure.core-api.html\\#clojure.core/take-nth"],
     \["take-while", "clojure.core-api.html\\#clojure.core/take-while"],
     \["test", "clojure.core-api.html\\#clojure.core/test"],
     \["the-ns", "clojure.core-api.html\\#clojure.core/the-ns"],
+    \["thread-bound?", "clojure.core-api.html\\#clojure.core/thread-bound?"],
     \["time", "clojure.core-api.html\\#clojure.core/time"],
     \["to-array", "clojure.core-api.html\\#clojure.core/to-array"],
     \["to-array-2d", "clojure.core-api.html\\#clojure.core/to-array-2d"],
     \["true?", "clojure.core-api.html\\#clojure.core/true?"],
     \["type", "clojure.core-api.html\\#clojure.core/type"],
     \["unchecked-add", "clojure.core-api.html\\#clojure.core/unchecked-add"],
+    \["unchecked-add-int", "clojure.core-api.html\\#clojure.core/unchecked-add-int"],
+    \["unchecked-byte", "clojure.core-api.html\\#clojure.core/unchecked-byte"],
+    \["unchecked-char", "clojure.core-api.html\\#clojure.core/unchecked-char"],
     \["unchecked-dec", "clojure.core-api.html\\#clojure.core/unchecked-dec"],
-    \["unchecked-divide", "clojure.core-api.html\\#clojure.core/unchecked-divide"],
+    \["unchecked-dec-int", "clojure.core-api.html\\#clojure.core/unchecked-dec-int"],
+    \["unchecked-divide-int", "clojure.core-api.html\\#clojure.core/unchecked-divide-int"],
+    \["unchecked-double", "clojure.core-api.html\\#clojure.core/unchecked-double"],
+    \["unchecked-float", "clojure.core-api.html\\#clojure.core/unchecked-float"],
     \["unchecked-inc", "clojure.core-api.html\\#clojure.core/unchecked-inc"],
+    \["unchecked-inc-int", "clojure.core-api.html\\#clojure.core/unchecked-inc-int"],
+    \["unchecked-int", "clojure.core-api.html\\#clojure.core/unchecked-int"],
+    \["unchecked-long", "clojure.core-api.html\\#clojure.core/unchecked-long"],
     \["unchecked-multiply", "clojure.core-api.html\\#clojure.core/unchecked-multiply"],
+    \["unchecked-multiply-int", "clojure.core-api.html\\#clojure.core/unchecked-multiply-int"],
     \["unchecked-negate", "clojure.core-api.html\\#clojure.core/unchecked-negate"],
-    \["unchecked-remainder", "clojure.core-api.html\\#clojure.core/unchecked-remainder"],
+    \["unchecked-negate-int", "clojure.core-api.html\\#clojure.core/unchecked-negate-int"],
+    \["unchecked-remainder-int", "clojure.core-api.html\\#clojure.core/unchecked-remainder-int"],
+    \["unchecked-short", "clojure.core-api.html\\#clojure.core/unchecked-short"],
     \["unchecked-subtract", "clojure.core-api.html\\#clojure.core/unchecked-subtract"],
+    \["unchecked-subtract-int", "clojure.core-api.html\\#clojure.core/unchecked-subtract-int"],
     \["underive", "clojure.core-api.html\\#clojure.core/underive"],
     \["update-in", "clojure.core-api.html\\#clojure.core/update-in"],
     \["update-proxy", "clojure.core-api.html\\#clojure.core/update-proxy"],
     \["vary-meta", "clojure.core-api.html\\#clojure.core/vary-meta"],
     \["vec", "clojure.core-api.html\\#clojure.core/vec"],
     \["vector", "clojure.core-api.html\\#clojure.core/vector"],
+    \["vector-of", "clojure.core-api.html\\#clojure.core/vector-of"],
     \["vector?", "clojure.core-api.html\\#clojure.core/vector?"],
     \["when", "clojure.core-api.html\\#clojure.core/when"],
     \["when-first", "clojure.core-api.html\\#clojure.core/when-first"],
     \["with-open", "clojure.core-api.html\\#clojure.core/with-open"],
     \["with-out-str", "clojure.core-api.html\\#clojure.core/with-out-str"],
     \["with-precision", "clojure.core-api.html\\#clojure.core/with-precision"],
+    \["with-redefs", "clojure.core-api.html\\#clojure.core/with-redefs"],
+    \["with-redefs-fn", "clojure.core-api.html\\#clojure.core/with-redefs-fn"],
     \["xml-seq", "clojure.core-api.html\\#clojure.core/xml-seq"],
     \["zero?", "clojure.core-api.html\\#clojure.core/zero?"],
     \["zipmap", "clojure.core-api.html\\#clojure.core/zipmap"],
+    \["Diff", "clojure.data-api.html\\#clojure.data/Diff"],
+    \["EqualityPartition", "clojure.data-api.html\\#clojure.data/EqualityPartition"],
+    \["diff", "clojure.data-api.html\\#clojure.data/diff"],
+    \["diff-similar", "clojure.data-api.html\\#clojure.data/diff-similar"],
+    \["equality-partition", "clojure.data-api.html\\#clojure.data/equality-partition"],
+    \["inspect", "clojure.inspector-api.html\\#clojure.inspector/inspect"],
+    \["inspect-table", "clojure.inspector-api.html\\#clojure.inspector/inspect-table"],
+    \["inspect-tree", "clojure.inspector-api.html\\#clojure.inspector/inspect-tree"],
+    \["browse-url", "clojure.java.browse-api.html\\#clojure.java.browse/browse-url"],
+    \["Coercions", "clojure.java.io-api.html\\#clojure.java.io/Coercions"],
+    \["IOFactory", "clojure.java.io-api.html\\#clojure.java.io/IOFactory"],
+    \["as-file", "clojure.java.io-api.html\\#clojure.java.io/as-file"],
+    \["as-relative-path", "clojure.java.io-api.html\\#clojure.java.io/as-relative-path"],
+    \["as-url", "clojure.java.io-api.html\\#clojure.java.io/as-url"],
+    \["copy", "clojure.java.io-api.html\\#clojure.java.io/copy"],
+    \["delete-file", "clojure.java.io-api.html\\#clojure.java.io/delete-file"],
+    \["file", "clojure.java.io-api.html\\#clojure.java.io/file"],
+    \["input-stream", "clojure.java.io-api.html\\#clojure.java.io/input-stream"],
+    \["make-input-stream", "clojure.java.io-api.html\\#clojure.java.io/make-input-stream"],
+    \["make-output-stream", "clojure.java.io-api.html\\#clojure.java.io/make-output-stream"],
+    \["make-parents", "clojure.java.io-api.html\\#clojure.java.io/make-parents"],
+    \["make-reader", "clojure.java.io-api.html\\#clojure.java.io/make-reader"],
+    \["make-writer", "clojure.java.io-api.html\\#clojure.java.io/make-writer"],
+    \["output-stream", "clojure.java.io-api.html\\#clojure.java.io/output-stream"],
+    \["reader", "clojure.java.io-api.html\\#clojure.java.io/reader"],
+    \["resource", "clojure.java.io-api.html\\#clojure.java.io/resource"],
+    \["writer", "clojure.java.io-api.html\\#clojure.java.io/writer"],
+    \["add-local-javadoc", "clojure.java.javadoc-api.html\\#clojure.java.javadoc/add-local-javadoc"],
+    \["add-remote-javadoc", "clojure.java.javadoc-api.html\\#clojure.java.javadoc/add-remote-javadoc"],
+    \["javadoc", "clojure.java.javadoc-api.html\\#clojure.java.javadoc/javadoc"],
+    \["sh", "clojure.java.shell-api.html\\#clojure.java.shell/sh"],
+    \["with-sh-dir", "clojure.java.shell-api.html\\#clojure.java.shell/with-sh-dir"],
+    \["with-sh-env", "clojure.java.shell-api.html\\#clojure.java.shell/with-sh-env"],
+    \["demunge", "clojure.main-api.html\\#clojure.main/demunge"],
     \["load-script", "clojure.main-api.html\\#clojure.main/load-script"],
     \["main", "clojure.main-api.html\\#clojure.main/main"],
     \["repl", "clojure.main-api.html\\#clojure.main/repl"],
     \["repl-exception", "clojure.main-api.html\\#clojure.main/repl-exception"],
     \["repl-prompt", "clojure.main-api.html\\#clojure.main/repl-prompt"],
     \["repl-read", "clojure.main-api.html\\#clojure.main/repl-read"],
+    \["root-cause", "clojure.main-api.html\\#clojure.main/root-cause"],
     \["skip-if-eol", "clojure.main-api.html\\#clojure.main/skip-if-eol"],
     \["skip-whitespace", "clojure.main-api.html\\#clojure.main/skip-whitespace"],
+    \["stack-element-str", "clojure.main-api.html\\#clojure.main/stack-element-str"],
     \["with-bindings", "clojure.main-api.html\\#clojure.main/with-bindings"],
+    \["*print-base*", "clojure.pprint-api.html\\#clojure.pprint/*print-base*"],
+    \["*print-miser-width*", "clojure.pprint-api.html\\#clojure.pprint/*print-miser-width*"],
+    \["*print-pprint-dispatch*", "clojure.pprint-api.html\\#clojure.pprint/*print-pprint-dispatch*"],
+    \["*print-pretty*", "clojure.pprint-api.html\\#clojure.pprint/*print-pretty*"],
+    \["*print-radix*", "clojure.pprint-api.html\\#clojure.pprint/*print-radix*"],
+    \["*print-right-margin*", "clojure.pprint-api.html\\#clojure.pprint/*print-right-margin*"],
+    \["*print-suppress-namespaces*", "clojure.pprint-api.html\\#clojure.pprint/*print-suppress-namespaces*"],
+    \["cl-format", "clojure.pprint-api.html\\#clojure.pprint/cl-format"],
+    \["formatter", "clojure.pprint-api.html\\#clojure.pprint/formatter"],
+    \["formatter-out", "clojure.pprint-api.html\\#clojure.pprint/formatter-out"],
+    \["fresh-line", "clojure.pprint-api.html\\#clojure.pprint/fresh-line"],
+    \["get-pretty-writer", "clojure.pprint-api.html\\#clojure.pprint/get-pretty-writer"],
+    \["pp", "clojure.pprint-api.html\\#clojure.pprint/pp"],
+    \["pprint", "clojure.pprint-api.html\\#clojure.pprint/pprint"],
+    \["pprint-indent", "clojure.pprint-api.html\\#clojure.pprint/pprint-indent"],
+    \["pprint-logical-block", "clojure.pprint-api.html\\#clojure.pprint/pprint-logical-block"],
+    \["pprint-newline", "clojure.pprint-api.html\\#clojure.pprint/pprint-newline"],
+    \["pprint-tab", "clojure.pprint-api.html\\#clojure.pprint/pprint-tab"],
+    \["print-length-loop", "clojure.pprint-api.html\\#clojure.pprint/print-length-loop"],
+    \["print-table", "clojure.pprint-api.html\\#clojure.pprint/print-table"],
+    \["set-pprint-dispatch", "clojure.pprint-api.html\\#clojure.pprint/set-pprint-dispatch"],
+    \["with-pprint-dispatch", "clojure.pprint-api.html\\#clojure.pprint/with-pprint-dispatch"],
+    \["write", "clojure.pprint-api.html\\#clojure.pprint/write"],
+    \["write-out", "clojure.pprint-api.html\\#clojure.pprint/write-out"],
+    \["TypeReference", "clojure.reflect-api.html\\#clojure.reflect/TypeReference"],
+    \["flag-descriptors", "clojure.reflect-api.html\\#clojure.reflect/flag-descriptors"],
+    \["reflect", "clojure.reflect-api.html\\#clojure.reflect/reflect"],
+    \["resolve-class", "clojure.reflect-api.html\\#clojure.reflect/resolve-class"],
+    \["type-reflect", "clojure.reflect-api.html\\#clojure.reflect/type-reflect"],
+    \["typename", "clojure.reflect-api.html\\#clojure.reflect/typename"],
     \["apropos", "clojure.repl-api.html\\#clojure.repl/apropos"],
+    \["demunge", "clojure.repl-api.html\\#clojure.repl/demunge"],
     \["dir", "clojure.repl-api.html\\#clojure.repl/dir"],
     \["dir-fn", "clojure.repl-api.html\\#clojure.repl/dir-fn"],
+    \["doc", "clojure.repl-api.html\\#clojure.repl/doc"],
+    \["find-doc", "clojure.repl-api.html\\#clojure.repl/find-doc"],
+    \["pst", "clojure.repl-api.html\\#clojure.repl/pst"],
+    \["root-cause", "clojure.repl-api.html\\#clojure.repl/root-cause"],
+    \["set-break-handler!", "clojure.repl-api.html\\#clojure.repl/set-break-handler!"],
     \["source", "clojure.repl-api.html\\#clojure.repl/source"],
     \["source-fn", "clojure.repl-api.html\\#clojure.repl/source-fn"],
+    \["stack-element-str", "clojure.repl-api.html\\#clojure.repl/stack-element-str"],
+    \["thread-stopper", "clojure.repl-api.html\\#clojure.repl/thread-stopper"],
     \["difference", "clojure.set-api.html\\#clojure.set/difference"],
     \["index", "clojure.set-api.html\\#clojure.set/index"],
     \["intersection", "clojure.set-api.html\\#clojure.set/intersection"],
     \["rename", "clojure.set-api.html\\#clojure.set/rename"],
     \["rename-keys", "clojure.set-api.html\\#clojure.set/rename-keys"],
     \["select", "clojure.set-api.html\\#clojure.set/select"],
+    \["subset?", "clojure.set-api.html\\#clojure.set/subset?"],
+    \["superset?", "clojure.set-api.html\\#clojure.set/superset?"],
     \["union", "clojure.set-api.html\\#clojure.set/union"],
+    \["e", "clojure.stacktrace-api.html\\#clojure.stacktrace/e"],
+    \["print-cause-trace", "clojure.stacktrace-api.html\\#clojure.stacktrace/print-cause-trace"],
+    \["print-stack-trace", "clojure.stacktrace-api.html\\#clojure.stacktrace/print-stack-trace"],
+    \["print-throwable", "clojure.stacktrace-api.html\\#clojure.stacktrace/print-throwable"],
+    \["print-trace-element", "clojure.stacktrace-api.html\\#clojure.stacktrace/print-trace-element"],
+    \["root-cause", "clojure.stacktrace-api.html\\#clojure.stacktrace/root-cause"],
+    \["blank?", "clojure.string-api.html\\#clojure.string/blank?"],
+    \["capitalize", "clojure.string-api.html\\#clojure.string/capitalize"],
+    \["escape", "clojure.string-api.html\\#clojure.string/escape"],
+    \["join", "clojure.string-api.html\\#clojure.string/join"],
+    \["lower-case", "clojure.string-api.html\\#clojure.string/lower-case"],
+    \["replace", "clojure.string-api.html\\#clojure.string/replace"],
+    \["replace-first", "clojure.string-api.html\\#clojure.string/replace-first"],
+    \["reverse", "clojure.string-api.html\\#clojure.string/reverse"],
+    \["split", "clojure.string-api.html\\#clojure.string/split"],
+    \["split-lines", "clojure.string-api.html\\#clojure.string/split-lines"],
+    \["trim", "clojure.string-api.html\\#clojure.string/trim"],
+    \["trim-newline", "clojure.string-api.html\\#clojure.string/trim-newline"],
+    \["triml", "clojure.string-api.html\\#clojure.string/triml"],
+    \["trimr", "clojure.string-api.html\\#clojure.string/trimr"],
+    \["upper-case", "clojure.string-api.html\\#clojure.string/upper-case"],
+    \["apply-template", "clojure.template-api.html\\#clojure.template/apply-template"],
+    \["do-template", "clojure.template-api.html\\#clojure.template/do-template"],
+    \["*load-tests*", "clojure.test-api.html\\#clojure.test/*load-tests*"],
+    \["*stack-trace-depth*", "clojure.test-api.html\\#clojure.test/*stack-trace-depth*"],
+    \["are", "clojure.test-api.html\\#clojure.test/are"],
+    \["assert-any", "clojure.test-api.html\\#clojure.test/assert-any"],
+    \["assert-predicate", "clojure.test-api.html\\#clojure.test/assert-predicate"],
+    \["compose-fixtures", "clojure.test-api.html\\#clojure.test/compose-fixtures"],
+    \["deftest", "clojure.test-api.html\\#clojure.test/deftest"],
+    \["deftest-", "clojure.test-api.html\\#clojure.test/deftest-"],
+    \["do-report", "clojure.test-api.html\\#clojure.test/do-report"],
+    \["file-position", "clojure.test-api.html\\#clojure.test/file-position"],
+    \["function?", "clojure.test-api.html\\#clojure.test/function?"],
+    \["get-possibly-unbound-var", "clojure.test-api.html\\#clojure.test/get-possibly-unbound-var"],
+    \["inc-report-counter", "clojure.test-api.html\\#clojure.test/inc-report-counter"],
+    \["is", "clojure.test-api.html\\#clojure.test/is"],
+    \["join-fixtures", "clojure.test-api.html\\#clojure.test/join-fixtures"],
+    \["report", "clojure.test-api.html\\#clojure.test/report"],
+    \["run-all-tests", "clojure.test-api.html\\#clojure.test/run-all-tests"],
+    \["run-tests", "clojure.test-api.html\\#clojure.test/run-tests"],
+    \["set-test", "clojure.test-api.html\\#clojure.test/set-test"],
+    \["successful?", "clojure.test-api.html\\#clojure.test/successful?"],
+    \["test-all-vars", "clojure.test-api.html\\#clojure.test/test-all-vars"],
+    \["test-ns", "clojure.test-api.html\\#clojure.test/test-ns"],
+    \["test-var", "clojure.test-api.html\\#clojure.test/test-var"],
+    \["testing", "clojure.test-api.html\\#clojure.test/testing"],
+    \["testing-contexts-str", "clojure.test-api.html\\#clojure.test/testing-contexts-str"],
+    \["testing-vars-str", "clojure.test-api.html\\#clojure.test/testing-vars-str"],
+    \["try-expr", "clojure.test-api.html\\#clojure.test/try-expr"],
+    \["with-test", "clojure.test-api.html\\#clojure.test/with-test"],
+    \["with-test-out", "clojure.test-api.html\\#clojure.test/with-test-out"],
+    \["clojure.test.junit", "clojure.test-api.html\\#clojure.test.junit"],
+    \["with-junit-output", "clojure.test-api.html\\#clojure.test.junit/with-junit-output"],
+    \["clojure.test.tap", "clojure.test-api.html\\#clojure.test.tap"],
+    \["print-tap-diagnostic", "clojure.test-api.html\\#clojure.test.tap/print-tap-diagnostic"],
+    \["print-tap-fail", "clojure.test-api.html\\#clojure.test.tap/print-tap-fail"],
+    \["print-tap-pass", "clojure.test-api.html\\#clojure.test.tap/print-tap-pass"],
+    \["print-tap-plan", "clojure.test-api.html\\#clojure.test.tap/print-tap-plan"],
+    \["with-tap-output", "clojure.test-api.html\\#clojure.test.tap/with-tap-output"],
+    \["keywordize-keys", "clojure.walk-api.html\\#clojure.walk/keywordize-keys"],
+    \["macroexpand-all", "clojure.walk-api.html\\#clojure.walk/macroexpand-all"],
+    \["postwalk", "clojure.walk-api.html\\#clojure.walk/postwalk"],
+    \["postwalk-demo", "clojure.walk-api.html\\#clojure.walk/postwalk-demo"],
+    \["postwalk-replace", "clojure.walk-api.html\\#clojure.walk/postwalk-replace"],
+    \["prewalk", "clojure.walk-api.html\\#clojure.walk/prewalk"],
+    \["prewalk-demo", "clojure.walk-api.html\\#clojure.walk/prewalk-demo"],
+    \["prewalk-replace", "clojure.walk-api.html\\#clojure.walk/prewalk-replace"],
+    \["stringify-keys", "clojure.walk-api.html\\#clojure.walk/stringify-keys"],
+    \["walk", "clojure.walk-api.html\\#clojure.walk/walk"],
     \["parse", "clojure.xml-api.html\\#clojure.xml/parse"],
     \["append-child", "clojure.zip-api.html\\#clojure.zip/append-child"],
     \["branch?", "clojure.zip-api.html\\#clojure.zip/branch?"],

File ftplugin/slimv.vim

 " slimv.vim:    The Superior Lisp Interaction Mode for VIM
-" Version:      0.9.5
-" Last Change:  07 Mar 2012
+" Version:      0.9.6
+" Last Change:  27 Mar 2012
 " Maintainer:   Tamas Kovacs <kovisoft at gmail dot com>
 " License:      This file is placed in the public domain.
 "               No warranty, express or implied.
 
 " Syntax highlighting for the REPL buffer
 if !exists( 'g:slimv_repl_syntax' )
-    let g:slimv_repl_syntax = 0
+    let g:slimv_repl_syntax = 1
 endif
 
 " Alternative value (in msec) for 'updatetime' while the REPL buffer is changing
 let s:refresh_disabled = 0                                " Set this variable temporarily to avoid recursive REPL rehresh calls
 let s:sldb_level = -1                                     " Are we in the SWANK debugger? -1 == no, else SLDB level
 let s:compiled_file = ''                                  " Name of the compiled file
-let s:au_curhold_set = 0                                  " Whether the autocommand has been set
 let s:current_buf = -1                                    " Swank action was requested from this buffer
 let s:current_win = -1                                    " Swank action was requested from this window
 let s:skip_sc = 'synIDattr(synID(line("."), col("."), 0), "name") =~ "[Ss]tring\\|[Cc]omment"'
     endif
 endfunction
 
+" Switch to the buffer/window that was active before a swank action
+function! SlimvRestoreFocus()
+    let buf = bufnr( "%" )
+    let win = bufwinnr( "%" )
+    if buf != s:current_buf && win != -1
+        " Switch to the caller buffer/window
+        if g:slimv_repl_split
+            if s:current_win == -1
+                let s:current_win = winnr('#')
+            endif
+            if s:current_win > 0 && s:current_win != win
+                execute s:current_win . "wincmd w"
+            endif
+        else
+            execute "buf " . s:current_buf
+        endif
+    endif
+endfunction
+
 " Stop updating the REPL buffer and switch back to caller
 function! SlimvEndUpdateRepl()
     " Keep only the last g:slimv_repl_max_len lines
 " Switch refresh mode on:
 " refresh REPL buffer on frequent Vim events
 function! SlimvRefreshModeOn()
-    if ! s:au_curhold_set
-        let s:au_curhold_set = 1
+    if !exists( 'b:au_curhold_set' )
+        let b:au_curhold_set = 1
         execute "au CursorHold   * :call SlimvTimer()"
         execute "au CursorHoldI  * :call SlimvTimer()"
     endif
 function! SlimvRefreshModeOff()
     execute "au! CursorHold"
     execute "au! CursorHoldI"
-    let s:au_curhold_set = 0
+    unlet b:au_curhold_set
 endfunction
 
 " Called when entering REPL buffer
 function! SlimvReplEnter()
     call SlimvAddReplMenu()
-    execute "au FileChangedRO " . g:slimv_repl_name . " :call SlimvRefreshModeOff()"
+    if !exists( 'b:au_filechanged_set' )
+        let b:au_filechanged_set = 1
+        execute "au FileChangedRO " . g:slimv_repl_name . " :call SlimvRefreshModeOff()"
+    endif
     call SlimvRefreshModeOn()
 endfunction
 
     endif
 endfunction
 
+" Set special syntax rules for the REPL buffer
+function! SlimvSetSyntaxRepl()
+    if SlimvGetFiletype() == 'scheme'
+        syn cluster replListCluster contains=@schemeListCluster,lispList
+    else
+        syn cluster replListCluster contains=@lispListCluster
+    endif
+
+if exists("g:lisp_rainbow") && g:lisp_rainbow != 0
+
+    syn region lispParen0           matchgroup=hlLevel0 start="`\=("  skip="|.\{-}|" end=")"  matchgroup=replPrompt end="^\S\+>"              contains=@replListCluster,lispParen1,replPrompt
+    syn region lispParen1 contained matchgroup=hlLevel1 start="`\=("  skip="|.\{-}|" end=")"  matchgroup=replPrompt end="^\S\+>"me=s-1,re=s-1 contains=@replListCluster,lispParen2
+    syn region lispParen2 contained matchgroup=hlLevel2 start="`\=("  skip="|.\{-}|" end=")"  matchgroup=replPrompt end="^\S\+>"me=s-1,re=s-1 contains=@replListCluster,lispParen3
+    syn region lispParen3 contained matchgroup=hlLevel3 start="`\=("  skip="|.\{-}|" end=")"  matchgroup=replPrompt end="^\S\+>"me=s-1,re=s-1 contains=@replListCluster,lispParen4
+    syn region lispParen4 contained matchgroup=hlLevel4 start="`\=("  skip="|.\{-}|" end=")"  matchgroup=replPrompt end="^\S\+>"me=s-1,re=s-1 contains=@replListCluster,lispParen5
+    syn region lispParen5 contained matchgroup=hlLevel5 start="`\=("  skip="|.\{-}|" end=")"  matchgroup=replPrompt end="^\S\+>"me=s-1,re=s-1 contains=@replListCluster,lispParen6
+    syn region lispParen6 contained matchgroup=hlLevel6 start="`\=("  skip="|.\{-}|" end=")"  matchgroup=replPrompt end="^\S\+>"me=s-1,re=s-1 contains=@replListCluster,lispParen7
+    syn region lispParen7 contained matchgroup=hlLevel7 start="`\=("  skip="|.\{-}|" end=")"  matchgroup=replPrompt end="^\S\+>"me=s-1,re=s-1 contains=@replListCluster,lispParen8
+    syn region lispParen8 contained matchgroup=hlLevel8 start="`\=("  skip="|.\{-}|" end=")"  matchgroup=replPrompt end="^\S\+>"me=s-1,re=s-1 contains=@replListCluster,lispParen9
+    syn region lispParen9 contained matchgroup=hlLevel9 start="`\=("  skip="|.\{-}|" end=")"  matchgroup=replPrompt end="^\S\+>"me=s-1,re=s-1 contains=@replListCluster,lispParen0
+
+ if SlimvGetFiletype() == 'clojure'
+    syn region lispParen0           matchgroup=hlLevel0 start="`\=\[" skip="|.\{-}|" end="\]" matchgroup=replPrompt end="^\S\+>"              contains=@replListCluster,lispParen1,replPrompt
+    syn region lispParen1 contained matchgroup=hlLevel1 start="`\=\[" skip="|.\{-}|" end="\]" matchgroup=replPrompt end="^\S\+>"me=s-1,re=s-1 contains=@replListCluster,lispParen2
+    syn region lispParen2 contained matchgroup=hlLevel2 start="`\=\[" skip="|.\{-}|" end="\]" matchgroup=replPrompt end="^\S\+>"me=s-1,re=s-1 contains=@replListCluster,lispParen3
+    syn region lispParen3 contained matchgroup=hlLevel3 start="`\=\[" skip="|.\{-}|" end="\]" matchgroup=replPrompt end="^\S\+>"me=s-1,re=s-1 contains=@replListCluster,lispParen4
+    syn region lispParen4 contained matchgroup=hlLevel4 start="`\=\[" skip="|.\{-}|" end="\]" matchgroup=replPrompt end="^\S\+>"me=s-1,re=s-1 contains=@replListCluster,lispParen5
+    syn region lispParen5 contained matchgroup=hlLevel5 start="`\=\[" skip="|.\{-}|" end="\]" matchgroup=replPrompt end="^\S\+>"me=s-1,re=s-1 contains=@replListCluster,lispParen6
+    syn region lispParen6 contained matchgroup=hlLevel6 start="`\=\[" skip="|.\{-}|" end="\]" matchgroup=replPrompt end="^\S\+>"me=s-1,re=s-1 contains=@replListCluster,lispParen7
+    syn region lispParen7 contained matchgroup=hlLevel7 start="`\=\[" skip="|.\{-}|" end="\]" matchgroup=replPrompt end="^\S\+>"me=s-1,re=s-1 contains=@replListCluster,lispParen8
+    syn region lispParen8 contained matchgroup=hlLevel8 start="`\=\[" skip="|.\{-}|" end="\]" matchgroup=replPrompt end="^\S\+>"me=s-1,re=s-1 contains=@replListCluster,lispParen9
+    syn region lispParen9 contained matchgroup=hlLevel9 start="`\=\[" skip="|.\{-}|" end="\]" matchgroup=replPrompt end="^\S\+>"me=s-1,re=s-1 contains=@replListCluster,lispParen0
+
+    syn region lispParen0           matchgroup=hlLevel0 start="`\={"  skip="|.\{-}|" end="}"  matchgroup=replPrompt end="^\S\+>"              contains=@replListCluster,lispParen1,replPrompt
+    syn region lispParen1 contained matchgroup=hlLevel1 start="`\={"  skip="|.\{-}|" end="}"  matchgroup=replPrompt end="^\S\+>"me=s-1,re=s-1 contains=@replListCluster,lispParen2
+    syn region lispParen2 contained matchgroup=hlLevel2 start="`\={"  skip="|.\{-}|" end="}"  matchgroup=replPrompt end="^\S\+>"me=s-1,re=s-1 contains=@replListCluster,lispParen3
+    syn region lispParen3 contained matchgroup=hlLevel3 start="`\={"  skip="|.\{-}|" end="}"  matchgroup=replPrompt end="^\S\+>"me=s-1,re=s-1 contains=@replListCluster,lispParen4
+    syn region lispParen4 contained matchgroup=hlLevel4 start="`\={"  skip="|.\{-}|" end="}"  matchgroup=replPrompt end="^\S\+>"me=s-1,re=s-1 contains=@replListCluster,lispParen5
+    syn region lispParen5 contained matchgroup=hlLevel5 start="`\={"  skip="|.\{-}|" end="}"  matchgroup=replPrompt end="^\S\+>"me=s-1,re=s-1 contains=@replListCluster,lispParen6
+    syn region lispParen6 contained matchgroup=hlLevel6 start="`\={"  skip="|.\{-}|" end="}"  matchgroup=replPrompt end="^\S\+>"me=s-1,re=s-1 contains=@replListCluster,lispParen7
+    syn region lispParen7 contained matchgroup=hlLevel7 start="`\={"  skip="|.\{-}|" end="}"  matchgroup=replPrompt end="^\S\+>"me=s-1,re=s-1 contains=@replListCluster,lispParen8
+    syn region lispParen8 contained matchgroup=hlLevel8 start="`\={"  skip="|.\{-}|" end="}"  matchgroup=replPrompt end="^\S\+>"me=s-1,re=s-1 contains=@replListCluster,lispParen9
+    syn region lispParen9 contained matchgroup=hlLevel9 start="`\={"  skip="|.\{-}|" end="}"  matchgroup=replPrompt end="^\S\+>"me=s-1,re=s-1 contains=@replListCluster,lispParen0
+ endif
+
+else
+
+    syn region lispList             matchgroup=Delimiter start="("    skip="|.\{-}|" end=")"  matchgroup=replPrompt end="^\S\+>" contains=@replListCluster
+    syn region lispBQList           matchgroup=PreProc   start="`("   skip="|.\{-}|" end=")"  matchgroup=replPrompt end="^\S\+>" contains=@replListCluster
+
+endif
+
+    syn match   replPrompt /^\S\+>/
+    syn match   replPrompt /^(\S\+)>/
+    hi def link replPrompt Type
+endfunction
+
 " Open a new REPL buffer
 function! SlimvOpenReplBuffer()
     call SlimvOpenBuffer( g:slimv_repl_name )
     call b:SlimvInitRepl()
     call PareditInitBuffer()
-    if !g:slimv_repl_syntax
+    if g:slimv_repl_syntax
+        call SlimvSetSyntaxRepl()
+    else
         set syntax=
     endif
 
     hi SlimvNormal term=none cterm=none gui=none
     hi SlimvCursor term=reverse cterm=reverse gui=reverse
 
-    " Add autocommands specific to the REPL buffer
-    execute "au FileChangedShell " . g:slimv_repl_name . " :call SlimvRefreshReplBuffer()"
-    execute "au FocusGained "      . g:slimv_repl_name . " :call SlimvRefreshReplBuffer()"
-    execute "au BufEnter "         . g:slimv_repl_name . " :call SlimvReplEnter()"
-    execute "au BufLeave "         . g:slimv_repl_name . " :call SlimvReplLeave()"
+    if !exists( 'b:au_bufenter_set' )
+        " Add autocommands specific to the REPL buffer
+        let b:au_bufenter_set = 1
+        execute "au FileChangedShell " . g:slimv_repl_name . " :call SlimvRefreshReplBuffer()"
+        execute "au FocusGained "      . g:slimv_repl_name . " :call SlimvRefreshReplBuffer()"
+        execute "au BufEnter "         . g:slimv_repl_name . " :call SlimvReplEnter()"
+        execute "au BufLeave "         . g:slimv_repl_name . " :call SlimvReplLeave()"
+    endif
 
     call SlimvRefreshReplBuffer()
 endfunction
     " Add keybindings valid only for the SLDB buffer
     noremap  <buffer> <silent>        <CR>   :call SlimvHandleEnterSldb()<CR>
     if g:slimv_keybindings == 1
-        execute 'noremap <buffer> <silent> ' . g:slimv_leader.'a      :call SlimvDebugCommand("swank_invoke_abort")<CR>'
-        execute 'noremap <buffer> <silent> ' . g:slimv_leader.'q      :call SlimvDebugCommand("swank_throw_toplevel")<CR>'
-        execute 'noremap <buffer> <silent> ' . g:slimv_leader.'n      :call SlimvDebugCommand("swank_invoke_continue")<CR>'
+        execute 'noremap <buffer> <silent> ' . g:slimv_leader.'a      :call SlimvDebugAbort()<CR>'
+        execute 'noremap <buffer> <silent> ' . g:slimv_leader.'q      :call SlimvDebugQuit()<CR>'
+        execute 'noremap <buffer> <silent> ' . g:slimv_leader.'n      :call SlimvDebugContinue()<CR>'
     elseif g:slimv_keybindings == 2
-        execute 'noremap <buffer> <silent> ' . g:slimv_leader.'da     :call SlimvDebugCommand("swank_invoke_abort")<CR>'
-        execute 'noremap <buffer> <silent> ' . g:slimv_leader.'dq     :call SlimvDebugCommand("swank_throw_toplevel")<CR>'
-        execute 'noremap <buffer> <silent> ' . g:slimv_leader.'dn     :call SlimvDebugCommand("swank_invoke_continue")<CR>'
+        execute 'noremap <buffer> <silent> ' . g:slimv_leader.'da     :call SlimvDebugAbort()<CR>'
+        execute 'noremap <buffer> <silent> ' . g:slimv_leader.'dq     :call SlimvDebugQuit()<CR>'
+        execute 'noremap <buffer> <silent> ' . g:slimv_leader.'dn     :call SlimvDebugContinue()<CR>'
     endif
 
     " Set folding parameters
     normal! %
 endfunction
 
+" Handle insert mode 'Tab' keypress by doing completion or indentation
+function! SlimvHandleTab()
+    if pumvisible()
+        " Completions menu is active, go to next match
+        return "\<C-N>"
+    endif
+    let c = col('.')
+    if c > 1 && getline('.')[c-2] =~ '\k'
+        " At the end of a keyword, bring up completions
+        return "\<C-X>\<C-O>"
+    endif
+    let indent = SlimvIndent(line('.')) + 1
+    if c < indent && getline('.') !~ '\S\+'
+        " We are left from the autoindent position, do an autoindent
+        return repeat(" ", indent-c)
+    endif
+    " No keyword to complete, no need for autoindent, just enter a <Tab>
+    return "\<Tab>"
+endfunction
+
 " Handle insert mode 'Backspace' keypress in the REPL buffer
 function! SlimvHandleBS()
     if line( "." ) == b:repl_prompt_line && col( "." ) <= b:repl_prompt_col
                 " Display item-th frame
                 call SlimvMakeFold()
                 silent execute 'python swank_frame_locals("' . item . '")'
-                if g:slimv_impl != 'clisp'
-                    " These are not implemented for CLISP
+                if SlimvGetFiletype() != 'scheme' && g:slimv_impl != 'clisp'
+                    " Not implemented for CLISP or scheme
                     silent execute 'python swank_frame_source_loc("' . item . '")'
+                endif
+                if SlimvGetFiletype() == 'lisp' && g:slimv_impl != 'clisp'
+                    " Not implemented for CLISP or other lisp dialects
                     silent execute 'python swank_frame_call("' . item . '")'
                 endif
                 return
 endfunction
 
 " Select a specific restart in debugger
-function! SlimvDebugCommand( cmd )
+function! SlimvDebugCommand( name, cmd )
     if SlimvConnectSwank()
         if s:sldb_level >= 0
             if bufname('%') != g:slimv_sldb_name
                 call SlimvOpenSldbBuffer()
             endif
-            call SlimvQuitSldb()
             call SlimvCommand( 'python ' . a:cmd . '()' )
             call SlimvRefreshReplBuffer()
+            if s:sldb_level < 0
+                " Swank exited the debugger
+                if bufname('%') != g:slimv_sldb_name
+                    call SlimvOpenSldbBuffer()
+                endif
+                call SlimvQuitSldb()
+                call SlimvRestoreFocus()
+            else
+                echomsg 'Debugger re-activated by the SWANK server.'
+            endif
         else
             call SlimvError( "Debugger is not activated." )
         endif
     endif
 endfunction
 
+" Various debugger restarts
+function! SlimvDebugAbort()
+    call SlimvDebugCommand( ":sldb-abort", "swank_invoke_abort" )
+endfunction
+
+function! SlimvDebugQuit()
+    call SlimvDebugCommand( ":throw-to-toplevel", "swank_throw_toplevel" )
+endfunction
+
+function! SlimvDebugContinue()
+    call SlimvDebugCommand( ":sldb-continue", "swank_invoke_continue" )
+endfunction
+
 " List current Lisp threads
 function! SlimvListThreads()
     if SlimvConnectSwank()
     if s:swank_connected
         python swank_disconnect()
         let s:swank_connected = 0
+	" Give swank server some time for disconnecting
+        sleep 500m
     endif 
     call SlimvBeginUpdate()
     if SlimvConnectSwank()
         let lines = [reg . ending]
     endif
     if lines != []
+        if SlimvGetFiletype() == 'scheme'
+            " Swank-scheme requires us to pass a single s-expression
+            " so embed buffer lines in a (begin ...) block
+            let lines = ['(begin'] + lines + [')']
+        endif
         call SlimvEval( lines )
     endif
 endfunction
 " Evaluate the whole buffer
 function! SlimvEvalBuffer()
     let lines = getline( 1, '$' )
+    if SlimvGetFiletype() == 'scheme'
+        " Swank-scheme requires us to pass a single s-expression
+        " so embed buffer lines in a (begin ...) block
+        let lines = ['(begin'] + lines + [')']
+    endif
     call SlimvEval( lines )
 endfunction
 
     " Map space to display function argument list in status line
     inoremap <silent> <buffer> <Space>    <Space><C-R>=SlimvArglist()<CR>
     "noremap  <silent> <buffer> <C-C>      :call SlimvInterrupt()<CR>
-    au InsertLeave * :let &showmode=s:save_showmode
+    if !exists( 'b:au_insertleave_set' )
+        let b:au_insertleave_set = 1
+        au InsertLeave * :let &showmode=s:save_showmode
+    endif
     inoremap <silent> <buffer> <C-X>0     <C-O>:call SlimvCloseForm()<CR>
-    inoremap <silent> <buffer> <Tab>      <C-R>=pumvisible() ? "\<lt>C-N>" : "\<lt>C-X>\<lt>C-O>"<CR>
+    inoremap <silent> <buffer> <Tab>      <C-R>=SlimvHandleTab()<CR>
 
     " Setup balloonexp to display symbol description
     if g:slimv_balloon && has( 'balloon_eval' )
 call s:MenuMap( 'Slim&v.De&bugging.Disassemb&le\.\.\.',         g:slimv_leader.'l',  g:slimv_leader.'dd',  ':call SlimvDisassemble()<CR>' )
 call s:MenuMap( 'Slim&v.De&bugging.&Inspect\.\.\.',             g:slimv_leader.'i',  g:slimv_leader.'di',  ':call SlimvInspect()<CR>' )
 call s:MenuMap( 'Slim&v.De&bugging.-SldbSep-',                  '',                  '',                   ':' )
-call s:MenuMap( 'Slim&v.De&bugging.&Abort',                     g:slimv_leader.'a',  g:slimv_leader.'da',  ':call SlimvDebugCommand("swank_invoke_abort")<CR>' )
-call s:MenuMap( 'Slim&v.De&bugging.&Quit-to-Toplevel',          g:slimv_leader.'q',  g:slimv_leader.'dq',  ':call SlimvDebugCommand("swank_throw_toplevel")<CR>' )
-call s:MenuMap( 'Slim&v.De&bugging.&Continue',                  g:slimv_leader.'n',  g:slimv_leader.'dc',  ':call SlimvDebugCommand("swank_invoke_continue")<CR>' )
+call s:MenuMap( 'Slim&v.De&bugging.&Abort',                     g:slimv_leader.'a',  g:slimv_leader.'da',  ':call SlimvDebugAbort()<CR>' )
+call s:MenuMap( 'Slim&v.De&bugging.&Quit-to-Toplevel',          g:slimv_leader.'q',  g:slimv_leader.'dq',  ':call SlimvDebugQuit()<CR>' )
+call s:MenuMap( 'Slim&v.De&bugging.&Continue',                  g:slimv_leader.'n',  g:slimv_leader.'dc',  ':call SlimvDebugContinue()<CR>' )
 call s:MenuMap( 'Slim&v.De&bugging.-ThreadSep-',                '',                  '',                   ':' )
 call s:MenuMap( 'Slim&v.De&bugging.List-T&hreads',              g:slimv_leader.'H',  g:slimv_leader.'dl',  ':call SlimvListThreads()<CR>' )
 call s:MenuMap( 'Slim&v.De&bugging.&Kill-Thread\.\.\.',         g:slimv_leader.'K',  g:slimv_leader.'dk',  ':call SlimvKillThread()<CR>' )

File ftplugin/swank.py

 #
 # SWANK client for Slimv
 # swank.py:     SWANK client code for slimv.vim plugin
-# Version:      0.9.5
-# Last Change:  07 Mar 2012
+# Version:      0.9.6
+# Last Change:  25 Mar 2012
 # Maintainer:   Tamas Kovacs <kovisoft at gmail dot com>
 # License:      This file is placed in the public domain.
 #               No warranty, express or implied.
 logfile         = 'swank.log'   # Logfile name in case logging is on
 pid             = '0'           # Process id
 current_thread  = '0'
+use_unicode     = True          # Use unicode message length counting
 debug_active    = False         # Swank debugger is active
 debug_activated = False         # Swank debugger was activated
 read_string     = None          # Thread and tag in Swank read string mode
     return 'no source line information'
 
 def unicode_len(text):
-    return len(unicode(text, "utf-8"))
+    if use_unicode:
+        return len(unicode(text, "utf-8"))
+    else:
+        return len(text)
 
 def swank_send(text):
     global sock
 
 def swank_listen():
     global output_port
+    global use_unicode
     global debug_active
     global debug_activated
     global read_string
                                 conn_info = make_keys(params)
                                 pid = conn_info[':pid']
                                 ver = conn_info.get(':version', 'nil')
+                                if len(ver) == 8:
+                                    # Convert version to YYYY-MM-DD format
+                                    ver = ver[0:4] + '-' + ver[4:6] + '-' + ver[6:8]
                                 imp = make_keys( conn_info[':lisp-implementation'] )
                                 pkg = make_keys( conn_info[':package'] )
                                 package = pkg[':name']
                                 prompt = pkg[':prompt']
                                 vim.command('let s:swank_version="' + ver + '"')
+                                if ver >= '2011-11-08':
+                                    # Recent swank servers count bytes instead of unicode characters
+                                    use_unicode = False
                                 vim.command('let s:lisp_version="' + imp[':version'] + '"')
                                 retval = retval + new_line(retval)
                                 retval = retval + imp[':type'] + ' ' + imp[':version'] + '  Port: ' + str(input_port) + '  Pid: ' + pid + '\n; SWANK ' + ver

File plugin/paredit.vim

 " paredit.vim:
 "               Paredit mode for Slimv
-" Version:      0.9.5
-" Last Change:  08 Feb 2012
+" Version:      0.9.6
+" Last Change:  13 Mar 2012
 " Maintainer:   Tamas Kovacs <kovisoft at gmail dot com>
 " License:      This file is placed in the public domain.
 "               No warranty, express or implied.
 
         " Find and keep unbalanced matched characters in the region
         let endingwhitespace = matchstr(putreg, "\\s*$")
-        let matched = s:GetMatchedChars( putreg, s:InsideString( "'<" ), s:InsideComment( "'<" ) )
+        let instring = s:InsideString( line("'<"), col("'<") )
+        if col("'>") > 1 && !s:InsideString( line("'<"), col("'<") - 1 )
+            " We are at the beginning of the string
+            let instring = 0
+        endif
+        let matched = s:GetMatchedChars( putreg, instring, s:InsideComment( line("'<"), col("'<") ) )
         let matched = s:Unbalanced( matched )
         let matched = substitute( matched, '\s', '', 'g' )
         if a:func == 'c'
     let putreg = reg_save
 
     " Find unpaired matched characters by eliminating paired ones
-    let matched = s:GetMatchedChars( putreg, s:InsideString( '.' ), s:InsideComment( '.' ) )
+    let matched = s:GetMatchedChars( putreg, s:InsideString(), s:InsideComment() )
     let matched = s:Unbalanced( matched )
 
     if matched !~ '\S\+'
 endfunction
 
 " Does the current syntax item match the given regular expression?
-function! s:SynIDMatch( regexp, pos, match_eol )
-    let line = line( a:pos )
-    let col  = col ( a:pos )
-    if a:match_eol && col > len( getline( line ) )
+function! s:SynIDMatch( regexp, line, col, match_eol )
+    let col  = a:col
+    if a:match_eol && col > len( getline( a:line ) )
         let col = col - 1
     endif
-    return synIDattr( synID( line, col, 0), 'name' ) =~ a:regexp
+    return synIDattr( synID( a:line, col, 0), 'name' ) =~ a:regexp
 endfunction
 
 " Is the current cursor position inside a comment?
 function! s:InsideComment( ... )
-    return s:SynIDMatch( '[Cc]omment', a:0 ? a:1 : '.', 1 )
+    let l = a:0 ? a:1 : line('.')
+    let c = a:0 ? a:2 : col('.')
+    if &syntax == ''
+        " No help from syntax engine,
+        " remove strings and search for ';' up to the cursor position
+        let line = strpart( getline(l), 0, c - 1 )
+        let line = substitute( line, '\\"', '', 'g' )
+        let line = substitute( line, '"[^"]*"', '', 'g' )
+        return match( line, ';' ) >= 0
+    endif
+    return s:SynIDMatch( '[Cc]omment', l, c, 1 )
 endfunction
 
 " Is the current cursor position inside a string?
 function! s:InsideString( ... )
-    return s:SynIDMatch( '[Ss]tring', a:0 ? a:1 : '.', 0 )
+    let l = a:0 ? a:1 : line('.')
+    let c = a:0 ? a:2 : col('.')
+    if &syntax == ''
+        " No help from syntax engine,
+        " count quote characters up to the cursor position
+        let line = strpart( getline(l), 0, c - 1 )
+        let line = substitute( line, '\\"', '', 'g' )
+        let quotes = substitute( line, '[^"]', '', 'g' )
+        return len(quotes) % 2
+    endif
+    return s:SynIDMatch( '[Ss]tring', l, c, 0 )
 endfunction
 
 " Is this a Slimv REPL buffer?
 au BufNewFile,BufRead *.lisp call PareditInitBuffer()
 au BufNewFile,BufRead *.cl   call PareditInitBuffer()
 au BufNewFile,BufRead *.clj  call PareditInitBuffer()
+au BufNewFile,BufRead *.cljs call PareditInitBuffer()
 au BufNewFile,BufRead *.scm  call PareditInitBuffer()
 au BufNewFile,BufRead *.rkt  call PareditInitBuffer()
 

File slime/ChangeLog

+2012-03-06  Helmut Eller  <heller@common-lisp.net>
+
+	* swank-ccl.lisp: If 'xref is not provided warn about it but
+	continue.
+
+2012-03-06  Helmut Eller  <heller@common-lisp.net>
+
+	Fix SBCL backend for Windows.
+
+	* swank-sbcl.lisp (fd-stream-input-buffer-empty-p): Restore it.
+
+2012-03-06  Helmut Eller  <heller@common-lisp.net>
+
+	* swank.lisp (swank-require): Ensure that provide as called.
+
+2012-02-12  Stas Boukarev  <stassats@gmail.com>
+
+	* swank-ecl.lisp (accept-connection): Use the proper element-type
+	for the stream.
+
+2012-02-12  Stas Boukarev  <stassats@gmail.com>
+
+	* swank-clisp.lisp (c-error): The number of parameters to
+	sys::c-warn was changed, accommodate both versions.
+
+2012-02-07  Martin Simmons <martin@lispworks.com>
+
+	* swank-lispworks.lisp (dspec-file-position): Fall back to regexp
+	search if dspec-stream-position gets an error.
+
+2012-01-06  Helmut Eller  <heller@common-lisp.net>
+
+	Add a "sentinel thread" to protect access to global lists.
+
+	* swank.lisp (start-sentinel, sentinel, send-to-sentinel)
+	(sentinel-serve, sentinel-stop-server, sentinel-maybe-exit): New.
+	(make-connection, close-connection, setup-server, stop-server):
+	Use the sentinel.
+	(close-connection%): Factored out.
+	* swank-backend.lisp (register-thread, find-registered): New.
+	* swank-allegro.lisp: Implement it.
+	* swank-ccl.lisp:
+	* swank-lispworks.lisp:
+	* swank-sbcl.lisp:
+
+2012-01-02  Stas Boukarev  <stassats@gmail.com>
+
+	* swank-loader.lisp (lisp-version-string): Append -no-threads to
+	SBCL without threads.
+
+2011-12-24  Stas Boukarev  <stassats@gmail.com>
+
+	* slime.el (slime-init-command): Don't call
+	`slime-to-lisp-filename', the lisp is not yet connected and if
+	there's another connection it will use the wrong translation.
+
+2011-12-24  Stas Boukarev  <stassats@gmail.com>
+
+	* swank.lisp (throw-to-toplevel): If *sldb-quit-restart* is not
+	found, try to invoke the last restart, which usually is a
+	top-level abort restart. This is useful when the debugger is
+	invoked from a non-slime thread.
+
+2011-12-23  Stas Boukarev  <stassats@gmail.com>
+
+	* slime.el (slime-cycle-connections): Add
+	`slime-cycle-connections-hook', to be used by slime-repl.
+
+2011-12-21  Stas Boukarev  <stassats@gmail.com>
+
+	* swank-sbcl.lisp (input-ready-p): Don't use
+	sb-impl::fd-stream-fd-type if it's not present.
+
+2011-12-12  Stas Boukarev  <stassats@gmail.com>
+
+	* slime.el (slime-compile-region): Run slime-flash-region
+	directly, not from `slime-before-compile-functions', which is run
+	also for C-c C-k.
+
+2011-12-10  Helmut Eller  <heller@common-lisp.net>
+
+	* swank.lisp (auto-flush-loop): Don't use call-with-io-timeout.
+	Removing it had no effect on the number of failed tests.  If you
+	want it back, first create a test case to demonstrate the problem.
+	* swank-backend.lisp: Mention that locks should only be used in
+	swank-gray.lisp.
+
+2011-12-10  Helmut Eller  <heller@common-lisp.net>
+
+	* swank.lisp: Move io-redirection to contrib/swank-repl.lisp.
+
+2011-12-10  Helmut Eller  <heller@common-lisp.net>
+
+	Make *active-threads* a slot of the connection struct.
+
+	* swank.lisp (*active-threads*): Deleted
+	([struct] multithreaded-connection): New slot active-threads.
+	(find-worker-thread, interrupt-worker-thread)
+	(thread-for-evaluation): Update accordingly.
+	(add-active-thread, remove-active-thread): New helpers.
+
+2011-12-10  Helmut Eller  <heller@common-lisp.net>
+
+	* swank-loader.lisp (delete-stale-contrib-fasl-files): New.
+	(compile-contribs): Use it.
+
+2011-12-09  Helmut Eller  <heller@common-lisp.net>
+
+	Create an extra thread for the indentation cache.
+
+	* swank.lisp (indentation-cache-loop): New.
+	([struct] multithreaded-connection): New slot
+	indentation-cache-thread.
+	(control-thread, cleanup-connection-threads): Create/kill it.
+	(send-to-indentation-cache): New function.
+	(update-indentation-information, sync-indentation-to-emacs): Use
+	it.
+	(perform-indentation-update, update-indentation/delta-for-emacs):
+	Add package as argument; that used to be *buffer-package.  Can
+	again be simpler as the indentation-cache-thread doesn't share the
+	cache with others.
+	(handle-indentation-cache-request, symbol-packages): New helpers.
+
+2011-12-07  Helmut Eller  <heller@common-lisp.net>
+
+	* swank.lisp (*slime-interrupts-enabled*): Describe the idea
+	behind the interrupt handling code a bit.
+
+2011-12-07  Helmut Eller  <heller@common-lisp.net>
+
+	Make *event-queue* and *events-enqueued* slots of the connection
+	struct.
+
+	* swank.lisp (*event-queue*, *events-enqueued*): Deleted
+	([struct] singlethreaded-connection): New slots event-queue and
+	events-enqueued.
+	(poll-for-event, send-event, wait-for-event/event-loop): Update
+	accordingly.
+
+2011-12-07  Helmut Eller  <heller@common-lisp.net>
+
+	* slime.el ([xemacs]): Use (find-coding-system 'utf-8-unix)
+	instead of checking the XEmacs version to decide when 'un-define
+	is required.
+
+2011-12-07  Helmut Eller  <heller@common-lisp.net>
+
+	* swank.lisp (send-to-emacs): Add a without-slime-interrupts to
+	protect send/receive from arbitrary interrupts.
+
+2011-12-07  Helmut Eller  <heller@common-lisp.net>
+
+	Move flow control from dispatch-event to send-to-emacs.
+
+	* swank.lisp (*send-counter*): New thread local variable.
+	(with-connection): Bind it.
+	(send-to-emacs): Call maybe-slow-down.
+	(maybe-slow-down, ping-pong): Go through dispatch-event instead of
+	writing to the socket directly.
+	(dispatch-event): Re-add thread arg to :ping/:emacs-pong.
+	Also add a :test-delay event.
+	(perform-indentation-update): Use with-connection to bind
+	*emacs-connection* and *send-counter*.
+	(background-message): Remove reference to connection.slowdown.
+	(flow-control-test): New support code for testing flow-control.
+	([defstruct] connection): Delete send-counter and slowdown slots.
+
+	* slime.el (slime-dispatch-event): Re-add thread arg to
+	:ping/:emacs-pong and :test-delay event.
+	([test] flow-control): New test.
+
+2011-12-07  Helmut Eller  <heller@common-lisp.net>
+
+	* slime.el (slime-update-system-indentation): Moved to
+	contrib/slime-indentation.el.
+
+2011-12-07  Helmut Eller  <heller@common-lisp.net>
+
+	* slime.el (slime-batch-test): Forgot to rename slime-run-one-test
+	to slime-run-test here.
+	(slime-net-connect): Remove coding-system argument.
+	(slime-xref-insert-recompilation-flags): Use insert-char instead
+	of (dotimes (i ..) (insert " " ..)) to avoid the compiler warning.
+	([test] break, slime-forward-sexp): Use _i in dotimes.
+
+2011-12-07  Stas Boukarev  <stassats@gmail.com>
+
+	* doc/.cvsignore: Add html.tgz
+
+2011-12-07  Didier Verna  <didier@xemacs.org>
+
+	* doc/.cvsignore: Add more files generated by Texinfo (.kys, .fns
+	and .vrs).
+
+2011-12-05  Didier Verna  <didier@xemacs.org>
+
+	* slime.el ([xemacs]): Don't require 'un-define in XEmacs 21.5 and
+	later. Mule-UCS is not needed anymore because of internal Unicode
+	support (and conflicts with it).
+
+2011-12-06  Stas Boukarev  <stassats@gmail.com>
+
+	* slime.el (slime-compile-region): Check connection before running
+	hooks, invoking slime-flash-region doesn't make much sense when
+	there's no connection.
+
+2011-12-05  Helmut Eller  <heller@common-lisp.net>
+
+	Move flow control into dispatch-event.
+
+	* swank.lisp (maybe-slow-down, ping-pong): New functions.
+	(dispatch-event): Use it. Also require connection argument.
+	Update callers accordingly.
+	([defstruct] connection): New slots: send-counter and slowdown.
+	* slime.el (slime-dispatch-event): Drop thread from
+	:ping/:emacs-ping messages.
+
+	Use subclasses of connection.  Wasn't neccessary for flow control
+	but seems like a good idea for the future.
+
+	* swank.lisp (multithreaded-connection)
+	(singlethreaded-connection): New
+	(make-connection): Create multi/single threaded variant depending
+	on style argument.
+	([defstruct] serve-requests, cleanup): Delete slots.  Dispatch on
+	connection type instead.
+	(stop-serving-requests): New.
+	(close-connection): Use it.  Can't use
+	*use-dedicated-output-stream* here.
+
+	* swank.lisp (background-message): Do nothing if
+	connection.slowdown is set.
+
+2011-12-05  Helmut Eller  <heller@common-lisp.net>
+
+	* slime.el ([test] arglist): swank::create-server now has an
+	optional argument.  Use swank::compute-backtrace instead.
+
+2011-12-05  Stas Boukarev  <stassats@gmail.com>
+
+	* start-swank.lisp: Remove :coding-system argument.
+
+2011-12-04  Helmut Eller  <heller@common-lisp.net>
+
+	* swank.lisp (interrupt-worker-thread): Don't use find-repl-thread
+	as fallback.
+
+2011-12-04  Helmut Eller  <heller@common-lisp.net>
+
+	* swank.lisp: Minor cleanups.
+	* swank-rpc.lisp:
+
+2011-12-04  Helmut Eller  <heller@common-lisp.net>
+
+	* swank.lisp (create-repl): Moved to contrib/swank-repl.lisp.
+	(*use-dedicated-output-stream*, *dedicated-output-stream-port*
+	(*dedicated-output-stream-buffering*, open-streams)
+	(make-output-function, send-user-output)
+	(make-output-function-for-target, make-output-stream-for-target)
+	(open-dedicated-output-stream, find-repl-thread)
+	(spawn-repl-thread, repl-loop, initialize-streams-for-connection)
+	(read-user-input-from-emacs,  *listener-eval-function*)
+	(listener-eval, *send-repl-results-function*, repl-eval)
+	(clear-repl-variables, track-package, send-repl-results-to-emacs)
+	(redirect-trace-output);
+	* swank-loader.lisp (*contribs*): Add swank-repl.
+
+2011-12-04  Helmut Eller  <heller@common-lisp.net>
+
+	* swank-loader.lisp (*contribs*): Add swank-mrepl.
+
+2011-12-04  Helmut Eller  <heller@common-lisp.net>
+
+	* swank-rpc.lisp (read-chunk): Signal end-of-file we had no input.
+
+2011-12-03  Nikodemus Siivola  <nikodemus@random-state.net>
+
+	* swank-sbcl.lisp (wait-for-input): Another go at this. Rip out POLL,
+	build on top of just INPUT-READY-P.
+	(input-ready-p): Outside Windows, use SYSREAD-MAY-BLOCK-P to check.
+
+2011-12-03  G�bor Melis  <mega@retes.hu>
+
+	* swank-allegro.lisp (set-default-initial-binding): In 9.0 alpha,
+	*CL-DEFAULT-SPECIAL-BINDINGS* is [soon to be] deprecated.  It's
+	otherwise the same EXCL:*REQUIRED-TOP-LEVEL-BINDINGS* (i.e. no
+	change in behavior).
+
+2011-12-03  Helmut Eller  <heller@common-lisp.net>
+
+	* swank-clisp.lisp (wait-for-input): Add a version for windows.
+
+2011-12-02  Stas Boukarev  <stassats@gmail.com>
+
+	* swank-sbcl.lisp (wait-for-input): Define only if
+	#+os-provides-poll or #+win32.
+
+2011-12-02  Helmut Eller  <heller@common-lisp.net>
+
+	* swank.lisp (listener-channel): Moved to contrib/swank-mrepl.lisp
+	(create-listener, initial-listener-bindings, spawn-listener-thread).
+
+2011-12-01  Helmut Eller  <heller@common-lisp.net>
+
+	* swank-sbcl.lisp (wait-for-input): Call poll(2).
+	* swank-backend.lisp (wait-for-streams, wait-for-one-stream):
+	Deleted. Wouldn't work on binary streams.
+
+2011-12-01  Helmut Eller  <heller@common-lisp.net>
+
+	* swank-loader.lisp (*contribs*): Add swank-util.
+
+2011-12-01  Helmut Eller  <heller@common-lisp.net>
+
+	* swank-cmucl.lisp (method-location): Special case accessors.
+
+2011-11-29  Helmut Eller  <heller@common-lisp.net>
+
+	* swank.lisp (do-symbols*, classify-symbol)
+	(symbol-classification-string): Moved to contrib/swank-util.lisp.
+
+2011-11-29  Helmut Eller  <heller@common-lisp.net>
+
+	* swank.lisp (to-line): Increase default limit to 512.
+	(frame-locals-for-emacs): Let *print-right-margin* override
+	default line width.
+
+2011-11-27  Helmut Eller  <heller@common-lisp.net>
+
+	* swank.lisp (create-server): Add a :backlog argument.
+	(setup-server): Pass it along.
+
+	* swank-backend.lisp (create-socket): Backlog argument.
+	* swank-abcl.lisp: Implement it.
+	* swank-allegro.lisp:
+	* swank-ccl.lisp:
+	* swank-clisp.lisp:
+	* swank-cmucl.lisp:
+	* swank-corman.lisp:
+	* swank-ecl.lisp:
+	* swank-lispworks.lisp:
+	* swank-sbcl.lisp:
+	* swank-scl.lisp:
+
+2011-11-27  Helmut Eller  <heller@common-lisp.net>
+
+	* swank-cmucl.lisp (make-socket-io-stream): Create character
+	stream if external-format is non-nil.
+
+2011-11-27  Helmut Eller  <heller@common-lisp.net>
+
+	* swank.lisp (create-server): Remove coding-system argument.
+	([defstruct] connection): Remove coding-system slot.
+	(connection.external-format, *coding-system*): Deleted.
+	(make-connection, start-server, create-server, setup-server)
+	(accept-connections): Drop coding-system arg.
+
+	(connection-info): Return supported coding systems.
+	(create-repl, open-dedicated-output-stream)
+	(open-streams, initialize-streams-for-connection): Add
+	coding-system arg.
+
+	* slime.el (slime-init-command): Ignore the coding-system arg.
+	(slime-connection-coding-systems): New connection variable.
+	(slime-set-connection-info): Set it.
+
+2011-11-27  Helmut Eller  <heller@common-lisp.net>
+
+	* swank.lisp (eval-in-frame-aux): Don't bind *package* during
+	eval.
+
+2011-11-21  Helmut Eller  <heller@common-lisp.net>
+
+	* swank-cmucl.lisp: Trigger compilation of utf8 stuff before first
+	real use.
+
+2011-11-21  Helmut Eller  <heller@common-lisp.net>
+
+	* swank.lisp (*sldb-printer-bindings*): Removed.  Rather useless
+	since the change from 2009-02-26.  It could at best have some
+	influence on the way conditions are printed.  *sldb-string-length*
+	and *sldb-bitvector-length* where both nil so
+	*sldb-pprint-dispatch-table* was also not used by default.  In
+	summary, spending 3 pages for something that's not used by default
+	was pretty silly.  One variable less where we can get the defaults
+	wrong.
+
+2011-11-21  Helmut Eller  <heller@common-lisp.net>
+
+	* slime.el (sldb-eval-in-frame): Try to figure the package out.
+	Ask Lisp if the function for frame was defined in a particular
+	package and use it to read the form.
+	(sldb-read-form-for-frame): New helper.
+
+	* swank-backend (frame-package): New.
+	* swank-cmucl (frame-package): Implement it.
+
+	* swank.lisp (frame-package-name, eval-in-frame-aux): New.
+	(eval-string-in-frame, pprint-eval-string-in-frame): Use package
+	argument.
+
+2011-11-19  Nikodemus Siivola  <nikodemus@random-state.net>
+
+	* swank-sbcl.lisp (restart-frame): Make it possible to restart
+	frames of anonymous functions -- at least some of the time.
+
+2011-11-16  Stas Boukarev  <stassats@gmail.com>
+
+	* swank.lisp (open-dedicated-output-stream): Open a stream with
+	the right coding system.
+	Change (:open-dedicated-output-stream port) message to
+	(:open-dedicated-output-stream port coding-system), because Emacs
+	can no longer determine the coding system based on the main
+	network streams since they are binary now.
+
+2011-11-11  Anton Kovalenko  <anton@sw4me.com>
+
+	* slime.el (slime-ed): add bytep argument to destructure-case.
+	When it's true, position is interpreted as byte offset.
+
+2011-11-08  Helmut Eller  <heller@common-lisp.net>
+
+	Restore old header format.
+
+	* swank-rpc.lisp (parse-header, write-header)
+	* slime.el (slime-net-decode-length, slime-net-encode-length)
+
+2011-11-06  Helmut Eller  <heller@common-lisp.net>
+
+	* swank-ecl.lisp (accept-connection): Fix buffering arg.
+	* swank-cmucl.lisp (accept-connection): Fix buffering arg.
+
+2011-11-06  Helmut Eller  <heller@common-lisp.net>
+
+	* slime.el (slime-run-test): Renamed from slime-run-one-test.
+	(slime-toggle-test-debug-on-error): New.
+	([test] break): Longer timeouts.
+
+2011-11-06  Helmut Eller  <heller@common-lisp.net>
+
+	Add portable versions for string-to-utf8 and utf8-to-string.
+
+	* swank-backend.lisp (default-string-to-utf8)
+	(default-utf8-to-string): New.
+	(string-to-utf8, utf8-to-string): Use default implementations.
+
+	* swank-lispworks.lisp (make-flexi-stream): Restored.
+	(utf8-stream): Deleted.  The utf8 stuff is now used for the
+	default implementation of utf8-to-string and would cause name
+	clashes.
+
+2011-11-06  Helmut Eller  <heller@common-lisp.net>
+
+	* swank-allegro.lisp (swank-compile-string): For reader errors
+	return nil not (values nil nil t).
+
+2011-11-06  Helmut Eller  <heller@common-lisp.net>
+
+	New wire format.
+
+	Switch from character streams to binary streams.  Counting
+	characters was error prone because some Lisps use utf-16
+	internally and so READ-SEQUENCE can't be used easily.
+
+	The new format looks so:
+
+	  | byte0 | 3 bytes length |
+	  |    ... payload ...     |
+
+	The playload is an s-exp encoded as UTF-8 string.  byte0 is
+	currently always 0; other values are reserved for future use.
+
+	* swank-rpc.lisp (write-message): Use new format.
+	(write-header, parse-header, asciify, encoding-error): New.
+
+	* swank.lisp (accept-connections): Create a binary stream.
+	(input-available-p): Can't read-char-no-hang on binary streams.
+
+	* slime.el (slime-net-connect): Use binary as coding system.
+	(slime-net-send, slime-net-read, slime-net-decode-length)
+	(slime-net-encode-length, slime-net-have-input-p): Use new format.
+	(slime-unibyte-string, slime-handle-net-read-error): New.
+	(featurep): Require 'un-define for XEmacs.
+
+	* swank-sbcl.lisp (input-ready-p): Use sb-sys:wait-until-fd-usable.
+
+2011-11-06  Helmut Eller  <heller@common-lisp.net>
+
+	* swank.lisp (close-connection): Fix thinko.
+
+2011-11-06  Helmut Eller  <heller@common-lisp.net>
+
+	* swank-backend.lisp (accept-connection): Improve docstring.  In
+	particular say that we want a binary stream if the EXTERNAL-FORMAT
+	argument is nil.
+
+	* swank-abcl.lisp (accept-connection): Make it so.
+	* swank-clisp.lisp (accept-connection): Make it so.
+	* swank-cmucl.lisp (accept-connection): Make it so.
+	* swank-lispworks.lisp (accept-connection): Make it so.
+	* swank-sbcl.lisp (accept-connection): Make it so.
+	* swank-scl.lisp (accept-connection): Make it so.
+
+2011-11-06  Helmut Eller  <heller@common-lisp.net>
+
+	* swank-backend.lisp (utf8-to-string, string-to-utf8): New.
+
+	* swank-sbcl.lisp (string-to-utf8, string-to-utf8): Implemented	.
+	* swank-lispworks.lisp (string-to-utf8, string-to-utf8): Implemented.
+	* swank-cmucl.lisp (string-to-utf8, string-to-utf8): Implemented.
+	* swank-clisp.lisp (string-to-utf8, string-to-utf8): Implemented.
+	* swank-ccl.lisp (string-to-utf8, string-to-utf8): Implemented.
+	* swank-allegro.lisp (string-to-utf8, string-to-utf8): Implemented.
+	* swank-abcl.lisp (string-to-utf8, string-to-utf8): Implemented.
+	(octets-to-jbytes, jbytes-to-octets): New helpers.
+
+2011-11-03  Helmut Eller  <heller@common-lisp.net>
+
+	* swank.lisp (close-connection): Be more careful with non-ascii.
+
+2011-11-03  Helmut Eller  <heller@common-lisp.net>
+
+	Remove dependecy on FLEXI-STREAMS for Lispworks.
+
+	* swank-lispworks.lisp (make-flexi-stream): Deleted.
+	(utf8-stream): New class to do the transcoding.
+	(accept-connection): Use it.
+
+2011-10-19  Andrew Myers <asm198@gmail.com>
+
+	* swank-allegro.lisp (frob-allegro-field-def): Add missing type to
+	ecase for inspector.
+
+2011-10-13  Helmut Eller  <heller@common-lisp.net>
+
+	* swank.lisp (all-completions): Remove mixed case syms e.g |Foo|.
+	"fo" is not a prefix of "|Foo|" and it would be problematic later.
+
+2011-10-05  Stas Boukarev  <stassats@gmail.com>
+
+	* swank.lisp (clear-repl-variables): New functions, clears *, /,
+	and + variables.
+
+2011-09-28  Stas Boukarev  <stassats@gmail.com>
+
+	* slime.el: Remove (require 'hideshow), it's not used anymore.
+	Spotted by Leo Liu.
+
+2011-09-27  Mark Evenson  <evenson@panix.com>
+
+	* swank-abcl.lisp (describe-symbol-for-emacs): Differentiate
+	between function, generic function, special forms, and macros by
+	copying SBCL implementation.
+
+2011-09-13  Christophe Rhodes  <csr21@cantab.net>
+
+	* slime.el (slime-simple-complete-symbol): only display "Complete
+	but not unique" message if the partial completion figures in the
+	completion list.
+
+2011-08-31  Anton Kovalenko  <anton@sw4me.com>
+
+	* swank-sbcl.lisp (preferred-communication-style): check for
+	:sb-thread before :win32, so :spawn is preferred for threaded
+	Windows builds.
+
+2011-08-31  Nikodemus Siivola  <nikodemus@random-state.net>
+
+	* swank-sbcl.lisp (make-socket-io-stream): Backwards compatibility with
+	SBCL < 1.0.42.43 -- and bugfix.
+
+2011-08-26  Mark Evenson  <evenson@panix.com>
+
+	* swank-abcl.lisp (class-slots): Use exported symbol allowing
+	classes with non-standard metaobjects to be inspected.
+
+2011-08-18  Helmut Eller  <heller@common-lisp.net>
+
+	Fix line numbers for compiler notes if is narrowing was in effect.
+
+	* slime.el (slime-canonicalized-location): Widen before calling
+	line-number-at-pos.
+
+2011-08-17  Stas Boukarev  <stassats@gmail.com>
+
+	* swank-allegro.lisp (with-redirected-y-or-n-p): Fix modern-mode
+	issues.
+	Patch by Andrew Myers.
+
+2011-08-09  Nikodemus Siivola  <nikodemus@random-state.net>
+
+	* swank-sbcl.lisp (make-socket-io-stream): Use :SERVE-EVENTS T when
+	using :FD-HANDLER as the communication style. SBCL will soon stop
+	serving events by default on socket streams.
+
+2011-08-08  Helmut Eller  <heller@common-lisp.net>
+
+	* slime.el (slime-unintern-symbol): New command.
+	* swank.lisp (unintern-symbol): Lisp-side implementation.
+
+2011-07-03  Nikodemus Siivola  <nikodemus@random-state.net>
+
+	* swank-sbcl.lisp (debug-var-info): New function: calls
+	SB-DI::DEBUG-VAR-INFO when available.
+	(frame-locals, frame-var-value): Treat more-context and more-count
+	vars specially.
+
+2011-06-21  Nikodemus Siivola  <nikodemus@random-state.net>
+
+	* swank.lisp (*indentation-cache-lock*): Deleted.
+	(perform-indentation-update): Spawn a new thread to handle the
+	indentation update when using threads. Move cache-clearing to
+	UPDATE-INDENTATION/DELTA-FOR-EMACS. Replace the old cache by
+	the one returned from U-I/D-F-E.
+	(update-indentation/delta-for-emacs): When clearing the cache,
+	allocate a new table. When threads are being used, copy the
+	cache before mutation, to ensure that caches possibly seen by other
+	threads are write-only by then.
+
+2011-06-18  Nikodemus Siivola  <nikodemus@random-state.net>
+
+	* swank.lisp (*indentation-cache-lock*): New variable:
+	hash-table updates aren't necessarily thread-safe.
+	(perform-indentation-update, update-indentation/delta-for-emacs):
+	Grab the lock when necessary -- in delta-for-emacs we hold on to
+	it a bit longer than necessary, but the code is easier to read
+	this way.
+
+2011-06-16  Nikodemus Siivola  <nikodemus@random-state.net>
+
+	* swank.lisp (macro-indentation): Restore the old simple version.
+
+	* swank-sbcl.lisp (compiling-from-buffer-p): PROBE-FILE to
+	handle cases there the tmp-directory is a symlink.
+	(compiling-from-file-p): Ditto.
+
+2011-06-14  Nikodemus Siivola  <nikodemus@random-state.net>
+
+	* swank-backend.lisp (call-with-io-timeout): New DEFINTERFACE.
+	* swank-sbcl.lisp (call-with-io-timeout): DEFIMPLEMENTATION for it.
+	* swank.lisp (auto-flush-loop): Call FINISH-OUTPUT using
+	CALL-WITH-IO-TIMEOUT to prevent deadlocks.
+
+	* swank.lisp (macro-indentation): Fix handling of lambda-list
+	keywords other than &rest and &body.
+
+	* slime.el (slime-update-system-indentation): Remove stale specs
+	from common-lisp-system-indentation when new one arrives.
+
+2011-06-10  Nikodemus Siivola  <nikodemus@random-state.net>
+
+	* swank.lisp (macro-indentation): Walk the lambda-list
+	to construct a better indentation spec instead of just
+	looking for &BODY.
+
+2011-06-09  Nikodemus Siivola  <nikodemus@random-state.net>
+
+	* swank-sbcl.lisp (execv): Stupid SBCL hackers breaking backwards
+	compatibility again: SB-POSIX:SYSCALL-ERROR has a required
+	argument in 1.0.49, but accepts no arguments in older ones. Use
+	plain ERROR instead.
+
+	Support for per-package derived indentation, when
+	slime-indentation is used.
+
+	* swank.lisp (update-indentation/delta-for-emacs): Tell Emacs
+	which packages the symbol is available in. Unless
+	slime-indentation is used, this information is just dropped on the
+	floor.
+
+	* slime.el (slime-update-system-indentation): New function. Use
+	this to inform indentation about derived specs when
+	`common-lisp-system-indentation' is bound.
+	(slime-handle-indentation-update): Adjust to support per-package
+	derived indentation specs when slime-indentation is available.
+
+2011-05-27  Helmut Eller  <heller@common-lisp.net>
+
+	Fix "wrong number of args" problem with slime-inspector-quit.
+	Reported by Anton Kovalenko.
+
+	* slime.el (slime-popup-buffer-quit-function)
+	(slime-quit-threads-buffer): Drop the kill-buffer-p argument.
+
+2011-05-24  Helmut Eller  <heller@common-lisp.net>
+
+	* slime.el (destructure-case): Fix "`_' not left unused" warnings.
+	Insert an (ignore) form for empty bodies; this inhibts the
+	compiler transformation that leads to the spurios warning.  This
+	has no runtime cost in compiled code, since the compiler
+	recognizes (ignore) and emits no code for it.
+	(slime-flatten-tree): Deleted. No longer used.
+
+2011-05-23  Stas Boukarev  <stassats@gmail.com>
+
+	* swank.lisp (sdlb-print-condition): New (or old new)
+	function. It was bound by P in sldb-mode, but for some reason it
+	was lost.
+
+2011-05-23  Helmut Eller  <heller@common-lisp.net>
+
+	* slime.el (slime-apropos-label-properties): Deleted.  Just
+	auto-load apropos-mode.
+	(slime-print-apropos): Use the variable apropos-label-face
+	which seems to exist in all relevant Emacsen.
+
+2011-05-22  Helmut Eller  <heller@common-lisp.net>
+
+	Turn on lexical-binding for slime.el.
+	This mostly involves prefixing unused variables
+	with underscores to shut up the compiler, but
+	also some less harmless changes.
+
+	* slime.el (slime-dispatching-connection, slime-current-thread):
+	Add defvars.
+	(slime-connect): called-interactively-p wants 1 arg in Emacs 24
+	but none in Emacs 22.  So we can't use it; instead add an extra
+	optional arg and set that to non-nil in the interactive spec.
+	(slime-read-from-minibuffer): Actually use the history arg.
+	(slime-inspector-quit): Drop the unused kill-buffer arg from the
+	lambda-list.
+	(slime-run-tests): Can't specbind slime-repl-history-file without
+	variable declation.  I don't want to declare it here so I just
+	eliminated it and let somebody else fix slime-repl.el.
+
+2011-05-21  Helmut Eller  <heller@common-lisp.net>
+
+	Minor tweaks to avoid some compiler warnings.
+
+	* slime.el (slime-modeline-string, slime-buffer-connection):
+	Declare variables.
+	(slime-flatten-tree): Helper function.
+	(destructure-case): Use it, and make '_ ignorable if
+	it occurs in some pattern.
+	(slime-connect): Avoid obsolete functions:
+	string-to-int -> string-to-number
+	interactive-p -> called-interactively-p
+	(slime-complete-maybe-restore-window-configuration)
+	last-command-char -> last-command-event
+	completion-base-size ->  completion-base-position
+	(slime-xref-mode-map): Use call-interactively
+	when calling the remapped next-line/previous-line commands.
+
+2011-05-09  Nikodemus Siivola  <nikodemus@random-state.net>
+
+	* swank-sbcl.lisp (swank-compile-string): Use :SOURCE-NAMESTRING
+	to provide the name of the actual source file, and
+	:ALLOW-OTHER-KEYS for compatibility with pre-1.0.48.1 versions.
+	This allows SBCL to get uninteresting redefinition muffling right.
+	(*trap-load-time-warnings*): Default to T to make the redefinition
+	notes more visible, especially now that redefinition muffling hides
+	the boring ones.
+
+2011-05-08  Nikodemus Siivola  <nikodemus@random-state.net>
+
+	* slime.el (slime-intern-indentation-spec): New function. Converts
+	strings in an indentation spec to symbols.
+	(slime-handle-indentation-update): Intern the indentation spec
+	using slime-intern-indentation-spec, so that lisp side can pass
+	complex indentation specs.
+	* contrib/swank-indentation.lisp (application-indentation-hint):
+	Downcase symbol names -- any symbol in an indentation spec is
+	pretty much guaranteed to have a lowecase name on the Emacs side.
+
+2011-04-16  Stas Boukarev  <stassats@gmail.com>
+
+	* slime.el (slime-load-failed-fasl): New variable. Accepts `ask',
+	`always', and `never' symbols. Loads or not loads fasls produced by
+	compile-file which returned non-nil failure-p.
+
+2011-04-14  Stas Boukarev  <stassats@gmail.com>
+
+	* swank.lisp (list-threads): Call `use-threads-p' only when
+	*emacs-connection* is non-nil. `use-threads-p' wouldn't work in
+	this case, and there is no need to remove a worker thread from the
+	list if it's not connected.
+	This fixes an issue with calling swank:stop-server when slime
+	isn't connected.
+
 2011-03-13  Stas Boukarev  <stassats@gmail.com>
 
 	* swank.lisp (format-restarts-for-emacs): Add

File slime/contrib/ChangeLog

+2012-03-09  Stas Boukarev  <stassats@gmail.com>
+
+	* swank-motd.lisp,
+	 swank-clipboard.lisp,
+         swank-hyperdoc.lisp: Add provide.
+
+2012-03-08  Stas Boukarev  <stassats@gmail.com>
+
+	* swank-arglists.lisp (print-decoded-arglist): When the source of
+	the arglist is a local definition from FLET, some parts may be
+	represented as ARGLIST-DUMMY, handle them.
+
+2012-03-06  Helmut Eller  <heller@common-lisp.net>
+
+	* swank-kawa.scm (module-method>meth-ref):  Slightly better
+	heuristic for vararg functions.
+
+2012-03-06  Helmut Eller  <heller@common-lisp.net>
+
+	Add missing provide.
+
+	* swank-repl.lisp
+	* swank-util.lisp
+	* swank-mrepl.lisp
+	* swank-snapshot.lisp
+
+2012-03-06  Stas Boukarev  <stassats@gmail.com>
+
+	* slime-package-fu.el (slime-export-save-file): New variable, when
+	set to T saves package.lisp after each modification. Defaults to NIL.
+
+2012-01-06  Helmut Eller  <heller@common-lisp.net>
+
+	* swank-mrepl.lisp (send-prompt): Fix use of OR.
+	Reported by Mark H. David.
+
+2011-12-30  Nikodemus Siivola  <nikodemus@random-state.net>
+
+	* slime-cl-indent.el (common-lisp-looking-at-keyword): New function. Looks
+	past #+foo expressions.
+	(common-lisp-backward-keyword-argument): New function. Semi-aware
+	of #+foo expressions.
+	(common-lisp-indent-function-1):
+	1. Use `common-lisp-indent-parse-state-start'.
+	2. Move #+/- cleavernes outside the cond: it is always a default, and shouldn't
+	trump other indentation logic. Also make it use the column of the first feature
+	expression, not the last.
+	3. Make keyword alignment somewhat feature-expression aware.
+	4. Make heuristics not force remaining forms to be indented at the same line.
+	(common-lisp-indent-test): Leave one leading whitespace on comment lines
+	when messing up indentation.
+
+	* slime-cl-indent-test.txt (tests 77-83): Tests for feature-expression
+	and keyword alignment interaction.
+
+2011-12-24  Stas Boukarev  <stassats@gmail.com>
+
+	* slime-tramp.el (slime-find-filename-translators): Don't signal
+	an error if there's no translators for a hostname, just use 'identity.
+
+2011-12-23  Stas Boukarev  <stassats@gmail.com>
+
+	* slime-repl.el (slime-change-repl-to-default-connection): New
+	function.
+	Changes the current REPL to the REPL of the default connection. If
+	the current buffer is not a REPL, don't do anything.
+	Put it into `slime-cycle-connections-hook', so that when
+	connections are cycled through it will change the currently
+	displayed REPL.
+
+2011-12-10  Helmut Eller  <heller@common-lisp.net>
+
+	Don't call init-global-stream-redirection in *after-init-hook*.
+	*after-init-hook* may be called before the contrib was loaded.
+
+	* swank-repl.lisp (maybe-redirect-global-io): Call
+	init-global-stream-redirection here instead.
+
+2011-12-08  Nikodemus Siivola  <nikodemus@random-state.net>
+
+	* slime-cl-indent.el (lisp-indent-maximum-backtracking)
+	("basic"): Increase default backtracking level to 6, so that at
+	least mildly nested macrolet-lambda lists can be identified as
+	such.
+
+	* slime-cl-indent.el (common-lisp-init-standard-indentation): Fix
+	FLET indentation spec, which caused local function lambda-lists to
+	be indented as part of the body.
+
+	* slime-cl-indent-test.txt (tests 72-76): New tests.
+
+	* slime-cl-indent.el (common-lisp-init-standard-indentation): New function,
+	wraps initialization of the common-lisp-indent-function properties.
+
+2011-12-06  Didier Verna  <didier@xemacs.org>
+
+	* slime-asdf.el (slime-asdf): New custom group.
+	* slime-asdf.el (slime-asdf-collect-notes): Put this variable in.
+
+2011-12-05  Helmut Eller  <heller@common-lisp.net>
+
+	Drop flow control from repl-output-stream.
+	That's now done at a lower level.
+
+	* swank-repl.lisp (make-output-function): Use :write-string directly.
+	(send-user-output, *maximum-pipelined-output-chunks*)