2022年のNeovimのリリース内容

2022年12月

Neovimは、世界で最も愛されているエディターです。これは科学的に証明されています。

以下は、Neovim 2022(Nvim 0.8)の開発におけるハイライトの一部です。

UI

まずは見た目から!

  • 「winhighlight」は、ウィンドウローカルなハイライト名前空間として完全に再実装されました。これは後方互換性を保ちつつ、ウィンドウローカルな構文ハイライトなど、多くの新しいユースケースを可能にします。
  • グローバルな「statusline」は、すべてのウィンドウに対して1つのステータスラインを指定します。ぜひ試してみてください。
    :set laststatus=3
    
  • 'winbar'は、各ウィンドウの上部に追加のステータスラインのように表示されます。laststatus=3を補完します。
    set winbar=%f
    set laststatus=3
    
  • 'winbar''statusline'は、マウスクリック領域のサポートを得ました(「tabline」は2016年からこの機能を備えていました)。
  • 実験的 高さゼロのコマンドライン
    :set cmdheight=0
    
  • 「mousescroll」オプションは、マウスの垂直/水平スクロールの動作を制御します。
    :set mousescroll=ver:5,hor:2
    
  • 新しい「statuscolumn」オプションは、「ガター」を完全に制御し、「statusline」と同じ使い慣れた形式で表示します。また、「statusline」、「tabline」、「winbar」と同様に、クリックイベントもサポートします。
    • 機能の作成者である@luukvbaal氏は、さまざまな事前設定済みの「statuscolumn」設定を含むプラグインも提供しています。
    • ぜひ試してみてください!
      :set rnu nu 
      :let &stc='%#NonText#%{&nu?v:lnum:""}%=%{&rnu&&(v:lnum%2)?"\ ".v:relnum:""}%#LineNr#%{&rnu&&!(v:lnum%2)?"\ ".v:relnum:""}'
      
  • マークはビューポート情報を保存および復元できます。
    :set jumpoptions=view
    
    • ジャンプしたり、ctrl-^でバッファを切り替えたりすると、ビューポートは垂直方向のリセット/再センタリングではなく、復元されます。
  • vim.ui_attach(実験的)は、すべてのNvim UIに公開されているのと同じイベントに、インプロセスLuaプラグインがフックできるようにします。pic.twitter.com/w9U87jGfIL
    • noice.nvimは、初期の採用者でした(数日のうち)。

LSP

  • Nvimの組み込みLSPサポートの歴史と現状に関する概要
  • Nvim LSPクライアントは、TCPによる言語サーバーへの接続をサポートするようになりました。
    vim.lsp.start({ name = 'godot', cmd = vim.lsp.rpc.connect('127.0.0.1', 6008) })
    
  • LSP用の新しいコアイベントLspAttachLspDetach。例
    vim.api.nvim_create_autocmd('LspAttach', {
      group = yourGroupID,
      callback = function(args)
        local client = vim.lsp.get_client_by_id(args.data.client_id)
        your_callbac_func(client, args.buf)
      end
    }
    
  • vim.lsp.get_active_clients()はフィルタリングを学習しました(これはLua stdlibの標準パターンになります)。
    get_active_clients({id=42})
    get_active_clients({bufnr=99})
    get_active_clients({name='tsserver'})
    

エディター

  • Nvimは、C、Lua、Vimscriptのtreesitterパーサーを含めるようになりました。これは、正規表現ベースのvim構文定義ではなく、一般的な言語で「デフォルトでtreesitter」を使用するためのステップです。
  • tree-sitterスペルチェックがextmark領域に制限されました。
  • diffモードの「linematch」機能により、同じ行のdiff変更のレンダリングが改善されました。
    :set diffopt+=linematch:60
    
  • Nvimはeditorconfigをサポートし、デフォルトで有効になりました。Nvimはプロジェクト内の「.editorconfig」ファイルを検出し、設定を適用します。
    • この機能を無効にするには、設定に以下を追加します。
      vim.g.editorconfig_enable = false
      
  • プラグインは、ユーザー定義のコマンドのライブプレビューを提供できます。
    • これは、入力時に:substitute:s/foo/bar)の効果を表示する組み込みの'inccommand'機能(2017年以降)を拡張するものです。
    • 例:live-command.nvimプラグインは、:normalおよびマクロのプレビューを追加します。
  • ユーザー定義コマンドの「inccommand」プレビューを実装できるようになりました。これは、:normal:globalなどのライブプレビューの基盤を構築します。
    vim.api.nvim_create_user_command(
      'MyCmd',
      my_cmd,
      { …, preview = my_cmd_preview })
    
  • :writeコマンドは、++pフラグを取得したため、これにより、親/dir/が存在しない場合は作成されます。
    :edit parent/dir/file.txt
    :write ++p
    
  • Nvimは、「セッションデータ」(shada、永続的なundoなど)を$XDG_CACHE_HOME(〜/.cache)ではなく、保存するようになりました。この変更はmacOS/unixのみに影響し、Windowsの場所は変更されていません。
  • プラグインは、ログファイルに推奨される場所を取得するためにstdpath('log')を使用することもできます。
  • manpageビューアー(:help :Man)のgOは、ロケーションリストにアウトライン(目次)を表示します。アウトラインには、フラグもリストされるようになりました。

パフォーマンス

  • ファイルタイプ検出は、Lua(Vimscriptの代わりに)と「オンデマンド」戦略を使用します。これにより、古いfiletype.vimと比較して7倍の高速化、起動時に5ms以上の節約が実現します。
    before:
      9.0ms: sourcing …/runtime/filetype.vim
    after:
      1.3ms: sourcing …/runtime/filetype.lua
    
  • nvim --startuptimeは、Luaのrequire()時間を報告するようになりました。
    000.010  000.010: --- NVIM STARTING ---
    000.198  000.188: event init
    ...
    026.333  001.109  001.101: require('vim.lsp.protocol')
    028.144  000.423  000.423: require('vim.lsp._snippet')
    ...
    
  • Nvimの「packpath」の改善の簡単なまとめ
  • 高速で洗練された折りたたみは、プラグインによって提供されます。

デフォルト

  • 「mouse」オプションは、デフォルトで設定されるようになりました(再び)。2017年から「より良いアプローチ」が見つかるまで無効化されていました。現在は有効になりました。
    mouse=nvi
    Type ":" (cmdline-mode) to temporarily disable mouse. Right-click shows a popup menu.
    Try it!
    

API

  • nvim_parse_cmd()は、nvim_cmd([list])と「ユーザーcmdプレビュー」の基礎を提供します!そして、カスタムcmdline(:)の動作を定義するのに非常に役立ちます。
    :echo nvim_parse_cmd('.,$g/foo/bar', {})
    {
     'cmd': 'global',
     'args': ['/foo/bar'],
     'mods': {…},
     'magic': {'file': v:false, 'bar': v:false}
    }
    
  • nvim_cmd()を使用して、system([...])のように、Vimのレガシーコマンドを構造化された方法で呼び出します。
    • fnameescape()は不要:特殊文字は、magicパラメーターによって制御されます。
      nvim_cmd({cmd='vimgrep', args={'/%s/j', '**'}}, {})
      
  • nvim-oxi:「Neovimによって公開される豊富なAPIへのファーストクラスのRustバインディング(Nvim CへのFFI)」。

Lua

  • ファイルシステム操作については、vim.fsモジュールを確認してください。
    • vim.fs.find()は、LSP構成で一般的な「ルートファイル」を見つけるための正規の方法になりました。
  • vim.cmdは、Luaのnvim_cmdラッパーです。文字列ではなく関数としてExコマンドを呼び出すことができます。
    vim.cmd.colorscheme('nightfox')
    
  • Luaプラグインは、成熟を続けています

    「Luaプラグインは基本的にvimプラグインと同じですが、ファイル拡張子が.vimではなく.luaであり、ファイルにVimscriptではなくLuaコードが含まれている点が異なります。」

    • このエレガントなインターフェースには、@bfredl氏の多大な貢献による、多くの注意深い作業が必要でした!

メンテナンス

  • @dundargoc氏による作業により、2014年と2017年に開始された2つのリファクタリングが完了しました:#567 #7401
  • コアメンテナーの@teej_dv氏によるvim9script => Nvim-Luaトランスパイラーの進捗状況により、Vimからのテストカバレッジ、構文、ftplugins、さらにはcfilterのようなプラグインを引き続き利用できるようになります。
  • ナイトリー版と安定版のリリースは、macOS 11+用のユニバーサルバイナリ(ARM/M1、Intel)を提供するようになりました。

ドキュメント

オンラインNvimドキュメントの自動生成は、古いAWKスクリプトをLua + tree-sitterに置き換えることで書き直されました。素晴らしいものができました。

  • スタイリングの改善
  • ネストされたリスト
  • 選択したページでのソフトラップされた「フロー」レイアウト(
  • vimの:helpトークンの解析の改善

古いレイアウト(左)と新しいレイアウト(右)を比較してください

ジョブコントロール

Nvimは、jobstart()および:terminalジョブで$NVIM環境変数を設定するようになり、子プロセスがNvimの子であることを明確に示すヒントが提供されます。競合する「二重目的」を持っていた古い$NVIM_LISTEN_ADDRESSは、子に渡されなくなりました。

RPC

Nvim UIは単なる(反転された)プラグインです。そして、今ではnvim自体が自己ホストUIになりました。ターミナルでnvimを実行すると、nvim --embed子プロセスとしてTUIが開始されます。

Nvim GUIと同様に、nvim TUIを任意のNvimサーバーに接続して、そのUIを確認できます。今すぐ試すことができます。

  1. アドレス./fooでサーバーを起動します(現在のディレクトリにfooファイルを作成します)
    nvim --listen ./foo
    
  2. 別のターミナルから(./fooと同じディレクトリ内)、nvimをサーバーに接続します
    nvim --remote-ui --server ./foo
    

非推奨

  • Vimで「easy vim」を実装するために使用されていた「insertmode」オプションを削除しました
    • プラグインとして同じ動作を可能にすることを目指しています。:help 'insertmode'を参照してください。
  • cscopeサポートは、LSPクライアント(:help lsp)とほぼ冗長であるため、削除されました。
    • 注意:ctagsサポートは決して削除されません。より一般的で一般的に役立つためです。

ニュース

その他の更新については、ニュースアーカイブをご覧ください。また、RSSフィードもあります。

Neovimとは?

Neovimは、新しいアプリケーションと貢献を促進するために、拡張性使いやすさを重視して設計された、Vimベースのテキストエディターです。

議論

チームとチャットするには、#neovim:matrix.orgまたはirc.libera.chatの#neovimにアクセスしてください。