俺自身が無�人島🏝になることだ 🦾
@kawarimidoll
Who am I
Hi 👋
カワリミ人形です
@kawarimidollで各サイトに登録しています
GitHub / Zenn / Bluesky などで活動しています
今回は文字が多くなってしまいま�した🙏スライドは公開するので細かいところは後で読んでください
なんだそのタイトルは
無人島
これは外せない!という�便利なプラグインのこと
この記事が有名→
(無人島に持っていきた�い〇〇 というネタは以前�からあるらしい)
とはいえ
どんなプラグインを好むか?
いろいろな方針がありそう
ちょっと種類を考えてみた
【ネオモダン】
ファジーファインダー、ファイルツリーなどを豊富に使い見た目も華やかな構成
Neovim専用のプラグインが多く、NeovimをIDEにしよう!という記事もよく見る
画像はLazyVimとNvChad→
【スパルタン】
プラグインを使用しない…というか特に設定も作らずデフォルトのVimを使う
Vim本体さえ動けば問題ない、非常に可搬性が高く根強い支持のあるスタイル
誰でも最初はスパルタン
【暗黒界】
Vim-jpで人気のDark Powered Plugin 設定できる範囲が広い
設定に知識が必要だが先駆者たちに日本語で質問できるのでそんなに怖くないはず
同じプラグインでも使い手によって見た目や味付けが違う
今日の話はどれでもない
【 】
プラグインをなるべく使用しない、でも便利な設定はどんどん追加していく
自作した設定をプラグインとして公開することもある
つまり必要な機能を可能な限り自作でまかなっていく
【鉄腕】
プラグインをなるべく使用しない、でも便利な設定はどんどん追加していく
自作した設定をプラグインとして公開することもある
つまり必要な機能を可能な限り自作でまかなっていく
(あッ それで無人島なのか〜〜)
今日の話は
今日の話は
プラグインをいろいろ導入したので、そろそろオリジナルの設定も作りたいナ〜��というひとに手がかりを渡したい
何からやる?
とりあえずvimrcに処理を書く
Vimrcに command で定義すれば自作コマンドを作れる
コマンドから関数を呼び出せば複雑なこともできる
command! Myecho echo 'hello world!'
command! Mycall call Myfunc()
いつもやっていることを自動化
よく同じコマンドを連続で使っているなあ�→ |で繋げて一つにしてみる
よく同じ操作をしているなあ�→ normal! で実行してみる
えっ normal! ってなに?�→ :h normal を見る
たとえばこういうやつ↑
ぜんぶVimrcに入れると�ファイルが大きくなりすぎる
関数はautoloadにしてみる
Vimrcに set runtimepath+=/path/to/dir という行を追加
このディレクトリ内に autoload というディレクトリを作り、そこに入れたファイルに file_name#func_name という名前で関数を定義すれば、明示的に source しなくても使用したタイミングで自動的に読み込まれる
(実際に使用するまでファイルの読み込みを遅延できる!)
関数はautoloadにしてみる
カワリミ人形は set runtimepath+=~/dotfiles/.vim して、ここに autoload 、さらに mi というディレクトリを作っている
よってファイルパスは↓
~/dotfiles/.vim/autoload/mi/file_name.vim
定義する関数名は↓
mi#file_name#func_name
GitHubのdotfilesリポジトリで公開している
(mini.nvimをリスペクトした)
kawarimidoll / dotfiles / .vim /autoload / mi / ???.vim
kawarimidoll / dotfiles / .vim /autoload / mi / ???.vim
kawarimidoll / dotfiles / .vim /autoload / mi / ???.vim
いっぱいある
どんなのを作る?
普段の作業にネタはある
例:インデントの中でちょこちょこ移動するの面倒だな�→ 移動を連打するようにマッピングすれば良いのでは?�→ 常にマッピングするのは邪魔だな、判定する方法はないかな�→ :h indent してみる
で、これが産まれたってわけ↑
以下、自作おすすめの提案
�(カワリミ式の実装はdotfilesで見られます)
operator
Vimのパワーの一端だと思う
diw とかの d の部分�ここ自作できるのすごいよね
. リピートの勉強にもなる
:h :map-operator が詳しい
vim-operator-replaceも�自作してみるのがおすすめ
手前味噌だがこのサンプルが↑�ファーストステップにおすすめ
textobject
Vimのパワーのもう一端
diw とかの iw の部分
選択処理の勉強になる
snake_case の snake の部分�だけ選択したいとかあるよね
vim-textobj-entireとかvim-textobj-lineとかを作ると感覚がわかってくると思う
過去の自作例↑�
f / t の拡張
Vimの左右移動の便利機能、f / t
ignore caseに対応させたくなったこと、あるよね?
実は :h getchar() にサンプルがある
きっと一度作るとアイデアが湧いてくる↓
複数行に対応できるか?それを表示範囲内に限定できるか?�fs で さ にジャンプできたら便利じゃないか?
ただし、位置の調整は意外と面倒( :h exclusive )
括弧補完
( を入力するとカーソルの右側に ) が入力される機能
インサートモードの動き(と難しさ)を知るには最適�(この機能自体を嫌うひとにも自作練習用には良いと思う)
カワリミ人形は「Vimで括弧とクォーテーションの最強補完機能を自作しよう!」というページを大いに参考にした
このページのものをベースにし、インデントを保つには?アンドゥをまとめるには?など改善を加えるとよさそう
surround ( sandwich )
こちらも括弧の操作 ただしノーマル・ビジュアルモード
特定の範囲を括弧で包む�→ Vimなんだから逐一選択せず saiw( のようにやりたい�→ operatorとtextobjectの知識が使える!
(逆に言うと、ちょっとoprator / textobjectを作ってから�挑戦するのがおすすめ)
winresizer
自作するために作業バッファとhelpを行ったり来たりしていると「ウィンドウのサイズや位置をいい感じに切り替えたいな…」と感じてくる
→ 作ってみよう!はいはい毛の長い牛が通りますよ
winresizer.vimの挙動は、サブモード�(Vimのモードとは別に、プラグイン�が定義するモード)の勉強にもなる
capture
echo コマンドで何かを表示できるけど、その結果をコピーしたりするにはどうしたら良いのか?
→ コマンドの出力をバッファに書き出す機能を作ってみよう
highlight や function などの設定系のコマンドは、単体で実行すると現在の設定を一覧できるので、その結果の確認にも使える
後半は有名プラグインの�再発明じゃん
車輪の再発明もあり
有名なプラグインは参考になるので真似るのも一つの手
いきなり中身(答え)を見るのではなく、「こういう機能ということは、実装はこんな感じかな?」と考えて作ってみる
中身を見てみると、ビルトインのコマンドや関数で簡単に書ける部分が自前で記述されていることもある�→ それがVim本体に実装される以前からあるということ
現代的に書き直してみるのも良い :h lambda :h -> :h $’
まとめ
自分で作ると
自分の道具感が得られる
(再発明品であっても)自分が作ったものを使ってまた別のものを作っていくというのは他にはない面白さ
自由度の高いゲームをやっているような感覚かもしれない
「自分の必須プラグインは自分で書いたやつです」といえる
→ 無人島生活へ 🏝
感謝と尊敬の念を覚える
自分で作ってみるほどに過去の巨人たちの偉大さを感じる
Vim本体も膨大なヘルプドキュメントも有名なプラグインたちもそれを創り出し育ててきたひとたちがいる
本当に 𝒓𝒆𝒔𝒑𝒆𝒄𝒕 …
みんなも鉄腕を目指そう🦾
面白い設定を作ったら
ぜひ公開して自慢してほしい
thanks