nix/modules/nvim.nix
Yan Lin 3e938daef8 Add basic auto-completion to Neovim and comprehensive documentation
- Add nvim-cmp plugin with buffer and path completion sources
- Configure intuitive keybindings for completion navigation:
  * Ctrl+Space to trigger completion manually
  * Tab/Shift+Tab for menu navigation
  * Enter to accept completion, Ctrl+e to close menu
- Enable autoEnableSources for automatic plugin management

- Add comprehensive "Code Editing & Auto-completion" section to README:
  * Document all key features: Gruvbox theme, Tree-sitter, file explorer
  * Provide complete auto-completion usage guide with keybindings
  * Include essential keybinding reference for file operations, clipboard, git
  * Explain completion sources: buffer words and file path suggestions

Benefits:
- Simple, non-intrusive auto-completion without language servers
- Word completion from open buffers for faster typing
- Path completion for file navigation and imports
- Clear documentation for all Neovim features and keybindings
- Follows standard completion UI patterns users expect

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-28 20:36:45 +02:00

224 lines
5.6 KiB
Nix

{ pkgs, ... }:
{
programs.nixvim = {
enable = true;
defaultEditor = true;
# Global settings
globals.mapleader = " ";
# Vim options
opts = {
number = true;
relativenumber = false;
expandtab = true;
shiftwidth = 2;
tabstop = 2;
smartindent = true;
wrap = false;
linebreak = true; # Don't break words when wrapping
breakindent = true; # Preserve indentation when wrapping
termguicolors = true;
};
# Enable filetype detection
viAlias = true;
vimAlias = true;
# Gruvbox colorscheme with hard contrast
colorschemes.gruvbox = {
enable = true;
settings = {
contrast = "hard"; # Makes background much darker (#1d2021 instead of #282828)
background = "dark";
};
};
# Plugins
plugins = {
# File explorer
nvim-tree = {
enable = true;
# NixVim nvim-tree uses extraConfig for detailed settings
};
# Syntax highlighting
treesitter = {
enable = true;
settings = {
highlight = {
enable = true;
additional_vim_regex_highlighting = true;
};
indent = {
enable = true;
};
ensure_installed = []; # Managed by Nix
auto_install = false;
};
grammarPackages = with pkgs.vimPlugins.nvim-treesitter.builtGrammars; [
bash c cpp css dockerfile go html javascript json lua markdown nix python rust typescript yaml
];
};
# Status line with gruvbox theme and relative paths
lualine = {
enable = true;
settings = {
options = {
theme = "gruvbox_dark";
component_separators = { left = "|"; right = "|"; };
section_separators = { left = " "; right = " "; };
};
sections = {
lualine_c = [{ __unkeyed-1 = "filename"; path = 1; }];
};
};
};
# Web dev icons
web-devicons = {
enable = true;
};
# Markdown rendering
render-markdown = {
enable = true;
};
# Basic auto-completion
cmp = {
enable = true;
autoEnableSources = true;
settings = {
sources = [
{ name = "buffer"; } # Words from open buffers
{ name = "path"; } # File system paths
];
mapping = {
"<C-Space>" = "cmp.mapping.complete()"; # Trigger completion manually
"<C-e>" = "cmp.mapping.close()"; # Close completion menu
"<CR>" = "cmp.mapping.confirm({ select = true })"; # Accept selected completion
"<Tab>" = "cmp.mapping.select_next_item()"; # Navigate down in menu
"<S-Tab>" = "cmp.mapping.select_prev_item()"; # Navigate up in menu
};
};
};
};
# Extra plugins that don't have dedicated modules
extraPlugins = with pkgs.vimPlugins; [
vim-fugitive
];
# Keymaps
keymaps = [
# File explorer
{
mode = "n";
key = "<leader>e";
action = ":NvimTreeToggle<CR>";
options = { desc = "Toggle file explorer"; };
}
# Basic keymaps
{
mode = "n";
key = "<leader>w";
action = ":w<CR>";
options = { desc = "Save file"; };
}
{
mode = "n";
key = "<leader>q";
action = ":q<CR>";
options = { desc = "Quit"; };
}
# System clipboard keymaps
{
mode = ["n" "v"];
key = "<leader>y";
action = "\"+y";
options = { desc = "Copy to system clipboard"; };
}
{
mode = "n";
key = "<leader>p";
action = "\"+p";
options = { desc = "Paste from system clipboard"; };
}
{
mode = "v";
key = "<leader>p";
action = "\"+p";
options = { desc = "Replace selection with system clipboard"; };
}
# System integration
{
mode = "n";
key = "<leader>o";
action = ":silent !open %<CR>";
options = { desc = "Open file with system default app"; };
}
{
mode = "n";
key = "<leader>f";
action = ":silent !open -R %<CR>";
options = { desc = "Show current file in Finder"; };
}
# Git keymaps (vim-fugitive)
{
mode = "n";
key = "<leader>gs";
action = ":Git<CR>";
options = { desc = "Git status"; };
}
{
mode = "n";
key = "<leader>gd";
action = ":Git diff<CR>";
options = { desc = "Git diff"; };
}
{
mode = "n";
key = "<leader>gc";
action = ":Git commit<CR>";
options = { desc = "Git commit"; };
}
{
mode = "n";
key = "<leader>gp";
action = ":Git push<CR>";
options = { desc = "Git push"; };
}
# Markdown rendering
{
mode = "n";
key = "<leader>md";
action = ":RenderMarkdown toggle<CR>";
options = { desc = "Toggle markdown rendering"; };
}
];
# Additional Lua configuration for plugins that need custom setup
extraConfigLua = ''
-- Nvim-tree setup with filters
require("nvim-tree").setup({
filters = {
dotfiles = true, -- Hide dotfiles by default (H to toggle)
git_ignored = false, -- Show gitignored files by default (I to toggle)
custom = { -- Hide macOS system files
".DS_Store",
},
},
})
'';
};
}