summaryrefslogtreecommitdiff
path: root/vim/bundle/slimv/swank-clojure/swank/swank.clj
diff options
context:
space:
mode:
Diffstat (limited to 'vim/bundle/slimv/swank-clojure/swank/swank.clj')
-rw-r--r--vim/bundle/slimv/swank-clojure/swank/swank.clj92
1 files changed, 92 insertions, 0 deletions
diff --git a/vim/bundle/slimv/swank-clojure/swank/swank.clj b/vim/bundle/slimv/swank-clojure/swank/swank.clj
new file mode 100644
index 0000000..d14e5c0
--- /dev/null
+++ b/vim/bundle/slimv/swank-clojure/swank/swank.clj
@@ -0,0 +1,92 @@
+;;;; swank-clojure.clj --- Swank server for Clojure
+;;;
+;;; Copyright (C) 2008 Jeffrey Chu
+;;;
+;;; This file is licensed under the terms of the GNU General Public
+;;; License as distributed with Emacs (press C-h C-c to view it).
+;;;
+;;; See README file for more information about installation
+;;;
+
+(ns swank.swank
+ (:use [swank.core]
+ [swank.core connection server]
+ [swank.util.concurrent thread]
+ [swank.util.net sockets]
+ [clojure.main :only [repl]])
+ (:require [swank.commands]
+ [swank.commands basic indent completion
+ contrib inspector])
+ (:import [java.lang System]
+ [java.io File])
+ (:gen-class))
+
+(defn ignore-protocol-version [version]
+ (reset! protocol-version version))
+
+(defn- connection-serve [conn]
+ (let [control
+ (dothread-swank
+ (thread-set-name "Swank Control Thread")
+ (try
+ (control-loop conn)
+ (catch Exception e
+ ;; fail silently
+ nil))
+ (close-socket! (conn :socket)))
+ read
+ (dothread-swank
+ (thread-set-name "Read Loop Thread")
+ (try
+ (read-loop conn control)
+ (catch Exception e
+ ;; This could be put somewhere better
+ (.println System/err "exception in read loop")
+ (.printStackTrace e)
+ (.interrupt control)
+ (dosync (alter connections (partial remove #{conn}))))))]
+ (dosync
+ (ref-set (conn :control-thread) control)
+ (ref-set (conn :read-thread) read))))
+
+(defn start-server
+ "Start the server and write the listen port number to
+ PORT-FILE. This is the entry point for Emacs."
+ [port-file & opts]
+ (let [opts (apply hash-map opts)]
+ (setup-server (get opts :port 0)
+ (fn announce-port [port]
+ (announce-port-to-file port-file port)
+ (simple-announce port))
+ connection-serve
+ opts)))
+
+(def #^{:private true} encodings-map
+ {"UTF-8" "utf-8-unix"
+ })
+
+(defn- get-system-encoding []
+ (when-let [enc-name (.name (java.nio.charset.Charset/defaultCharset))]
+ (encodings-map enc-name)))
+
+(defn start-repl
+ "Start the server wrapped in a repl. Use this to embed swank in your code."
+ ([port & opts]
+ (let [stop (atom false)
+ opts (merge {:port (Integer. port)
+ :encoding (or (System/getProperty "swank.encoding")
+ (get-system-encoding)
+ "iso-latin-1-unix")}
+ (apply hash-map opts))]
+ (repl :read (fn [rprompt rexit]
+ (if @stop rexit
+ (do (reset! stop true)
+ `(start-server (-> "java.io.tmpdir"
+ (System/getProperty)
+ (File. "slime-port.txt")
+ (.getCanonicalPath))
+ ~@(apply concat opts)))))
+ :need-prompt (constantly false))))
+ ([] (start-repl 4005)))
+
+(def -main start-repl)