neovim使用nvim-jdtls搭建Java IDE

2023-05-16

nvim-jdtls简介

Neovim for eclipse.jdt.ls 中内置 LSP 支持的扩展。
Neovim (>= 0.6.0) 中对eclipse.jdt.ls的内置语言服务器协议支持的扩展。

该项目遵循KISS 原则,面向对 Neovim、Java 及其构建工具 Maven 或 Gradle 有一定经验的用户,他们更喜欢将配置作为代码而不是 GUI 配置。易于使用不是主要优先事项。

纯内置LSP实现的方式可以参考我之前写的文章:
《neovim内置lsp实现Java语言补全》
https://blog.csdn.net/lxyoucan/article/details/123443937

插件安装

需要 Neovim (>= 0.6.0)
nvim-jdtls 是一个插件。像安装任何其他 Vim 插件一样安装它:
如果使用vim-plug:Plug 'mfussenegger/nvim-jdtls'
如果使用packer.nvim:use 'mfussenegger/nvim-jdtls'

项目主页:
https://github.com/mfussenegger/nvim-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)

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/folder
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

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

配置

要配置 nvim-jdtls, 添加以下内容 ftplugin/java.lua 在 neovim 配置基目录 (示例. ~/.config/nvim/ftplugin/java.lua, 详情见 :help base-directory)。

nvim ~/.config/nvim/ftplugin/java.lua

编辑文件,并且我的内容如下,请根据自己的实现情况调整。
主要就是文件的路径调整。

local config = {
  cmd = {
    "java",
	"-Declipse.application=org.eclipse.jdt.ls.core.id1",
    "-Dosgi.bundles.defaultStartLevel=4",
    "-Declipse.product=org.eclipse.jdt.ls.core.product",
    "-Dlog.protocol=true",
    "-Dlog.level=ALL",
    "-Xms1g",
    "--add-modules=ALL-SYSTEM",
    "--add-opens",
    "java.base/java.util=ALL-UNNAMED",
    "--add-opens",
    "java.base/java.lang=ALL-UNNAMED",
    "-jar",
    "/home/vnc/.local/share/nvim/lsp/jdt-language-server/plugins/org.eclipse.equinox.launcher_1.6.400.v20210924-0641.jar",
    "-configuration",
    "/home/vnc/.local/share/nvim/lsp/jdt-language-server/config_linux",
    "-data",
    "/home/vnc/.local/share/nvim/lsp/jdt-language-server/workspace/folder"
  },
  root_dir = require("jdtls.setup").find_root({".git", "mvnw", "gradlew"}),
  settings = {
    java = {}
  },
  init_options = {
    bundles = {}
  }
}
require("jdtls").start_or_attach(config)

小坑提醒:
org.eclipse.equinox.launcher_1.6.400.v20210924-0641.jar这个jar包的小版本号一直在变,不要忘记调整了,我之前就因为这个版本号浪费了好久排错。

为了方便大家理解每行配置的意思,我把配置做了注释,主要源于官方文档的翻译。
当心💀,它表示你必须调整一些东西。

-- 查看 `:help vim.lsp.start_client` 了解支持的 `config` 选项的概述。
local config = {
  	-- 启动语言服务器的命令
    -- See: https://github.com/eclipse/eclipse.jdt.ls#running-from-the-command-line
  cmd = {

    -- 💀
    'java', -- 或者绝对路径 '/path/to/java11_or_newer/bin/java'
            -- 取决于 `java` 是否在您的 $PATH 环境变量中以及它是否指向正确的版本。

    '-Declipse.application=org.eclipse.jdt.ls.core.id1',
    '-Dosgi.bundles.defaultStartLevel=4',
    '-Declipse.product=org.eclipse.jdt.ls.core.product',
    '-Dlog.protocol=true',
    '-Dlog.level=ALL',
    '-Xms1g',
    '--add-modules=ALL-SYSTEM',
    '--add-opens', 'java.base/java.util=ALL-UNNAMED',
    '--add-opens', 'java.base/java.lang=ALL-UNNAMED',

    -- 💀
    --'-jar', '/path/to/jdtls_install_location/plugins/org.eclipse.equinox.launcher_VERSION_NUMBER.jar',
           -- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^                                       ^^^^^^^^^^^^^^
           -- 必须指向                                                               修改这里为
           -- eclipse.jdt.ls 安装路径                                                实际版本

	'-jar', '/home/vnc/.local/share/nvim/lsp/jdt-language-server/plugins/org.eclipse.equinox.launcher_1.6.400.v20210924-0641.jar',

    -- 💀
    --'-configuration', '/path/to/jdtls_install_location/config_SYSTEM',
                      -- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^        ^^^^^^
                      -- Must point to the                      Change to one of `linux`, `win` or `mac`
                      -- eclipse.jdt.ls installation            Depending on your system.
    --这里是我们上面解压的jdt-language-server绝对路径,我这里是linux,请根据系统类型调整
	'-configuration', '/home/vnc/.local/share/nvim/lsp/jdt-language-server/config_linux',

    -- 💀
    -- 请参阅 README 中的“数据目录配置”部分
    '-data', '/home/vnc/.local/share/nvim/lsp/jdt-language-server/workspace/folder'
  },

  -- 💀
  -- 这是默认设置,如果未提供,您可以将其删除。 或根据需要进行调整。
  -- 每个唯一的 root_dir 将启动一个专用的 LSP 服务器和客户端
  root_dir = require('jdtls.setup').find_root({'.git', 'mvnw', 'gradlew'}),

  -- 这里可以配置eclipse.jdt.ls具体设置
  -- See https://github.com/eclipse/eclipse.jdt.ls/wiki/Running-the-JAVA-LS-server-from-the-command-line#initialize-request
  -- 选项列表
  settings = {
    java = {
    }
  },

  -- Language server `initializationOptions`
  -- 您需要使用 jar 文件的路径扩展 `bundles`
  -- 如果你想使用额外的 eclipse.jdt.ls 插件。
  --
  -- See https://github.com/mfussenegger/nvim-jdtls#java-debug-installation
  --
  -- 如果您不打算使用调试器或其他 eclipse.jdt.ls 插件,您可以删除它
  init_options = {
    bundles = {}
  },
}
-- 这将启动一个新的客户端和服务器,
-- 或根据 `root_dir` 附加到现有的客户端和服务器。
require('jdtls').start_or_attach(config)

在这里插入图片描述

nvim-lspconfig 和 nvim-jdtls 的区别

nvim-lspconfig 和 nvim-jdtls 都使用 neovim 内置的客户端:

  ┌────────────┐           ┌────────────────┐
  │ nvim-jdtls │           │ nvim-lspconfig │
  └────────────┘           └────────────────┘
       |                         |
      start_or_attach           nvim_lsp.jdtls.setup
       │                              |
       │                             setup java filetype hook
       │    ┌─────────┐                  │
       └───►│ vim.lsp │◄─────────────────┘
            └─────────┘
                .start_client
                .buf_attach_client

两者之间的一些区别:

  • lspconfig自身setup创建一个java filetype钩子,并cmdconfig.
  • nvim-jdtls将选择何时调用start_or_attach给用户。
  • nvim-jdtls添加一些逻辑来处理jdt://URI。这些是从第三方库或 JDK 加载源代码所必需的。
  • nvim-jdtls添加一些额外的处理程序并设置相同的额外功能以启用所有扩展。
    您可以使用其中任何一个来启动eclipse.jdt.ls客户端,但建议使用start_or_attachfrom 方法,nvim-jdtls因为它配置了额外的功能以及jdt://URI 处理。

对于 java,您不能同时使用两者。您最终会得到两个客户端和两个语言服务器实例。

用法

nvim-jdtls扩展了 Neovim 中内置 LSP 支持的功能,因此中提到的所有功能:help lsp都可以使用。

nvim-jdtls为您想要创建额外映射的人提供了一些附加功能:

nnoremap <A-o> <Cmd>lua require'jdtls'.organize_imports()<CR>
nnoremap crv <Cmd>lua require('jdtls').extract_variable()<CR>
vnoremap crv <Esc><Cmd>lua require('jdtls').extract_variable(true)<CR>
nnoremap crc <Cmd>lua require('jdtls').extract_constant()<CR>
vnoremap crc <Esc><Cmd>lua require('jdtls').extract_constant(true)<CR>
vnoremap crm <Esc><Cmd>lua require('jdtls').extract_method(true)<CR>


-- If using nvim-dap
-- This requires java-debug and vscode-java-test bundles, see install steps in this README further below.
nnoremap <leader>df <Cmd>lua require'jdtls'.test_class()<CR>
nnoremap <leader>dn <Cmd>lua require'jdtls'.test_nearest_method()<CR>

Lombok支持

使用过Spring Boot开发的工程师,对Lombok应该不陌生吧。这个小插件可以让我们的代码变的简洁。用了以后就回不去的插件。在IDEA中使用都是正常的,用vim开发显示不正常就很难受了。
如下图所示:

在这里插入图片描述

cd /home/vnc/.local/share/nvim/lsp/jdt-language-server
#下载lombok.jar
wget https://projectlombok.org/downloads/lombok.jar

最终我们得到的路径是/home/vnc/.local/share/nvim/lsp/jdt-language-server/lombok.jar

我们在-jar参数前面加入以下几行配置:

"-javaagent",
"/home/vnc/.local/share/nvim/lsp/jdt-language-server/lombok.jar",
"-Xbootclasspath/a",
"/home/vnc/.local/share/nvim/lsp/jdt-language-server/lombok.jar",

如下加粗部分
“–add-opens”,
“java.base/java.util=ALL-UNNAMED”,
“–add-opens”,
“java.base/java.lang=ALL-UNNAMED”,
"-javaagent:/home/vnc/.local/share/nvim/lsp/jdt-language-server/lombok.jar",
“-Xbootclasspath/a:/home/vnc/.local/share/nvim/lsp/jdt-language-server/lombok.jar”,

“-jar”,
“/home/vnc/.local/share/nvim/lsp/jdt-language-server/plugins/org.eclipse.equinox.launcher_1.6.400.v20210924-0641.jar”,

一定要在-jar前面加,不然会出错。
参考:
https://github.com/mfussenegger/nvim-jdtls/issues/28

完成以后不报错了,代码简洁。真舒服!!!
在这里插入图片描述

我的配置分享

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

  • <space>rn变量重命名
  • <leader>f代码格式化
  • 保存自动格式化
  • <A-o>自动导入全部缺失的包
    等等。

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

local config = {
  cmd = {
    "java",
    "-Declipse.application=org.eclipse.jdt.ls.core.id1",
    "-Dosgi.bundles.defaultStartLevel=4",
    "-Declipse.product=org.eclipse.jdt.ls.core.product",
    "-Dlog.protocol=true",
    "-Dlog.level=ALL",
    "-Xms1g",
    "--add-modules=ALL-SYSTEM",
    "--add-opens",
    "java.base/java.util=ALL-UNNAMED",
    "--add-opens",
    "java.base/java.lang=ALL-UNNAMED",
    --增加lombok插件支持,getter setter good bye
    "-javaagent:/home/vnc/.local/share/nvim/lsp/jdt-language-server/lombok.jar",
    "-Xbootclasspath/a:/home/vnc/.local/share/nvim/lsp/jdt-language-server/lombok.jar",
    "-jar",
    "/home/vnc/.local/share/nvim/lsp/jdt-language-server/plugins/org.eclipse.equinox.launcher_1.6.400.v20210924-0641.jar",
    "-configuration",
    "/home/vnc/.local/share/nvim/lsp/jdt-language-server/config_linux",
    "-data",
    "/home/vnc/.local/share/nvim/lsp/jdt-language-server/workspace/folder"
  },
  root_dir = require("jdtls.setup").find_root({".git", "mvnw", "gradlew"}),
  settings = {
    java = {}
  },
  init_options = {
    bundles = {}
  }
}
require("jdtls").start_or_attach(config)

local current_buff = vim.api.nvim_get_current_buf
-- 在语言服务器附加到当前缓冲区之后
-- 使用 on_attach 函数仅映射以下键
local java_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)
  buf_set_keymap("n", "<leader>l", "<cmd>lua vim.lsp.buf.formatting()<CR>", opts)
  buf_set_keymap("n", "<leader>l", "<cmd>lua vim.lsp.buf.formatting()<CR>", opts)
  --自动导入全部缺失的包,自动删除多余的未用到的包
  buf_set_keymap("n", "<A-o>", "<cmd>lua require'jdtls'.organize_imports()<CR>", opts)
  --引入局部变量的函数 function to introduce a local variable
  buf_set_keymap("n", "crv", "<cmd>lua require('jdtls').extract_variable()<CR>", opts)
  buf_set_keymap("v", "crv", "<Esc><Cmd>lua require('jdtls').extract_variable(true)<CR>", opts)
  --function to extract a constant
  buf_set_keymap("n", "crc", "<Cmd>lua require('jdtls').extract_constant()<CR>", opts)
  buf_set_keymap("v", "crc", "<Esc><Cmd>lua require('jdtls').extract_constant(true)<CR>", opts)
  --将一段代码提取成一个额外的函数function to extract a block of code into a method
  buf_set_keymap("v", "crm", "<Esc><Cmd>lua require('jdtls').extract_method(true)<CR>", opts)

  -- 代码保存自动格式化formatting
  vim.api.nvim_command [[autocmd BufWritePre <buffer> lua vim.lsp.buf.formatting_seq_sync()]]
end

java_on_attach(nil, current_buff)

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

neovim使用nvim-jdtls搭建Java IDE 的相关文章

  • HTTP 状态 404 - 请求的资源不可用

    在使用 MyEclipse IDE 中的 Tomcat 服务器和 Struts 2 框架时 我遇到了反复出现的问题 我将我的程序作为服务器应用程序运行 当它运行时 默认的index jsp 文件将成功打开 但应用程序的其他过去都不起作用 当
  • 是否可以在 Spring Batch 中结合分区和并行步骤?

    我只是想知道它在 Spring Batch 中可行吗 Step1Step2 流程 gt 流程1 流程2 流程3 Step3 其中每个flow1 gt 划分为 5 个 GridSizeflow2 gt 划分为 5 个 GridSizeflow
  • java中的csv到pdf文件

    我正在尝试获得一个csv文件解析为pdf 到目前为止我所拥有的内容附在下面 我的问题是这段代码最终出现在 pdf 中的文件在 csv 文件的第一行被截断 我不明白为什么 附示例 本质上我想要一个没有任何操作的 csv 文件的 pdf 版本
  • 如何在 Eclipse 中用阿拉伯语读写

    我在 eclipse 中编写了这段代码来获取一些阿拉伯语单词 然后打印它们 public class getString public static void main String args throws Exception PrintS
  • Java 创建浮雕(红/蓝图像)

    我正在编写一个 Java 游戏引擎 http victoryengine org http victoryengine org 并且我一直在尝试生成具有深度的 3D 图像 您可以使用那些红色 蓝色眼镜看到 我正在使用 Java2D 进行图形
  • 如何解决 onEditCommit 事件上的类型不匹配错误?

    我在 Fxml 中使用 onEditCommit 事件在用户编辑数据后检索数据 FXML 代码
  • Android - 除了普通 SSL 证书之外还验证自签名证书

    我有一个通过 SSL 调用 Web 服务的 Android 应用程序 在生产中 我们将拥有由受信任的 CA 签名的普通 SSL 证书 但是 我们需要能够支持自签名证书 由我们自己的 CA 签名 我已经成功实施了接受自签名证书的建议解决方案
  • 服务器到 Firebase HTTP POST 结果为响应消息 200

    使用 Java 代码 向下滚动查看 我使用 FCM 向我的 Android 发送通知消息 当提供正确的服务器密钥令牌时 我收到如下所示的响应消息 之后从 FCM 收到以下响应消息 Response 200 Success Message m
  • spring - 强制 @Autowired 字段的 cglib 代理

    我有混合堆栈 EJB 和 Spring 为了将 Spring 自动装配到 EJB 我使用SpringBeanAutowiringInterceptor 不确定这是否会影响我遇到的问题 在尝试通过以下方式自动装配 bean 时 Scope p
  • 场景生成器删除 fxml 文件中的导入

    我使用场景构建器 Gluon Scene Builder JavaFX Scene Builder 8 1 1 来创建应用程序的 UI 并使用 Eclipse 开发 JavaFX 现在 每次我在场景生成器中保存某些内容时 它都会从 fxml
  • 所有junit测试后的清理

    在我的项目中 我必须在所有测试之前进行一些存储库设置 这是使用一些棘手的静态规则来完成的 然而 在所有测试之后我不知道如何进行清理 我不想保留一些神奇的静态数字来引用所有测试方法的数量 我应该一直维护它 最受赞赏的方法是添加一些侦听器 该侦
  • Java替换特定字符

    这是我在这个网站上的第一个问题 所以我会尽量不要成为一个十足的菜鸟 我目前正在用java 创建刽子手游戏 所以我问你的问题是我们是否被赋予了 幽灵 这个词 并将 Ghost 替换为 hiddenWord ghost length for i
  • 使用 Guava 联合两个 ImmutableEnumSets

    我想联合两个ImmutableEnumSets来自番石榴 这是我的尝试 public final class OurColors public enum Colors RED GREEN BLUE YELLOW PINK BLACK pub
  • 尝试在没有 GatewayIntent 的情况下访问消息内容

    我希望每当我写一条打招呼的消息时 机器人都会在控制台中响应一条消息 但它只是给我一个错误 JDA MainWS ReadThread WARN JDA Attempting to access message content without
  • ExceptionHandler 不适用于 Throwable

    我们的应用程序是基于 Spring MVC 的 REST 应用程序 我正在尝试使用 ExceptionHandler 注释来处理所有错误和异常 I have ExceptionHandler Throwable class public R
  • 如何移动图像(动画)?

    我正在尝试在 x 轴上移动船 还没有键盘 我如何将运动 动画与boat png而不是任何其他图像 public class Mama extends Applet implements Runnable int width height i
  • struts 教程或示例

    我正在尝试在 Struts 中制作一个登录页面 这个想法是验证用户是否存在等 然后如果有错误 则返回到登录页面 错误显示为红色 典型的登录或任何表单页面验证 我想知道是否有人知道 Struts 中的错误管理教程 我正在专门寻找有关的教程 或
  • 从一个文本文件中获取数据并将其移动到新的文本文件

    我有一个文件 里面有数据 在我的主要方法中 我读入文件并关闭文件 我调用另一种方法 在原始文件的同一文件夹内创建一个新文件 所以现在我有两个文件 原始文件和通过我调用的方法生成的文件 我需要另一种方法 从原始文件中获取数据并将其写入创建的新
  • 如何将实例变量传递到 Quartz 作业中?

    我想知道如何在 Quartz 中外部传递实例变量 下面是我想写的伪代码 如何将 externalInstance 传递到此作业中 public class SimpleJob implements Job Override public v
  • 尝试使用带有有效购买令牌的 Java Google Play Developer API v3 检索应用内购买信息时出现错误请求(无效值)

    当使用 Java Google Play Developer API 版本 3 并请求有效购买令牌的购买信息时 我收到以下异常 API 调用返回 400 Bad Request 响应以及以下消息 code 400 errors domain

随机推荐

  • 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 可以使
  • neovim使用nvim-jdtls搭建Java IDE

    nvim jdtls简介 Neovim for eclipse jdt ls 中内置 LSP 支持的扩展 Neovim gt 61 0 6 0 中对eclipse jdt ls的内置语言服务器协议支持的扩展 该项目遵循KISS 原则 xff