Wagomu no Akibako

fall.vimいいぞ


この​記事はVim駅伝2024年11月20日(水)の​記事です。

前回の​記事は​ kyoh86さんの​「:terminalの​ZSHから​Neovimに​コマンドの​終了を​通知すると​便利」と​いう​記事でした。

次回の​記事は​ 11月22日(金) に​投稿される​予定です。


はじめに

neovimの​sub環境に​lambdalisueさんの​新作プラグインである​fall.vimと​いう​ffプラグインを​導入してみました。

GitHub - vim-fall/fall.vim: 🍂 Yet Another Fuzzy Finder designed for Vim and Neovim and to be programmer-friendly 🍂 Yet Another Fuzzy Finder designed for Vim and Neovim and to be programmer-friendly - vim-fall/fal...
ogp

vimを​使い​はじめた​ときから​今に​至るまで、​lambdalisue wareに​お世話に​なっている​身と​して、​新作が​出たら​使ってみるしか​ありません。

fall.vimとは

ffプラグインです。​ffは​ファージーに​ファインドする​やつです。

UIはtelescope.nvimで​見慣れた​フローティングウィンドウ形式です。

現在は​ビルドインで、​以下の​ソースが​提供されています。

  • grep
  • git-grep
  • file
  • file:all
  • line
  • buffer
  • help
  • quickfix
  • oldfiles
  • history

概要は​この​あたりに​して、​fall.vimの​ここすきポイントを​紹介します

ここすきポイント

ヘルプが​用意されている

ここでの​ヘルプは​ヘルプファイルの​ことではなく、​UI上での​ヘルプです。

デフォルトでは、<F1>で​ヘルプを​表示できます。

これに​よって​導入した​あとで、​ヘルプを​起動する​キーマッピングを​覚えるだけで、​fall.vimの​使い方を​ある​程度知る​ことができます。
本腰を​入れて​カスタマイズする​前に​サクッと​挙動を​試したいので、​この機能は​ありが​たいです。

tsファイルで​カスタマイズする

fall.vimの​ソースや​並び順等の​カスタマイズは​tsファイルで​行います。
その​設定ファイルは:FallCustomを​実行する​ことで、stdpath('config')直下に/fall/custom.tsを​自動生成します。​その​体験は​coc.nvimの:CocConfigに​インスパイアされている​そうです。

メイン環境で​使っているddu.vimでは​ファイル検索する​ときにddu-filter-sorter_mtimeソートを​多用しているので、​同様の​ソートを​fall.vimでも​作ってみました。

function sorterMtime<T extends Detail>(): Sorter<T> {
  return defineSorter<T>((_denops, { items }) => {
    items.sort((a, b) => {
      try {
        const fileInfoA = Deno.statSync(a.detail.path as string);
        const fileInfoB = Deno.statSync(b.detail.path as string);

        if(fileInfoA.isFile && fileInfoB.isFile) {
          const va = fileInfoA.mtime?.getTime() ?? 0;
          const vb = fileInfoB.mtime?.getTime() ?? 0;

          return vb - va;
        }
        return 0;
      } catch {
        return 0;
      }
    })
  });
}

// ...


export const main: Entrypoint = (
  {
    definePickerFromSource,
    definePickerFromCurator,
    refineSetting,
  },
) => {
  refineSetting({
    coordinator: builtin.coordinator.modern,
    theme: builtin.theme.MODERN_THEME,
  });

// ...

  definePickerFromSource(
    "file:mtime",
    refineSource(
      builtin.source.file({
        filterFile: myFilterFile,
        filterDirectory: myFilterDirectory,
      }),
      builtin.refiner.relativePath,
    ),
    {
      matchers: [builtin.matcher.fzf],
      sorters: [
        sorterMtime,
      ],
      renderers: [
        composeRenderers(
          builtin.renderer.smartPath,
          builtin.renderer.nerdfont,
        ),
      ],
      previewers: [builtin.previewer.file],
      actions: {
        ...myPathActions,
        ...myQuickfixActions,
        ...myMiscActions,
      },
      defaultAction: "open",
    },
  );

// ...

};

このように、​tsファイルで​カスタマイズする​ことで、​自分好みの​ソートや​ソース、​フィルター等を​追加する​ことができます。

丁寧な​JSDocが​書かれている

書く​ことが​面倒に​なりがちな​JSDocが​丁寧に​書かれているので、​カスタマイズする​際に​助かります

型が​しっかりしている

これは​プラグインと​いうよりも、​TypeScriptの​話に​なってしまいますが、​型が​しっかりしているので、​カスタマイズする​際に​エラーが​出にくいです。

おわりに

使っていて​とても​良かったので、​サブ環境に​元々​入っていた​ffプラグインである、mini.pickと​併用していこうと​思います。