Emacs で LSP(Language Server Protocol) を使用した Java IDE 環境 (実践編)

設定方法

;---- lsp-mode ----
(when (locate-library "lsp-mode")
  (require 'lsp-mode)

  (global-set-key [?\C-,] 'xref-go-back)

;  (setq lsp-keymap-prefix "C-c l")

;  (global-set-key "\M-t" 'lsp-goto-implementation)
;  (global-set-key "\M-r" 'lsp-find-references)
;  (global-set-key "\M-s" 'lsp-find-definition)
  (global-set-key "\C-cli" 'lsp-goto-implementation    )
  (global-set-key "\C-cld" 'lsp-find-definition        )
  (global-set-key "\C-clr" 'lsp-find-references        )
  (global-set-key "\C-clh" 'lsp-describe-thing-at-point)

;  (setq lsp-enable-symbol-highlighting t)    ; 1. Symbol highlighting
;  (setq lsp-ui-doc-enable t)                 ; 2. lsp-ui-doc - on hover dialogs. * disable via
;  (setq lsp-ui-doc-show-with-cursor nil)     ;    * disable cursor hover (keep mouse hover)
;  (setq lsp-ui-doc-show-with-mouse nil)      ;    * disable mouse hover (keep cursor hover)
;  (setq lsp-lens-enable t)                   ; 3. Lenses
;  (setq lsp-headerline-breadcrumb-enable t)  ; 4. Headerline
;  (setq lsp-ui-sideline-enable t)            ; 5. Sideline code actions * disable whole sideline via
  (setq lsp-ui-sideline-show-code-actions t) ;    * hide code actions
;  (setq lsp-ui-sideline-enable t)            ; 6. Sideline hover symbols * disable whole sideline via
;  (setq lsp-modeline-code-actions-enable t)  ; 7. Modeline code actions
;  (setq lsp-diagnostics-provider :auto)      ; 8. Flycheck (or flymake if no flycheck is present)
;  (setq lsp-ui-sideline-enable t)            ; 9. Sideline diagnostics * disable whole sideline via
;  (setq lsp-ui-sideline-show-diagnostics t)  ;    * hide only errors
;  (setq lsp-eldoc-enable-hover t)            ; 10. Eldoc
;  (setq lsp-modeline-diagnostics-enable t)   ; 11. Modeline diagnostics statistics
;  (setq lsp-signature-auto-activate nil)     ; 12. Signature help
;  '(lsp-signature-auto-activate '(:on-trigger-char :on-trigger-char));; you could manually request them via `lsp-signature-activate`
;  (setq lsp-signature-render-documentation t); 13. Signature help documentation (keep the signatures)
;  (setq lsp-completion-provider :capf)       ; 14. Completion (company-mode)
;  (setq lsp-completion-show-detail t)        ; 15. Completion item detail
;  (setq lsp-completion-show-kind t)          ; 16. Completion item kind

  (when (locate-library "lsp-java")
    (require 'lsp-java)
    (add-hook 'java-mode-hook #'lsp)

    (when (locate-library "lsp-ui")
      (use-package lsp-ui)
      )

    (when (locate-library "dap-mode")
      (use-package dap-mode :after lsp-mode :config (dap-auto-configure-mode))

      (global-set-key "\C-cpdd" 'dap-java-debug)
      (global-set-key "\C-cpdm" 'dap-java-debug-test-method)
      (global-set-key "\C-cpdc" 'dap-java-debug-test-class )
      (global-set-key "\C-cprm" 'dap-java-run-test-method  )
      (global-set-key "\C-cprt" 'dap-java-run-last-test    )
      (global-set-key "\C-cprc" 'dap-java-run-test-class   )
      )
    )
)

companyの設定

;---- company ----
(when (locate-library "company")
  (require 'company)

  (global-company-mode t)
  (setq company-transformers '(company-sort-by-backend-importance)) ;; sort order
  (setq company-idle-delay 0) ; Default is 0.5
  (setq company-minimum-prefix-length 3) ; Default is 4
  (setq company-selection-wrap-around t) ; Back to the top when going to the below further on the most candidate bottom
  (setq completion-ignore-case t)
  (setq company-dabbrev-downcase nil)
  (global-set-key (kbd "C-M-i") 'company-complete)
  (define-key company-active-map (kbd "C-n") 'company-select-next) ;; Select next or privious candidate with C-n, C-p
  (define-key company-active-map (kbd "C-p") 'company-select-previous)
  (define-key company-search-map (kbd "C-n") 'company-select-next)
  (define-key company-search-map (kbd "C-p") 'company-select-previous)
  (define-key company-active-map (kbd "C-s") 'company-filter-candidates) ;; Narrow down with C-s
  (define-key company-active-map (kbd "C-i") 'company-complete-selection) ;; Determin the candidate with TAB
  (define-key company-active-map [tab] 'company-complete-selection) ;; Determin the candidate with TAB
  (define-key company-active-map (kbd "C-f") 'company-complete-selection) ;; Determin the candidate with C-f
  (define-key emacs-lisp-mode-map (kbd "C-M-i") 'company-complete) ;; Use company-mode completion with C-M-i on various major-mode
  )

使用方法

Language Server のインストール

GitHub – projava17/examples のサンプルコードを例にしています。

最初にmavenのプロジェクトを開きますと、インストールする Language Server を聞かれますので、jdtlsを選択します。(TABキーを押すと自動的に入力されます) Language Serverは自動的にインストールされます。(便利!)

Language Serverのインストールが必要なのは初回のみです。

738_01.jpg

738_02.jpg

Project のインポート

その後、下記のように聞かれますので、”i” を選択します。

ForEachArraySample.java is not part of any project.

i ==> Import project root ~/project/projava17_examples/
I ==> Import project by selecting root directory interactively
. ==> Import project at current directory /home/wurly/project/projava17_examples/part-3/chapter-10-foreach/src/main/java/projava/
d ==> Do not ask again for the current project by adding ~/project/projava17_examples/ to lsp-session-folders-blacklist
D ==> Do not ask again for the current project by selecting ignore path interactively
n ==> Do nothing: ask again when opening other files from the current project

Select action: 

738_03.jpg

使用方法

実際に実行するコマンドについては、前記の init.el 設定中の global-set-key を参照ください。

738_04.jpg

例えば、上記サンプルコードの場合、String にカーソルを置き、lsp-goto-implementation を実行すると、String の実装(implementation)を見ることができます。

(自動的にダウンロード、decompileされるようです。)

また、main 内で dap-java-debug を実行すると実際にプログラムが実行されます。

その他の参考

lsp-mode のキーアサイン等

直接lspは出てきませんが、auto-completeとcompanyの比較など、参考になりました。

私はcompanyを使っていますが、このような選択肢もあるようです。

Copied title and URL