From 0aa591b57ae8cd282b808b375e01923a23311f42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kier=C3=A1n=20Meinhardt?= Date: Tue, 3 Feb 2026 17:25:28 +0100 Subject: [PATCH] vim, zsh --- flake.lock | 47 ++++++++++ flake.nix | 55 +++++++++++ modules/vim.nix | 7 ++ modules/zsh.nix | 94 +++++++++++++++++++ packages/vim-kmein/default.nix | 108 +++++++++++++++++++++ packages/vim-kmein/init.lua | 167 +++++++++++++++++++++++++++++++++ packages/vim-kmein/init.vim | 136 +++++++++++++++++++++++++++ packages/vim-kmein/shared.vim | 30 ++++++ 8 files changed, 644 insertions(+) create mode 100644 flake.lock create mode 100644 flake.nix create mode 100644 modules/vim.nix create mode 100644 modules/zsh.nix create mode 100644 packages/vim-kmein/default.nix create mode 100644 packages/vim-kmein/init.lua create mode 100644 packages/vim-kmein/init.vim create mode 100644 packages/vim-kmein/shared.vim diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..8d3d6b0 --- /dev/null +++ b/flake.lock @@ -0,0 +1,47 @@ +{ + "nodes": { + "nixpkgs": { + "locked": { + "lastModified": 1770134715, + "narHash": "sha256-bugJ+uTtL38KIh3M9vwXjTT3kt203MQbhD6ro1FcYsU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "2482bf09c2d388464c9fe0a49a39b42932fed967", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "nixpkgs": "nixpkgs", + "treefmt-nix": "treefmt-nix" + } + }, + "treefmt-nix": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1769691507, + "narHash": "sha256-8aAYwyVzSSwIhP2glDhw/G0i5+wOrren3v6WmxkVonM=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "28b19c5844cc6e2257801d43f2772a4b4c050a1b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..48600c9 --- /dev/null +++ b/flake.nix @@ -0,0 +1,55 @@ +{ + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs"; + treefmt-nix.url = "github:numtide/treefmt-nix"; + treefmt-nix.inputs.nixpkgs.follows = "nixpkgs"; + }; + outputs = + inputs: + let + lib = inputs.nixpkgs.lib; + eachSupportedSystem = lib.genAttrs lib.systems.flakeExposed; + treefmtEval = eachSupportedSystem ( + system: + inputs.treefmt-nix.lib.evalModule inputs.nixpkgs.legacyPackages.${system} ( + { pkgs, ... }: + { + projectRootFile = "flake.nix"; + programs.nixfmt.enable = true; + programs.ormolu.enable = true; + programs.black.enable = true; + programs.prettier.enable = true; + programs.stylua.enable = true; + } + ) + ); + in + { + nixosModules = { + vim-kmein = modules/vim.nix; + zsh-kmein = modules/zsh.nix; + }; + + overlays.default = final: prev: { + vim-kmein = prev.callPackage packages/vim-kmein { }; + }; + + packages = eachSupportedSystem ( + system: + let + pkgs = import inputs.nixpkgs { + inherit system; + overlays = [ inputs.self.overlays.default ]; + }; + in + { + inherit (pkgs) vim-kmein; + } + ); + + formatter = eachSupportedSystem (system: treefmtEval.${system}.config.build.wrapper); + checks = eachSupportedSystem (system: { + formatting = treefmtEval.${system}.config.build.check inputs.self; + }); + }; +} diff --git a/modules/vim.nix b/modules/vim.nix new file mode 100644 index 0000000..4dce530 --- /dev/null +++ b/modules/vim.nix @@ -0,0 +1,7 @@ +{ lib, pkgs, ... }: +{ + environment.variables.EDITOR = lib.getExe pkgs.vim-kmein; + environment.shellAliases.vi = "nvim"; + environment.shellAliases.vim = "nvim"; + environment.shellAliases.view = "nvim -R"; +} diff --git a/modules/zsh.nix b/modules/zsh.nix new file mode 100644 index 0000000..72da6a9 --- /dev/null +++ b/modules/zsh.nix @@ -0,0 +1,94 @@ +{ pkgs, config, ... }: +let + promptColours.success = "cyan"; + promptColours.failure = "red"; +in +{ + programs.zsh = + let + zsh-completions = pkgs.fetchFromGitHub { + owner = "zsh-users"; + repo = "zsh-completions"; + rev = "cf565254e26bb7ce03f51889e9a29953b955b1fb"; + sha256 = "1yf4rz99acdsiy0y1v3bm65xvs2m0sl92ysz0rnnrlbd5amn283l"; + }; + in + { + enable = true; + enableCompletion = true; + autosuggestions.enable = true; + syntaxHighlighting.enable = true; + syntaxHighlighting.highlighters = [ + "main" + "brackets" + "pattern" + "line" + ]; + interactiveShellInit = '' + setopt INTERACTIVE_COMMENTS CORRECT + setopt MULTIOS + setopt AUTO_NAME_DIRS + setopt AUTOCD CDABLE_VARS + setopt HIST_IGNORE_ALL_DUPS + setopt VI + setopt AUTO_MENU + setopt COMPLETE_IN_WORD + setopt ALWAYS_TO_END + unsetopt NOMATCH + unsetopt MENU_COMPLETE + + zstyle ':completion:*:*:*:*:*' menu select + zstyle ':completion:*' matcher-list 'm:{a-zA-Z-_}={A-Za-z_-}' 'r:|=*' 'l:|=* r:|=*' + zstyle ':completion:*' special-dirs true + zstyle ':completion:*' list-colors \'\' + zstyle ':completion:*:*:kill:*:processes' list-colors '=(#b) #([0-9]#) ([0-9a-z-]#)*=01;34=0=01' + zstyle ':completion:*:*:*:*:processes' command "ps -u $USER -o pid,user,comm -w -w" + zstyle ':completion:*:cd:*' tag-order local-directories directory-stack path-directories + + export KEYTIMEOUT=1 + + hash -d nixos=/etc/nixos niveum=${config.users.users.me.home}/sync/src/niveum + + autoload -U zmv run-help edit-command-line + + fpath=(${zsh-completions}/src $fpath) + ''; + promptInit = '' + autoload -Uz vcs_info + zstyle ':vcs_info:*' enable git + zstyle ':vcs_info:*' check-for-changes true + zstyle ':vcs_info:*' stagedstr '%F{green}+%f' + zstyle ':vcs_info:*' unstagedstr '%F{red}~%f' + zstyle ':vcs_info:*' use-prompt-escapes true + zstyle ':vcs_info:*' formats "%c%u%F{cyan}%b%f" + zstyle ':vcs_info:*' actionformats "(%a) %c%u%F{cyan}%b%f" + + precmd () { + vcs_info + if [ -n "$SSH_CLIENT" ] || [ -n "$SSH_TTY" ] || [ -n "$SSH_CONNECTION" ]; then + RPROMPT="$(hostname)" + else + RPROMPT="$vcs_info_msg_0_" + fi + if [[ -n $IN_NIX_SHELL ]]; then + PROMPT='%B%~%b %(?.%F{${promptColours.success}}.%F{${promptColours.failure}})λ%f ' + else + PROMPT='%B%~%b %(?.%F{${promptColours.success}}.%F{${promptColours.failure}})%#%f ' + fi + print -Pn "\e]2;%n@%M:%~\a" # title bar prompt + } + + zle-keymap-select zle-line-init () { + case $KEYMAP in + vicmd) print -n '\e]12;green\a';; + viins|main) print -n '\e]12;gray\a';; + esac + } + + zle -N zle-line-init + zle -N zle-keymap-select + zle -N edit-command-line + bindkey -M vicmd v edit-command-line + ''; + }; +} diff --git a/packages/vim-kmein/default.nix b/packages/vim-kmein/default.nix new file mode 100644 index 0000000..9f2d03d --- /dev/null +++ b/packages/vim-kmein/default.nix @@ -0,0 +1,108 @@ +{ + neovim, + vimPlugins, + fetchFromGitHub, + vimUtils, + writeText, + stylixColors ? null, + colorscheme ? null, + lib, + ... +}: +neovim.override { + configure = { + vimAlias = true; + viAlias = true; + customRC = '' + source ${./shared.vim} + source ${./init.vim} + let g:snippet_directory = '${vimPlugins.friendly-snippets}' + luafile ${./init.lua} + '' + + lib.optionalString (stylixColors != null) ( + with stylixColors.withHashtag; + '' + luafile ${writeText "colors.lua" '' + require('base16-colorscheme').setup({ + base00 = '${base00}', base01 = '${base01}', base02 = '${base02}', base03 = '${base03}', + base04 = '${base04}', base05 = '${base05}', base06 = '${base06}', base07 = '${base07}', + base08 = '${base08}', base09 = '${base09}', base0A = '${base0A}', base0B = '${base0B}', + base0C = '${base0C}', base0D = '${base0D}', base0E = '${base0E}', base0F = '${base0F}' + }) + ''} + '' + ) + + lib.optionalString (colorscheme != null) '' + colorscheme ${colorscheme} + ''; + packages.nvim = with vimPlugins; { + start = [ + base16-nvim + nvim-cmp + cmp-buffer + cmp-path + cmp-nvim-lsp + cmp-cmdline + luasnip + + editorconfig-vim + + copilot-vim + + fzf-vim + fzfWrapper + supertab + undotree + tabular + # vimwiki + vimPlugins.vim-colors-paramount + nvim-lspconfig + vim-commentary + vim-css-color + vim-eunuch + vimPlugins.vim-fetch + vim-fugitive + vim-gitgutter + vim-repeat + vim-sensible + vim-surround + ( + let + version = "1.1.0"; + pname = "vim-dim"; + in + vimUtils.buildVimPlugin { + pname = "vim-dim"; + version = version; + src = fetchFromGitHub { + owner = "jeffkreeftmeijer"; + repo = pname; + rev = version; + sha256 = "sha256-lyTZUgqUEEJRrzGo1FD8/t8KBioPrtB3MmGvPeEVI/g="; + }; + } + ) + ]; + opt = [ + csv + dhall-vim + elm-vim + emmet-vim + vim-elixir + haskell-vim + vimPlugins.icalendar-vim + vimPlugins.jq-vim + rust-vim + typescript-vim + vim-javascript + vim-ledger + vim-nix + vimtex + vim-pandoc + vim-pandoc-syntax + vimPlugins.vim-256noir + vimPlugins.typst-vim + ]; + }; + }; +} diff --git a/packages/vim-kmein/init.lua b/packages/vim-kmein/init.lua new file mode 100644 index 0000000..a8b4715 --- /dev/null +++ b/packages/vim-kmein/init.lua @@ -0,0 +1,167 @@ +local cmp = require("cmp") +local luasnip = require("luasnip") + +if vim.g.snippet_directory then + require("luasnip.loaders.from_vscode").lazy_load({ + paths = { vim.g.snippet_directory }, + }) +end + +luasnip.config.set_config({ + history = true, + updateevents = "TextChanged,TextChangedI", + enable_autosnippets = true, +}) + +cmp.setup({ + snippet = { + expand = function(args) + luasnip.lsp_expand(args.body) + end, + }, + mapping = { + -- https://github.com/hrsh7th/nvim-cmp/wiki/Example-mappings#super-tab-like-mapping + [""] = cmp.mapping(function(fallback) + if cmp.visible() then + cmp.select_next_item() + elseif luasnip.expand_or_jumpable() then + luasnip.expand_or_jump() + else + fallback() + end + end, { "i", "s" }), + [""] = cmp.mapping(function(fallback) + if cmp.visible() then + cmp.select_prev_item() + elseif luasnip.jumpable(-1) then + luasnip.jump(-1) + else + fallback() + end + end, { "i", "s" }), + }, + sources = cmp.config.sources({ + { name = "nvim_lsp" }, + { name = "luasnip" }, + }), +}) + +local capabilities = require("cmp_nvim_lsp").default_capabilities(vim.lsp.protocol.make_client_capabilities()) + +local opts = { noremap = true, silent = true } +vim.keymap.set("n", "e", vim.diagnostic.open_float, opts) +vim.keymap.set("n", "dn", vim.diagnostic.goto_prev, opts) +vim.keymap.set("n", "dp", vim.diagnostic.goto_next, opts) +vim.keymap.set("n", "q", vim.diagnostic.setloclist, opts) + +-- Use an on_attach function to only map the following keys +-- after the language server attaches to the current buffer +local on_attach = function(client, bufnr) + -- Enable completion triggered by + -- vim.api.nvim_buf_set_option(bufnr, 'omnifunc', 'v:lua.vim.lsp.omnifunc') + -- Mappings. + -- See `:help vim.lsp.*` for documentation on any of the below functions + local bufopts = { noremap = true, silent = true, buffer = bufnr } + vim.keymap.set("n", "gD", vim.lsp.buf.declaration, bufopts) + vim.keymap.set("n", "gd", vim.lsp.buf.definition, bufopts) + vim.keymap.set("n", "gt", vim.lsp.buf.type_definition, bufopts) + vim.keymap.set("n", "K", vim.lsp.buf.hover, bufopts) + vim.keymap.set("n", "gi", vim.lsp.buf.implementation, bufopts) + vim.keymap.set("n", "", vim.lsp.buf.signature_help, bufopts) + vim.keymap.set("n", "f", vim.lsp.buf.format, bufopts) + vim.keymap.set("n", "wa", vim.lsp.buf.add_workspace_folder, bufopts) + vim.keymap.set("n", "wr", vim.lsp.buf.remove_workspace_folder, bufopts) + vim.keymap.set("n", "wl", function() + print(vim.inspect(vim.lsp.buf.list_workspace_folders())) + end, bufopts) + vim.keymap.set("n", "rn", vim.lsp.buf.rename, bufopts) + vim.keymap.set("n", "ca", vim.lsp.buf.code_action, bufopts) + vim.keymap.set("n", "gr", vim.lsp.buf.references, bufopts) + vim.keymap.set("n", "f", function() + vim.lsp.buf.format({ async = true }) + end, bufopts) +end + +local lsp_flags = { + -- This is the default in Nvim 0.7+ + debounce_text_changes = 150, +} + +local language_servers = { + clangd = {}, + pyright = {}, -- pyright + -- tsserver = {}, -- typescript-language-server + cssls = {}, + elmls = {}, -- elm-language-server + gopls = {}, -- gopls + denols = {}, -- deno built in + bashls = {}, -- bash-language-server + lua_ls = { + Lua = { + runtime = { + version = "LuaJIT", + }, + diagnostics = { + globals = { "vim" }, + }, + workspace = { + library = vim.api.nvim_get_runtime_file("", true), + }, + telemetry = { + enable = false, + }, + }, + }, + hls = {}, -- haskell-language-server + html = {}, -- vscode-langservers-extracted + jsonls = {}, -- vscode-langservers-extracted + lemminx = {}, -- lemminx (for xml) + nil_ls = { + ["nil"] = { + formatting = { + command = { "nixfmt" }, + }, + }, + }, -- github:oxalica/nil + dhall_lsp_server = {}, -- dhall-lsp-server + -- rnix = {}, -- rnix-lsp + jqls = {}, -- jq-lsp + rust_analyzer = { ["rust-analyzer"] = {} }, + -- eslint = {}, + -- volar? vls? + texlab = { + texlab = { + auxDirectory = ".", + bibtexFormatter = "texlab", + build = { + args = { "-pdf", "-interaction=nonstopmode", "-synctex=1", "%f" }, + executable = "latexmk", + forwardSearchAfter = false, + onSave = false, + }, + chktex = { + onEdit = false, + onOpenAndSave = false, + }, + diagnosticsDelay = 300, + formatterLineLength = 80, + forwardSearch = { + args = {}, + }, + latexFormatter = "latexindent", + latexindent = { + modifyLineBreaks = false, + }, + }, + }, +} + +for server, settings in pairs(language_servers) do + vim.lsp.config(server, { + on_attach = on_attach, + flags = lsp_flags, + settings = settings, + capabilities = capabilities, + }) + vim.lsp.enable(server) +end diff --git a/packages/vim-kmein/init.vim b/packages/vim-kmein/init.vim new file mode 100644 index 0000000..6d5bff4 --- /dev/null +++ b/packages/vim-kmein/init.vim @@ -0,0 +1,136 @@ +" if tabular +vnoremap a= :Tabularize /= +vnoremap a; :Tabularize /:: +vnoremap a- :Tabularize /-> + +" noremap h :split +" noremap v :vsplit +noremap gs :Git +noremap gc :Git commit + +" reindent whole file +noremap i mzgg=G`z + +" replace all +nnoremap S :%s//g + +" Hit `%` on `if` to jump to `else`. +runtime macros/matchit.vim + +set notitle +set nospell +set backspace=indent,eol,start +set hidden +set ruler +set shiftwidth=2 tabstop=2 expandtab +set laststatus=1 +set number +set path+=** +set splitbelow splitright +set wildmenu wildmode=longest,list,full +set shortmess+=ac +set showmatch +set smartindent +set hlsearch +set foldlevelstart=30 + +nnoremap set nohlsearch + +let g:netrw_banner=0 +let g:netrw_browse_split=4 +let g:netrw_altv=1 " open splits to the right +let g:netrw_liststyle=3 " tree view +let g:netrw_winsize = 25 + +call matchadd('colorcolumn', '\%101v', 100) +highlight colorcolumn ctermbg=red + +" undofile - This allows you to use undos after exiting and restarting +" This, like swap and backups, uses .vim-undo first, then ~/.vim/undo +" :help undo-persistence +if exists("+undofile") + if isdirectory($HOME . '/.vim/undo') == 0 + :silent !mkdir -p ~/.vim/undo > /dev/null 2>&1 + endif + set undodir=~/.vim/undo/ + set undofile +endif + +nnoremap @=(foldlevel('.')?'za':"\") +vnoremap zf + +command! RandomLine execute 'normal! '.(system('/bin/sh -c "echo -n $RANDOM"') % line('$')).'G' + +function! s:DiffWithSaved() + let filetype=&ft + diffthis + vnew | r # | normal! 1Gdd + diffthis + execute "setlocal bt=nofile bh=wipe nobl noswf ro ft=" . filetype +endfunction +command! DiffSaved call s:DiffWithSaved() + +" BACKGROUND COLOR TOGGLE +function! s:toggle_background() + if &background ==# "light" + set background=dark + elseif &background ==# "dark" + set background=light + endif +endfunction +command! ToggleBackground call s:toggle_background() +inoremap :ToggleBackground +nnoremap :ToggleBackground + +augroup filetypes + autocmd! + autocmd bufnewfile,bufread *.4th set filetype=forth + autocmd bufnewfile,bufread *.asm set filetype=nasm + autocmd bufnewfile,bufread *.c set keywordprg=man\ 3 + autocmd bufnewfile,bufread *.h set keywordprg=man\ 3 + autocmd bufnewfile,bufread *.conf set filetype=conf + autocmd bufnewfile,bufread *.nix packadd vim-nix | set filetype=nix | set path+=/var/src + autocmd bufnewfile,bufread *.rust packadd rust-vim + autocmd bufnewfile,bufread *.csv packadd csv.vim | set filetype=csv + autocmd bufnewfile,bufread *.tex packadd vimtex | set filetype=tex + autocmd bufnewfile,bufread *.typ packadd typst.vim | set filetype=typst + autocmd bufnewfile,bufread *.ics packadd icalendar.vim | set filetype=icalendar + autocmd bufnewfile,bufread *.ts packadd typescript-vim | set filetype=typescript + autocmd bufnewfile,bufread *.dhall packadd dhall-vim | set filetype=dhall + autocmd bufnewfile,bufread *.jq packadd jq.vim | set filetype=jq + autocmd bufnewfile,bufread *.journal packadd vim-ledger | set filetype=ledger shiftwidth=4 + autocmd bufnewfile,bufread urls,config set filetype=conf + autocmd bufnewfile,bufread *.elm packadd elm-vim | set filetype=elm shiftwidth=4 + autocmd bufnewfile,bufread *.md packadd vim-pandoc | packadd vim-pandoc-syntax | set filetype=pandoc + autocmd bufnewfile,bufread *.ex,*.exs packadd vim-elixir | set filetype=elixir + autocmd filetype haskell packadd haskell-vim | set keywordprg=hoogle\ -i + autocmd filetype javascript packadd vim-javascript + autocmd filetype make setlocal noexpandtab + autocmd filetype tsv setlocal noexpandtab + autocmd filetype html packadd emmet-vim + autocmd filetype gitcommit setlocal spell spelllang=en + autocmd filetype mail setlocal spell spelllang=de textwidth=0 +augroup end + + +autocmd bufreadpost * + \ if line("'\"") > 0 && line("'\"") <= line("$") | + \ exe "normal! g`\"" | + \ endif +autocmd bufreadpre * setlocal foldmethod=indent + +set completeopt=menu,menuone,noselect +set complete+=kspell + +let g:pandoc#syntax#conceal#use = 0 +let g:pandoc#modules#disabled = [] +let g:pandoc#spell#default_langs = ['en', 'de'] + +autocmd! User GoyoEnter Limelight +autocmd! User GoyoLeave Limelight! + + +" Disable Copilot by default +let b:copilot_enabled = v:false +" keymap to toggle it enabled +nnoremap gc :let b:copilot_enabled = !b:copilot_enabled diff --git a/packages/vim-kmein/shared.vim b/packages/vim-kmein/shared.vim new file mode 100644 index 0000000..a573aac --- /dev/null +++ b/packages/vim-kmein/shared.vim @@ -0,0 +1,30 @@ +nnoremap :FZF +nnoremap :Rg +let g:fzf_layout = { 'down': '~15%' } + +" transparent background +hi Normal guibg=NONE ctermbg=NONE + +let mapleader = "," +let maplocalleader="\\" +noremap n :bn +noremap p :bp +noremap c :bd +noremap b :Buffers +noremap t :Tags + +set nocompatible +syntax on +filetype plugin indent on +set autoindent +set smartcase ignorecase " you need these two +set nowritebackup noswapfile +set mouse=a +set encoding=utf8 ffs=unix,dos,mac +set wrap +set list listchars=tab:⇥\ ,extends:❯,precedes:❮,nbsp:␣,trail:· showbreak=¬ +set clipboard=unnamedplus +set nopaste + +iabbrev ddate =strftime("%F") +iabbrev dtime =strftime("%F %T")