Vim: Difference between revisions

imported>Mic92
Wrrrzr (talk | contribs)
Remove deprecated alias
 
(77 intermediate revisions by 37 users not shown)
Line 1: Line 1:
<languages/>
<translate>
<!--T:1-->
[https://www.vim.org/ Vim] (vi improved) is a highly configurable modal text editor program for the terminal. 
== Installation == <!--T:2-->
=== Basic Install === <!--T:3-->
</translate>
<syntaxhighlight lang="nix>
  programs.vim.enable = true;
</syntaxhighlight>
<translate>
<!--T:74-->
or
</translate>
<syntaxhighlight lang="nix">
  programs.vim = {
    enable = true;
    package = pkgs.vim-full;
  };
</syntaxhighlight>
<translate>
<!--T:5-->
or
</translate>
<syntaxhighlight lang="nix">
  environment.systemPackages = with pkgs; [ vim-full ];
</syntaxhighlight>
<translate>
=== Using Home Manager === <!--T:7-->
<!--T:8-->
Vim can easily be set up using [[Special:MyLanguage/Home Manager|Home Manager]]. Here's a minimal example:
</translate>
<syntaxhighlight lang="nix>
  programs.vim = {
    enable = true;
    plugins = with pkgs.vimPlugins; [ vim-airline ];
    settings = { ignorecase = true; };
    extraConfig = ''
      set mouse=a
    '';
  };
</syntaxhighlight>
<translate>
<!--T:9-->
See [https://github.com/rycee/home-manager/blob/master/modules/programs/vim.nix] for the full set of options.
=== Vim Spell Files === <!--T:10-->
<!--T:11-->
You can configure home-manager to install spelling files into your user directory by packaging individual spell files.  Here' an example for [[neovim]] and French:
</translate>
<syntaxHighlight lang="nix">
let
nvim-spell-fr-utf8-dictionary = builtins.fetchurl {
  url = "http://ftp.vim.org/vim/runtime/spell/fr.utf-8.spl";
  sha256 = "abfb9702b98d887c175ace58f1ab39733dc08d03b674d914f56344ef86e63b61";
};
nvim-spell-fr-utf8-suggestions = builtins.fetchurl {
  url = "http://ftp.vim.org/vim/runtime/spell/fr.utf-8.sug";
  sha256 = "0294bc32b42c90bbb286a89e23ca3773b7ef50eff1ab523b1513d6a25c6b3f58";
};
nvim-spell-fr-latin1-dictionary = builtins.fetchurl {
  url = "http://ftp.vim.org/vim/runtime/spell/fr.latin1.spl";
  sha256 = "086ccda0891594c93eab143aa83ffbbd25d013c1b82866bbb48bb1cb788cc2ff";
};
nvim-spell-fr-latin1-suggestions = builtins.fetchurl {
  url = "http://ftp.vim.org/vim/runtime/spell/fr.latin1.sug";
  sha256 = "5cb2c97901b9ca81bf765532099c0329e2223c139baa764058822debd2e0d22a";
};
in
{
  xdg.configFile."nvim/spell/fr.utf-8.spl".source = nvim-spell-fr-utf8-dictionary;
  xdg.configFile."nvim/spell/fr.utf-8.sug".source = nvim-spell-fr-utf8-suggestions;
  xdg.configFile."nvim/spell/fr.latin1.spl".source = nvim-spell-fr-latin1-dictionary;
  xdg.configFile."nvim/spell/fr.latin1.sug".source = nvim-spell-fr-latin1-suggestions;
}
</syntaxHighlight>
<translate>
==== NeoVim with Coc for Python ==== <!--T:16-->
<!--T:17-->
For NeoVim use this home manager config:
https://github.com/NixOS/nixpkgs/issues/98166#issuecomment-725319238
== System wide vim/nvim configuration == <!--T:18-->
<!--T:19-->
If you want a system wide "baseline" configuration for vim/nvim here are two examples:.
<!--T:76-->
On unstable:
</translate>
<syntaxhighlight lang="nix">
{ pkgs, ... }:
{
  programs.vim = {
    enable = true;
    defaultEditor = true;
    package = (pkgs.vim-full.override {  }).customize{
      name = "vim";
<translate>
      <!--T:77-->
# Install plugins for example for syntax highlighting of nix files
</translate>
      vimrcConfig.packages.myplugins = with pkgs.vimPlugins; {
        start = [ vim-nix vim-lastplace ];
        opt = [];
      };
      vimrcConfig.customRC = ''
<translate>
        <!--T:78-->
" your custom vimrc
</translate>
        set nocompatible
        set backspace=indent,eol,start
<translate>
        <!--T:79-->
" Turn on syntax highlighting by default
</translate>
        syntax on
        " ...
      '';
    };
  };
}
</syntaxhighlight>
<syntaxHighlight lang="nix">
{ pkgs, ... }:
{
  programs.neovim = {
    enable = true;
    defaultEditor = true;
    vimAlias = true;
    configure = {
      customRC = ''
<translate>
        <!--T:84-->
" your custom vimrc
</translate>
        set nocompatible
        set backspace=indent,eol,start
        " ...
      '';
      packages.myPlugins = with pkgs.vimPlugins; {
        start = [ vim-lastplace vim-nix ];
        opt = [];
      };
    };
  };
}
</syntaxHighlight>
<translate>
<!--T:23-->
import these in your <code>configuration.nix</code> and
</translate>
<syntaxHighlight lang="nix">
{   
  imports =   
    [
      ./vim.nix
    ];
  # ...
}
</syntaxHighlight>
<translate>
== Custom setup without using Home Manager == <!--T:24-->
<!--T:25-->
{{note|To get a general overview about how to set up your vim in nix, refer to [https://www.mpscholten.de/nixos/2016/04/11/setting-up-vim-on-nixos.html mpscholten's blog] }}
<!--T:26-->
Vim plugins can be installed with the help of nix. You can omit using vim plugin managers and do everything in your <code>.nixpkgs/config</code>.
Vim plugins can be installed with the help of nix. You can omit using vim plugin managers and do everything in your <code>.nixpkgs/config</code>.


= Examples =
<!--T:27-->
A lot of documentation about package management and configuration of vim in nix is stored at [https://github.com/NixOS/nixpkgs/blob/master/pkgs/applications/editors/vim/plugins/vim-utils.nix] in nixpkgs.
 
=== Customizations === <!--T:28-->
 
<!--T:29-->
Both vim and neovim can be further configured to include your favorite plugins and additional libraries. To list all available vim plugins, run <code>nix search nixpkgs#vimPlugins</code>.
 
<!--T:30-->
Add the following code to your <code>~/.nixpkgs/config.nix</code>:
 
</translate>
<syntaxhighlight lang="nix">
{
  packageOverrides = pkgs: with pkgs; {
    myVim = vim-full.customize {
      name = "vim-with-plugins";
<translate>
      <!--T:85-->
# add here code from the example section
</translate>
    };
    myNeovim = neovim.override {
      configure = {
        customRC = ''
<translate>
          <!--T:86-->
# here your custom configuration goes!
</translate>
        '';
        packages.myVimPackage = with pkgs.vimPlugins; {
<translate>
          <!--T:87-->
# see examples below how to use custom packages
</translate>
          start = [ ];
          opt = [ ];
        };
      };   
    };
  };
}
</syntaxhighlight>
<translate>


== Using vim's builtin packaging capability ==
<!--T:32-->
After that you can install your special grafted `myVim` or `myNeovim` packages.


<syntaxHighlight lang="nix">
=== Examples === <!--T:33-->
vim_configurable.customize {
 
==== Apply custom vimrc configuration ==== <!--T:34-->
 
<!--T:35-->
NB: you ''must'' use <code>vimrcConfig.customRC</code> rather than installing a <code>~/.vimrc</code> by hand, since the customized Vim will silently ignore any vimrc in your home directory.
 
</translate>
<syntaxhighlight lang="nix">
vim-full.customize {
  name = "vim-with-plugins";
<translate>
  <!--T:88-->
# add custom .vimrc lines like this:
</translate>
  vimrcConfig.customRC = ''
    set hidden
    set colorcolumn=80
  '';
}
</syntaxhighlight>
<translate>
 
<!--T:37-->
If you need to run code before plugins are added, you can use <code>vimrcConfig.beforePlugins</code> (be sure to include <code>set nocompatible</code> if you override [https://github.com/NixOS/nixpkgs/blob/c3df8057dad986bf7f3928de1b5233fadb52bb15/pkgs/misc/vim-plugins/vim-utils.nix#L264-L267 the default value]).
 
=== Using vim's builtin packaging capability === <!--T:38-->
 
</translate>
<syntaxhighlight lang="nix">
vim-full.customize {
   vimrcConfig.packages.myVimPackage = with pkgs.vimPlugins; {
   vimrcConfig.packages.myVimPackage = with pkgs.vimPlugins; {
     # loaded on launch
<translate>
     start = [ youcompleteme fugitive ];
     <!--T:89-->
     # manually loadable by calling `:packadd $plugin-name`
# loaded on launch
</translate>
     start = [ YouCompleteMe fugitive ];
<translate>
     <!--T:90-->
# manually loadable by calling `:packadd $plugin-name`
</translate>
     opt = [ phpCompletion elm-vim ];
     opt = [ phpCompletion elm-vim ];
     # To automatically load a plugin when opening a filetype, add vimrc lines like:
<translate>
     <!--T:91-->
# To automatically load a plugin when opening a filetype, add vimrc lines like:
</translate>
     # autocmd FileType php :packadd phpCompletion
     # autocmd FileType php :packadd phpCompletion
   }
   }
};
};
</syntaxhighlight>
<translate>
<!--T:40-->
Note that dynamically loading with opt may be buggy and the workaround is to use [https://vi.stackexchange.com/a/20818/30821 start instead].
=== Using Pathogen as manager === <!--T:41-->
<!--T:42-->
There is a pathogen implementation as well, but its startup is slower and [VAM] has more features.
</translate>
<syntaxhighlight lang="nix">
vimrcConfig.pathogen.knownPlugins = vimPlugins; # optional
vimrcConfig.pathogen.pluginNames = [ "vim-addon-nix" "youcompleteme" ];
</syntaxhighlight>
<translate>
=== Using Vim-Plug as manager === <!--T:43-->
</translate>
<syntaxhighlight lang="nix">
vimrcConfig.plug.plugins = with pkgs.vimPlugins; [vim-addon-nix youcompleteme];
</syntaxhighlight>
<translate>
=== Adding new plugins === <!--T:45-->
<!--T:46-->
Please see https://github.com/NixOS/nixpkgs/blob/master/doc/languages-frameworks/vim.section.md.
==== Notes Regarding Plugins ==== <!--T:47-->
<!--T:48-->
For additional info, you may wish to look at [https://github.com/NixOS/nixpkgs/blob/master/doc/languages-frameworks/vim.section.md documentation on the nixpkgs repository].
=== Add a new custom plugin to the users packages  === <!--T:49-->
<!--T:50-->
Sometimes you do not want to change upstream plugins, for this you can use  <code>vimUtils.buildVimPlugin</code> to create your own:
</translate>
<syntaxhighlight lang="nix">
let
  vim-better-whitespace = pkgs.vimUtils.buildVimPlugin {
    name = "vim-better-whitespace";
    src = pkgs.fetchFromGitHub {
      owner = "ntpeters";
      repo = "vim-better-whitespace";
      rev = "984c8da518799a6bfb8214e1acdcfd10f5f1eed7";
      sha256 = "10l01a8xaivz6n01x6hzfx7gd0igd0wcf9ril0sllqzbq7yx2bbk";
    };
  };
in {
  users.users.<yourNickname>.packages = [
    (pkgs.vim-full.customize {
      vimrcConfig.packages.myVimPackage = with pkgs.vimPlugins; {
        start = [ vim-better-whitespace ];
      };
    })
  ];
};
</syntaxhighlight>
<translate>
==== Using flake ==== <!--T:53-->
</translate>
<code>configuration.nix</code>:
<syntaxHighlight lang="nix">
{ inputs, ... }:
{
  nixpkgs = {
    overlays = [
      (self: super:
        let
          winresizer-vim = super.vimUtils.buildVimPlugin {
            name = "winresizer-vim";
            src = inputs.winresizer-vim;
          };
        in
        {
          vimPlugins =
            super.vimPlugins // {
              inherit winresizer-vim;
            };
        }
      )
    ];
  };
</syntaxHighlight>
</syntaxHighlight>


== Using VAM as manager ==
<code>flake.nix</code>:
You can add this to you nix configuration to get vim with custom <code>.vimrc</code> and listed plugins.
<syntaxHighlight lang="nix">
<syntaxHighlight lang="nix">
vim_configurable.customize {
{
     name = "vim-with-plugins";
  inputs = {
     # add custom .vimrc lines like this:
     nixpkgs.url = "github:nixos/nixpkgs/nixos-22.05";
    vimrcConfig.customRC = ''
     winresizer-vim = {
       set hidden
       url = "github:simeji/winresizer";
       set colorcolumn=80
       flake = false;
     '';
     };
    vimrcConfig.vam.knownPlugins = pkgs.vimPlugins; # optional
  };
     vimrcConfig.vam.pluginDictionaries = [
 
      # load always
  outputs = inputs@{ nixpkgs, ... }: {
       { name = "youcompleteme"; }
     nixosConfigurations.nixos = nixpkgs.lib.nixosSystem {
       { names = [ "youcompleteme" "foo" ]; }
       system = "x86_64-linux";
       # only load when opening a .php file
       specialArgs = { inherit inputs; };
      { name = "phpCompletion"; ft_regex = "^php\$"; }
       modules = [
      { name = "phpCompletion"; filename_regex = "^.php\$"; }
        ./configuration.nix
       # provide plugin which can be loaded manually:
        ./hardware-configuration.nix
      { name = "phpCompletion"; tag = "lazy"; }
        { nix.registry.nixpkgs.flake = nixpkgs; }
     ];
       ];
     };
   };
   };
}
</syntaxHighlight>
</syntaxHighlight>
Full documentation at [https://github.com/MarcWeber/vim-addon-manager VAM homepage].
<translate>
 
<!--T:57-->
Then we can update the package with <code>nix flake lock --update-input winresizer-vim</code>, or update all inputs in flake.nix with <code>nix flake update</code>.
 
=== Vim as a Python IDE === <!--T:58-->
 
<!--T:59-->
The following snippet will make a full featured [[python]] IDE.


== Using Pathogen as manager ==
==== Using language client ==== <!--T:60-->
There is a pathogen implementation as well, but its startup is slower and [VAM] has more features.
 
<pre>
</translate>
     vimrcConfig.pathogen.knownPlugins = vimPlugins; # optional
<syntaxhighlight lang="nix">
    vimrcConfig.pathogen.pluginNames = [ "vim-addon-nix" "youcompleteme" ];
vim-full.customize {
</pre>
  vimrcConfig = {
    customRC = ''
      let g:LanguageClient_serverCommands = {
        \ 'python': ['pyls']
        \ }
      nnoremap <F5> :call LanguageClient_contextMenu()<CR>
      nnoremap <silent> gh :call LanguageClient_textDocument_hover()<CR>
      nnoremap <silent> gd :call LanguageClient_textDocument_definition()<CR>
      nnoremap <silent> gr :call LanguageClient_textDocument_references()<CR>
      nnoremap <silent> gs :call LanguageClient_textDocument_documentSymbol()<CR>
      nnoremap <silent> <F2> :call LanguageClient_textDocument_rename()<CR>
      nnoremap <silent> gf :call LanguageClient_textDocument_formatting()<CR>
     '';
    packages.myVimPackage = with pkgs.vimPlugins; {
      start = [ LanguageClient-neovim ];
    }
};
</syntaxhighlight>
<translate>


= Adding new plugins =
<!--T:62-->
Then put the following expression in <code>environment.systemPackages</code> or in the home-manager package list,
to install python-language-server:


* Check https://github.com/NixOS/nixpkgs/tree/master/pkgs/misc/vim-plugins
</translate>
* Add your plugin to ./vim-plugin-names
<syntaxHighlight  lang="nix">
* Generate via <code>vim-plugin-names-to-nix</code>
(python3.withPackages(ps: [
  ps.python-language-server
<translate>
  <!--T:92-->
# the following plugins are optional, they provide type checking, import sorting and code formatting
</translate>
  ps.pyls-mypy ps.pyls-isort ps.pyls-black
]))
</syntaxHighlight>
<translate>


= Real life examples =
=== Real life examples === <!--T:63-->


<!--T:64-->
* [https://github.com/jagajaga/my_configs/blob/master/.nixpkgs/common.nix Jagajaga’s config]
* [https://github.com/jagajaga/my_configs/blob/master/.nixpkgs/common.nix Jagajaga’s config]
<!--T:99-->
* [https://github.com/andrewrk/dotfiles/blob/master/.nixpkgs/config.nix andrewrk's config]
* [https://github.com/andrewrk/dotfiles/blob/master/.nixpkgs/config.nix andrewrk's config]


= YouCompleteMe =
<!--T:100-->
* [https://github.com/wagnerf42/nixos-config/blob/master/config/my_vim.nix wagnerf42's config (good for rust language)]
 
=== YouCompleteMe === <!--T:65-->
 
<!--T:66-->
Currently the youcompleteme plugin uses [https://github.com/NixOS/nixpkgs/blob/8e7b1f2ac2e261d5a644fef860a0d050ea227c06/pkgs/misc/vim-plugins/default.nix#L695 unwrapped clang on linux]. This causes it to not find <code>stdlib.h</code>. There is a [https://github.com/andrewrk/genesis/blob/5f49cd9a8c2b61b9859a22102bc3f732add9461a/.ycm_extra_conf.py workaround] you can put in your <code>.ycm_extra_conf.py</code> file, which works by executing the C/C++ compiler and getting it to output the list of search paths - which includes the search path to find <code>stdlib.h</code>.
Currently the youcompleteme plugin uses [https://github.com/NixOS/nixpkgs/blob/8e7b1f2ac2e261d5a644fef860a0d050ea227c06/pkgs/misc/vim-plugins/default.nix#L695 unwrapped clang on linux]. This causes it to not find <code>stdlib.h</code>. There is a [https://github.com/andrewrk/genesis/blob/5f49cd9a8c2b61b9859a22102bc3f732add9461a/.ycm_extra_conf.py workaround] you can put in your <code>.ycm_extra_conf.py</code> file, which works by executing the C/C++ compiler and getting it to output the list of search paths - which includes the search path to find <code>stdlib.h</code>.
<!--T:67-->
A better alternative to youcompleteme for C/C++ is to use [https://github.com/cquery-project/cquery/ cquery] in combination with the [https://github.com/autozimu/LanguageClient-neovim LanguageClient-neovim]. It will also find in c header files when used in a nix-shell if you install cquery from nixpkgs as it uses a custom [https://github.com/NixOS/nixpkgs/commit/04f3b76dcec21f2fcba6b1b0afbb3ed224165050#diff-11cdfc0385b9e017089c1ac09c5b838e shell wrapper]
== gvim and gview == <!--T:70-->
<!--T:71-->
You can enable <code>guiSupport</code> to make <code>gvim</code> available, though this won't give you <code>gview</code>:
</translate>
<syntaxhighlight lang="nix">
(pkgs.vim-full.customize {
  guiSupport = true;
})
</syntaxhighlight>
<translate>
</translate>
[[Category:Applications]]
[[Category:CLI Applications]]
[[Category:Text Editor{{#translation:}}]]