Vim/ru: Difference between revisions
Created page with "* Запустите <code>./update.py</code> еще раз, чтобы сгенерировать nix-выражение плагина." |
Created page with "Иногда вы не хотите изменять плагины, находящиес в upstream, для этого вы можете использовать <code>vimUtils.buildVimPlugin</code> для создания своего собственного плагина:" |
||
Line 362: | Line 362: | ||
=== Добавьте новый пользовательский плагин в пользовательские пакеты === | === Добавьте новый пользовательский плагин в пользовательские пакеты === | ||
Иногда вы не хотите изменять плагины, находящиес в upstream, для этого вы можете использовать <code>vimUtils.buildVimPlugin</code> для создания своего собственного плагина: | |||
<syntaxHighlight lang="nix"> | <syntaxHighlight lang="nix"> |
Latest revision as of 20:39, 22 August 2024
[www.vim.org Vim] (vi improved) - свободный текстовый редактор, созданный на основе более старого vi. Ныне это мощный текстовый редактор с полной свободой настройки и автоматизации, возможными благодаря расширениям и надстройкам.
Установка
Начальная Установка
На unstable ветке:
programs.vim.enable = true;
или
programs.vim = {
enable = true;
package = pkgs.vim_configurable;
};
На 24.05 или старше:
environment.systemPackages = with pkgs; [ vim ];
или
environment.systemPackages = with pkgs; [ vim_configurable ];
Используя Home-Manager
Vim can easily be set up using Home Manager. Here's a minimal example:
programs.vim = {
enable = true;
plugins = with pkgs.vimPlugins; [ vim-airline ];
settings = { ignorecase = true; };
extraConfig = ''
set mouse=a
'';
};
See [1] for the full set of options.
Файлы Правописания Vim
Вы можете настроить на установку файлов правописания в каталог пользователя через home-manager, упаковывая отдельные файлы правописания. Вот пример для neovim и французского языка:
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;
}
NeoVim с Coc.nvim для Python
For NeoVim use this home manager config: https://github.com/NixOS/nixpkgs/issues/98166#issuecomment-725319238
Глобальная настройка vim/nvim
If you want a system wide "baseline" configuration for vim/nvim here are two examples:.
On unstable ветке:
{ pkgs, ... }:
{
programs.vim = {
enable = true;
defaultEditor = true;
package = (pkgs.vim_configurable.override { }).customize{
name = "vim";
<div lang="en" dir="ltr" class="mw-content-ltr">
# Install plugins for example for syntax highlighting of nix files
</div>
vimrcConfig.packages.myplugins = with pkgs.vimPlugins; {
start = [ vim-nix vim-lastplace ];
opt = [];
};
vimrcConfig.customRC = ''
<div lang="en" dir="ltr" class="mw-content-ltr">
" your custom vimrc
</div>
set nocompatible
set backspace=indent,eol,start
" Включить подсветку синтаксиса по умолчанию
syntax on
" ...
'';
};
};
}
На 24.05 или старше:
{ pkgs, ... }:
{
environment.variables = { EDITOR = "vim";
environment.systemPackages = with pkgs; [
((vim_configurable.override { }).customize{
name = "vim";
<div lang="en" dir="ltr" class="mw-content-ltr">
# Install plugins for example for syntax highlighting of nix files
</div>
vimrcConfig.packages.myplugins = with pkgs.vimPlugins; {
start = [ vim-nix vim-lastplace ];
opt = [];
};
vimrcConfig.customRC = ''
<div lang="en" dir="ltr" class="mw-content-ltr">
" your custom vimrc
</div>
set nocompatible
set backspace=indent,eol,start
" Включить подсветку синтаксиса по умолчанию
syntax on
" ...
'';
}
)];
}
{ pkgs, ... }:
{
programs.neovim = {
enable = true;
defaultEditor = true;
vimAlias = true;
configure = {
customRC = ''
<div lang="en" dir="ltr" class="mw-content-ltr">
" your custom vimrc
</div>
set nocompatible
set backspace=indent,eol,start
" ...
'';
packages.myPlugins = with pkgs.vimPlugins; {
start = [ vim-lastplace vim-nix ];
opt = [];
};
};
};
}
импортируйте их в свой configuration.nix
и
{
imports =
[
./vim.nix
];
# ...
}
Пользовательская настройка без использования Home Manager
Плагины Vim могут быть установлены с помощью Nix. Вы можете не использовать менеджеры плагинов и сделать все самостоятельно в .nixpkgs/config
.
A lot of documentation about package management and configuration of vim in nix is stored at [2] in nixpkgs.
Customizations
И в vim, и в neovim можно дополнительно включенить ваши любимые плагины и дополнительные библиотеки. Чтобы получить список всех доступных плагинов vim, выполните команду nix search nixpkgs#vimPlugins
.
Добавьте следующий код в ваш ~/.nixpkgs/config.nix
{
packageOverrides = pkgs: with pkgs; {
myVim = vim_configurable.customize {
name = "vim-with-plugins";
# добавьте сюда код из секции с примером
};
myNeovim = neovim.override {
configure = {
customRC = ''
# здесь должна находится ваша пользовательская конфигурация!
'';
packages.myVimPackage = with pkgs.vimPlugins; {
# смотрите примеры ниже чтобы узнать как использовать пользовательские пакеты
start = [ ];
opt = [ ];
};
};
};
};
}
After that you can install your special grafted `myVim` or `myNeovim` packages.
Примеры
Добавить пользовательские настройка в вашу конфигурацию vimrc
NB: you must use vimrcConfig.customRC
rather than installing a ~/.vimrc
by hand, since the customized Vim will silently ignore any vimrc in your home directory.
vim_configurable.customize {
name = "vim-with-plugins";
# добавьте пользовательские строки в .vimrc, например, такие:
vimrcConfig.customRC = ''
set hidden
set colorcolumn=80
'';
}
If you need to run code before plugins are added, you can use vimrcConfig.beforePlugins
(be sure to include set nocompatible
if you override the default value).
Using vim's builtin packaging capability
vim_configurable.customize {
vimrcConfig.packages.myVimPackage = with pkgs.vimPlugins; {
<div lang="en" dir="ltr" class="mw-content-ltr">
# loaded on launch
</div>
start = [ YouCompleteMe fugitive ];
<div lang="en" dir="ltr" class="mw-content-ltr">
# manually loadable by calling `:packadd $plugin-name`
</div>
opt = [ phpCompletion elm-vim ];
<div lang="en" dir="ltr" class="mw-content-ltr">
# To automatically load a plugin when opening a filetype, add vimrc lines like:
</div>
# autocmd FileType php :packadd phpCompletion
}
};
Note that dynamically loading with opt may be buggy and the workaround is to use start instead.
Использование Pathogen в качестве менеджера плагинов
There is a pathogen implementation as well, but its startup is slower and [VAM] has more features.
vimrcConfig.pathogen.knownPlugins = vimPlugins; # optional
vimrcConfig.pathogen.pluginNames = [ "vim-addon-nix" "youcompleteme" ];
Использование Vim-plug в качестве менеджера плагинов
vimrcConfig.plug.plugins = with pkgs.vimPlugins; [vim-addon-nix youcompleteme];
Добавление новых плагинов
As per the instructions found in https://github.com/NixOS/nixpkgs/blob/master/doc/languages-frameworks/vim.section.md
- Сначала выполните
./update.py
.
- Commit the changes with the commit message "vimPlugins: Update".
- Add your plugin to ./vim-plugin-names (please try to maintain the list alphabetically sorted). You can customize the branch by appending for example
@main
to an entry (search the file for examples)
- Запустите
./update.py
еще раз, чтобы сгенерировать nix-выражение плагина.
- Commit your changes one more time, this time with the message formated as such: "vimPlugins.[plugin-name]: init at [version]".
- If you need to add additional code/patches to the generated code, add those lines to
pkgs/misc/vim-plugins/vim2nix/additional-nix-code
and rerun./update.py
. They will be included in the generated code.
Плагины заслуживающие внимания
For additional info, you may wish to look at documentation on the nixpkgs repository.
Добавьте новый пользовательский плагин в пользовательские пакеты
Иногда вы не хотите изменять плагины, находящиес в upstream, для этого вы можете использовать vimUtils.buildVimPlugin
для создания своего собственного плагина:
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_configurable.customize {
vimrcConfig.packages.myVimPackage = with pkgs.vimPlugins; {
start = [ vim-better-whitespace ];
};
})
];
};
Используя Flake
configuration.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;
};
}
)
];
};
flake.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; }
];
};
};
}
Then we can update the package with nix flake lock --update-input winresizer-vim
, or update all inputs in flake.nix with nix flake update
.
Vim в качестве Python IDE
Следующий фрагмент создаст полнофункциональную IDE для python.
Using language client
vim_configurable.customize {
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 ];
}
};
Then put the following expression in environment.systemPackages
or in the home-manager package list,
to install python-language-server:
(python3.withPackages(ps: [
ps.python-language-server
<div lang="en" dir="ltr" class="mw-content-ltr">
# the following plugins are optional, they provide type checking, import sorting and code formatting
</div>
ps.pyls-mypy ps.pyls-isort ps.pyls-black
]))
Примеры из реальной жизни
YouCompleteMe
Currently the youcompleteme plugin uses unwrapped clang on linux. This causes it to not find stdlib.h
. There is a workaround you can put in your .ycm_extra_conf.py
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 stdlib.h
.
A better alternative to youcompleteme for C/C++ is to use cquery in combination with the 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 shell wrapper
Поддержка Python 3 для Vim
Если вы определили конфигурацию vim в файле `./my_vim.nix`, вы можете установить vim с поддержкой python3 вместо python2, переопределив версию python, как показано ниже:
(pkgs.callPackage ./my_vim.nix {
vim_configurable = vim_configurable.override { python = python3; };
})
Gvim и Gview
gvim
and gview
may be installed using the vimHugeX
attribute name (package name vim_configurable
).
$ nix-env -iA nixos.vimHugeX
If you are using vim_configurable.customize
, you can enable wrapGui
to make gvim
available, though this won't give you gview
:
vim_configured = pkgs.vim_configurable.customize {
name = "vim";
wrapGui = true;
};