emacs-scala-mode icon indicating copy to clipboard operation
emacs-scala-mode copied to clipboard

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

Open ag91 opened this issue 7 years ago • 11 comments

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!

ag91 avatar Apr 13 '18 13:04 ag91

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

khayyamsaleem avatar May 23 '18 01:05 khayyamsaleem

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)

hb9 avatar May 31 '18 12:05 hb9

@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?

ag91 avatar Jun 01 '18 14:06 ag91

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.

hb9 avatar Jun 01 '18 15:06 hb9

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?

eikek avatar Jun 15 '18 21:06 eikek

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 :)

ag91 avatar Jun 28 '18 20:06 ag91

@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.

eikek avatar Jun 29 '18 06:06 eikek

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.

ant-t avatar Jul 08 '18 09:07 ant-t

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

ccarlile avatar Dec 12 '18 16:12 ccarlile

@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

eikek avatar Dec 12 '18 23:12 eikek

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.

dmg46664 avatar Jun 03 '19 22:06 dmg46664