Neovim: Difference between revisions

M15a (talk | contribs)
Unabomberlive (talk | contribs)
Marked this version for translation
 
(18 intermediate revisions by 6 users not shown)
Line 1: Line 1:
[https://neovim.io Neovim] is a fork of [[Vim]] aiming to improve the codebase, allowing for easier implementation of APIs, improved user experience and plugin implementation.  
<languages/>
<translate>
<!--T:1-->
[https://neovim.io/ Neovim]<ref>Neovim Team, "Home - Neovim", Neovim Official Website, N/A. https://neovim.io/</ref> is a highly extensible and open source text editor that aims to improve upon and modernize the popular [[Vim]]<ref>NixOS Wiki, Vim. https://wiki.nixos.org/wiki/Vim</ref> editor. It's designed to be a drop-in replacement for Vim, maintaining compatibility with most Vim plugins and configurations while offering additional features and improvements. Neovim focuses on extensibility, usability, and performance.


== Installation ==
<!--T:2-->
It introduces a powerful plugin architecture that allows for asynchronous plugin execution, which can significantly improve performance for certain operations. It also includes a built-in terminal emulator, allowing users to run shell commands directly within the editor. The project emphasizes code quality and maintainability, with a clean, well-documented codebase that makes it easier for developers to contribute.


=== With Home Manager ===
== Installation == <!--T:3-->


[[Home Manager]] has a module for Neovim, which can be enabled via
==== Using nix-shell ==== <!--T:4-->


<syntaxhighlight lang="nix">
</translate>
programs.neovim = {
<syntaxhighlight lang="bash" start="3">
  enable = true;
nix-shell -p neovim
  extraConfig = ''
    set number relativenumber
  '';
};
</syntaxhighlight>
</syntaxhighlight>
<translate>


More information about the module can be found here: [https://nix-community.github.io/home-manager/options.xhtml#opt-programs.neovim.enable Home Manager Manual].
==== Using Global Configuration ==== <!--T:5-->


=== System-wide ===
</translate>
<syntaxhighlight lang="text">
environment.systemPackages = [
  pkgs.neovim
];
</syntaxhighlight>
<translate>


If you do not use Home Manager, you can use the following code in your NixOS configuration:
<!--T:37-->
After modifying your configuration, apply the changes by running:


<syntaxhighlight lang="nix">
</translate>
programs.neovim = {
<syntaxhighlight lang="bash">
  enable = true;
sudo nixos-rebuild switch
  defaultEditor = true;
};
</syntaxhighlight>
</syntaxhighlight>
<translate>


You can also manually add Neovim to your packages. This should only be used if the two version above do not work for you.
==== Using Home Configuration ==== <!--T:6-->


<syntaxhighlight lang="nix">
</translate>
environment.systemPackages = [ pkgs.neovim ];
<syntaxhighlight lang="text">
home.packages = [  
  pkgs.neovim  
];
</syntaxhighlight>
</syntaxhighlight>
<translate>


== Configuration ==
<!--T:38-->
After updating your configuration, apply the changes by running:


Neovim shares most of its configuration with Vim. See the [[Vim|Vim page]] for more details on the use of both.
</translate>
 
<syntaxhighlight lang="bash">
=== With Home Manager ===
home-manager switch
 
The Home Manager module does not expose many configuration options. Therefore, the easiest way to get started is to use the [https://nix-community.github.io/home-manager/options.html#opt-programs.neovim.extraConfig extraConfig] option.
You can copy your old config or directly load your default Neovim config via:
 
<syntaxhighlight lang="nix">
programs.neovim.extraConfig = lib.fileContents ../path/to/your/init.vim;
</syntaxhighlight>
</syntaxhighlight>
<translate>


To use Neovim as your default editor, you can set the <code>EDITOR</code> [https://search.nixos.org/options?show=environment.variables&type=packages&query=environment.variables environmental variable] to "nvim" by adding the following to your NixOS configuration:
== Configuration == <!--T:7-->
 
<syntaxhighlight lang="nix">
environment.variables.EDITOR = "nvim";
</syntaxhighlight>


The Home Manager module does also expose options to automatically add <code>vi</code> and <code>vim</code> aliases.
==== Basic ==== <!--T:8-->
To use them, add the following to your Home Manager configuration:


</translate>
<syntaxhighlight lang="nix">
<syntaxhighlight lang="nix">
<translate>
<!--T:39-->
# Global Configuration
</translate>
programs.neovim = {
programs.neovim = {
  viAlias = true;
  enable = true;
  vimAlias = true;
  defaultEditor = true;
};
};
</syntaxhighlight>


==== Installing Plugins ====
<translate>
 
<!--T:40-->
Plugins can be installed using the <code>programs.neovim.plugins</code> option.
# Home Configuration
You can add only the plugin, or the plugin with its corresponding config:
</translate>
 
programs.neovim = {
<syntaxhighlight lang="nix">
   enable = true;
programs.neovim.plugins = [
   extraConfig = ''
  pkgs.vimPlugins.nvim-tree-lua
     set number relativenumber
  {
  '';
    plugin = pkgs.vimPlugins.vim-startify;
};
    config = "let g:startify_change_to_vcs_root = 0";
  }
];
</syntaxhighlight>
 
If you only add the plugin, you can add the configuration as described above.
 
An index of official packages can be found in on [https://search.nixos.org/packages?from=0&size=50&sort=relevance&type=packages&query=vimPlugins search.nixos.org].
In addition to the official packages, there are several user maintained repositories, such as [https://github.com/m15a/flake-awesome-neovim-plugins awesome-neovim-plugins] or [https://github.com/NixNeovim/NixNeovimPlugins NixNeovimPlugins]. Plugins which are
not available in any of these repositories may be integrated using the <code>vimUtils.buildVimPlugin</code> function from Nixpkgs:
 
<syntaxhighlight lang="nix">
pkgs.vimUtils.buildVimPlugin {
   pname = "whatever";
   version = "whatever";
  src = builtins.fetchGit {
     url = "https://github.com/example/whatever.git";
    ref = "whatever";
  };
  buildScript = ":";
}
</syntaxhighlight>
</syntaxhighlight>
<translate>


=== System-wide ===
==== Advanced ==== <!--T:10-->
 
The NixOS module does not have an <code>extraConfig</code> option as the Home Manager module does.
Instead, you can use the <code>programs.neovim.configure</code> option as described [https://search.nixos.org/options?show=programs.neovim.configure&type=packages&query=neovim here].
 
The following example configures RC commands and enables the plugin <code>ctrlp</code> to support fuzzy file search (see [https://github.com/ctrlpvim/ctrlp.vim homepage] on how to use it)


</translate>
<syntaxhighlight lang="nix">
<syntaxhighlight lang="nix">
<translate>
<!--T:41-->
# Global Configuration
</translate>
programs.neovim = {
programs.neovim = {
   enable = true;
   enable = true;
  defaultEditor = true;
  viAlias = true;
  vimAlias = true;
   configure = {
   configure = {
     customRC = ''
     customRC = ''
Line 122: Line 111:
   };
   };
};
};
<translate>
<!--T:42-->
# Home Configuration
# You have to add the line below to set it as the default editor:
</translate>
environment.variables.EDITOR = "nvim";
</syntaxhighlight>
</syntaxhighlight>
<translate>
== Tips and Tricks == <!--T:12-->


To set Neovim as your default editor:
==== Location of Options ==== <!--T:13-->


<!--T:43-->
The home manager options are defined in the following [https://nix-community.github.io/home-manager/options.xhtml#opt-programs.neovim.enable Home Manager Options Manual]<ref>Nix Community, "Home Manager Option Search", Nix Community GitHub Pages, N/A. https://nix-community.github.io/home-manager/options.xhtml#opt-programs.neovim.enable</ref>.
<!--T:14-->
The global options are listed on [https://mynixos.com/search?q=nixpkgs%2Foption%2Fprograms.neovim MyNixOS]<ref>MyNixOS Team, "Search: nixpkgs/option/programs.neovim", MyNixOS, N/A. https://mynixos.com/search?q=nixpkgs%2Foption%2Fprograms.neovim</ref>.
==== Package Variations ==== <!--T:15-->
<!--T:44-->
Have a look at the [https://github.com/nix-community/neovim-nightly-overlay Neovim Nightly Overlay]<ref>Nix Community, "neovim-nightly-overlay", GitHub, N/A. https://github.com/nix-community/neovim-nightly-overlay</ref> to install the most recent current nightly version of Neovim.
<!--T:16-->
You can run the master version via the following command:
<!--T:17-->
nix run "github:nix-community/neovim-nightly-overlay"
==== Plugin Management ==== <!--T:21-->
</translate>
<syntaxhighlight lang="nix">
<syntaxhighlight lang="nix">
programs.neovim = {
plugins = [
  defaultEditor = true;
<translate>
};
  <!--T:49-->
</syntaxhighlight>
# Example Plugin: nvim-tree-lua
</translate>
  pkgs.vimPlugins.nvim-tree-lua
 
<translate>
  <!--T:50-->
# Example Plugin: vim-startify with configuration
</translate>
  {
    plugin = pkgs.vimPlugins.vim-startify;
    config = "let g:startify_change_to_vcs_root = 0";
  }
 
<translate>
  <!--T:51-->
# Example Plugin: nvim-colorizer-lua with Lua config
  # Due to how the runtimepath for Lua modules is processed, your configuration may require
  # packadd! plugin-name to require a module. A home-manager example:
</translate>
  {
    plugin = pkgs.vimPlugins.nvim-colorizer-lua;
    config = ''
      packadd! nvim-colorizer.lua
      lua << END
        require 'colorizer'.setup {
          '*';<translate> <!--T:52--> -- Highlight all files, but customize some others.</translate>
          '!vim';<translate> <!--T:53--> -- Exclude vim from highlighting.</translate>
        }
      END
    '';
  }
 
<translate>
  <!--T:54-->
# Example Plugin: nvim-treesitter with Lua config
</translate>
  {
    plugin = pkgs.vimPlugins.nvim-treesitter;
    config = ''
      packadd! nvim-treesitter
      lua <<EOF
        require'nvim-treesitter.configs'.setup {
          highlight = {
            enable = true,              <translate><!--T:55--> -- false will disable the whole extension</translate>
            disable = {},              <translate><!--T:56--> -- list of languages that will be disabled</translate>
          },
          incremental_selection = {
            enable = true,
            keymaps = {
              init_selection = "gnn",
              node_incremental = "grn",
              scope_incremental = "grc",
              node_decremental = "grm",
            },
          },
          textobjects = {
            select = {
              enable = true,
              lookahead = true,
              keymaps = {
                ["af"] = "@function.outer",
                ["if"] = "@function.inner",
                ["ac"] = "@class.outer",
                ["ic"] = "@class.inner",
              },
            },
          },
        }
      EOF
    '';
  }


Further, the NixOS module does also expose options to automatically add <code>vi</code> and <code>vim</code> aliases.
<translate>
To use them, add the following to your NixOS configuration:
  <!--T:57-->
# Installing grammars for tree-sitter
  # Option 1: Install all grammar packages
  pkgs.vimPlugins.nvim-treesitter.withAllGrammars
 
  # Option 2: Install specific grammar packages
  # (pkgs.vimPlugins.nvim-treesitter.withPlugins (p: [ p.c p.java ]))


<syntaxhighlight lang="nix">
  <!--T:58-->
programs.neovim = {
# Option 3: Installing grammars without Nix
   viAlias = true;
  # Installing grammar packages through the built-in command can lead to errors.  
  vimAlias = true;
   # The following Neovim command will install syntax highlighting for the C programming language: :TSInstall c
};
</translate>
];
</syntaxhighlight>
</syntaxhighlight>
<translate>


== Tips and tricks ==
==== Frameworks ==== <!--T:18-->


=== Build Neovim using Nix ===
<!--T:45-->
If you prefer not to configure your system manually, NixOS offers several predefined configurations and community-supported options. Here are a few of them:


You can also compile Neovim using nix. For this, the Neovim GitHub page has more information on this:
<!--T:19-->
[https://github.com/neovim/neovim/wiki/Building-Neovim#nixos--nix Neovim Guide].
* [https://www.lazyvim.org/ LazyVim]<ref>LazyVim Team, "LazyVim", LazyVim Official Website, N/A. https://www.lazyvim.org/</ref>


The Neovim repository also contains a flake.
<!--T:46-->
You can run the master version via the following command:
* [https://astronvim.com/ AstroVim]<ref>AstroNvim Team, "AstroNvim", AstroNvim Official Website, N/A. https://astronvim.com/</ref>


nix run "github:neovim/neovim?dir=contrib"
<!--T:47-->
* [https://nvchad.com/ NVChad]<ref>NvChad Team, "NvChad", NvChad Official Website, N/A. https://nvchad.com/</ref>


Finally, there is a [https://github.com/nix-community/neovim-nightly-overlay Neovim Nightly Overlay].
<!--T:48-->
Another excellent option is [https://www.lunarvim.org/docs/installation LunarVim]<ref>LunarVim Team, "Installation", LunarVim Documentation, N/A. https://www.lunarvim.org/docs/installation</ref>. The development community describes it as "an IDE layer for Neovim with sane defaults." LunarVim includes an installer/updater for LSP modules and other features. It can be installed via the <code>lunarvim</code> package from <code>nixpkgs</code> and is started with the <code>lvim</code> command.


=== Note on Lua plugins  ===
<!--T:20-->
The configuration for LunarVim is stored in <code>./config/lvim</code>.


Due to how the `runtimepath` for Lua modules is [https://github.com/nanotee/nvim-lua-guide#a-note-about-packages processed], your configuration may require <code>packadd! plugin-name</code> to require a module. A home-manager example:
== Troubleshooting == <!--T:59-->


<syntaxhighlight lang="nix">
== References == <!--T:27-->
programs.neovim = {
  plugins = [
    {
      plugin = pkgs.vimPlugins.nvim-colorizer-lua;
      config = ''
        packadd! nvim-colorizer.lua
        lua << END
require 'colorizer'.setup {
  '*'; -- Highlight all files, but customize some others.
  '!vim'; -- Exclude vim from highlighting.
}
END
      '';
    }
  ];
}
</syntaxhighlight>


== See Also ==
</translate>
* [[Vim]]
* [[Treesitter|Treesitter for Neovim]]


[[Category:Applications]]
[[Category:Applications]]
[[Category:Text Editor]]