pytrainer: unpin python 3.10
[NixPkgs.git] / pkgs / applications / editors / vim / macvim-configurable.nix
blobcca5d06ba90ad62a83d15868fe723df97dbcb665
1 { lib, stdenv, callPackage, vimUtils, buildEnv, makeWrapper }:
3 let
4   makeCustomizable = macvim: macvim // {
5     # configure expects the same args as vimUtils.vimrcFile.
6     # This is the same as the value given to neovim.override { configure = … }
7     # or the value of vim-full.customize { vimrcConfig = … }
8     #
9     # Note: Like neovim and vim-full, configuring macvim disables the
10     # sourcing of the user's vimrc. Use `customRC = "source $HOME/.vim/vimrc"`
11     # if you want to preserve that behavior.
12     configure = let
13       doConfig = config: let
14         vimrcConfig = config // {
15           # always source the bundled system vimrc
16           beforePlugins = ''
17             source $VIM/vimrc
18             ${config.beforePlugins or ""}
19           '';
20         };
21       in buildEnv {
22         name = macvim.name;
23         paths = [ macvim ];
24         pathsToLink = [
25           "/"
26           "/bin"
27           "/Applications/MacVim.app/Contents/MacOS"
28           "/Applications/MacVim.app/Contents/bin"
29         ];
30         nativeBuildInputs = [ makeWrapper ];
31         # We need to do surgery on the resulting app. We can't just make a wrapper for vim because this
32         # is a GUI app. We need to copy the actual GUI executable image as AppKit uses the loaded image's
33         # path to locate the bundle. We can use symlinks for other executables and resources though.
34         postBuild = ''
35           # Replace the Contents/MacOS/MacVim symlink with the original file
36           target=$(readlink $out/Applications/MacVim.app/Contents/MacOS/MacVim)
37           rm $out/Applications/MacVim.app/Contents/MacOS/MacVim
38           cp -a -t $out/Applications/MacVim.app/Contents/MacOS "$target"
40           # Wrap the Vim binary for our vimrc
41           wrapProgram $out/Applications/MacVim.app/Contents/MacOS/Vim \
42             --add-flags "-u ${vimUtils.vimrcFile vimrcConfig}"
44           # Replace each symlink in bin/ with the original. Most of them point at other symlinks
45           # and we need those original symlinks to point into our new app bundle.
46           for prefix in bin Applications/MacVim.app/Contents/bin; do
47             for link in $out/$prefix/*; do
48               target=$(readlink "$link")
49               # don't copy binaries like vimtutor, but we do need mvim
50               [ -L "$target" ] || [ "$(basename "$target")" = mvim ] || continue;
51               rm "$link"
52               cp -a -t $out/$prefix "$target"
53             done
54           done
55         '';
56         meta = macvim.meta;
57       };
58     in lib.makeOverridable (lib.setFunctionArgs doConfig (lib.functionArgs vimUtils.vimrcFile));
60     override = f: makeCustomizable (macvim.override f);
61     overrideAttrs = f: makeCustomizable (macvim.overrideAttrs f);
62   };
63 in { inherit makeCustomizable; }