Neovim
برای دریافت یک Neovim پایه جهت پیکربندی به صورت دستوری، neovim-unwrapped را نصب کنید.
این حالت نزدیکترین گزینه به چیزی است که در سایر توزیعها با آن مواجه میشوید.
neovim یک wrapper حول Neovim به همراه برخی پیکربندیهای اضافی است؛ برای نمونه، برای تنظیم ارائهدهندگان زبانهای مختلف مانند Python.
این wrapper را
neovim.override {
withPython3 = true; # see `:h g:python3_host_prog`
withNodeJs = false;
withRuby = false;
configure = {
customRC = ''
" here your custom viml configuration goes!
'';
packages.myVimPackage = with pkgs.vimPlugins; {
# See examples below on how to use custom packages.
start = [ ];
# If a Vim plugin has a dependency that is not explicitly listed in
# `opt`, that dependency will always be added to `start` to avoid confusion.
opt = [ ];
};
};
} myVimPackage یک نام دلخواه برای بستهٔ تولیدشده است. میتوانید هر نامی را که دوست دارید انتخاب کنید.
اگر میخواهید
neovim-qt.override {
neovim = neovim.override {
configure = {
customRC = ''
" your custom viml configuration
'';
};
};
} میتوانید از رپر (wrapper) ناپایدار جدید استفاده کنید، اما ممکن است رابط آن تغییر کند:
autoconfigure: برخی از پلاگینها برای کار با Nix به پیکربندی سفارشی نیاز دارند. به عنوان نمونه،sqlite-luaبرای کار کردن نیاز دارد تاg:
wrapNeovimUnstable neovim-unwrapped {
autoconfigure = true;
autowrapRuntimeDeps = true;
luaRcContent = ''
vim.o.sessionoptions = 'buffers,curdir,help,tabpages,winsize,winpos,localoptions'
vim.g.mapleader = ' '
vim.g.maplocalleader = ' '
vim.opt.smoothscroll = true
vim.opt.colorcolumn = { 100 }
vim.opt.termguicolors = true
'';
# plugins accepts a list of either plugins or attribute sets containing:
# { plugin = ...; config = ...; type = "viml"|"lua"; } (type defaults to "viml")
plugins = with vimPlugins; [
{
plugin = vim-obsession;
config = ''
map <Leader>$ <Cmd>Obsession<CR>
'';
}
{
plugin = grug-far-nvim;
type = "lua";
config = ''
require('grug-far').setup({
startInInsertMode = false,
})
'';
}
(nvim-treesitter.withPlugins (p: [
p.nix
p.python
]))
hex-nvim
];
extraLuaPackages = lp: [ lp.mpack ];
withPython3 = true;
withNodeJs = false;
withRuby = false;
} میتوانید پیکربندی را با nix repl بررسی کنید تا این گزینهها را کشف کرده و آنها را بازنشانی کنید. به عنوان مثال:
neovim.override {
autowrapRuntimeDeps = false;
} ویژگیهای خاص برخی پلاگینها
پیکربندی اختیاری پلاگین
برخی پلاگینها برای کار کردن به پیکربندی خاصی نیاز دارند. ما تصمیم گرفتهایم این پلاگینها را پچ نکنیم، بلکه پیکربندی لازم را برای پلاگینهای Neovim تحت PLUGIN.passthru.initLua در دسترس قرار دهیم. به عنوان مثال، پلاگین unicode-vim به مسیر یک پایگاه داده یونیکد نیاز دارد، بنابراین اسنیپت زیر vim.g.Unicode_data_directory="${'{'}'{'{'}'{'}'}self.unicode-vim{'{'}'{'}'}'{'}'}/autoload/unicode" را تحت vimPlugins.unicode-vim.passthru.initLua در دسترس قرار میدهیم.
بازنشانیهای مجوز پلاگین
پلاگینهای تولیدشدهٔ Vim و Neovim در صورت امکان، meta.license خود را از متادیتای مجوز GitHub دریافت میکنند.
برخی از مخازن بالادستی (upstream) فایل مجوزی که GitHub بتواند آن را تشخیص دهد ارائه نمیدهند، یا
{
foo-nvim = super.foo-nvim.overrideAttrs (old: {
meta = old.meta // {
# README says this plugin is distributed under the Vim license.
license = lib.licenses.vim;
};
});
} بارگذاری میکنند. این امر در درازمدت به معنای کار کمتر برای نگهدارندگان Nixpkgs است، چرا که وابستگیها به صورت خودکار بهروزرسانی میشوند. این
{
rtp-nvim = neovimUtils.buildNeovimPlugin { luaAttr = luaPackages.rtp-nvim; };
} برای بهروزرسانی این بستهها، باید بهجای آپدیتر Vim از آپدیتر Lua استفاده کنید.
برای افزودن یک بسته Lua به مجموعه vimPlugins، آن را به لیست luarocksPackageNames در [luaPackagePlugins.nix](
(pkgs.neovim.override {
configure = {
packages.myPlugins = with pkgs.vimPlugins; {
start = [
(nvim-treesitter.withPlugins (
plugins: with plugins; [
nix
python
]
))
];
};
};
}) برای فعالسازی همه گرامرهای بستهبندیشده در Nixpkgs، از pkgs.vimPlugins.nvim-treesitter.withAllGrammars استفاده کنید.
برای نحوه پیکربندی nvim-trees
(pkgs.neovim.override {
configure = {
packages.myPlugins =
with pkgs.vimPlugins;
let
# Select the grammars you need
treesitter-grammars = with nvim-treesitter-parsers; [
nix
python
];
# Queries are needed for treesitter based syntax highlighting and folds.
treesitter-queries = map (p: p.associatedQuery) treesitter-grammars;
in
{
start = [
# regular plugins
]
++ treesitter-grammars
++ treesitter-queries;
};
};
}) راهاندازی Treesitter با استفاده از پارسرها و کوئریهای WASM
Neovim
(pkgs.wrapNeovim (pkgs.neovim-unwrapped.override { wasmSupport = true; }) {
configure = {
packages.myPlugins =
with pkgs.pkgsCross.wasm32-wasip1.vimPlugins;
let
# Select the grammars you need
treesitter-grammars = with nvim-treesitter-parsers; [
nix
python
];
# Queries are needed for treesitter based syntax highlighting and folds.
treesitter-queries = map (p: p.associatedQuery) treesitter-grammars;
in
{
start = [
# regular plugins
]
++ treesitter-grammars
++ treesitter-queries;
};
};
}) پارسرهای بومی و WASM را برای یک زبان یکسان به طور همزمان نصب نکنید.
به عنوان مثال، نصب کردن هر دو pkgs.vimPlugins.nvim-treesitter
vim.api.nvim_create_autocmd('FileType', {
pattern = { 'rust', 'javascript', 'zig' },
callback = function(ev)
local bufnr = ev.buf
-- Enable treesitter syntax highlighting and parsing for the current buffer
-- (Requires queries to be installed)
vim.treesitter.start(bufnr)
-- Enable treesitter based code folding
-- (folds are window-scoped, not buffer-scoped)
-- (Requires queries to be installed)
vim.wo.foldexpr = 'v:lua.vim.treesitter.foldexpr()'
vim.wo.foldmethod = 'expr'
end,
}) گرامرهای Treesitter به عنوان وابستگیهای پلاگین
برخی از پلاگینهای Neovim (مانند آداپتورهای neotest، markdoc-nvim، hurl-nvim) به گرامرهای treesitter وابسته هستند.
این وابستگیها معمولاً در بازنشانیهای پلاگین اعلام میشوند.
مهم
برخی از فایلهای README پلاگینها ممکن است پیشنهاد کنند که آنها به
nvim-treesitterوابسته هستند. این موضوع تقریباً در تمام موارد صحت ندارد.
nvim-treesitterدیگر API ماژول Lua را برای استفادهی سایر پلاگینها ارائه نمیدهد. در اکثریت قریب به اتفاق موارد، این پلاگینها:
- به پارسرها وابسته هستند (نه به
nvim-treesitterیا کوئریهای آن).- کوئریهای خود را همراه دارند (یا به صورت فایلهای
*.scmیا به صورت کدگذاریشده در کدهای منبع Lua).
برای افزودن گرامرها به عنوان یک وابستگی پلاگین، یک [بازنشانی](https://github.com/NixOS/nixpkgs/blob/master/
{
foo-nvim = super.foo-nvim.overrideAttrs {
dependencies = with self.nvim-treesitter-parsers; [
markdown
markdown_inline
html
];
};
} اگر یک افزونه واقعاً به API ماژول قدیمی nvim-treesitter وابسته باشد، میتوانید nvim-treesitter-legacy را به عنوان وابستگی اضافه کنید:
{
foo-legacy-nvim = super.foo-legacy-nvim.overrideAttrs {
dependencies = with self; [
nvim-treesitter-legacy
nvim-treesitter-parsers.nix
];
};
} احتیاط
nvim-treesitter-legacyبه منظور تسهیل گذار وجود دارد و در نسخه ۲۶.۱۱ حذف خواهد شد. اگر یک پیکربندی Neovim شامل هر دوnvim-treesitterوnvim-trees
{ gitsigns-nvim = super.gitsigns-nvim.overrideAttrs { dependencies = [ self.plenary-nvim ]; nvimRequireCheck = "gitsigns"; }; }برخی از پلاگینها دارای ماژولهای Lua هستند که برای عملکرد درست به پیکربندی کاربر نیاز دارند یا میتوانند شامل ماژولهای اختیاری Lua باشند که نمیخواهیم با فراخوانی (require) آنها را تست کنیم. میتوانیم با استفاده از
nvimSkipModulesاز ماژولهای خاصی صرفنظر کنیم. این گزینه مانندnvimRequireCheckلیستی از رشتهها را میپذیرد.
nvimSkipModules = [ MODULE1 MODULE2 ];
{ asyncrun-vim = super.asyncrun-vim.overrideAttrs { nvimSkipModules = [ # vim plugin with optional toggleterm integration "asyncrun.toggleterm" "asyncrun.toggleterm2" ]; }; }در موارد نادر، ممکن است نخواهیم بارگذاری ماژولهای Lua را برای یک پلاگین واقعاً تست کنیم. در این موارد، میتوانیم
neovimRequireCheckرا باdoCheck = false;غیرفعال کنیم.این کار را میتوان به صورت دستی از طریق بازنشانیهای تعریف پلاگین در overrides.nix اضافه کرد.
{ vim-test = super.vim-test.overrideAttrs { # Vim plugin with a test lua file doCheck = false; }; }