311 lines
9.6 KiB
Lua
311 lines
9.6 KiB
Lua
vim.g.mapleader = " "
|
|
|
|
-- {{{ Vim options
|
|
|
|
-- tabs
|
|
vim.opt.expandtab = true
|
|
vim.opt.tabstop = 4
|
|
vim.opt.shiftwidth = 4
|
|
vim.opt.smartindent = true
|
|
|
|
|
|
-- disable modeline
|
|
vim.opt.modeline = false
|
|
|
|
-- folding
|
|
vim.opt.foldmethod = "marker"
|
|
|
|
vim.opt.relativenumber = true
|
|
|
|
vim.opt.scrolloff = 8
|
|
|
|
vim.opt.wrap = false
|
|
|
|
-- undos
|
|
vim.opt.swapfile = false
|
|
vim.opt.backup = false
|
|
vim.opt.undodir = os.getenv("HOME") .. "/.vim/undodir"
|
|
vim.opt.undofile = true
|
|
vim.opt.writebackup = false
|
|
|
|
vim.opt.termguicolors = true
|
|
|
|
-- }}}
|
|
-- {{{ Plugins
|
|
|
|
local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
|
|
if not vim.loop.fs_stat(lazypath) then
|
|
vim.fn.system({
|
|
"git",
|
|
"clone",
|
|
"--filter=blob:none",
|
|
"https://github.com/folke/lazy.nvim.git",
|
|
"--branch=stable", -- latest stable release
|
|
lazypath,
|
|
})
|
|
end
|
|
vim.opt.rtp:prepend(lazypath)
|
|
|
|
require("lazy").setup({
|
|
{
|
|
'christoomey/vim-tmux-navigator',
|
|
config = function()
|
|
vim.g.tmux_navigator_no_mappings = 1
|
|
vim.keymap.set('', '<M-h>', ':<C-U>TmuxNavigateLeft<cr>')
|
|
vim.keymap.set('', '<M-j>', ':<C-U>TmuxNavigateDown<cr>')
|
|
vim.keymap.set('', '<M-k>', ':<C-U>TmuxNavigateUp<cr>')
|
|
vim.keymap.set('', '<M-l>', ':<C-U>TmuxNavigateRight<cr>')
|
|
end,
|
|
},
|
|
{
|
|
'nvim-treesitter/nvim-treesitter',
|
|
build = ':TSUpdate',
|
|
opts = {
|
|
ensure_installed = { "lua", "javascript", "html", "python" },
|
|
sync_install = false,
|
|
highlight = { enable = true },
|
|
indent = { enable = true },
|
|
},
|
|
config = function(_, opts)
|
|
require("nvim-treesitter.configs").setup(opts);
|
|
end,
|
|
},
|
|
{
|
|
"tiagovla/tokyodark.nvim",
|
|
opts = {
|
|
transparent_background = true,
|
|
},
|
|
config = function(_, opts)
|
|
require("tokyodark").setup(opts)
|
|
vim.cmd [[colorscheme tokyodark]]
|
|
end,
|
|
},
|
|
{
|
|
"nvim-lualine/lualine.nvim",
|
|
opts = {
|
|
options = {
|
|
section_separators = '',
|
|
},
|
|
},
|
|
config = true,
|
|
},
|
|
{ "nvim-tree/nvim-web-devicons", lazy = true },
|
|
{
|
|
'VonHeikemen/lsp-zero.nvim',
|
|
branch = 'v2.x',
|
|
event = "User EnableIDE",
|
|
dependencies = {
|
|
-- LSP Support
|
|
{ 'neovim/nvim-lspconfig' }, -- Required
|
|
{ 'williamboman/mason.nvim' }, -- Optional
|
|
{ 'williamboman/mason-lspconfig.nvim' }, -- Optional
|
|
|
|
-- Autocompletion
|
|
{ 'hrsh7th/nvim-cmp' }, -- Required
|
|
{ 'hrsh7th/cmp-nvim-lsp' }, -- Required
|
|
{ 'L3MON4D3/LuaSnip' }, -- Required
|
|
},
|
|
config = function()
|
|
-- {{{ LSP config
|
|
local lsp = require('lsp-zero').preset({})
|
|
|
|
lsp.on_attach(function(client, bufnr)
|
|
-- see :help lsp-zero-keybindings
|
|
-- to learn the available actions
|
|
lsp.default_keymaps({ buffer = bufnr })
|
|
vim.keymap.set('n', 'gr', '<cmd>Telescope lsp_references<cr>', { buffer = true })
|
|
vim.keymap.set('n', '<leader>la', '<cmd>lua vim.lsp.buf.code_action()<cr>', { buffer = true })
|
|
vim.keymap.set('n', '<leader>lr', '<cmd>lua vim.lsp.buf.rename()<cr>', { buffer = true })
|
|
vim.keymap.set('x', 'f', '<cmd>lua vim.lsp.buf.format({async = true})<cr>', { buffer = true })
|
|
end)
|
|
|
|
-- (Optional) Configure lua language server for neovim
|
|
require('lspconfig').lua_ls.setup(lsp.nvim_lua_ls())
|
|
|
|
lsp.setup()
|
|
|
|
local cmp = require('cmp')
|
|
local cmp_action = require('lsp-zero').cmp_action()
|
|
|
|
cmp.setup({
|
|
mapping = {
|
|
['<Tab>'] = cmp_action.luasnip_supertab(),
|
|
['<S-Tab>'] = cmp_action.luasnip_shift_supertab(),
|
|
-- Requires the terminal to send proper keycodes (put this in .Xresources):
|
|
-- URxvt.keysym.S-Return: \033[13;2u
|
|
-- URxvt.keysym.C-Return: \033[13;5u
|
|
['<S-Enter>'] = cmp.mapping.confirm({ select = true }),
|
|
},
|
|
window = {
|
|
completion = {
|
|
max_height = 10,
|
|
},
|
|
},
|
|
})
|
|
-- }}}
|
|
end
|
|
},
|
|
{
|
|
'nvim-telescope/telescope.nvim',
|
|
tag = '0.1.2',
|
|
dependencies = { 'nvim-lua/plenary.nvim' },
|
|
config = function ()
|
|
local builtin = require('telescope.builtin')
|
|
vim.keymap.set('n', '<leader>ff', function()
|
|
builtin.find_files({ follow = true, hidden = true })
|
|
end, {})
|
|
vim.keymap.set('n', '<leader>fg', builtin.git_files, {})
|
|
vim.keymap.set('n', '<leader>fo', builtin.buffers, {})
|
|
vim.keymap.set('n', '<leader>st', builtin.live_grep, {})
|
|
vim.keymap.set('n', '<leader>ss', builtin.lsp_dynamic_workspace_symbols, {})
|
|
end
|
|
},
|
|
{
|
|
'lewis6991/gitsigns.nvim',
|
|
-- {{{ Git signs
|
|
opts = {
|
|
on_attach = function(bufnr)
|
|
local gs = package.loaded.gitsigns
|
|
|
|
local function map(mode, l, r, opts)
|
|
opts = opts or {}
|
|
opts.buffer = bufnr
|
|
vim.keymap.set(mode, l, r, opts)
|
|
end
|
|
|
|
-- Navigation
|
|
map('n', ']c', function()
|
|
if vim.wo.diff then return ']c' end
|
|
vim.schedule(function() gs.next_hunk() end)
|
|
return '<Ignore>'
|
|
end, {expr=true})
|
|
|
|
map('n', '[c', function()
|
|
if vim.wo.diff then return '[c' end
|
|
vim.schedule(function() gs.prev_hunk() end)
|
|
return '<Ignore>'
|
|
end, {expr=true})
|
|
|
|
-- Actions
|
|
map('n', '<leader>gs', gs.stage_hunk)
|
|
map('n', '<leader>gr', gs.reset_hunk)
|
|
map('v', '<leader>gs', function() gs.stage_hunk {vim.fn.line('.'), vim.fn.line('v')} end)
|
|
map('v', '<leader>gr', function() gs.reset_hunk {vim.fn.line('.'), vim.fn.line('v')} end)
|
|
map('n', '<leader>gu', gs.undo_stage_hunk)
|
|
map('n', '<leader>gR', gs.reset_buffer)
|
|
map('n', '<leader>gp', gs.preview_hunk)
|
|
map('n', '<leader>gl', function() gs.blame_line{full=true} end)
|
|
map('n', '<leader>gt', gs.toggle_current_line_blame)
|
|
map('n', '<leader>gj', gs.next_hunk)
|
|
map('n', '<leader>gk', gs.prev_hunk)
|
|
|
|
-- Text object
|
|
map({'o', 'x'}, 'ih', ':<C-U>Gitsigns select_hunk<CR>')
|
|
end
|
|
},
|
|
-- }}}
|
|
config = true,
|
|
event = "User EnableIDE",
|
|
},
|
|
{
|
|
'tpope/vim-fugitive',
|
|
event = "User EnableIDE",
|
|
},
|
|
{
|
|
'numToStr/Comment.nvim',
|
|
lazy = false,
|
|
config = function ()
|
|
require("Comment").setup({
|
|
mappings = {
|
|
basic = false,
|
|
extra = false,
|
|
}
|
|
})
|
|
local api = require("Comment.api")
|
|
local esc = vim.api.nvim_replace_termcodes(
|
|
'<ESC>', true, false, true
|
|
)
|
|
vim.keymap.set('n', '<leader>/', api.toggle.linewise.current)
|
|
vim.keymap.set('n', '<leader>(', api.toggle.blockwise.current)
|
|
vim.keymap.set('x', '<leader>/', function()
|
|
vim.api.nvim_feedkeys(esc, 'nx', false)
|
|
api.toggle.linewise(vim.fn.visualmode())
|
|
end)
|
|
vim.keymap.set('x', '<leader>(', function()
|
|
vim.api.nvim_feedkeys(esc, 'nx', false)
|
|
api.toggle.blockwise(vim.fn.visualmode())
|
|
end)
|
|
end,
|
|
},
|
|
{
|
|
'jamessan/vim-gnupg',
|
|
-- ft = { ".gpg", ".pgp", ".asc" },
|
|
},
|
|
{
|
|
'andweeb/presence.nvim',
|
|
event = 'User EnablePresence',
|
|
config = function ()
|
|
require("presence").setup({
|
|
main_image = "file"
|
|
})
|
|
end,
|
|
},
|
|
{
|
|
-- heuristically detect file indentation
|
|
'tpope/vim-sleuth',
|
|
},
|
|
{
|
|
'https://github.com/github/copilot.vim',
|
|
cmd = "Copilot",
|
|
},
|
|
{
|
|
'RRethy/vim-illuminate',
|
|
event = "User EnableIDE",
|
|
},
|
|
})
|
|
-- }}}
|
|
-- {{{ Keymap
|
|
|
|
-- quick vertical movement
|
|
vim.keymap.set('', '<C-j>', '10j')
|
|
vim.keymap.set('', '<C-k>', '10k')
|
|
|
|
-- buffers
|
|
vim.keymap.set('', 'H', '<cmd>bprevious<cr>');
|
|
vim.keymap.set('', 'L', '<cmd>bnext<cr>');
|
|
|
|
-- do not exit visual mode when indenting
|
|
vim.keymap.set('v', '<', '<gv')
|
|
vim.keymap.set('v', '>', '>gv')
|
|
|
|
-- close buffer with confirm
|
|
vim.keymap.set('n', '<leader>c', ':confirm bdelete<cr>')
|
|
|
|
-- copy to system clipboard
|
|
vim.keymap.set({"n", "v"}, "<leader>y", [["+y]])
|
|
vim.keymap.set("n", "<leader>Y", [["+Y]])
|
|
|
|
vim.keymap.set("n", "<leader>fv", "<cmd>Ex<cr>")
|
|
-- }}}
|
|
-- {{{ IDE mode
|
|
vim.api.nvim_create_user_command("IDE", function ()
|
|
vim.api.nvim_exec_autocmds("User", { pattern = "EnableIDE" })
|
|
end, {})
|
|
if os.getenv("NVIM_IDE_MODE") == "1" then
|
|
vim.cmd [[IDE]]
|
|
end
|
|
-- }}}
|
|
|
|
vim.api.nvim_create_autocmd({ "BufEnter", "BufWinEnter" }, {
|
|
pattern = { "*.eml", "*.mail" },
|
|
callback = function(_)
|
|
vim.cmd("setl tw=80")
|
|
vim.cmd("setl fo=awq")
|
|
vim.cmd("setl comments+=nb:>")
|
|
vim.cmd([[match ErrorMsg '\s\+$']])
|
|
end
|
|
})
|
|
|
|
vim.api.nvim_create_user_command("Presence", function ()
|
|
vim.api.nvim_exec_autocmds("User", { pattern = "EnablePresence" })
|
|
end, {})
|