clooj, a lightweight IDE for clojure

978 views
Skip to first unread message

Arthur Edelstein

unread,
Jul 18, 2011, 3:03:13 AM7/18/11
to Clojure
Hi Everyone,

I want to let you know about clooj, a small, simple IDE for clojure
that I have been developing (in clojure). It's packaged as a single
jar file (including clojure 1.2), here:
https://github.com/downloads/arthuredelstein/clooj/clooj-0.1.0-standalone.jar
Just download it and double-click. (I use clooj to develop clojure
code every day at work.)

You can look at the source code here:
https://github.com/arthuredelstein/clooj

clooj runs as a standalone application or you can embed it in other
JVM programs. (See the README, below).

This is an alpha release and I plan to continue further development.
Feedback of all kinds and code contributions are much appreciated! :)

Arthur Edelstein
San Francisco

------

clooj, a lightweight IDE for clojure

--- the application
clooj is a small, simple IDE (integrated development environment) for
the clojure programming language. clooj is written entirely in clojure
and uses a swing-based GUI. It is cross-platform (assuming Java 1.6
has been installed on your operating system), and runs as a standalone
application or as a clojure editor embedded in another java or clojure
application. The standalone version (containing the clojure core) is a
single jar file that can be launched by double-clicking its file icon
or by running
java -jar clooj-XXX-STANDALONE.jar from the command line. To embed in
java, call clooj.core.show().

--- the layout
The clooj window contains three columns. The left-most column is a
tree showing clojure projects and the source files they contain. The
middle column is the source file editor. The right column displays
inputs and outputs of clojure REPLs (read-evaluate-print loops).

--- the source editor
The source code editor offers a few simple things to make writing
clojure code easier:

* A non-traditional bracket-matching feature highlights in gray
those brackets that contain the innermost form you are currently
editing.
* Mismatched or unmatched brackets are highlighted in pink.
* TAB indents, and shift+TAB unindents.
* Automatically comment-out (and un-comment-out) multiple lines.
* When newlines are entered, the next line is automatically
indented.
* Press ctrl-ENTER to send either the nearest root form or the
selected text to the REPL.
* Source files are continuously saved in the background to prevent
accidental loss of your work in the event of a crash.

--- clojure projects
Each clojure project corresponds to a project directory somewhere in
the file system, containing a src directory. Inside the src directory
is the source code hierarchy, composed of directories and .clj files.
Note this directory structure is completely compatible with the lein
and cake clojure build programs and you are encouraged to use one of
these from the command line in conjunction with the clooj editor.
Clicking different source files in the projects tree will
automatically change the source file currently being edited, as well
as switch the REPL to the appropriate namespace.

--- read-evaluate-print loops
The upper part of clooj's REPL display column shows the REPL history
(inputs and outputs) and the lower part is a text area for inputting
forms into REPL. Each project gets its own REPL environment: when a
project is first selected, a new clojure REPL is created behind the
scenes and becomes the REPL in use. By choosing "Restart REPL" you
cause a new REPL to be created for the currently selected project and
the old one to be discarded, if possible. If the project directory
contains directories named "lib" and/or "jars" and there are any jar
files inside, these jars will be included in the classpath whenever
the project REPL is launched. You can subsequently add further jar
files to the classpath by placing them in the "lib" or "jars"
directory and restarting the REPL.

--- more work needed
clooj is a work in progress. Your suggestions, criticisms and code
contributions are appreciated.


Ambrose Bonnaire-Sergeant

unread,
Jul 18, 2011, 3:11:58 AM7/18/11
to clo...@googlegroups.com
This is a first for me, a Clojure IDE that "just works".

Big thumbs up!

Ambrose

finbeu

unread,
Jul 18, 2011, 4:31:40 AM7/18/11
to clo...@googlegroups.com
Arthur hi,

that's cool! Just works out of the box! I will recommend it to everyone that wants to try clojure.

- Finn


Tarantoga

unread,
Jul 18, 2011, 4:39:37 AM7/18/11
to Clojure
Yep, this is great! How about syntax highlighting?

On Jul 18, 10:03 am, Arthur Edelstein <arthuredelst...@gmail.com>
wrote:
> Hi Everyone,
>
> I want to let you know about clooj, a small, simple IDE for clojure
> that I have been developing (in clojure). It's packaged as a single
> jar file (including clojure 1.2), here:https://github.com/downloads/arthuredelstein/clooj/clooj-0.1.0-standa...

Shantanu Kumar

unread,
Jul 18, 2011, 5:31:48 AM7/18/11
to Clojure
This is so cool. Any chance you can use Laurent Petit's Paredit?
https://github.com/laurentpetit/paredit.clj

Any roadmap for features? Syntax highlight, autocomplete etc?

Regards,
Shantanu

On Jul 18, 12:03 pm, Arthur Edelstein <arthuredelst...@gmail.com>
wrote:
> Hi Everyone,
>
> I want to let you know about clooj, a small, simple IDE for clojure
> that I have been developing (in clojure). It's packaged as a single
> jar file (including clojure 1.2), here:https://github.com/downloads/arthuredelstein/clooj/clooj-0.1.0-standa...

Vivek Khurana

unread,
Jul 18, 2011, 6:07:38 AM7/18/11
to clo...@googlegroups.com
On Mon, Jul 18, 2011 at 12:33 PM, Arthur Edelstein
<arthure...@gmail.com> wrote:
> Hi Everyone,
>
> I want to let you know about clooj, a small, simple IDE for clojure
> that I have been developing (in clojure). It's packaged as a single
> jar file (including clojure 1.2), here:
> https://github.com/downloads/arthuredelstein/clooj/clooj-0.1.0-standalone.jar
> Just download it and double-click. (I use clooj to develop clojure
> code every day at work.)
>

where is the +1 button...

regards
Vivek

--
The hidden harmony is better than the obvious!!

Florian Over

unread,
Jul 18, 2011, 6:16:06 AM7/18/11
to clo...@googlegroups.com
Hmm, good idea
but somehow i can't save ...
It always says "Oops" "Unable to save file"
When i'm at home i will give it another try.

Thank you
Florian

2011/7/18 Vivek Khurana <hidden...@gmail.com>

--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clo...@googlegroups.com
Note that posts from new members are moderated - please be patient with your first post.
To unsubscribe from this group, send email to
clojure+u...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en

Lee Spector

unread,
Jul 18, 2011, 6:52:56 AM7/18/11
to clo...@googlegroups.com

I am *very* excited to see this project, which I think could be a great addition to the Clojure world, particularly for newcomers and those of us who teach them.

First critical reactions:

- I put a high premium on auto-indendentation, and clooj seems to get this right when hitting return after typing some code (or in the middle of code) -- this is great and missing in some other Clojure editing environments. A big plus. But if one screws up the indentation I don't see how to say "indent this properly again, in the context of what comes above it." Tab moves it to the right, shift-tab moves it to the left, but is there a way to say "move it to the correct place"? Actually, yes: one can do this by deleting the previous newline and hitting return again, but that's awkward, particularly if you want to go through a block of code and see if the structure is what you thought it was... you'd have to delete and re-enter each newline.

- I just created a new project and I get a user prompt in the REPL pane but I can't type anything into that... so I can't actually try it... I click in there but I don't get a cursor there, and typing does nothing. In case it matters I'm running Mac OS 10.6.8 and java -version says:

java version "1.6.0_26"
Java(TM) SE Runtime Environment (build 1.6.0_26-b03-384-10M3425)
Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02-384, mixed mode)

- How is one supposed to create a new .clj file and add it to the project? I see that you say that some stuff is to be done with lein or cake at the command line... and I guess some stuff like creating new files could be done with other OS-specific tools, and all of this is fine with me, but it's not clear to me what should be done how. I'm not suggesting that any more needs to be done within clooj itself -- just that it should be more clear what should be done where. I think that a "hello world" example that walks one through the process of creating a new project, adding a new, empty src file, adding code to that file, and running the code, would clear this up. Maybe also a second simple example that also adds one library... or something like that.

- It would be nice if all of the basic editor functionality was discoverable via menu items. For example the indentation commands are mentioned in the instructions in the posting to the list, but since they're not in the menus a user may not realize they're there. (These in particular could be under the Source menu, but as a general rule it would be nice if all major features are *somewhere* in the interface.)

- Longer term I agree with Shantanu that things like syntax highlighting and autocompletion would be great, and actually I'd put my all-time favorite feature even before those: arglist-on-space. I'm a total arglist-on-space fanatic and evangelist -- I think it's the greatest idea ever for supporting/speeding code editing and that it should be in every Lisp editor. AFAIK it is currently available for Clojure only in emacs and MCLIDE. If I were going to add one editor feature beyond robust auto-indenting it would be arglist-on-space.

Again, I love this project! I hope that the comments above are taken as constructive criticism.

-Lee

> --
> You received this message because you are subscribed to the Google
> Groups "Clojure" group.
> To post to this group, send email to clo...@googlegroups.com
> Note that posts from new members are moderated - please be patient with your first post.
> To unsubscribe from this group, send email to
> clojure+u...@googlegroups.com
> For more options, visit this group at
> http://groups.google.com/group/clojure?hl=en

--
Lee Spector, Professor of Computer Science
Cognitive Science, Hampshire College
893 West Street, Amherst, MA 01002-3359
lspe...@hampshire.edu, http://hampshire.edu/lspector/
Phone: 413-559-5352, Fax: 413-559-5438

Adam Burry

unread,
Jul 18, 2011, 8:32:31 AM7/18/11
to Clojure
> - I just created a new project and I get a user prompt in the REPL pane but I can't type anything into that... so I can't actually try it... I click in there but I don't get a cursor there, and typing does nothing. In case it matters I'm running Mac OS 10.6.8 and java -version says:

Re-read the OP. The right hand column has two parts: the top part
shows REPL evaluation, the bottom part is your REPL input window.

Adam

Tamreen Khan

unread,
Jul 18, 2011, 8:38:32 AM7/18/11
to clo...@googlegroups.com
It's a little confusing to see what's normally the text for the prompt, "user=>", be in the window that shows the result. Why can't both the prompt and the results be shown in the same area?

Arthur Edelstein

unread,
Jul 18, 2011, 10:19:07 AM7/18/11
to Clojure
> Yep, this is great! How about syntax highlighting?

Thanks, good suggestion! I'm not a huge fan of most syntax
highlighting -- what do you think would be helpful but unobtrusive?

Arthur Edelstein

unread,
Jul 18, 2011, 10:24:05 AM7/18/11
to Clojure


On Jul 18, 2:31 am, Shantanu Kumar <kumar.shant...@gmail.com> wrote:
> This is so cool. Any chance you can use Laurent Petit's Paredit?https://github.com/laurentpetit/paredit.clj

Thanks, that's a very interesting idea. Perhaps, if Laurent doesn't
mind! :)

> Any roadmap for features? Syntax highlight, autocomplete etc?

I'm adding Issues to the github project now.

Arthur Edelstein

unread,
Jul 18, 2011, 10:26:10 AM7/18/11
to Clojure
Hi Florian,

> but somehow i can't save ...
> It always says "Oops" "Unable to save file"

Sorry, you need to choose "File > New" first, or open a project with
existing source files. I will try to fix this issue soon.

Arthur Edelstein

unread,
Jul 18, 2011, 11:10:29 AM7/18/11
to Clojure

Hi Lee,

> Tab moves it to the right, shift-tab moves it to the left, but is there a way to say "move it to the correct place

A very good point -- added to the clooj github issues.

> - I just created a new project and I get a user prompt in the REPL pane but I can't type anything into that... so I can't actually try it... I click in there but I don't get a cursor there, and typing does nothing. In case it matters I'm running Mac OS 10.6.8 and java -version says:

The REPL input is the lower right pane. I think I should add some
labels on each pane.

> - How is one supposed to create a new .clj file and add it to the project?

Use the File > New menu.

> I think that a "hello world" example that walks one through the process of creating a new project, adding a new, empty src file, adding code to that file, and running the code, would clear this up. Maybe also a second simple example that also adds one library... or something like that.

That's a good suggestion. Overall I'd like to make the user interface
more self-explanatory -- any ideas on how to do this would be very
helpful.

> - It would be nice if all of the basic editor functionality was discoverable via menu items. For example the indentation commands are mentioned in the instructions in the posting to the list, but since they're not in the menus a user may not realize they're there. (These in particular could be under the Source menu, but as a general rule it would be nice if all major features are *somewhere* in the interface.)

A good point. Added to the github issues.

> - Longer term I agree with Shantanu that things like syntax highlighting and autocompletion would be great, and actually I'd put my all-time favorite feature even before those: arglist-on-space. I'm a total arglist-on-space fanatic and evangelist -- I think it's the greatest idea ever for supporting/speeding code editing and that it should be in every Lisp editor. AFAIK it is currently available for Clojure only in emacs and MCLIDE. If I were going to add one editor feature beyond robust auto-indenting it would be arglist-on-space.

Another excellent suggestion (added to issues). I think you're right
-- arglist-on-space is very cool. Where do you think the arglist
should appear? I think there's a tension between wanting to display it
near where the user is typing and the need to not obscure nearby code.

> Again, I love this project! I hope that the comments above are taken as constructive criticism.

Absolutely! Thank you very much for taking the time to give me so much
helpful feedback.

Best regards,
Arthur

Shantanu Kumar

unread,
Jul 18, 2011, 11:43:13 AM7/18/11
to Clojure


On Jul 18, 7:24 pm, Arthur Edelstein <arthuredelst...@gmail.com>
wrote:
> On Jul 18, 2:31 am, Shantanu Kumar <kumar.shant...@gmail.com> wrote:
>
> > This is so cool. Any chance you can use Laurent Petit's Paredit?https://github.com/laurentpetit/paredit.clj
>
> Thanks, that's a very interesting idea. Perhaps, if Laurent doesn't
> mind! :)

Laurent has already suggested someone in the past to use Paredit, so I
don't think he would mind. :-)

Another kick-ass feature would be first-class integration with
Leiningen (and likewise, with Cake) - you can discover the list of
commands using the "lein" command without any args. Once you discover
the command names you can display it in a menu. When a user clicks one
of those menu items, pop a textbox for other arguments and execute the
entire command on pressing Enter.

You may also consider building a plugin architecture for Clooj. For
example, Leiningen support can be built by writing a plugin.

Regards,
Shantanu

Lee Spector

unread,
Jul 18, 2011, 12:14:53 PM7/18/11
to clo...@googlegroups.com

On Jul 18, 2011, at 11:10 AM, Arthur Edelstein wrote:
>
> The REPL input is the lower right pane. I think I should add some
> labels on each pane.

Ah yes -- now I see it and that works fine. Thanks also to Adam Burry for pointing this out. As Tamreen Khan noted it's a little confusing that there's a prompt in the upper pane while input can only be given in the lower pane... I agree with Tamreen that the ideal thing would be for both to be in the same pane, so it's a normal REPL that takes input and also gives output, but if that's very difficult for some reason then I agree that pane labels would help.

>> - How is one supposed to create a new .clj file and add it to the project?
>
> Use the File > New menu.

For some reason I was missing this and only seeing the menu item for a new project... but now I think this was just me, and that I jumped too quickly to the conclusion that new files were to be created outside of clooj. Now I see it and it works very nicely. I do think that a hello world walkthrough doc would prevent others from missing this and generally help to orient newcomers to the environment.

> Another excellent suggestion (added to issues). I think you're right
> -- arglist-on-space is very cool. Where do you think the arglist
> should appear? I think there's a tension between wanting to display it
> near where the user is typing and the need to not obscure nearby code.

In emacs and MCLIDE (and as far as I recall in other environments that I've used, mostly for Common Lisp) it appears in a mini buffer below the editing pane. I think that's a good solution, but anywhere else "within view but out of the way" would suffice. I wouldn't want to put this within the edit buffer itself, since it might then get in the way and there'd be a much higher premium on getting the information and the way that it's displayed exactly right. Part of the beauty of arglist-on-space is that it's often extremely helpful -- and I tend to rely on it rather than my memory if it's available -- but there are no bad consequences if it's not exactly perfect (e.g. because of complex argument lists or special cases that make it hard to display the right info).

-Lee

Arthur Edelstein

unread,
Jul 18, 2011, 12:36:39 PM7/18/11
to Clojure
On Jul 18, 3:16 am, Florian Over <florian.o...@googlemail.com> wrote:
> Hmm, good idea
> but somehow i can't save ...
> It always says "Oops" "Unable to save file"
> When i'm at home i will give it another try.

Hi Florian,

There are two requirements:
1. You need to have a project open, in a writable directory.
2. You need to create a .clj file in your project, by choosing File >
New. Sorry this isn't obvious -- I now realize this weirdness is the
first issue I need to fix.

Thanks for the feedback!

Best regards,
Arthur

Arthur Edelstein

unread,
Jul 18, 2011, 12:40:05 PM7/18/11
to Clojure
Hi Tamreen,

On Jul 18, 5:38 am, Tamreen Khan <histor...@gmail.com> wrote:
> It's a little confusing to see what's normally the text for the prompt,
> "user=>", be in the window that shows the result. Why can't both the prompt
> and the results be shown in the same area?

That is a good point. I wanted a multi-line editor for the REPL input,
so I put the REPL input and output in separate panes. But I agree it
would be nice to have the prompt in the REPL input pane. I'm adding
this suggestion to the issues. Thanks for the feedback!

Best regards,
Arthur

Arthur Edelstein

unread,
Jul 18, 2011, 12:49:15 PM7/18/11
to Clojure
> > The REPL input is the lower right pane. I think I should add some
> > labels on each pane.
>
> Ah yes -- now I see it and that works fine. Thanks also to Adam Burry for pointing this out. As Tamreen Khan noted it's a little confusing that there's a prompt in the upper pane while input can only be given in the lower pane... I agree with Tamreen that the ideal thing would be for both to be in the same pane, so it's a normal REPL that takes input and also gives output, but if that's very difficult for some reason then I agree that pane labels would help.

I see what you're saying. I made the REPL input and output separate to
make an easy multiline editor for the input. But I do agree it would
be nice to show the prompt in the REPL input. If I combine the panes,
I'm concerned that it will be tricky for users to see where the cursor
can go.

> For some reason I was missing this and only seeing the menu item for a new project... but now I think this was just me, and that I jumped too quickly to the conclusion that new files were to be created outside of clooj. Now I see it and it works very nicely. I do think that a hello world walkthrough doc would prevent others from missing this and generally help to orient newcomers to the environment.

My next task is to make this requirement more obvious -- it's a very
awkward behavior right now.

> In emacs and MCLIDE (and as far as I recall in other environments that I've used, mostly for Common Lisp) it appears in a mini buffer below the editing pane. I think that's a good solution, but anywhere else "within view but out of the way" would suffice. I wouldn't want to put this within the edit buffer itself, since it might then get in the way and there'd be a much higher premium on getting the information and the way that it's displayed exactly right. Part of the beauty of arglist-on-space is that it's often extremely helpful -- and I tend to rely on it rather than my memory if it's available -- but there are no bad consequences if it's not exactly perfect (e.g. because of complex argument lists or special cases that make it hard to display the right info).

I think I can grab the arglist just the way the built-in doc macro
does, so it should be relatively straightforward. Thanks again for the
awesome suggestion!

Timothy Baldridge

unread,
Jul 18, 2011, 12:51:13 PM7/18/11
to clo...@googlegroups.com
There's allot here I really like. This could end up being "the" IDE
for clojure newbies. I agree though, lein integration would be
awesome. One of my biggest complaints against larger IDE's is trying
to get them to look at the lein classpaths. Getting the same result in
my repl as I get by doing "lein run" would be awesome.


Great job!

Timothy

Arthur Edelstein

unread,
Jul 18, 2011, 12:52:15 PM7/18/11
to Clojure

> Another kick-ass feature would be first-class integration with
> Leiningen (and likewise, with Cake) - you can discover the list of
> commands using the "lein" command without any args. Once you discover
> the command names you can display it in a menu. When a user clicks one
> of those menu items, pop a textbox for other arguments and execute the
> entire command on pressing Enter.

That's definitely something I would like. I've added it to the issues.

> You may also consider building a plugin architecture for Clooj. For
> example, Leiningen support can be built by writing a plugin.

That's an interesting idea. How do you envision a plugin architecture
should work?

Arthur Edelstein

unread,
Jul 18, 2011, 12:55:39 PM7/18/11
to Clojure
> One of my biggest complaints against larger IDE's is trying
> to get them to look at the lein classpaths. Getting the same result in
> my repl as I get by doing "lein run" would be awesome.

That's more or less what I've been attempting to do, but I need to
check carefully that I have covered the lein/cake classpath
completely. Added to github issues.

> Great job!

Thanks! :) And thank you for the feedback!

Lars Nilsson

unread,
Jul 18, 2011, 1:32:44 PM7/18/11
to clo...@googlegroups.com
On Mon, Jul 18, 2011 at 3:03 AM, Arthur Edelstein
<arthure...@gmail.com> wrote:
> --- more work needed
> clooj is a work in progress. Your suggestions, criticisms and code
> contributions are appreciated.

Not sure if I'm not misunderstanding the initial creating of a
project, but it seems to me that I am using a file dialog box for a
directory selection. As it wasn't entirely clear what it expected me
to do at that point, I just typed in some name without knowing for
sure if it was supposed to be a file name or a directory, and found
out afterward that it was in fact a name that represented a directory.

It will probably take quite a bit for me to give up Emacs, but I find
it a very interesting project, and like several others have said, it
worked right out of the box, which is a huge plus.

Regards,
Lars Nilsson

Arthur Edelstein

unread,
Jul 18, 2011, 1:42:26 PM7/18/11
to Clojure
> Not sure if I'm not misunderstanding the initial creating of a
> project, but it seems to me that I am using a file dialog box for a
> directory selection. As it wasn't entirely clear what it expected me
> to do at that point, I just typed in some name without knowing for
> sure if it was supposed to be a file name or a directory, and found
> out afterward that it was in fact a name that represented a directory.

The file dialog for creating a new project is supposed to have the
title "Create a project directory." Is this visible on your OS when
you choose Project > New...? (If not, what OS are you using?) Thanks
for the feedback, Lars!

Lars Nilsson

unread,
Jul 18, 2011, 1:57:17 PM7/18/11
to clo...@googlegroups.com

Yes, it does say that now that I'm checking again, I must have missed
it the first time around. I just confused it with a regular file
dialog box. My feeling about a different style dialog box stands, I
think, but it's really a very minor issue, and I'm much, much more
interested in a the automatic indent (first brought up by Lee in this
thread) that I couldn't live without in Emacs (for any programming
langauge..) Being able to hit tab wherever I happen to be in a line
and have it "do the right thing" rather than simply inserting a tab at
the cursor location is invaluable, along with reindenting a region or
a whole file. So +1 from me for that feature, if there's a tally going
on for the requests. ;)

Lars

Arthur Edelstein

unread,
Jul 18, 2011, 2:06:09 PM7/18/11
to Clojure
> Yes, it does say that now that I'm checking again, I must have missed
> it the first time around. I just confused it with a regular file
> dialog box. My feeling about a different style dialog box stands,

Thanks for pointing it out; I'll try to fix that.

> I'm much, much more
> interested in a the automatic indent (first brought up by Lee in this
> thread) that I couldn't live without in Emacs (for any programming
> langauge..) Being able to hit tab wherever I happen to be in a line
> and have it "do the right thing" rather than simply inserting a tab at
> the cursor location is invaluable, along with reindenting a region or
> a whole file. So +1 from me for that feature, if there's a tally going
> on for the requests. ;)

Tallied. :) What's your favorite keyboard shortcut for invoking smart
indent? Is it TAB? I imagine it's still important to be able to indent
and de-indent manually, but maybe I'm wrong.

Lars Nilsson

unread,
Jul 18, 2011, 2:13:28 PM7/18/11
to clo...@googlegroups.com
On Mon, Jul 18, 2011 at 2:06 PM, Arthur Edelstein
<arthure...@gmail.com> wrote:
> Tallied. :) What's your favorite keyboard shortcut for invoking smart
> indent? Is it TAB? I imagine it's still important to be able to indent
> and de-indent manually, but maybe I'm wrong.

I use TAB. Just about the only file type I edit for which it doesn't
do this are Makefiles. C/C++, Clojure/Lisp, O'Caml source files, etc,
I use TAB in Emacs and expect it do make the current line indented
appropriately, whether I'm at the beginning, end or in the middle of
the line. I can't remember the last time I really felt I needed an
actual tab character in a source file of mine. Obviously, this can be
a highly individual preference and I fully realize not everyone will
want to have an editor/IDE behave this way (of course, they're
misguided... ;) )

Lars

Arthur Edelstein

unread,
Jul 18, 2011, 2:18:49 PM7/18/11
to Clojure
> I use TAB. Just about the only file type I edit for which it doesn't
> do this are Makefiles. C/C++, Clojure/Lisp, O'Caml source files, etc,
> I use TAB in Emacs and expect it do make the current line indented
> appropriately, whether I'm at the beginning, end or in the middle of
> the line. I can't remember the last time I really felt I needed an
> actual tab character in a source file of mine.

I should make clear, I don't allow tab characters in clooj at all. :)
All indentation uses spaces. I guess my fear is that users will find
it annoying if the TAB key is devoted to smart indentation and space
and delete are the only tools for adjusting the indentation manually.
But maybe manual indentation is a rare enough that it is better to use
TAB for smart indentation.

Timothy Baldridge

unread,
Jul 18, 2011, 4:06:24 PM7/18/11
to clo...@googlegroups.com
I don't know if it has been mentioned yet, but I'm not getting
error-output in the REPL. If I type

(println foo)

then do CTRL+E

I see the REPL spit out the lines I entered, then nothing...

Some sort of error feedback would be nice.

Timothy

Shantanu Kumar

unread,
Jul 18, 2011, 4:12:20 PM7/18/11
to Clojure
> > You may also consider building a plugin architecture for Clooj. For
> > example, Leiningen support can be built by writing a plugin.
>
> That's an interesting idea. How do you envision a plugin architecture
> should work?

From the top of my head it looks like it should be possible to safely
maintain a global state. The global state can change when you switch
from project to project or create/remove projects. Since it is
Clojure, safety (due to concurrency) is less of a concern. Based on
the Global state, you can choose to render different things for the
various controls on screen. For example, if the current project
contains project.clj and Leiningen plugin is installed then include a
Leiningen menu in the menu bar (which should act on the "current"
project). Similarly, if Marginalia plugin is installed then show a
Marginalia menu item under "Tools".

A "TextMate theme" plugin may work by taking into account less amount
of global states -- it should rather modify the way controls are
rendered. So, the look-n-feel should be theme-able. The keyword here
seems to be "well defined global state properties," which could be
hierarchical in order to be extensible.

Regards,
Shantanu

Shantanu Kumar

unread,
Jul 18, 2011, 4:20:56 PM7/18/11
to Clojure
> All indentation uses spaces. I guess my fear is that users will find
> it annoying if the TAB key is devoted to smart indentation and space
> and delete are the only tools for adjusting the indentation manually.
> But maybe manual indentation is a rare enough that it is better to use
> TAB for smart indentation.

Just wanted to highlight that both Emacs Clojure-mode and Eclipse/
CounterClockWise use TAB to auto-indent the current line correctly.
So, I guess the expectation would be likewise for the respective
proportion of Clojure users. Though of course the key bindings should
be re-mappable too IMHO.

Regards,
Shantanu

Shantanu Kumar

unread,
Jul 18, 2011, 4:44:14 PM7/18/11
to Clojure
So, just to expand the scope - what kind of plugins should be
possible:

1. Source control plugins - Git, Mercurial, Subversion...
2. Theme/Look-n-feel plugins
3. Syntax highlight plugin - Clojure, Markdown, Textile, XML,
Leiningen project.clj, Rakefile, Ruby
4. Tool plugins -- Leiningen, Marginalia, Heroku, AppEngine

Features:
1. Debugging using JPDA/CDT
2. Preferences - fonts, key bindings, JDK, Clojure versions
3. Workspaces - project management, source dirs, dependencies etc
4. nREPL support

Regards,
Shantanu

Arthur Edelstein

unread,
Jul 18, 2011, 4:52:34 PM7/18/11
to Clojure
Hi Timothy,

Thanks for your message.

> I don't know if it has been mentioned yet, but I'm not getting
> error-output in the REPL. If I type
>
> (println foo)
>
> then do CTRL+E
>
> I see the REPL spit out the lines I entered, then nothing...

I don't know why are aren't getting an error message. When I do the
same thing, in the REPL output pane I get

(println foo)
#<CompilerException java.lang.Exception: Unable to resolve symbol: foo
in this context (NO_SOURCE_FILE:1)>

What OS and java version are you using?

Best regards,
Arthur

Arthur Edelstein

unread,
Jul 18, 2011, 5:04:59 PM7/18/11
to Clojure
Hi Shantanu,

> Just wanted to highlight that both Emacs Clojure-mode and Eclipse/
> CounterClockWise use TAB to auto-indent the current line correctly.
> So, I guess the expectation would be likewise for the respective
> proportion of Clojure users. Though of course the key bindings should
> be re-mappable too IMHO.

Very good points.

> The keyword here
> seems to be "well defined global state properties," which could be
> hierarchical in order to be extensible.

This makes sense to me. How should clooj "plug in" plugins?

> So, just to expand the scope - what kind of plugins should be
> possible:
> > ...

Wow, these are fantastic ideas and suggestions. Thanks for thinking
all of this through! There's so much to do ... if you feel like
undertaking any of these, I'll be very excited by pull requests! ;)

Arthur

Timothy Baldridge

unread,
Jul 18, 2011, 5:16:37 PM7/18/11
to clo...@googlegroups.com
Java HotSpot 1.6.0_24 64-bit Server VM
Windows 7 Professional 64bit

Timothy

--
“One of the main causes of the fall of the Roman Empire was
that–lacking zero–they had no way to indicate successful termination
of their C programs.”
(Robert Firth)

Anthony Grimes

unread,
Jul 18, 2011, 7:45:22 PM7/18/11
to clo...@googlegroups.com
Check out http://github.com/daveray/seesaw. It might help ease some of that Swing pain.

cljneo

unread,
Jul 18, 2011, 8:01:53 PM7/18/11
to clo...@googlegroups.com
I can't thank you enough for this Arthur. But please please don't abandon this project. Clojure hackers have no excuse to lend you a hand since it is written in Clojure. 

A newbie IDE is what Clojure needs most. Scheme was used as a first language so why shouldn't people be able to start with The Last Language. Why should people start with a broken model to think about their problems when they can start with the correct one? An IDE such as CLOOJ is essential towards this goal.

~~Wish list~~:
- A more memorable name would be CLIDE.
- Java Web Start
- Swing doesn't make nice UIs.
- CLOOJ for ClojureCLR. David Miller's huge efforts were not rewarded with a similar IDE (vsClojure was abandoned).

Thanks again

cljneo

unread,
Jul 18, 2011, 4:45:19 PM7/18/11
to Clojure
Arthur,
I can't thank you enough. Two great news in a week, that's awesome. I
am eagerly awaiting Wednesday.

But please, please, please DON'T ABANDON THIS PROJECT.

CLJ Hackers,
Please lend a hand. You have no excuse; it is written in Clojure. This
is what Clojure needs the most!

People shouldn't start programming the WRONG way (JAVA.COM) and then
come back to learn to think about their problems the RIGHT way
(www.clojure.org)! They should start with the Last Programming
language and CLOOJ is their first step.

Thinking~~:
- Maybe we need CLOOJ or something similar for .NET as well. David
Miller's work should be rewarded with a CLOOJ of it's own.
- A webstart version.
- I hope that we don't start to see hundreds of conflicting setup
instructions in blog posts (like those for Emacs).
- I wish that Swing was prettier on the eye. I love nice GUIs.

Thanks again

abp

unread,
Jul 18, 2011, 5:14:11 PM7/18/11
to Clojure
Why is it necessary to press TAB at all? Couldn't auto-indent be the
default for a line and only manually reindented lines opt-out until
one opts in again using TAB or something?

Ken Wesson

unread,
Jul 18, 2011, 11:06:43 PM7/18/11
to clo...@googlegroups.com
On Mon, Jul 18, 2011 at 5:14 PM, abp <abp...@googlemail.com> wrote:
> Why is it necessary to press TAB at all? Couldn't auto-indent be the
> default for a line and only manually reindented lines opt-out until
> one opts in again using TAB or something?

This is an interesting thought. On the other hand, when lines are
merged or split, where does this status go? I'm thinking when a line
is split the second of the two resulting lines should start out
indented correctly relative to the first, and inherit the first's
status; when two lines are merged, the status of the first of the two
becomes the status of the merged line. This is consistent with the
status being an invisible metacharacter at the start of the line that
is deleted with the immediately preceding newline and cloned if enter
is hit in the middle of that line.

What about multi-line pastes? If the paste is of material cut or
copied from inside clooj, the status of each line that was cut or
copied would be stored OOB somewhere and used for the paste. (Actually
using funny extra characters inline in the copied material has
problems if material is copied from clooj and pasted into something
else, such as a post to this list.) From outside clooj? Some sensible
default, such as autoindent off (keep paste's formatting) or on
(auto-fix to context). Maybe let the user choose either in an options
screen.

Saving the state across sessions also seems to need to be OOB. Putting
it in the .clj file at the start of each line would gum up other
tools, and adding clooj-internal comments to source files isn't much
better. A clooj.dat file in the project root?

Alternatively, avoid the mess and just always maintain
structure-determined indent of all lines at all times. Does anyone
really want fully user-controlled indenting outside of comments
anyway? Spaces and tabs in the indent can just jump you to the start
of the forms on the line, and self-insert normally in string literals
and in ; comments, and single spaces normally anywhere (maybe turn
tabs into spaces and tab or space next to a space just moves you to
the right of the space).

Or, the traditional thing: full control, but tab or something will
reindent the current line, or all lines intersecting the selection if
any, to structurally-correct positions based on all of the code above,
if tab is hit outside a string literal or ; comment.

--
Protege: What is this seething mass of parentheses?!
Master: Your father's Lisp REPL. This is the language of a true
hacker. Not as clumsy or random as C++; a language for a more
civilized age.

Arthur Edelstein

unread,
Jul 19, 2011, 1:27:35 AM7/19/11
to Clojure
Thanks to everyone who downloaded clooj, and thanks especially to
those of you who kindly provided feedback! I'm really grateful for
your help.

Since today's release I've made some bug fixes and improvements to
tighten up the handling of projects and files, to address some of the
issues people have brought up. Also added is an important bug fix from
Steve Lindsay.

New releases of clooj 0.1.1 (standalone app and embeddable jar) with
these changes are at
https://github.com/arthuredelstein/clooj/downloads
This is also where downloads of future versions will be available.

I have also started a Google group for anyone who wants to continue
discussing clooj:
http://groups.google.com/group/clooj

- Arthur Edelstein

On Jul 18, 12:03 am, Arthur Edelstein <arthuredelst...@gmail.com>
wrote:
> Hi Everyone,
>
> I want to let you know about clooj, a small, simple IDE for clojure
> that I have been developing (in clojure). It's packaged as a single
> jar file (including clojure 1.2), here:https://github.com/downloads/arthuredelstein/clooj/clooj-0.1.0-standa...
> Just download it and double-click. (I use clooj to develop clojure
> code every day at work.)
>
> You can look at the source code here:https://github.com/arthuredelstein/clooj
>
> clooj runs as a standalone application or you can embed it in other
> JVM programs. (See the README, below).
>
> This is an alpha release and I plan to continue further development.
> Feedback of all kinds and code contributions are much appreciated! :)
>
> Arthur Edelstein
> San Francisco
>
> ------
>
> clooj, a lightweight IDE for clojure
>
> --- the application
> clooj is a small, simple IDE (integrated development environment) for
> the clojure programming language. clooj is written entirely in clojure
> and uses a swing-based GUI. It is cross-platform (assuming Java 1.6
> has been installed on your operating system), and runs as a standalone
> application or as a clojure editor embedded in another java or clojure
> application. The standalone version (containing the clojure core) is a
> single jar file that can be launched by double-clicking its file icon
> or by running
> java -jar clooj-XXX-STANDALONE.jar from the command line. To embed in
> java, call clooj.core.show().
>
> --- the layout
> The clooj window contains three columns. The left-most column is a
> tree showing clojure projects and the source files they contain. The
> middle column is the source file editor. The right column displays
> inputs and outputs of clojure REPLs (read-evaluate-print loops).
>
> --- the source editor
> The source code editor offers a few simple things to make writing
> clojure code easier:
>
>  *  A non-traditional bracket-matching feature highlights in gray
> those brackets that contain the innermost form you are currently
> editing.
>  *  Mismatched or unmatched brackets are highlighted in pink.
>  *  TAB indents, and shift+TAB unindents.
>  *  Automatically comment-out (and un-comment-out) multiple lines.
>  *  When newlines are entered, the next line is automatically
> indented.
>  *  Press ctrl-ENTER to send either the nearest root form or the
> selected text to the REPL.
>  *  Source files are continuously saved in the background to prevent
> accidental loss of your work in the event of a crash.
>
> --- clojure projects
> Each clojure project corresponds to a project directory somewhere in
> the file system, containing a src directory. Inside the src directory
> is the source code hierarchy, composed of directories and .clj files.
> Note this directory structure is completely compatible with the lein
> and cake clojure build programs and you are encouraged to use one of
> these from the command line in conjunction with the clooj editor.
> Clicking different source files in the projects tree will
> automatically change the source file currently being edited, as well
> as switch the REPL to the appropriate namespace.
>
> --- read-evaluate-print loops
> The upper part of clooj's REPL display column shows the REPL history
> (inputs and outputs) and the lower part is a text area for inputting
> forms into REPL. Each project gets its own REPL environment: when a
> project is first selected, a new clojure REPL is created behind the
> scenes and becomes the REPL in use. By choosing "Restart REPL" you
> cause a new REPL to be created for the currently selected project and
> the old one to be discarded, if possible. If the project directory
> contains directories named "lib" and/or "jars" and there are any jar
> files inside, these jars will be included in the classpath whenever
> the project REPL is launched. You can subsequently add further jar
> files to the classpath by placing them in the "lib" or "jars"
> directory and restarting the REPL.

Arthur Edelstein

unread,
Jul 19, 2011, 1:33:56 AM7/19/11
to Clojure
This is a very helpful discussion -- I'm going to think about tabs on
the hammock.

Ken Wesson

unread,
Jul 19, 2011, 1:35:14 AM7/19/11
to clo...@googlegroups.com
On Tue, Jul 19, 2011 at 1:33 AM, Arthur Edelstein
<arthure...@gmail.com> wrote:
> This is a very helpful discussion -- I'm going to think about tabs on
> the hammock.

Thanks.

Arthur Edelstein

unread,
Jul 19, 2011, 1:42:12 AM7/19/11
to Clojure
> But please, please, please DON'T ABANDON THIS PROJECT.

I'll do my best to hang on. :)

> Thinking~~:
> - Maybe we need CLOOJ or something similar for .NET as well. David
> Miller's work should be rewarded with a CLOOJ of it's own.
> - A webstart version.
> - I hope that we don't start to see hundreds of conflicting setup
> instructions in blog posts (like those for Emacs).
> - I wish that Swing was prettier on the eye. I love nice GUIs.

Me too. I think in the long run the coolest thing will be an in-
browser clojure IDE for clojure-in-javascript, especially when multi-
threaded javascript becomes available in web browsers.

Lee Spector

unread,
Jul 19, 2011, 3:22:53 AM7/19/11
to clo...@googlegroups.com

On Jul 18, 2011, at 11:06 PM, Ken Wesson wrote:
> Or, the traditional thing: full control, but tab or something will
> reindent the current line, or all lines intersecting the selection if
> any, to structurally-correct positions based on all of the code above,
> if tab is hit outside a string literal or ; comment.

I personally think that this provides the best combination of clarity, simplicity, and utility. My guess is that "smarter" solutions will indeed get messy/annoying in some of the situations that Ken mentioned (e.g. pasting multiple lines, possibly from another app), and very occasionally I have reason to use non-standart indentation for some small segment of code. I do think that it's also good for the system to indent correctly when the user types a newline, which clooj already does.

-Lee

Clojure Neophyte

unread,
Jul 19, 2011, 3:54:10 AM7/19/11
to clo...@googlegroups.com
- I wish that Swing was prettier on the eye. I love nice GUIs.

Me too. I think in the long run the coolest thing will be an in-
browser clojure IDE for clojure-in-javascript, especially when multi-
threaded javascript becomes available in web browsers.


Maybe you should drop Swing and start experimenting with a cloud9-like IDE instead. 

Again, for Clojure to have wider adoption it should have a beginners' IDE. It shouldn't be distributed just as jar files. That's fine for hackers but clojure.org should have an IDE like CLOOJ and Clojure should be packaged part of it (A Download button on the page should download it directly; programmers should visit the Download page). Such an IDE would be ideal for a college teacher to introduce Clojure to his students. This IDE should not assume that these students have hacked on computers all their life. 
- They should be able to create, edit, and build their entire project from within the IDE and shouldn't have to switch to a terminal.
- The IDE should make the choice and not leave it to him. This IDE has to choose one build system and not ask the user to choose. All choices should be made.
- I don't believe that the parenthesis are the barrier for people to try a lisp language. I bet that most people who repeat this never actually heard it from a newbie; they just read it once and started repeating it. Unlike Clojure, and Lisp generally, there is no syntax. While half of a book about other languages discusses syntax issues, a Clojure book covers syntax in the early chapters and the rest of the book is about concepts and advanced issues. That's why lisp syntax is very small and pithy. More than any other language, I think a new user needs to practice a lot writing very small code pieces of code to get used to it. None of the Clojure books includes exercises. Maybe its time someone write a "Learning Clojure the Hard Way" book. The first lesson in The Hard Way book is to install a simple IDE like CLOOJ (or CLIDE - clojure.org's fork: of it). 

Many people believe that Clojure is not suitable as a first language. Irrespective whether this is right or wrong, I find it odd that a language like Clojure (and Scala) asks you to go learn another language before you learn it. It is even more odd with Clojure because you need to learn one of the broken languages first. Every general programming language should be a first language.

Regards

--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clo...@googlegroups.com
Note that posts from new members are moderated - please be patient with your first post.
To unsubscribe from this group, send email to
clojure+u...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en

Lee Spector

unread,
Jul 19, 2011, 4:02:18 AM7/19/11
to clo...@googlegroups.com

On Jul 19, 2011, at 3:54 AM, Clojure Neophyte wrote:
>
> Again, for Clojure to have wider adoption it should have a beginners' IDE. It shouldn't be distributed just as jar files.

FWIW I just double-clicked on the clooj jar and it launched like any other application -- I didn't have to know that it was a jar or even what a jar is. Assuming that this also works on other OSes (I'm using Mac OS X) then I think this is already beginner friendly. I *think* it also includes everything that a newbie needs for a complete workflow without any other tools or Terminal interactions...

-Lee

Vincent

unread,
Jul 19, 2011, 6:51:01 AM7/19/11
to clo...@googlegroups.com
nice name ! thanks again for  new ide 

Alessio Stalla

unread,
Jul 19, 2011, 7:20:34 AM7/19/11
to Clojure, arthure...@gmail.com
On 18 Lug, 18:40, Arthur Edelstein <arthuredelst...@gmail.com> wrote:
> Hi Tamreen,
>
> On Jul 18, 5:38 am, Tamreen Khan <histor...@gmail.com> wrote:
>
> > It's a little confusing to see what's normally the text for the prompt,
> > "user=>", be in the window that shows the result. Why can't both the prompt
> > and the results be shown in the same area?
>
> That is a good point. I wanted a multi-line editor for the REPL input,
> so I put the REPL input and output in separate panes. But I agree it
> would be nice to have the prompt in the REPL input pane. I'm adding
> this suggestion to the issues. Thanks for the feedback!

FWIW, I solved a similar problem in the past with a GUI REPL for
another JVM-based Lisp (ABCL). Unfortunately Swing makes such a thing
harder than it should be, at least if you stick to the "right" way of
properly using the Document interface upon which JTextArea is based.
Perhaps you can leverage some of that work. That REPL is very minimal
and I took some shortcuts, but it could be a nice starting point,
especially wrt. the nasty concurrency issues imposed by how Document
works. It was tested on all the three major OSes. If you're
interested, you can find it here:
http://trac.common-lisp.net/armedbear/browser/trunk/abcl/src/org/armedbear/lisp/java/swing/REPLConsole.java

hth,
Alessio

Dave Ray

unread,
Jul 19, 2011, 8:56:53 AM7/19/11
to clo...@googlegroups.com
Cool project, especially if it manages to *stay* lightweight :)

It is indeed difficult to build a console with Swing's text
components. Actually, I think it's difficult with the out-of-the-box
text components in just about any toolkit. They're not designed for it
and there are a ton of edge cases and gotchas to take care of.

Anyway, a couple other random thoughts:

* You might want to take a look at JSyntaxPane
(https://code.google.com/p/jsyntaxpane/) for the editor. In theory
adding Clojure syntax highlighting should be straightforward and they
already cover stuff like line numbers, etc.

* Consider using actions for your menu items so you can reuse them in
toolbars and elsewhere in the UI

* getCaretPosition (and almost all Swing methods) is not thread-safe
so calling it from an agent is asking for trouble :)

Good luck!

Dave

Arthur Edelstein

unread,
Jul 19, 2011, 12:53:10 PM7/19/11
to Clojure
> FWIW I just double-clicked on the clooj jar and it launched like any other application -- I didn't have to know that it was a jar or even what a jar is. Assuming that this also works on other OSes (I'm using Mac OS X) then I think this is already beginner friendly. I *think* it also includes everything that a newbie needs for a complete workflow without any other tools or Terminal interactions...

Perhaps the main thing that's missing (besides various code-editing
features) is an option for compiling and building the project. I'm
thinking about bundling in leiningen for that. But if anyone has a
better idea, do let me know. :)

- Arthur

Arthur Edelstein

unread,
Jul 19, 2011, 1:02:32 PM7/19/11
to Clojure
Hi Dave,

> Cool project, especially if it manages to *stay* lightweight :)

Thanks -- I hope it will! :)

> * You might want to take a look at JSyntaxPane
> (https://code.google.com/p/jsyntaxpane/) for the editor. In theory
> adding Clojure syntax highlighting should be straightforward and they
> already cover stuff like line numbers, etc.

An interesting suggestion.

> * Consider using actions for your menu items so you can reuse them in
> toolbars and elsewhere in the UI

Yes, I probably need to overhaul this at some point.

> * getCaretPosition (and almost all Swing methods) is not thread-safe
> so calling it from an agent is asking for trouble :)

Oops! It's interesting I haven't run into an error yet. Added to
github issues.

> Good luck!

Thanks! :)

Arthur

Lars Nilsson

unread,
Jul 19, 2011, 3:04:43 PM7/19/11
to clo...@googlegroups.com
On Mon, Jul 18, 2011 at 5:14 PM, abp <abp...@googlemail.com> wrote:
> Why is it necessary to press TAB at all? Couldn't auto-indent be the
> default for a line and only manually reindented lines opt-out until
> one opts in again using TAB or something?

If I add an expression around existing code, I tend to use TAB if
small regions are used to reindent the affected line(s) that are
suddenly contained within a new expression and as a result should be
reindented as if I had originally typed the entire expression. If for
some reason larger blocks of code are affected, I would likely use the
region/file reindent functionality in Emacs. In other words, I usually
use TAB for lines that were written earlier, to align it better with
new code, not to affect indentation of the line I'm currently typing.

Lars Nilsson

Laurent PETIT

unread,
Jul 25, 2011, 8:01:46 PM7/25/11
to clo...@googlegroups.com
Hi, I'm just back after some vacations without Internet connections. Please give me a couple more days to emerge from the tons of emails and workload, and I'll gladly help you in any possible ways.

Cheers,

-- 
Laurent

2011/7/18 Arthur Edelstein <arthure...@gmail.com>


On Jul 18, 2:31 am, Shantanu Kumar <kumar.shant...@gmail.com> wrote:
> This is so cool. Any chance you can use Laurent Petit's Paredit?https://github.com/laurentpetit/paredit.clj

Thanks, that's a very interesting idea. Perhaps, if Laurent doesn't
mind! :)

> Any roadmap for features? Syntax highlight, autocomplete etc?

I'm adding Issues to the github project now.

Laurent PETIT

unread,
Jul 25, 2011, 8:08:39 PM7/25/11
to clo...@googlegroups.com
2011/7/18 Arthur Edelstein <arthure...@gmail.com>
> Yep, this is great! How about syntax highlighting?

Thanks, good suggestion! I'm not a huge fan of most syntax
highlighting -- what do you think would be helpful but unobtrusive?

News: CCW's syntax highlighting mechanism has moved (in my local repo, already workable, but still some bugs to chase, and code to cleanup) from antlr to a full clojure stack.

In a nutshell: coupled to the same mechanism that parses in real time the source code of the editor (using cgrand's parsley library under the covers), it uses a "view" mechanism on the parse tree to produce back a seq of tokens. It already offers features I had not cared to implement with the old antlr version, such as having metadata and #_(escaped code) treated as wholes (thanks to working with a parse tree and not just a tokens stream), etc.

Where I would like to improve on ccw, is the current default choice of colors. Having you start syntax coloring for your IDE could be the right time for a consensus around this.
Reply all
Reply to author
Forward
0 new messages