Riyyi
9 months ago
18 changed files with 1372 additions and 1 deletions
@ -0,0 +1,2 @@ |
|||||||
|
-- when opening a .lua file, this file gets executed |
||||||
|
vim.opt.expandtab = false |
@ -0,0 +1,9 @@ |
|||||||
|
require("core") |
||||||
|
require("packages").setup({ |
||||||
|
require("ui"), |
||||||
|
require("selection"), |
||||||
|
require("editor"), |
||||||
|
require("development"), |
||||||
|
require("git"), |
||||||
|
}) |
||||||
|
require("keybinds").setup() |
@ -0,0 +1,39 @@ |
|||||||
|
{ |
||||||
|
"Comment.nvim": { "branch": "master", "commit": "0236521ea582747b58869cb72f70ccfa967d2e89" }, |
||||||
|
"LuaSnip": { "branch": "master", "commit": "2dbef19461198630b3d7c39f414d09fb07d1fdd2" }, |
||||||
|
"auto-save.nvim": { "branch": "main", "commit": "e98cafef75271ec83dc84c933f124ab1bb675ef8" }, |
||||||
|
"cmp-buffer": { "branch": "main", "commit": "3022dbc9166796b644a841a02de8dd1cc1d311fa" }, |
||||||
|
"cmp-nvim-lsp": { "branch": "main", "commit": "5af77f54de1b16c34b23cba810150689a3a90312" }, |
||||||
|
"cmp-nvim-lua": { "branch": "main", "commit": "f12408bdb54c39c23e67cab726264c10db33ada8" }, |
||||||
|
"cmp-path": { "branch": "main", "commit": "91ff86cd9c29299a64f968ebb45846c485725f23" }, |
||||||
|
"cmp_luasnip": { "branch": "master", "commit": "05a9ab28b53f71d1aece421ef32fee2cb857a843" }, |
||||||
|
"dashboard-nvim": { "branch": "master", "commit": "04a48b2e230bc5e50dd099d839443703023b0472" }, |
||||||
|
"diffview.nvim": { "branch": "main", "commit": "3dc498c9777fe79156f3d32dddd483b8b3dbd95f" }, |
||||||
|
"friendly-snippets": { "branch": "main", "commit": "b8fae73a479ae0a1c54f5c98fa687ae8a0addc53" }, |
||||||
|
"gitsigns.nvim": { "branch": "main", "commit": "2c2463dbd82eddd7dbab881c3a62cfbfbe3c67ae" }, |
||||||
|
"lazy.nvim": { "branch": "main", "commit": "aedcd79811d491b60d0a6577a9c1701063c2a609" }, |
||||||
|
"lspkind.nvim": { "branch": "master", "commit": "1735dd5a5054c1fb7feaf8e8658dbab925f4f0cf" }, |
||||||
|
"lualine.nvim": { "branch": "master", "commit": "7d131a8d3ba5016229e8a1d08bf8782acea98852" }, |
||||||
|
"neodev.nvim": { "branch": "main", "commit": "b49b976cf2c28cd8283e9d74cb10885f6dd9e3d0" }, |
||||||
|
"neogit": { "branch": "master", "commit": "536b4cfc009fc6d8bd771f010f04d48204533fae" }, |
||||||
|
"nvim-base16": { "branch": "master", "commit": "2349e8357864bf0ef45d40f491f8e1e6465485b0" }, |
||||||
|
"nvim-cmp": { "branch": "main", "commit": "04e0ca376d6abdbfc8b52180f8ea236cbfddf782" }, |
||||||
|
"nvim-lspconfig": { "branch": "master", "commit": "41f40dc4b86f3e166cf08115f621001972565a20" }, |
||||||
|
"nvim-treesitter": { "branch": "master", "commit": "6444286cbf3a37862feaa7ff86456dd948f5cf8b" }, |
||||||
|
"nvim-treesitter-textobjects": { "branch": "master", "commit": "dd0b2036c3a27cb6e6486f8bd24188c6ca43af0b" }, |
||||||
|
"nvim-web-devicons": { "branch": "master", "commit": "7f30f2da3c3641841ceb0e2c150281f624445e8f" }, |
||||||
|
"omnisharp-extended-lsp.nvim": { "branch": "main", "commit": "4be2e8689067494ed7e5a4f1221adc31d1a07783" }, |
||||||
|
"plenary.nvim": { "branch": "master", "commit": "4f71c0c4a196ceb656c824a70792f3df3ce6bb6d" }, |
||||||
|
"project.nvim": { "branch": "main", "commit": "8c6bad7d22eef1b71144b401c9f74ed01526a4fb" }, |
||||||
|
"rainbow-delimiters.nvim": { "branch": "master", "commit": "ca8d5ee2b4ee1eec491040a7601d366ddc8a2e02" }, |
||||||
|
"sqlite.lua": { "branch": "master", "commit": "b7e28c8463254c46a8e61c52d27d6a2040492fc3" }, |
||||||
|
"telescope-all-recent.nvim": { "branch": "main", "commit": "c1a83b96de07ed4c27af5a46cf8b10c8ee802973" }, |
||||||
|
"telescope-fzf-native.nvim": { "branch": "main", "commit": "6c921ca12321edaa773e324ef64ea301a1d0da62" }, |
||||||
|
"telescope-recent-files": { "branch": "main", "commit": "6893cda11625254cc7dc2ea76e0a100c7deeb028" }, |
||||||
|
"telescope.nvim": { "branch": "0.1.x", "commit": "d90956833d7c27e73c621a61f20b29fdb7122709" }, |
||||||
|
"todo-comments.nvim": { "branch": "main", "commit": "833d8dd8b07eeda37a09e99460f72a02616935cb" }, |
||||||
|
"trouble.nvim": { "branch": "main", "commit": "f1168feada93c0154ede4d1fe9183bf69bac54ea" }, |
||||||
|
"ultimate-autopair.nvim": { "branch": "development", "commit": "07c9da3e7722107163b68ecc5e0141fdd825449d" }, |
||||||
|
"vim-sleuth": { "branch": "master", "commit": "1cc4557420f215d02c4d2645a748a816c220e99b" }, |
||||||
|
"which-key.nvim": { "branch": "main", "commit": "4433e5ec9a507e5097571ed55c02ea9658fb268a" } |
||||||
|
} |
@ -0,0 +1,4 @@ |
|||||||
|
require("core.leader-key") |
||||||
|
require("core.config") |
||||||
|
require("core.autocommands") |
||||||
|
require("core.globals") |
@ -0,0 +1,29 @@ |
|||||||
|
-------------------------------------------- |
||||||
|
--- Commands --- |
||||||
|
|
||||||
|
-- Prevent typo |
||||||
|
vim.cmd [[ |
||||||
|
cnoreabbrev <expr> W (getcmdtype() is# ":" && getcmdline() is# "W") ? ("w") : ("W") |
||||||
|
cnoreabbrev <expr> Q (getcmdtype() is# ":" && getcmdline() is# "Q") ? ("q") : ("Q") |
||||||
|
cnoreabbrev <expr> WQ (getcmdtype() is# ":" && getcmdline() is# "WQ") ? ("wq") : ("WQ") |
||||||
|
cnoreabbrev <expr> Wq (getcmdtype() is# ":" && getcmdline() is# "Wq") ? ("wq") : ("Wq") |
||||||
|
]] |
||||||
|
|
||||||
|
-------------------------------------------- |
||||||
|
--- Autocommands --- |
||||||
|
|
||||||
|
-- Cut off trailing whitespace and trailing blank lines |
||||||
|
local core = require("core.functions") |
||||||
|
vim.api.nvim_create_autocmd({ "BufWritePre" }, { |
||||||
|
pattern = "*", |
||||||
|
callback = core.trim_buffer, |
||||||
|
}) |
||||||
|
|
||||||
|
-- Highlight on yank |
||||||
|
-- See `:help vim.highlight.on_yank()` |
||||||
|
local highlight_group = vim.api.nvim_create_augroup("YankHighlight", { clear = true }) |
||||||
|
vim.api.nvim_create_autocmd("TextYankPost", { |
||||||
|
pattern = "*", |
||||||
|
group = highlight_group, |
||||||
|
callback = function() vim.highlight.on_yank() end, |
||||||
|
}) |
@ -0,0 +1,48 @@ |
|||||||
|
--- Behavior --- |
||||||
|
|
||||||
|
-- vim.opt.autochdir = true |
||||||
|
vim.opt.clipboard = "unnamedplus" |
||||||
|
vim.opt.encoding = "utf-8" |
||||||
|
vim.opt.fileencoding = "utf-8" |
||||||
|
vim.opt.mouse = "a" |
||||||
|
vim.opt.scrolloff = 8 |
||||||
|
vim.opt.signcolumn = "yes" -- always show gutter/fringe |
||||||
|
vim.opt.ttimeoutlen = 0 |
||||||
|
|
||||||
|
-- Case-insensitive searching UNLESS \C or capital in search |
||||||
|
vim.opt.ignorecase = true |
||||||
|
vim.opt.smartcase = true |
||||||
|
|
||||||
|
--- Editing --- |
||||||
|
|
||||||
|
vim.opt.number = true |
||||||
|
vim.opt.breakindent = true |
||||||
|
|
||||||
|
vim.opt.backspace = "indent,eol,start" |
||||||
|
vim.opt.expandtab = false |
||||||
|
vim.opt.shiftround = true |
||||||
|
vim.opt.shiftwidth = 4 |
||||||
|
vim.opt.softtabstop = 4 |
||||||
|
vim.opt.tabstop = 4 |
||||||
|
|
||||||
|
vim.opt.smartindent = true |
||||||
|
|
||||||
|
vim.opt.wrap = false |
||||||
|
|
||||||
|
--- Files |
||||||
|
|
||||||
|
vim.opt.backup = true |
||||||
|
vim.opt.backupdir = vim.fn.stdpath("cache") .. "/backup" |
||||||
|
vim.opt.swapfile = false |
||||||
|
vim.opt.undofile = true |
||||||
|
vim.opt.undodir = vim.fn.stdpath("cache") .. "/undodir" |
||||||
|
|
||||||
|
vim.opt.shadafile = vim.fn.stdpath("cache") .. "/netrwhist" |
||||||
|
|
||||||
|
--- UI --- |
||||||
|
|
||||||
|
vim.opt.colorcolumn = "81" |
||||||
|
vim.opt.completeopt = "menuone,noselect" |
||||||
|
vim.opt.cursorline = true |
||||||
|
vim.opt.termguicolors = true |
||||||
|
vim.opt.title = true |
@ -0,0 +1,72 @@ |
|||||||
|
local M = {} |
||||||
|
|
||||||
|
M.is_buffer_a_file = function() |
||||||
|
local buffer_name = vim.fn.bufname() |
||||||
|
|
||||||
|
return buffer_name ~= "" and vim.fn.filereadable(buffer_name) == 1 |
||||||
|
end |
||||||
|
|
||||||
|
M.get_file_path = function() |
||||||
|
if not M.is_buffer_a_file() then |
||||||
|
return nil |
||||||
|
end |
||||||
|
local file_path = vim.fn.expand("%:p") |
||||||
|
|
||||||
|
return vim.fn.fnamemodify(file_path, ":h") .. "/" |
||||||
|
end |
||||||
|
|
||||||
|
M.get_netrw_path = function() -- b:netrw_curdir |
||||||
|
if vim.fn.expand("#" .. vim.fn.bufnr()) == "0" then |
||||||
|
return nil |
||||||
|
end |
||||||
|
|
||||||
|
return vim.fn.fnamemodify(vim.fn.bufname(), ":p") |
||||||
|
end |
||||||
|
|
||||||
|
M.get_current_directory = function() |
||||||
|
return M.get_file_path() or M.get_netrw_path() or vim.fn.getcwd() |
||||||
|
end |
||||||
|
|
||||||
|
M.find_project_root = function() |
||||||
|
local current_directory = M.get_current_directory() |
||||||
|
|
||||||
|
local directory = current_directory |
||||||
|
while directory ~= "/" do |
||||||
|
local git_directory = directory .. "/.git" |
||||||
|
local project_file = directory .. "/.project" |
||||||
|
|
||||||
|
if vim.fn.isdirectory(git_directory) == 1 or vim.fn.filereadable(project_file) == 1 then |
||||||
|
return directory |
||||||
|
end |
||||||
|
|
||||||
|
directory = vim.fn.fnamemodify(directory, ":h") |
||||||
|
end |
||||||
|
|
||||||
|
return nil, current_directory |
||||||
|
end |
||||||
|
|
||||||
|
-- This will merge tables with index-value pairs and keep the unique values |
||||||
|
M.table_merge_unique = function(...) |
||||||
|
local result = {} |
||||||
|
local seen_values = {} |
||||||
|
for _, value in ipairs(vim.tbl_flatten(...)) do |
||||||
|
if not seen_values[value] then |
||||||
|
seen_values[value] = true |
||||||
|
table.insert(result, value) |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
return result |
||||||
|
end |
||||||
|
|
||||||
|
-- Cut off trailing whitespace and trailing blank lines |
||||||
|
-- https://vi.stackexchange.com/questions/37421/how-to-remove-neovim-trailing-white-space |
||||||
|
-- https://stackoverflow.com/questions/7495932/how-can-i-trim-blank-lines-at-the-end-of-file-in-vim |
||||||
|
M.trim_buffer = function() |
||||||
|
local save_cursor = vim.fn.getpos(".") |
||||||
|
pcall(function() vim.cmd([[%s/\s\+$//e]]) end) |
||||||
|
pcall(function() vim.cmd([[%s#\($\n\s*\)\+\%$##]]) end) |
||||||
|
vim.fn.setpos(".", save_cursor) |
||||||
|
end |
||||||
|
|
||||||
|
return M |
@ -0,0 +1,19 @@ |
|||||||
|
-- Usage: |
||||||
|
-- :lua P("Hello World!") |
||||||
|
P = function(v) |
||||||
|
print(vim.inspect(v)) |
||||||
|
return v |
||||||
|
end |
||||||
|
|
||||||
|
RELOAD = function(...) |
||||||
|
return require("plenary.reload").reload_module(...) |
||||||
|
end |
||||||
|
|
||||||
|
R = function(name) |
||||||
|
RELOAD(name) |
||||||
|
return require(name) |
||||||
|
end |
||||||
|
|
||||||
|
LOG = function(v) |
||||||
|
vim.fn.writefile({ vim.inspect(v) }, "/tmp/nvim-log", "a") |
||||||
|
end |
@ -0,0 +1,6 @@ |
|||||||
|
-- Set <space> as the leader key |
||||||
|
-- See `:help mapleader` |
||||||
|
-- NOTE: Must happen before plugins are required (otherwise wrong leader will be used) |
||||||
|
vim.keymap.set({ "n", "v" }, "<Space>", "<Nop>", { silent = true }) |
||||||
|
vim.g.mapleader = " " |
||||||
|
vim.g.maplocalleader = " " |
@ -0,0 +1,169 @@ |
|||||||
|
return { |
||||||
|
|
||||||
|
-- Autocompletion |
||||||
|
{ |
||||||
|
"hrsh7th/nvim-cmp", |
||||||
|
lazy = true, -- defer |
||||||
|
dependencies = { |
||||||
|
-- Snippet Engine & its associated nvim-cmp source |
||||||
|
"L3MON4D3/LuaSnip", |
||||||
|
"saadparwaiz1/cmp_luasnip", |
||||||
|
|
||||||
|
-- Adds LSP completion capabilities |
||||||
|
"hrsh7th/cmp-nvim-lsp", -- source for neovim"s built-in LSP client |
||||||
|
"hrsh7th/cmp-nvim-lua", -- source for neovim"s Lua API |
||||||
|
"hrsh7th/cmp-buffer", |
||||||
|
"hrsh7th/cmp-path", |
||||||
|
|
||||||
|
-- Adds a number of user-friendly snippets |
||||||
|
"rafamadriz/friendly-snippets", |
||||||
|
|
||||||
|
-- Icons in the completion menu |
||||||
|
"onsails/lspkind.nvim", |
||||||
|
}, |
||||||
|
config = function() |
||||||
|
local luasnip = require("luasnip") |
||||||
|
require("luasnip.loaders.from_vscode").lazy_load() |
||||||
|
luasnip.config.setup({}) |
||||||
|
|
||||||
|
require("cmp").setup({ |
||||||
|
snippet = { |
||||||
|
expand = function(args) |
||||||
|
luasnip.lsp_expand(args.body) |
||||||
|
end, |
||||||
|
}, |
||||||
|
completion = { |
||||||
|
completeopt = "menu,menuone,noinsert", |
||||||
|
}, |
||||||
|
sources = { |
||||||
|
{ name = "nvim_lsp" }, |
||||||
|
{ name = "nvim_lua" }, |
||||||
|
{ name = "luasnip" }, |
||||||
|
{ name = "buffer" }, |
||||||
|
{ name = "path" }, |
||||||
|
}, |
||||||
|
formatting = { |
||||||
|
fields = { "kind", "abbr", "menu" }, |
||||||
|
-- https://github.com/hrsh7th/nvim-cmp/wiki/Menu-Appearance#how-to-get-types-on-the-left-and-offset-the-menu |
||||||
|
-- https://github.com/onsails/lspkind.nvim#option-2-nvim-cmp |
||||||
|
format = function(entry, vim_item) |
||||||
|
local kind = require("lspkind").cmp_format({ mode = "symbol_text", maxwidth = 50 })(entry, |
||||||
|
vim_item) |
||||||
|
local strings = vim.split(kind.kind, "%s", { trimempty = true }) |
||||||
|
kind.kind = strings[1] or "" |
||||||
|
kind.menu = " (" .. (strings[2] or "") .. ")" |
||||||
|
|
||||||
|
return kind |
||||||
|
end, |
||||||
|
expandable_indicator = true, |
||||||
|
}, |
||||||
|
mapping = require("keybinds").nvim_cmp(), |
||||||
|
}) |
||||||
|
end, |
||||||
|
}, |
||||||
|
|
||||||
|
-- LSP Configuration & Plugins |
||||||
|
{ -- https://github.com/neovim/nvim-lspconfig |
||||||
|
"neovim/nvim-lspconfig", |
||||||
|
dependencies = { |
||||||
|
-- Additional lua configuration, makes Nvim stuff amazing! |
||||||
|
"folke/neodev.nvim", |
||||||
|
-- C# "Goto Definition" with decompilation support |
||||||
|
"Hoffs/omnisharp-extended-lsp.nvim", |
||||||
|
}, |
||||||
|
config = function() |
||||||
|
-- Setup neovim Lua configuration |
||||||
|
require("neodev").setup() |
||||||
|
|
||||||
|
-- Vim process |
||||||
|
local pid = vim.fn.getpid() |
||||||
|
|
||||||
|
-- Setup language servers |
||||||
|
-- https://github.com/neovim/nvim-lspconfig/blob/master/doc/server_configurations.md |
||||||
|
local servers = { |
||||||
|
clangd = {}, -- C/C++ |
||||||
|
intelephense = {}, -- PHP |
||||||
|
lua_ls = { -- Lua, via lua-language-server |
||||||
|
settings = { |
||||||
|
Lua = { |
||||||
|
workspace = { checkThirdParty = false }, |
||||||
|
telemetry = { enable = false }, |
||||||
|
diagnostics = { |
||||||
|
-- Ignore Lua_LS's noisy `missing-fields` warnings |
||||||
|
disable = { "missing-fields" }, |
||||||
|
-- Ignore Lua_LS's noise `undefined global` warnings |
||||||
|
globals = { "vim" }, |
||||||
|
}, |
||||||
|
}, |
||||||
|
}, |
||||||
|
}, |
||||||
|
omnisharp = { -- C#, via omnisharp-roslyn-bin |
||||||
|
cmd = { "/usr/bin/omnisharp", "--languageserver", "--hostPID", tostring(pid) }, |
||||||
|
handlers = { |
||||||
|
["textDocument/definition"] = require('omnisharp_extended').handler, |
||||||
|
}, |
||||||
|
}, |
||||||
|
} |
||||||
|
|
||||||
|
-- nvim-cmp supports additional completion capabilities, so broadcast that to servers |
||||||
|
local capabilities = vim.lsp.protocol.make_client_capabilities() |
||||||
|
capabilities = require("cmp_nvim_lsp").default_capabilities(capabilities) |
||||||
|
|
||||||
|
for server, _ in pairs(servers) do |
||||||
|
local opts = vim.tbl_extend("keep", servers[server], { |
||||||
|
capabilities = capabilities, |
||||||
|
on_attach = require("keybinds").lspconfig_on_attach, |
||||||
|
}) |
||||||
|
require("lspconfig")[server].setup(opts) |
||||||
|
end |
||||||
|
end, |
||||||
|
}, |
||||||
|
|
||||||
|
-- Project |
||||||
|
{ |
||||||
|
"ahmedkhalf/project.nvim", |
||||||
|
opts = { |
||||||
|
detection_methods = { "lsp", "pattern" }, |
||||||
|
patterns = { ".git", ".project" }, |
||||||
|
datapath = vim.fn.stdpath("cache"), |
||||||
|
}, |
||||||
|
config = function(_, opts) |
||||||
|
-- Add syncing between project.nvim and dashboard-nvim project entries. |
||||||
|
-- NOTE: Must come before the project.nvim setup(), |
||||||
|
-- so the glue's VimLeavePre autocmd is defined before it. |
||||||
|
local F = require("core.functions") |
||||||
|
vim.api.nvim_create_autocmd("VimLeavePre", { |
||||||
|
pattern = "*", |
||||||
|
callback = function() |
||||||
|
-- Fetch project.nvim projects |
||||||
|
local project = require("project_nvim.project") |
||||||
|
local history = require("project_nvim.utils.history") |
||||||
|
local recent = history.recent_projects or {} |
||||||
|
local session = history.session_projects or {} |
||||||
|
local recent_plus_session = F.table_merge_unique(recent, session) |
||||||
|
|
||||||
|
-- Fetch dashboard-nvim projects |
||||||
|
local utils = require("dashboard.utils") |
||||||
|
local path = utils.path_join(vim.fn.stdpath("cache"), "dashboard/cache") |
||||||
|
local projects = utils.read_project_cache(path) or {} |
||||||
|
|
||||||
|
-- Add any projects that project.nvim uniquely knows about to dashboard-nvim |
||||||
|
local all_projects = F.table_merge_unique(recent_plus_session, projects) |
||||||
|
vim.fn.writefile({ "return " .. vim.inspect(all_projects) }, path) |
||||||
|
|
||||||
|
-- Add any projects that dashboard-nvim uniquely knows about to project.nvim |
||||||
|
for _, value in ipairs(projects) do |
||||||
|
if not vim.tbl_contains(recent_plus_session, value) then |
||||||
|
pcall(project.set_pwd, value, "manual") -- skip non-existent directories, dont error |
||||||
|
end |
||||||
|
end |
||||||
|
end, |
||||||
|
}) |
||||||
|
|
||||||
|
require("project_nvim").setup(opts) |
||||||
|
require("telescope").load_extension("projects") |
||||||
|
end |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
} |
@ -0,0 +1,90 @@ |
|||||||
|
return { |
||||||
|
|
||||||
|
-- Detect tabstop and shiftwidth automatically |
||||||
|
"tpope/vim-sleuth", |
||||||
|
|
||||||
|
-- "gc" to comment visual regions/lines |
||||||
|
"numToStr/Comment.nvim", |
||||||
|
|
||||||
|
-- Highlight, edit, and navigate code |
||||||
|
{ |
||||||
|
"nvim-treesitter/nvim-treesitter", |
||||||
|
dependencies = { |
||||||
|
"nvim-treesitter/nvim-treesitter-textobjects", |
||||||
|
}, |
||||||
|
build = ":TSUpdate", |
||||||
|
opts = { |
||||||
|
ensure_installed = { |
||||||
|
"bash", "c", "cmake", "cpp", "c_sharp", "css", "go", |
||||||
|
"haskell", "html", "java", "javascript", "jsdoc", "json", |
||||||
|
"latex", "lua", "make", "markdown", "php", "python", |
||||||
|
"query", "regex", "rust", "toml", "tsx", "typescript", |
||||||
|
"vim", "vimdoc", "yaml", |
||||||
|
}, |
||||||
|
sync_install = false, |
||||||
|
auto_install = true, |
||||||
|
|
||||||
|
-- Default install directory is <plugin_path>/parser |
||||||
|
-- parser_install_dir |
||||||
|
|
||||||
|
highlight = { |
||||||
|
enable = true, |
||||||
|
additional_vim_regex_highlighting = false, |
||||||
|
}, |
||||||
|
indent = { |
||||||
|
enable = true, |
||||||
|
}, |
||||||
|
} |
||||||
|
}, |
||||||
|
|
||||||
|
-- Auto-save |
||||||
|
{ |
||||||
|
"okuuva/auto-save.nvim", |
||||||
|
cmd = "ASToggle", -- defer, until run command |
||||||
|
event = { "InsertLeave", "TextChanged" }, -- defer, until event trigger |
||||||
|
opts = { |
||||||
|
execution_message = { |
||||||
|
enabled = true, |
||||||
|
message = function() |
||||||
|
return [["]] .. vim.fn.bufname() .. [[" written]] |
||||||
|
end, |
||||||
|
}, |
||||||
|
debounce_delay = 5000, -- delay for `defer_save`, in ms |
||||||
|
condition = function(buf) |
||||||
|
-- Dont save special-buffers |
||||||
|
return vim.fn.getbufvar(buf, "&buftype") == "" |
||||||
|
end, |
||||||
|
}, |
||||||
|
config = function(_, opts) |
||||||
|
require("auto-save").setup(opts) |
||||||
|
|
||||||
|
-- Cut off trailing whitespace and trailing blank lines |
||||||
|
local group = vim.api.nvim_create_augroup("AutoSave", { clear = false }) |
||||||
|
local core = require("core.functions") |
||||||
|
vim.api.nvim_create_autocmd("User", { |
||||||
|
pattern = "AutoSaveWritePre", |
||||||
|
group = group, |
||||||
|
callback = function(event) |
||||||
|
if event.data.saved_buffer ~= nil then |
||||||
|
core.trim_buffer() |
||||||
|
end |
||||||
|
end, |
||||||
|
}) |
||||||
|
end, |
||||||
|
}, |
||||||
|
|
||||||
|
-- Autopair / electric pair |
||||||
|
{ -- https://github.com/altermo/ultimate-autopair.nvim |
||||||
|
"altermo/ultimate-autopair.nvim", |
||||||
|
event = { "InsertEnter", "CmdlineEnter" }, -- defer |
||||||
|
branch = "development", |
||||||
|
opts = { |
||||||
|
bs = { -- See: `:h ultimate-autopair-map-backspace-config` |
||||||
|
-- Call the backspace logic from the config, instead of automap |
||||||
|
-- https://github.com/altermo/ultimate-autopair.nvim/issues/60 |
||||||
|
map = "<Plug>ultimate-autopair-BS", |
||||||
|
}, |
||||||
|
}, |
||||||
|
}, |
||||||
|
|
||||||
|
} |
@ -0,0 +1,33 @@ |
|||||||
|
return { |
||||||
|
|
||||||
|
-- Adds git related signs to the gutter/fringe |
||||||
|
{ |
||||||
|
"lewis6991/gitsigns.nvim", |
||||||
|
opts = { |
||||||
|
-- See `:help gitsigns.txt` |
||||||
|
signs = { |
||||||
|
add = { text = "█" }, |
||||||
|
change = { text = "█" }, |
||||||
|
delete = { text = "█" }, |
||||||
|
topdelete = { text = "█" }, |
||||||
|
changedelete = { text = "█" }, |
||||||
|
untracked = { text = "┆" }, |
||||||
|
}, |
||||||
|
}, |
||||||
|
}, |
||||||
|
|
||||||
|
-- Magit clone |
||||||
|
{ |
||||||
|
"NeogitOrg/neogit", |
||||||
|
cmd = "Neogit", -- defer |
||||||
|
lazy = true, |
||||||
|
dependencies = { |
||||||
|
"nvim-lua/plenary.nvim", |
||||||
|
"nvim-telescope/telescope.nvim", |
||||||
|
|
||||||
|
"sindrets/diffview.nvim", -- diff integration |
||||||
|
}, |
||||||
|
opts = {}, |
||||||
|
}, |
||||||
|
|
||||||
|
} |
@ -0,0 +1,309 @@ |
|||||||
|
local builtin |
||||||
|
local telescope |
||||||
|
|
||||||
|
local F = require("core.functions") |
||||||
|
|
||||||
|
local M = {} |
||||||
|
|
||||||
|
M.setup = function() |
||||||
|
-- Prevent dependency loop |
||||||
|
builtin = require("telescope.builtin") |
||||||
|
telescope = require("telescope") |
||||||
|
end |
||||||
|
|
||||||
|
-- Set which-key key section description |
||||||
|
M.wk = function(keybind, description, bufnr) |
||||||
|
require("which-key").register({ |
||||||
|
[keybind] = { name = description, _ = "which_key_ignore" }, |
||||||
|
}, { mode = { "n", "v" }, buffer = bufnr }) -- bufnr = nil means global |
||||||
|
end |
||||||
|
|
||||||
|
M.buffer_close = function() |
||||||
|
-- Check if there are more than 2 buffers and alternate file is set |
||||||
|
local command = vim.fn.expand("#") ~= "" and #vim.fn.getbufinfo({ buflisted = 1 }) > 1 |
||||||
|
and "e #|bd #|bwipeout #" -- see `:h c_#` |
||||||
|
or "bd" |
||||||
|
vim.api.nvim_command(command) |
||||||
|
end |
||||||
|
|
||||||
|
M.buffer_dashboard = function() |
||||||
|
vim.api.nvim_command("Dashboard") |
||||||
|
end |
||||||
|
|
||||||
|
M.file_config = function() |
||||||
|
builtin.find_files({ |
||||||
|
prompt_title = "Nvim Config", |
||||||
|
cwd = "~/.config/nvim", |
||||||
|
hidden = true, |
||||||
|
no_ignore = true, |
||||||
|
-- path_display = { "shorten" }, |
||||||
|
}) |
||||||
|
end |
||||||
|
|
||||||
|
M.file_find = function() |
||||||
|
builtin.find_files({ |
||||||
|
cwd = F.get_current_directory(), |
||||||
|
hidden = true, |
||||||
|
no_ignore = true, |
||||||
|
}) |
||||||
|
end |
||||||
|
|
||||||
|
M.file_find_home = function() |
||||||
|
builtin.find_files({ |
||||||
|
cwd = "~", |
||||||
|
hidden = true, |
||||||
|
no_ignore = true, |
||||||
|
}) |
||||||
|
end |
||||||
|
|
||||||
|
M.file_find_root = function() |
||||||
|
local cwd = F.get_current_directory():gsub("^/", "") |
||||||
|
builtin.find_files({ default_text = cwd, cwd = "/" }) |
||||||
|
end |
||||||
|
|
||||||
|
M.file_find_recent = function() |
||||||
|
telescope.extensions.recent_files.pick() |
||||||
|
end |
||||||
|
|
||||||
|
M.file_save = function() |
||||||
|
vim.api.nvim_command("w") |
||||||
|
end |
||||||
|
|
||||||
|
M.goto_trouble = function() |
||||||
|
vim.api.nvim_command("Trouble") |
||||||
|
end |
||||||
|
|
||||||
|
M.goto_todos_telescope = function() |
||||||
|
vim.api.nvim_command("TodoTelescope") |
||||||
|
end |
||||||
|
|
||||||
|
M.goto_todos_trouble = function() |
||||||
|
vim.api.nvim_command("TodoTrouble") |
||||||
|
end |
||||||
|
|
||||||
|
-- Smart delete |
||||||
|
M.hungry_delete = function() |
||||||
|
return function() |
||||||
|
local start_line = vim.fn.line(".") |
||||||
|
local start_col = vim.fn.col(".") |
||||||
|
local start_line_content = vim.fn.getline(start_line) |
||||||
|
local line_length = start_line_content:len() |
||||||
|
|
||||||
|
-- Check if there are multiple whitespace characters after the cursor |
||||||
|
local is_1_whitespace = start_line_content:sub(start_col, start_col):match("%s") |
||||||
|
local is_2_whitespace = start_line_content:sub(start_col + 1, start_col + 1):match("%s") |
||||||
|
if (start_col <= line_length - 1 and is_1_whitespace and is_2_whitespace) |
||||||
|
or (start_col == line_length and is_1_whitespace) |
||||||
|
or start_col - 1 == line_length then -- in insert mode, the column is 1 higher |
||||||
|
-- Hungry delete |
||||||
|
|
||||||
|
-- Iterate forwards through each line and character |
||||||
|
local last_line = vim.fn.line("$") |
||||||
|
for line = start_line, last_line do |
||||||
|
local line_content = (line == start_line) and start_line_content or vim.fn.getline(line) |
||||||
|
local col = (line == start_line) and start_col or 1 |
||||||
|
|
||||||
|
for c = col, #line_content do |
||||||
|
local char = line_content:sub(c, c) |
||||||
|
|
||||||
|
-- Look until it hits a non-whitespace character |
||||||
|
if not vim.fn.strcharpart(char, 0, 1):match("%s") then |
||||||
|
-- Delete empty lines, from the starting line to the current line |
||||||
|
vim.api.nvim_buf_set_lines(0, start_line - 1, line - 1, false, {}) |
||||||
|
|
||||||
|
-- Keep the content that was before the cursor at the start_line, |
||||||
|
-- plus the content from the current column to the end of the current line |
||||||
|
vim.fn.setline(start_line, |
||||||
|
start_line_content:sub(1, start_col - 1) .. line_content:sub(c)) |
||||||
|
|
||||||
|
vim.fn.cursor({ start_line, start_col }) |
||||||
|
return |
||||||
|
end |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
-- Delete empty lines, if the end of the buffer was only whitespace |
||||||
|
vim.api.nvim_buf_set_lines(0, start_line - 1, last_line, false, {}) |
||||||
|
|
||||||
|
-- Keep the content that was before the cursor |
||||||
|
vim.fn.setline(start_line, start_line_content:sub(1, start_col - 1)) |
||||||
|
|
||||||
|
vim.fn.cursor({ start_line, start_col }) |
||||||
|
else |
||||||
|
-- Normal delete |
||||||
|
vim.cmd("normal! x") |
||||||
|
end |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
-- Smart backspace |
||||||
|
M.hungry_delete_backspace = function() |
||||||
|
-- Cache some values |
||||||
|
local core = require("ultimate-autopair.core") |
||||||
|
local keycode = vim.api.nvim_replace_termcodes("<Plug>ultimate-autopair-BS", true, false, true) |
||||||
|
local fallback = vim.api.nvim_replace_termcodes("<C-h>", true, false, true) -- <BS> => <C-h>, \b |
||||||
|
|
||||||
|
return function() |
||||||
|
local start_line = vim.fn.line(".") |
||||||
|
local start_col = vim.fn.col(".") |
||||||
|
local start_line_content = vim.fn.getline(start_line) |
||||||
|
|
||||||
|
-- Check if there are multiple whitespace characters before the cursor |
||||||
|
local is_1_whitespace = start_line_content:sub(start_col - 1, start_col - 1):match("%s") |
||||||
|
local is_2_whitespace = start_line_content:sub(start_col - 2, start_col - 2):match("%s") |
||||||
|
if (start_col >= 3 and is_1_whitespace and is_2_whitespace) |
||||||
|
or (start_col == 2 and is_1_whitespace) |
||||||
|
or start_col == 1 then |
||||||
|
-- Hungry delete |
||||||
|
|
||||||
|
-- Iterate backwards through each line and character |
||||||
|
for line = start_line, 1, -1 do |
||||||
|
local line_content = (line == start_line) and start_line_content or vim.fn.getline(line) |
||||||
|
local col = (line == start_line) and (start_col - 1) or #line_content |
||||||
|
|
||||||
|
for c = col, 1, -1 do |
||||||
|
local char = line_content:sub(c, c) |
||||||
|
|
||||||
|
-- Look until it hits a non-whitespace character |
||||||
|
if not vim.fn.strcharpart(char, 0, 1):match("%s") then |
||||||
|
-- Delete empty lines, from the starting line to the current line |
||||||
|
vim.api.nvim_buf_set_lines(0, line - 1, start_line - 1, false, {}) |
||||||
|
|
||||||
|
-- Keep the content from the start of the current line to the current column, |
||||||
|
-- plus the content that was after the cursor at the start_line |
||||||
|
vim.fn.setline(line, line_content:sub(1, c) .. (line == start_line |
||||||
|
and line_content:sub(start_col) -- found non-whitespace on the same line it started |
||||||
|
or start_line_content:sub(start_col))) -- jumped through empty lines |
||||||
|
|
||||||
|
vim.fn.cursor({ line, c + 1 }) |
||||||
|
return |
||||||
|
end |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
-- Delete empty lines, if the start of the buffer was only whitespace |
||||||
|
vim.api.nvim_buf_set_lines(0, 0, start_line - 1, false, {}) |
||||||
|
|
||||||
|
-- Keep the content that was after the cursor |
||||||
|
vim.fn.setline(1, "" .. start_line_content:sub(start_col)) |
||||||
|
else |
||||||
|
-- Normal backspace, prevent run_run recursive mapping via fallback to \b |
||||||
|
local actions = core.run_run(keycode) |
||||||
|
vim.api.nvim_feedkeys(actions ~= keycode and actions or fallback, "n", false) -- equivalent to { expr = true } |
||||||
|
end |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
M.lsp_format_buffer = function() |
||||||
|
vim.lsp.buf.format({ |
||||||
|
formatting_options = { |
||||||
|
tabSize = 4, |
||||||
|
insertSpaces = false, |
||||||
|
}, |
||||||
|
}) |
||||||
|
end |
||||||
|
|
||||||
|
M.project_file = function() |
||||||
|
local res, err = F.find_project_root() |
||||||
|
if res then |
||||||
|
builtin.git_files({ cwd = res }) |
||||||
|
else -- fall-back to find_files, if current buffer isnt in a project |
||||||
|
builtin.find_files({ cwd = err }) |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
M.project_grep = function() |
||||||
|
local res, err = F.find_project_root() |
||||||
|
builtin.live_grep({ cwd = res or err }) |
||||||
|
end |
||||||
|
|
||||||
|
M.project_list = function() |
||||||
|
telescope.extensions.projects.projects() |
||||||
|
end |
||||||
|
|
||||||
|
M.search_buffer = function() |
||||||
|
builtin.current_buffer_fuzzy_find({ |
||||||
|
previewer = false, |
||||||
|
sorting_strategy = "ascending", |
||||||
|
}) |
||||||
|
end |
||||||
|
|
||||||
|
-- TODO: Temporary copy/pasted until project_nvim exposes this function |
||||||
|
-- https://github.com/ahmedkhalf/project.nvim/issues/145 |
||||||
|
-- TODO: Create a Telescope extension out of this, for telescope-all-recent |
||||||
|
local function create_finder() |
||||||
|
local results = require("project_nvim").get_recent_projects() |
||||||
|
local entry_display = require("telescope.pickers.entry_display") |
||||||
|
local finders = require("telescope.finders") |
||||||
|
|
||||||
|
-- Reverse results |
||||||
|
for i = 1, math.floor(#results / 2) do |
||||||
|
results[i], results[#results - i + 1] = results[#results - i + 1], results[i] |
||||||
|
end |
||||||
|
local displayer = entry_display.create({ |
||||||
|
separator = " ", |
||||||
|
items = { |
||||||
|
{ |
||||||
|
width = 30, |
||||||
|
}, |
||||||
|
{ |
||||||
|
remaining = true, |
||||||
|
}, |
||||||
|
}, |
||||||
|
}) |
||||||
|
|
||||||
|
local function make_display(entry) |
||||||
|
return displayer({ entry.name, { entry.value, "Comment" } }) |
||||||
|
end |
||||||
|
|
||||||
|
return finders.new_table({ |
||||||
|
results = results, |
||||||
|
entry_maker = function(entry) |
||||||
|
local name = vim.fn.fnamemodify(entry, ":t") |
||||||
|
return { |
||||||
|
display = make_display, |
||||||
|
name = name, |
||||||
|
value = entry, |
||||||
|
ordinal = name .. " " .. entry, |
||||||
|
} |
||||||
|
end, |
||||||
|
}) |
||||||
|
end |
||||||
|
|
||||||
|
M.vc_select_repo = function() |
||||||
|
-- local projects = require("project_nvim").get_recent_projects() |
||||||
|
|
||||||
|
local actions = require("telescope.actions") |
||||||
|
local action_state = require("telescope.actions.state") |
||||||
|
local conf = require("telescope.config").values |
||||||
|
-- local finders = require("telescope.finders") |
||||||
|
local pickers = require("telescope.pickers") |
||||||
|
pickers.new({}, { |
||||||
|
prompt_title = "Select Project", |
||||||
|
finder = create_finder(), |
||||||
|
-- finder = telescope.extensions.projects.create_finder(), |
||||||
|
-- finder = finders.new_table { |
||||||
|
-- results = projects, |
||||||
|
-- }, |
||||||
|
previewer = false, |
||||||
|
sorter = conf.generic_sorter({}), |
||||||
|
attach_mappings = function(prompt_bufnr) |
||||||
|
actions.select_default:replace(function() |
||||||
|
actions.close(prompt_bufnr) |
||||||
|
|
||||||
|
local selection = action_state.get_selected_entry() |
||||||
|
-- require("neogit").open({ cwd = selection[1] }) |
||||||
|
require("neogit").open({ cwd = selection.value }) |
||||||
|
end) |
||||||
|
|
||||||
|
return true |
||||||
|
end, |
||||||
|
}):find() |
||||||
|
end |
||||||
|
|
||||||
|
M.vc_status = function() |
||||||
|
-- Open the repository of the current file |
||||||
|
require("neogit").open({ cwd = "%:p:h" }) |
||||||
|
end |
||||||
|
|
||||||
|
return M |
@ -0,0 +1,231 @@ |
|||||||
|
local K = vim.keymap.set |
||||||
|
|
||||||
|
local builtin |
||||||
|
local wk = require("which-key") |
||||||
|
|
||||||
|
local F = require("keybind-functions") |
||||||
|
|
||||||
|
local M = {} |
||||||
|
|
||||||
|
-------------------------------------------- |
||||||
|
--- Keybindings --- |
||||||
|
|
||||||
|
M.setup = function() |
||||||
|
F.setup() |
||||||
|
|
||||||
|
-- Prevent dependency loop |
||||||
|
builtin = require("telescope.builtin") |
||||||
|
|
||||||
|
-- Change default behavior |
||||||
|
K("n", "Y", "y$") |
||||||
|
K("v", "p", "pgvy") |
||||||
|
|
||||||
|
K("n", "J", "mzJ`z") -- dont move cursor to end of line |
||||||
|
|
||||||
|
K("n", "<C-d>", "<C-d>zz") -- stay in the middle |
||||||
|
K("n", "<C-u>", "<C-u>zz") |
||||||
|
K("n", "n", "nzzzv") |
||||||
|
K("n", "N", "Nzzzv") |
||||||
|
|
||||||
|
K("x", "p", "\"_dP") -- dont overwrite clipboard when pasting visually |
||||||
|
|
||||||
|
-- Remap for dealing with word wrap |
||||||
|
K("n", "k", [[v:count == 0 ? "gk" : "k"]], { expr = true, silent = true }) |
||||||
|
K("n", "j", [[v:count == 0 ? "gj" : "j"]], { expr = true, silent = true }) |
||||||
|
|
||||||
|
-- Tab/Shift+Tab functionality |
||||||
|
K("n", "<Tab>", ">>_") |
||||||
|
K("n", "<S-Tab>", "<<_") |
||||||
|
K("i", "<S-Tab>", "<C-D>") |
||||||
|
K("v", "<Tab>", ">gv") |
||||||
|
K("v", "<S-Tab>", "<gv") |
||||||
|
|
||||||
|
-- Move highlighted blocks |
||||||
|
K("v", "J", ":m '>+1<CR>gv=gv") |
||||||
|
K("v", "K", ":m '<-2<CR>gv=gv") |
||||||
|
|
||||||
|
-- Switch to previous buffer |
||||||
|
K("n", "<M-`>", "<C-6>") |
||||||
|
|
||||||
|
-- Center buffer with Ctrl+L |
||||||
|
K("n", "<C-l>", "zz") |
||||||
|
|
||||||
|
-- Close buffer with Alt-w |
||||||
|
K("n", "<M-w>", F.buffer_close) |
||||||
|
|
||||||
|
-- Hungry delete |
||||||
|
K("i", "<BS>", F.hungry_delete_backspace()) |
||||||
|
K("i", "<Del>", F.hungry_delete()) |
||||||
|
|
||||||
|
---------------------------------------- |
||||||
|
--- Leader keys --- |
||||||
|
|
||||||
|
|
||||||
|
K("n", "<leader><space>", builtin.commands, { desc = "Execute command" }) |
||||||
|
|
||||||
|
|
||||||
|
-- F.wk("<leader>b", "buffer/bookmark") |
||||||
|
K("n", "<leader>bb", builtin.buffers, { desc = "Switch buffer" }) |
||||||
|
K("n", "<leader>bd", F.buffer_dashboard, { desc = "Dashboard" }) |
||||||
|
|
||||||
|
|
||||||
|
F.wk("<leader>c", "comment") |
||||||
|
-- numToStr/Comment.nvim |
||||||
|
K("n", "<leader>cc", "<Plug>(comment_toggle_linewise_current)", { desc = "Comment toggle linewise" }) |
||||||
|
K("n", "<leader>cp", "<Plug>(comment_toggle_blockwise_current)", { desc = "Comment toggle blockwise" }) |
||||||
|
K("x", "<leader>cc", "<Plug>(comment_toggle_linewise_visual)", { desc = "Comment toggle linewise (visual)" }) |
||||||
|
K("x", "<leader>cp", "<Plug>(comment_toggle_blockwise_visual)", { desc = "Comment toggle blockwise (visual)" }) |
||||||
|
|
||||||
|
|
||||||
|
F.wk("<leader>e", "eval") |
||||||
|
K("n", "<leader>eb", ":w<CR>:source %<CR>", { desc = "Evaluate buffer" }) |
||||||
|
|
||||||
|
|
||||||
|
F.wk("<leader>f", "file") |
||||||
|
K("n", "<leader>fc", F.file_config, { desc = "Config file" }) |
||||||
|
K("n", "<leader>ff", F.file_find, { desc = "Find file" }) |
||||||
|
K("n", "<leader>fh", F.file_find_home, { desc = "Find file in ~" }) |
||||||
|
K("n", "<leader>f/", F.file_find_root, { desc = "Find file in root" }) |
||||||
|
K("n", "<leader>fr", F.file_find_recent, { desc = "Find recent file" }) |
||||||
|
K("n", "<leader>fs", F.file_save, { desc = "Save file" }) |
||||||
|
|
||||||
|
|
||||||
|
F.wk("<leader>h", "help") |
||||||
|
K("n", "<leader>hh", builtin.help_tags, { desc = "Describe" }) |
||||||
|
K("n", "<leader>hk", builtin.keymaps, { desc = "Describe key" }) |
||||||
|
K("n", "<leader>hm", builtin.man_pages, { desc = "Describe manpage" }) |
||||||
|
|
||||||
|
|
||||||
|
F.wk("<leader>g", "goto") |
||||||
|
K("n", "<leader>ge", F.goto_trouble, { desc = "Goto trouble" }) |
||||||
|
K("n", "<leader>gt", F.goto_todos_telescope, { desc = "Goto todos (Telescope)" }) |
||||||
|
K("n", "<leader>gT", F.goto_todos_trouble, { desc = "Goto todos (Trouble)" }) |
||||||
|
|
||||||
|
|
||||||
|
F.wk("<leader>p", "project") |
||||||
|
K("n", "<leader>pf", F.project_file, { desc = "Find project file" }) |
||||||
|
K("n", "<leader>pg", F.project_grep, { desc = "Find in project" }) |
||||||
|
K("n", "<leader>pp", F.project_list, { desc = "List projects" }) |
||||||
|
|
||||||
|
|
||||||
|
F.wk("<leader>s", "search") |
||||||
|
K("n", "<leader>ss", F.search_buffer, { desc = "Search buffer" }) |
||||||
|
K("n", "<leader>sq", ":nohlsearch<CR>", { desc = "Stop search", silent = true }) |
||||||
|
|
||||||
|
|
||||||
|
F.wk("<leader>v", "git") -- version control |
||||||
|
K("n", "<leader>vr", F.vc_select_repo, { desc = "Select repo" }) |
||||||
|
K("n", "<leader>vv", F.vc_status, { desc = "Neogit status" }) |
||||||
|
|
||||||
|
|
||||||
|
K({ "n", "v" }, "<leader>w", "<C-W>", { remap = true }) -- keymap and which-key should *both* be triggered |
||||||
|
wk.register({ |
||||||
|
w = { |
||||||
|
name = "window", |
||||||
|
s = "Split window", |
||||||
|
v = "Split window vertically", |
||||||
|
w = "Switch windows", |
||||||
|
q = "Quit a window", |
||||||
|
o = "Close all other windows", |
||||||
|
T = "Break out into a new tab", |
||||||
|
x = "Swap current with next", |
||||||
|
["-"] = "Decrease height", |
||||||
|
["+"] = "Increase height", |
||||||
|
["<lt>"] = "Decrease width", |
||||||
|
[">"] = "Increase width", |
||||||
|
["|"] = "Max out the width", |
||||||
|
["_"] = "Max out the height", |
||||||
|
["="] = "Equally high and wide", |
||||||
|
h = "Go to the left window", |
||||||
|
l = "Go to the right window", |
||||||
|
k = "Go to the up window", |
||||||
|
j = "Go to the down window", |
||||||
|
}, |
||||||
|
}, { mode = { "n", "v" }, prefix = "<leader>", preset = true }) |
||||||
|
-- https://github.com/folke/which-key.nvim/issues/270 |
||||||
|
-- https://github.com/folke/which-key.nvim/blob/main/lua/which-key/plugins/presets/misc.lua |
||||||
|
end |
||||||
|
|
||||||
|
-------------------------------------------- |
||||||
|
--- Plugin specific --- |
||||||
|
|
||||||
|
-- This function gets run when an LSP connects to a particular buffer. |
||||||
|
M.lspconfig_on_attach = function(_, bufnr) |
||||||
|
local nnoremap = function(keys, func, desc) |
||||||
|
vim.keymap.set("n", keys, func, { buffer = bufnr, desc = desc }) |
||||||
|
end |
||||||
|
|
||||||
|
F.wk("<leader>l", "lsp", bufnr) |
||||||
|
nnoremap("<leader>la", vim.lsp.buf.code_action, "Code action") |
||||||
|
nnoremap("<leader>lf", F.lsp_format_buffer, "Format buffer") |
||||||
|
nnoremap("<leader>lr", vim.lsp.buf.rename, "Rename") |
||||||
|
|
||||||
|
F.wk("<leader>lg", "goto", bufnr) |
||||||
|
nnoremap("<leader>lga", builtin.lsp_dynamic_workspace_symbols, "Workspace symbols") |
||||||
|
nnoremap("<leader>lgd", vim.lsp.buf.declaration, "Declaration") |
||||||
|
nnoremap("<leader>lgg", vim.lsp.buf.definition, "Definition") -- builtin.lsp_definitions |
||||||
|
nnoremap("<leader>lgi", builtin.lsp_implementations, "Implementation") |
||||||
|
nnoremap("<leader>lgr", builtin.lsp_references, "References") |
||||||
|
nnoremap("<leader>lgs", builtin.lsp_document_symbols, "Document symbols") |
||||||
|
nnoremap("<leader>lgt", builtin.lsp_type_definitions, "Type definition") |
||||||
|
|
||||||
|
-- See `:help K` for why this keymap |
||||||
|
nnoremap("K", vim.lsp.buf.hover, "Hover Documentation") |
||||||
|
nnoremap("<C-k>", vim.lsp.buf.signature_help, "Signature Documentation") |
||||||
|
end |
||||||
|
|
||||||
|
-- Keybindings for nvim-cmp popup |
||||||
|
M.nvim_cmp = function() |
||||||
|
local cmp = require("cmp") |
||||||
|
local luasnip = require("luasnip") |
||||||
|
return cmp.mapping.preset.insert({ |
||||||
|
["<M-h>"] = cmp.mapping.abort(), |
||||||
|
["<M-j>"] = cmp.mapping.select_next_item(), |
||||||
|
["<M-k>"] = cmp.mapping.select_prev_item(), |
||||||
|
["<M-l>"] = cmp.mapping.confirm({ |
||||||
|
behavior = cmp.ConfirmBehavior.Replace, |
||||||
|
select = true, |
||||||
|
}), |
||||||
|
|
||||||
|
["<Esc>"] = cmp.mapping.abort(), |
||||||
|
["<CR>"] = cmp.mapping.confirm({ |
||||||
|
behavior = cmp.ConfirmBehavior.Replace, |
||||||
|
select = true, |
||||||
|
}), |
||||||
|
["<C-Space>"] = cmp.mapping.complete(), |
||||||
|
|
||||||
|
["<Tab>"] = cmp.mapping(function(fallback) |
||||||
|
if cmp.visible() then |
||||||
|
cmp.select_next_item() |
||||||
|
elseif luasnip.expand_or_locally_jumpable() then |
||||||
|
luasnip.expand_or_jump() |
||||||
|
else |
||||||
|
fallback() |
||||||
|
end |
||||||
|
end, { "i", "s" }), |
||||||
|
["<S-Tab>"] = cmp.mapping(function(fallback) |
||||||
|
if cmp.visible() then |
||||||
|
cmp.select_prev_item() |
||||||
|
elseif luasnip.locally_jumpable(-1) then |
||||||
|
luasnip.jump(-1) |
||||||
|
else |
||||||
|
fallback() |
||||||
|
end |
||||||
|
end, { "i", "s" }), |
||||||
|
}) |
||||||
|
end |
||||||
|
|
||||||
|
-- Telescope picker generic mappings |
||||||
|
M.telescope_default_mappings = function() |
||||||
|
local actions = require("telescope.actions") |
||||||
|
return { |
||||||
|
i = { |
||||||
|
["<M-h>"] = actions.close, |
||||||
|
["<M-j>"] = actions.move_selection_next, |
||||||
|
["<M-k>"] = actions.move_selection_previous, |
||||||
|
["<M-l>"] = actions.select_default, |
||||||
|
} |
||||||
|
} |
||||||
|
end |
||||||
|
|
||||||
|
return M |
@ -0,0 +1,32 @@ |
|||||||
|
local M = {} |
||||||
|
|
||||||
|
local plugin_path = vim.fn.stdpath("cache") .. "/lazy" |
||||||
|
|
||||||
|
-- Install lazy.nvim plugin manager |
||||||
|
-- See `:help lazy.nvim.txt` |
||||||
|
M.install = function() |
||||||
|
local lazy_path = plugin_path .. "/lazy.nvim" |
||||||
|
if not vim.loop.fs_stat(lazy_path) then |
||||||
|
vim.fn.system { |
||||||
|
"git", |
||||||
|
"clone", |
||||||
|
"--filter=blob:none", |
||||||
|
"https://github.com/folke/lazy.nvim.git", |
||||||
|
"--branch=stable", -- latest stable release |
||||||
|
lazy_path, |
||||||
|
} |
||||||
|
end |
||||||
|
vim.opt.rtp:prepend(lazy_path) |
||||||
|
end |
||||||
|
|
||||||
|
M.setup = function(modules) |
||||||
|
M.install() |
||||||
|
|
||||||
|
local options = { |
||||||
|
root = plugin_path, -- directory where plugins will be installed |
||||||
|
} |
||||||
|
|
||||||
|
require("lazy").setup(modules, options) |
||||||
|
end |
||||||
|
|
||||||
|
return M |
@ -0,0 +1,122 @@ |
|||||||
|
return { |
||||||
|
|
||||||
|
-- Fuzzy Finder (files, LSP, etc) |
||||||
|
{ |
||||||
|
"nvim-telescope/telescope.nvim", |
||||||
|
branch = "0.1.x", |
||||||
|
dependencies = { |
||||||
|
"nvim-lua/plenary.nvim", |
||||||
|
-- Fuzzy Finder Algorithm which requires local dependencies to be built. |
||||||
|
{ |
||||||
|
"nvim-telescope/telescope-fzf-native.nvim", |
||||||
|
build = "make", |
||||||
|
cond = function() |
||||||
|
return vim.fn.executable "make" == 1 |
||||||
|
end, |
||||||
|
}, |
||||||
|
-- Extensions |
||||||
|
"smartpde/telescope-recent-files", |
||||||
|
}, |
||||||
|
extensions = { |
||||||
|
"fzf", |
||||||
|
}, |
||||||
|
config = function() |
||||||
|
require("telescope").setup({ |
||||||
|
defaults = { |
||||||
|
sorting_strategy = "ascending", |
||||||
|
|
||||||
|
layout_strategy = "config", |
||||||
|
layout_config = { |
||||||
|
height = 10, -- amount of results |
||||||
|
search_condensed = true, |
||||||
|
}, |
||||||
|
border = true, |
||||||
|
|
||||||
|
history = { |
||||||
|
path = vim.fn.stdpath("cache") .. "/telescope_history", |
||||||
|
}, |
||||||
|
|
||||||
|
mappings = require("keybinds").telescope_default_mappings() |
||||||
|
}, |
||||||
|
}) |
||||||
|
require("telescope").load_extension("fzf") |
||||||
|
require("telescope").load_extension("recent_files") |
||||||
|
|
||||||
|
--- ┌──────────────────────────────────────────────────┐ |
||||||
|
--- │ │ |
||||||
|
--- │ ┌───────────────────┐ │ |
||||||
|
--- │ │ │ │ |
||||||
|
--- │ │ │ │ |
||||||
|
--- │ │ Preview │ │ |
||||||
|
--- │ │ │ │ |
||||||
|
--- │ │ │ │ |
||||||
|
--- │ └───────────────────┘ │ |
||||||
|
--- │ │ |
||||||
|
--- ├──────────────────────────────────────────────────┤ |
||||||
|
--- │ Prompt │ |
||||||
|
--- ├──────────────────────────────────────────────────┤ |
||||||
|
--- │ Results │ |
||||||
|
--- │ │ |
||||||
|
--- └──────────────────────────────────────────────────┘ |
||||||
|
require("telescope.pickers.layout_strategies").config = function(picker, max_columns, max_lines, |
||||||
|
layout_config) |
||||||
|
local p_window = require "telescope.pickers.window" |
||||||
|
local initial_options = p_window.get_initial_window_options(picker) |
||||||
|
local results = initial_options.results |
||||||
|
local prompt = initial_options.prompt |
||||||
|
local preview = initial_options.preview |
||||||
|
-- Layout config isnt filled by Telescope automatically |
||||||
|
layout_config = require("telescope.config").values.layout_config or {} |
||||||
|
|
||||||
|
results.title = "" |
||||||
|
results.borderchars = { "─", "│", "─", "│", "├", "┤", "╯", "╰" } |
||||||
|
|
||||||
|
local bs = picker.window.border and 2 or 0 |
||||||
|
local search_condensed = bs ~= 0 and layout_config.search_condensed and 2 or 0 |
||||||
|
|
||||||
|
-- Height |
||||||
|
prompt.height = 1 |
||||||
|
results.height = layout_config.height or 10 |
||||||
|
local search_height = (prompt.height + results.height + (bs * 3)) |
||||||
|
preview.height = math.floor((max_lines - search_height) * 0.8) |
||||||
|
|
||||||
|
-- Width |
||||||
|
prompt.width = max_columns - (bs ~= 0 and search_condensed == 0 and bs or 0) |
||||||
|
results.width = max_columns - (bs ~= 0 and search_condensed == 0 and bs or 0) |
||||||
|
preview.width = math.floor(max_columns * 0.5) |
||||||
|
|
||||||
|
-- Line (position), coordinates start at top-left |
||||||
|
prompt.line = max_lines - results.height + search_condensed - bs -- take overlapping border into account |
||||||
|
results.line = max_lines - results.height + search_condensed - bs + (bs / 2) + prompt.height |
||||||
|
preview.line = math.floor((max_lines - search_height - preview.height + bs) / 2) + 1 |
||||||
|
|
||||||
|
return { |
||||||
|
preview = picker.previewer and preview.width > 0 and preview, |
||||||
|
prompt = prompt, |
||||||
|
results = results, |
||||||
|
} |
||||||
|
end |
||||||
|
end, |
||||||
|
}, |
||||||
|
|
||||||
|
-- Telescope pickers sorted by recency and frequency |
||||||
|
{ |
||||||
|
"prochri/telescope-all-recent.nvim", |
||||||
|
dependencies = { |
||||||
|
"kkharji/sqlite.lua", |
||||||
|
}, |
||||||
|
opts = { |
||||||
|
database = { |
||||||
|
folder = vim.fn.stdpath("cache"), |
||||||
|
}, |
||||||
|
pickers = { -- extension_name#extension_method |
||||||
|
["projects#projects"] = { |
||||||
|
disable = false, |
||||||
|
use_cwd = false, |
||||||
|
sorting = "frecency", |
||||||
|
}, |
||||||
|
}, |
||||||
|
} |
||||||
|
}, |
||||||
|
|
||||||
|
} |
Loading…
Reference in new issue