Meghanada
is a new minor-mode (meghanada-mode
) that aims at improving the editing
experience for Java. It works by using a combination of an Emacs
package and meghanada-server.
Features:
- Easy install
- Auto-update server module
- Gradle and Maven and Eclipse project support
- No need build tool's plugin
- Run build tool task
- Compile your project
- Syntax check and analyze java source (
flycheck-meghanada
) - Support
Generic Types
- Code completion with company-mode (
company-meghanada
) - Optimize import and sort
- Jump declaration
- Run JUnit test (include test runner)
- Diagnostic reporting with flycheck (
flycheck-meghanada
) - Show symbol's type info with
el-doc
- Search references
- Full-featured text search
Meghanada
is tested under Linux
, Windows
and macOS
.
(Welcome contributions !)
Meghanada has been developed Emacs 25.1.1
Package | Version |
---|---|
cl-lib |
0.5 |
yasnippet | 0.6.1 |
company-mode | 0.9.0 |
flycheck | 0.23 |
meghanada-mode
require meghanada-server and JDK (not JRE).
meghanada-server provides an interface to meghanada-mode
. It uses a simple protocol
based on S-expressions. This server, written in Java, requires the following
packages to be installed on your system:
- JDK 1.8 or later
The Meghanada architecture is almost the same as ensime
. It is a client-server model.
Meghanada updates any information when saving and compile the java file.
If the completion candidate and others are incorrect, please fix the compile error.
If you can help improve server performance etc. please enable Telemetry.
If you allow Meghanada to submit performance data, the Telemetry system will collect and submit various measurement data from the user environment, such as Meghanada's performance.
Install meghanada from melpa.
(require 'meghanada)
(add-hook 'java-mode-hook
(lambda ()
;; meghanada-mode on
(meghanada-mode t)
;; enable telemetry
(meghanada-telemetry-enable t)
(flycheck-mode +1)
(setq c-basic-offset 2)
;; use code format
(add-hook 'before-save-hook 'meghanada-code-beautify-before-save)))
(cond
((eq system-type 'windows-nt)
(setq meghanada-java-path (expand-file-name "bin/java.exe" (getenv "JAVA_HOME")))
(setq meghanada-maven-path "mvn.cmd"))
(t
(setq meghanada-java-path "java")
(setq meghanada-maven-path "mvn")))
The server will be automatically installed to ~/.emacs.d/meghanada/meghanada-x.x.jar
.
If you open a java file and set meghanada-mode
, a meghanada-server process starts automatically and connects to your emacs.
The server will be automatically updated. To manually update bellows, type
M-x meghanada-update-server
The server will be installed and updated automatically.
If you set it up manually, please follow the instructions below.
A meghanada-setup.jar is a small program that automatically updates the server.
This can be downloaded from:
https://github.com/mopemope/meghanada-server/releases/download/v1.0.13/meghanada-setup-0.0.2.jar
Move the downloaded setup.jar to .emacs.d/meghanada/. Start Emacs and enable meghanada-mode.
Auto-completion is supported by company-mode
.
Completion matcher is selectable. see type M-x customize-group RET meghanada
.
Error checking is supported by flycheck
.
To customize other aspects of its behavior, type M-x customize-group RET meghanada
.
Here is a list of available interactive commands.
Download and install meghanada-server jar.
Download and update meghanada-server jar. and restart the server process.
Start meghanada-server process and connect to the server.
meghanada-mode
call this function by default. when open java file and set meghanada-mode
.
Restart meghanada-server process and client process.
Kill meghanada-server process.
Connect to other meghanada-server directly.
Connect to meghanada-server . Call automatically at the start meghanada-mode
.
Disconnect from meghanada-server .
Send ping meghanada-server
Clear meghanada-server's project cache data.
Add import all unqualified classes.
Import all and remove unused import statement.
The format of the import statement will be in google-java-format
.
Add import statement from symbol at point.
Introduce local variable. (need expression is end ;
)
Compile file (and related files).
Show project details.
Compile project (full build and reindex).
Switch test case or source.
Run main class.
Debug main class.
Find usage (method call, field access, class).
It does a full-text search based search (class, method, symbol (field)).
It does a full-text search expert-mode (Enter a query for Lucene).
Here is a list of fields that can be used in the search.
- package
- class
- method
- symbol
- usage
- dc (method's or field's declaring class)
ex. Seach class name contains Search
.
class:*Search*
It can also use AND operator
.
dc:*Optional* AND usage:get
Show type hierarchies and implements interfaces.
Run JUnit test class.
Run JUnit test case (select from imenu).
Debug JUnit test class.
Debug JUnit test case (select from imenu).
Run build tool task.
Goto declaration.
Go back from declaration position.
Format buffer code. The default formatter is google-java-format
meghanada-mode
uses google-java-format
by default for formatter.
It also supports Eclipse formatter.
If you want to customize the formatter, you use the exported eclipse format settings.
To import the settings, change the name of the exported file to meghanadaFormatter.xml
and put it in the project root
or subproject root
.
meghanada-mode
has no debugger yet. However, the external debugger is supported.
if you want to debug your code, execute meghanada-debug-xxxx
function and then use realgud, etc.
# in Emacs now:
M-x meghanada-debug-junit-class
Please wait ...
M-x realgud:jdb
Run jdb (like this): jdb -attach 6006
Set uncaught java.lang.Throwable
Set deferred uncaught java.lang.Throwable
Initializing jdb ...
>
VM Started: No frames on the current call stack
main[1] stop at example.MyClass:100 // set breakpoint
main[1] run
See *meghanada-server-log*
buffer. or (temporary-file-directory)meghanada_server_(user-uid).log
, e.g. /tmp/meghanada_server_1000.log
.
Please press C-g
when emacs seems to hang.
(use-package autodisass-java-bytecode
:ensure t
:defer t)
(use-package google-c-style
:defer t
:ensure t
:commands
(google-set-c-style))
(use-package meghanada
:defer t
:init
(add-hook 'java-mode-hook
(lambda ()
(google-set-c-style)
(google-make-newline-indent)
(meghanada-mode t)
(smartparens-mode t)
(rainbow-delimiters-mode t)
(highlight-symbol-mode t)
(add-hook 'before-save-hook 'meghanada-code-beautify-before-save)))
:config
(use-package realgud
:ensure t)
(setq indent-tabs-mode nil)
(setq tab-width 2)
(setq c-basic-offset 2)
(setq meghanada-server-remote-debug t)
(setq meghanada-javac-xlint "-Xlint:all,-processing")
:bind
(:map meghanada-mode-map
("C-S-t" . meghanada-switch-testcase)
("M-RET" . meghanada-local-variable)
("C-M-." . helm-imenu)
("M-r" . meghanada-reference)
("M-t" . meghanada-typeinfo)
("C-z" . hydra-meghanada/body))
:commands
(meghanada-mode))
(defhydra hydra-meghanada (:hint nil :exit t)
"
^Edit^ ^Tast or Task^
^^^^^^-------------------------------------------------------
_f_: meghanada-compile-file _m_: meghanada-restart
_c_: meghanada-compile-project _t_: meghanada-run-task
_o_: meghanada-optimize-import _j_: meghanada-run-junit-test-case
_s_: meghanada-switch-test-case _J_: meghanada-run-junit-class
_v_: meghanada-local-variable _R_: meghanada-run-junit-recent
_i_: meghanada-import-all _r_: meghanada-reference
_g_: magit-status _T_: meghanada-typeinfo
_l_: helm-ls-git-ls
_q_: exit
"
("f" meghanada-compile-file)
("m" meghanada-restart)
("c" meghanada-compile-project)
("o" meghanada-optimize-import)
("s" meghanada-switch-test-case)
("v" meghanada-local-variable)
("i" meghanada-import-all)
("g" magit-status)
("l" helm-ls-git-ls)
("t" meghanada-run-task)
("T" meghanada-typeinfo)
("j" meghanada-run-junit-test-case)
("J" meghanada-run-junit-class)
("R" meghanada-run-junit-recent)
("r" meghanada-reference)
("q" exit)
("z" nil "leave"))
- Refactoring
Contributions are extremely welcome! Please push PR to dev
branch.
GPL v3, See LICENSE file.