icon

nazo6.dev

一覧に戻る
2023/8/22 3 min read

telescope.nvim拡張の作り方

目次


telescope.nvim拡張の作り方


#概要

telescope.nvimの拡張(ソース)の作り方のいい文献があまり見つからなかったのでメモ。

#基本構造

telescope.nvimの拡張はlua/telescope/_extensions/[source]以下のディレクトリに置き、

require("telescope").load_extension "source"

をすることで読み込まれる。

このsourceディレクトリ以下を作成するのが基本的な流れ。 この中でtelescope.register_extensionをすることで拡張を登録できる。 これ以下のコードでは、この拡張の名前をsourceとする。

source/init.lua
local telescope = require "telescope"
 
return telescope.register_extension({
  setup = setup,
  exports = {
    command = picker
  },
})

telescope.register_extensionにはsetupexportsというキーを持ったテーブルを登録することができる。

#setup

まず、setupには関数を指定するが、ここではユーザーがTelescopeのsetup関数で設定した値を受け取ることができる。つまり、

require("telescope").setup({
  extensions = {
    source = {} -- ←ココ
})

上のコード内で示した部分のテーブルを受け取ることができる。これは主にキーマッピングを設定する際などに使用される。

#exports

次にexportsだが、ここに拡張の実体を指定することになる。exports{[command]: Picker}の形式のテーブルを受け取る。ここでコマンド名がソース名と一致していれば、:Telescope sourceを実行することでピッカーを実行できる。一方、一致していない場合はTelescope source commandに割り当てられる。

#picker

pickerというのがTelescope拡張の実体であり、ここに指定した関数が実行される。pickerの例を下に示す。

local pickers = require("telescope.pickers")
local sorters = require("telescope.sorters")
 
local picker = function(opts)
	pickers
		.new(opts, {
			prompt_title = "Search",
			sorter = sorters.get_generic_fuzzy_sorter(),
			previewer = previewer,
			finder = finders.new_table({
				results = flat_data,
				entry_maker = function(entry)
					return {
						value = entry,
						display = entry,
						ordinal = entry,
					}
				end,
			}),
			attach_mappings = function(prompt_bufnr, map)
				return true
			end,
		})
		:find()
 
end

見ての通りだが、telescope.pickers.newに色々なオプションを指定することで動作をカスタマイズできる。

  • sorter: ソートする関数を指定する。sorters.get_generic_fuzzy_sorter()で問題ないことが多いと思う。
  • previewer: (選択中の)entryを受け取り、プレビューの内容を決める。
  • finder: ここが一番重要なところ。ここではfinders.new_tableを使って、配列からfinderを作成している。entry_makerで返すテーブルは、valueがpickerに渡される値、displayが一覧画面で表示される文字列、ordinalが検索に使用される文字列。 他にも外部コマンドを実行して結果を得るなどできる。
Share this article:
一覧に戻る

関連記事

2021/8/21

2024/3/14

#tech/software/neovim
blog

Neovim builtin LSP設定入門

<div class="message-warning"> Neovim 0.11においてLSP関連の大きな変更があり、この記事の内容は若干古くなっています(古いというだけでこの記事の内容自体は有効であり、コードも動くはずです)。 最新の設定を試したいという方は記事の更新をお待ちください </div>

Read Article

2023/5/1

#tech/software/neovim
blog

Neovimを再起動するコマンドを作ったら結構よかった

Neovim盆栽をしていると設定をリロードしたい時が結構というかかなりあります。Vimscriptであればsource ~/.vimrcとすればまあ大体うまくいっていた気がするのですがLuaではそうもいきません。 Luaのrequireのキャッシュを消してやればもう一度読み込めるとかは言われていますが世の中のLuaプラグインはsetupを2回以上呼んだりするとおかしくなったりする物が大抵なのでこの方法でもあんまりうまくいきません。

Read Article

2021/3/28

2021/10/23

#tech/lang/js-ts#tech/software/neovim
blog

Typescriptでneovimの設定を書く!

vim を使い始めて 2 週間ほどたったある日、せっかく neovim を使っているんだし設定が少ない今のうちに init.vim を init.lua に書き換えようと思いこちらの文章を読んでいたところ、最後にこんなものがあるのに気づきました。

Read Article

2021/3/14

2021/3/15

#tech/software/neovim
memo

Vim初心者がNeovimを試す

VSCodeを使っているとコマンド操作できることでも覚えるのがめんどくさくてついマウスでポチポチしてしまうので自分を律したい

Read Article

2024/1/31

#tech/software/neovim
memo

Windows Terminal上のNeovimでundercurlを表示する(wslのみ)

最近ついにWindows Terminalでもundercurlの表示ができるようになった(これを書いた時点ではプレビュー版のみ)。

Read Article

2023/10/31

#tech/software/neovim
blog

lemonadeでssh先のneovimとクリップボードを共有

lemonadeを使えばTCP通信を用いてクリップボードを共有できます。

Read Article

2021/9/4

2023/4/28

#tech/software/neovim
blog

neovim luaのパフォーマンス計測方法

最初は下の方法2を使用していましたが、profile.nvimという素晴らしいプラグインが出ていたので今はこれを使用するのがおすすめです。

Read Article

2021/5/15

2022/5/7

#tech/software/neovim
blog

nvim-lspでtsconfig.jsonとかの補完をする方法(JSON schema)

SchemaStore.nvim というプラグインが出てきました。 基本的にこの記事で説明されていることをやってくれてさらに定期的に更新されるのでこのプラグインを使うのがおすすめです。

Read Article

© 2025 nazo6. All rights reserved.