👨

もしもvimを使っているときに記憶喪失になったら…

2021/07/01に公開約7,600字

ここはどこだ

「あれ、なんの作業をしてたっけ?」
彼の名前はkoutarn、しがないタッチタイピング虚無僧。
今日も元気にお経を唱えながらコーディングをしていたのですが、
度重なるデスマーチのせいで軽く記憶を無くしてしまったようです。

「vimで作業をしていたんだけど基本的な操作方法以外思いだせない…」
おっと、彼はvimという 素晴しいエディタ で作業をしていたようですね。
ご都合主義なこの状況から彼と一緒にvimの操作方法を思い出してみましょう。

この記事の対象の方

✅ この記事は以下の人を想定して書いています。

  • もの忘れが激しい人
  • vimって便利なんだけど覚える事が多いんだよなーって人

🚨 逆にこんな人は読んでもあまり意味がないかもしれません

  • ガチで記憶をなくしている人
  • 一度見たものは絶対に忘れないタイプの人

基本的なキーマップを思いだそう

「あれ、これデフォルトのキー設定と違うぞ」
おや、早速困ってしまいましたね。
普段からvimの設定をイジるのが大好きなkoutarn。
良くデフォルトのキーを潰していましたが今回はそれが仇となったようです。

「あ、こんなところに付箋が貼ってある。なになに? 困ったら <Leader>? を押せ?」
「なるほど、ならまずは<Leader>を調べるか」
<Leader>とは彼にデスマーチを強要したプロジェクトリーダの事ではありません。
vimで用意されているキー設定のためのprefixの事です。(:h <Leader> )

さて、<Leader>を調べるにはどうしたら良いでしょうか?
そんな時は:{map-modes} hogehogeで何を設定したかを思いだしましょう。

:map <Leader>

今回は<Leader>を調べたいので、これをコマンドラインモードで入力しましょう。

n  <Space>dG   * <Cmd>lua require'dap'.run_last()<CR>
n  <Space>dg   * <Cmd>lua require'dap'.run()<CR>
n  <Space>dl   * <Cmd>lua require'dap'.load_launchjs()<CR>
n  <Space>dB   * <Cmd>lua require'dap'.set_breakpoint(vim.fn.input('Breakpoint condition: '))<CR>
n  <Space>dR   * <Cmd>lua require'dap'.repl.open()<CR>
n  <Space>do   * <Cmd>lua require'dap'.step_out()<CR>
n  <Space>di   * <Cmd>lua require'dap'.step_into()<CR>
n  <Space>dn   * <Cmd>lua require'dap'.step_over()<CR>
n  <Space>dc   * <Cmd>lua require'dap'.continue()<CR>
n  <Space>db   * <Cmd>lua require'dap'.toggle_breakpoint()<CR>
n  <Space>d<Esc> * <Cmd>lua require'dap'.stop()<CR>
n  <Space>f.   * <Cmd>EditCheat<CR>
n  <Space>?    * <Cmd>Cheat<CR>

そうする事でこのように表示されました。
この感じだと<Leader><Space>で間違いなさそうですね。

チートシートを使って思いだそう

「よし、<Leader>Spaceだ。ポチっとな」
付箋に貼っていた<Leader>?のコマンドを使用したようですね。

「なんじゃこりゃ!!!!!」
なにかが表示されたようです。
ちょっとリアクションがオーバーすぎますが、ここでは無視して話を進めましょう。

[Leader]
space

[Prefix]
データ操作(汎用) <leader>f
設定操作 <Leader>s
Bookmark(プラグイン) <Leader>m
Gina(プラグイン) <Leader>g
Debug(プラグイン) <Leader>d
coc(プラグイン) <Leader>;
cheatsheet表示 <Leader>?

彼の画面には半透明のウィンドウの上にこのような文字が表示されていました。

https://github.com/reireias/vim-cheatsheet
色々な設定を入れると自分で何を設定したのかを忘れてしまうかもしれません。
そんな時はこのチートシートpluginを入れてみてください。
キーを押すだけで簡単に思いだせます。

let g:cheatsheet#cheat_file = '~/.config/nvim/cheatsheet'
command! EditCheat :edit ~/.config/nvim/cheatsheet

let g:cheatsheet#float_window = 1
let g:cheatsheet#float_window_width_ratio = 0.8
let g:cheatsheet#float_window_height_ratio = 0.7

nnoremap <Leader>? <Cmd>Cheat<CR>
nnoremap <leader>f. <Cmd>EditCheat<CR>

ちなみにこのようにチートシートの表示と編集をマッピングしています。
話の都合上prefixしか表示していませんが、
OperatorやText Objectなんかを書いてもよさそうですね。

whichkeyを使ってキー操作を思いだそう

「けど、prefixキーだけわかっても操作出来無いじゃん…」
「また、:{map-modes}<Key>で調べれば良いけど面倒臭すぎるよな」
そうです、彼の言うとおりprefixキーだけ分っても操作出来ません。
また、生粋の面倒臭がり屋な彼(いつも プログラマの三大美徳を言い訳にしている)は
:{map-modes}<Key>でいちいち調べるのを嫌がっているようでした。

DRYはプログラマの基本だろ」
そうですか。

「あれ、prefixキーを押したらなんか表示される」
どうやら記憶を失う前の彼は素晴しいプラグインを入れていたみたいですね。

https://github.com/folke/which-key.nvim
このプラグインを入れると自動でキー入力に対する操作を表示してくれるようになります。
neo vimのpluginなのでご注意ください。

このようにキーを押すと表示してくれます。

また、さらにprefixキーを押すとprefixキーの先の操作まで表示してくれます。
控え目にいってかなり便利です。(画像がやたら小さいけど、許せサスケ)

呼び出し元がわかるverboseで設定ファイルの場所を思いだそう

「うひょー、cocを使ったらほとんどIDEだし、fzf-previewがあったら簡単にファイルを開き放題だ」
どうやら便利pluginのおかげで操作が捗っているようですね。
これでデスマーチも無事に乗りきれるかもしれません。

「あれ、このキーを押した時の操作。挙動が変だぞ…」
おっと、早速躓いたようですね。人生そう楽ではありません。

「つらい」
ごめん。

こんな時は:verboseという便利なコマンドを使いましょう。
これはコマンドが設定されているvim scriptファイルを表示してくれるコマンドです。(:h verbose-cmd )

:verbose nnoremap <Leader>d

例えば今回のように特定のキーがわかっている場合は、このように入力します。

n  <Space>dG   * <Cmd>lua require'dap'.run_last()<CR>
	最後にセットしたスクリプト: ~/.config/nvim/_config/156-nvim-dap.vim line 47
n  <Space>dg   * <Cmd>lua require'dap'.run()<CR>
	最後にセットしたスクリプト: ~/.config/nvim/_config/156-nvim-dap.vim line 47
n  <Space>dl   * <Cmd>lua require'dap'.load_launchjs()<CR>
	最後にセットしたスクリプト: ~/.config/nvim/_config/156-nvim-dap.vim line 47
n  <Space>dB   * <Cmd>lua require'dap'.set_breakpoint(vim.fn.input('Breakpoint condition: '))<CR>
	最後にセットしたスクリプト: ~/.config/nvim/_config/156-nvim-dap.vim line 47
n  <Space>dR   * <Cmd>lua require'dap'.repl.open()<CR>
	最後にセットしたスクリプト: ~/.config/nvim/_config/156-nvim-dap.vim line 47
n  <Space>do   * <Cmd>lua require'dap'.step_out()<CR>
	最後にセットしたスクリプト: ~/.config/nvim/_config/156-nvim-dap.vim line 47
n  <Space>di   * <Cmd>lua require'dap'.step_into()<CR>
	最後にセットしたスクリプト: ~/.config/nvim/_config/156-nvim-dap.vim line 47
n  <Space>dn   * <Cmd>lua require'dap'.step_over()<CR>
	最後にセットしたスクリプト: ~/.config/nvim/_config/156-nvim-dap.vim line 47
n  <Space>dc   * <Cmd>lua require'dap'.continue()<CR>
	最後にセットしたスクリプト: ~/.config/nvim/_config/156-nvim-dap.vim line 47
n  <Space>db   * <Cmd>lua require'dap'.toggle_breakpoint()<CR>
	最後にセットしたスクリプト: ~/.config/nvim/_config/156-nvim-dap.vim line 47
n  <Space>d<Esc> * <Cmd>lua require'dap'.stop()<CR>
	最後にセットしたスクリプト: ~/.config/nvim/_config/156-nvim-dap.vim line 47

するとこのように表示されます。最後にセットしたスクリプトと表示されている箇所がキーを設定した場所です。
この場所を見るとおのずと設定が確認出来そうですね。

ちなみにこのコマンドは割と汎用的に使用出来て、:autocmd:function:commandなどにも使用出来ます。
つまりvimで設定されているあらゆるものの場所が分る訳ですね。 便利すぎる。

Captureで出力結果を簡単に操作しよう

「けど、:verboseで表示してもコピペ出来ないんじゃ意味ないんだよなー」
そう、koutarnも気づいたようですが:verbose等のコマンドラインの表示結果は
バッファ領域(vimで編集出来る領域)に表示される訳ではないのでコピペ等が出来ません。

「さすがにこれを手打ちはなー。なんとか出来ない?」
出来ます。

https://github.com/tyru/capture.vim
そんな時はこのcapture.vimを使用しましょう。
使用方法は簡単。:Capture hogehogeと打つだけでバッファ領域にコマンドの出力結果を吐きだしてくれます。

:Capture verbose nnoremap <Leader>d

こうする事によってスクリプトの場所をコピー出来るようになりました。
またバッファ領域に書きこまれるだけなので見やすくするために編集も簡単に出来ます。

レジスタはむしろ思いださなくて良い。

「あー、またこの操作ミスったよ。どのレジスタに元のテキストが入っていたか思いだせない」
「たしか、:regで確認出来たからこれを見ながら作業するか。けど面倒だな」
レジスタはvimの素晴しい機能の一つですが、どのレジスタに何が格納されているのかを思い出すのが手間ですよね。"を押した時点で表示してくれたらなと思った事はありませんか?
実はそんなpluginがあります。

https://github.com/tversteeg/registers.nvim
neovim限定ですがこのregisters.nvimを使用すると
"を押した時(インサートモードなら<C-r>)に
レジスタに格納されているテキストの一覧を表示してくれます。
これがあると扱いづらく感じていたレジスタが数倍扱いやすくなります。マジでおすすめです。


ちなみに油断しているとアレな文字が表示されます。

おわりに

これで作業中に記憶喪失になってもvimで快適に作業が出来る事がわかりましたね。
みなさんもデスマーチと記憶喪失には十分ご注意ください。

それではさようなら。

Discussion

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