Vim/zh: Difference between revisions
Created page with "=== Vim 拼写文件 ===" Tags: Mobile edit Mobile web edit |
Created page with "==== 应用自定义 vimrc 配置 ====" |
||
(9 intermediate revisions by the same user not shown) | |||
Line 51: | Line 51: | ||
=== Vim 拼写文件 === | === Vim 拼写文件 === | ||
你可以配置 home-manager,通过打包单个拼写文件的方式将拼写文件安装到你的用户目录中。以下是 [[neovim]] 检查法语的示例: | |||
<syntaxHighlight lang="nix"> | <syntaxHighlight lang="nix"> | ||
Line 85: | Line 83: | ||
</syntaxHighlight> | </syntaxHighlight> | ||
< | <span id="NeoVim_with_Coc_for_Python"></span> | ||
==== NeoVim | ==== NeoVim 配置带有 Python 支持的 Coc ==== | ||
<div lang="en" dir="ltr" class="mw-content-ltr"> | <div lang="en" dir="ltr" class="mw-content-ltr"> | ||
Line 94: | Line 91: | ||
</div> | </div> | ||
< | <span id="System_wide_vim/nvim_configuration"></span> | ||
== | == 系统范围的 vim/nvim 配置 == | ||
如果您想要一个 vim/nvim 的系统范围“基本”配置,这里有两个示例: | |||
<div lang="en" dir="ltr" class="mw-content-ltr"> | <div lang="en" dir="ltr" class="mw-content-ltr"> | ||
Line 114: | Line 108: | ||
package = (pkgs.vim-full.override { }).customize{ | package = (pkgs.vim-full.override { }).customize{ | ||
name = "vim"; | name = "vim"; | ||
# 安装插件,例如用于 nix 文件的语法高亮 | |||
# | |||
vimrcConfig.packages.myplugins = with pkgs.vimPlugins; { | vimrcConfig.packages.myplugins = with pkgs.vimPlugins; { | ||
start = [ vim-nix vim-lastplace ]; | start = [ vim-nix vim-lastplace ]; | ||
Line 122: | Line 114: | ||
}; | }; | ||
vimrcConfig.customRC = '' | vimrcConfig.customRC = '' | ||
" 你的自定义 vimrc | |||
set nocompatible | set nocompatible | ||
set backspace=indent,eol,start | set backspace=indent,eol,start | ||
" 默认打开语法高亮 | |||
syntax on | syntax on | ||
" ... | " ... | ||
Line 146: | Line 134: | ||
configure = { | configure = { | ||
customRC = '' | customRC = '' | ||
" 你的自定义 vimrc | |||
set nocompatible | set nocompatible | ||
set backspace=indent,eol,start | set backspace=indent,eol,start | ||
Line 162: | Line 148: | ||
</syntaxHighlight> | </syntaxHighlight> | ||
将这些导入到您的 <code>configuration.nix</code> 中并使用 | |||
<syntaxHighlight lang="nix"> | <syntaxHighlight lang="nix"> | ||
{ | { | ||
Line 175: | Line 159: | ||
</syntaxHighlight> | </syntaxHighlight> | ||
< | <span id="Custom_setup_without_using_Home_Manager"></span> | ||
== | == 不使用 Home Manager 的自定义设置 == | ||
<div lang="en" dir="ltr" class="mw-content-ltr"> | <div lang="en" dir="ltr" class="mw-content-ltr"> | ||
Line 183: | Line 166: | ||
</div> | </div> | ||
Vim 插件可以通过 nix 安装。您可以不使用 vim 插件管理器,直接在 <code>.nixpkgs/config</code> 中完成所有操作。 | |||
Vim | |||
<div lang="en" dir="ltr" class="mw-content-ltr"> | <div lang="en" dir="ltr" class="mw-content-ltr"> | ||
Line 191: | Line 172: | ||
</div> | </div> | ||
< | <span id="Customizations"></span> | ||
=== | === 自定义 === | ||
vim 和 neovim 都可以进一步配置,以包含您喜欢的插件和其他库。要列出所有可用的 vim 插件,请运行 <code>nix search nixpkgs#vimPlugins</code>。 | |||
将以下代码添加到您的<code>~/.nixpkgs/config.nix</code>: | |||
<syntaxhighlight lang="nix"> | <syntaxhighlight lang="nix"> | ||
Line 208: | Line 184: | ||
myVim = vim-full.customize { | myVim = vim-full.customize { | ||
name = "vim-with-plugins"; | name = "vim-with-plugins"; | ||
# 在此处添加示例部分的代码 | |||
# | |||
}; | }; | ||
myNeovim = neovim.override { | myNeovim = neovim.override { | ||
configure = { | configure = { | ||
customRC = '' | customRC = '' | ||
# 您的自定义配置就在这里! | |||
# | |||
''; | ''; | ||
packages.myVimPackage = with pkgs.vimPlugins; { | packages.myVimPackage = with pkgs.vimPlugins; { | ||
# 请参阅以下示例了解如何使用自定义包 | |||
# | |||
start = [ ]; | start = [ ]; | ||
opt = [ ]; | opt = [ ]; | ||
Line 232: | Line 202: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
之后,您可以安装特殊移植的 `myVim` 或 `myNeovim` 包。 | |||
< | <span id="Examples"></span> | ||
=== | === 示例 === | ||
< | <span id="Apply_custom_vimrc_configuration"></span> | ||
==== | ==== 应用自定义 vimrc 配置 ==== | ||
<div lang="en" dir="ltr" class="mw-content-ltr"> | <div lang="en" dir="ltr" class="mw-content-ltr"> |
Revision as of 20:35, 7 October 2025
Vim (vi improved) is a highly configurable modal text editor program for the terminal.
安装
基础安装
programs.vim.enable = true;
或者
programs.vim = {
enable = true;
package = pkgs.vim-full;
};
或者
environment.systemPackages = with pkgs; [ vim-full ];
使用 Home Manager
使用 Home Manager 可以轻松设置 Vim。这是一个简单的例子:
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 配置带有 Python 支持的 Coc
For NeoVim use this home manager config: https://github.com/NixOS/nixpkgs/issues/98166#issuecomment-725319238
系统范围的 vim/nvim 配置
如果您想要一个 vim/nvim 的系统范围“基本”配置,这里有两个示例:
On unstable:
{ pkgs, ... }:
{
programs.vim = {
enable = true;
defaultEditor = true;
package = (pkgs.vim-full.override { }).customize{
name = "vim";
# 安装插件,例如用于 nix 文件的语法高亮
vimrcConfig.packages.myplugins = with pkgs.vimPlugins; {
start = [ vim-nix vim-lastplace ];
opt = [];
};
vimrcConfig.customRC = ''
" 你的自定义 vimrc
set nocompatible
set backspace=indent,eol,start
" 默认打开语法高亮
syntax on
" ...
'';
};
};
}
{ pkgs, ... }:
{
programs.neovim = {
enable = true;
defaultEditor = true;
vimAlias = true;
configure = {
customRC = ''
" 你的自定义 vimrc
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 安装。您可以不使用 vim 插件管理器,直接在 .nixpkgs/config
中完成所有操作。
A lot of documentation about package management and configuration of vim in nix is stored at [2] in nixpkgs.
自定义
vim 和 neovim 都可以进一步配置,以包含您喜欢的插件和其他库。要列出所有可用的 vim 插件,请运行 nix search nixpkgs#vimPlugins
。
将以下代码添加到您的~/.nixpkgs/config.nix
:
{
packageOverrides = pkgs: with pkgs; {
myVim = vim-full.customize {
name = "vim-with-plugins";
# 在此处添加示例部分的代码
};
myNeovim = neovim.override {
configure = {
customRC = ''
# 您的自定义配置就在这里!
'';
packages.myVimPackage = with pkgs.vimPlugins; {
# 请参阅以下示例了解如何使用自定义包
start = [ ];
opt = [ ];
};
};
};
};
}
之后,您可以安装特殊移植的 `myVim` 或 `myNeovim` 包。
示例
应用自定义 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-full.customize {
name = "vim-with-plugins";
<div lang="en" dir="ltr" class="mw-content-ltr">
# add custom .vimrc lines like this:
</div>
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-full.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.
Using Pathogen as manager
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" ];
Using Vim-Plug as manager
vimrcConfig.plug.plugins = with pkgs.vimPlugins; [vim-addon-nix youcompleteme];
Adding new plugins
Notes Regarding Plugins
For additional info, you may wish to look at documentation on the nixpkgs repository.
Add a new custom plugin to the users packages
Sometimes you do not want to change upstream plugins, for this you can use vimUtils.buildVimPlugin
to create your own:
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 ];
};
})
];
};
Using 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 as a Python IDE
The following snippet will make a full featured python IDE.
Using language client
vim-full.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
]))
Real life examples
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
gvim and gview
You can enable guiSupport
to make gvim
available, though this won't give you gview
:
(pkgs.vim-full.customize {
guiSupport = true;
})