зеркало из
				https://github.com/iharh/notes.git
				synced 2025-10-31 05:36:08 +02:00 
			
		
		
		
	
		
			
				
	
	
		
			116 строки
		
	
	
		
			3.8 KiB
		
	
	
	
		
			EmacsLisp
		
	
	
	
	
	
			
		
		
	
	
			116 строки
		
	
	
		
			3.8 KiB
		
	
	
	
		
			EmacsLisp
		
	
	
	
	
	
| ;; (defalias 'sc 'slime-connect)
 | |
| 
 | |
| ;; clojure stuff
 | |
| 
 | |
| (defun clojure-swank ()
 | |
| 	(interactive)
 | |
| 	(let ((root (locate-dominating-file default-directory "project.clj")))
 | |
| 		(when (not root)
 | |
| 			(error "Not in a Leiningen project.")
 | |
| 		)
 | |
| ;		(message (format "root: %s port: %s" root slime-port))
 | |
| 
 | |
| 		;; you can customize slime-port using .dir-locals.el
 | |
| ;		(shell-command (format "cd %s && lein swank %s &" root slime-port) "*lein-swank*")
 | |
| 		(shell-command (format "cd %s && lein swank %s &" "D:\\dev\\Clojure\\prj\\myprj" slime-port) "*clojure-swank*")
 | |
| 
 | |
| 		(set-process-filter (get-buffer-process "*clojure-swank*")
 | |
| 			(lambda (process output)
 | |
| 				(when (string-match "Connection opened on" output)
 | |
| 					(slime-connect "localhost" slime-port)
 | |
| 					(set-process-filter process nil)	
 | |
| 				)
 | |
| 			)
 | |
| 		)
 | |
| 		(message "Starting swank server...")
 | |
| 	)
 | |
| )
 | |
| 
 | |
| 
 | |
| (defun clojure-swank-1 ()
 | |
| 	"Launch swank-clojure from users homedir/.lein/bin"
 | |
| 	(interactive)
 | |
| 	(let ((buffer (get-buffer-create "*clojure-swank*")))
 | |
| 		(flet ((display-buffer (buffer-or-name &optional not-this-window frame) nil))
 | |
| 			(bury-buffer buffer)
 | |
| 			(shell-command "~/.lein/bin/swank-clojure &" buffer)
 | |
| 		)
 | |
| 
 | |
| 		(set-process-filter (get-buffer-process buffer)
 | |
| 			(lambda (process output)
 | |
| 				(with-current-buffer "*clojure-swank*" (insert output))
 | |
| 					(when (string-match "Connection opened on local port +\\([0-9]+\\)" output)
 | |
| 						(slime-connect "localhost" (match-string 1 output))
 | |
| 						(set-process-filter process nil)
 | |
| 					)
 | |
| 			)
 | |
| 		)
 | |
| 		(message "Starting swank server... ")
 | |
| 	)
 | |
| )
 | |
| 
 | |
| 
 | |
| (defun clojure-kill-swank ()
 | |
| 	"Kill swank process started by lein swank."
 | |
| 	(interactive)
 | |
| 	(let ((process (get-buffer-process "*clojure-swank*")))
 | |
| 		(when process
 | |
| 			(ignore-errors (slime-quit-lisp))
 | |
| 			(let ((timeout 10))
 | |
| 				(while (and (> timeout 0) (eql 'run (process-status process)))
 | |
| 					(sit-for 1)
 | |
| 					(decf timeout)
 | |
| 				)
 | |
| 			)
 | |
| 			(ignore-errors (kill-buffer "*clojure-swank*"))
 | |
| 		)
 | |
| 	)
 | |
| )
 | |
| 
 | |
| 
 | |
| 
 | |
| ; (let [x 1] (swank.core/break)) -> slime-fancy
 | |
| 
 | |
| 
 | |
| ; I can easily compile and load with C-c C-k, reload every function with C-M-x and everything that is standard in slime.
 | |
| ; It seems that functions in src/projectname/core.clj can be used directly when they are loaded with C-M-k,
 | |
| ; but not with C-c C-k. However, I find more useful to do the latter most of the times. Moreover, I believe that files outside src do not load directly in user. Besides, I prefer not to. As a consequence I switch namespace in slime.
 | |
| 
 | |
| ;(in-ns 'org.enrico_franchi.paip.simplegrammar.grammar)
 | |
| 
 | |
| ; I believe that this should make clojure.core functions not accessible; however, I have the habit of importing
 | |
| ; the "core" libraries (at least, I did that in common lisp packages, as recommended).
 | |
| ; Consequently my namespace declaration is, for example:
 | |
| 
 | |
| ;(ns org.enrico_franchi.paip.simplegrammar.grammar
 | |
| ;  (:use
 | |
| ;   clojure.core
 | |
| ;   clojure.contrib.combinatorics))
 | |
| 
 | |
| ; And slime is in my namespace, so I can use the functions as I want (user is not modified) and I can also call
 | |
| ; clojure.core and whatever I need.
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| ;(put 'upcase-region 'disabled nil)
 | |
| 	 
 | |
| ;	(add-to-list 'load-path "/home/stephen/opt/clojure/clojure-mode")
 | |
| ;	(require 'clojure-mode)
 | |
| ;	(add-to-list 'load-path "/home/stephen/opt/clojure/swank-clojure")
 | |
| ;	(require 'swank-clojure)
 | |
| ;	(add-hook 'clojure-mode-hook
 | |
| ;	          '(lambda ()
 | |
| ;	             (define-key clojure-mode-map "\C-c\C-e" 'lisp-eval-last-sexp)
 | |
| ;	             (define-key clojure-mode-map "\C-x\C-e" 'lisp-eval-last-sexp)))
 | |
| ;	(eval-after-load "slime"
 | |
| ;	  `(progn
 | |
| ;	     (require 'assoc)
 | |
| ;	     (setq swank-clojure-classpath
 | |
| ;	           (list "/home/stephen/opt/clojure/clojure/clojure.jar"
 | |
| ;	                 "/home/stephen/opt/clojure/clojure-contrib/clojure-contrib.jar"
 | |
| ;	                 "/home/stephen/opt/clojure/swank-clojure/src"))
 | |
| ;	     (aput 'slime-lisp-implementations 'clojure
 | |
| ;	           (list (swank-clojure-cmd) :init 'swank-clojure-init))))
 | 
