作成するAma2022/12/13に公開2024/05/09Vimtech!この記事はVim駅伝の2023-12-13向けの記事です。きっかけ最近Vimを触りはじめた友人とのチャットがきっかけでした。Vimでスクロールをすると、ウィンドウの最下行をテキストの終端が通り越して一番上まで移動することができます。逆に言えば、マウスで勢い良くスクロールをするとテキスト欄が一気に見えなくなってしまいます。余白を残しスクロールをストップする設定値だそうです。キーを反復するという形で扱われているので上手く関数を作成しリマップすることで再現できるはずです。いざ作成してみたところ、ウィンドウからの相対位置を取得する必要が出てきました。カーソル位置からのウィンドウからの相対位置を取得することができますが、これは引数を持たずカーソル限定になっています。本題TL;DR以下でおおよそ想定どおりの挙動をすると思います。折り返し当初はスクロールストップのプラグインを以下のように書いていました。https://github.com/gw31415/scrollUptoLastLine.vim/blob/86b66b588954416cc87292e6ded6a048fb533d34/plugin/plugin.vim#L2-L9これを書き換えると以下のようにして相対位置を取得していることになります。1指定した位置とウィンドウ最上行の行数の差をとり1を足すシンプルな実装です。これだと文字列がWindow幅を越える折り返しに対応できません。順に足し合わせていくことで相対位置を計算するというアイデアで実装したプラグインが以下になります。関係なく、指定した行の表示行数を計算する関数です。間違えて命名してしまいました。例によって相対位置取得部分を抜き出します。関数は指定した行の表示行数を計算する関数です。ウィンドウのうち行表示カラムなどを除いた表示箇所の横幅を計算しています。割ることでその行の縦幅を計算しています。これを'w0'からFor文で足し合わせることで計算しています。計算量は多いですが、テキストエディタの縦幅は高々数十行程度なので速度的には問題ない範囲かと思います。これで(汚いながらも)上手くできたと思いましたが、折り返しのことを失念していたので全部を書き直すことにしました。どこか別の場所で使えるかと思います。存在していました(最初からこれ使えば良かったやん)。これを用いて最初のバージョンを書き換えればよかったということですね。1最終的なプラグインはこちらに載せています。存在していたのでシンプルな結論になりましたが、Vimの表示箇所の扱いなどこれまで触れていなかったところに触れることができたいい機会でした。GitHubで編集を提案AmaRustとNeovimがすきです。vim-jpPublicationバッジを贈って著者を応援しようバッジを受け取った著者にはZennから現金やAmazonギフトカードが還元されます。バッジを贈るDiscussionAmaRustとNeovimがすきです。Proよくある質問LinksX(Twitter)GitHubメディアキットLegal利用規約プライバシーポリシ。