summaryrefslogtreecommitdiff
path: root/lua/lvim/core
diff options
context:
space:
mode:
Diffstat (limited to 'lua/lvim/core')
-rw-r--r--lua/lvim/core/autopairs.lua4
-rw-r--r--lua/lvim/core/bufferline.lua4
-rw-r--r--lua/lvim/core/builtins/init.lua1
-rw-r--r--lua/lvim/core/cmp.lua101
-rw-r--r--lua/lvim/core/comment.lua20
-rw-r--r--lua/lvim/core/info.lua4
-rw-r--r--lua/lvim/core/lualine/components.lua12
-rw-r--r--lua/lvim/core/mason.lua41
-rw-r--r--lua/lvim/core/which-key.lua10
9 files changed, 128 insertions, 69 deletions
diff --git a/lua/lvim/core/autopairs.lua b/lua/lvim/core/autopairs.lua
index 4d9f33f4..469a38a4 100644
--- a/lua/lvim/core/autopairs.lua
+++ b/lua/lvim/core/autopairs.lua
@@ -79,6 +79,10 @@ M.setup = function()
if lvim.builtin.autopairs.on_config_done then
lvim.builtin.autopairs.on_config_done(autopairs)
end
+ pcall(function()
+ local cmp_autopairs = require "nvim-autopairs.completion.cmp"
+ require("cmp").event:on("confirm_done", cmp_autopairs.on_confirm_done())
+ end)
end
return M
diff --git a/lua/lvim/core/bufferline.lua b/lua/lvim/core/bufferline.lua
index 28e0f06d..7e8f1376 100644
--- a/lua/lvim/core/bufferline.lua
+++ b/lua/lvim/core/bufferline.lua
@@ -45,10 +45,10 @@ M.config = function()
},
highlights = {
background = {
- gui = "italic",
+ italic = true,
},
buffer_selected = {
- gui = "bold",
+ bold = true,
},
},
options = {
diff --git a/lua/lvim/core/builtins/init.lua b/lua/lvim/core/builtins/init.lua
index e219d45e..5cad2a00 100644
--- a/lua/lvim/core/builtins/init.lua
+++ b/lua/lvim/core/builtins/init.lua
@@ -16,6 +16,7 @@ local builtins = {
"lvim.core.notify",
"lvim.core.lualine",
"lvim.core.alpha",
+ "lvim.core.mason",
}
function M.config(config)
diff --git a/lua/lvim/core/cmp.lua b/lua/lvim/core/cmp.lua
index 942a72f6..10cf56be 100644
--- a/lua/lvim/core/cmp.lua
+++ b/lua/lvim/core/cmp.lua
@@ -1,24 +1,23 @@
local M = {}
M.methods = {}
----checks if the character preceding the cursor is a space character
----@return boolean true if it is a space character, false otherwise
-local check_backspace = function()
- local col = vim.fn.col "." - 1
- return col == 0 or vim.fn.getline("."):sub(col, col):match "%s"
+local has_words_before = function()
+ local line, col = unpack(vim.api.nvim_win_get_cursor(0))
+ return col ~= 0 and vim.api.nvim_buf_get_lines(0, line - 1, line, true)[1]:sub(col, col):match "%s" == nil
end
-M.methods.check_backspace = check_backspace
+M.methods.has_words_before = has_words_before
-local function T(str)
+---@deprecated use M.methods.has_words_before instead
+M.methods.check_backspace = function()
+ return not has_words_before()
+end
+
+local T = function(str)
return vim.api.nvim_replace_termcodes(str, true, true, true)
end
----wraps vim.fn.feedkeys while replacing key codes with escape codes
----Ex: feedkeys("<CR>", "n") becomes feedkeys("^M", "n")
----@param key string
----@param mode string
local function feedkeys(key, mode)
- vim.fn.feedkeys(T(key), mode)
+ vim.api.nvim_feedkeys(T(key), mode, true)
end
M.methods.feedkeys = feedkeys
@@ -28,39 +27,21 @@ M.methods.feedkeys = feedkeys
local function jumpable(dir)
local luasnip_ok, luasnip = pcall(require, "luasnip")
if not luasnip_ok then
- return
+ return false
end
local win_get_cursor = vim.api.nvim_win_get_cursor
local get_current_buf = vim.api.nvim_get_current_buf
- local function inside_snippet()
- -- for outdated versions of luasnip
- if not luasnip.session.current_nodes then
- return false
- end
-
- local node = luasnip.session.current_nodes[get_current_buf()]
- if not node then
- return false
- end
-
- local snip_begin_pos, snip_end_pos = node.parent.snippet.mark:pos_begin_end()
- local pos = win_get_cursor(0)
- pos[1] = pos[1] - 1 -- LuaSnip is 0-based not 1-based like nvim for rows
- return pos[1] >= snip_begin_pos[1] and pos[1] <= snip_end_pos[1]
- end
-
---sets the current buffer's luasnip to the one nearest the cursor
---@return boolean true if a node is found, false otherwise
local function seek_luasnip_cursor_node()
+ -- TODO(kylo252): upstream this
-- for outdated versions of luasnip
if not luasnip.session.current_nodes then
return false
end
- local pos = win_get_cursor(0)
- pos[1] = pos[1] - 1
local node = luasnip.session.current_nodes[get_current_buf()]
if not node then
return false
@@ -69,6 +50,9 @@ local function jumpable(dir)
local snippet = node.parent.snippet
local exit_node = snippet.insert_nodes[0]
+ local pos = win_get_cursor(0)
+ pos[1] = pos[1] - 1
+
-- exit early if we're past the exit node
if exit_node then
local exit_pos_end = exit_node.mark:pos_end()
@@ -124,9 +108,9 @@ local function jumpable(dir)
end
if dir == -1 then
- return inside_snippet() and luasnip.jumpable(-1)
+ return luasnip.in_snippet() and luasnip.jumpable(-1)
else
- return inside_snippet() and seek_luasnip_cursor_node() and luasnip.jumpable()
+ return luasnip.in_snippet() and seek_luasnip_cursor_node() and luasnip.jumpable(1)
end
end
M.methods.jumpable = jumpable
@@ -241,48 +225,61 @@ M.config = function()
mapping = cmp.mapping.preset.insert {
["<C-k>"] = cmp.mapping.select_prev_item(),
["<C-j>"] = cmp.mapping.select_next_item(),
+ ["<Down>"] = cmp.mapping(cmp.mapping.select_next_item { behavior = cmp.SelectBehavior.Select }, { "i" }),
+ ["<Up>"] = cmp.mapping(cmp.mapping.select_prev_item { behavior = cmp.SelectBehavior.Select }, { "i" }),
["<C-d>"] = cmp.mapping.scroll_docs(-4),
["<C-f>"] = cmp.mapping.scroll_docs(4),
+ ["<C-y>"] = cmp.mapping {
+ i = cmp.mapping.confirm { behavior = cmp.ConfirmBehavior.Replace, select = false },
+ c = function(fallback)
+ if cmp.visible() then
+ cmp.confirm { behavior = cmp.ConfirmBehavior.Replace, select = false }
+ else
+ fallback()
+ end
+ end,
+ },
["<Tab>"] = cmp.mapping(function(fallback)
if cmp.visible() then
cmp.select_next_item()
- elseif luasnip.expandable() then
- luasnip.expand()
- elseif jumpable() then
+ elseif luasnip.expand_or_locally_jumpable() then
+ luasnip.expand_or_jump()
+ elseif jumpable(1) then
luasnip.jump(1)
- elseif check_backspace() then
- fallback()
+ elseif has_words_before() then
+ cmp.complete()
else
fallback()
end
- end, {
- "i",
- "s",
- }),
+ end, { "i", "s" }),
["<S-Tab>"] = cmp.mapping(function(fallback)
if cmp.visible() then
cmp.select_prev_item()
- elseif jumpable(-1) then
+ elseif luasnip.jumpable(-1) then
luasnip.jump(-1)
else
fallback()
end
- end, {
- "i",
- "s",
- }),
-
+ end, { "i", "s" }),
["<C-Space>"] = cmp.mapping.complete(),
["<C-e>"] = cmp.mapping.abort(),
["<CR>"] = cmp.mapping(function(fallback)
- if cmp.visible() and cmp.confirm(lvim.builtin.cmp.confirm_opts) then
- if jumpable() then
+ if cmp.visible() then
+ local confirm_opts = lvim.builtin.cmp.confirm_opts
+ local is_insert_mode = function()
+ return vim.api.nvim_get_mode().mode:sub(1, 1) == "i"
+ end
+ if is_insert_mode() then -- prevent overwriting brackets
+ confirm_opts.behavior = cmp.ConfirmBehavior.Insert
+ end
+ cmp.confirm(confirm_opts)
+ if jumpable(1) then
luasnip.jump(1)
end
return
end
- if jumpable() then
+ if jumpable(1) then
if not luasnip.jump(1) then
fallback()
end
diff --git a/lua/lvim/core/comment.lua b/lua/lvim/core/comment.lua
index 86a2091a..d07739c6 100644
--- a/lua/lvim/core/comment.lua
+++ b/lua/lvim/core/comment.lua
@@ -3,8 +3,24 @@ local M = {}
function M.config()
local pre_hook = nil
if lvim.builtin.treesitter.context_commentstring.enable then
- pre_hook = function(_ctx)
- return require("ts_context_commentstring.internal").calculate_commentstring()
+ pre_hook = function(ctx)
+ local U = require "Comment.utils"
+
+ -- Determine whether to use linewise or blockwise commentstring
+ local type = ctx.ctype == U.ctype.linewise and "__default" or "__multiline"
+
+ -- Determine the location where to calculate commentstring from
+ local location = nil
+ if ctx.ctype == U.ctype.blockwise then
+ location = require("ts_context_commentstring.utils").get_cursor_location()
+ elseif ctx.cmotion == U.cmotion.v or ctx.cmotion == U.cmotion.V then
+ location = require("ts_context_commentstring.utils").get_visual_start_location()
+ end
+
+ return require("ts_context_commentstring.internal").calculate_commentstring {
+ key = type,
+ location = location,
+ }
end
end
lvim.builtin.comment = {
diff --git a/lua/lvim/core/info.lua b/lua/lvim/core/info.lua
index ac7d690a..da9ddbe6 100644
--- a/lua/lvim/core/info.lua
+++ b/lua/lvim/core/info.lua
@@ -111,9 +111,9 @@ local function make_auto_lsp_info(ft)
return info_lines
end
- local available = lsp_utils.get_supported_servers_per_filetype(ft)
+ local supported = lsp_utils.get_supported_servers(ft)
local skipped = vim.tbl_filter(function(name)
- return vim.tbl_contains(available, name)
+ return vim.tbl_contains(supported, name)
end, skipped_servers)
if #skipped == 0 then
diff --git a/lua/lvim/core/lualine/components.lua b/lua/lvim/core/lualine/components.lua
index 49a8ff81..5095cfb4 100644
--- a/lua/lvim/core/lualine/components.lua
+++ b/lua/lvim/core/lualine/components.lua
@@ -70,13 +70,13 @@ return {
},
treesitter = {
function()
- local b = vim.api.nvim_get_current_buf()
- if next(vim.treesitter.highlighter.active[b]) then
- return ""
- end
- return ""
+ return ""
+ end,
+ color = function()
+ local buf = vim.api.nvim_get_current_buf()
+ local ts = vim.treesitter.highlighter.active[buf]
+ return { fg = ts and not vim.tbl_isempty(ts) and colors.green or colors.red }
end,
- color = { fg = colors.green },
cond = conditions.hide_in_width,
},
lsp = {
diff --git a/lua/lvim/core/mason.lua b/lua/lvim/core/mason.lua
new file mode 100644
index 00000000..39be4f42
--- /dev/null
+++ b/lua/lvim/core/mason.lua
@@ -0,0 +1,41 @@
+local M = {}
+
+function M.config()
+ lvim.builtin.mason = {
+ ui = {
+ keymaps = {
+ toggle_package_expand = "<CR>",
+ install_package = "i",
+ update_package = "u",
+ check_package_version = "c",
+ update_all_packages = "U",
+ check_outdated_packages = "C",
+ uninstall_package = "X",
+ cancel_installation = "<C-c>",
+ apply_language_filter = "<C-f>",
+ },
+ },
+ log_level = vim.log.levels.INFO,
+ max_concurrent_installers = 4,
+
+ github = {
+ -- The template URL to use when downloading assets from GitHub.
+ -- The placeholders are the following (in order):
+ -- 1. The repository (e.g. "rust-lang/rust-analyzer")
+ -- 2. The release version (e.g. "v0.3.0")
+ -- 3. The asset name (e.g. "rust-analyzer-v0.3.0-x86_64-unknown-linux-gnu.tar.gz")
+ download_url_template = "https://github.com/%s/releases/download/%s/%s",
+ },
+ }
+end
+
+function M.setup()
+ local status_ok, mason = pcall(require, "mason")
+ if not status_ok then
+ return
+ end
+
+ mason.setup(lvim.builtin.mason)
+end
+
+return M
diff --git a/lua/lvim/core/which-key.lua b/lua/lvim/core/which-key.lua
index 3015781b..2301943f 100644
--- a/lua/lvim/core/which-key.lua
+++ b/lua/lvim/core/which-key.lua
@@ -1,5 +1,4 @@
local M = {}
-
M.config = function()
lvim.builtin.which_key = {
---@usage disable which-key completely [not recommended]
@@ -77,13 +76,13 @@ M.config = function()
-- NOTE: Prefer using : over <cmd> as the latter avoids going back in normal-mode.
-- see https://neovim.io/doc/user/map.html#:map-cmd
vmappings = {
- ["/"] = { "<ESC><CMD>lua require('Comment.api').toggle_linewise_op(vim.fn.visualmode())<CR>", "Comment" },
+ ["/"] = { "<Plug>(comment_toggle_linewise_visual)", "Comment toggle linewise (visual)" },
},
mappings = {
[";"] = { "<cmd>Alpha<CR>", "Dashboard" },
["w"] = { "<cmd>w!<CR>", "Save" },
["q"] = { "<cmd>lua require('lvim.utils.functions').smart_quit()<CR>", "Quit" },
- ["/"] = { "<cmd>lua require('Comment.api').toggle_current_linewise()<CR>", "Comment" },
+ ["/"] = { "<Plug>(comment_toggle_linewise_current)", "Comment toggle current line" },
["c"] = { "<cmd>BufferKill<CR>", "Close Buffer" },
["f"] = { require("lvim.core.telescope.custom-finders").find_project_files, "Find File" },
["h"] = { "<cmd>nohlsearch<CR>", "No Highlight" },
@@ -92,6 +91,7 @@ M.config = function()
j = { "<cmd>BufferLinePick<cr>", "Jump" },
f = { "<cmd>Telescope buffers<cr>", "Find" },
b = { "<cmd>BufferLineCyclePrev<cr>", "Previous" },
+ n = { "<cmd>BufferLineCycleNext<cr>", "Next" },
-- w = { "<cmd>BufferWipeout<cr>", "Wipeout" }, -- TODO: implement this for bufferline
e = {
"<cmd>BufferLinePickClose<cr>",
@@ -160,7 +160,7 @@ M.config = function()
w = { "<cmd>Telescope diagnostics<cr>", "Diagnostics" },
f = { require("lvim.lsp.utils").format, "Format" },
i = { "<cmd>LspInfo<cr>", "Info" },
- I = { "<cmd>LspInstallInfo<cr>", "Installer Info" },
+ I = { "<cmd>Mason<cr>", "Mason Info" },
j = {
vim.diagnostic.goto_next,
"Next Diagnostic",
@@ -252,7 +252,7 @@ M.config = function()
k = { "<cmd>Telescope keymaps<cr>", "Keymaps" },
C = { "<cmd>Telescope commands<cr>", "Commands" },
p = {
- "<cmd>lua require('telescope.builtin.internal').colorscheme({enable_preview = true})<cr>",
+ "<cmd>lua require('telescope.builtin').colorscheme({enable_preview = true})<cr>",
"Colorscheme with Preview",
},
},