diff --git a/README.md b/README.md
index a16b6f2..46f2d5b 100644
--- a/README.md
+++ b/README.md
@@ -11,5 +11,17 @@ rd -r ~\AppData\Local\nvim-data
git clone https://github.com/NvChad/NvChad ~/.config/nvim --depth 1 && nvim
-##
+## dependencies
+
+```shell
+sudo dnf install fd-find ripgrep ShellCheck luarocks -y
+go install github.com/jesseduffield/lazygit@latest
+sudo npm install -g typescript typescript-language-server
+sudo npm install -g @volar/vue-language-server
+sudo npm install -g eslint_d
+go install github.com/yoheimuta/protolint/cmd/protolint@latest
+go install -v github.com/incu6us/goimports-reviser/v3@latest
+go install github.com/segmentio/golines@latest
+go install mvdan.cc/gofumpt@latest
+```
diff --git a/intellij-java-google-style.xml b/intellij-java-google-style.xml
new file mode 100644
index 0000000..c5af14f
--- /dev/null
+++ b/intellij-java-google-style.xml
@@ -0,0 +1,599 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ xmlns:android
+
+ ^$
+
+
+
+
+
+
+
+
+ xmlns:.*
+
+ ^$
+
+
+ BY_NAME
+
+
+
+
+
+
+ .*:id
+
+ http://schemas.android.com/apk/res/android
+
+
+
+
+
+
+
+
+ style
+
+ ^$
+
+
+
+
+
+
+
+
+ .*
+
+ ^$
+
+
+ BY_NAME
+
+
+
+
+
+
+ .*:.*Style
+
+ http://schemas.android.com/apk/res/android
+
+
+ BY_NAME
+
+
+
+
+
+
+ .*:layout_width
+
+ http://schemas.android.com/apk/res/android
+
+
+
+
+
+
+
+
+ .*:layout_height
+
+ http://schemas.android.com/apk/res/android
+
+
+
+
+
+
+
+
+ .*:layout_weight
+
+ http://schemas.android.com/apk/res/android
+
+
+
+
+
+
+
+
+ .*:layout_margin
+
+ http://schemas.android.com/apk/res/android
+
+
+
+
+
+
+
+
+ .*:layout_marginTop
+
+ http://schemas.android.com/apk/res/android
+
+
+
+
+
+
+
+
+ .*:layout_marginBottom
+
+ http://schemas.android.com/apk/res/android
+
+
+
+
+
+
+
+
+ .*:layout_marginStart
+
+ http://schemas.android.com/apk/res/android
+
+
+
+
+
+
+
+
+ .*:layout_marginEnd
+
+ http://schemas.android.com/apk/res/android
+
+
+
+
+
+
+
+
+ .*:layout_marginLeft
+
+ http://schemas.android.com/apk/res/android
+
+
+
+
+
+
+
+
+ .*:layout_marginRight
+
+ http://schemas.android.com/apk/res/android
+
+
+
+
+
+
+
+
+ .*:layout_.*
+
+ http://schemas.android.com/apk/res/android
+
+
+ BY_NAME
+
+
+
+
+
+
+ .*:padding
+
+ http://schemas.android.com/apk/res/android
+
+
+
+
+
+
+
+
+ .*:paddingTop
+
+ http://schemas.android.com/apk/res/android
+
+
+
+
+
+
+
+
+ .*:paddingBottom
+
+ http://schemas.android.com/apk/res/android
+
+
+
+
+
+
+
+
+ .*:paddingStart
+
+ http://schemas.android.com/apk/res/android
+
+
+
+
+
+
+
+
+ .*:paddingEnd
+
+ http://schemas.android.com/apk/res/android
+
+
+
+
+
+
+
+
+ .*:paddingLeft
+
+ http://schemas.android.com/apk/res/android
+
+
+
+
+
+
+
+
+ .*:paddingRight
+
+ http://schemas.android.com/apk/res/android
+
+
+
+
+
+
+
+
+ .*
+ http://schemas.android.com/apk/res/android
+
+
+ BY_NAME
+
+
+
+
+
+
+ .*
+ http://schemas.android.com/apk/res-auto
+
+
+ BY_NAME
+
+
+
+
+
+
+ .*
+ http://schemas.android.com/tools
+
+
+ BY_NAME
+
+
+
+
+
+
+ .*
+ .*
+
+
+ BY_NAME
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lua/custom/configs/java.lua b/lua/custom/configs/java.lua
new file mode 100644
index 0000000..af17552
--- /dev/null
+++ b/lua/custom/configs/java.lua
@@ -0,0 +1,23 @@
+local g = require("custom.configs.table")
+
+local jdtls_bin = g.jdtls_home .. "/bin/jdtls"
+local lombok_jar = g.jdtls_home .. "/lombok.jar"
+
+if g.is_windows then
+ jdtls_bin = g.path_to_windows(jdtls_bin)
+ lombok_jar = g.path_to_windows(lombok_jar)
+end
+
+if not g.is_file_exist(jdtls_bin) then
+ vim.notify("jdtls plugin not exist", "error")
+ return
+end
+
+if not g.is_file_exist(lombok_jar) then
+ vim.notify("lombok plugin not exist", "error")
+ return
+end
+
+if not g.is_directory_exist(g.jdtls_workspace) then
+ os.execute("mkdir " .. g.jdtls_workspace)
+end
diff --git a/lua/custom/configs/jdtls.lua b/lua/custom/configs/jdtls.lua
new file mode 100644
index 0000000..6565cff
--- /dev/null
+++ b/lua/custom/configs/jdtls.lua
@@ -0,0 +1,136 @@
+local g = require "custom.configs.table"
+
+local root_markers = { ".git", "mvnw", "gradlew", "pom.xml", "build.gradle" }
+local root_dir = require("jdtls.setup").find_root(root_markers)
+if root_dir == "" then
+ return
+end
+
+local project_name = vim.fn.fnamemodify(vim.fn.getcwd(), ":p:h:t")
+
+local workspace = g.jdtls_workspace .. project_name
+local launcher = g.jdtls_home .. "/plugins/org.eclipse.equinox.launcher_1.6.400.v20210924-0641.jar"
+local configuration = g.jdtls_home .. "/config_linux"
+local lombok_bin = g.jdtls_home .. "/lombok.jar"
+
+if g.is_windows then
+ workspace = g.path_to_windows(workspace)
+ launcher = g.path_to_windows(launcher)
+ configuration = g.path_to_windows(g.jdtls_home) .. "\\config_win"
+ lombok_bin = g.path_to_windows(lombok_bin)
+end
+
+local jdtls = require "jdtls"
+local cmp_nvim_lsp = require "cmp_nvim_lsp"
+local client_capabilities = vim.lsp.protocol.make_client_capabilities()
+local capabilities = cmp_nvim_lsp.default_capabilities(client_capabilities)
+
+return {
+ flags = {
+ debounce_text_changes = 80,
+ },
+ capabilities = capabilities,
+ on_attach = function(_, bufnr)
+ -- https://github.com/mfussenegger/dotfiles/blob/833d634251ebf3bf7e9899ed06ac710735d392da/vim/.config/nvim/ftplugin/java.lua#L88-L94
+ local opts = { silent = true, buffer = bufnr }
+ vim.keymap.set("n", "lo", jdtls.organize_imports, { desc = "Organize imports", buffer = bufnr })
+ -- Should 'd' be reserved for debug?
+ vim.keymap.set("n", "df", jdtls.test_class, opts)
+ vim.keymap.set("n", "dn", jdtls.test_nearest_method, opts)
+ vim.keymap.set("n", "rv", jdtls.extract_variable_all, { desc = "Extract variable", buffer = bufnr })
+ vim.keymap.set(
+ "v",
+ "rm",
+ [[lua require('jdtls').extract_method(true)]],
+ { desc = "Extract method", buffer = bufnr }
+ )
+ vim.keymap.set("n", "rc", jdtls.extract_constant, { desc = "Extract constant", buffer = bufnr })
+ end,
+ 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",
+ "-Xmx1g",
+ "--add-modules=ALL-SYSTEM",
+ "--add-opens",
+ "java.base/java.util=ALL-UNNAMED",
+ "--add-opens",
+ "java.base/java.lang=ALL-UNNAMED",
+ "-javaagent:" .. lombok_bin,
+ "-Xbootclasspath/a:" .. lombok_bin,
+ "-jar",
+ launcher,
+ "-configuration",
+ configuration,
+ "-data",
+ workspace,
+ },
+ root_dir = root_dir,
+ settings = {
+ java = {
+ maven = {
+ downloadSources = true,
+ },
+ eclipse = {
+ downloadSources = true,
+ },
+ implementationsCodeLens = {
+ enabled = true,
+ },
+ referencesCodeLens = {
+ enabled = true,
+ },
+ references = {
+ includeDecompiledSources = true,
+ },
+ format = {
+ enabled = true,
+ settings = {
+ url = vim.fn.stdpath "config" .. "/intellij-java-google-style.xml",
+ profile = "GoogleStyle",
+ },
+ },
+ signatureHelp = { enabled = true },
+ contentProvider = { preferred = "fernflower" }, -- Use fernflower to decompile library code
+ completion = {
+ favoriteStaticMembers = {
+ "org.hamcrest.MatcherAssert.assertThat",
+ "org.hamcrest.Matchers.*",
+ "org.hamcrest.CoreMatchers.*",
+ "org.junit.jupiter.api.Assertions.*",
+ "java.util.Objects.requireNonNull",
+ "java.util.Objects.requireNonNullElse",
+ "org.mockito.Mockito.*",
+ },
+ filteredTypes = {
+ "com.sun.*",
+ "io.micrometer.shaded.*",
+ "java.awt.*",
+ "jdk.*",
+ "sun.*",
+ },
+ },
+ sources = {
+ organizeImports = {
+ starThreshold = 9999,
+ staticStarThreshold = 9999,
+ },
+ },
+ codeGeneration = {
+ toString = {
+ template = "${object.className}{${member.name()}=${member.value}, ${otherMembers}}",
+ },
+ hashCodeEquals = {
+ useJava7Objects = true,
+ },
+ useBlocks = true,
+ },
+ },
+ },
+ init_options = {
+ bundles = {},
+ },
+}
diff --git a/lua/custom/configs/lspconfig.lua b/lua/custom/configs/lspconfig.lua
index 5c234f3..b5d59cd 100644
--- a/lua/custom/configs/lspconfig.lua
+++ b/lua/custom/configs/lspconfig.lua
@@ -11,6 +11,7 @@ table.insert(runtime_path, "lua/?/init.lua")
lspconfig.lua_ls.setup {
on_attach = on_attach,
capabilities = capabilities,
+ filetypes = { "lua" },
settings = {
Lua = {
runtime = {
@@ -52,3 +53,22 @@ lspconfig.gopls.setup {
},
},
}
+
+-- VUE LSP
+lspconfig.volar.setup {
+ filetypes = { "typescript", "javascript", "javascriptreact", "typescriptreact", "vue", "json" },
+ init_options = {
+ typescript = {
+ -- Alternative location if installed as root:
+ tsdk = "/usr/local/lib/node_modules/typescript/lib",
+ },
+ },
+}
+
+-- BASH LSP
+lspconfig.bashls.setup {
+ filetypes = { "sh" },
+}
+
+-- JAVA LSP
+
diff --git a/lua/custom/configs/table.lua b/lua/custom/configs/table.lua
new file mode 100644
index 0000000..f5af3bf
--- /dev/null
+++ b/lua/custom/configs/table.lua
@@ -0,0 +1,49 @@
+local g = {}
+
+g.platform_windows = function()
+ local delimeter = package.config:sub(1, 1)
+ if delimeter == "/" then
+ return false
+ end
+ return true
+end
+
+g.get_homepage = function()
+ if g.platform_windows() then
+ return os.getenv "USERPROFILE"
+ end
+ return os.getenv "HOME"
+end
+
+g.is_file_exist = function(filename)
+ local f = io.open(filename)
+ if f ~= nil then
+ io.close(f)
+ return true
+ else
+ return false
+ end
+end
+
+g.path_to_windows = function(path)
+ return (string.gsub(path, "/", "\\"))
+end
+
+g.is_directory_exist = function(dirname)
+ return os.rename(dirname, dirname) and true or false
+end
+
+local jdtls_home = g.get_homepage() .. "/.local/share/nvim/mason/packages/jdtls"
+local workspace = g.get_homepage() .. "/.jdtls"
+
+if g.is_windows then
+ jdtls_home = g.get_homepage() .. "\\AppData\\Local\\nvim-data\\mason\\packages\\jdtls"
+ workspace = g.get_homepage() .. "\\.jdtls"
+end
+
+g.is_windows = g.platform_windows()
+g.is_linux = not g.is_windows
+g.jdtls_home = jdtls_home
+g.jdtls_workspace = workspace
+
+return g
diff --git a/lua/custom/init.lua b/lua/custom/init.lua
index b28f3ea..002cd57 100644
--- a/lua/custom/init.lua
+++ b/lua/custom/init.lua
@@ -69,3 +69,9 @@ vim.opt.listchars:append "eol:↴"
-- 文件树配置
vim.g.loaded_netrw = 1
vim.g.loaded_netrwPlugin = 1
+-- 开启 Folding
+vim.wo.foldmethod = "expr"
+vim.wo.foldexpr = "nvim_treesitter#foldexpr()"
+-- 默认不要折叠
+-- https://stackoverflow.com/questions/8316139/how-to-set-the-default-to-unfolded-when-you-open-a-file
+vim.wo.foldlevel = 99
diff --git a/lua/custom/mappings.lua b/lua/custom/mappings.lua
index 8733e7a..2ca1243 100644
--- a/lua/custom/mappings.lua
+++ b/lua/custom/mappings.lua
@@ -1,5 +1,24 @@
local M = {}
+M.windows = {
+ n = {
+ -- 折叠配置
+ ["z+"] = { "zM", "" },
+ [""] = { "zR", "" },
+ ["zz"] = { "za", "" },
+ -- 分屏
+ ["sv"] = { ":vsp", "" },
+ ["sh"] = { ":sp", "" },
+ -- 快所退出
+ ["q"] = { ":wq", "" },
+ ["qn"] = { ":q!", "" },
+ ["qq"] = { ":qa!", "" },
+ },
+ i = {
+ ["jk"] = { "", "" },
+ },
+}
+
M.format = {
n = {
["="] = { "lua vim.lsp.buf.format()", "general format" },
diff --git a/lua/custom/plugins.lua b/lua/custom/plugins.lua
index a5e165b..87d06de 100644
--- a/lua/custom/plugins.lua
+++ b/lua/custom/plugins.lua
@@ -17,7 +17,6 @@ local plugins = {
"golangci-lint-langserver",
"golines",
"gopls",
- "gradle-language-server",
"html-lsp",
"json-lsp",
"lua-language-server",
@@ -30,17 +29,13 @@ local plugins = {
"yaml-language-server",
"yamlfmt",
"yamllint",
+ "jdtls",
},
},
},
- {
- "jose-elias-alvarez/null-ls.nvim",
- config = function()
- require "custom.configs.null-ls"
- end,
- },
{
"neovim/nvim-lspconfig",
+ lazy = false,
dependencies = {
"jose-elias-alvarez/null-ls.nvim",
config = function()
@@ -52,6 +47,14 @@ local plugins = {
require "custom.configs.lspconfig"
end,
},
+ {
+ "mfussenegger/nvim-jdtls",
+ ft = { "java" },
+ config = function()
+ require "custom.configs.java"
+ -- require "custom.configs.jdtls"
+ end,
+ },
{
"ray-x/go.nvim",
dependencies = { -- optional packages