My Vim Customize Scraps
" __ _(_)_ __ ___
" \ \ / / | '_ ` _ \
" \ V /| | | | | | |
" (_)_/ |_|_| |_| |_|
Linux上での作業中に必要な時に Vim 立ち上げるくらいの経験しかない初心者なりにカスタマイズをそれぞれメモっていく用のスクラップ。
運用基準
- 目的別にスレッド分ける。
- スレ頭には、「タイトル」とスレッド全体を通したそのカスタマイズに対する所感などの「まとめ」。
- レスにはただの雑記を。
- 最近ホットなのはピン止め。
環境
主に、 Windows と Linux 。だけど主に業務の都合上 Windows 多め。
denops.vim で Plugin 作る
deno をバックエンドに、Vimのプラグインを走らせるプラグイン denops.vim を使用してプラグインを実装する。
deno のパッケージマネージメントを利用できる事と、TypeScriptで書けることが強み(!)。
公式ドキュメント
基本的にはこれ読んどけば良い。
基本形
基本スケルトン。
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>])`
);
};
トラブルシュート
なんか動かないなぁと思ったら、以下を調べる
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 で適切にパスを設定しているか?
開発中のプラグインがエラーを起こす
- スケルトンでライブラリ自体をチェック
- main.ts のエラーをチェック
- main.ts で、正しく宣言されているかをチェック
- プラグイン内部のエラーをチェック
Settings: .vimrc
全体は、 GitHub レポにまとめているので、そっち参照。
.vimrc 編集して、構文エラーとかスクリプトエラー起きるようにしてしまうと、処理自体は止まらないが、次回 Vim 起動時にキー入力待ちの待機が表示される様になる。
問題部分を直して保存すれば復帰可能。
Plugin Manager: 導入
まとめ
- とりあえず dein.vim から初めても問題なさげ。
- toml 管理は良い。
- 視覚的なプロセスアウトプットほしい場合は vim-plug かな。
dein.vim を使う
いくつ調べてみて、日本語だと dein.vim の記事をよく見かけたのでそれを入れてみる。
Install & Setup
以下のスクリプトがやってくれること、
- dein.vim 自体のインストール (未インストールの場合)。
- .dein.toml のプラグインリストを読み取り。
- .dein.tomlの読み取り結果を元に
s:dein_dir
にインストール。 - 省かれたプラグインがないかをチェックして、削除。
" 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
vim-plug を使う
所感
[Pro]
- 何がインストール済みで、今何をインストールしようとしているのかが表示されるので、分かりやすい。
[Con]
- インストールの仕方が、別のスクリプトをたたいててちょっと気持ち悪い。
- 専用でインストールコマンドをたたかなければいけないので、新の環境で再現しようとする際にめんどくさくなりそう。
Auto Complete: 導入
要件
- 対応したい言語
- Python (特に)
- Rust (特に)
- C++ (特に)
- TypeScript
- JavaScript
- HTML
- CSS
- SCSS
- C#
まとめ
asyncomplete.vim
Auto Complete:以下セットで使うのがベスト。
- prabirshrestha/vim-lsp
- mattn/vim-lsp-settings
- prabirshrestha/asyncomplete.vim
- prabirshrestha/asyncomplete-lsp.vim
所感
[Pro]
- インストール超楽で設定もほとんどなくて、最短でほしいところまでもっていってくれる。
- とりあえず Python 用だったらこれインストールしてればいいんじゃなかろうか。
- デフォルトでも、サポート対象の言語はイイカンジに補完してくれる。
[Con]
- インストールは簡単だが、細かいソース管理が将来的に混乱しそう。
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]
itchyny/calendar.vim
Vim上でカレンダー表示をしてれるプラグイン。
面白いと思ったのは、開発者の記事にもあるとおり、Vim 上でアプリケーションのGUIプロセスをラップしてアプリケーション化してるところ。
自前でGUIアプリケーションを作る時の参考にできるかも?という意味でも Pick Up したい一つ。
jiangmiao/auto-pairs
"
や [
と打った際に、補完して ""
や []
とペアとなる文字列を自動入力して入れ子にしてくれるプラグイン。
プラグインを作る時の配置場所
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 の両方が存在しているのちょっとややこしい。
キーマッピング
タブの遷移をキーマッピングしてみる
以下の設定をすることで、
" 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>
という風にできるが、明示的に「タブ操作はノーマルモード戻って操作すべき」という観点から、こちらは適応しなかった。
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
Vim Troubleshoot
Vim関連でトラブルが発生した際の解決・回避方法をまとめる。
ランタイムログをとる
Vim 起動時
なんかエラー吐いてるな…と表示されている様だったら、起動時に次のオプションを指定して起動する。
以下は、 <file_name>
というファイル名でランタイムログを出力してくれる。
vim -V<verbose_level><file_name>
vim -V9LogFile
Vim 起動中
またこの設定は、以下のコマンドでも設定可能。
:verbose
Verbose
先の -V9
の 9
は Verbose のログレベル。これを0より大きい数字にすることで特定の Verbose レベルでログを吐き出す。
レベル | 説明 |
---|---|
1以上 | ファイル viminfo が読み書きされたとき。 |
2以上 | コマンド ":source" でファイルを読み込んだとき。 |
4以上 | シェルコマンド。 |
5以上 | 検索されたタグファイルとインクルードファイル全て。 |
8以上 | autocommand のグループが実行されたファイル。 |
9以上 | 実行された autocommand 全て。 |
11以上 | パス上のアイテム検索。 |
12以上 | 実行された関数全て。 |
13以上 | 例外が発生/捕捉/終了/破棄されたとき。 |
14以上 | ":finally" 節において保留されている全て。 |
15以上 | スクリプトから実行された Ex コマンド全て (200 文字から後は切り捨て)。 |
16以上 | 実行された Ex コマンド全て |
References
Plugin Manger: dein.vim
dein.vim のカスタマイズ関連をまとめていく。
基本的な書き方
[[plugins]]
repo = 'Shougo/dein.vim'
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 でやるより、ここに追加することで、プラグインの設定も一緒に管理できる。
-