🐶

Neovim用 luaプラグイン lasterisk.nvimを作った

2022/07/21に公開約2,100字

lasterisk.nvim

Vimの*はデフォルトだと次にヒットする単語にカーソルが移動してしまいますが、vim-asteriskというプラグインを入れると*入力時にカーソルが動かなくなりとても便利です。

私は最近Neovimを使い始めて設定もinit.luaで書いているので使うプラグインもlua製に寄せています。vim-asteriskはVim scriptで書かれたプラグインなので、luaの勉強もかねvim-asteriskのlua実装 lasterisk.nvim を作ってみました。

https://github.com/rapan931/lasterisk.nvim

できること

  • カーソルが移動しない normalモードの*
  • カーソルが移動しない normalモードのg*
  • 選択領域の検索 (visualモードの*)
vim.keymap.set('n', '*',  function() require("lasterisk").search() end)
vim.keymap.set('n', 'g*', function() require("lasterisk").search({ is_whole = false }) end)
vim.keymap.set('x', 'g*', function() require("lasterisk").search({ is_whole = false }) end)

-- not support visual asterisk & is_whole = true
-- vim.keymap.set('x', '*',  function() require("lasterisk").search() end)

vim-asteriskではサポートしてるのに、lasterisk.nvimでは非サポートの機能は色々あります。とりあえず私が満足しているので一旦終了ですが、気が向いたら対応してみたいと思います。

実装中の話

  • vim.fn.getpos()だとbyte単位の col が取れますが、vim.fn.getcharpos()だと文字単位の col が取れます。
    vim.fn.strprt()も同様にbyte単位に部分文字列を取得する関数ですが、vim.fn.strcharpart()では文字単位に部分文字列を取得できます。文字単位便利。
    (ちなみにVim9 scriptでは'あいうえお'[3:] "=> えおのように[:]が文字単位の指定に変わるようですね。従来のVim scriptだと'あいうえお'[3:] "=> いうえおのように3byte目以降の部分文字列取得になります)

  • vim.region()というstart, endを指定するとその選択範囲を返すような便利関数がNeovimに追加されていたのですが、使ってみたところ第4引数のregtypev,Vどちらを指定しても結果が同じになってしまったり、第2, 第3引数に渡した引数が更新されてしまったりと、少し使いづらかったです。結局vim.region()は使わずに、vim.fn.getcharpos()で頑張りました。

  • vim.region()を調べているときに見つけたのですが選択範囲文字列を取得するようなプルリクが。いつか使ってみたい。

  • 毎回毎回vim.fn.xxxxxと書くのがめんどいのでプラグイン用ファイル先頭でlocal fn = vim.fnとするとちょっとだけ楽になります。

  • vim.api.xxxxはリモートプラグイン用の関数らしい
    ただのプラグイン内ではあんまり使わない方が良いのかもしれませんが、このあたりの使い分けはよく分かっていないです。

終わりに

初めてluaでプラグインを書いてみましたが割とすんなりかけました。vim.fn.xxxxにVim scriptの関数がごっそり入っているのでVim scriptに慣れている人はそこまで抵抗なく書けると思います。またネタ見つけて書こう。

GitHubで編集を提案

Discussion

ログインするとコメントできます