Vim: Difference between revisions
imported>Hhm add gvim part |
m link to neovim |
||
| (49 intermediate revisions by 32 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. | |||
Vim can easily be set up using [[Home Manager]]. Here's a minimal example: | == 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> | <syntaxhighlight lang="nix> | ||
programs.vim = { | programs.vim = { | ||
enable = true; | enable = true; | ||
plugins = [ | plugins = with pkgs.vimPlugins; [ vim-airline ]; | ||
settings = { ignorecase = true; }; | settings = { ignorecase = true; }; | ||
extraConfig = '' | extraConfig = '' | ||
| Line 12: | Line 50: | ||
}; | }; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<translate> | |||
<!--T:9--> | |||
See [https://github.com/rycee/home-manager/blob/master/modules/programs/vim.nix] for the full set of options. | See [https://github.com/rycee/home-manager/blob/master/modules/programs/vim.nix] for the full set of options. | ||
== Custom setup without using Home Manager == | === 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_configurable.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] }} | {{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>. | ||
A lot of documentation about package management and configuration of vim in nix is stored at [https://github.com/NixOS/nixpkgs/blob/master/pkgs/ | <!--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 === | === Customizations === <!--T:28--> | ||
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 | <!--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>: | Add the following code to your <code>~/.nixpkgs/config.nix</code>: | ||
</translate> | |||
<syntaxHighlight lang="nix"> | <syntaxHighlight lang="nix"> | ||
{ | { | ||
| Line 32: | Line 207: | ||
myVim = vim_configurable.customize { | myVim = vim_configurable.customize { | ||
name = "vim-with-plugins"; | name = "vim-with-plugins"; | ||
# add here code from the example section | <translate> | ||
} | <!--T:85--> | ||
# add here code from the example section | |||
</translate> | |||
}; | |||
myNeovim = neovim.override { | myNeovim = neovim.override { | ||
configure = { | configure = { | ||
customRC = '' | customRC = '' | ||
# here your custom configuration goes! | <translate> | ||
<!--T:86--> | |||
# here your custom configuration goes! | |||
</translate> | |||
''; | ''; | ||
packages.myVimPackage = with pkgs.vimPlugins; { | packages.myVimPackage = with pkgs.vimPlugins; { | ||
# see examples below how to use custom packages | <translate> | ||
<!--T:87--> | |||
# see examples below how to use custom packages | |||
</translate> | |||
start = [ ]; | start = [ ]; | ||
opt = [ ]; | opt = [ ]; | ||
}; | }; | ||
} | }; | ||
} | }; | ||
}; | |||
} | } | ||
</syntaxHighlight> | </syntaxHighlight> | ||
<translate> | |||
<!--T:32--> | |||
After that you can install your special grafted `myVim` or `myNeovim` packages. | After that you can install your special grafted `myVim` or `myNeovim` packages. | ||
=== Examples === | === Examples === <!--T:33--> | ||
==== Apply custom vimrc configuration ==== | ==== 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"> | <syntaxHighlight lang="nix"> | ||
vim_configurable.customize { | vim_configurable.customize { | ||
name = "vim-with-plugins"; | name = "vim-with-plugins"; | ||
# add custom .vimrc lines like this: | <translate> | ||
<!--T:88--> | |||
# add custom .vimrc lines like this: | |||
</translate> | |||
vimrcConfig.customRC = '' | vimrcConfig.customRC = '' | ||
set hidden | set hidden | ||
| Line 65: | Line 259: | ||
} | } | ||
</syntaxHighlight> | </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"> | <syntaxHighlight lang="nix"> | ||
vim_configurable.customize { | vim_configurable.customize { | ||
vimrcConfig.packages.myVimPackage = with pkgs.vimPlugins; { | vimrcConfig.packages.myVimPackage = with pkgs.vimPlugins; { | ||
# loaded on launch | <translate> | ||
start = [ | <!--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> | </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. | There is a pathogen implementation as well, but its startup is slower and [VAM] has more features. | ||
</translate> | |||
<syntaxhighlight lang="nix"> | <syntaxhighlight lang="nix"> | ||
vimrcConfig.pathogen.knownPlugins = vimPlugins; # optional | vimrcConfig.pathogen.knownPlugins = vimPlugins; # optional | ||
vimrcConfig.pathogen.pluginNames = [ "vim-addon-nix" "youcompleteme" ]; | vimrcConfig.pathogen.pluginNames = [ "vim-addon-nix" "youcompleteme" ]; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<translate> | |||
=== Using Vim-Plug as manager === | === Using Vim-Plug as manager === <!--T:43--> | ||
</translate> | |||
<syntaxhighlight lang="nix"> | <syntaxhighlight lang="nix"> | ||
vimrcConfig.plug.plugins = with pkgs.vimPlugins; [vim-addon-nix youcompleteme]; | vimrcConfig.plug.plugins = with pkgs.vimPlugins; [vim-addon-nix youcompleteme]; | ||
</syntaxhighlight> | </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> | 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"> | <syntaxHighlight lang="nix"> | ||
let | let | ||
vim-better-whitespace = pkgs.vimUtils.buildVimPlugin { | |||
name = "vim-better-whitespace"; | name = "vim-better-whitespace"; | ||
src = pkgs.fetchFromGitHub { | src = pkgs.fetchFromGitHub { | ||
| Line 136: | Line 340: | ||
}; | }; | ||
}; | }; | ||
in { | in { | ||
users.users.<yourNickname>.packages = [ | |||
(pkgs.vim_configurable.customize { | (pkgs.vim_configurable.customize { | ||
vimrcConfig.packages.myVimPackage = with pkgs.vimPlugins; { | |||
vimrcConfig. | start = [ vim-better-whitespace ]; | ||
}; | |||
}) | }) | ||
]; | |||
}; | }; | ||
</syntaxHighlight> | </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> | |||
<code>flake.nix</code>: | |||
<syntaxHighlight lang="nix"> | |||
{ | |||
inputs = { | |||
nixpkgs.url = "github:nixos/nixpkgs/nixos-22.05"; | |||
winresizer-vim = { | |||
url = "github:simeji/winresizer"; | |||
flake = false; | |||
}; | |||
}; | |||
outputs = inputs@{ nixpkgs, ... }: { | |||
nixosConfigurations.nixos = nixpkgs.lib.nixosSystem { | |||
system = "x86_64-linux"; | |||
specialArgs = { inherit inputs; }; | |||
modules = [ | |||
./configuration.nix | |||
./hardware-configuration.nix | |||
{ nix.registry.nixpkgs.flake = nixpkgs; } | |||
]; | |||
}; | |||
}; | |||
} | |||
</syntaxHighlight> | |||
<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 language client ==== <!--T:60--> | |||
</translate> | |||
<syntaxHighlight lang="nix"> | <syntaxHighlight lang="nix"> | ||
vim_configurable.customize { | vim_configurable.customize { | ||
| Line 172: | Line 436: | ||
}; | }; | ||
</syntaxHighlight> | </syntaxHighlight> | ||
<translate> | |||
<!--T:62--> | |||
Then put the following expression in <code>environment.systemPackages</code> or in the home-manager package list, | Then put the following expression in <code>environment.systemPackages</code> or in the home-manager package list, | ||
to install python-language-server: | to install python-language-server: | ||
</translate> | |||
<syntaxHighlight lang="nix"> | <syntaxHighlight lang="nix"> | ||
(python3.withPackages(ps: [ | (python3.withPackages(ps: [ | ||
ps.python-language-server | ps.python-language-server | ||
# the following plugins are optional, they provide type checking, import sorting and code formatting | <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 | ps.pyls-mypy ps.pyls-isort ps.pyls-black | ||
])) | ])) | ||
</syntaxHighlight> | </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] | ||
<!--T:100--> | |||
* [https://github.com/wagnerf42/nixos-config/blob/master/config/my_vim.nix wagnerf42's config (good for rust language)] | * [https://github.com/wagnerf42/nixos-config/blob/master/config/my_vim.nix wagnerf42's config (good for rust language)] | ||
=== YouCompleteMe === | === 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] | 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>: | |||
< | |||
(pkgs. | </translate> | ||
<syntaxhighlight lang="nix"> | |||
(pkgs.vim-full.customize { | |||
guiSupport = true; | |||
}) | }) | ||
</ | </syntaxhighlight> | ||
<translate> | |||
</translate> | |||
[[Category:Applications]] | |||
[[Category:CLI Applications]] | |||
[[Category:Text Editor{{#translation:}}]] | |||