hvesalai / emacs-scala-mode

The definitive scala-mode for emacs
http://ensime.org
GNU General Public License v3.0
362 stars 68 forks source link

How do I run scala code blocks in org-mode? #148

Open ag91 opened 6 years ago

ag91 commented 6 years ago

Thanks for the great software guys. I am a heavy user of org mode and I would like to evaluate scala blocks. Is there an explanation somewhere on how to do it?

I would like to be able to C-c C-c on a block such this:

#+BEGIN_SRC scala :results output
println("hi")
#+END_SRC

And get something like:

#+RESULT:
hi

However if I try, I get Not connected. M-x ensime to connect. Now I understand I need an Ensime session running, but after setting up one for a sample project (build.sbt and running sbt ensimeConfig), it still does not work.

Am I missing something? Is there any tutorial/docs on how to do this?

Ideally I would like to run the previous source block just with the Scala binary, and I would like to have the option to run the great Ensime with something like:

#+BEGIN_SRC scala :ensime-project /someDir :session someSession
import superCoolDependency;

println(superCoolDependency.superCoolPrintout())
#+END_SRC

And using the session to refer to the Ensime connection in future blocks.

Thanks again!

khayyamsaleem commented 6 years ago

You need to run an Ensime session inside the editor. Try M-x ensime

hb9 commented 6 years ago

Dirty workaround that works for me: replace ob-scala.el (located in your elpa-folder/scala-mode) with https://raw.githubusercontent.com/tkf/org-mode/master/lisp/ob-scala.el

You can then use :results output without ensime.

(It will break as soon you update or reinstall scala-mode)

ag91 commented 6 years ago

@hb9 that is helpful indeed! I knew about a previous ob-scala that was actually meeting this use case scenario, but I think the current one should still satisfy it (otherwise why replace it at all?).

@khayyamsaleem I have actually tried and is not working: maybe I am doing something wrong. If it is working for you, could you list the steps you are following?

hb9 commented 6 years ago

I have actually tried and is not working: maybe I am doing something wrong. If it is working for you, could you list the steps you are following?

You need to run M-x ensime in a buffer that is somehow connected to a .ensime config-file. E.g. in a buffer that belongs to a scala-project with a working ensime configuration. Then you need to also set the directory of the org-code-block via :dir your/scala_project/with/ensime_config to that project folder. Those steps are at least working for me. It gives me the output of the scala-repl for that code-block.

I still think that my org-files should not depend on .ensime config-files. I would also appreciate it if the old functionality would be restored.

eikek commented 6 years ago

I also have problems with this new implementation. My scala snippets are not working anymore, because it wants me to start ensime now. Is it now required to have a working and running ensime to execute scala source blocks in org files?

ag91 commented 6 years ago

By the way, I have automated the setup to use org and ensime together. Maybe you could find it useful as well: https://github.com/ag91/EasyOrgEnsime I welcome feedback :)

eikek commented 6 years ago

@ag91 that looks nice, thanks! I now copied the old ob-scala.el to my .emacs dir and load it after org. I'm using ammonite for the scala snippets and can work with dependencies that way. I would still like to not be required having a ensime process running to evaluate some snippets.

ant-t commented 6 years ago

Is there any progress on this? I just need a few throwaway lines in scala as part of a org-mode notebook being passed around.

It seems counterproductive for org-mode to offload their ob-scala.el to a third party which is not tied to their release schedule.

ccarlile commented 5 years ago

@eikek How did you get scala snippets working with ammonite?

eikek commented 5 years ago

@ccarlile I think this is the relevant part in my config:

(setq org-babel-scala-command "amm")
(setq org-babel-scala-wrapper-method "%s")
;; load “old” ob-scala  
(load-file (concat user-emacs-directory "lisp/ob-scala.el"))

The downside is that it only works with stdout output… It could be improved I guess

dmg46664 commented 5 years ago

It's a great pity that this is not accommodated out the box. Orgmode is a big part of the reason I use Emacs, and I end up using other languages (js, python, elisp), specifically not Scala, for org blocks in order to achieve things.