tombiを導入してみる

本題の前に新年のご挨拶を…

あけましておめでとうございます。このブログは2025年の年末に"より続けやすいブログが欲しい"とのことで開設したものです。 2026年はたくさん記事を書いていきたいです。

tombiとは?

tombiとはRustで実装されたTOMLのLanguage Server & Formatter & Linterです。

Zennに投稿された開発者さんの記事によると、TOMLのLanguage Serverは、以前からtaploというものが存在するようですが、メンテナンスの継続が困難になってしまっていて、利用するのが難しくなってしまったことが開発の動機のようです。

筆者は、Rustによる開発の際に、Cargo.toml,Makefile.tomlを書くので、TOMLにも Language Serverがあればな~っと思っていました。 そんな時、GitHubをぼんやりと見ていると、たまたま発見したので試してみることにしました。

インストール by Nix

現在は、マシンにグローバルにインストールはしておらず、プロジェクトごとのnix-shell内で有効化しています。

とりあえず試してみたいならば、

1
nix-shell -p tombi

nix-shellを作ってしまうのが一番簡単でしょう。

筆者は、Rustの開発環境をflakeで構築しているので、以下のようにpackagestombiを追加して運用しています。

この方法は、Rustでなくても、PythonでPoetry,uvなどでpyproject.tomlを書くような場面でも使えます。

  • flake.nix
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
{
  description = "project with tombi";

  inputs = {
    nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable";
  };

  outputs =
    { self, nixpkgs }:
    let
      pkgs = nixpkgs.legacyPackages."x86_64-linux";
    in
    {

      devShells."x86_64-linux".default = pkgs.mkShell {

        packages = with pkgs; [
          # 他のパッケージ 
          tombi
        ];

      };

    };
}

Nixを利用しないで、インストールしたい場合は公式ドキュメントのinstallationの部分を参照してください。

Neovim向けに設定する

tombi自体はインストールできたので、エディタ側も設定してきます。 先ほどのドキュメントのに、設定のサンプルへのリンクがあったのでそれを参考にして、以下のように設定しました。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
-- Toml
vim.lsp.tombi = {
  cmd = {
    'tombi',
    'lsp',
  },
  filetypes = { 'toml' },
  root_markers = { 'tombi.toml', 'pyproject.toml', '.git' },
}
vim.lsp.enable({ 'tombi' })

この設定では、ビルドインのLSPマネージャーを使う方法で設定しました。 ポイントは、root_markers = {}でプロジェクトのルートディレクトリのヒントになるファイルを指定することです。

さらに、保存した時にフォーマットされるようにするために以下のように設定をしました。

1
2
3
4
5
6
7
-- format via LSP
vim.api.nvim_create_autocmd('BufWritePost', {
  pattern = { '*.toml' },
  callback = function()
    vim.lsp.buf.format({})
  end,
})

tombiはLSP経由でのフォーマット機能が実装さているので、この設定では、*.tomlなファイルが保存された時(BufWritePostイベントが発生した時) に、vim.lsp.buf.format()を実行するようにしています。

使用してみて

インストールは、flakeで環境構築しているRustのプロジェクトがあったので、packages = []に追加するだけでできてお手軽でした。

実際に使用してみたところ、基本的な機能は使えている印象です。きっとTOMLを書く場面で活躍することでしょう。

CC BY
Hugo で構築されています。
テーマ StackJimmy によって設計されています。