neovim内置lsp实现Java语言补全

2023-05-16

在这里插入图片描述

文章目录

  • 通用方式自动化配置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的加载状态,稍等片刻等它加载完成了,我们就可以语法提示啦。
在这里插入图片描述
语法检查也没有问题的。
在这里插入图片描述
至此最基本的配置就结束了。


我的配置分享

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

  • <space>rn变量重命名
  • <leader>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 <c-x><c-o>
  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", "<Cmd>lua vim.lsp.buf.declaration()<CR>", opts)
  buf_set_keymap("n", "gd", "<Cmd>lua vim.lsp.buf.definition()<CR>", opts)
  --buf_set_keymap('n', 'K', '<Cmd>lua vim.lsp.buf.hover()<CR>', opts)
  buf_set_keymap("n", "gi", "<cmd>lua vim.lsp.buf.implementation()<CR>", opts)
  --buf_set_keymap('i', '<C-k>', '<cmd>lua vim.lsp.buf.signature_help()<CR>', opts)
  buf_set_keymap("n", "<space>wa", "<cmd>lua vim.lsp.buf.add_workspace_folder()<CR>", opts)
  buf_set_keymap("n", "<space>wr", "<cmd>lua vim.lsp.buf.remove_workspace_folder()<CR>", opts)
  buf_set_keymap("n", "<space>wl", "<cmd>lua print(vim.inspect(vim.lsp.buf.list_workspace_folders()))<CR>", opts)
  buf_set_keymap("n", "<space>D", "<cmd>lua vim.lsp.buf.type_definition()<CR>", opts)
  --重命名
  buf_set_keymap("n", "<space>rn", "<cmd>lua vim.lsp.buf.rename()<CR>", opts)
  --智能提醒,比如:自动导包 已经用lspsaga里的功能替换了
  --buf_set_keymap('n', '<space>ca', '<cmd>lua vim.lsp.buf.code_action()<CR>', opts)
  buf_set_keymap("n", "gr", "<cmd>lua vim.lsp.buf.references()<CR>", opts)
  buf_set_keymap("n", "<space>e", "<cmd>lua vim.lsp.diagnostic.show_line_diagnostics()<CR>", opts)
  --buf_set_keymap('n', '<C-j>', '<cmd>lua vim.lsp.diagnostic.goto_prev()<CR>', opts)
  buf_set_keymap("n", "<S-C-j>", "<cmd>lua vim.lsp.diagnostic.goto_next()<CR>", opts)
  buf_set_keymap("n", "<space>q", "<cmd>lua vim.lsp.diagnostic.set_loclist()<CR>", opts)
  buf_set_keymap("n", "<leader>f", "<cmd>lua vim.lsp.buf.formatting()<CR>", opts)

  -- 代码保存自动格式化formatting
  if client.resolved_capabilities.document_formatting then
    vim.api.nvim_command [[autocmd BufWritePre <buffer> 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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

neovim内置lsp实现Java语言补全 的相关文章

随机推荐

  • React Native android 8以上版本闪退踩坑笔记

    背景 我的android的测试机版本是android 8 xff0c 我使用React Native开发的应用 xff0c 自己测试是正常的 iOS上也是正常的 但是一放到android8以上的版本本就出现了闪退的现象 xff0c 让我非常
  • git push send-pack: unexpected disconnect while reading sideband packet

    错误信息 span class token function git span push 枚举对象中 span class token number 200 span 完成 对象计数中 span class token number 100
  • node.js启动静态页面服务

    安装http server span class token function npm span span class token function install span http server g 启动服务 span class to
  • ssh中远程vim自动切本地输入法

    简介 SshIM 是一个解决ssh中使用vim nvim 中文输入法自动切换插件 原理 xff1a 当ssh中使用的vim 进入insert模式或者离开insert模式 xff0c 都会触发一个事件 当触发事件以后 xff0c 通过http
  • mame0.239选定系统所需要的ROM/磁碟映像档为缺少或不正确

    背景 之前发过一个视频 xff0c 讲MAME怎么配置和使用的 结果有网友反馈说有少部分游戏打开报错 xff0c 不会弄 运气比较好 xff0c 我想玩的ROM基本都可以正常使用 我就很奇怪 xff0c 为什么会报错的呢 xff1f 我怎么
  • Netty核心源码分析(一),Netty的Server端启动过程源码分析

    文章目录 系列文章目录一 Netty的Server端启动过程源码分析1 NioEventLoopGroup的创建 xff08 1 xff09 构造方法 2 ServerBootstrap的创建 xff08 1 xff09 构造方法 xff0
  • Android Emulator安卓模拟器去黑边

    安卓模拟器默认会有一个黑边 xff0c 让它看起来像个手机 但是看久了总感觉太占地方了 去掉黑边 重启完成以后 xff0c 效果如下 xff1a
  • 【视频】iOS开发允许http请求

    APP开发中有时会对接一些比较老的项目 xff0c 老的项目还有一些在使用http的 iOS应用默认情况下不允许请求http xff0c 怎么能让其允许呢 xff1f 视频讲解 https www bilibili com video BV
  • The run destination iPhone 13 is not valid for Running the scheme

    报错信息 The run destination iPhone 13 is not valid for Running the scheme apexedu 原因分析 后来我发现我的项目中的TARGETS中少了一个项目 xff0c 不清楚是
  • xcode Archive菜单是灰色的解决办法

    想把iOS应用打包上传到App Store发现这个菜单是灰色的 原因 后来发现 xff0c 因为我当前的运行环境是iOS模拟器 解决办法 运行设备修改成Any iOS Device arm64 xff0c 菜单就可以正常使用了 参考 htt
  • iterm2(zsh)粘贴慢解决办法

    我在macOS环境中使用的是iterm2终端 xff0c 每次在粘贴大量命令的时间 xff0c 明显感觉粘贴速度慢 就感觉粘贴也是一个字一个字粘贴的 在命令过长时由为明显 本以为是iterm2的原因 xff0c 后来发现原来是因为zsh的原
  • MAME打开ROM报错解决办法

    问 olds100 34 西游释厄传 特别版 版本 100 第 1 套 34 运行报错如何解决 xff1f 答 经过我的研究olds100 zip这个游戏是一个特别版本 它依赖两个文件才可以正常运行 分别是 xff1a olds zip x
  • 【新建Spring Boot项目】Connect to 127.0.0.1:1087 [/127.0.0.1] failed: Connection refused

    背景 我在新建微服务项目的时候 xff0c 使用gradle报错Connect to 127 0 0 1 1087 127 0 0 1 failed Connection refused 然后我检查了一下IDEA的代理设置 xff0c 没有
  • 命令行搜索神器fzf

    文件搜索神器fzf xff0c 名气很大 xff0c 很快 xff0c 很强大 fzf 是一个通用的命令行模糊查找器 它是一个交互式 Unix 命令行过滤器 xff0c 可用于任何列表 xff1b 文件 命令历史 进程 主机名 书签 git
  • docker中搭建nacos集群笔记

    最近在学习nacos xff0c 在本地搭建nacos集群环境 因为电脑配置低 xff0c 所以没有使用vmware虚拟机 xff0c 而是用docker中搭建的 仅是简单的笔记供自己复习查看 nacos相关配置 数据源配置 vim con
  • nginx: [emerg] could not build server_names_hash

    报错信息 nginx emerg could not build server names hash you should increase server names hash bucket size 32 nginx configurat
  • Netty核心源码分析(二),Netty的Server端接收请求过程源码分析

    文章目录 系列文章目录一 连接请求接受过程源码分析1 事件的值2 processSelectedKeys获取事件 xff08 1 xff09 doReadMessages方法 xff08 2 xff09 pipeline的fireChann
  • HAProxy学习笔记

    最近在学习微服务架构 xff0c 里面有用到HAProxy xff0c 记录一下学习笔记 官方网站是 xff1a https www haproxy org 下载安装 推荐使用源码安装 xff0c 因为我用的ubuntu 20 04中本身自
  • 如果在ubuntu上安装mysql client

    ubuntu安装mysql客户端 MySQL 是流行的开源关系数据库管理系统 与服务器交互的程序称为 MySQL 客户端 您可以使用的最基本的客户端是命令行工具 xff0c 通常称为 MySQL 客户端 要在 Ubuntu 20 04 上安
  • neovim内置lsp实现Java语言补全

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