summaryrefslogtreecommitdiffstats
path: root/tv/2configs/vim.nix
blob: fde66d7772bca61727df064beee3940c953eca24 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
with import ./lib;
{ config, pkgs, ... }: let {
  body = {
    environment.systemPackages = [
      vim-wrapper
    ];

    environment.etc.vimrc.source = vimrc;

    environment.variables.EDITOR = mkForce "vim";
    environment.variables.VIMINIT = ":so /etc/vimrc";
  };

  base-plugins = [
    pkgs.tv.vimPlugins.file-line
    pkgs.tv.vimPlugins.hack
    pkgs.vimPlugins.undotree
    (pkgs.tv.vim.makePlugin (pkgs.write "vim-tv-base" {
      "/ftplugin/haskell.vim".text = ''
        if exists("g:vim_tv_ftplugin_haskell_loaded")
          finish
        endif
        let g:vim_tv_ftplugin_haskell_loaded = 1

        setlocal iskeyword+='
      '';
    }))
  ];

  extra-plugins = [
    pkgs.tv.vimPlugins.elixir
    pkgs.tv.vimPlugins.fzf
    pkgs.tv.vimPlugins.jq
    pkgs.tv.vimPlugins.nix
    pkgs.tv.vimPlugins.showsyntax
    pkgs.tv.vimPlugins.tv
    pkgs.tv.vimPlugins.vim
    pkgs.vimPlugins.fzfWrapper
    pkgs.vimPlugins.vim-nftables
  ];

  dirs = {
    backupdir = "$HOME/.cache/vim/backup";
    swapdir   = "$HOME/.cache/vim/swap";
    undodir   = "$HOME/.cache/vim/undo";
  };
  files = {
    viminfo   = "$HOME/.cache/vim/info";
  };

  need-dirs = let
    dirOf = s: let out = concatStringsSep "/" (init (splitString "/" s));
               in assert out != ""; out;
    alldirs = attrValues dirs ++ map dirOf (attrValues files);
  in unique (sort lessThan alldirs);

  vim-wrapper = pkgs.symlinkJoin {
    name = "vim";
    paths = [
      (pkgs.writeDashBin "vim" ''
        set -efu
        export FZF_DEFAULT_COMMAND='${pkgs.ripgrep}/bin/rg --files'
        export PATH=$PATH:${makeBinPath [
          pkgs.fzf
          pkgs.ripgrep
        ]}
        (umask 0077; exec ${pkgs.coreutils}/bin/mkdir -p ${toString need-dirs})
        exec ${pkgs.vim}/bin/vim "$@"
      '')
      pkgs.vim
    ];
  };

  vimrc = pkgs.writeText "vimrc" ''
    set nocompatible

    set autoindent
    set backspace=indent,eol,start
    set backup
    set backupdir=${dirs.backupdir}/
    set directory=${dirs.swapdir}//
    set hlsearch
    set incsearch
    set mouse=a
    set noruler
    set pastetoggle=<INS>
    set runtimepath=${pkgs.tv.vim.makeRuntimePath base-plugins},$VIMRUNTIME
    set shortmess+=I
    set showcmd
    set showmatch
    set timeoutlen=0
    set ttimeoutlen=0
    set ttymouse=sgr
    set undodir=${dirs.undodir}
    set undofile
    set undolevels=1000000
    set undoreload=1000000
    set viminfo='20,<1000,s100,h,n${files.viminfo}
    set visualbell
    set wildignore+=*.o,*.class,*.hi,*.dyn_hi,*.dyn_o
    set wildmenu
    set wildmode=longest,full

      set runtimepath^=${pkgs.tv.vim.makeRuntimePath extra-plugins}
      syntax on

    set et ts=2 sts=2 sw=2

    filetype plugin indent on

    set t_Co=256
    colorscheme hack

    au Syntax * syn match Garbage containedin=ALL /\s\+$/
            \ | syn match TabStop containedin=ALL /\t\+/
            \ | syn keyword Todo containedin=ALL TODO

    au BufRead,BufNewFile *.nix set ft=nix

    au BufRead,BufNewFile /dev/shm/* set nobackup nowritebackup noswapfile

    cnoremap <C-A> <Home>

    noremap  <C-c> :q<cr>

    nnoremap <esc>[5^  :tabp<cr>
    nnoremap <esc>[6^  :tabn<cr>
    nnoremap <esc>[5@  :tabm -1<cr>
    nnoremap <esc>[6@  :tabm +1<cr>

    nnoremap <f1> :tabp<cr>
    nnoremap <f2> :tabn<cr>
    imap <f1> <esc><f1>
    imap <f2> <esc><f2>

    noremap <f3> :ShowSyntax<cr>

    " <C-{Up,Down,Right,Left>
    noremap <esc>Oa <nop> | noremap! <esc>Oa <nop>
    noremap <esc>Ob <nop> | noremap! <esc>Ob <nop>
    noremap <esc>Oc <nop> | noremap! <esc>Oc <nop>
    noremap <esc>Od <nop> | noremap! <esc>Od <nop>
    " <[C]S-{Up,Down,Right,Left>
    noremap <esc>[a <nop> | noremap! <esc>[a <nop>
    noremap <esc>[b <nop> | noremap! <esc>[b <nop>
    noremap <esc>[c <nop> | noremap! <esc>[c <nop>
    noremap <esc>[d <nop> | noremap! <esc>[d <nop>
    vnoremap u <nop>

    " fzf
    nnoremap <esc>q :Buffers<cr>
    nnoremap <esc>f :Files<cr>
    nnoremap <esc>w :Rg<cr>

    " edit alternate buffer
    " For some reason neither putting <ctrl>6 nor <ctrl>^ works here...
    nnoremap <esc>a 

    if $TOUCHSCREEN == 1
      nnoremap <ScrollWheelUp> <C-y>
      nnoremap <ScrollWheelDown> <C-e>
      nnoremap <C-ScrollWheelUp> 3<C-y>
      nnoremap <C-ScrollWheelDown> 3<C-e>
      nnoremap <S-ScrollWheelUp> 3<C-y>
      nnoremap <S-ScrollWheelDown> 3<C-e>
      nnoremap <C-S-ScrollWheelUp> <PageUp>
      nnoremap <C-S-ScrollWheelDown> <PageDown>
    endif
  '';
}