dots/nvim/.config/nvim/init.lua
2024-02-15 15:36:48 +01:00

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, {})