Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CIDER gets confused with both a clj and a cljs repl open #2946

Closed
dpsutton opened this issue Dec 12, 2020 · 31 comments · Fixed by #3201
Closed

CIDER gets confused with both a clj and a cljs repl open #2946

dpsutton opened this issue Dec 12, 2020 · 31 comments · Fixed by #3201
Labels
bug high priority Tickets of particular importance

Comments

@dpsutton
Copy link
Contributor

CIDER gets confused when you have both a clj and a cljs repl open. Ideally evaluating code in a cljs file would always use the cljs repl and code evaluated in a clj file would always use the clj file. However, the bug is that CIDER attempts to use only the last repl your point was in. Meaning if your point was in the cljs repl and you attempt to evaluate cljs code, it works. But if point was last in the clj buffer nothing happens.

Repo

.
├── deps.edn
├── shadow-cljs.edn
└── src
    ├── clj.clj
    └── cljs.cljs

deps.edn

{}

shadow-cljs.edn

{:source-paths ["src"]}

src/clj.clj

(ns clj)

(+ 1 1)

src/cljs.cljs

(ns cljs)

(+ 1 1)

Starting the repls

Just cider-jack-in as normal. Then clojurescript, selecting shadow and the browser repl. Then put point in one of the repls and evaluate code in the corresponding source file.

point last in clj repl and evaluating in the clojure file

image

When moving the point into the clojurescript file and doing the inline evaluation, nothing happens.

Suspected cause

This functionality hits cider-interactive-eval which uses (cider-map-repls :auto ...) This calls (cider-repls type ensure)) with type cljs which returns no repls.

image

(sesman-current-session 'CIDER) returns only the clj repl.

The docstring of that function is

"Get the most relevant current session for the SYSTEM. CXT-TYPES is a list of context types to consider."

And that's our problem. There's no way to tell sesman what CIDER thinks is relevant (aka, the cljs repl). We can only ask sesman for what it thinks is relevant, which is the most recently focused buffer.

(defun sesman-current-session (system &optional cxt-types)
  "Get the most relevant current session for the SYSTEM.
CXT-TYPES is a list of context types to consider."
  (or (car (sesman--linked-sessions system 'sort cxt-types))   ;; car returns only the first "most" relevant
      (car (sesman--friendly-sessions system 'sort))))

;; sesman--linked-sessions calls

(defun sesman-current-links (system &optional session-or-name sort cxt-types)
  "Retrieve all active links in current context for SYSTEM and SESSION-OR-NAME.
SESSION-OR-NAME can be either a session or a name of the session. CXT-TYPES is a
list of context types to consider. Returned links are a subset of
`sesman-links-alist' sorted in order of relevance if SORT is non-nil."
  ;; mapcan is a built-in in 26.1; don't want to require cl-lib for one function
  (let ((ses-name (if (listp session-or-name)
                      (car session-or-name)
                    session-or-name)))
    (seq-mapcat
     (lambda (cxt-type)
       (let* ((lfn (sesman--link-lookup-fn system ses-name cxt-type))
              (links (seq-filter (lambda (l)
                                   (and (funcall lfn l)
                                        (sesman-relevant-context-p cxt-type (sesman--lnk-value l))))
                                 sesman-links-alist)))
         (if sort
             (sesman--sort-links system links) ;; the important bit that the repls are sorted as 'sort was passed in
           links)))
     (or cxt-types (sesman-context-types system)))))

;;; and sesman sort is 
(defun sesman--sort-links (system links)
  (seq-sort (lambda (x1 x2)
              (sesman-more-relevant-p system
                                      (gethash (car x1) sesman-sessions-hashmap)
                                      (gethash (car x2) sesman-sessions-hashmap)))
            links))

;; and in CIDER the relevance is determined by
(cl-defmethod sesman-more-relevant-p ((_system (eql CIDER)) session1 session2)
  (sesman-more-recent-p (cdr session1) (cdr session2)))

;;; the most recently focused
(defun sesman-more-recent-p (bufs1 bufs2)
  "Return t if BUFS1 is more recent than BUFS2.
BUFS1 and BUFS2 are either buffers or lists of buffers.  When lists of
buffers, most recent buffers from each list are considered.  To be used
primarily in `sesman-more-relevant-p' methods when session objects are
buffers."
  (let ((bufs1 (if (bufferp bufs1) (list bufs1) bufs1))
        (bufs2 (if (bufferp bufs2) (list bufs2) bufs2)))
    (eq 1 (seq-some (lambda (b)
                      (if (member b bufs1)
                          1
                        (when (member b bufs2)
                          -1)))
                    (buffer-list)))))
@dpsutton
Copy link
Contributor Author

dpsutton commented Dec 12, 2020

so i think this might be quite simple: if in cider-repls we use sesman-current-sessions rather than sesman-current-session (singular) we can do our own prioritization there. Although there's a subtly different shape, maybe a list of name and repl rather than just the repl buffers perhaps.

@bbatsov
Copy link
Member

bbatsov commented Dec 12, 2020

Given all the sesman-related issues in recent years I'm seriously starting to wonder whether it was an improvement over what we had before. 😆 I was under the impression this was working, but it seems that I was mistaken.

Btw, are those two REPLs created separately? It seems to me that this might explain the problem as then you'd have two REPLs with exactly the same project context, which makes it impossible for sesman to decide which is the right REPL as I don't think it takes into account REPL types in the relevance resolution.

I'll try to investigate the issue further. //cc @vspinu

@dpsutton
Copy link
Contributor Author

Yes the repls are created separately. cider-jack-in and then cider-jack-in-clojurescript. Sesman's limitation is that it has a way to sort repls based solely on the repls. One solution would be for the sesman-current-session to take a lambda that itself can filter repls before applying the sort. That would make sense for us to filter the repl type and then take the most recent.

But i think that if we just get them all and do our own sorting on the CIDER side we would be fine.

@bbatsov
Copy link
Member

bbatsov commented Dec 12, 2020

I get the idea, but it's kinda of the opposite of the case for using sesman in the first place - which was that related REPLs should be in the same session. What you describe is basically what CIDER was doing for years without sesman - it just focused on the REPLs. Is there any reason not to want to merge the two REPLs in the same session for you (make them sibling REPLs)?

@dpsutton
Copy link
Contributor Author

When it starts up it asks me to start a sibling repl and i say yes. I honestly don't really understand the implications of that but i believe they are siblings.

@bbatsov
Copy link
Member

bbatsov commented Dec 12, 2020

What do you see when you do M-x sesman-browser?

@dpsutton
Copy link
Contributor Author


 CIDER Sessions:

  1: bugs/multi-repls:localhost:52665
      linked-to: proj(~/projects/clojure/bugs/multi-repls/)  
        objects: *cider-repl %s(clj)*  

  2: bugs/multi-repls:localhost:52670
      linked-to: proj(~/projects/clojure/bugs/multi-repls/)  
        objects: *cider-repl %s(cljs:shadow)*  


@bbatsov
Copy link
Member

bbatsov commented Dec 12, 2020

No sibling REPLs here - I see just two sessions with 1 REPL each. I wonder if there isn't some bug in the code that proposes to attach the new REPL to the existing session...

@bbatsov
Copy link
Member

bbatsov commented Dec 12, 2020

I think I found the problem here #2923

I think you are not starting the "sibling" repl, but a new repl if you press "y". That prompt is quite confusing. "Proceed Y/N?" means create a new server session altogether, not a sibling.

Perhaps you're doing the same thing?

@dpsutton
Copy link
Contributor Author

yeah i guess i am. i always assumed "create a new sibling repl" rather than carry on without doing that. i guess i don't know how to run a clj and a cljs repl in the same project. seems the UX here is not great.

@bbatsov
Copy link
Member

bbatsov commented Dec 12, 2020

Agreed, but at least fixing the UX is easier than anything else we've discussed. Can you confirm this is now working properly for you?

@dpsutton
Copy link
Contributor Author

I observe the same behavior when starting the clj repl and then running sesman-start to create a sibling cljs repl.

@bbatsov
Copy link
Member

bbatsov commented Dec 13, 2020

So you do see the two REPLs in the same session, but still the cljs REPL is never selected, right?

@dakra
Copy link

dakra commented Jan 19, 2021

Is there any workaround for this bug yet?

I have the same setup and problem like @dpsutton i.e. shadow-cljs frontend with tools.deps backend.
jack-in-clj and then jack-in-cljs is kinda working but with the bug described here, that you have to first select/focus the repl before you can evaluate code in a file.

And jack-in-clj followed by a cider-connect-sibling-cljs doesn't work because it says "Clojurescript is not available".
(Even after setting cider-check-cljs-repl-requirements to nil)

@jmckitrick
Copy link
Contributor

@dpsutton I'm interested in this issue as well, and I'd be happy to pair or be mentored to do so.

@pdbrown
Copy link
Contributor

pdbrown commented Jan 27, 2021

Just as another data point, I always start my repls with cider-jack-in-clj&cljs and have never had this problem. Both clj and cljs connections end up in the same session:

 CIDER Sessions:

  1: demo/demo-backend:localhost:38749
      linked-to: proj(~/code/demo/demo-backend/)  
        objects: *cider-repl %s(clj)*  *cider-repl %s(cljs:figwheel-main)*  

@jmckitrick
Copy link
Contributor

Normally, that’s how I’d start my REPLs as well. But at my new job, they have clj tools and shadow started already from the CLI, and I simply need to connect via CIDER. So I use cider-connect-clj followed by cider-connect-cljs and it’s simple to select the correct instance to connect to, and everything runs fine. Except switching between the 2 different types of source code buffers.

@dakra
Copy link

dakra commented Jan 27, 2021

After some trial and error I finally got cider-jack-in-clj&cljs to work :)

I had to

  • add "shadow.cljs.devtools.server.nrepl/middleware" to cider-jack-in-nrepl-middlewares,
  • set cider-default-cljs-repl to custom and then
  • set cider-custom-cljs-repl-init-form to first start the shadow devtools server with
    (do (require '[shadow.cljs.devtools.api :as shadow]) (require '[shadow.cljs.devtools.server :as server]) (server/start!) (shadow/watch :app) (shadow/nrepl-select :app))

@Aleksion
Copy link

Aleksion commented Jan 29, 2021

@dakra any chance you could share an example?
I've been struggling with this for a few days, with no luck.
The example you gave above starts the shadow server, but emacs considers it a 'clj' REPL and fails to attach it to my .cljs files (so I'm stuck with to clj repls).

@dcostaras
Copy link

dcostaras commented Jan 29, 2021

Not sure if it helps anyone but when I'm in a cljc file and CIDER thinks I'm in the other session I usually just call sesman-link-with-buffer and choose the REPL I want to be evaluating in currently. Sometimes you need to do it twice.

But yeah, I'm doing cider-jack-in-clj and then cider-connect-sibling-cljs and I end up with two CIDER sessions.

@dakra
Copy link

dakra commented Jan 29, 2021

@Aleksion what error do you get?

It's correct that it starts 2 clj repls but one is then "converted"
to a shadow-cljs one after executing cider-custom-cljs-repl-init-form.

You need to have shadow-cljs in your classpath too.

E.g. I have the following in my .dir-locals.el:
(I have 3 aliase defined, cljs loads all my cljs dependencies but
you can obviously do all that without aliases)

((nil . ((cider-clojure-cli-global-options . "-A:dev:cljs:reveal")
         (cider-custom-cljs-repl-init-form . "(do (require '[shadow.cljs.devtools.api :as shadow]) (require '[shadow.cljs.devtools.server :as server]) (server/start!) (shadow/watch :app) (shadow/nrepl-select :app))")
         (cider-default-cljs-repl . custom))))

and not forget to have the shadow nrepl middleware in cider-jack-in-nrepl-middlewares

(add-to-list 'cider-jack-in-nrepl-middlewares "shadow.cljs.devtools.server.nrepl/middleware")

Then make sure the variables are correctly set in the buffer
(M-x revert-buffer if needed) and then cider-jack-in-clj&cljs
should work.

Happy to help more if needed.

@Aleksion
Copy link

Could I see your aliases?
I get the following:
Screen Shot 2021-01-29 at 5 06 24 PM

(
 (nil . ((cider-jack-in-nrepl-middlewares . ("shadow.cljs.devtools.server.nrepl/middleware"))
         (cider-preferred-build-tool . clojure-cli)
         (cider-clojure-cli-global-options . "-A:dev:cljs")
          (cider-custom-cljs-repl-init-form . "(do (require '[shadow.cljs.devtools.api :as shadow]) (require '[shadow.cljs.devtools.server :as server]) (server/start!) (shadow/watch :mobile) (shadow/nrepl-select :mobile))")
          (cider-default-cljs-repl . custom))))

It never converts.
I can get it to convert the other repl to a cljs one, but then it's just in "pending"

@Aleksion
Copy link

I wonder if it's due to some of the default settings. (that are appended at the end of the command:

 /usr/local/bin/clojure -A:dev:cljs:inspect/reveal-nrepl-cider -Sdeps '{:deps {nrepl/nrepl {:mvn/version "0.8.3"} cider/piggieback {:mvn/version "0.5.2"} cider/cider-nrepl {:mvn/version "0.25.8"}} :aliases {:cider/nrepl {:main-opts ["-m" "nrepl.cmdline" "--middleware" "[\"shadow.cljs.devtools.server.nrepl/middleware\",\"cider.piggieback/wrap-cljs-repl\"]"]}}}' -M:cider/nrepl

@Aleksion
Copy link

@dakra it does seem to complain about :missing-nrepl-middleware
Am I loading it in the incorrect place?

@dpsutton
Copy link
Contributor Author

the current value of cider-jack-in-nrepl-middlewares is (cider.nrepl/cider-middleware) I'd make sure that you include this in your dir locals:

(nil . ((cider-jack-in-nrepl-middlewares . ("shadow.cljs.devtools.server.nrepl/middleware")) ;; you're removing the cider nrepl middleware here

not sure if this will fix it but it stands out as obviously wrong to me if you intend to use CIDER.

@Aleksion
Copy link

@dpsutton looking at the resulting command, and the documentation for cider-jack-in-repl-middlewares it looks like user variables are applied first, and then the cider middleware is appended afterwards. I might be mistaken though

@dakra
Copy link

dakra commented Jan 29, 2021

@Aleksion Like @dpsutton said, you removed the cider.nrepl/cider-middleware from the variable.

Putting cider-jack-in-nrepl-middlewares in dir-locals is probably
not a good idea anyway because it's marked as "risky" which means
you'll be bugged every time with a question when you load a file in
this project.

Personally I have this in my config:

  ;; Inject shadowcljs nrepl middleware in cider-jack-in when the `:cljs' alias is set
  (defun cider-cli-global-options-contains-cljs? (&rest _)
    (and cider-clojure-cli-global-options
         (s-contains? ":cljs" cider-clojure-cli-global-options)))
         
  (add-to-list 'cider-jack-in-nrepl-middlewares
               '("shadow.cljs.devtools.server.nrepl/middleware" :predicate cider-cli-global-options-contains-cljs?))

which is a bit hacky, but it's enough for me until this issue is fixed.
So always inject the shadow nrepl middleware when I specify the
:cljs alias (which I can specify with dir-locals).

But for you to test, you could simply try
M-: (setq cider-jack-in-nrepl-middlewares '("shadow.cljs.devtools.server.nrepl/middleware" "cider.nrepl/cider-middleware"))

hope this helps

@dpsutton
Copy link
Contributor Author

dpsutton commented Jan 29, 2021

@dpsutton looking at the resulting command, and the documentation for cider-jack-in-repl-middlewares it looks like user variables are applied first, and then the cider middleware is appended afterwards. I might be mistaken though

the middleware you ended up with lacked cider's middleware:

"--middleware" "["shadow.cljs.devtools.server.nrepl/middleware","cider.piggieback/wrap-cljs-repl"]"]}}}'

At my last job i just made some bespoke functions to jack-in or connect.

(when personal/work-machine
    (defmacro work-cider-connection (name&dir port)
      `(defun ,(intern (format "work-jack-in-%s" (symbol-name name&dir))) ()
         ,(format "Jack into project %s and open its base directory." name&dir)
         (interactive)
         (let ((dir ,(format "~/projects/work/proj/src/work/"
                             (symbol-name name&dir))))
           (cider-connect (list :host "local.work.com" :port ,port
                                :project-dir dir)))))

    (work-cider-connection service 7000)
    (work-cider-connection jobs 7001)
    (work-cider-connection alerter 7002)
    (work-cider-connection twilio 7004))

you can adjust as necessary. you could also make something generic that just adds the shadow middleware in a let binding and calls cider-jack-in and call it jack-in-shadow-deps or something. Maybe there could be a ticket filed for that? If :deps? true is found in the shadow-cljs.edn file we can automatically add the shadow middleware.

(defun jack-in-shadow-with-deps ()
  (let ((cider-jack-in-nrepl-middlewares
         (cons "shadow.cljs.devtools.server.nrepl/middleware"
               cider-jack-in-nrepl-middlewares)))
    (cider-jack-in nil)))

@Aleksion
Copy link

Aleksion commented Jan 31, 2021

Thank you for helping me get to the bottom of this!:

It's still throwing the same error though. Here's what I have now:
Screen Shot 2021-01-31 at 5 23 21 PM

And here's the command I see it run:

/usr/local/bin/clojure -M:dev:cljs:inspect/reveal-nrepl-cider -Sdeps '{:deps {nrepl/nrepl {:mvn/version "0.8.3"} cider/piggieback {:mvn/version "0.5.2"} cider/cider-nrepl {:mvn/version "0.25.8"}} :aliases {:cider/nrepl {:main-opts ["-m" "nrepl.cmdline" "--middleware" "[\"shadow.cljs.devtools.server.nrepl/middleware\",\"cider.nrepl/cider-middleware\",\"cider.piggieback/wrap-cljs-repl\"]"]}}}' -M:cider/nrepl

So it seems like it has all it needs in the middlewares?

 "[\"shadow.cljs.devtools.server.nrepl/middleware\",\"cider.nrepl/cider-middleware\",\"cider.piggieback/wrap-cljs-repl\"]"

I'm using Spacemacs. I don't know if that's at all helpful

@codeasone
Copy link

Here's a toy project documenting how I've worked around this issue. It delivers all the REPL focusing and eval-ing support I need, but it's admittedly a little funky, with its idiosyncratic shadow.user helpers to bring up the back-end within the shadow-cljs REPL https://github.com/codeasone/starter-cider-tools-deps-shadow

@lycheese
Copy link
Contributor

lycheese commented May 8, 2022

After getting extremely frustrated with always having to move the caret to the relevant repl and not wanting to manage my cljs deps in deps.edn/project.clj instead of shadow.cljs, I modified cider-repls to just return all sessions linked with the current project instead of just the last one. I realize this breaks having two sessions associated with the same project and only wanting to send commands to one, but I never use that functionality anyway.

Steps to profit:

  1. cider-jack-in-cjl
  2. Select clojure-cli (or whatever else you use for your clj deps)
  3. cider-jack-in-cljs (y at the prompt if it comes up)
  4. Select shadow-cljs (then shadow and your build)
  5. C-x C-e automagically chooses the right repl to send to when in a clj or cljs buffer
First attempt

Relevant code in cider-connection.el:

(defun cider-repls (&optional type ensure)
  "Return cider REPLs of TYPE from the current session.
If TYPE is nil or multi, return all REPLs.  If TYPE is a list of types,
return only REPLs of type contained in the list.  If ENSURE is non-nil,
throw an error if no linked session exists."
  (let ((type (cond
               ((listp type)
                (mapcar #'cider-maybe-intern type))
               ((cider-maybe-intern type))))
        (repls (if ensure (or (flatten-list (mapcar #'cdr (sesman-current-sessions 'CIDER)))
                              (user-error "No linked %s sessions" 'CIDER))
                 (flatten-list (mapcar #'cdr (sesman-current-sessions 'CIDER))))))
    (or (seq-filter (lambda (b)
                      (cider--match-repl-type type b))
                    repls)
        (when ensure
          (cider--no-repls-user-error type)))))

Changes:

                ((listp type)
                 (mapcar #'cider-maybe-intern type))
                ((cider-maybe-intern type))))
-        (repls (cdr (if ensure
-                        (sesman-ensure-session 'CIDER)
-                      (sesman-current-session 'CIDER)))))
+        (repls (if ensure (or (flatten-list (mapcar #'cdr (sesman-current-sessions 'CIDER)))
+                              (user-error "No linked %s sessions" 'CIDER))
+                 (flatten-list (mapcar #'cdr (sesman-current-sessions 'CIDER))))))
     (or (seq-filter (lambda (b)
                       (cider--match-repl-type type b))
                     repls)

Edit: Add a more refined version which allows toggling on a per-project basis.
Edit-2: Autoload the new custom var to get rid of the unsafe var prompt when deferring cider.

Better Version
;;;###autoload
(defcustom cider-combine-sesman-sessions-per-project nil
  "Whether to treat all sesman sessions associated with a project as one session."
  :type 'boolean
  :safe #'booleanp)

(defun cider-repls (&optional type ensure)
  "Return cider REPLs of TYPE from the current session.
If TYPE is nil or multi, return all REPLs.  If TYPE is a list of types,
return only REPLs of type contained in the list.  If ENSURE is non-nil,
throw an error if no linked session exists."
  (let ((type (cond
               ((listp type)
                (mapcar #'cider-maybe-intern type))
               ((cider-maybe-intern type))))
        (repls (if cider-combine-sesman-sessions-per-project
                   (if ensure (or (flatten-list (mapcar #'cdr (sesman-current-sessions 'CIDER)))
                                  (user-error "No linked %s sessions" 'CIDER))
                     (flatten-list (mapcar #'cdr (sesman-current-sessions 'CIDER))))
                 (cdr (if ensure
                          (sesman-ensure-session 'CIDER)
                        (sesman-current-session 'CIDER))))))
    (or (seq-filter (lambda (b)
                      (cider--match-repl-type type b))
                    repls)
        (when ensure
          (cider--no-repls-user-error type)))))

lycheese added a commit to lycheese/cider that referenced this issue May 16, 2022
- Makes cider-repls return the combination of all sesman sessions
  associated with a project
- Adds a custom var for toggling the new functionality

Partially closes clojure-emacs#2946.
lycheese added a commit to lycheese/cider that referenced this issue May 16, 2022
- Makes cider-repls return the combination of all sesman sessions
  associated with a project
- Adds a custom var for toggling the new functionality

Partially closes clojure-emacs#2946.
lycheese added a commit to lycheese/cider that referenced this issue May 16, 2022
- Makes cider-repls return the combination of all sesman sessions
  associated with a project
- Adds a custom var for toggling the new functionality

Partially closes clojure-emacs#2946.
lycheese added a commit to lycheese/cider that referenced this issue May 16, 2022
- Makes cider-repls return the combination of all sesman sessions
  associated with a project
- Adds a custom var for toggling the new functionality

Partially closes clojure-emacs#2946.
lycheese added a commit to lycheese/cider that referenced this issue May 16, 2022
- Makes cider-repls return the combination of all sesman sessions
  associated with a project
- Adds a custom var for toggling the new functionality

Partially closes clojure-emacs#2946.
lycheese added a commit to lycheese/cider that referenced this issue May 16, 2022
- Makes cider-repls return the combination of all sesman sessions
  associated with a project
- Adds a custom var for toggling the new functionality

Partially closes clojure-emacs#2946.
lycheese added a commit to lycheese/cider that referenced this issue May 16, 2022
- Makes cider-repls return the combination of all sesman sessions
  associated with a project
- Adds a custom var for toggling the new functionality

Partially closes clojure-emacs#2946.
lycheese added a commit to lycheese/cider that referenced this issue May 17, 2022
- Makes cider-repls return the combination of all sesman sessions
  associated with a project
- Adds a custom var for toggling the new functionality

Partially closes clojure-emacs#2946.
lycheese added a commit to lycheese/cider that referenced this issue May 18, 2022
- Makes cider-repls return the combination of all sesman sessions
  associated with a project
- Adds a custom var for toggling the new functionality

Partially closes clojure-emacs#2946.
lycheese added a commit to lycheese/cider that referenced this issue May 18, 2022
- Makes cider-repls return the combination of all sesman sessions
  or those sessions with same host associated with a project
- Adds a custom vars for toggling the new functionality

Closes clojure-emacs#2946.
lycheese added a commit to lycheese/cider that referenced this issue May 18, 2022
- Makes cider-repls return the combination of all sesman sessions
  or those sessions with same host associated with a project
- Adds a custom vars for toggling the new functionality

Closes clojure-emacs#2946.
lycheese added a commit to lycheese/cider that referenced this issue May 28, 2022
- Makes cider-repls return the combination of all sesman sessions
  or those sessions with same host associated with a project
- Adds a custom vars for toggling the new functionality

Closes clojure-emacs#2946.
lycheese added a commit to lycheese/cider that referenced this issue May 28, 2022
- Makes cider-repls return the combination of all sesman sessions
  or those sessions with same host associated with a project
- Adds a custom vars for toggling the new functionality

Closes clojure-emacs#2946.
lycheese added a commit to lycheese/cider that referenced this issue May 28, 2022
- Makes cider-repls return the combination of all sesman sessions
  or those sessions with same host associated with a project
- Adds a custom vars for toggling the new functionality

Closes clojure-emacs#2946.
lycheese added a commit to lycheese/cider that referenced this issue May 28, 2022
- Makes cider-repls return the combination of all sesman sessions
  or those sessions with same host associated with a project
- Adds a custom vars for toggling the new functionality

Closes clojure-emacs#2946.
lycheese added a commit to lycheese/cider that referenced this issue May 28, 2022
- Makes cider-repls return the combination of all sesman sessions
  or those sessions with same host associated with a project
- Adds a custom vars for toggling the new functionality

Closes clojure-emacs#2946.
lycheese added a commit to lycheese/cider that referenced this issue May 28, 2022
- Makes cider-repls return the combination of all sesman sessions
  or those sessions with same host associated with a project
- Adds a custom var for toggling the new functionality

Closes clojure-emacs#2946.
bbatsov pushed a commit that referenced this issue May 29, 2022
- Makes cider-repls return the combination of all sesman sessions
  or those sessions with same host associated with a project
- Adds a custom var for toggling the new functionality

Closes #2946.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug high priority Tickets of particular importance
Projects
None yet
Development

Successfully merging a pull request may close this issue.

9 participants