{ config, lib, pkgs, ... }: with lib; let git-plan = pkgs.rustPlatform.buildRustPackage rec { name = "git-plan"; version = "1"; src = pkgs.fetchFromGitLab { owner = "haaksmash"; repo = "git-plan"; rev = "518dcf15f3a46605f18569dd69b3b63d763e9439"; sha256 = "06gh3v35bdr0qsp459183br4hpmwm36d2r9fjyx9j5jfpzggqg51"; }; cargoSha256 = "0f0a88pv4myavdrznz68f5jfc82y8whrdwcyp1q8i6nrn606csi7"; nativeBuildInputs = [ pkgs.pkgconfig ]; buildInputs = [ pkgs.openssl ] ++ (if pkgs.stdenv.isDarwin then [ pkgs.libiconv pkgs.darwin.apple_sdk.frameworks.Security ] else []); }; vim-goyo = pkgs.vimUtils.buildVimPlugin { name = "vim-goyo"; src = pkgs.fetchFromGitHub { owner = "junegunn"; repo = "goyo.vim"; rev = "6b6ed2734084fdbb6315357ddcaecf9c8e6f143d"; sha256 = "1ywlz1hn54kxyp5q0angriaarimq7ys7m6sk6l4x8jr1g2yh0afz"; }; }; vim-elm-syntax = pkgs.vimUtils.buildVimPlugin { name = "vim-elm-syntax"; src = pkgs.fetchFromGitHub { owner = "andys8"; repo = "vim-elm-syntax"; rev = "68cd8988fe9eaa190052fadaee0fea2c21338d4c"; sha256 = "0yhvx8k83xfzmgy10r9mz0rjagbyzx5rrmn8123vw49ncksvw49q"; }; }; vim-nix = pkgs.vimUtils.buildVimPlugin { name = "vim-nix"; src = pkgs.fetchFromGitHub { owner = "LnL7"; repo = "vim-nix"; rev = "d733cb96707a2a6bdc6102b6d89f947688e0e959"; sha256 = "12k2gwm8b1n02361gpjhsldql99yd7qsh80a3lbwc5c5gz5j8jsb"; }; }; in { home.packages = with pkgs; [ git-plan htop jq keybase lastpass-cli lorri nnn tree ripgrep vlc zsh-autosuggestions zsh-history-substring-search zsh-syntax-highlighting ] ++ (if pkgs.stdenv.isDarwin then [ skhd # keyboard shortcut daemon for macOS ] else [ calibre slack ]); programs.direnv = { enable = true; stdlib = '' layout_postgres() { export PGDATA="$(direnv_layout_dir)/tmp/pgdata" export PGHOST="$PGDATA" if [[ ! -d "$PGDATA" ]]; then initdb --locale=$LANG cat <>"$PGDATA/postgresql.conf" listen_addresses = 'localhost' unix_socket_directories = '$PGHOST' EOF echo "CREATE DATABASE $USER;" | postgres --single -E postgres fi } layout_go() { export GOPATH="$(direnv_layout_dir)/tmp/golibs" if [[ ! -d "$GOPATH" ]]; then mkdir -p $GOPATH fi export PATH="$GOPATH/bin:$PATH" } ''; }; programs.git = { enable = true; userName = "Haak Saxberg"; userEmail = "haak.erling@gmail.com"; ignores = [ ".idea/" ".direnv/" ".git-plans/" ".envrc" ".tools-info" "*~" "*.swp" ".yardoc/" "doc/" ]; }; programs.zsh = { enable = true; enableCompletion = true; defaultKeymap = "viins"; initExtra = mkForce ('' export LOCALE_ARCHIVE="/usr/lib/locale/locale-archive" export NIX_PATH=$HOME/.nix-defexpr/channels:$NIX_PATH export EDITOR=vim source $HOME/.nix-profile/etc/profile.d/nix.sh source $HOME/.nix-profile/share/fzf/key-bindings.zsh source $HOME/.nix-profile/share/fzf/completion.zsh source $HOME/.nix-profile/share/zsh-autosuggestions/zsh-autosuggestions.zsh source $HOME/.nix-profile/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh source $HOME/.config/zsh/local.zsh bindkey '^[[A' history-substring-search-up bindkey '^[[B' history-substring-search-down bindkey -M viins 'jj' vi-cmd-mode # utility for storing functions under a new name save_function() { local ORIG_FUNC=$(declare -f $1) local NEWNAME_FUNC="$2''${ORIG_FUNC#$1}" eval "$NEWNAME_FUNC" } # Override an oh-my-zsh/lib/git.sh function so that old repositories # don't slow the shell down save_function git_prompt_status old_git_prompt_status function git_prompt_status() { if [[ "$(command git config --get oh-my-zsh.hide-prompt-status 2>/dev/null)" != "1" ]]; then old_git_prompt_status fi } eval "$(direnv hook zsh)" ''); shellAliases = { n = "neuron new"; ns = "neuron search -a"; }; oh-my-zsh = { enable = true; theme = "typewritten"; custom = "$HOME/.oh-my-zsh/custom"; plugins = [ "vi-mode" "git" "z" ]; }; }; programs.kakoune = { enable = true; config = { numberLines = { enable = true; highlightCursor = true; relative = true; }; }; plugins = with pkgs.kakounePlugins; [ kak-prelude kak-fzf kak-auto-pairs kak-powerline kak-ansi ]; extraConfig = '' colorscheme tomorrow-night set -add global autoinfo normal # FZF settings map global normal ': fzf-mode' ''; }; programs.neovim = { enable = true; vimAlias = true; withPython = true; plugins = with pkgs.vimPlugins; [ vim-sensible vim-startify alchemist-vim vimtex vim-elixir vim-elm-syntax vim-nix vim-airline rainbow vim-signify vim-indent-guides vim-surround fugitive easymotion tagbar vinegar undotree vim-test ale fzf-vim fzfWrapper LanguageClient-neovim deoplete-nvim papercolor-theme vim-goyo ]; extraConfig = '' filetype plugin indent on " vimtex let g:tex_flavor = 'latex' " ALE let g:ale_fix_on_save = 1 let g:ale_elixir_credo_strict = 1 let g:ale_fixers = { \ 'elm': ['elm-format', 'format'], \ 'javascript': ['prettier'], \ 'javascript.jsx': ['prettier'], \ 'javascriptreact': ['prettier'], \ 'typescriptreact': ['prettier'], \ 'ruby': [], \ 'rust': ['rustfmt'], \ 'elixir': ['mix_format'] \} " Easymotion map / (easymotion-sn) omap / (easymotion-tn) map n (easymotion-next) map N (easymotion-prev) let g:EasyMotion_landing_highlight = 0 " Rainbow parentheses let g:rainbow_conf = { \ 'guifgs': ['RoyalBlue3', 'SeaGreen3', 'DarkOrchid3', 'firebrick3', 'RoyalBlue3', 'SeaGreen3', 'DarkOrchid3', 'firebrick3', 'RoyalBlue3', 'DarkOrchid3', 'firebrick3', 'RoyalBlue3', 'SeaGreen3', 'DarkOrchid3', 'firebrick3'], \ 'ctermfgs': ['red', 'brown', 'blue', 'gray', 'green', 'magenta', 'cyan', 'darkred', 'brown', 'darkblue', 'gray', 'darkgreen', 'darkmagenta', 'darkcyan', 'red'], \ 'parentheses': ['start=/(/ end=/)/ fold', 'start=/\[/ end=/\]/ fold', 'start=/{/ end=/}/ fold'] \} let g:rainbow_active = 1 " Vim-Test nmap t :TestNearest nmap T :TestFile nmap a :TestSuite nmap l :TestLast nmap g :TestVisit let test#strategy = "neovim" " Deoplete let g:deoplete#enable_at_startup = 1 " LanguageClient-neovim let g:LanguageClient_serverCommands = { \ 'elm': ['elm-language-server'], \ 'javascript': ['flow', 'lsp'], \ 'javascript.jsx': ['flow', 'lsp'], \ 'javascriptreact': ['flow', 'lsp'], \ 'rust': ['rustup', 'run', 'stable', 'rls'], \ } let g:LanguageClient_rootMarkers = { \ 'elm': ['elm.json'], \ 'typescriptreact': ['tsconfig.json'], \ } let g:LanguageClient_loggingFile = expand('~/.local/share/nvim/LanguageClient.log') nnoremap t :call LanguageClient_textDocument_hover() nnoremap y :call LanguageClient_textDocument_definition() " Indent guides let g:indent_guides_enable_on_vim_startup = 1 let g:indent_guides_start_level = 2 " let netrw look like NERDTree let g:netrw_liststyle = 3 let mapleader="," set nobackup set noswapfile set pastetoggle= set nowrap set background=dark colorscheme PaperColor set nocompatible set number relativenumber set numberwidth=1 set cursorline set cursorcolumn set ruler set list set listchars=tab:>-,trail:-,extends:>,precedes:<,nbsp:+,eol:$ set matchpairs+=<:> set ts=2 set shiftwidth=2 set expandtab " Open new split panes to right and bottom, which feels more natural set splitbelow set splitright """ Searching and Patterns set ignorecase set smartcase set smarttab set hlsearch " Add the g flag to search/replace by default set gdefault "recalculate the trailing whitespace warning when idle, and after saving autocmd cursorhold,bufwritepost * unlet! b:statusline_trailing_space_warning " strip trailing whitespace autocmd BufWritePre * :%s/\s\+$//e """ Handy remaps noremap ; : inoremap jj map V :source ~/.config/nvim/init.vim:filetype detect:exe ":echo 'vimrc reloaded'" map \q :q map \w :w noremap Q """ Esperanto digraphs (for use with ctrl-k) :digraph Cx 264 :digraph cx 265 :digraph Gx 284 :digraph gx 285 :digraph Hx 292 :digraph hx 293 :digraph Jx 308 :digraph jx 309 :digraph Sx 348 :digraph sx 349 :digraph Ux 364 :digraph ux 365 """ Terminal mode remaps tnoremap nnoremap o :below 10sp term://$SHELLi " Quicker window movement nnoremap j nnoremap k nnoremap h nnoremap l " Don’t reset cursor to start of line when moving around. set nostartofline " minimal number of lines to keep above/below cursorline set scrolloff=10 " Local overrides? if filereadable($HOME . "/.vimrc.local") source ~/.vimrc.local endif ''; }; programs.tmux = { enable = true; tmuxinator = { enable = true; }; secureSocket = false; }; programs.fzf = { enable = true; enableZshIntegration = true; defaultCommand = "rg --no-ignore --follow --files --hidden --smart-case --glob \\\"!.git/*\\\""; }; services.lorri.enable = !pkgs.stdenv.isDarwin; # Let Home Manager install and manage itself. programs.home-manager.enable = true; home.file.".tmux.conf" = { source = ./tmux/tmux.conf; }; home.file.".oh-my-zsh/custom/themes/typewritten.zsh-theme" = { source = ./zsh/typewritten.zsh-theme; }; }