{ user }: { lib, pkgs, config, ... }: with lib; let editor = config.programs.editor; pkg = editor.package; terminal = config.programs.terminal.package; termcmd = "${terminal}/bin/${terminal.pname}"; menu = config.programs.menu.package + config.programs.menu.dmenuCommand; in { options.programs = { editor = { enable = mkEnableOption "editor"; package = mkPackageOption pkgs "vscodium" { example = "pkgs.vscode"; }; neovim = mkEnableOption "neovim mode"; }; }; config = mkIf editor.enable { home-manager.users.${user}.imports = [{ programs.vscode = { enable = true; package = editor.package; extensions = if editor.neovim then with pkgs; [ vscode-extensions.asvetliakov.vscode-neovim ] else [ ]; userSettings = { "keyboard.dispatch" = "keyCode"; "terminal.integrated.sendKeybindingsToShell" = true; "aws.telemetry" = false; "gitlens.telemetry.enabled" = false; "redhat.telemetry.enabled" = false; "cSpell.language" = "en,en-GB"; } // (if editor.neovim then { "vscode-neovim.neovimExecutablePaths.linux" = "${pkgs.neovim}/bin/nvim"; "extensions.experimental.affinity" = { "asvetliakov.vscode-neovim" = 1; }; } else { }); }; programs.neovim = mkIf editor.neovim { enable = true; defaultEditor = true; coc = { enable = true; settings = { languageserver = { go = { command = "${pkgs.gopls}/bin/gopls"; filetypes = [ "go" ]; }; nix = { command = "${pkgs.rnix-lsp}/bin/rnix-lsp"; filetypes = [ "nix" ]; }; typescript = { command = "${pkgs.nodePackages.typescript-language-server}/bin/typescript-language-server"; filetypes = [ "ts" "tsx" ]; }; }; }; }; extraConfig = '' vnoremap * y/\V=escape(@",'/\') vnoremap "ry:%s/=escape(@r,'/\') vnoremap A :norm A noremap :CocCommand editor.action.formatDocument set number set rnu set ignorecase set smartcase set mouse=a set path=.,** let g:netrw_banner=0 let g:netrw_liststyle=3 set undofile set undodir=~/.local/share/nvim/undo ''; plugins = with pkgs.vimPlugins; [ vim-surround vim-commentary firenvim ]; }; }]; programs.scripts = [{ name = "open-code"; text = '' code_dir=~/Documents/code cd $code_dir repo=$({ ls && echo clone-repo; } | ${menu}) case $repo in clone-repo) url=$(wl-paste) ${termcmd} -e -- git clone "$url" ;; *) [ -e "$repo" ] && ${pkg}/bin/${pkg.executableName} $repo ;; esac ''; install = false; hotkeys = [{ key = "C"; }]; }]; }; }