summaryrefslogtreecommitdiffstats
path: root/pkgs/applications/editors/vim/full.nix
blob: a2a105e3182c783d5c613394d41e477d448491aa (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
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
{
  source ? "default",
  callPackage,
  lib,
  stdenv,
  ncurses,
  pkg-config,
  gettext,
  writeText,
  config,
  glib,
  gtk2-x11,
  gtk3-x11,
  lua,
  python3,
  perl,
  tcl,
  ruby,
  libx11,
  libxext,
  libsm,
  libxpm,
  libxt,
  libxaw,
  libxau,
  libxmu,
  libsodium,
  libice,
  wayland-scanner,
  vimPlugins,
  makeWrapper,
  wrapGAppsHook3,

  features ? "huge", # One of tiny, small, normal, big or huge
  wrapPythonDrv ? false,
  guiSupport ? config.vim.gui or (if stdenv.hostPlatform.isDarwin then "gtk2" else "gtk3"),
  waylandSupport ? !stdenv.hostPlatform.isDarwin,
  luaSupport ? config.vim.lua or true,
  perlSupport ? config.vim.perl or false, # Perl interpreter
  pythonSupport ? config.vim.python or true, # Python interpreter
  rubySupport ? config.vim.ruby or true, # Ruby interpreter
  nlsSupport ? config.vim.nls or false, # Enable NLS (gettext())
  tclSupport ? config.vim.tcl or false, # Include Tcl interpreter
  multibyteSupport ? config.vim.multibyte or false, # Enable multibyte editing support
  cscopeSupport ? config.vim.cscope or true, # Enable cscope interface
  netbeansSupport ? config.netbeans or true, # Enable NetBeans integration support.
  ximSupport ? config.vim.xim or true, # less than 15KB, needed for deadkeys
  darwinSupport ? config.vim.darwin or false, # Enable Darwin support
  ftNixSupport ? config.vim.ftNix or true, # Add nix indentation support from vim-nix (not needed for basic syntax highlighting)
  sodiumSupport ? config.vim.sodium or true, # Enable sodium based encryption
}:

let
  nixosRuntimepath = writeText "nixos-vimrc" ''
    set nocompatible
    syntax on

    function! NixosPluginPath()
      let seen = {}
      for p in reverse(split($NIX_PROFILES))
        for d in split(glob(p . '/share/vim-plugins/*'))
          let pluginname = substitute(d, ".*/", "", "")
          if !has_key(seen, pluginname)
            exec 'set runtimepath^='.d
            let after = d."/after"
            if isdirectory(after)
              exec 'set runtimepath^='.after
            endif
            let seen[pluginname] = 1
          endif
        endfor
      endfor
    endfunction

    execute NixosPluginPath()

    if filereadable("/etc/vimrc")
      source /etc/vimrc
    elseif filereadable("/etc/vim/vimrc")
      source /etc/vim/vimrc
    endif
  '';

  common = callPackage ./common.nix { inherit stdenv; };

in
stdenv.mkDerivation {

  pname = "vim-full";

  inherit (common)
    version
    outputs
    postPatch
    hardeningDisable
    enableParallelBuilding
    meta
    ;

  src = builtins.getAttr source {
    default = common.src; # latest release
  };

  patches = [ ./cflags-prune.diff ];

  configureFlags = [
    "--with-features=${features}"
    "--disable-xsmp" # XSMP session management
    "--disable-xsmp_interact" # XSMP interaction
    "--disable-workshop" # Sun Visual Workshop support
    "--disable-sniff" # Sniff interface
    "--disable-hangulinput" # Hangul input support
    "--disable-fontset" # X fontset output support
    "--disable-acl" # ACL support
    "--disable-gpm" # GPM (Linux mouse daemon)
    "--disable-mzschemeinterp"
    "--disable-gtk_check"
    "--disable-gtk2_check"
    "--disable-gnome_check"
    "--disable-motif_check"
    "--disable-athena_check"
    "--disable-nextaf_check"
    "--disable-carbon_check"
    "--disable-gtktest"
    (lib.strings.enableFeature waylandSupport "wayland")
  ]
  ++ lib.optionals (stdenv.hostPlatform != stdenv.buildPlatform) [
    "vim_cv_toupper_broken=no"
    "--with-tlib=ncurses"
    "vim_cv_terminfo=yes"
    "vim_cv_tgetent=zero" # it does on native anyway
    "vim_cv_tty_group=tty"
    "vim_cv_tty_mode=0660"
    "vim_cv_getcwd_broken=no"
    "vim_cv_stat_ignores_slash=yes"
    "vim_cv_memmove_handles_overlap=yes"
  ]
  ++ lib.optional (guiSupport == "gtk2" || guiSupport == "gtk3") "--enable-gui=${guiSupport}"
  ++ lib.optional stdenv.hostPlatform.isDarwin (
    if darwinSupport then "--enable-darwin" else "--disable-darwin"
  )
  ++ lib.optionals luaSupport [
    "--with-lua-prefix=${lua}"
    "--enable-luainterp"
  ]
  ++ lib.optionals lua.pkgs.isLuaJIT [
    "--with-luajit"
  ]
  ++ lib.optionals pythonSupport [
    "--enable-python3interp=yes"
    "--with-python3-config-dir=${python3}/lib"
    # Disables Python 2
    "--disable-pythoninterp"
  ]
  ++ lib.optional nlsSupport "--enable-nls"
  ++ lib.optional perlSupport "--enable-perlinterp"
  ++ lib.optional rubySupport "--enable-rubyinterp"
  ++ lib.optional tclSupport "--enable-tclinterp"
  ++ lib.optional multibyteSupport "--enable-multibyte"
  ++ lib.optional cscopeSupport "--enable-cscope"
  ++ lib.optional netbeansSupport "--enable-netbeans"
  ++ lib.optional ximSupport "--enable-xim"
  ++ lib.optional sodiumSupport "--enable-sodium";

  nativeBuildInputs = [
    pkg-config
  ]
  ++ lib.optional wrapPythonDrv makeWrapper
  ++ lib.optional nlsSupport gettext
  ++ lib.optional perlSupport perl
  ++ lib.optional (guiSupport == "gtk3") wrapGAppsHook3
  ++ lib.optional waylandSupport wayland-scanner;

  buildInputs = [
    ncurses
    glib
  ]
  # All X related dependencies
  ++ lib.optionals (guiSupport == "gtk2" || guiSupport == "gtk3") [
    libsm
    libice
    libx11
    libxext
    libxpm
    libxt
    libxaw
    libxau
    libxmu
  ]
  ++ lib.optional (guiSupport == "gtk2") gtk2-x11
  ++ lib.optional (guiSupport == "gtk3") gtk3-x11
  ++ lib.optional luaSupport lua
  ++ lib.optional pythonSupport python3
  ++ lib.optional tclSupport tcl
  ++ lib.optional rubySupport ruby
  ++ lib.optional sodiumSupport libsodium;

  # error: '__declspec' attributes are not enabled; use '-fdeclspec' or '-fms-extensions' to enable support for __declspec attributes
  env.NIX_CFLAGS_COMPILE = lib.optionalString stdenv.hostPlatform.isDarwin "-fdeclspec";

  preConfigure = lib.optionalString ftNixSupport ''
    cp ${vimPlugins.vim-nix.src}/ftplugin/nix.vim runtime/ftplugin/nix.vim
    cp ${vimPlugins.vim-nix.src}/indent/nix.vim runtime/indent/nix.vim
  '';

  preInstall = ''
    mkdir -p $out/share/applications $out/share/icons/{hicolor,locolor}/{16x16,32x32,48x48}/apps
  '';

  postInstall = ''
    ln -s $out/bin/vim $out/bin/vi
  ''
  + lib.optionalString stdenv.hostPlatform.isLinux ''
    ln -sfn '${nixosRuntimepath}' "$out"/share/vim/vimrc
  '';

  postFixup =
    common.postFixup
    + lib.optionalString wrapPythonDrv ''
      wrapProgram "$out/bin/vim" --prefix PATH : "${python3}/bin" \
        --set NIX_PYTHONPATH "${python3}/${python3.sitePackages}"
    '';

  dontStrip = true;
}