Open26

My Vim Customize Scraps

ピン留めされたアイテム
Takanori KishikawaTakanori Kishikawa
  "         __   _(_)_ __ ___   
  "         \ \ / / | '_ ` _ \
  "          \ V /| | | | | | |
  "         (_)_/ |_|_| |_| |_|

Linux上での作業中に必要な時に Vim 立ち上げるくらいの経験しかない初心者なりにカスタマイズをそれぞれメモっていく用のスクラップ。

運用基準

  • 目的別にスレッド分ける。
  • スレ頭には、「タイトル」とスレッド全体を通したそのカスタマイズに対する所感などの「まとめ」。
  • レスにはただの雑記を。
  • 最近ホットなのはピン止め。

環境

主に、 Windows と Linux 。だけど主に業務の都合上 Windows 多め。

ピン留めされたアイテム
Takanori KishikawaTakanori Kishikawa

denops.vim で Plugin 作る

deno をバックエンドに、Vimのプラグインを走らせるプラグイン denops.vim を使用してプラグインを実装する。
deno のパッケージマネージメントを利用できる事と、TypeScriptで書けることが強み(!)。

公式ドキュメント

基本的にはこれ読んどけば良い。

Takanori KishikawaTakanori Kishikawa

基本形

基本スケルトン。

import { Denops } from "https://deno.land/x/denops_std@v1.0.0/mod.ts";

export async function hello(denops: Denops): Promise<void> {
  denops.dispatcher = {
    async hello_world(): Promise<void> {
      // 実行スクリプト
    },
  };
};

基本的 - コマンド実装

コマンド化する場合は、 await execute に渡し、その中のコマンド実行で実装した関数にリクエストを投げる。

import { Denops } from "https://deno.land/x/denops_std@v1.0.0/mod.ts";
import { execute } from "https://deno.land/x/denops_std@v1.0.0/helper/mod.ts";

export async function hello(denops: Denops): Promise<void> {
  denops.dispatcher = {
    async hello_world(): Promise<void> {
      // 実行スクリプト
    },
  };

  await execute(
    denops,
    `command! -nargs=1 SayHello echomsg denops#request('${denops.name}', 'hello', [<q-args>])`
  );
};
Takanori KishikawaTakanori Kishikawa

トラブルシュート

なんか動かないなぁと思ったら、以下を調べる

denoがインストールされているか調べる

 :echo exepath('deno')

denops.vim 自体がインストールされているかを調べる

  • runtimepath のチェック
  • dein.vim のコンフィグをチェック(dein.vim を使っている場合)

denops.vim が正常に動作しているかチェック

デバッグを有効にする。

let g:denops#debug = 1

正常に動作していれば以下のようなログが流れる。

[denops] server started: ['deno', 'run', '-q', '--unstable', '-A', 'C:\Users\...\.cache\dein\.cache\.vimrc\.dein\denops\@denops-private\cli.ts', '--mode=vim']
[denops] connect to `127.0.0.1:55342`

上記ログは、

:mes

で表示される。

開発中のプラグインが見つからない

ランタイムパスを調べる

  • .vimrc で適切にパスを設定しているか?

開発中のプラグインがエラーを起こす

  1. スケルトンでライブラリ自体をチェック
  2. main.ts のエラーをチェック
  3. main.ts で、正しく宣言されているかをチェック
  4. プラグイン内部のエラーをチェック
Takanori KishikawaTakanori Kishikawa

Plugin Manager: 導入

まとめ

  • とりあえず dein.vim から初めても問題なさげ。
  • toml 管理は良い。
  • 視覚的なプロセスアウトプットほしい場合は vim-plug かな。
Takanori KishikawaTakanori Kishikawa

dein.vim を使う

いくつ調べてみて、日本語だと dein.vim の記事をよく見かけたのでそれを入れてみる。

Install & Setup

以下のスクリプトがやってくれること、

  1. dein.vim 自体のインストール (未インストールの場合)。
  2. .dein.toml のプラグインリストを読み取り。
  3. .dein.tomlの読み取り結果を元に s:dein_dir にインストール。
  4. 省かれたプラグインがないかをチェックして、削除。
" dein.vim settings {{{
let s:dein_dir = expand('~/.cache/dein')
let s:dein_repo_dir = s:dein_dir . '/repos/github.com/Shougo/dein.vim'
" }}}

"dein installation check {{{
if $runtimepath !~# '/dein.vim'
	if !isdirectory(s:dein_repo_dir)
		execute '!git clone https://github.com/Shougo/dein.vim' s:dein_repo_dir
	endif
	execute 'set runtimepath^=' . s:dein_repo_dir
endif
" }}}

" begin settings {{{
if dein#load_state(s:dein_dir)
	call dein#begin(s:dein_dir)

	" .toml file
	let s:rc_dir = expand('~')
	if !isdirectory(s:rc_dir)
		call mkdir(s:rc_dir, 'p')
	endif
	let s:toml = s:rc_dir . '/.dein.toml'

	" read toml and cache
	call dein#load_toml(s:toml, {'lazy': 0})

	" end settings
 	call dein#end()
	call dein#save_state()
endif
" }}}}
 
" plugin installation check {{{
if dein#check_install()
	call dein#install()
endif
" }}}

" plugin remove check {{{
let s:removed_plugins = dein#check_clean()
if len(s:removed_plugins) > 0
	call map(s:removed_plugins, "delete(v:val, 'rf')")
	call dein#recache_runtimepath()
endif
" }}}

Tips

特定のプラグインをアップデートしたい

まず、.vimrc 上で、GitHub のトークンをグローバル変数に設定しておく。

let g:dein#install_github_api_token = 'your token'

プラグインのアップデート

" 全体をアップデート
:call dein#check_update(v:true)

" 特定のプラグインだけアップデートしたい時
:call dein#ehck_update(v:true, ['dein.vim'])

所感

[Pro]

  • いわれている様に特に表示もなく、裏でやっていて更新も速い。
  • tomlでの管理がすごく楽。(.vimrc やスクリプトファイル上に書き込むのは気持ち悪い)

[Con]

  • 何をインストールしようとしているのかが見えないので、ちゃんと更新されているのかなどが不安。

References

Takanori KishikawaTakanori Kishikawa

vim-plug を使う

所感

[Pro]

  • 何がインストール済みで、今何をインストールしようとしているのかが表示されるので、分かりやすい。

[Con]

  • インストールの仕方が、別のスクリプトをたたいててちょっと気持ち悪い。
    • 専用でインストールコマンドをたたかなければいけないので、新の環境で再現しようとする際にめんどくさくなりそう。
Takanori KishikawaTakanori Kishikawa

Auto Complete: 導入

要件

  • 対応したい言語
    • Python (特に)
    • Rust (特に)
    • C++ (特に)
    • TypeScript
    • JavaScript
    • HTML
    • CSS
    • SCSS
    • C#

まとめ

Takanori KishikawaTakanori Kishikawa

Auto Complete: asyncomplete.vim

以下セットで使うのがベスト。

  1. prabirshrestha/vim-lsp
  2. mattn/vim-lsp-settings
  3. prabirshrestha/asyncomplete.vim
  4. prabirshrestha/asyncomplete-lsp.vim

所感

[Pro]

  • インストール超楽で設定もほとんどなくて、最短でほしいところまでもっていってくれる。
    • とりあえず Python 用だったらこれインストールしてればいいんじゃなかろうか。
  • デフォルトでも、サポート対象の言語はイイカンジに補完してくれる。

[Con]

  • インストールは簡単だが、細かいソース管理が将来的に混乱しそう。
Takanori KishikawaTakanori Kishikawa

Plugin 漁り

[Required for me]

  • Shougo/dein.vim
  • nathanaelkane/vim-indent-guides
  • jiangmiao/auto-pairs
  • scrooloose/syntatic
  • junegunn/fzf
  • junegunn/fzf.vim
  • yuki-yano/fzf-preview.vim
  • vim-denops/denops.vim
  • scrooloose/nerdtree
  • sheerun/vim-polyglot
  • prettier/vim-prettier
  • prabirshrestha/vim-lsp
  • mattn/vim-lsp-settings
  • prabirshrestha/asyncomplete.vim
  • prabirshrestha/asyncomplete-lsp.vim
  • keremc/asyncomplete-clang.vim
  • scrooloose/nerdcommenter
  • terryma/vim-expand-region
  • violetyk/iikanji-markdown.vim
  • kana/vim-operator-user
  • rhysd/vim-operator-surround

[Good]

  • itchyny/calendar.vim
  • junegunn/goyo.vim
  • tyru/open-browser.vim
  • LeafCage/vimhelpgenerator
  • terryma/vim-multiple-cursors

[Not My Taste]

Takanori KishikawaTakanori Kishikawa

Vimscript で Plugin 作る

公式ドキュメント

:h usr_41

Rerferences

Takanori KishikawaTakanori Kishikawa

プラグインを作る時の配置場所

packages 機能を使う

packages について

とりあえずヘルプを見る。

:help packages

ヘルプを読むと、

~/.vim/pack/foo

といった感じに作ればいいっぽい。

packpath を使う

packpath について

ヘルプ

:help packpath

現在の packpath の設定をみる

:set packpath?

すると、次の結果が返ってくる。

packpath=~/vimfiles,C:\Program Files (x86)\Vim/vimfiles,C:\Program Files (x86)\Vim\vim82,C:\Program Files (x86)\Vim/vimfiles/after,~/vimfiles/after

デフォルトでは、runtimepath と同じものが返ってくる。
ここに配置しても同様にどうさする。

packages と packpath の両方が存在しているのちょっとややこしい。

Takanori KishikawaTakanori Kishikawa

キーマッピング

Takanori KishikawaTakanori Kishikawa

タブの遷移をキーマッピングしてみる

以下の設定をすることで、

" Tab
map <C-T>l :tabnext<cr>
map <C-T>h :tabprevious<cr>
map <C-T>n :tabnew<cr>
map <C-T>c :tabclose<cr>
  • Ctr+T -> l で次のタブへ
  • Ctr+T -> h で前のタブへ
  • Ctr+T -> n で新しいタブを作成
  • Ctr+T -> c でタブを閉じる

といった操作を組める。
特に、タブの遷移に関しては直感的ではなかろうか。

インサートモードで実装する際には、

map <C-T>l <ESC>:tabnext<cr>

という風にできるが、明示的に「タブ操作はノーマルモード戻って操作すべき」という観点から、こちらは適応しなかった。

Takanori KishikawaTakanori Kishikawa

map コマンドパターン

コマンド/モード-> Norm Ins Cmd Vis Sel Opr Term Lang
[nore]map yes - - yes yes yes - -
n[nore]map yes - - - - - - -
[nore]map! - yes yes - - - - -
i[nore]map - yes - - - - - -
c[nore]map - - yes - - - - -
v[nore]map - - - yes yes - - -
x[nore]map - - - yes - - - -
s[nore]map - - - - yes - - -
o[nore]map - - - - - yes - -
t[nore]map - - - - - - yes -
l[nore]map - yes yes - - - - yes

References

Takanori KishikawaTakanori Kishikawa

Vim Troubleshoot

Vim関連でトラブルが発生した際の解決・回避方法をまとめる。

Takanori KishikawaTakanori Kishikawa

ランタイムログをとる

Vim 起動時

なんかエラー吐いてるな…と表示されている様だったら、起動時に次のオプションを指定して起動する。
以下は、 <file_name> というファイル名でランタイムログを出力してくれる。

vim -V<verbose_level><file_name>

vim -V9LogFile

Vim 起動中

またこの設定は、以下のコマンドでも設定可能。

:verbose 

Verbose

先の -V99 は Verbose のログレベル。これを0より大きい数字にすることで特定の Verbose レベルでログを吐き出す。

レベル 説明
1以上 ファイル viminfo が読み書きされたとき。
2以上 コマンド ":source" でファイルを読み込んだとき。
4以上 シェルコマンド。
5以上 検索されたタグファイルとインクルードファイル全て。
8以上 autocommand のグループが実行されたファイル。
9以上 実行された autocommand 全て。
11以上 パス上のアイテム検索。
12以上 実行された関数全て。
13以上 例外が発生/捕捉/終了/破棄されたとき。
14以上 ":finally" 節において保留されている全て。
15以上 スクリプトから実行された Ex コマンド全て (200 文字から後は切り捨て)。
16以上 実行された Ex コマンド全て

References

Takanori KishikawaTakanori Kishikawa

Plugin Manger: dein.vim

dein.vim のカスタマイズ関連をまとめていく。

Takanori KishikawaTakanori Kishikawa

vimscript / TOML 設定比較

vimscript

call dein#add('junegunn/fzf', { 'build': './install --all', 'merged': 0 })
call dein#add('yuki-yano/fzf-preview.vim', { 'rev': 'release/rpc' })
call dein#add('easymotion/vim-easymotion')

 map mj <Plug>(easy_motion-bd-w)
 nmap mj <Plug>(easymotion-overwin-w)
 map ml <Plug>(easymotion-bd-jk)
 nmap ml <Plug>(easymotion-overwin-line)
 map mk <Plug>(easymotion-bd-f)
 nmap mk <Plug>(easymotion-verwin-f)

TOML

[[plugins]]
repo = 'junegunn/fzf'
build = './install --all'
merged = 0

[[plugins]]
repo = 'yuki-yano/fzf-preview.vim'
rev = 'release/rpc'

[[plugins]]
repo = 'easymotion/vim-easymotion'
 hook_add = '''
 map mj <Plug>(easy_motion-bd-w)
 nmap mj <Plug>(easymotion-overwin-w)
 map ml <Plug>(easymotion-bd-jk)
 nmap ml <Plug>(easymotion-overwin-line)
 map mk <Plug>(easymotion-bd-f)
 nmap mk <Plug>(easymotion-verwin-f)
'''

TOML の補足

  • [[plugins]]
    • プラグインロード時に dein#add() に変換される。
  • repo
    • 必須 キー
  • hook_add
    • dein#end() 時に呼ばれる。キーマッピングなどのプラグイン設定を .vimrc でやるより、ここに追加することで、プラグインの設定も一緒に管理できる。