https://github.com/m0smith/malabar-mode.git
git clone 'git://github.com/m0smith/malabar-mode.git'
EMACS integration with the JVM.
malabar-mode is a monir-mode with hooks into Maven that makes it easy to compile files on the fly and execute Maven build commands.
NOTE: The java/groovy code has been moved to https://github.com/m0smith/malabar-mode-jar
This is based on a fork of buzztaiki's fork of espenhw's malabar-mode which has been merged back into the master branch. Development of malabar-mode has restarted. This is an attempt to keep it up to date and develop at a modest pace.
You may want to skip to Installation.
Since malabar-mode can be used from both java-mode and groovy-mode, we get some things for free:
Syntax highlighting
Movement commands (C-M-f/-b
is a winner; so is M-f/-b
, especially
with c-subword-mode
turned on)
Electric punctuation
There's lots more; and since this is Emacs, you can turn off or modify anything you don't like.
Tight integration with Maven. If you're not using Maven, you should not consider malabar-mode for now. Adding gradle support is pending.
A Groovy console for rapid prototyping and exploratory programming
JUnit integration, both for running tests standalone and through Maven
Debugger integration with EMACS built in GUD
Import help; import one class or all needed classes in the buffer (with prompting if the class name is ambiguous)
Extend class / implement interface / override method helpers
Simplistic refactorings
See the Cheat Sheet
and more.
There has been a lot of work to rewrite malabar-mode to make it easier to maintain, install and develop. It is currently in a beta stage. Once it has some time to mature, it will be put back into MELPA. Until then, the installation is manual:
Install groovy (2.3.7 or later). Ubunutu has a real old version. Use GVM to install http://gvmtool.net/
Install gradle
Clone https://github.com/alexott/cedet/tree/devel
git clone https://github.com/alexott/cedet.git
cd cedet
make all
Install malabar-mode from melpa
Install emacs package groovy-mode. Do not use marmalade version as it is old.
Add to .emacs:
(load-file "~/projects/cedet/cedet-devel-load.el")
(add-hook 'after-init-hook (lambda ()
(message "activate-malabar-mode")
(activate-malabar-mode)))
(add-hook 'malabar-java-mode-hook 'flycheck-mode)
(add-hook 'malabar-groovy-mode-hook 'flycheck-mode)
NOTE 1.x is no longer supported and no more development will happen on this branch
The malabar-mode package is now part of
MELPA thanks to this
issue. Make sure you
have the MELPA package archive enabled in your init.el or .emacs and
your package contents are up to date (use M-x
package-refresh-contents
if you can’t find the malabar-mode package and
you’ve added MELPA to your package archives.
Version 2.3.7 or beyond
malabar-mode was originally developed on Emacs 23, but development now targets Emacs 24.
(optional) If you want to mimic the IDEish compile-on-save behaviour, add the following as well::
(add-hook 'malabar-mode-hook
(lambda ()
(add-hook 'after-save-hook 'malabar-compile-file-silently
nil t)))
Update: malabar-mode now has a menu. Yay!
flycheck integration is working except for the few edge cases where the groovy parser differs from th ejava parser
cedet integration for java, not working for groovy yet
unit testing a class or method
Here is a list of available interactive commands, with default keybindings where applicable:
malabar-import-one-class
on each.Adds an import statement for a single unqualified class (defaults to the symbol at point). If more than one class matches the unqualified name you will be asked which class to import.
The variable malabar-import-excluded-classes-regexp-list
contains a list of regular expressions; if one of these matches the
qualified class name, the class will be excluded from import. The
default value excludes classes from java.lang
, JRE internal
classes and inner classes.
pom.xml
searching upwards in the directory structure.malabar-mode-load-class
malabar-groovy-send-buffer
and malabar-mode-load-class
, it loads the classpath of the current project into the running groovy buffer. This allows for code in the current project to be used interactively.semantic-analyze-current-context
output to identify an origin
for the code at point, taking type membership into account. This
function is much like semantic-ia-fast-jump
, only a little
smarter.In addition, standard Semantic code completion is available; trigger
this however you wish. By default, semantic-ia-complete-symbol
is
bound to C-c C-v C-.
and semantic-ia-complete-symbol-menu
is
bound to C-c C-v .
.
The following are either not in 2.0 yet or are only partially working. If you use any of these regularly, please use the issue tracker to let me know. Those missing features that have issues added will be given higher priority. Otherwise, they will be added back in random order.
-DskipTests=true -Pdev-mode install
will
run the install lifecycle with the dev-mode profile active, skipping
tests.mvn install
on your project. With prefix argument (C-u),
cleans the project first (mvn clean install
).Object.equals` or `Object.hashCode
, override both of them.mvn test
on your project. With prefix argument (C-u),
cleans the project first (mvn clean test
).malabar-visit-corresponding-test
, compiles that file (if not the
same as where we started) and runs the now-current buffer as a
standalone JUnit test.mvn test -Dtest=classname
)Visits the corresponding test class; that is, the file in the
parallel src/test/java hierarchy that matches the class in the
current buffer (with malabar-test-class-suffix
appended).
E.g., M-x malabar-visit-corresponding-test
in a buffer visiting
src/main/java/org/grumblesmurf/malabar/MvnServer.java
will visit
the file
src/test/java/org/grumblesmurf/malabar/MvnServerTest.java
with
the default value of malabar-test-class-suffix
.
If the current buffer looks like a test class, this command does nothing.
malabar-refactor-extract-constant-default-scope
, but with a
prefix arg will prompt for the scope.Some default abbrevs are set up, see the variable
malabar-case-fixed-abbrevs
for the current list.
Note the presence of the #Test
abbrev; this expands to::
@Test
public void |() throws Exception {
fail("Unfinished test");
}
With point left at the position marked with |
.
In addition to the electric insertion offered by CC-mode, malabar-mode
offers an expansion that simulates the Elvis operator, although the
generated code is not as efficient as a language-provided Elvis
operator would be. This expansion is controlled by the variable
malabar-electric-elvis-p
.
Github has excellent support for forking! Just hit the fork button at the top, code and go. For everyone's convenience, you should probably rebase to m0smith/malabar-mode/master every now and then. :)
If you don't want to go that far, git is, after all, a distributed VCS. Just commit to your local repository and then use git-format-patch to extract patches in a useful format.
To the issue tracker (see the next section).
Good for you. Create a ticket in the issue tracker and stuff will happen.
Hint #1: Tell me what you did, what you expected to happen and what
actually happened. Include any error messages (Emacs backtraces,
output in the buffers named starting with *Malabar
, interesting
stuff from *Messages*
etc.).
Hint #2: Bugs with patches tend to be fixed faster (see the previous section).
Yes, it probably would! Either describe the feature that you want in the issue tracker, or (even better) fork, code, and ask me to pull.
And of course, if I nix your feature request, you're free to maintain your own local patch branch if you wish (or, for that matter, a complete fork). malabar-mode is Open Source, after all.
This fork of malabar-mode uses git-flow to manage branching in development. As such, branches are:
Feature, release, feature, hotfix, and support branches won't
usually be shared. If they are pushed to github, they shouldn't
be rebased but may disappear after they are merged with
develop
or master
.
Your Emacs environment can be configured to use a “live” version of malabar-mode with the following steps:
Add the following to your .emacs
:
(setq malabar-groovy-lib-dir “~/src/malabar-mode/target/lib”) (setq malabar-groovy-extra-classpath '(“~/src/malabar-mode/target/classes”)) (add-to-list 'load-path “~/src/malabar-mode/src/main/lisp/”)
Run mvn package -P devel
to extract libraries into
target/lib
.
With this configuration, you can rebuild malabar-mode's JVM
component with mvn compile
, which will compile classes into
target/classes
. To apply these changes, restart malabar-mode
in Emacs with M-x malabar-groovy-restart
.
After editing elisp files, eval them to apply changes immediately.
Try
(setq malabar-util-path-separator ";")
(setq malabar-util-path-filter 'cygwin-convert-file-name-to-windows)
(setq malabar-util-groovy-file-filter 'malabar-util-reverse-slash)
malabar-mode is copyright (c) 2009-2014 Matthew O. Smith mailto:matt@m0smith.com
This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
For the full text of the GPL, see http://www.gnu.org/licenses/gpl2.txt.