205 lines
6.7 KiB
Nix
205 lines
6.7 KiB
Nix
{ pkgs, ... }:
|
|
|
|
{
|
|
programs.neovim = {
|
|
enable = true;
|
|
defaultEditor = true;
|
|
viAlias = true;
|
|
vimAlias = true;
|
|
|
|
# System tools available on neovim's PATH.
|
|
extraPackages = with pkgs; [
|
|
ripgrep # telescope live_grep
|
|
fzf # telescope-fzf-native
|
|
];
|
|
|
|
plugins = with pkgs.vimPlugins; [
|
|
# theme
|
|
gruber-darker-nvim
|
|
# git
|
|
vim-fugitive
|
|
# lsp
|
|
nvim-lspconfig
|
|
# mason-nvim
|
|
# mason-lspconfig-nvim
|
|
fidget-nvim
|
|
# completion
|
|
blink-cmp
|
|
friendly-snippets
|
|
# treesitter (all grammars built by nix)
|
|
nvim-treesitter.withAllGrammars
|
|
rainbow-delimiters-nvim
|
|
# telescope
|
|
telescope-nvim
|
|
plenary-nvim
|
|
telescope-fzf-native-nvim
|
|
# git gutter
|
|
gitsigns-nvim
|
|
# status line
|
|
lualine-nvim
|
|
# indent guides
|
|
indent-blankline-nvim
|
|
# autopairs
|
|
nvim-autopairs
|
|
# which-key
|
|
which-key-nvim
|
|
# language-specific
|
|
ansible-vim
|
|
];
|
|
|
|
extraLuaConfig = ''
|
|
-- [[ options ]]
|
|
|
|
vim.g.mapleader = " "
|
|
vim.g.maplocalleader = " "
|
|
|
|
vim.opt.termguicolors = true
|
|
vim.opt.hlsearch = false
|
|
vim.opt.tabstop = 2
|
|
vim.opt.shiftwidth = 2
|
|
vim.opt.softtabstop = 2
|
|
vim.opt.expandtab = false
|
|
vim.opt.smartindent = true
|
|
vim.opt.smarttab = true
|
|
vim.opt.autoindent = true
|
|
vim.opt.ignorecase = true
|
|
vim.opt.smartcase = true
|
|
vim.opt.nu = true
|
|
vim.opt.relativenumber = true
|
|
vim.opt.wrap = false
|
|
vim.opt.swapfile = false
|
|
vim.opt.scrolloff = 8
|
|
vim.opt.mouse = 'a'
|
|
vim.opt.breakindent = true
|
|
vim.opt.undofile = true
|
|
vim.opt.signcolumn = 'yes'
|
|
vim.opt.updatetime = 250
|
|
vim.opt.timeoutlen = 300
|
|
vim.opt.completeopt = 'menuone,noselect'
|
|
|
|
-- [[ keybinds ]]
|
|
|
|
vim.keymap.set("", '<Space>', '<Nop>', { silent = true })
|
|
|
|
vim.keymap.set('n', '<leader>y', '"+y', { noremap = true, silent = true, desc = 'Yank to clipboard' })
|
|
vim.keymap.set('n', '<leader>Y', '"+yg_', { noremap = true, silent = true, desc = 'Yank to end of line (clipboard)' })
|
|
vim.keymap.set('n', '<leader>yy', '"+yy', { noremap = true, silent = true, desc = 'Yank line to clipboard' })
|
|
vim.keymap.set('v', '<leader>y', '"+y', { noremap = true, silent = true, desc = 'Yank selection to clipboard' })
|
|
|
|
vim.keymap.set('n', '<leader>v', '"+p', { noremap = true, silent = true, desc = 'Paste from clipboard after cursor' })
|
|
vim.keymap.set('n', '<leader>V', '"+P', { noremap = true, silent = true, desc = 'Paste from clipboard before cursor' })
|
|
vim.keymap.set('v', '<leader>v', '"+p', { noremap = true, silent = true, desc = 'Paste from clipboard (replace selection)' })
|
|
vim.keymap.set('v', '<leader>V', '"+P', { noremap = true, silent = true, desc = 'Paste from clipboard before selection' })
|
|
|
|
vim.keymap.set('n', 'k', "v:count == 0 ? 'gk' : 'k'", { expr = true, silent = true, desc = 'Move up (display line)' })
|
|
vim.keymap.set('n', 'j', "v:count == 0 ? 'gj' : 'j'", { expr = true, silent = true, desc = 'Move down (display line)' })
|
|
|
|
vim.keymap.set('v', 'J', ":m '>+1<CR>gv=gv", { desc = 'Move selection down' })
|
|
vim.keymap.set('v', 'K', ":m '<-2<CR>gv=gv", { desc = 'Move selection up' })
|
|
|
|
vim.keymap.set('n', '<leader>pv', vim.cmd.Ex, { desc = 'Open file explorer' })
|
|
|
|
local hl_group = vim.api.nvim_create_augroup('YankHighlight', { clear = true })
|
|
vim.api.nvim_create_autocmd('TextYankPost', {
|
|
callback = function() vim.highlight.on_yank() end,
|
|
group = hl_group,
|
|
pattern = '*',
|
|
})
|
|
|
|
-- [[ theme ]]
|
|
|
|
require("gruber-darker").setup({
|
|
italic = { strings = false, comments = false, operators = false, folds = false },
|
|
})
|
|
vim.cmd.colorscheme("gruber-darker")
|
|
|
|
-- [[ lsp ]]
|
|
vim.lsp.enable('nixd')
|
|
|
|
vim.diagnostic.config({
|
|
severity_sort = true,
|
|
float = { border = 'rounded', source = 'if_many' },
|
|
underline = { severity = vim.diagnostic.severity.ERROR },
|
|
virtual_text = {
|
|
source = 'if_many',
|
|
spacing = 2,
|
|
format = function(d)
|
|
return d.message
|
|
end,
|
|
},
|
|
})
|
|
|
|
-- [[ completion ]]
|
|
|
|
require("blink.cmp").setup({
|
|
sources = { default = { "lsp", "path", "snippets", "buffer" } },
|
|
completion = {
|
|
documentation = { auto_show = true, auto_show_delay_ms = 500 },
|
|
ghost_text = { enabled = true },
|
|
},
|
|
signature = { enabled = true },
|
|
keymap = { preset = "default" },
|
|
})
|
|
|
|
require("fidget").setup()
|
|
require("which-key").setup()
|
|
|
|
-- [[ treesitter ]]
|
|
|
|
vim.api.nvim_create_autocmd("FileType", {
|
|
pattern = "*",
|
|
callback = function(args)
|
|
local lang = vim.treesitter.language.get_lang(vim.bo[args.buf].filetype)
|
|
if lang and vim.treesitter.language.add(lang) then
|
|
vim.treesitter.start(args.buf)
|
|
end
|
|
end,
|
|
})
|
|
|
|
-- [[ telescope ]]
|
|
|
|
require("telescope").setup({
|
|
defaults = { file_ignore_patterns = { "node_modules" } }
|
|
})
|
|
pcall(require('telescope').load_extension, 'fzf')
|
|
|
|
local tb = require('telescope.builtin')
|
|
vim.keymap.set('n', '<leader>pe', tb.diagnostics, { desc = 'Search diagnostics' })
|
|
vim.keymap.set('n', '<leader>pf', tb.find_files, { desc = 'Find files' })
|
|
vim.keymap.set('n', '<leader>pg', tb.live_grep, { desc = 'Live grep' })
|
|
vim.keymap.set('n', '<leader>pb', tb.buffers, { desc = 'Search buffers' })
|
|
vim.keymap.set('n', '<leader>ph', tb.help_tags, { desc = 'Search help tags' })
|
|
vim.keymap.set('n', '<leader>cs', function()
|
|
tb.spell_suggest(require("telescope.themes").get_cursor({}))
|
|
end, { desc = 'Spelling suggestions' })
|
|
vim.keymap.set('n', '<leader>ca', vim.lsp.buf.code_action, { desc = 'Code action' })
|
|
|
|
-- [[ git ]]
|
|
|
|
require("gitsigns").setup({
|
|
signs = {
|
|
add = { text = '+' },
|
|
change = { text = '~' },
|
|
delete = { text = '_' },
|
|
topdelete = { text = '‾' },
|
|
changedelete = { text = '~' },
|
|
},
|
|
})
|
|
|
|
-- [[ ui ]]
|
|
|
|
require("lualine").setup({
|
|
options = {
|
|
icons_enabled = false,
|
|
theme = 'onedark',
|
|
component_separators = '|',
|
|
section_separators = "",
|
|
},
|
|
})
|
|
|
|
require("ibl").setup()
|
|
require("nvim-autopairs").setup()
|
|
'';
|
|
};
|
|
}
|