您当前的位置: 首页 >  Java

ITKEY_

暂无认证

  • 0浏览

    0关注

    732博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

neovim内置lsp实现Java语言补全

ITKEY_ 发布时间:2022-03-12 18:45:25 ,浏览量:0

在这里插入图片描述

文章目录
  • 通用方式自动化配置Java LSP
  • 手动配置
    • JDK版本选择
    • 配置
      • 解压jdt-language-server
      • 配置环境变量
    • 我的配置分享
  • neovim使用nvim-jdtls搭建Java IDE

通用方式自动化配置Java LSP

可以使用以下插件自动化配置。推荐新手使用这个方法。 https://github.com/williamboman/nvim-lsp-installer 这个方式简单方便,适应于大部分朋友。

这个方便可以参考《09_[nvim0.5+从0单排]_nvim内置lsp搭建python IDE》 https://blog.csdn.net/lxyoucan/article/details/120708396 本文就不重点介绍了。比起傻瓜式的配置,有不少朋友喜欢手动配置,毕竟这样更有挑战,更干净。

手动配置

手动配置的话,有两个lsp可供选择:

  • https://github.com/georgewfraser/java-language-server
  • https://projects.eclipse.org/projects/eclipse.jdt.ls

两种方式都行,我选择的是eclipse.jdt.ls,为什么选这个。其实我没有去进行对比,只是主观的感觉eclipse毕竟深耕多年,感觉更可靠的感觉。感觉以前我使用coc的时候也用的是eclipse.jdt.ls

那么我们主要就是参考这篇文档来手动配置: https://github.com/neovim/nvim-lspconfig/blob/master/doc/server_configurations.md#jdtls

JDK版本选择

这里有一个小坑,就是JDK的版本要选择JDK11及以上版本才行。因为就目前来看,JDK8使用的概率还是非常高的。

如果你使用JDK8,使用java文件会报如下的错误: Client 1 quit with exit code 1 and signal 0

推荐使用JDK11,因为我实测JDK11是正常使用的,其他版本的JDK我没有一一测试。 我的版本信息如下:

java -version
java version "11.0.10" 2021-01-19 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.10+8-LTS-162)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.10+8-LTS-162, mixed mode)
配置 解压jdt-language-server

下载jdt-language-server 不同版本下载导航 https://download.eclipse.org/jdtls/milestones/?d 我最终下载的版本是:

https://download.eclipse.org/jdtls/milestones/1.9.0/jdt-language-server-1.9.0-202203031534.tar.gz

以下我的路径是个人喜好,可以根据自己的实际情况修改保存路径:

#创建workspace目录,后面会用到
mkdir -p ~/.local/share/nvim/lsp/jdt-language-server/workspace
cd ~/.local/share/nvim/lsp/jdt-language-server
# 下载jdt-language-server-xxxxx.tar.gz
wget https://download.eclipse.org/jdtls/milestones/1.9.0/jdt-language-server-1.9.0-202203031534.tar.gz
# 解压
tar -zxvf jdt-language-server-1.9.0-202203031534.tar.gz

我的目录结构如下图所示 在这里插入图片描述

配置环境变量

修改你的环境变量配置文件,bash的配置文件是nvim ~/.bashrc 如果你用的是zsh则nvim ~/.zshrc

#Java LSP
# 必须配置的:
export JDTLS_HOME=$HOME/.local/share/nvim/lsp/jdt-language-server/ 			# 包含 plugin 和 configs 的目录,由jdt-language-server-xxx.tar.gz解压出的
# 可选的
export WORKSPACE=$HOME/.local/share/nvim/lsp/jdt-language-server/workspace/ # 不设置则默认是$HOME/workspace
export JAVA_HOME=$HOME/.jdks/corretto-11.0.14.1/ 							#JDK的主目录,建议使用JDK11,使用JDK8会报错
export PATH=$JAVA_HOME/bin:$PATH:.

在你的lua配置中增加以下一行配置:

  -- init.lua
  require'lspconfig'.jdtls.setup{}

至此Java语言补全已经成功配置完成了,是不是挺简单的。

打开项目在状态栏中会显示lsp server的加载状态,稍等片刻等它加载完成了,我们就可以语法提示啦。 在这里插入图片描述 语法检查也没有问题的。 在这里插入图片描述 至此最基本的配置就结束了。

我的配置分享

每个人的使用习惯都不相同,我把常用的快捷键进行了映射,供大家参考。

  • rn变量重命名
  • f代码格式化
  • 保存自动格式化 等等。

我的配置文件:~/.config/nvim/lua/lspconf/java.lua 全部内容如下,仅大家参考:

-- init.lua
local nvim_lsp = require("lspconfig")
-- 在语言服务器附加到当前缓冲区之后
-- 使用 on_attach 函数仅映射以下键
Itkey_on_attach = function(client, bufnr)
  local function buf_set_keymap(...)
    vim.api.nvim_buf_set_keymap(bufnr, ...)
  end
  local function buf_set_option(...)
    vim.api.nvim_buf_set_option(bufnr, ...)
  end

  --Enable completion triggered by 
  buf_set_option("omnifunc", "v:lua.vim.lsp.omnifunc")
  -- Mappings.
  local opts = {noremap = true, silent = true}
  -- See `:help vim.lsp.*` for documentation on any of the below functions
  buf_set_keymap("n", "gD", "lua vim.lsp.buf.declaration()", opts)
  buf_set_keymap("n", "gd", "lua vim.lsp.buf.definition()", opts)
  --buf_set_keymap('n', 'K', 'lua vim.lsp.buf.hover()', opts)
  buf_set_keymap("n", "gi", "lua vim.lsp.buf.implementation()", opts)
  --buf_set_keymap('i', '', 'lua vim.lsp.buf.signature_help()', opts)
  buf_set_keymap("n", "wa", "lua vim.lsp.buf.add_workspace_folder()", opts)
  buf_set_keymap("n", "wr", "lua vim.lsp.buf.remove_workspace_folder()", opts)
  buf_set_keymap("n", "wl", "lua print(vim.inspect(vim.lsp.buf.list_workspace_folders()))", opts)
  buf_set_keymap("n", "D", "lua vim.lsp.buf.type_definition()", opts)
  --重命名
  buf_set_keymap("n", "rn", "lua vim.lsp.buf.rename()", opts)
  --智能提醒,比如:自动导包 已经用lspsaga里的功能替换了
  --buf_set_keymap('n', 'ca', 'lua vim.lsp.buf.code_action()', opts)
  buf_set_keymap("n", "gr", "lua vim.lsp.buf.references()", opts)
  buf_set_keymap("n", "e", "lua vim.lsp.diagnostic.show_line_diagnostics()", opts)
  --buf_set_keymap('n', '', 'lua vim.lsp.diagnostic.goto_prev()', opts)
  buf_set_keymap("n", "", "lua vim.lsp.diagnostic.goto_next()", opts)
  buf_set_keymap("n", "q", "lua vim.lsp.diagnostic.set_loclist()", opts)
  buf_set_keymap("n", "f", "lua vim.lsp.buf.formatting()", opts)

  -- 代码保存自动格式化formatting
  if client.resolved_capabilities.document_formatting then
    vim.api.nvim_command [[autocmd BufWritePre  lua vim.lsp.buf.formatting_seq_sync()]]
  end
end

-- Add additional capabilities supported by nvim-cmp
local capabilities = vim.lsp.protocol.make_client_capabilities()
capabilities.textDocument.completion.completionItem.documentationFormat = {"markdown", "plaintext"}
capabilities.textDocument.completion.completionItem.snippetSupport = true
capabilities.textDocument.completion.completionItem.preselectSupport = true
capabilities.textDocument.completion.completionItem.insertReplaceSupport = true
capabilities.textDocument.completion.completionItem.labelDetailsSupport = true
capabilities.textDocument.completion.completionItem.deprecatedSupport = true
capabilities.textDocument.completion.completionItem.commitCharactersSupport = true
capabilities.textDocument.completion.completionItem.tagSupport = {valueSet = {1}}
capabilities.textDocument.completion.completionItem.resolveSupport = {
  properties = {
    "documentation",
    "detail",
    "additionalTextEdits"
  }
}
Itkey_capabilities = capabilities

require "lspconfig".jdtls.setup {
  on_attach = Itkey_on_attach,
  capabilities = Itkey_capabilities
}

neovim使用nvim-jdtls搭建Java IDE

https://blog.csdn.net/lxyoucan/article/details/123448313

关注
打赏
1665243900
查看更多评论
立即登录/注册

微信扫码登录

0.0433s