LINUX.ORG.RU

Neovim 0.12

 , , ,


0

3

29 марта 2026 года состоялся релиз текстового редактора Neovim версии 0.12, а 6 апреля вышел корректирующий выпуск 0.12.1. Это один из крупнейших релизов за последнее время: закрыто более 340 задач, добавлены встроенный менеджер плагинов, HTTP-клиент, команда перезапуска, существенно расширен встроенный LSP-клиент и экспериментально переработана подсистема сообщений.

Несовместимые изменения:

Встроенный менеджер плагинов (vim.pack):

Добавлен экспериментальный встроенный менеджер плагинов vim.pack. Поддерживает lockfile для фиксации версий, офлайн-обновления, указание целевых версий, буфер подтверждения с навигацией по [[[/]] и code actions. Информация о VCS доступна через vim.pack.get. Прогресс операций отображается через nvim_echo с kind=progress. Интегрирован с checkhealth.

LSP:

Встроенный LSP-клиент получил масштабное обновление:

Команда :restart и :detach:

Новая команда :restart перезапускает Nvim и переподключает текущий UI. Поддержка :detach и :restart на Windows. Обе работают на всех платформах.

Сеть (vim.net):

Добавлен встроенный HTTP-клиент vim.net.request и :edit url. Вариант vim.net.request с аргументом outbuf записывает ответ сервера непосредственно в указанный буфер.

UI и сообщения:

Lua API:

Диагностика:

Treesitter:

Прочие изменения:

Neovim 0.12.1:

Корректирующий выпуск от 6 апреля 2026 с 26 исправлениями ошибок и одной новой возможностью — :restart переподключает все UI. Среди важных исправлений:

>>> Релиз Neovim 0.12.0

>>> Релиз Neovim 0.12.1

>>> Changelog 0.12.0

>>> Changelog 0.12.1

>>> Документация news-0.12

>>> Список релизов

★★

Проверено: CrX ()
Последнее исправление: CrX (всего исправлений: 2)

Перехал на nvim из vim, ощутил повышенную автоматизацию и хипстеровость. Всё в духе времени, всё тянется само с гитхабов, красиво анимированно палки крутятся, апдейты мутятся. Буквально каталог .lua конфигов на другой ноут скопировал, оно поняло что плагинов нужных не установлено и на гитхаб само сходило. Lua вместо vimscript - успеховое явление. LSP + clangd радует - походы по символам в С++ коде работают, не ясно зачем CLion нужен теперь. И число LSP-серверов под дикое число языков уже есть, включая всё модное типа TypeScript конечно. Изначально на vim из CLion переезжал ради невозможности «блокнотика» задуматься на несколько секунд по какому-то своего JVM-поводу, так и остался. Хорошие сапоги, надо брать. С чем пока не смог разобраться - хочу «табы» (ну да, это не так называется, ну по которым через gt gT ходишь) чтобы умели не сверху горизонтально рисоваться, а ограниченной ширины в колонку слева. Есть всякие там плагины для рисования дерева каталога слева, но не то, хочу те же табы прямо в столбик.

lesopilorama
()
Ответ на: комментарий от lesopilorama

С чем пока не смог разобраться - хочу «табы» (ну да, это не так называется, ну по которым через gt gT ходишь) чтобы умели не сверху горизонтально рисоваться, а ограниченной ширины в колонку слева

проблема в том что в условиях текстового интерфейса размер шрифта выборочно не уменьшить, поэтому такие табы будут либо занимать слишком много места, либо показывать что-то типа «a…».

В neovim для подобного обычно делают всплывающее окно со списком того из чего нужно выбрать, в данном случае со списком открытых буферов. Посмотри на плагины типа telescope или snacks.picker, они как раз этим занимаются. С fuzzy-поиском, превью и т.д.

Lrrr ★★★★★
()

Вот вы все возмущаетесь монструозности systemd, а есть ли какая-то книжка обучению Neovim? Не больше 2000 страниц.

У Джетбрейнса ченджлоги меньше.

MoldAndLimeHoney ★★★
()

Как сделать, чтобы текст при выделении мышкой помещался в буфер обмена? В частности, если выделение производилось двойным нажатием в режиме редактирования.

После вот этих заклинаний оно начинает копировать выделенный текст, но только если выделять не двойным нажатием, а методом нажал-провел-отпустил:

vmap <LeftRelease> "*ygv
vmap <2-LeftRelease> "*ygv
vmap <3-LeftRelease> "*ygv

Привык копировать посредством выделения в gvim и в эмуляторах терминала, а в nvim оно работает, жутко неудобно.

Manhunt ★★★★★
()
Последнее исправление: Manhunt (всего исправлений: 6)
Ответ на: комментарий от MoldAndLimeHoney

нет. Фишка в том что это все нужно писателям плагинов, а не конечным пользователям.

Конечные пользователи могут поставить себе какой-нибудь популярный активно поддерживаемый набор плагинов типа https://nvchad.com/, и радоваться жизни.

Lrrr ★★★★★
()
Ответ на: комментарий от Lrrr

Конечные пользователи могут поставить себе какой-нибудь популярный активно поддерживаемый набор плагинов типа https://nvchad.com/, и радоваться жизни.

Можно вообще ничего не ставить, и получить чистый неотличимый vim experience.

Да и для написания конфигураций/плагинов не нужно изучать всё в деталях. Я свою первую конфигурацию для neovim написал вообще ещё не зная Lua.

Chiffchaff
()
Ответ на: комментарий от Manhunt

Ответ на вопрос не знаю. Но ведь выделять с клавиатуры в vim редакторах намного удобнее, потому что не нужно точно позиционироваться мышкой, с клавиатуры можно быстро и точно определить начало и конец выделения, в отличие от любых других редакторв.

Chiffchaff
()
Ответ на: комментарий от Manhunt

если выделять не двойным нажатием, а методом нажал-провел-отпустил

Мышь? В виме? Месье знает толк!

Gukl ★★★
()
Ответ на: комментарий от Manhunt

В общем, раскопал, вот такое заклинание надо:

vim.opt.mouse = 'a'
vim.keymap.set('v', '<LeftRelease>', '"*ygv')
vim.keymap.set('v', '<2-LeftRelease>', '"*ygv')
vim.keymap.set('i', '<2-LeftRelease>', '<c-o>"*y<c-o>gv')
vim.keymap.set('v', '<3-LeftRelease>', '"*ygv')

Manhunt ★★★★★
()

Господа, хочется выяснить кто как обычно ставит neovim? Если сделать sudo apt install neovim в обычной убунте 22.04, то подвозят устаревший хлам, на котором не работают никакие современные плагины. Потом можно догадаться добавить какие-то stable-репозитарии, но подвозят всё равно что-то древнее - 0.8 вместо 0.6, но от этого не легче. Потом можно начать скачивать AppImage или tar.gz с гитхаба, но это как-то странновато. Хочу попробовать из исходников начать компилять, кто думает про это хорошо?

lesopilorama
()
Ответ на: комментарий от lesopilorama

tar.gz с гитхаба

плагины ж всё равно с гитхаба насасываются в слабоконторируемой манере

потом будут такие же истории с массовыми заражениями, как и с остальными работающими по такому же принципу онлайн-помойками - pip, npm, и тд

Manhunt ★★★★★
()
Последнее исправление: Manhunt (всего исправлений: 3)

чуваки вапще ребята!
всех причастных поздравляю, большой апдейт большим человекам, ура!

olelookoe ★★★★
()
Ответ на: комментарий от lesopilorama

Полчаса пытался скомпилять neovim на убунте 22.04, устал, надоело. Чёткого мануала по сборке под дебианом, тащемта, нет в природе. С этими версиями LUA только выноса мозга одного дофига, но этого всё равно мало.

/home/bulka/src/neovim/src/nvim/lua/treesitter.c:1257:12: error: incompatible types when assigning to type ‘TSNode’ from type ‘int’
/home/bulka/src/neovim/src/nvim/lua/treesitter.c: In function ‘node_child_with_descendant’:
/home/bulka/src/neovim/src/nvim/lua/treesitter.c:1268:18: error: invalid initializer
 1268 |   TSNode child = ts_node_child_with_descendant(node, descendant);

lesopilorama
()
Ответ на: комментарий от lesopilorama

вселенная шлёт тебе знак — не мучайся, ставь емакс!

err
()
Ответ на: комментарий от Manhunt

s/слабоконторируемой/слабоконтролируемой/

Manhunt ★★★★★
()
Ответ на: комментарий от lesopilorama

Искуственный идиот говорит, что это появилось в vim 9.1

Не знаю, как там neovim.

dyonya
()
Ответ на: комментарий от lesopilorama

С этими версиями LUA только выноса мозга одного дофига, но этого всё равно мало.

neovim поддерживает только LuaJIT.

как собирать под бубунтой, можешь посмотреть у них на CI: https://github.com/neovim/neovim/blob/master/.github/workflows/build.yml

под арчем - в репах арча https://gitlab.archlinux.org/archlinux/packaging/packages/neovim/-/blob/main/PKGBUILD?ref_type=heads

и т.д.

Lrrr ★★★★★
()

ШТОШ, господа, хочу поделиться для новичков минимальным сетапом для использования neovim как IDE для C++, TypeScript и наверное чего-то ещё, возможно будет жрать и другие ЯП по необъяснимой причине.

  1. nvim скачать проще всего так: https://github.com/neovim/neovim/blob/master/INSTALL.md#pre-built-archives-2
curl -LO https://github.com/neovim/neovim/releases/latest/download/nvim-linux-x86_64.tar.gz
sudo rm -rf /opt/nvim-linux-x86_64
sudo tar -C /opt -xzf nvim-linux-x86_64.tar.gz

и далее

export PATH="$PATH:/opt/nvim-linux-x86_64/bin"
  1. Далее выкидываем всё содержимое ./config/nvim/*
rm -rf ~/.config/nvim/*

и кладём туда мой конфиг:

vim.cmd([[colorscheme likeclion]])
vim.opt.tabstop=2
vim.opt.shiftwidth=2
vim.opt.expandtab=true
vim.opt.wrap=false
vim.opt.number = true
vim.opt.clipboard = "unnamedplus"


local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
if not vim.uv.fs_stat(lazypath) then
  vim.fn.system({
    "git", "clone", "--filter=blob:none",
    "https://github.com/folke/lazy.nvim.git",
    "--branch=stable", lazypath,
  })
end
vim.opt.rtp:prepend(lazypath)

-- Нативная LSP-конфигурация (без nvim-lspconfig)
vim.lsp.config('lua_ls', {
  settings = {
    Lua = {
      diagnostics = { globals = { 'vim' } },
    },
  },
})
vim.lsp.enable('lua_ls')


-- ───────────────────────────────────────────────────────────
-- C/C++ (clangd)
-- ───────────────────────────────────────────────────────────
vim.lsp.config('clangd', {
  cmd = {
    'clangd',
    '--background-index',        -- индексация в фоне
    '--clang-tidy',              -- встроенный линтер
    '--header-insertion=iwyu',   -- автоподстановка #include
    '--completion-style=detailed',
    '--fallback-style=llvm',
  },
  filetypes = { 'c', 'cpp', 'objc', 'objcpp', 'cuda', 'proto' },
  root_markers = {               -- как определить корень проекта
    'compile_commands.json',     -- ← самый важный файл!
    'compile_flags.txt',
    '.clangd',
    '.clang-tidy',
    '.clang-format',
    'CMakeLists.txt',
    '.git',
  },
})
vim.lsp.enable('clangd)



require("lazy").setup({
  -- Mason — установщик LSP-серверов
  {
    "williamboman/mason.nvim",
    build = ":MasonUpdate",
    config = function()
      require("mason").setup()
    end,
  },

  -- Treesitter — только установка парсеров
  {
    "nvim-treesitter/nvim-treesitter",
    build = ":TSUpdate",
    config = function()
      require("nvim-treesitter").setup({
        ensure_installed = {
          "c", "lua", "vim", "vimdoc", "query",
          "elixir", "heex", "javascript", "html",
        },
      })
    end,
  },
})

--[[
local function setup_lsp_keymaps(bufnr)
  local opts = { buffer = bufnr, noremap = true, silent = true }
  
  vim.keymap.set('n', 'gd', vim.lsp.buf.declaration, vim.tbl_extend('keep', opts, { desc = 'LSP: Declaration' }))
  vim.keymap.set('n', 'gD', vim.lsp.buf.definition, vim.tbl_extend('keep', opts, { desc = 'LSP: Definition' }))
  vim.keymap.set('n', 'gr', vim.lsp.buf.references, vim.tbl_extend('keep', opts, { desc = 'LSP: References' }))
  vim.keymap.set('n', 'gi', vim.lsp.buf.implementation, vim.tbl_extend('keep', opts, { desc = 'LSP: Implementation' }))
  vim.keymap.set('n', 'K', vim.lsp.buf.hover, vim.tbl_extend('keep', opts, { desc = 'LSP: Hover' }))
  vim.keymap.set('n', '<leader>rn', vim.lsp.buf.rename, vim.tbl_extend('keep', opts, { desc = 'LSP: Rename' }))
  vim.keymap.set('n', '<leader>ca', vim.lsp.buf.code_action, vim.tbl_extend('keep', opts, { desc = 'LSP: Code action' }))
end

-- Вызывайте при attach LSP сервера
vim.api.nvim_create_autocmd('LspAttach', {
  callback = function(args)
    local client = vim.lsp.get_client_by_id(args.data.client_id)
    if client then
      setup_lsp_keymaps(args.buf)
    end
  end
})
]]

local function setup_lsp_keymaps(bufnr)
  local function map(keys, fn, desc)
    vim.keymap.set('n', keys, fn, { buffer = bufnr, noremap = true, silent = true, desc = desc })
  end

  map('gd', vim.lsp.buf.definition,     'LSP: Definition')      -- перейти к определению
  map('gD', vim.lsp.buf.declaration,     'LSP: Declaration')     -- перейти к объявлению
  map('gr', vim.lsp.buf.references,      'LSP: References')      -- все использования
  map('gi', vim.lsp.buf.implementation,  'LSP: Implementation')  -- реализации
  map('tt', vim.lsp.buf.type_definition, 'LSP: Type definition') -- ← новое: перейти к типу
  map('K',  vim.lsp.buf.hover,           'LSP: Hover')
  map('<leader>rn', vim.lsp.buf.rename,      'LSP: Rename')
  map('<leader>ca', vim.lsp.buf.code_action, 'LSP: Code action')

  -- ── Переключение header ↔ source (специфично для clangd) ──
  map('hh', function()
    local params = { uri = vim.uri_from_bufnr(bufnr) }
    vim.lsp.buf_request(bufnr, 'textDocument/switchSourceHeader', params, function(err, uri)
      if uri then vim.cmd.edit(vim.uri_to_fname(uri)) end
    end)
  end, 'Clangd: Switch header/source')
end

vim.api.nvim_create_autocmd('LspAttach', {
  callback = function(args)
    local client = vim.lsp.get_client_by_id(args.data.client_id)
    if client then
      setup_lsp_keymaps(args.buf)
    end
  end,
})

  1. Далее надо позапускать :Lazy и :MasonInstall cland и ещё что-то вокруг: короче, позапускать :Lazy и позапускать :Mason - будут появляться красивые окошечки, в них потыкать I, U, чтобы плагины насосались с github и посетапились. Потом выйти-зайти наверное.

  2. У меня в init.lua упомянуто vim.cmd([[colorscheme likeclion]]) – выкиньте это или возьмите мою цветосхему: https://disk.yandex.ru/d/3B_VKwU7AXr6ug и положите в ~/.config/nvim/likeclion.vim

lesopilorama
()
Ответ на: комментарий от lesopilorama

для подобных минимальных сетапов lazy.nvim не нужен, в neovim добавили встроенный установщик плагинов. https://neovim.io/doc/user/pack/

Lrrr ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.