Saturday, July 25, 2026

Kombinasi NVIM + Telescope + JDTLS

 Akhir-akhir aku resah karena Notepad++ terlalu berat dan begitu juga VSCodium (Open Source dari Visual Studio Code).

Jadi aku menggunakan  NeoVIM dengan kombinasi berikut: 
- telescope untuk mencari file (akan muncul semacam explorer di mana bisa memilih serta preview berkas; 

- jdtls sehingga bisa mencari implementasi file


Yang pertama tentunya dengan menginstall Neovim: 
https://neovim.io/

Setelah itu install lazy, semacam package manager untuk neovim. 


Untuk Telescope
- Ripgrep (mirip grep) 

- Sharkdp FD (alternative find)

- lua

Di folder %LOCALAPPDATA% (alias Local Settings\Application Data) akan ada dua folder:
- nvim (ini konfigurasi nvim)

- nvim-data 


Di folder nvim ada: 

./init.lua
./lua
./lua/java.lua



Saat ini isi init.lua :

local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"

if not vim.loop.fs_stat(lazypath) then
    error("lazy.nvim belum terinstall")
end

vim.opt.rtp:prepend(lazypath)

require("lazy").setup({
{
    "nvim-telescope/telescope.nvim",
    dependencies = {
        "nvim-lua/plenary.nvim",
    },

    {
        "neovim/nvim-lspconfig",
    },

    {
        "mfussenegger/nvim-jdtls",
    },
},
})

require("telescope").setup()

local builtin = require("telescope.builtin")

vim.keymap.set("n", "<leader>ff", builtin.find_files)
vim.keymap.set("n", "<leader>fg", builtin.live_grep)
vim.keymap.set("n", "<leader>fb", builtin.buffers)
vim.keymap.set("n", "<leader>fh", builtin.help_tags)

vim.api.nvim_create_autocmd("FileType", {
    pattern = "java",
    callback = function()
        require("java")
    end,
})


Sementara isi lua/java.lua  berisi hal yang hanya untuk java

local jdtls = require("jdtls")

local home = os.getenv("USERPROFILE")

local root_markers = {
    ".git",
    "mvnw",
    "gradlew",
    "pom.xml",
    "build.gradle",
}

local root_dir = require("jdtls.setup").find_root(root_markers)

if root_dir == "" then
    vim.notify("Root project tidak ditemukan")
    return
end

local workspace_dir =
    home .. "\\jdtls-workspace\\" .. vim.fn.fnamemodify(root_dir, ":p:h:t")

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=WARN",

        "-Xms1g",

        "--add-modules=ALL-SYSTEM",
        "--add-opens", "java.base/java.util=ALL-UNNAMED",
        "--add-opens", "java.base/java.lang=ALL-UNNAMED",

        "-jar",
        "C:\\Tools\\jdtls\\plugins\\org.eclipse.equinox.launcher_1.6.900.v20240613-2009.jar",

        "-configuration",
        "C:\\Tools\\jdtls\\config_win",

        "-data",
        workspace_dir,
    },

    root_dir = root_dir,
}

print(vim.inspect(config.cmd))
print("root_dir = " .. tostring(root_dir))
print("workspace = " .. workspace_dir)


jdtls.start_or_attach(config)

local opts = { buffer = 0 }

vim.keymap.set("n", "gd", vim.lsp.buf.definition, opts)
vim.keymap.set("n", "gr", vim.lsp.buf.references, opts)
vim.keymap.set("n", "gi", vim.lsp.buf.implementation, opts)
vim.keymap.set("n", "K", vim.lsp.buf.hover, opts)
vim.keymap.set("n", "<leader>rn", vim.lsp.buf.rename, opts)
vim.keymap.set("n", "<leader>ca", vim.lsp.buf.code_action, opts)


Jadi sekarang jika ada kebutuhan edit file khusus, saya lebih sering pakai nvim. 

Berikut contoh cara install. Sekedar catatan, langkah berikut dibuat oleh ChatGPT tanpa saya verifikasi ulang


1. Install Neovim

Download:

https://github.com/neovim/neovim/releases

Pastikan nvim.exe sudah berada di PATH.

Verifikasi:

nvim --version

2. Install Git

Lazy.nvim memerlukan Git.

git --version

3. Install ripgrep

Download:

https://github.com/BurntSushi/ripgrep/releases

Tambahkan ke PATH.

Verifikasi:

rg --version

4. Install fd

Download:

https://github.com/sharkdp/fd/releases

Tambahkan ke PATH.

Verifikasi:

fd --version

5. Install Java

Gunakan JDK 21 atau lebih baru.

Verifikasi:

java -version
javac -version

6. Install Lazy.nvim

Clone ke direktori standar Neovim.

git clone https://github.com/folke/lazy.nvim `
    "$env:LOCALAPPDATA\nvim-data\lazy\lazy.nvim"

7. Struktur konfigurasi

AppData
└── Local
    └── nvim
        │ init.lua
        └── lua
            ├── config
            └── plugins

8. init.lua

Tambahkan bootstrap Lazy.

vim.g.mapleader = " "

local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"

vim.opt.rtp:prepend(lazypath)

require("lazy").setup("plugins")

9. Install Telescope

lua/plugins/telescope.lua

return {
    "nvim-telescope/telescope.nvim",
    dependencies = {
        "nvim-lua/plenary.nvim",
    },
}

Sync plugin.

:Lazy sync

10. Shortcut Telescope

Misalnya:

vim.keymap.set("n", "<leader>ff",
    "<cmd>Telescope find_files<CR>")

vim.keymap.set("n", "<leader>fg",
    "<cmd>Telescope live_grep<CR>")

11. Install Eclipse JDTLS

Download dari:

https://download.eclipse.org/jdtls/snapshots/

Misalnya diekstrak ke:

C:\Tools\jdtls

Pastikan terdapat:

plugins\
config_win\

12. Install nvim-jdtls

Tambahkan plugin.

return {
    "mfussenegger/nvim-jdtls",
}

Lalu:

:Lazy sync

13. Konfigurasi java.lua

Buat:

lua/java.lua

Contoh penting:

local jdtls = require("jdtls")

local root = vim.fs.root(0, {
    ".git",
    "pom.xml",
    "gradlew",
})

local workspace =
    vim.fn.expand("~/jdtls-workspace/")
    .. vim.fn.fnamemodify(root, ":t")

local launcher =
    vim.fn.glob(
        "C:/Tools/jdtls/plugins/org.eclipse.equinox.launcher_*.jar"
    )

local config = {
    cmd = {
        "java",
        "-Declipse.application=org.eclipse.jdt.ls.core.id1",
        "-Declipse.product=org.eclipse.jdt.ls.core.product",
        "-Dosgi.bundles.defaultStartLevel=4",
        "-Dlog.protocol=true",
        "-Dlog.level=WARN",
        "-Xms1g",
        "--add-modules=ALL-SYSTEM",
        "--add-opens",
        "java.base/java.util=ALL-UNNAMED",
        "--add-opens",
        "java.base/java.lang=ALL-UNNAMED",
        "-jar",
        launcher,
        "-configuration",
        "C:/Tools/jdtls/config_win",
        "-data",
        workspace,
    },

    root_dir = root,
}

jdtls.start_or_attach(config)

14. Load otomatis

Di init.lua

vim.api.nvim_create_autocmd("FileType", {
    pattern = "java",
    callback = function()
        require("java")
    end,
})

15. Keymap LSP

vim.keymap.set("n", "gd", vim.lsp.buf.definition)
vim.keymap.set("n", "gi", vim.lsp.buf.implementation)
vim.keymap.set("n", "gr", vim.lsp.buf.references)
vim.keymap.set("n", "grn", vim.lsp.buf.rename)
vim.keymap.set("n", "gra", vim.lsp.buf.code_action)

16. Memeriksa status LSP

:checkhealth vim.lsp

Harus muncul:

Active Clients

jdtls

17. Shortcut yang berguna

ShortcutFungsi
gdGo to Definition
giGo to Implementation
grFind References
grnRename Symbol
graCode Action
<leader>ffTelescope Find Files
<leader>fgLive Grep
Ctrl-oKembali ke lokasi sebelumnya
Ctrl-iMaju lagi

18. Troubleshooting

Jika JDTLS tidak berjalan:

  • pastikan java -version benar
  • pastikan org.eclipse.equinox.launcher_*.jar ditemukan
  • pastikan config_win benar
  • cek:
:checkhealth vim.lsp
  • lihat log:
C:\Users\<user>\AppData\Local\nvim-data\lsp.log

Dengan konfigurasi ini, Neovim sudah siap digunakan sebagai IDE Java yang ringan namun kaya fitur, dengan navigasi kode melalui JDTLS, pencarian file menggunakan Telescope, dan manajemen plugin melalui Lazy.nvim.

0 comments: