{"id":402694,"date":"2024-06-29T16:40:17","date_gmt":"2024-06-29T16:40:17","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=402694"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=402694","title":{"rendered":"<span>\u0427\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u0442\u044c Neovim \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443 \u043d\u0430 Scala?<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/webt\/d9\/ib\/2l\/d9ib2lgvsmj9dgvca-beoghsxde.jpeg\" alt=\"image\" data-src=\"https:\/\/habrastorage.org\/webt\/d9\/ib\/2l\/d9ib2lgvsmj9dgvca-beoghsxde.jpeg\" data-blurred=\"true\"\/><\/p>\n<p>  <\/p>\n<p>\u0412 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0435 \u0444\u0430\u043d\u0430\u0442\u043e\u0432 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 Neovim \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e \u0437\u043d\u0430\u043c\u0435\u043d\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u2014 <a href=\"https:\/\/habr.com\/ru\/post\/569550\/\">\u0432\u044b\u0448\u043b\u0430 \u0432\u0435\u0440\u0441\u0438\u044f 0.5<\/a>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043d\u043e\u0432\u043e\u0432\u0432\u0435\u0434\u0435\u043d\u0438\u0439:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u044f\u0437\u044b\u043a\u0430 Lua; <\/li>\n<li>\u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 treesitter;<\/li>\n<li>\u0438, \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 LSP \u043a\u043b\u0438\u0435\u043d\u0442, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u0437 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 \u0434\u043e\u0441\u0442\u043e\u0439\u043d\u043e\u0433\u043e \u0441\u043e\u043f\u0435\u0440\u043d\u0438\u043a\u0430 IDE!<\/li>\n<\/ul>\n<p>  <\/p>\n<p>Neovim \u2014 \u044d\u0442\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440, \u0444\u043e\u0440\u043a \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 Vim, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0442\u0430\u0432\u0438\u0442 \u0441\u0432\u043e\u0435\u0439 \u0446\u0435\u043b\u044c\u044e \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u043e\u043f\u044b\u0442\u0430 \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 Vim: \u00abNeovim is built for users who want the good parts of Vim, and more\u00bb.<\/p>\n<p>  <\/p>\n<p>\u041c\u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f Neovim \u0441\u0432\u043e\u0435\u0439 \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u044c\u044e, \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u0432 \u043e\u0447\u0435\u043d\u044c \u043c\u043e\u0449\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u043a\u0441\u0442\u0430, \u043d\u043e \u0438 \u043a\u043e\u0434\u0430. \u041a\u0430\u043a scala-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443 \u043c\u043d\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u0438\u0441\u043f\u044b\u0442\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 LSP \u043a\u043b\u0438\u0435\u043d\u0442 \u0432 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u043a \u043b\u044e\u0431\u0438\u043c\u043e\u043c\u0443 \u044f\u0437\u044b\u043a\u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 VSCode \u0438 \u0434\u0430\u0436\u0435 Vim + CoC \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 LSP \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0432 Neovim \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u0430\u044f, \u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043a\u0440\u0430\u0439\u043d\u0435 \u0433\u0438\u0431\u043a\u0430\u044f. \u0414\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u2014 \u043a\u0440\u0430\u0442\u043a\u043e\u0435 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043f\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 Neovim \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u043e Scala \u0438 \u043a\u0440\u0430\u0442\u043a\u0438\u0439 \u043e\u0431\u0437\u043e\u0440 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0430\u0435\u0442 \u0441\u0432\u044f\u0437\u043a\u0430 Neovim + Metals.<\/p>\n<p><a name=\"habracut\"><\/a>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0432 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044f\u0445<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<p>file: <code>src\/main\/scala\/example\/Animals.scala<\/code> <\/p>\n<p>  <\/p>\n<pre><code class=\"scala\">package example  trait Animals {   def say(): String }  case object Cat extends Animals {   def say(): String = \"meow\" }  case object Dog extends Animals {   def say(): String = \"woof\" }<\/code><\/pre>\n<p>  <\/p>\n<p>file: <code>src\/test\/scala\/example\/AnimalsTest.scala<\/code><\/p>\n<p>  <\/p>\n<pre><code class=\"scala\">package example  class AnimalsTest extends org.scalatest.funsuite.AnyFunSuite {   test(\"what does a cat say?\") {     assert(Cat.say() == \"meow\")   }   test(\"what does a dog say?\") {     assert(Dog.say() == \"woof\")   } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0435\u043c\u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 \u0432 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044f\u0445: <a href=\"https:\/\/github.com\/sonph\/onehalf\">onehalf<\/a>.<\/p>\n<\/div><\/div>\n<p>  <\/p>\n<h2 id=\"chto-takoe-lsp\">\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 LSP?<\/h2>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/bu\/yw\/tw\/buywtwuuvl_cqhuj2kffwuentqk.png\" data-src=\"https:\/\/habrastorage.org\/webt\/bu\/yw\/tw\/buywtwuuvl_cqhuj2kffwuentqk.png\"\/>  <\/p>\n<p>\u041f\u0440\u0435\u0436\u0434\u0435 \u0432\u0441\u0435\u0433\u043e, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c\u0441\u044f \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 LSP \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e \u0435\u0433\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0441\u0442\u043e\u043b\u044c \u043f\u0440\u0438\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043b\u044f Neovim. LSP, \u0438\u043b\u0438 Language Server Protocol, \u0441\u043e\u0437\u0434\u0430\u043d Microsoft \u0434\u043b\u044f \u0443\u043d\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043e\u043f\u044b\u0442\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u0440\u0430\u0437\u043d\u044b\u0445 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430\u0445. \u042d\u0442\u043e \u043c\u043e\u0441\u0442 \u043c\u0435\u0436\u0434\u0443 \u044f\u0437\u044b\u043a\u0430\u043c\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430\u043c\u0438 \u0442\u0435\u043a\u0441\u0442\u0430. \u041e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043d\u0430\u0434 \u043a\u043e\u0434\u043e\u043c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u0437\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0442\u0430\u043a \u043b\u044e\u0431\u0438\u043c \u0441\u0440\u0435\u0434\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438:<\/p>\n<p>  <\/p>\n<ul>\n<li>go-to-definition;<\/li>\n<li>find-references;<\/li>\n<li>hover;<\/li>\n<li>completion;<\/li>\n<li>rename;<\/li>\n<li>format;<\/li>\n<li>refactor.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0438 \u0432\u0441\u0451 \u044d\u0442\u043e \u0432 \u043b\u044e\u0431\u0438\u043c\u043e\u043c \u0432\u0430\u043c\u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435!<\/p>\n<p>  <\/p>\n<p>LSP \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0434\u0432\u0443\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432: \u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0434\u043b\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430, \u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043c\u0435\u0435\u0442 \u043a\u043e\u043c\u043c\u0443\u043d\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, LSP \u0440\u0435\u0448\u0430\u0435\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u0443\u044e \u0441 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u043d\u043e\u0432\u044b\u0445 \u044f\u0437\u044b\u043a\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u043e\u0432 \u043a\u043e\u0434\u0430. \u0412\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0441\u043d\u043e\u0432\u0430 \u0438 \u0441\u043d\u043e\u0432\u0430, \u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435 \u0437\u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u043e\u043c \u0442\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u0438 \u0441\u0438\u043b\u044b \u043d\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430, \u0442\u0435\u043f\u0435\u0440\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043b\u0438\u0435\u043d\u0442 \u043a LSP \u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435 \u0438 \u0441\u0435\u0440\u0432\u0435\u0440 LSP \u0434\u043b\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f! <\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/zv\/o_\/qq\/zvo_qq0ryn0vgdufqoctrk9eiji.png\" vspace=\"20\" data-src=\"https:\/\/habrastorage.org\/webt\/zv\/o_\/qq\/zvo_qq0ryn0vgdufqoctrk9eiji.png\"\/>  <\/p>\n<p>  <\/p>\n<p>  <\/p>\n<h2 id=\"podgotavlivaem-okruzhenie\">\u041f\u043e\u0434\u0433\u043e\u0442\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435<\/h2>\n<p>  <\/p>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 LSP \u0434\u043b\u044f Scala \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f Metals. Metals \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b, \u043d\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433 \u0438\u043b\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f, \u043e\u043d \u0434\u0435\u043b\u0435\u0433\u0438\u0440\u0443\u0435\u0442 \u0434\u0440\u0443\u0433\u0438\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u043c. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, Metals \u043d\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0441\u0431\u043e\u0440\u043a\u043e\u0439 \u0438\u043b\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u044d\u0442\u0438 \u0437\u0430\u0434\u0430\u0447\u0438 \u0434\u0435\u043b\u0435\u0433\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u0441\u0435\u0440\u0432\u0435\u0440\u0443, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0435\u043c\u0443 BSP (Build Server Protocol). \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 BSP \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u0442\u044c <code>bloop<\/code> \u0438, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0432\u0435\u0440\u0441\u0438\u0438 1.4, <code>sbt<\/code>. \u041e\u0431\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 <code>scalac<\/code> \u0434\u043b\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f scala-\u0444\u0430\u0439\u043b\u043e\u0432 \u0432 \u0431\u0430\u0439\u0442 \u043a\u043e\u0434 JVM, \u0438\/\u0438\u043b\u0438 <code>scalajs<\/code> \u0434\u043b\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432 JavaScript. <\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/lh\/kj\/zr\/lhkjzrgbbb5_yjg1sa_sz24rico.png\" vspace=\"20\" data-src=\"https:\/\/habrastorage.org\/webt\/lh\/kj\/zr\/lhkjzrgbbb5_yjg1sa_sz24rico.png\"\/>  <\/p>\n<p>\u0414\u043b\u044f \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b Metals \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c:<\/p>\n<p>  <\/p>\n<ul>\n<li><code>JVM<\/code> \u2014 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0438 scala-\u043a\u043e\u0434\u0430;<\/li>\n<li><code>scalac<\/code> \u2014 \u0434\u043b\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f scala-\u0444\u0430\u0439\u043b\u043e\u0432;<\/li>\n<li><code>bloop<\/code> \u2014 \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0431\u043e\u0440\u043a\u043e\u0439 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u043e\u043c scala-\u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432;<\/li>\n<li><code>sbt<\/code> (\u0438\u043b\u0438 \u043b\u044e\u0431\u0443\u044e \u0434\u0440\u0443\u0433\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0441\u0431\u043e\u0440\u043a\u0438, \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u0443\u044e \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0434\u043b\u044f bloop) \u2014 \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438 \u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0434\u043b\u044f bloop;<\/li>\n<li><code>scalafmt<\/code> \u2014 \u0434\u043b\u044f \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430;<\/li>\n<li><code>scalafix<\/code> \u2014 \u0434\u043b\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u043c\u043f\u043e\u0440\u0442\u0430 \u0438 \u043f\u0440\u043e\u0447\u0435\u0433\u043e \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433\u0430;<\/li>\n<li><code>metals<\/code> \u2014 \u043a\u0430\u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0441\u0435\u0440\u0432\u0435\u0440\u0430 LSP \u0434\u043b\u044f \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u043f\u043e \u043a\u043e\u0434\u0443, \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433\u0430, \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u0438 \u043f\u0440\u043e\u0447.;<\/li>\n<li><code>neovim<\/code> \u2014 \u043a\u0430\u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043a\u043b\u0438\u0435\u043d\u0442\u0430 LSP \u0434\u043b\u044f \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0421\u043f\u0438\u0441\u043e\u043a \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u0435\u043b\u0438\u043a, \u043d\u043e, \u043a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438 \u0432 Scala \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043a\u0440\u0430\u0439\u043d\u0435 \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442: coursier. \u041e\u043d \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0431\u0435\u0440\u0435\u0442 \u043d\u0430 \u0441\u0435\u0431\u044f \u0437\u0430\u0434\u0430\u0447\u0443 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c\u0438, \u043d\u043e \u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0435\u043d \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0432\u0441\u0435\u0445 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u043e scala-\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432:<\/p>\n<p>  <\/p>\n<blockquote><p>coursier is a dependency resolver \/ fetcher \u00e0 la Maven \/ Ivy, entirely rewritten from scratch in Scala. It aims at being fast and easy to embed in other contexts. Its core embraces functional programming principles.<\/p><\/blockquote>\n<p>Coursier \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043a\u0440\u0438\u043f\u0442\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\"># \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 $ curl -fLo cs https:\/\/git.io\/coursier-cli-\"$(uname | tr LD ld)\" # \u0434\u0435\u043b\u0430\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u043c $ chmod +x cs<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0435 \u043d\u0430\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 <code>.\/cs install<\/code>. \u0418 \u043f\u0435\u0440\u0432\u043e\u0435, \u0447\u0442\u043e \u043d\u0430\u043c \u0441\u0442\u043e\u0438\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c, \u2014 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0441\u0430\u043c coursier:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\"># \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c coursier \u0447\u0435\u0440\u0435\u0437 coursier $ .\/cs install cs # \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u0441\u043a\u0430\u0447\u0430\u043d\u043d\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 $ rm .\/cs<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0447\u0438\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 coursier \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u043d\u0430 \u0441\u0430\u0439\u0442\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430.<\/p>\n<p>  <\/p>\n<p>\u0425\u043e\u0440\u043e\u0448\u0430\u044f \u043d\u043e\u0432\u043e\u0441\u0442\u044c \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e coursier \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043c\u043e\u0447\u044c \u0441 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u043e\u0439 \u0432\u0441\u0435\u0445 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u043d\u0430\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0441\u043e Scala. \u041e\u0442\u043b\u0438\u0447\u043d\u0430\u044f \u043d\u043e\u0432\u043e\u0441\u0442\u044c \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u0441\u0435\u0433\u043e \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439!<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">$ cs setup --yes<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 coursier \u0443\u0441\u043b\u0443\u0436\u043b\u0438\u0432\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442 \u0434\u043b\u044f \u043d\u0430\u0441:<\/p>\n<p>  <\/p>\n<ul>\n<li><code>ammonite<\/code>;<\/li>\n<li><code>coursier<\/code>;<\/li>\n<li><code>scala<\/code>;<\/li>\n<li><code>scalac<\/code>;<\/li>\n<li><code>sbt<\/code>;<\/li>\n<li><code>sbtn<\/code>;<\/li>\n<li><code>scalafmt<\/code>.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041f\u043e\u0447\u0442\u0438 \u043f\u043e\u043b\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440. \u041e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c bloop \u0438 scalafix:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">$ cs install scalafix bloop<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418, \u043d\u0430\u043a\u043e\u043d\u0435\u0446, Neovim \u0438 Metals.<\/p>\n<p>  <\/p>\n<h2 id=\"ustanavlivaem-i-nastraivaem-neovim\">\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0438 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c Neovim<\/h2>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/j4\/jj\/gw\/j4jjgwnn9tp3vhmvkq37nkhxuq0.png\" align=\"left\" hspace=\"20\" width=\"150\" data-src=\"https:\/\/habrastorage.org\/webt\/j4\/jj\/gw\/j4jjgwnn9tp3vhmvkq37nkhxuq0.png\"\/>  <\/p>\n<p>\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 Neovim \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0432\u0430\u0448\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0438 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u043d \u0437\u0434\u0435\u0441\u044c: <a href=\"https:\/\/github.com\/neovim\/neovim\/wiki\/Installing-Neovim\">Installing-Neovim<\/a>. <\/p>\n<p>  <\/p>\n<p>\u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 Lua, \u0430\u0432\u0442\u043e\u0440\u044b \u0443\u0432\u0435\u0440\u044f\u044e\u0442, \u0447\u0442\u043e \u043d\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u043e\u0442\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u0442 VimL. \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0431\u0443\u0434\u0443 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Lua. \u0415\u0441\u0442\u044c \u043e\u0442\u043b\u0438\u0447\u043d\u043e\u0435 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e, \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0449\u0435\u0435 \u043d\u0430\u0447\u0430\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Lua \u0432 Neovim: <a href=\"https:\/\/github.com\/nanotee\/nvim-lua-guide\">Getting started using Lua in Neovim<\/a>. \u0414\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u0438\u0439: <a href=\"https:\/\/github.com\/kuator\/nvim-lua-guide-ru\">\u041d\u0430\u0447\u0430\u043b\u043e \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Lua \u0432 Neovim <\/a>.<\/p>\n<p>  <\/p>\n<p>\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043d\u0430 Lua \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0444\u0430\u0439\u043b\u0435 <code>~\/.config\/nvim\/init.lua<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\"># \u0415\u0441\u043b\u0438 \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 nvim, \u0432 \u043f\u043e\u0434\u0432\u0430\u043b\u0435 \u0435\u0433\u043e \u043e\u043a\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u043f\u0435\u0447\u0430\u0442\u0430\u043d\u043e Hello World!  # \u0437\u043d\u0430\u0447\u0438\u0442 \u0432\u0441\u0451 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0430\u0442\u044c \u043a \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 nvim $ mkdir -p ~\/.config\/nvim\/ &amp;&amp; echo 'print(\"Hello world!\")' >> ~\/.config\/nvim\/init.lua<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0430 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 <a href=\"https:\/\/github.com\/wbthomason\/packer.nvim\">Packer<\/a> \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u043f\u0446\u0438\u0439:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">git clone https:\/\/github.com\/wbthomason\/packer.nvim\\  ~\/.local\/share\/nvim\/site\/pack\/packer\/start\/packer.nvim<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"lua\">---------------------------------- -- file:  ~\/.config\/nvim\/init.lua ----------------------------------  -- \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u043c\u044b\u0448\u044c\u044e vim.opt_global.mouse = 'a'  -- \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0443 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 vim.opt_global.syntax = 'on'  -- \u0434\u0435\u043b\u0430\u0435\u043c \u0446\u0432\u0435\u0442\u043e\u0432\u0443\u044e \u043f\u0430\u043b\u0438\u0442\u0440\u0443 \u0431\u043e\u0433\u0430\u0447\u0435 -- (\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0435 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u043e\u0432, \u0435\u0441\u043b\u0438  -- \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c \u0446\u0432\u0435\u0442\u0430, \u0443\u0434\u0430\u043b\u0438\u0442\u0435 -- \u044d\u0442\u0443 \u043e\u043f\u0446\u0438\u044e) vim.opt_global.termguicolors = true  -- \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c 2 \u043f\u0440\u043e\u0431\u0435\u043b\u0430 \u0432\u043c\u0435\u0441\u0442\u043e \u0442\u0430\u0431\u0443\u043b\u044f\u0446\u0438\u0438 vim.opt_global.tabstop = 2 vim.opt_global.softtabstop = 2 vim.opt_global.shiftwidth = 2  -- \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043c\u0435\u043d\u0435\u0434\u0436\u043c\u0435\u043d\u0442 \u043f\u043b\u0430\u0433\u0438\u043d\u0430\u043c\u0438 vim.cmd('packadd packer.nvim') require('packer').startup(function(use)   -- \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c packer, \u0447\u0442\u043e\u0431\u044b \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c packer   use { 'wbthomason\/packer.nvim', opt = true }   -- \u043d\u043e\u0432\u044b\u0435 \u043f\u043b\u0430\u0433\u0438\u043d\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u044e\u0434\u0430:   -- ... end)<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u044b\u0445 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u0445 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 <code>:PackerInstall<\/code>.<\/p>\n<p>  <\/p>\n<h2 id=\"ustanavlivaem-metals\">\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c Metals<\/h2>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/gj\/n2\/t8\/gjn2t87aqzrtgcnpwt2c0pr0b4c.png\" align=\"left\" data-src=\"https:\/\/habrastorage.org\/webt\/gj\/n2\/t8\/gjn2t87aqzrtgcnpwt2c0pr0b4c.png\"\/>  <\/p>\n<p>\u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u043c \u043a LSP \u0434\u043b\u044f Scala \u0432\u0441\u0451 \u0435\u0449\u0451 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u043b\u0430\u0433\u0438\u043d \u043a <a href=\"https:\/\/github.com\/scalameta\/coc-metals\">CoC<\/a> \u0432\u043e \u043c\u043d\u043e\u0433\u043e\u043c \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c. \u041d\u043e \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 Metals \u0434\u043b\u044f \u043d\u043e\u0432\u043e\u0433\u043e, \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e LSP \u043a\u043b\u0438\u0435\u043d\u0442\u0430. \u0423 \u0434\u0432\u0443\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u0432\u0437\u0433\u043b\u044f\u0434 \u043d\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e. \u0415\u0441\u043b\u0438 CoC \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u0430\u043a\u043e\u043d\u0447\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0441 \u0430\u0432\u0442\u043e\u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435\u043c \u0438 \u043f\u0440\u043e\u0447\u0438\u043c\u0438 \u043f\u0440\u0438\u044f\u0442\u043d\u044b\u043c\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c\u0438, \u0442\u043e LSP \u043a\u043b\u0438\u0435\u043d\u0442 \u0432 Neovim \u2014 \u044d\u0442\u043e \u043f\u0440\u0435\u0436\u0434\u0435 \u0432\u0441\u0435\u0433\u043e api. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e LSP \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u0441\u043b\u043e\u0436\u043d\u0435\u0435, \u043d\u043e \u0432 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0441\u0447\u0435\u0442\u0435 \u044d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0434\u043e\u0441\u0442\u0438\u0447\u044c \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0434\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432. \u0415\u0441\u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u0443\u0437\u043d\u0430\u0442\u044c \u043e \u0440\u0430\u0437\u043d\u0438\u0446\u0435 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u0445 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e, \u0441\u043e\u0432\u0435\u0442\u0443\u044e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c: <\/p>\n<p>  <\/p>\n<div class=\"oembed\">\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/6106e0fada3d598f9a4a518f\" data-style=\"\" id=\"6106e0fada3d598f9a4a518f\" width=\"\"><\/div>\n<\/div>\n<p>  <\/p>\n<p>\u0412\u043e\u043e\u0431\u0449\u0435 \u0434\u043b\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043d\u043e\u0432\u043e\u0433\u043e LSP \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0432 neovim \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <a href=\"https:\/\/github.com\/neovim\/nvim-lspconfig\">nvim-lspconfig<\/a>, \u043d\u043e \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 co Scala \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0442\u0438\u0442\u0435\u043b\u044c\u043d\u0435\u0435 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u043c \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u043c <a href=\"https:\/\/github.com\/scalameta\/nvim-metals\">nvim-metals<\/a>, \u0442\u0430\u043a \u043a\u0430\u043a \u044d\u0442\u043e\u0442 \u043f\u043b\u0430\u0433\u0438\u043d \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u0435\u0434\u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a. \u041f\u0440\u0438\u043c\u0435\u0440 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Metals (\u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0439\u0442\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c <code>:PackerInstall<\/code> \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 <code>nvim-metals<\/code>):<\/p>\n<p>  <\/p>\n<pre><code class=\"lua\">---------------------------------- -- file:  ~\/.config\/nvim\/init.lua ---------------------------------- require('packer').startup(function(use)   -- ...   -- \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c metals   use { 'scalameta\/nvim-metals' } end)  -- \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430, \u0441\u043c README \u043f\u043b\u0430\u0433\u0438\u043d\u0430 vim.opt_global.shortmess:remove(\"F\"):append(\"c\")  -- metals_config - \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439 nvim-metals -- \u0431\u0443\u0434\u0435\u043c \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0435\u0451 \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e \u0438 \u043e\u0441\u043c\u044b\u0441\u043b\u0435\u043d\u043d\u043e metals_config = require('metals').bare_config  -- \u043f\u0440\u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 .scala \u0438\u043b\u0438 .sbt \u0431\u0443\u0434\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c\/\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u043a metals vim.cmd('augroup scalametals') vim.cmd('autocmd!') vim.cmd('autocmd FileType scala,sbt lua require(\"metals\").initialize_or_attach(metals_config)') vim.cmd('augroup end')<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0441 \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 metals \u0443\u0436\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043a\u0440\u0430\u0439\u043d\u0435 \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e \u0438\u0437-\u0437\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u0433\u043e\u0440\u044f\u0447\u0438\u0445 \u043a\u043b\u0430\u0432\u0438\u0448. \u041f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043a\u043b\u0430\u0432\u0438\u0448 \u043d\u0430 Lua \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0433\u0440\u043e\u043c\u043e\u0437\u0434\u043a\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0430\u0437\u0443\u043c\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0430\u0440\u0443 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439:<\/p>\n<p>  <\/p>\n<pre><code class=\"lua\">-- mode   - \u0440\u0435\u0436\u0438\u043c, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u044f: \"n\", \"i\", \"v\"... -- keys   - \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0435\u0439 \u043a\u043b\u0430\u0432\u0438\u0448: \"qq\" -- action - \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u043e\u0435 \u043f\u043e \u043d\u0430\u0436\u0430\u0442\u0438\u044e \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0438 keys: \"&lt;cmd>q&lt;cr>\" -- opts   - \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u043e\u043f\u0446\u0438\u044f\u043c\u0438, \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440: { expr = true } -- bufnr  - \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0431\u0443\u0444\u0435\u0440\u0430. \u0415\u0441\u043b\u0438 \u0443\u043a\u0430\u0437\u0430\u043d, \u043a\u043b\u0430\u0432\u0438\u0448\u0438 \u0431\u0443\u0434\u0443\u0442 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u044b  --          \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0431\u0443\u0444\u0435\u0440\u0430 local function map(mode, keys, action, opts, bufnr)   local options = { noremap = true } if opts then     options = vim.tbl_extend(\"force\", options, opts)   end   if bufnr then     vim.api.nvim_buf_set_keymap(bufnr, mode, keys, action, options)   else     vim.api.nvim_set_keymap(mode, keys, action, options)   end end -- \u0430\u043d\u0430\u043b\u043e\u0433 nnoremap local function nmap(keys, action, opts)   map('n', keys, action, opts) end -- \u0430\u043d\u0430\u043b\u043e\u0433 inoremap local function imap(keys, action, opts)   map('i', keys, action, opts) end<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0438 \u043a\u043b\u0430\u0432\u0438\u0448 \u2014 \u0432\u043e\u043f\u0440\u043e\u0441 \u0432\u043a\u0443\u0441\u0430, \u043d\u0438\u0436\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043f\u0440\u0438\u043c\u0435\u0440 \u043c\u043e\u0435\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438:<\/p>\n<p>  <\/p>\n<pre><code class=\"lua\">-- \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043a \u043c\u0435\u0441\u0442\u0443 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u043f\u043e\u0434 \u043a\u0443\u0440\u0441\u043e\u0440\u043e\u043c: nmap(\"gd\", \"&lt;cmd>lua vim.lsp.buf.definition()&lt;CR>\") -- \u043f\u043e\u0438\u0441\u043a \u043c\u0435\u0441\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u043f\u043e\u0434 \u043a\u0443\u0440\u0441\u043e\u0440\u043e\u043c: nmap(\"gi\", \"&lt;cmd>lua vim.lsp.buf.implementation()&lt;CR>\") -- \u043f\u043e\u0438\u0441\u043a \u043c\u0435\u0441\u0442, \u0433\u0434\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u0438\u043c\u0432\u043e\u043b \u043f\u043e\u0434 \u043a\u0443\u0440\u0441\u043e\u0440\u043e\u043c: nmap(\"gr\", \"&lt;cmd>lua vim.lsp.buf.references()&lt;CR>\") -- \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u043f\u043e\u0434 \u043a\u0443\u0440\u0441\u043e\u0440\u043e\u043c: nmap(\"K\", \"&lt;cmd>lua vim.lsp.buf.hover()&lt;CR>\") -- \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0443 \u043c\u0435\u0442\u043e\u0434\u0430: nmap(\"&lt;c-k>\", \"&lt;cmd>lua vim.lsp.buf.signature_help()&lt;CR>\") imap(\"&lt;c-k>\", \"&lt;cmd>lua vim.lsp.buf.signature_help()&lt;CR>\") -- \u043e\u0442\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0431\u0443\u0444\u0435\u0440: nmap(\"&lt;leader>f\", \"&lt;cmd>lua vim.lsp.buf.formatting()&lt;CR>\") -- \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0441\u0438\u043c\u0432\u043e\u043b \u043f\u043e\u0434 \u043a\u0443\u0440\u0441\u043e\u0440\u043e\u043c: nmap(\"&lt;space>rn\", \"&lt;cmd>lua vim.lsp.buf.rename()&lt;CR>\") -- \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0432\u0441\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 -- (\u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0439 \u0438\u043c\u043f\u043e\u0440\u0442, \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u044e\u0449\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0438 \u0442\u0434): nmap(\"&lt;space>ca\", \"&lt;cmd>lua vim.lsp.buf.code_action()&lt;CR>\") -- \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u043c\u0435\u0441\u0442\u0443 \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439 \u043f\u0435\u0440\u0435\u0434 \u043a\u0443\u0440\u0441\u043e\u0440\u043e\u043c: nmap(\"[c\", \"&lt;cmd>lua vim.lsp.diagnostic.goto_prev { wrap = false }&lt;CR>\") -- \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u043c\u0435\u0441\u0442\u0443 \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439 \u043f\u043e\u0441\u043b\u0435 \u043a\u0443\u0440\u0441\u043e\u0440\u0430: nmap(\"]c\", \"&lt;cmd>lua vim.lsp.diagnostic.goto_next { wrap = false }&lt;CR>\")  -- \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c LSP \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043e\u043a (\u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e &lt;c-x>&lt;c-o>): vim.cmd('set omnifunc=v:lua.vim.lsp.omnifunc')<\/code><\/pre>\n<p>  <\/p>\n<p>\u0415\u0441\u0442\u044c \u0434\u0432\u0430 \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u043a \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u0433\u043e\u0440\u044f\u0447\u0438\u0445 \u043a\u043b\u0430\u0432\u0438\u0448. \u041f\u0435\u0440\u0432\u044b\u0439 \u2014 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u043a\u043e\u0433\u0434\u0430 \u043a\u043b\u0430\u0432\u0438\u0448\u0430\u043c \u043d\u0430\u0437\u043d\u0430\u0447\u0430\u044e\u0442\u0441\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0432\u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u043e\u0433\u043e, \u0437\u0430\u043f\u0443\u0449\u0435\u043d LSP \u043a\u043b\u0438\u0435\u043d\u0442 \u0438\u043b\u0438 \u043d\u0435\u0442. \u041b\u0438\u0447\u043d\u043e \u044f \u043f\u043e\u043a\u0430 \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0438\u0442\u0430\u044e \u044d\u0442\u043e\u0442 \u043f\u043e\u0434\u0445\u043e\u0434, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438, \u043a\u043e\u0433\u0434\u0430 \u0441\u043b\u0443\u0447\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441\u043e \u0441\u0442\u0430\u0440\u0442\u043e\u043c \u043a\u043b\u0438\u0435\u043d\u0442\u0430. \u0412\u0442\u043e\u0440\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0433\u043e\u0440\u044f\u0447\u0438\u0445 \u043a\u043b\u0430\u0432\u0438\u0448 \u0432 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0430. \u0422\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 <code>nvim-lspconfig<\/code>. \u0412 <code>nvim-metals<\/code> \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c, \u0435\u0441\u043b\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043c\u0430\u043f\u043f\u0438\u043d\u0433 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>on_attach<\/code> \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 <code>metals_config<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"lua\">metals_config.on_attach = function(client, bufnr)   -- \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c LSP \u0434\u043b\u044f \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043e\u043a \u0430\u0432\u0442\u043e\u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f   vim.api.nvim_buf_set_option(bufnr, 'omnifunc', 'v:lua.vim.lsp.omnifunc')    -- \u043d\u0430\u0437\u043d\u0430\u0447\u0430\u0435\u043c \u043a\u043b\u0430\u0432\u0438\u0448\u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0431\u0443\u0444\u0435\u0440\u0430 bufnr   local function nmap(keys, action, opts)      map('n', keys, action, opts, bufnr)   end   local function imap(keys, action, opts)      map('i', keys, action, opts, bufnr)    end    nmap(\"gd\", \"&lt;cmd>lua vim.lsp.buf.definition()&lt;CR>\")   nmap(\"gi\", \"&lt;cmd>lua vim.lsp.buf.implementation()&lt;CR>\")   ... end<\/code><\/pre>\n<p>  <\/p>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u043f\u0440\u0438 \u0442\u0430\u043a\u043e\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u0435 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0438 \u043a\u043b\u0430\u0432\u0438\u0448 \u043d\u0430\u0437\u043d\u0430\u0447\u0430\u044e\u0442\u0441\u044f <strong>\u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e<\/strong> \u0434\u043b\u044f \u0431\u0443\u0444\u0435\u0440\u0430. \u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0431\u0443\u0444\u0435\u0440\u0430 <code>bufnr<\/code>, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a <code>on_attach<\/code> \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u043c Metals.<\/p>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041f\u0440\u0438\u043c\u0435\u0440 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 metals<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"lua\">local function map(mode, keys, action, opts, bufnr)   local options = { noremap = true } if opts then     options = vim.tbl_extend(\"force\", options, opts)   end   if bufnr then     vim.api.nvim_buf_set_keymap(bufnr, mode, keys, action, options)   else     vim.api.nvim_set_keymap(mode, keys, action, options)   end end local function nmap(keys, action, opts)   map('n', keys, action, opts) end local function imap(keys, action, opts)   map('i', keys, action, opts) end  vim.opt_global.mouse = 'a' vim.opt_global.syntax = 'on' vim.opt_global.tabstop = 2 vim.opt_global.softtabstop = 2 vim.opt_global.shiftwidth = 2 vim.opt_global.shortmess:remove(\"F\"):append(\"c\")  vim.cmd('packadd packer.nvim') require('packer').startup(function(use)   use { 'wbthomason\/packer.nvim', opt = true }   use { 'scalameta\/nvim-metals' } end)  vim.cmd('augroup scalametals') vim.cmd('autocmd!') vim.cmd('autocmd FileType scala,sbt lua require(\"metals\").initialize_or_attach({})') vim.cmd('augroup end')  vim.cmd('set omnifunc=v:lua.vim.lsp.omnifunc')  nmap(\"gd\", \"&lt;cmd>lua vim.lsp.buf.definition()&lt;CR>\") nmap(\"gi\", \"&lt;cmd>lua vim.lsp.buf.implementation()&lt;CR>\") nmap(\"gr\", \"&lt;cmd>lua vim.lsp.buf.references()&lt;CR>\") nmap(\"K\", \"&lt;cmd>lua vim.lsp.buf.hover()&lt;CR>\") nmap(\"&lt;c-k>\", \"&lt;cmd>lua vim.lsp.buf.signature_help()&lt;CR>\") imap(\"&lt;c-k>\", \"&lt;cmd>lua vim.lsp.buf.signature_help()&lt;CR>\") nmap(\"&lt;leader>f\", \"&lt;cmd>lua vim.lsp.buf.formatting()&lt;CR>\") nmap(\"&lt;space>rn\", \"&lt;cmd>lua vim.lsp.buf.rename()&lt;CR>\") nmap(\"&lt;space>ca\", \"&lt;cmd>lua vim.lsp.buf.code_action()&lt;CR>\") nmap(\"[c\", \"&lt;cmd>lua vim.lsp.diagnostic.goto_prev { wrap = false }&lt;CR>\") nmap(\"]c\", \"&lt;cmd>lua vim.lsp.diagnostic.goto_next { wrap = false }&lt;CR>\")<\/code><\/pre>\n<\/div><\/div>\n<p>  <\/p>\n<h2 id=\"sobiraem-obratnuyu-svyaz\">\u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043e\u0431\u0440\u0430\u0442\u043d\u0443\u044e \u0441\u0432\u044f\u0437\u044c<\/h2>\n<p>  <\/p>\n<p>\u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 IDE Neovim \u0438 Metals \u044d\u0442\u043e \u043d\u0435 \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0430 \u0446\u0435\u043b\u044b\u0439 \u0432\u043e\u0440\u043e\u0445 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432, \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0438\u043c\u0435\u0435\u0442 \u0441\u0432\u043e\u0438 \u043d\u044e\u0430\u043d\u0441\u044b, \u0430 \u0438\u043d\u043e\u0433\u0434\u0430 \u0438 \u043e\u0442\u043a\u0440\u043e\u0432\u0435\u043d\u043d\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b. \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u043d\u0435\u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u0438 \u0437\u0430\u0447\u0430\u0441\u0442\u0443\u044e \u0431\u044b\u0432\u0430\u0435\u0442 \u0441\u043b\u043e\u0436\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u0448\u043b\u043e \u043d\u0435 \u0442\u0430\u043a. \u0427\u0442\u043e\u0431\u044b \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0441\u0435\u0431\u0435 \u0436\u0438\u0437\u043d\u044c \u0441\u0442\u043e\u0438\u0442 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f, \u043a\u0430\u043a\u0438\u0435 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u043d\u0430\u0441 \u043f\u043e\u0434\u0432\u0435\u0441\u0442\u0438 \u0438 \u043a\u0430\u043a \u0441\u043b\u0435\u0434\u0438\u0442\u044c \u0437\u0430 \u0438\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/z7\/qp\/ab\/z7qpabnuamt6twgrnutcp-tmic4.png\" vspace=\"20\" data-src=\"https:\/\/habrastorage.org\/webt\/z7\/qp\/ab\/z7qpabnuamt6twgrnutcp-tmic4.png\"\/>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c Metals \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0443 \u0441\u0442\u043e\u0438\u0442 \u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f LSP \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0432 Neovim. \u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u043f\u043b\u0430\u0433\u0438\u043d <code>nvim-lspconfig<\/code> (\u0434\u043b\u044f Metals \u043e\u043d \u043d\u0435 \u043d\u0443\u0436\u0435\u043d, \u043d\u043e \u0434\u043b\u044f \u0434\u0440\u0443\u0433\u0438\u0445 \u044f\u0437\u044b\u043a\u043e\u0432 \u043f\u043e\u043b\u0435\u0437\u0435\u043d, \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u0443\u0434\u043e\u0431\u043d\u043e \u0438\u043c\u0435\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 LSP \u0434\u043b\u044f Lua), \u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439: <code>:LspInfo<\/code>, \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u0430 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043b\u043e\u0433\u0438: <code>lua vim.lsp.set_log_level(\"debug\")<\/code>.<\/p>\n<p>  <\/p>\n<div class=\"scrollable-table\">\n<table>\n<thead>\n<tr>\n<th><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/bc\/5a\/hb\/bc5ahb8mwzln37fk3tokvv3ggxa.gif\" width=\"700\" data-src=\"https:\/\/habrastorage.org\/webt\/bc\/5a\/hb\/bc5ahb8mwzln37fk3tokvv3ggxa.gif\"\/><\/th>\n<\/tr>\n<\/thead>\n<\/table>\n<\/div>\n<p>  <\/p>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0448\u0430\u0433\u043e\u043c \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0438, \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u044e\u0449\u0438\u043c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0437\u0430\u043f\u0443\u0441\u043a <code>:MetalsRunDoctor<\/code> \u2014 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0439 \u0443\u0442\u0438\u043b\u0438\u0442\u044b \u0434\u043b\u044f \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0438 Metals:<\/p>\n<p>  <\/p>\n<div class=\"scrollable-table\">\n<table>\n<thead>\n<tr>\n<th><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/li\/lu\/ei\/lilueifoguthmca5qzovy5rbg-y.gif\" width=\"700\" data-src=\"https:\/\/habrastorage.org\/webt\/li\/lu\/ei\/lilueifoguthmca5qzovy5rbg-y.gif\"\/><\/th>\n<\/tr>\n<\/thead>\n<\/table>\n<\/div>\n<p>  <\/p>\n<p>Metals \u043c\u043e\u0436\u0435\u0442 \u0441\u043b\u0430\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e \u0445\u043e\u0434\u0435 \u0442\u0435\u043a\u0443\u0449\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u0434\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0434\u0432\u0435 \u0432\u0435\u0449\u0438: \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0443 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 Metals \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0434\u043b\u044f \u0438\u0445 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f. \u0421\u043f\u0440\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u0441 \u043f\u0435\u0440\u0432\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439 \u043d\u0430\u043c \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a <code>metals_config<\/code>, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 Metals:<\/p>\n<p>  <\/p>\n<pre><code class=\"lua\">metals_config.init_options.statusBarProvider = \"on\"<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0441\u0442\u0440\u043e\u043a\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u0434\u043b\u044f \u0435\u0451 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432. \u0417\u0434\u0435\u0441\u044c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u044f \u043f\u043e\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441\u0442\u043e\u043a\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0432\u043e\u043e\u0431\u0449\u0435 \u0431\u0435\u0437 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432:<\/p>\n<p>  <\/p>\n<pre><code class=\"lua\">function InitStatusline()   local background_color = '%#CursorColumn#'   local current_file = '%t'   local metals_status = '%{metals#status()}'   local separator = '%='   return background_color .. current_file .. separator .. metals_status end vim.opt_global.statusline = InitStatusline()<\/code><\/pre>\n<p>  <\/p>\n<div class=\"scrollable-table\">\n<table>\n<thead>\n<tr>\n<th><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/g9\/lz\/y9\/g9lzy9qmtjz1nptxjasuoe5pffq.gif\" width=\"350\" data-src=\"https:\/\/habrastorage.org\/webt\/g9\/lz\/y9\/g9lzy9qmtjz1nptxjasuoe5pffq.gif\"\/><\/th>\n<\/tr>\n<\/thead>\n<\/table>\n<\/div>\n<p>  <\/p>\n<p>\u0418, \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u0441\u0430\u043c\u044b\u0439 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f Metals \u2014 \u0447\u0442\u0435\u043d\u0438\u0435 \u043b\u043e\u0433 \u0444\u0430\u0439\u043b\u0430 <code>.metals\/metals.log<\/code>. \u0414\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 <code>nvim-metals<\/code> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u043b\u043e\u0433\u0438 \u043d\u0435 \u043f\u043e\u043a\u0438\u0434\u0430\u044f \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 <code>:MetalsToggleLogs<\/code>. \u042d\u0442\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 <code>tail<\/code> \u0432\u043e \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u043c \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435 nvim:<\/p>\n<p>  <\/p>\n<div class=\"scrollable-table\">\n<table>\n<thead>\n<tr>\n<th><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/2k\/v3\/tr\/2kv3trlnr57ykwhnqa0_0wawvlc.gif\" data-src=\"https:\/\/habrastorage.org\/webt\/2k\/v3\/tr\/2kv3trlnr57ykwhnqa0_0wawvlc.gif\"\/><\/th>\n<\/tr>\n<\/thead>\n<\/table>\n<\/div>\n<p>  <\/p>\n<p><em>\u041d\u043e \u043b\u0438\u0447\u043d\u043e \u044f \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0438\u0442\u0430\u044e \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b \u0441 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u043e\u0439 <code>tail -f .metals\/metals.log<\/code>.<\/em><\/p>\n<p>  <\/p>\n<p>\u041a\u043b\u0438\u0435\u043d\u0442 \u0438\u043b\u0438 \u0441\u0435\u0440\u0432\u0435\u0440 LSP \u043d\u0435 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0437\u0432\u0435\u043d\u044c\u044f, \u043d\u0430\u0440\u0443\u0448\u0430\u044e\u0449\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u0443 \u0432\u0441\u0435\u0439 \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432. BSP \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043f\u043e\u0434\u0432\u043e\u0434\u044f\u0442 \u043d\u0435 \u0440\u0435\u0436\u0435. \u0412 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 bloop, \u0438\u043d\u043e\u0433\u0434\u0430 \u0431\u044b\u0432\u0430\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442. \u041d\u0435 \u0447\u0430\u0441\u0442\u043e, \u043d\u043e \u0441\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e bloop \u0437\u0430\u0432\u0438\u0441\u0430\u0435\u0442, \u0438 \u0435\u0433\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c: <code>bloop exit<\/code>.<\/p>\n<p>  <\/p>\n<h2 id=\"nvim-metals---bolshe-chem-konfiguraciya-lsp-klienta\">nvim-metals \u2014 \u0431\u043e\u043b\u044c\u0448\u0435 \u0447\u0435\u043c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f LSP \u043a\u043b\u0438\u0435\u043d\u0442\u0430!<\/h2>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u0448\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u043f\u043e\u0447\u0435\u043c\u0443 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c Metals \u0438\u043c\u0435\u043d\u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>nvim-metals<\/code>. <\/p>\n<p>  <\/p>\n<h3 id=\"tree-view-protocol\">Tree View Protocol<\/h3>\n<p>  <\/p>\n<p>\u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e Metals \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 Tree View Protocol \u2014 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 LSP, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0435\u0435 \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u0418 <code>nvim-metals<\/code> \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u0443\u044e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430. \u0412 \u043d\u0430\u0448\u0435\u043c \u0440\u0430\u0441\u043f\u043e\u0440\u044f\u0436\u0435\u043d\u0438\u0438 \u0434\u0432\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438:<\/p>\n<p>  <\/p>\n<ul>\n<li><code>toggle_tree_view()<\/code> \u2014 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438\/\u0438\u043b\u0438 \u0441\u043a\u0440\u044b\u0442\u0438\u044f \u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, <\/li>\n<li><code>reveal_in_tree()<\/code> \u2014 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u0434\u0435\u0440\u0435\u0432\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/li>\n<\/ul>\n<p>  <\/p>\n<div class=\"scrollable-table\">\n<table>\n<thead>\n<tr>\n<th><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/mc\/gw\/-k\/mcgw-ktbhnghizkdvto1dvaacvi.gif\" width=\"700\" data-src=\"https:\/\/habrastorage.org\/webt\/mc\/gw\/-k\/mcgw-ktbhnghizkdvto1dvaacvi.gif\"\/><\/th>\n<\/tr>\n<\/thead>\n<\/table>\n<\/div>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u043c\u043d\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438:<\/p>\n<p>  <\/p>\n<pre><code class=\"lua\">nmap(\"&lt;leader>tr\", '&lt;cmd>lua require(\"metals.tvp\").reveal_in_tree()&lt;CR>')<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u044d\u0442\u043e\u0433\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438: <code>:help metals-tvp-module<\/code>.<\/p>\n<p>  <\/p>\n<h3 id=\"debug-adapter-protocol\">Debug Adapter Protocol<\/h3>\n<p>  <\/p>\n<p>\u0415\u0449\u0435 \u043e\u0434\u043d\u0430 \u0432\u0430\u0436\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430\u044f \u0432 <code>nvim-metals<\/code>, \u2014 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 DAP, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0438 \u043e\u0442\u043b\u0430\u0436\u0438\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0442\u0435\u0441\u0442\u044b \u043f\u0440\u044f\u043c\u043e \u0432 Neovim!<\/p>\n<p>  <\/p>\n<div class=\"scrollable-table\">\n<table>\n<thead>\n<tr>\n<th><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ky\/n0\/ni\/kyn0nigodkl0de9xfmxujye3ufs.gif\" width=\"700\" data-src=\"https:\/\/habrastorage.org\/webt\/ky\/n0\/ni\/kyn0nigodkl0de9xfmxujye3ufs.gif\"\/><\/th>\n<\/tr>\n<\/thead>\n<\/table>\n<\/div>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 DAP:<\/p>\n<p>  <\/p>\n<pre><code class=\"lua\">---------------------------------- -- file:  ~\/.config\/nvim\/init.lua ---------------------------------- require('packer').startup(function(use)   ...   -- \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043f\u043b\u0430\u0433\u0438\u043d \u0434\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438:   use { 'mfussenegger\/nvim-dap' } end)  -- \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0442\u0435\u0441\u0442\u043e\u0432: require(\"dap\").configurations.scala = {   {     type = \"scala\",     request = \"launch\",     name = \"Run\",     metals = {       runType = \"run\",     },   },   {     type = \"scala\",     request = \"launch\",     name = \"Test File\",     metals = {       runType = \"testFile\",     },   }, }  -- \u0437\u0430\u043f\u0443\u0441\u043a\/\u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f: nmap(\"&lt;leader>dc\", \"&lt;cmd>lua require('dap').continue()&lt;CR>\") -- \u0441\u043a\u0440\u044b\u0442\u044c\/\u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u043e\u043a\u043d\u043e \u0441 \u0432\u044b\u0432\u043e\u0434\u043e\u043c \u043e\u0442\u043b\u0430\u0434\u0447\u0438\u043a\u0430: nmap(\"&lt;leader>dr\", \"&lt;cmd>lua require('dap').repl.toggle()&lt;CR>\") -- \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435: nmap(\"&lt;leader>ds\", \"&lt;cmd>lua require('dap.ui.variables').scopes()&lt;CR>\") -- \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\/\u0441\u043d\u044f\u0442\u044c \u0442\u043e\u0447\u043a\u0443 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438: nmap(\"&lt;leader>dt\", \"&lt;cmd>lua require('dap').toggle_breakpoint()&lt;CR>\") -- \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0448\u0430\u0433 \u0431\u0435\u0437 \u0437\u0430\u0445\u043e\u0434\u0430 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e: nmap(\"&lt;leader>do\", \"&lt;cmd>lua require('dap').step_over()&lt;CR>\") -- \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0448\u0430\u0433 \u0441 \u0437\u0430\u0445\u043e\u0434\u043e\u043c \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e: nmap(\"&lt;leader>di\", \"&lt;cmd>lua require('dap').step_into()&lt;CR>\") -- \u0432\u044b\u0439\u0442\u0438 \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0438: nmap('&lt;leader>du', \"&lt;cmd>lua require('dap').step_out()&lt;CR>\") -- \u043f\u0440\u0435\u0440\u0432\u0430\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435: nmap('&lt;leader>dst', \"&lt;cmd>lua require('dap').stop()&lt;CR>\")<\/code><\/pre>\n<p>  <\/p>\n<h3 id=\"prochie-poleznye-vozmozhnosti-i-komandy-metals\">\u041f\u0440\u043e\u0447\u0438\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b Metals<\/h3>\n<p>  <\/p>\n<p>\u041e\u0434\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u043d\u0435 \u0445\u0432\u0430\u0442\u0438\u0442, \u0447\u0442\u043e\u0431\u044b \u043e\u0445\u0432\u0430\u0442\u0438\u0442\u044c \u0432\u0441\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c Metals, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u0434\u0435\u0441\u044c \u044f \u0443\u043f\u043e\u043c\u044f\u043d\u0443 \u043b\u0438\u0448\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445, \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u043a\u043e\u043c\u0430\u043d\u0434 \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 Ammonite \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 <code>:MetalsAmmoniteStart<\/code>, <code>:MetalsAmmoniteStop<\/code>;<\/li>\n<li>\u0410\u043d\u0430\u043b\u0438\u0437 \u0441\u0442\u0435\u043a\u0442\u0440\u0435\u0439\u0441\u0430 <code>:MetalsAnalyzeStacktrace<\/code>;<\/li>\n<li>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e scala-\u0444\u0430\u0439\u043b\u0430 <code>:MetalsNewScalaFile<\/code>;<\/li>\n<li>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e scala-\u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"http:\/\/www.foundweekends.org\/giter8\/\">g8<\/a> <code>:MetalsNewScalaProject<\/code>;<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0411\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u0445 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438: <code>:help metals-commands<\/code>.<\/p>\n<p>  <\/p>\n<h2 id=\"delaem-mir-ui-luchshe\">\u0414\u0435\u043b\u0430\u0435\u043c <del>\u043c\u0438\u0440<\/del> UI \u043b\u0443\u0447\u0448\u0435<\/h2>\n<p>  <\/p>\n<p>\u0412 \u043d\u0430\u0447\u0430\u043b\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u044f \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b, \u0447\u0442\u043e \u043e\u0434\u043d\u043e \u0438\u0437 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e LSP \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0435\u0433\u043e \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u0438 \u0432 \u043f\u043b\u0430\u043d\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0421\u0435\u0439\u0447\u0430\u0441 \u044f \u043f\u043e\u043a\u0430\u0436\u0443 \u044d\u0442\u043e \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445.<\/p>\n<p>  <\/p>\n<h3 id=\"compe\">Compe<\/h3>\n<p>  <\/p>\n<p>\u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0430\u0432\u0442\u043e\u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u043e <code>Ctrl+X Ctrl+O<\/code>, \u043c\u044f\u0433\u043a\u043e \u0433\u043e\u0432\u043e\u0440\u044f, \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u043e. \u0427\u0442\u043e\u0431\u044b \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u043e\u043f\u044b\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0430\u0432\u0442\u043e\u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435\u043c \u0434\u043b\u044f nvim \u0443\u0436\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432, \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u043c \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f <a href=\"https:\/\/github.com\/hrsh7th\/nvim-compe\">nvim-compe<\/a>:<\/p>\n<p>  <\/p>\n<pre><code class=\"lua\">---------------------------------- -- file:  ~\/.config\/nvim\/init.lua ----------------------------------  -- \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0430\u0432\u0442\u043e\u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f: -- menueone - \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0435\u0435 \u043e\u043a\u043d\u043e,  --            \u0434\u0430\u0436\u0435 \u043a\u043e\u0433\u0434\u0430 \u0435\u0441\u0442\u044c \u0432\u0441\u0435\u0433\u043e \u043e\u0434\u0438\u043d \u0432\u0430\u0440\u0438\u0430\u043d\u0442; -- noinsert - \u043d\u0435 \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c --            \u043d\u0435 \u0432\u044b\u0431\u0435\u0440\u0435\u0442 \u043e\u0434\u0438\u043d \u0438\u0437 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432; vim.opt_global.completeopt = { \"menuone\", \"noinsert\" }  require('packer').startup(function(use)   ...   -- \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c compe   use { 'hrsh7th\/nvim-compe' } end)  -- \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043f\u043b\u0430\u0433\u0438\u043d\u0430: require('compe').setup {   -- \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043f\u043b\u0430\u0433\u0438\u043d   enabled = true;   -- \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0435\u0435 \u043e\u043a\u043d\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438   autocomplete = true;   -- \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0438 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043e\u043a   source = {     path = true;     buffer = true;     nvim_lsp = true;   } }  -- \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u043f\u043e \u043d\u0430\u0436\u0430\u0442\u0438\u044e Ctrl + Space imap(\"&lt;c-space>\", \"compe#complete()\", { expr = true }) -- \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0443 imap(\"&lt;Tab>\", 'pumvisible() ? \"\\\\&lt;C-n>\" : \"\\\\&lt;Tab>\"', { expr = true }) -- \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043a \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c\u0443 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0443 imap(\"&lt;S-Tab>\", 'pumvisible() ? \"\\\\&lt;C-p>\" : \"\\\\&lt;Tab>\"', { expr = true }) -- \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 imap(\"&lt;CR>\", 'compe#confirm(\"\\\\&lt;cr>\")', { expr = true })<\/code><\/pre>\n<p>  <\/p>\n<h3 id=\"podsvetka-tekuschego-simvola-pod-kursorom\">\u041f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u043f\u043e\u0434 \u043a\u0443\u0440\u0441\u043e\u0440\u043e\u043c<\/h3>\n<p>  <\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0431\u044b\u043b\u043e \u043f\u0440\u043e\u0449\u0435 \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0444\u0430\u0439\u043b\u0435 \u0441 \u043a\u043e\u0434\u043e\u043c, \u043c\u043e\u0436\u043d\u043e \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0443 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u043f\u043e\u0434 \u043a\u0443\u0440\u0441\u043e\u0440\u043e\u043c. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u043c\u0435\u0441\u0442\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f:<\/p>\n<p>  <\/p>\n<div class=\"scrollable-table\">\n<table>\n<thead>\n<tr>\n<th><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/p3\/sf\/jr\/p3sfjrdg9drchrx_jqsrko6ygmk.gif\" width=\"400\" data-src=\"https:\/\/habrastorage.org\/webt\/p3\/sf\/jr\/p3sfjrdg9drchrx_jqsrko6ygmk.gif\"\/><\/th>\n<\/tr>\n<\/thead>\n<\/table>\n<\/div>\n<p>  <\/p>\n<p>\u0412 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u043e \u0442\u043e\u043c, \u043f\u043e\u0447\u0435\u043c\u0443 \u0434\u0430\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u0418 \u0435\u0449\u0451 \u0431\u043e\u043b\u044c\u0448\u0435 \u0441\u043e\u0432\u0435\u0442\u043e\u0432 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0435\u0451 \u043f\u043e\u0447\u0438\u043d\u0438\u0442\u044c. \u0411\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0441\u043e\u0432\u0435\u0442\u043e\u0432 \u0441\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a \u0442\u043e\u043c\u0443, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0438 \u0432 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0439 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 LSP \u043a\u043b\u0438\u0435\u043d\u0442\u0430. \u041f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u2014 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443 \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0438 \u0432 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 LSP \u043a\u043b\u0438\u0435\u043d\u0442\u0430. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 Metals, \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u0430\u044f \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0430, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a <code>metals_config<\/code> \u0438 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <code>on_attach<\/code> (\u043c\u044b \u0443\u0436\u0435 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u043b\u0438 \u0435\u0451 \u0440\u0430\u043d\u0435\u0435):<\/p>\n<p>  <\/p>\n<pre><code class=\"lua\">metals_config.on_attach = function(client, bufnr)   ...   vim.cmd([[hi! link LspReferenceText CursorColumn]])   vim.cmd([[hi! link LspReferenceRead CursorColumn]])   vim.cmd([[hi! link LspReferenceWrite CursorColumn]])   vim.cmd([[autocmd CursorHold  &lt;buffer> lua vim.lsp.buf.document_highlight()]])   vim.cmd([[autocmd CursorHoldI &lt;buffer> lua vim.lsp.buf.document_highlight()]])   vim.cmd([[autocmd CursorMoved &lt;buffer> lua vim.lsp.buf.clear_references()]]) end<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0440\u0438 \u043d\u0430\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u044f <code>CursorHold<\/code>. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u044d\u0442\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e \u0438\u0441\u0442\u0435\u0447\u0435\u043d\u0438\u0438 4 \u0441\u0435\u043a\u0443\u043d\u0434 \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043a\u0443\u0440\u0441\u043e\u0440\u0430. \u0421\u0442\u043e\u0438\u0442 \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u0442\u044c \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u044d\u0442\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0442\u0430\u043a\u0436\u0435 \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u0447\u0430\u0441\u0442\u043e\u0442\u0443 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 swap-\u0444\u0430\u0439\u043b):<\/p>\n<p>  <\/p>\n<pre><code class=\"lua\">vim.opt_global.updatetime = 300<\/code><\/pre>\n<p>  <\/p>\n<h3 id=\"better-quickfix-window\">Better Quickfix Window<\/h3>\n<p>  <\/p>\n<p>Quickfix window \u0447\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432\u043e \u043c\u043d\u043e\u0433\u0438\u0445 \u0444\u0438\u0447\u0430\u0445 LSP, \u0442\u0430\u043a\u0438\u0445 \u043a\u0430\u043a \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043a \u043c\u0435\u0441\u0442\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u0438\u043b\u0438 \u043f\u043e\u0438\u0441\u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0441\u0430\u043c\u043e\u0433\u043e quickfix window \u2014 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u0438\u0432\u043b\u0435\u043a\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0438\u0434\u0435\u044f. \u041f\u043b\u0430\u0433\u0438\u043d <a href=\"https:\/\/github.com\/kevinhwang91\/nvim-bqf\">nvim-bqf<\/a> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u0430 \u0432 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0435\u043c \u043e\u043a\u043d\u0435:<\/p>\n<p>  <\/p>\n<div class=\"scrollable-table\">\n<table>\n<thead>\n<tr>\n<th>default<\/th>\n<th>nvim-bqf<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/gn\/pt\/bw\/gnptbwwnlnxmp3nlly6u4zkquaq.gif\" alt=\"original\" data-src=\"https:\/\/habrastorage.org\/webt\/gn\/pt\/bw\/gnptbwwnlnxmp3nlly6u4zkquaq.gif\"\/><\/td>\n<td><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/nj\/cl\/ka\/njclkaeunp-3ws-_qkbggsjyu9i.gif\" alt=\"with nvin-saga\" data-src=\"https:\/\/habrastorage.org\/webt\/nj\/cl\/ka\/njclkaeunp-3ws-_qkbggsjyu9i.gif\"\/><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>  <\/p>\n<h3 id=\"lsp-saga\">LSP Saga<\/h3>\n<p>  <\/p>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u043b\u0430\u0433\u0438\u043d \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u043e\u043f\u044b\u0442\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 LSP: <a href=\"https:\/\/github.com\/glepnir\/lspsaga.nvim\">lspsaga<\/a>. \u0412\u043e\u043e\u0431\u0449\u0435 \u043f\u043b\u0430\u0433\u0438\u043d \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u043e\u0444\u043e\u0440\u043c\u043b\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0435\u0439, \u043d\u043e \u044f \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0438\u0442\u0430\u044e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c\u0438:<\/p>\n<p>  <\/p>\n<ul>\n<li>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u043f\u043e\u0434 \u043a\u0443\u0440\u0441\u043e\u0440\u043e\u043c:<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<div class=\"scrollable-table\">\n<table>\n<thead>\n<tr>\n<th>default<\/th>\n<th>lspsaga<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/e_\/on\/hq\/e_onhqcgpxselb4a7ve4thajfzu.gif\" alt=\"original\" data-src=\"https:\/\/habrastorage.org\/webt\/e_\/on\/hq\/e_onhqcgpxselb4a7ve4thajfzu.gif\"\/><\/td>\n<td><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/lw\/mn\/hk\/lwmnhkqk3rnvkv8olukrdb0u8eu.gif\" alt=\"with nvim-saga\" data-src=\"https:\/\/habrastorage.org\/webt\/lw\/mn\/hk\/lwmnhkqk3rnvkv8olukrdb0u8eu.gif\"\/><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>  <\/div>\n<\/p><\/div>\n<p>  <\/li>\n<\/ul>\n<p>  <\/p>\n<ul>\n<li>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0443 \u043c\u0435\u0442\u043e\u0434\u0430:<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<div class=\"scrollable-table\">\n<table>\n<thead>\n<tr>\n<th>default<\/th>\n<th>lspsaga<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/fw\/ml\/ij\/fwmlij2tmmekwrryrvrmzhfzhae.gif\" alt=\"original\" data-src=\"https:\/\/habrastorage.org\/webt\/fw\/ml\/ij\/fwmlij2tmmekwrryrvrmzhfzhae.gif\"\/><\/td>\n<td><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ab\/0m\/os\/ab0mostcrgyffrjrhp7isxkybra.gif\" alt=\"with nvim-saga\" data-src=\"https:\/\/habrastorage.org\/webt\/ab\/0m\/os\/ab0mostcrgyffrjrhp7isxkybra.gif\"\/><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>  <\/div>\n<\/p><\/div>\n<p>  <\/li>\n<\/ul>\n<p>  <\/p>\n<ul>\n<li>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u0442\u044c \u0441\u0438\u043c\u0432\u043e\u043b \u043f\u043e\u0434 \u043a\u0443\u0440\u0441\u043e\u0440\u043e\u043c:<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<div class=\"scrollable-table\">\n<table>\n<thead>\n<tr>\n<th>default<\/th>\n<th>lspsaga<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/c3\/dm\/ey\/c3dmeyzgzxihso-iyniandi1vwo.gif\" alt=\"original\" data-src=\"https:\/\/habrastorage.org\/webt\/c3\/dm\/ey\/c3dmeyzgzxihso-iyniandi1vwo.gif\"\/><\/td>\n<td><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/3n\/ds\/jk\/3ndsjk6led39brmwirmfbtifedk.gif\" alt=\"with nvim-saga\" data-src=\"https:\/\/habrastorage.org\/webt\/3n\/ds\/jk\/3ndsjk6led39brmwirmfbtifedk.gif\"\/><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>  <\/div>\n<\/p><\/div>\n<p>  <\/li>\n<\/ul>\n<p>  <\/p>\n<ul>\n<li>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439:<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<div class=\"scrollable-table\">\n<table>\n<thead>\n<tr>\n<th>default<\/th>\n<th>lspsaga<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/2r\/fy\/fo\/2rfyforvfoard5rh7_-9kkgl1gw.gif\" alt=\"original\" data-src=\"https:\/\/habrastorage.org\/webt\/2r\/fy\/fo\/2rfyforvfoard5rh7_-9kkgl1gw.gif\"\/><\/td>\n<td><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/cq\/fb\/vo\/cqfbvoa31qt58-cvyorrnlgc_kk.gif\" alt=\"with nvim-saga\" data-src=\"https:\/\/habrastorage.org\/webt\/cq\/fb\/vo\/cqfbvoa31qt58-cvyorrnlgc_kk.gif\"\/><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>  <\/div>\n<\/p><\/div>\n<p>  <\/li>\n<\/ul>\n<p>  <\/p>\n<ul>\n<li>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043a \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439\/\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043e\u0448\u0438\u0431\u043a\u0435:<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<div class=\"scrollable-table\">\n<table>\n<thead>\n<tr>\n<th>default<\/th>\n<th>lspsaga<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/xy\/oq\/eq\/xyoqeqpm5-coz0mn6rvwilqm6be.png\" alt=\"original\" data-src=\"https:\/\/habrastorage.org\/webt\/xy\/oq\/eq\/xyoqeqpm5-coz0mn6rvwilqm6be.png\"\/><\/td>\n<td><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/_4\/v_\/rx\/_4v_rxqviy7fggoe4eiaaeoklg4.png\" alt=\"with nvim-saga\" data-src=\"https:\/\/habrastorage.org\/webt\/_4\/v_\/rx\/_4v_rxqviy7fggoe4eiaaeoklg4.png\"\/><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>  <\/div>\n<\/p><\/div>\n<p>  <\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0437\u0430\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0433\u043e\u0440\u044f\u0447\u0438\u0445 \u043a\u043b\u0430\u0432\u0438\u0448:<\/p>\n<p>  <\/p>\n<pre><code class=\"lua\">nmap(\"K\", \"&lt;cmd>&lt;nmap(\"K\", \"&lt;cmd>lua require('lspsaga.hover').render_hover_doc()&lt;CR>\") nmap(\"&lt;c-k>\", \"&lt;cmd>lua require('lspsaga.signaturehelp').signature_help()&lt;CR>\") imap(\"&lt;c-k>\", \"&lt;cmd>lua require('lspsaga.signaturehelp').signature_help()&lt;CR>\") nmap(\"&lt;space>rn\", \"&lt;cmd>lua require('lspsaga.rename').rename()&lt;CR>\") nmap(\"&lt;space>ca\", \"&lt;cmd>lua require('lspsaga.codeaction').code_action()&lt;CR>\") nmap(\"[c\", \"&lt;cmd>lua require('lspsaga.diagnostic').lsp_jump_diagnostic_prev()&lt;CR>\") nmap(\"]c\", \"&lt;cmd>lua require('lspsaga.diagnostic').lsp_jump_diagnostic_next()&lt;CR>\")<\/code><\/pre>\n<p>  <\/p>\n<h3 id=\"telescope\">Telescope<\/h3>\n<p>  <\/p>\n<p>\u042f \u043d\u0435 \u043c\u043e\u0433\u0443 \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 Neovim \u043d\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0440\u043e <a href=\"https:\/\/github.com\/nvim-telescope\/telescope.nvim\">Telescope<\/a>. \u042d\u0442\u043e\u0442 \u043f\u043b\u0430\u0433\u0438\u043d \u0443\u043d\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u0442 \u043e\u043f\u044b\u0442 \u043f\u043e\u0438\u0441\u043a\u0430 \u0447\u0435\u0433\u043e \u0431\u044b \u0442\u043e \u043d\u0438 \u0431\u044b\u043b\u043e \u0432 Neovim, \u0430 <code>nvim-metals<\/code>, \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0438\u043c\u0435\u0435\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0443\u044e \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044e \u0441 <code>Telescope<\/code>. \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u043f\u043e\u0438\u0441\u043a\u0430 \u043a\u043e\u043c\u0430\u043d\u0434 \u0434\u043b\u044f Metals:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">:Telescope metals commands<\/code><\/pre>\n<p>  <\/p>\n<div class=\"scrollable-table\">\n<table>\n<thead>\n<tr>\n<th><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/nw\/kk\/4m\/nwkk4mgdlu3wr49qk0grzsmn33c.gif\" data-src=\"https:\/\/habrastorage.org\/webt\/nw\/kk\/4m\/nwkk4mgdlu3wr49qk0grzsmn33c.gif\"\/><\/th>\n<\/tr>\n<\/thead>\n<\/table>\n<\/div>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u043a \u0433\u043e\u0440\u044f\u0447\u0438\u043c \u043a\u043b\u0430\u0432\u0438\u0448\u0430\u043c, \u043e\u043d\u0430 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0443\u0434\u043e\u0431\u043d\u043e\u0439 \u0432 \u043f\u043e\u0432\u0441\u0435\u0434\u043d\u0435\u0432\u043d\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438. <\/p>\n<p>  <\/p>\n<pre><code class=\"lua\">nmap(\";m\", \"&lt;cmd>Telescope metals commands&lt;CR>\")<\/code><\/pre>\n<p>  <\/p>\n<p>\u0415\u0449\u0435 \u0443\u0434\u043e\u0431\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e <code>target<\/code> \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 \u043f\u0440\u0438 \u043f\u043e\u0438\u0441\u043a\u0435 \u0444\u0430\u0439\u043b\u043e\u0432:<\/p>\n<p>  <\/p>\n<pre><code class=\"lua\">local ignore_patterns = \"{ file_ignore_patterns = { 'target\/' } }\" nmap(\";f\", \"&lt;cmd>lua require('telescope.builtin').find_files(\" .. ignore_patterns .. \")&lt;CR>\")<\/code><\/pre>\n<p>  <\/p>\n<div class=\"scrollable-table\">\n<table>\n<thead>\n<tr>\n<th>find_files<\/th>\n<th>find_files(ignore_patterns)<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/bs\/xk\/fd\/bsxkfd07vgo3q0c3stdz8olux0m.png\" alt=\"without filter\" width=\"300\" data-src=\"https:\/\/habrastorage.org\/webt\/bs\/xk\/fd\/bsxkfd07vgo3q0c3stdz8olux0m.png\"\/><\/td>\n<td><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/fe\/gi\/ao\/fegiaozkoyavrdvwdun6vvod3ik.png\" alt=\"with filter\" width=\"300\" data-src=\"https:\/\/habrastorage.org\/webt\/fe\/gi\/ao\/fegiaozkoyavrdvwdun6vvod3ik.png\"\/><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>  <\/p>\n<h2 id=\"na-pravah-zaklyucheniya\">\u041d\u0430 \u043f\u0440\u0430\u0432\u0430\u0445 \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f<\/h2>\n<p>  <\/p>\n<p>\u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u044f \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0445 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u044b\u0445 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 \u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438:<\/p>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/wbthomason\/packer.nvim\">Packer<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/neovim\/nvim-lspconfig\">nvim-lspconfig<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/scalameta\/nvim-metals\">nvim-metals<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/hrsh7th\/nvim-compe\">nvim-compe<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/kevinhwang91\/nvim-bqf\">nvim-bqf<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/glepnir\/lspsaga.nvim\">lspsaga<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/nvim-telescope\/telescope.nvim\">Telescope<\/a><\/li>\n<\/ul>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"lua\">------------------------------------------------------------ -- Utilities ------------------------------------------------------------ -- {{{ local function map(mode, keys, action, opts, bufnr)   local options = { noremap = true }   if opts then     options = vim.tbl_extend(\"force\", options, opts)   end   if bufnr then     vim.api.nvim_buf_set_keymap(bufnr, mode, keys, action, options)   else     vim.api.nvim_set_keymap(mode, keys, action, options)   end end -- equivalent of nnoremap local function nmap(keys, action, opts)   map('n', keys, action, opts) end -- equivalent of inoremap local function imap(keys, action, opts)   map('i', keys, action, opts) end -- }}}  ------------------------------------------------------------ -- Global options ------------------------------------------------------------ -- {{{ -- turn on mouse: vim.opt_global.mouse = 'a' -- turns on syntax highlight vim.opt_global.syntax = 'on' -- a 'size' of &lt;Tab> in spaces vim.opt_global.tabstop = 2 vim.opt_global.softtabstop = 2 -- number of spaces to use for each step of (auto)indent vim.opt_global.shiftwidth = 2 -- a comma separated list of options for Insert mode completion -- menuone  - use a popup menu to show the possible completions, --            also when there is only one match; -- noinsert - do not insert any text for a match until the user --            selects a match from the menu; vim.opt_global.completeopt = { \"menuone\", \"noinsert\" } -- needed for correct work of the metals vim.opt_global.shortmess:remove(\"F\"):append(\"c\") -- speedup used for the CursorHold autocommand event vim.opt_global.updatetime = 300 -- }}}  ------------------------------------------------------------ -- Plugins ------------------------------------------------------------ -- {{{ vim.cmd([[packadd packer.nvim]]) require(\"packer\").startup(function(use)   -- packer can manage itself   use { 'wbthomason\/packer.nvim', opt = true }   -- autocompletion   use { \"hrsh7th\/nvim-compe\" }   -- dap   use { 'mfussenegger\/nvim-dap' }   -- better quickfix   use {  'kevinhwang91\/nvim-bqf' }   -- scala metals   use { 'neovim\/nvim-lspconfig' }   use { 'scalameta\/nvim-metals' }   -- for better ui   use { 'glepnir\/lspsaga.nvim' }   -- telescope   use {     'nvim-telescope\/telescope.nvim',     requires = {{'nvim-lua\/popup.nvim'}, {'nvim-lua\/plenary.nvim'}}   } end) -- }}}  ------------------------------------------------------------ -- DAP (Debug Adapter Protocol) ------------------------------------------------------------ -- {{{ require(\"dap\").configurations.scala = {   {     type = \"scala\",     request = \"launch\",     name = \"Run\",     metals = {       runType = \"run\",     },   },   {     type = \"scala\",     request = \"launch\",     name = \"Test File\",     metals = {       runType = \"testFile\",     },   }, } -- }}}  ------------------------------------------------------------ -- Metals ------------------------------------------------------------ --{{{ metals_config = require'metals'.bare_config metals_config.init_options.statusBarProvider = \"on\" metals_config.root_patterns = { \"build.sbt\", \"build.sc\", \".git\", \".bloop\" } metals_config.settings = {    showImplicitArguments = true,    showInferredType = true, }  metals_config.handlers[\"textDocument\/publishDiagnostics\"] = vim.lsp.with(   vim.lsp.diagnostic.on_publish_diagnostics, {     virtual_text = {       prefix = \"\uf529\",     }   } )  metals_config.tvp = {   panel_alignment = \"right\" }  metals_config.on_attach = function(client, bufnr)   -- turn on dap support   require('metals').setup_dap()    vim.api.nvim_buf_set_option(bufnr, 'omnifunc', 'v:lua.vim.lsp.omnifunc')    -- buffer local mapping   local function nmap(keys, action, opts) map('n', keys, action, opts, bufnr) end   local function imap(keys, action, opts) map('i', keys, action, opts, bufnr) end    -- go to definition   nmap('gd', \"&lt;cmd>lua vim.lsp.buf.definition()&lt;CR>\")   -- go to implementation   nmap('gi', \"&lt;cmd>lua vim.lsp.buf.implementation()&lt;CR>\")   -- show all places where the symbol under cursor is used   nmap('gr', \"&lt;cmd>lua vim.lsp.buf.references()&lt;CR>\")   -- show description of the symbol under cursor   nmap('K', \"&lt;cmd>lua require('lspsaga.hover').render_hover_doc()&lt;CR>\")   -- show signature of current method   nmap('&lt;c-k>', \"&lt;cmd>lua require('lspsaga.signaturehelp').signature_help()&lt;CR>\")   imap('&lt;c-k>', \"&lt;cmd>lua require('lspsaga.signaturehelp').signature_help()&lt;CR>\")   -- format current buffer   nmap('&lt;leader>f', '&lt;cmd>lua vim.lsp.buf.formatting()&lt;CR>')   -- renave the symbol under cursor   nmap('&lt;space>rn', '&lt;cmd>lua require(\"lspsaga.rename\").rename()&lt;CR>')   -- show all possible actions   nmap('&lt;space>ca', '&lt;cmd>lua require(\"lspsaga.codeaction\").code_action()&lt;CR>')   -- go to error before cursor   nmap('[c', '&lt;cmd>lua require(\"lspsaga.diagnostic\").lsp_jump_diagnostic_prev()&lt;CR>')   -- go to error after cursor   nmap(']c', '&lt;cmd>lua require(\"lspsaga.diagnostic\").lsp_jump_diagnostic_next()&lt;CR>')   -- show current buffer in the tree view   nmap('&lt;leader>tr', '&lt;cmd>lua require(\"metals.tvp\").reveal_in_tree()&lt;CR>')    -- DAP   nmap('&lt;leader>dc', '&lt;cmd>lua require(\"dap\").continue()&lt;CR>')   nmap('&lt;leader>dl', '&lt;cmd>lua require(\"dap\").run_last()&lt;CR>')   nmap('&lt;leader>dr', '&lt;cmd>lua require(\"dap\").repl.toggle()&lt;CR>')   nmap('&lt;leader>ds', '&lt;cmd>lua require(\"dap.ui.variables\").scopes()&lt;CR>')   nmap('&lt;leader>dt', '&lt;cmd>lua require(\"dap\").toggle_breakpoint()&lt;CR>')   nmap('&lt;leader>do', '&lt;cmd>lua require(\"dap\").step_over()&lt;CR>')   nmap('&lt;leader>di', '&lt;cmd>lua require(\"dap\").step_into()&lt;CR>')   nmap('&lt;leader>du', '&lt;cmd>lua require(\"dap\").step_out()&lt;CR>')   nmap('&lt;leader>dst', '&lt;cmd>lua require(\"dap\").stop()&lt;CR>')    -- Need for symbol highlights to work correctly   vim.cmd([[hi! link LspReferenceText CursorColumn]])   vim.cmd([[hi! link LspReferenceRead CursorColumn]])   vim.cmd([[hi! link LspReferenceWrite CursorColumn]])   vim.cmd([[autocmd CursorHold  &lt;buffer> lua vim.lsp.buf.document_highlight()]])   vim.cmd([[autocmd CursorHoldI &lt;buffer> lua vim.lsp.buf.document_highlight()]])   vim.cmd([[autocmd CursorMoved &lt;buffer> lua vim.lsp.buf.clear_references()]]) end  -- Run metals on open scala file vim.cmd([[augroup scalametals]]) vim.cmd([[autocmd!]]) vim.cmd([[autocmd FileType scala,sbt lua require(\"metals\").initialize_or_attach(metals_config)]]) vim.cmd([[augroup end]]) --}}}  ------------------------------------------------------------ -- Autocompletion ------------------------------------------------------------ --{{{ require'compe'.setup {   enabled = true;   autocomplete = true;   source = {     path = true;     buffer = true;     nvim_lsp = true;   } } --}}}  ------------------------------------------------------------ -- Statusline configuration ------------------------------------------------------------ -- {{{ function InitStatusline()   local background_color = '%#CursorColumn#'   local current_file = '%t'   local metals_status = '%{metals#status()}'   local separator = '%='   return background_color .. current_file .. separator .. metals_status end vim.opt_global.statusline = InitStatusline() --}}}  ------------------------------------------------------------ -- Keymapping ------------------------------------------------------------ -- {{{  -- select next option in autocompletion imap(\"&lt;c-space>\", \"compe#complete()\", { expr = true }) imap(\"&lt;S-Tab>\", 'pumvisible() ? \"\\\\&lt;C-p>\" : \"\\\\&lt;Tab>\"', { expr = true }) -- select next option in autocompletion imap(\"&lt;Tab>\", 'pumvisible() ? \"\\\\&lt;C-n>\" : \"\\\\&lt;Tab>\"', { expr = true }) -- make choice by pressing &lt;Enter> imap(\"&lt;CR>\", \"compe#confirm({ 'keys': '&lt;CR>', 'select': v:true })\", { expr = true })  -- find files local ignore_patterns = \"{ file_ignore_patterns = { 'target\/' } }\" nmap(\";f\", \"&lt;cmd>lua require('telescope.builtin').find_files(\" .. ignore_patterns .. \")&lt;CR>\") nmap(\";F\", \"&lt;cmd>lua require('telescope.builtin').find_files({ hidden = true })&lt;CR>\") -- find buffers nmap(\";e\", \"&lt;cmd>lua require('telescope.builtin').live_grep()&lt;CR>\") -- find recent files nmap(\";o\", \"&lt;cmd>lua require('telescope.builtin').oldfiles()&lt;cr>\") -- find metals commands nmap(\"&lt;leader>m\", \"&lt;cmd>Telescope metals commands&lt;CR>\") -- }}}<\/code><\/pre>\n<\/div><\/div>\n<p>  <\/p>\n<p>\u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043d\u0430\u0434\u043e \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u043d\u043e\u0432\u044b\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u043c, \u0432\u043e\u043f\u0440\u0435\u043a\u0438 \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043d\u0430 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u043d\u0430\u0431\u043e\u0440 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0434\u043b\u044f \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u0443 Metals \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0441\u043a\u0443\u0434\u043d\u044b\u0439, \u0443 Neovim \u0435\u0441\u0442\u044c \u0447\u0442\u043e \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u0442\u044c scala-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443. \u042d\u0442\u043e \u0431\u043e\u043b\u0435\u0435 \u0431\u0435\u0440\u0435\u0436\u043d\u043e\u0435 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u043a \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c \u0432\u0430\u0448\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0435 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043f\u0440\u044f\u043c\u0438\u043a\u043e\u043c \u043e\u0442 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 (!), \u0432\u044b\u0441\u043e\u043a\u0430\u044f \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430 (\u0434\u0430, \u0437\u043d\u0430\u044e \u0447\u0442\u043e \u044d\u0442\u043e \u0441\u0443\u0431\u044a\u0435\u043a\u0442\u0438\u0432\u043d\u043e, \u043d\u043e \u0435\u0441\u043b\u0438 \u0432\u044b \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043b\u0438 \u0441\u0442\u0430\u0442\u044c\u044e \u0446\u0435\u043b\u0438\u043a\u043e\u043c, \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e \u0432\u044b \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u043a \u044d\u0442\u043e\u0433\u043e \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \ud83d\ude42 ), \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u043e\u043f\u044b\u0442 (\u0447\u0442\u043e \u043d\u0435\u043c\u0430\u043b\u043e\u0432\u0430\u0436\u043d\u043e \u2014 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e) \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u043b\u044e\u0431\u044b\u043c \u044f\u0437\u044b\u043a\u043e\u043c, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 LSP. \u0418 \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u044b \u0435\u0449\u0451 \u0441\u0438\u043b\u044c\u043d\u0435\u0435 \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u0442\u044c \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 IDE.<\/p>\n<p>  <\/p>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440 \u0432\u0441\u0435\u0433\u0434\u0430 \u0437\u0430 \u0432\u0430\u043c\u0438, \u043d\u043e \u0441\u043e\u0433\u043b\u0430\u0441\u0438\u0442\u0435\u0441\u044c, \u0445\u043e\u0440\u043e\u0448\u043e, \u043a\u043e\u0433\u0434\u0430 \u0435\u0441\u0442\u044c \u0438\u0437 \u0447\u0435\u0433\u043e \u0435\u0433\u043e \u0434\u0435\u043b\u0430\u0442\u044c. \u0412 \u043e\u0431\u0449\u0435\u043c&#8230;<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/dv\/sy\/6v\/dvsy6vgnbbwclaidfaclpzwfdqq.png\" width=\"200\" data-src=\"https:\/\/habrastorage.org\/webt\/dv\/sy\/6v\/dvsy6vgnbbwclaidfaclpzwfdqq.png\"\/><\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/570762\/\"> https:\/\/habr.com\/ru\/articles\/570762\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/webt\/d9\/ib\/2l\/d9ib2lgvsmj9dgvca-beoghsxde.jpeg\" alt=\"image\" data-src=\"https:\/\/habrastorage.org\/webt\/d9\/ib\/2l\/d9ib2lgvsmj9dgvca-beoghsxde.jpeg\" data-blurred=\"true\"\/><\/p>\n<p>  <\/p>\n<p>\u0412 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0435 \u0444\u0430\u043d\u0430\u0442\u043e\u0432 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 Neovim \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e \u0437\u043d\u0430\u043c\u0435\u043d\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u2014 <a href=\"https:\/\/habr.com\/ru\/post\/569550\/\">\u0432\u044b\u0448\u043b\u0430 \u0432\u0435\u0440\u0441\u0438\u044f 0.5<\/a>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043d\u043e\u0432\u043e\u0432\u0432\u0435\u0434\u0435\u043d\u0438\u0439:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u044f\u0437\u044b\u043a\u0430 Lua; <\/li>\n<li>\u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 treesitter;<\/li>\n<li>\u0438, \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 LSP \u043a\u043b\u0438\u0435\u043d\u0442, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u0437 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 \u0434\u043e\u0441\u0442\u043e\u0439\u043d\u043e\u0433\u043e \u0441\u043e\u043f\u0435\u0440\u043d\u0438\u043a\u0430 IDE!<\/li>\n<\/ul>\n<p>  <\/p>\n<p>Neovim \u2014 \u044d\u0442\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440, \u0444\u043e\u0440\u043a \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 Vim, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0442\u0430\u0432\u0438\u0442 \u0441\u0432\u043e\u0435\u0439 \u0446\u0435\u043b\u044c\u044e \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u043e\u043f\u044b\u0442\u0430 \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 Vim: \u00abNeovim is built for users who want the good parts of Vim, and more\u00bb.<\/p>\n<p>  <\/p>\n<p>\u041c\u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f Neovim \u0441\u0432\u043e\u0435\u0439 \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u044c\u044e, \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u0432 \u043e\u0447\u0435\u043d\u044c \u043c\u043e\u0449\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u043a\u0441\u0442\u0430, \u043d\u043e \u0438 \u043a\u043e\u0434\u0430. \u041a\u0430\u043a scala-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443 \u043c\u043d\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u0438\u0441\u043f\u044b\u0442\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 LSP \u043a\u043b\u0438\u0435\u043d\u0442 \u0432 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u043a \u043b\u044e\u0431\u0438\u043c\u043e\u043c\u0443 \u044f\u0437\u044b\u043a\u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 VSCode \u0438 \u0434\u0430\u0436\u0435 Vim + CoC \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 LSP \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0432 Neovim \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u0430\u044f, \u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043a\u0440\u0430\u0439\u043d\u0435 \u0433\u0438\u0431\u043a\u0430\u044f. \u0414\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u2014 \u043a\u0440\u0430\u0442\u043a\u043e\u0435 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043f\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 Neovim \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u043e Scala \u0438 \u043a\u0440\u0430\u0442\u043a\u0438\u0439 \u043e\u0431\u0437\u043e\u0440 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0430\u0435\u0442 \u0441\u0432\u044f\u0437\u043a\u0430 Neovim + Metals.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-402694","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/402694","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=402694"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/402694\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=402694"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=402694"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=402694"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}