@@ -1173,10 +1173,6 @@ See command `cider-mode'."
1173
1173
(unless (cider-connected-p)
1174
1174
(cider-disable-on-existing-clojure-buffers)))
1175
1175
1176
- ; ; this is horrible, but with async callbacks we can't rely on dynamic scope
1177
- (defvar cider-ido-ns nil )
1178
- (defvar cider-ido-var-callback nil )
1179
-
1180
1176
(defun cider-ido-form (ns )
1181
1177
" Construct a Clojure form for ido read using NS."
1182
1178
`(concat (if (find-ns (symbol , ns ))
@@ -1197,41 +1193,46 @@ See command `cider-mode'."
1197
1193
" Perform up using NS."
1198
1194
(mapconcat 'identity (butlast (split-string ns " \\ ." )) " ." ))
1199
1195
1200
- (defun cider-ido-var-select (selected targets )
1201
- " Peform ido select using SELECTED and TARGETS."
1196
+ (defun cider-ido-var-select (prompt ido-callback cider-ido-ns selected targets )
1197
+ " Peform ido select using SELECTED and TARGETS.
1198
+ If SELECTED is \" ..\" then another selection is made for vars in the parent namespace of
1199
+ CIDER-IDO-NS using PROMPT.
1200
+ If SELECTED is a namespace then another selection is made against that namespace
1201
+ using PROMPT.
1202
+ Once a selecton is made IDO-CALLBACK is called with SELECTED."
1202
1203
; ; TODO: immediate RET gives "" as selected for some reason
1203
1204
; ; this is an OK workaround though
1204
1205
(cond ((equal " " selected)
1205
- (cider-ido-var-select (car targets) targets))
1206
+ (cider-ido-var-select prompt ido-callback cider-ido-ns (car targets) targets))
1206
1207
((equal " /" (substring selected -1 )) ; selected a namespace
1207
- (cider-ido-read-var (substring selected 0 -1 ) cider- ido-var -callback))
1208
+ (cider-ido-read-var prompt (substring selected 0 -1 ) ido-callback))
1208
1209
((equal " .." selected)
1209
- (cider-ido-read-var (cider-ido-up-ns cider-ido-ns) cider- ido-var -callback))
1210
+ (cider-ido-read-var prompt (cider-ido-up-ns cider-ido-ns) ido-callback))
1210
1211
; ; non ido variable selection techniques don't return qualified symbols, so this shouldn't either
1211
- (t (funcall cider- ido-var -callback selected))))
1212
+ (t (funcall ido-callback selected))))
1212
1213
1213
1214
(defun cider-ido-read-sym-handler (label ido-select buffer )
1214
1215
" Create an ido read var handler with IDO-SELECT for BUFFER."
1215
- (let ((ido-select ido-select)
1216
- (label label))
1217
- (nrepl-make-response-handler buffer
1218
- (lambda (buffer value )
1219
- ; ; make sure to eval the callback in the buffer that the symbol was requested from so we get the right namespace
1220
- (with-current-buffer buffer
1221
- (let* ((targets (car (read-from-string value)))
1222
- (selected (ido-completing-read label targets nil t )))
1223
- (funcall ido-select selected targets))))
1224
- nil nil nil )))
1225
-
1226
- (defun cider-ido-read-var (ns ido-callback )
1227
- " Perform ido read var in NS using IDO-CALLBACK."
1228
- ; ; Have to be stateful =(
1229
- (setq cider-ido-ns ns)
1230
- (setq cider-ido-var-callback ido-callback)
1231
- (cider-tooling-eval (prin1-to-string (cider-ido-form cider-ido-ns))
1232
- (cider-ido-read-sym-handler " Var: " 'cider-ido-var-select (current-buffer ))
1216
+ (nrepl-make-response-handler buffer
1217
+ (lambda (buffer value )
1218
+ ; ; make sure to eval the callback in the buffer that the symbol was requested from so we get the right namespace
1219
+ (with-current-buffer buffer
1220
+ (let* ((targets (car (read-from-string value)))
1221
+ (selected (ido-completing-read label targets nil t )))
1222
+ (funcall ido-select selected targets))))
1223
+ nil nil nil ))
1224
+
1225
+ (defun cider-ido-read-sym-form (label form callback )
1226
+ " Eval the FORM and pass the result to the response handler."
1227
+ (cider-tooling-eval form (cider-ido-read-sym-handler label callback (current-buffer ))
1233
1228
nrepl-buffer-ns))
1234
1229
1230
+ (defun cider-ido-read-var (prompt ns ido-callback )
1231
+ " Perform ido read var in NS using IDO-CALLBACK."
1232
+ (cider-ido-read-sym-form prompt (prin1-to-string (cider-ido-form ns))
1233
+ (lambda (selected targets )
1234
+ (cider-ido-var-select prompt ido-callback ns selected targets))))
1235
+
1235
1236
(defun cider-ido-fns-form (ns )
1236
1237
" Construct a Clojure form for reading fns using supplied NS."
1237
1238
(format " (let [fn-pred (fn [[k v]] (and (fn? (.get v))
@@ -1243,20 +1244,17 @@ See command `cider-mode'."
1243
1244
(ns-interns '%s )
1244
1245
(ns-refers '%s )))))) " ns ns))
1245
1246
1246
- (defun cider-ido-fn-callback (f targets )
1247
- (with-current-buffer (cider-current-repl-buffer)
1248
- (cider-repl--replace-input (format " (%s ) " f))
1249
- (goto-char (- (point-max ) 1 ))))
1250
-
1251
1247
(defun cider-load-fn-into-repl-buffer ()
1252
1248
" Browse functions available in current repl buffer using ido.
1253
1249
Once selected, the name of the fn will appear in the repl buffer in parens
1254
1250
ready to call."
1255
1251
(interactive )
1256
- (cider-tooling-eval (cider-ido-fns-form (cider-current-ns))
1257
- (cider-ido-read-sym-handler (format " Fn: %s / " nrepl-buffer-ns)
1258
- 'cider-ido-fn-callback (current-buffer ))
1259
- nrepl-buffer-ns))
1252
+ (cider-ido-read-sym-form (format " Fn: %s / " nrepl-buffer-ns)
1253
+ (cider-ido-fns-form (cider-current-ns))
1254
+ (lambda (f _targets )
1255
+ (with-current-buffer (cider-current-repl-buffer)
1256
+ (cider-repl--replace-input (format " (%s ) " f))
1257
+ (goto-char (- (point-max ) 1 ))))))
1260
1258
1261
1259
(defun cider-read-symbol-name (prompt callback &optional query )
1262
1260
" Either read a symbol name using PROMPT or choose the one at point.
@@ -1266,7 +1264,7 @@ if there is no symbol at point, or if QUERY is non-nil."
1266
1264
(let ((symbol-name (cider-symbol-at-point)))
1267
1265
(cond ((not (or current-prefix-arg query (not symbol-name)))
1268
1266
(funcall callback symbol-name))
1269
- (ido-mode (cider-ido-read-var nrepl-buffer-ns callback))
1267
+ (ido-mode (cider-ido-read-var prompt nrepl-buffer-ns callback))
1270
1268
(t (funcall callback (read-from-minibuffer prompt symbol-name))))))
1271
1269
1272
1270
(defun cider-doc-buffer-for (symbol )
0 commit comments