diff --git a/home/base.nix b/home/base.nix index b32659f..ebd1fa9 100644 --- a/home/base.nix +++ b/home/base.nix @@ -12,6 +12,8 @@ ./modules/zsh.nix ./modules/kitty.nix ./modules/starship.nix + ./modules/neovim.nix + ./modules/git.nix ]; home.packages = with pkgs; [ diff --git a/home/modules/git.nix b/home/modules/git.nix new file mode 100644 index 0000000..0a04517 --- /dev/null +++ b/home/modules/git.nix @@ -0,0 +1,46 @@ +{ config, lib, ... }: + +{ + programs.delta = { + enable = true; + enableGitIntegration = true; + options = { + navigate = true; + side-by-side = true; + line-numbers = true; + syntax-theme = "gruvbox-dark"; + }; + }; + + programs.git = { + enable = true; + + settings = { + user.name = "Ayman Boukraa"; + user.email = "your@email.com"; + + alias = { + st = "status"; + co = "checkout"; + br = "branch"; + lg = "log --oneline --graph --decorate"; + undo = "reset HEAD~1 --mixed"; + }; + + init.defaultBranch = "master"; + pull.rebase = true; + push.autoSetupRemote = true; + core.editor = "emacsclient -c"; + diff.tool = "nvimdiff"; + merge.tool = "nvimdiff"; + }; + + ignores = [ + ".DS_Store" + "*.swp" + ".direnv" + ".envrc" + "result" + ]; + }; +} diff --git a/home/modules/neovim.nix b/home/modules/neovim.nix new file mode 100644 index 0000000..ef5d315 --- /dev/null +++ b/home/modules/neovim.nix @@ -0,0 +1,148 @@ +{ config, pkgs, ... }: + +let + c = config.theme.colors; +in +{ + programs.neovim = { + enable = true; + viAlias = true; + vimAlias = true; + + extraPackages = with pkgs; [ + lua-language-server + nil + nixfmt + ripgrep + fd + ]; + + plugins = with pkgs.vimPlugins; [ + # Gruvbox theme + gruvbox-nvim + + # Treesitter — better syntax highlighting + { + plugin = nvim-treesitter.withAllGrammars; + type = "lua"; + config = '' + require("nvim-treesitter").setup({ + highlight = { enable = true }, + indent = { enable = true }, + }) + ''; +} + # File explorer + { + plugin = nvim-tree-lua; + type = "lua"; + config = '' + require("nvim-tree").setup() + vim.keymap.set("n", "e", "NvimTreeToggle") + ''; + } + + # Statusline + { + plugin = lualine-nvim; + type = "lua"; + config = '' + require("lualine").setup({ + options = { + theme = "gruvbox-material", + }, + }) + ''; + } + + # Icons (needed by nvim-tree and lualine) + nvim-web-devicons + + # Fuzzy finder + { + plugin = telescope-nvim; + type = "lua"; + config = '' + local builtin = require("telescope.builtin") + vim.keymap.set("n", "ff", builtin.find_files) + vim.keymap.set("n", "fg", builtin.live_grep) + vim.keymap.set("n", "fb", builtin.buffers) + ''; + } + + # Comment toggling + { + plugin = comment-nvim; + type = "lua"; + config = ''require("Comment").setup()''; + } + + # Show indentation guides + { + plugin = indent-blankline-nvim; + type = "lua"; + config = ''require("ibl").setup()''; + } + ]; + + initLua = '' + -- Leader key + vim.g.mapleader = " " + + -- Colorscheme + require("gruvbox").setup({ + contrast = "medium", + transparent_mode = false, + }) + vim.cmd("colorscheme gruvbox") + + -- Line numbers + vim.opt.number = true + vim.opt.relativenumber = true + + -- Indentation + vim.opt.tabstop = 2 + vim.opt.shiftwidth = 2 + vim.opt.expandtab = true + vim.opt.smartindent = true + + -- Search + vim.opt.ignorecase = true + vim.opt.smartcase = true + vim.opt.hlsearch = false + + -- UI + vim.opt.termguicolors = true + vim.opt.signcolumn = "yes" + vim.opt.cursorline = true + vim.opt.scrolloff = 8 + vim.opt.wrap = false + vim.opt.splitright = true + vim.opt.splitbelow = true + + -- System clipboard + vim.opt.clipboard = "unnamedplus" + + -- Keymaps + local map = vim.keymap.set + + -- Better window navigation + map("n", "", "h") + map("n", "", "j") + map("n", "", "k") + map("n", "", "l") + + -- Move lines up/down in visual mode + map("v", "J", ":m '>+1gv=gv") + map("v", "K", ":m '<-2gv=gv") + + -- Keep cursor centered when scrolling + map("n", "", "zz") + map("n", "", "zz") + + -- Save and quit + map("n", "w", "w") + map("n", "q", "q") + ''; + }; +}