Files
nixos-config/modules/home/neovim.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()
'';
};
}