summaryrefslogtreecommitdiff
path: root/nix/programs/neovim
diff options
context:
space:
mode:
Diffstat (limited to 'nix/programs/neovim')
-rw-r--r--nix/programs/neovim/default.nix84
-rw-r--r--nix/programs/neovim/init.lua246
2 files changed, 330 insertions, 0 deletions
diff --git a/nix/programs/neovim/default.nix b/nix/programs/neovim/default.nix
new file mode 100644
index 0000000..ffb4388
--- /dev/null
+++ b/nix/programs/neovim/default.nix
@@ -0,0 +1,84 @@
+{ config, lib, pkgs, ... }:
+
+let
+
+ colorschemeLua = ''
+ -- [[ COLORSCHEME ]] --
+
+ local colorscheme = require('base16-colorscheme')
+ colorscheme.setup({
+ base00 = '#${config.theme.colors.base00}',
+ base01 = '#${config.theme.colors.base01}',
+ base02 = '#${config.theme.colors.base02}',
+ base03 = '#${config.theme.colors.base03}',
+ base04 = '#${config.theme.colors.base04}',
+ base05 = '#${config.theme.colors.base05}',
+ base06 = '#${config.theme.colors.base06}',
+ base07 = '#${config.theme.colors.base07}',
+ base08 = '#${config.theme.colors.base08}',
+ base09 = '#${config.theme.colors.base09}',
+ base0A = '#${config.theme.colors.base0A}',
+ base0B = '#${config.theme.colors.base0B}',
+ base0C = '#${config.theme.colors.base0C}',
+ base0D = '#${config.theme.colors.base0D}',
+ base0E = '#${config.theme.colors.base0E}',
+ base0F = '#${config.theme.colors.base0F}',
+ })
+
+'';
+
+ initLua = lib.fileContents ./init.lua;
+ luaConfig = colorschemeLua + initLua;
+
+in
+{
+ environment.variables.EDITOR = "nvim";
+
+ home-manager.users.${config.user} = {
+ programs.neovim = {
+
+ enable = true;
+ viAlias = true;
+ vimAlias = true;
+ extraLuaConfig = luaConfig;
+
+ plugins = with pkgs.vimPlugins; [
+ # Deoendencies
+ vim-devicons
+ nvim-web-devicons
+ # Lua functions
+ plenary-nvim
+ # Lines
+ lualine-nvim # mode line
+ bufferline-nvim # buffer line
+ # Menus
+ nvim-tree-lua # file browser
+ undotree # undo menu
+ trouble-nvim # error menu
+ telescope-nvim # grep/find menus
+ # Snippets
+ vim-vsnip
+ vim-vsnip-integ
+ friendly-snippets
+ # Completion
+ nvim-cmp
+ cmp-buffer
+ cmp-nvim-lsp
+ cmp-vsnip
+ nvim-surround # delimiter
+ # Lsp
+ base16-nvim # colorscheme
+ nerdcommenter # comment functions
+ nvim-treesitter.withAllGrammars # hilighting
+ vim-illuminate # hilighting
+ todo-comments-nvim # todo comments
+ nvim-lspconfig # lsp server
+ fidget-nvim # notifications
+ indent-o-matic # auto indentation
+ hologram-nvim # images
+ virt-column-nvim # 80 col line
+ ];
+
+ };
+ };
+}
diff --git a/nix/programs/neovim/init.lua b/nix/programs/neovim/init.lua
new file mode 100644
index 0000000..50d50c8
--- /dev/null
+++ b/nix/programs/neovim/init.lua
@@ -0,0 +1,246 @@
+--[[ CONFIG ]]--
+
+-- global config for iris configuration
+config = {
+ -- colorscheme for nvim
+ flavour = "mocha",
+ -- indentation
+ tab_width = 4,
+ expand_tab = false,
+ -- keybinds to be set to actions
+ keybinds = {
+ -- leader key
+ leader = ' ',
+ -- toggle menus
+ menus = {
+ -- file browser
+ browser = '<leader>e',
+ -- active buffers
+ buffers = '<leader>fb',
+ -- error list
+ error = '<leader>t',
+ -- find files
+ find = '<leader>ff',
+ -- grep files
+ grep = '<leader>fg',
+ -- help browser
+ help = '<leader>fh',
+ -- undo tree
+ undo = '<leader>u',
+ },
+ -- lsp actions
+ lsp = {
+ hover = 'K',
+ action = '<leader>la',
+ references = '<leader>lr',
+ rename = '<leader>ln',
+ },
+ -- completion
+ cmp = {
+ -- prev item
+ prev = '<C-p>',
+ -- next item
+ next = '<C-n>',
+ -- confirm
+ confirm = '<CR>',
+ -- complete
+ complete = '<C-Space>',
+ },
+ -- disable active selection
+ noh = '<leader>h',
+ },
+ -- lsp servers
+ lsps = {
+ -- rust
+ rust_analyzer = {},
+ -- c / c++
+ clangd = {},
+ -- java
+ jdtls = {},
+ },
+};
+
+--[[ VIM ]]--
+
+vim.opt.tabstop = config.tab_width
+vim.opt.softtabstop = config.tab_width
+vim.opt.shiftwidth = config.tab_width
+vim.opt.expandtab = config.expand_tab
+vim.opt.mouse = "a"
+vim.opt.clipboard = "unnamedplus"
+vim.opt.hlsearch = true
+vim.opt.autoindent = true
+vim.opt.ttyfast = true
+vim.opt.number = true
+vim.opt.relativenumber = true
+vim.opt.rnu = true
+vim.opt.swapfile = false
+vim.opt.termguicolors = true
+
+-- remove trailing whitespace on save
+vim.api.nvim_create_autocmd({ "BufWritePre" }, {
+ pattern = { "*" },
+ command = [[%s/\s\+$//e]],
+})
+
+--[[ THEME ]]--
+
+vim.api.nvim_set_hl(0, "Normal", { bg = "none" })
+vim.api.nvim_set_hl(0, "NormalFloat", { bg = "none" })
+vim.api.nvim_set_hl(0, "NvimTreeNormal", { bg = "none" })
+vim.api.nvim_set_hl(0, "Comment", { fg = colorscheme.colors.base04 })
+vim.api.nvim_set_hl(0, "@comment", { link = "Comment" })
+
+--[[ LINES ]]--
+
+-- mode line
+require('lualine').setup {
+ options = {
+ theme = config.colorscheme,
+ icons_enabled = true,
+ globalstatus = true,
+ },
+}
+
+-- buffer line
+require("bufferline").setup {}
+
+--[[ MENUS ]]--
+
+-- file browser
+vim.g.loaded_netrw = 1
+vim.g.loaded_netrwPlugin = 1
+vim.opt.termguicolors = true
+
+require("nvim-tree").setup {
+ sort = {
+ sorter = "case_sensitive",
+ },
+ view = {
+ width = 30,
+ },
+ renderer = {
+ group_empty = true,
+ },
+ actions = {
+ open_file = {
+ quit_on_open = true,
+ },
+ },
+ filters = {
+ dotfiles = false,
+ },
+}
+
+--[[ COMPLETION ]]--
+
+-- completion engine
+--local cmp = require('cmp')
+--
+--local cmp_select = {behavior = cmp.SelectBehavior.Select}
+--local cmp_mappings = cmp.mapping.preset.insert({
+-- [config.keybinds.cmp.prev] = cmp.mapping.select_prev_item(cmp_select),
+-- [config.keybinds.cmp.next] = cmp.mapping.select_next_item(cmp_select),
+-- [config.keybinds.cmp.confirm] = cmp.mapping.confirm({ select = true }),
+-- [config.keybinds.cmp.complete] = cmp.mapping.complete(),
+--})
+--
+--cmp_mappings['<Tab>'] = nil
+--cmp_mappings['<S-Tab>'] = nil
+--
+--cmp.setup {
+-- snippet = {
+-- expand = function(args)
+-- vim.fn["vsnip#anonymous"](args.body)
+-- end,
+-- },
+-- sources = cmp.config.sources({
+-- { name = 'nvim_lsp' },
+-- { name = 'vsnip' },
+-- { name = 'buffer' },
+-- }),
+-- mapping = cmp_mappings,
+--}
+--
+-- delimiter completion
+require'nvim-surround'.setup {}
+
+--[[ LSP ]]--
+
+local capabilities = require'cmp_nvim_lsp'.default_capabilities()
+for lsp,config in pairs(config.lsps) do
+ config.capabilities = capabilities
+ require'lspconfig'[lsp].setup(config)
+end
+
+-- illuminate
+require'illuminate'.configure {
+ providers = {
+ 'lsp',
+ 'treesitter',
+ 'regex',
+ },
+}
+
+-- todo comments
+require('todo-comments').setup()
+
+-- auto indentation
+require('indent-o-matic').setup {
+ max_lines = 2048,
+ standard_widths = { 2, 4, 8 },
+ skip_multiline = true,
+}
+
+-- image viewer
+--require'hologram'.setup {
+-- auto_display = true
+--}
+
+-- 80 col bar
+require'virt-column'.setup {
+ enabled = true,
+ virtcolumn = "80"
+}
+
+-- notifications
+require("fidget").setup {
+ notification = {
+ window = {
+ winblend = 0,
+ },
+ },
+}
+
+--[[ KEYBINDS ]]--
+
+vim.g.mapleader = config.keybinds.leader
+vim.g.maplocalleader = config.keybinds.leader
+vim.keymap.set('', '<leader>', '<Nop>', { noremap = true, silent = true })
+
+local function bind(key, action, opts)
+ opts = opts or {}
+ vim.keymap.set('n', key, action, opts)
+end
+
+bind(config.keybinds.noh, vim.cmd.noh)
+bind(config.keybinds.menus.browser, vim.cmd.NvimTreeToggle)
+bind(config.keybinds.menus.undo, vim.cmd.UndotreeToggle)
+bind(config.keybinds.menus.error, function() require'trouble'.toggle() end)
+
+local telescope = require'telescope.builtin'
+bind(config.keybinds.menus.buffers, telescope.buffers)
+bind(config.keybinds.menus.find, telescope.find_files)
+bind(config.keybinds.menus.grep, telescope.live_grep)
+bind(config.keybinds.menus.help, telescope.help_tags)
+
+vim.api.nvim_create_autocmd('LspAttach', {
+ desc = 'LSP actions',
+ callback = function(event)
+ local opts = {buffer = event.buf}
+ bind(config.keybinds.lsp.hover, function() vim.lsp.buf.hover() end, opts)
+ bind(config.keybinds.lsp.action, function() vim.lsp.buf.code_action() end, opts)
+ bind(config.keybinds.lsp.references, function() vim.lsp.buf.references() end, opts)
+ bind(config.keybinds.lsp.rename, function() vim.lsp.buf.rename() end, opts)
+ end
+})