nvim-navic

今回はのほほんとnvim-navicを導入してみましょう。

A simple statusline/winbar component that uses LSP to show your current code context.

Named after the Indian satellite navigation system.

LSP を使用して現在のコードコンテキストを表示するシンプルな statusline/winbar コンポーネントです。

インドの衛星ナビゲーションシステムにちなんで名付けられました。

これもLSPを利用して動作するプラグインです。

日本で衛星の話はまだだいぶお耳が痛いですが、インドのNavIC 1 はしっかり地球を飛び立った衛星です。

Before the rising sun, we fly

朝日が昇る前に、私たちは飛び立つ

Installation & Setup

nvim-navicの導入は、それはもうとても恐ろしく簡単です。インド人もびっくり❗

まあ、SmiteshP さんはインドの人なんだけど😮

extensions/nvim-navic.lua

require('nvim-navic').setup {
  lsp = {
    auto_attach = true,
  },
  highlight = true,
}

もうこれだけで飛びます。ニホン人もびっくり❗

Note

本当に最低限で良ければ、highlightもなくて平気です😸

lsp

For nvim-navic to work, it needs attach to the lsp server.

nvim-navicが動作するためには、lspサーバにアタッチする必要があります。

You can pass the nvim-navic's attach function as on_attach while setting up the lsp server.

lspサーバーのセットアップ時に、nvim-navicのattach関数をon_attachとして渡すことができます。

とのことなんですが、これはもはや過去のものとなっています...❗次項へ🐈

auto_attach

You can skip this step if you have enabled auto_attach option during setup.

セットアップ時にauto_attachオプションを有効にしている場合は、この手順を省略することができます。

auto_attachの登場によって、 on_attachすらも、言語ごとにdocumentSymbolProviderに対応してますかぁ❓な〜んていう確認すらも 自分で書く必要がありません😊 のほほん。

これ以上に "auto" なものがかつて他に存在したでしょうか⁉️

highlight

highlightについては、これはなんとonenord.nvimが対応してくれています❗

ってことは、これもやっぱりコードを自分で書く必要がありません😆

Note

使用しているカラーテーマがnvim-navichighlightに対応していない場合でも Customise の "Example highlight definitions" で案内されているように、 自分で色をつけることができちゃいます😉

なんだかもう至れり尽くせりです🐹 のほほん。

Wrap Up

ということで、packerから呼び出します。

もう馴染みすぎてしまって、安堵感すら覚えますね😇

extensions/init.lua

use {
  'SmiteshP/nvim-navic',
  config = function() require 'extensions.nvim-navic' end,
  requires = 'neovim/nvim-lspconfig',
}

Usage

nvim-navic does not alter your statusline or winbar on its own. Instead, you are provided with these two functions and its left up to you how you want to incorporate this into your setup.

nvim-navicは、それ自体で statusline や winbar を変更することはありません。 その代わり、この2つの機能が提供され、これをどのようにセットアップに取り入れるかはあなたに任されています。

:h navic.is_available (bufnr)

Returns boolean value indicating whether nvim-navic is able to provide
output for current buffer.

nvim-navic が現在のバッファの出力を提供できるかどうかを示す boolean 値を返します。

'bufnr' is optional argument. If bufnr is not provied, current open
buffer is used.


'bufnr' はオプションの引数です。bufnr が提供されない場合、現在のオープンバッファが使用されます。

navic.get_location (opts, bufnr)

Returns a pretty string that shows code context and can be used directly
in statusline or winbar.

コードコンテキストを示す整理された文字列を返し、statusline や winbar で直接使用することができます。
opts テーブルは nvim-navic のオプションのいずれかを上書きするために渡すことができます。

opts table can be passed to override any of |nvim-navic|'s options.
Follows same table format as *navic-setup*|'s opts table. You can pass
|bufnr| value to determine which buffer is used to get code context. If
not provided, the current buffer will be used.

navic-setup の opts テーブルと同じテーブル形式に従います。
bufnr 値を渡すと、コードコンテキストを取得するためにどのバッファを使用するかを決定することができます。
省略した場合は、現在のバッファが使用されます。

ネイティブに表示する方法なども示されていますが、 このサイトでは散々お世話になっているlualineを選んで進みます。

Note

このサイトでは扱っていませんが、feline, galaxylineに表示する方法も示されています。

So many roads to choose

たくさんの道があるように たくさんの選択がある

lualine

ということでやっていくんですが、これもやっぱり簡単です😉 のほほん。

statuslinelualine_cに、diagnosticsと並べて表示してみます。

extensions/lualine.lua

require('lualine').setup {
  sections = {

    (中略)

    lualine_c = {
      {
        'diagnostics',
        sources = { 'nvim_diagnostic', 'nvim_lsp' },
        sections = { 'error', 'warn', 'info', 'hint' },
        symbols = { error = ' ', warn = ' ', info = ' ', hint = ' ' },
      },
+     { function() return navic.get_location() end, cond = function() return navic.is_available() end },
    },

  (以下略)

Tip

このページ、出来てからまだ一週間も経ってないんですが、上に書いてあることは既に過去のものとなりました🌟

An example lualine setup

-     { function() return navic.get_location() end, cond = function() return navic.is_available() end },
+     { 'navic' }

どないなっとんねん🤯 強すぎるやろー🐎🐎🐎

必須ではありませんが、packerにもlualine.nvimnvim-navicを使用していることを教えておいてあげましょう。

extensions/init.lua

use {
  'nvim-lualine/lualine.nvim',
  config = function() require 'extensions.lualine' end,
  after = 'onenord.nvim',
  requires = {
    'rmehri01/onenord.nvim', 'nvim-tree/nvim-web-devicons',
-   'neovim/nvim-lspconfig', 'lewis6991/gitsigns.nvim',
+   'neovim/nvim-lspconfig', 'lewis6991/gitsigns.nvim', 'SmiteshP/nvim-navic',
  },
}

そしたらほらね、lualine上に現在のコードコンテキストが示されました。

nvim-navic-statusline

Note

例えば、tablineに表示してみるのもオシャレです😊 VSCodeとかは上にあった気もするし❗

nvim-navic-tabline

ちょっと上の情報が多すぎる気もするので、git関連の情報を下に移動した方が良いかもしれません🤔

(buffersもだいぶ場所とるし...😅)

We’ll start out walking and learn to run

And yes, we’ve just begun 2

歩くことから始めましょう そのあと走ることを学びましょう

そう わたしたちはまだ始まったばかり

Customise

これで終わっても全然いいんですけどね❗ もうちょっとのほほんとして行ってもバチは当たらないでしょ😊

他にもいくつかカスタマイズ項目があるので、わたしが使用しているものだけ載せていきます😄

icons

オフィシャルに示されているものをそのまま持ってきちゃいますが、 これをsetupに仕込んでおくとVSCode likeなアイコンになります。

extensions/nvim-navic.lua

--require('nvim-navic').setup {

  icons = {
    File = ' ',
    Module = ' ',
    Namespace = ' ',
    Package = ' ',
    Class = ' ',
    Method = ' ',
    Property = ' ',
    Field = ' ',
    Constructor = ' ',
    Enum = ' ',
    Interface = ' ',
    Function = ' ',
    Variable = ' ',
    Constant = ' ',
    String = ' ',
    Number = ' ',
    Boolean = ' ',
    Array = ' ',
    Object = ' ',
    Key = ' ',
    Null = ' ',
    EnumMember = ' ',
    Struct = ' ',
    Event = ' ',
    Operator = ' ',
    TypeParameter = ' ',
  },

--}

VSCode like: nvim-navic-vscode_like

Original: nvim-navic-original

...。😮

ちょっと例がびみょーですが、全体的にアイコンが大きく見えるし、Booleanのアイコンは確かに変わってますね。ね❗

depth_limit

あと、上限の鬼対策でこれも入れておくと安心です。

extensions/nvim-navic.lua

--require('nvim-navic').setup {

  depth_limit = 9,

--}

:h navic-customise

depth_limit: integer
  Maximum depth of context to be shown. If the context depth exceeds
  this parameter, context information is truncated. default is infinite

  表示するコンテキストの最大深度。コンテキストの深さがこのパラメータを超える場合、
  コンテキスト情報は切り捨てられます。デフォルトはinfiniteです。

強いんだか弱いんだか「っていうか、なんやねんそれ🤨」ってなりますが、 こうしておけば百とか千とか、変なのとか来ても安心です❗

しかも9にしておけば十の悪魔にも強く出れます❗🤣

Line Count

NOTE: You can set vim.b.navic_lazy_update_context = true for specific buffers, where you want the the updates to not occur on every CursorMoved event. It should help if you are facing performance issues in large files. Read the docs for example usage of this variable.

注:特定のバッファで、CursorMovedイベントごとに更新を行わないようにしたい場合は、 vim.b.navic_lazy_update_context = trueを設定することができます。 大きなファイルでパフォーマンスの問題に直面したときに役立つはずです。 この変数の使用例については、ドキュメントをお読みください。

:h vim.b.navic_lazy_update_context

Set it to true to update context only on CursorHold event.

true に設定すると、CursorHold イベント時にのみコンテキストを更新します。以下のような場合に有効です。

Could be usefull if you are facing performance issues on large files. Example usage

大容量のファイルでパフォーマンスの問題に直面している場合。

vim.api.nvim_create_autocmd("BufEnter", {
  callback = function()
    if vim.api.nvim_buf_line_count(0) > 10000 then
      vim.b.navic_lazy_update_context = true
    end
  end,
})

サンプルだとgroupがありませんが、のほほんと入れとくのもありだと思います😄

extensions/nvim-navic.lua

vim.api.nvim_create_autocmd("BufEnter", {
  group = vim.api.nvim_create_augroup('nvim-navic', {}),
  callback = function()
    if vim.api.nvim_buf_line_count(0) > 10000 then
      vim.b.navic_lazy_update_context = true
    end
  end,
})

Note

このコードはsetup()の外に記述してください❗

( すみません...初掲時はうっかり中にいました...😭 )

I'll take you all.

のほほんとできましたね😊

ちゃんとLSPを動かせるようになったことによる賜物です。 「胸を張っていい❗❗3

ところで〜...、nvim-navicのトップにこんな一文がありましたね。

nvim-navic

You might also be interested in nvim-navbuddy.

Paired with nvim-navic, it will give you complete breadcrumbs experience like in an IDE!

nvim-navbuddyに興味をお持ちの方もいらっしゃるかもしれません。

nvim-navicと組み合わせることで、IDEのような完全なパンくず体験ができるようになります!

nvim-navbuddyの存在はつい最近知ったので、 この章のロードマップには無かったし、わたし自身が超使いこなせているってこともないんですが...😟

なんか面白かったので、このサイトでもちょこっとだけ触れたいと思います😆

そんなこんなで次回に続く... 🪼

Success

Sharing horizons that are new to us

Watching the signs along the way

わたしたちにとって新たな地平線へ一緒に

道中の標識にも目を向けて