Skip to content

Instantly share code, notes, and snippets.

@daisuzu
Created April 18, 2019 10:55
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save daisuzu/e05918f7552138e53b55bb554e819369 to your computer and use it in GitHub Desktop.
Save daisuzu/e05918f7552138e53b55bb554e819369 to your computer and use it in GitHub Desktop.
ゴリラ.vim #3

Vimの動作を調べる

ゴリラ.vim #3

自己紹介

daisuzu(@dice_zu)

  • VimConfに登壇したり、

    • 2017: How ordinary Vim user contributed to Vim
    • 2018: Migrating plugins to standard features
  • ゴリラ.vimの運営だったり、

  • ゴリラ.vimで発表したり、

    • #1: Vimと外部コマンド
    • #3: Vimの動作を調べる(🆕)
  • 普段はVimでGoを書いている

どういう時にVimの動作を調べたくなる?

  • 起動時間が遅い
  • 何がかおかしい
  • Vimをマスターしたい!

起動時間を測定する

|--startuptime|オプションをつけてVimを起動すると、
指定したファイルに経過時間や処理内容が出力される。
times in msec
 clock   self+sourced   self:  sourced script
 clock   elapsed:              other lines

000.016  000.016: --- VIM STARTING ---

~~~~~~~~~~~~~~~~~~~~~ 略 ~~~~~~~~~~~~~~~~~~~~~

101.727  000.002: --- VIM STARTED ---

個別にプロファイルを取る

詳細は|profile|参照
" 例
:profile start profile.log
:profile! file */tree.vim
:Tree
:qa  " Vimを終了しないと結果が出力されない

Exコマンドの詳細を表示する

:[count]verb[ose] {command}

count

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

Vim scriptをデバッグする

:debug {command}
" 例
function! Hoge()
  let s = 'h'
  let s .= 'o'
  let s .= 'g'
  let s .= 'e'
  return s
endfunction

Vim本体をデバッグする

ujihisaさんの記事スライドに詳しく書いてある。

# デバッグ用にビルドする
# ./configureは省略
CFLAGS=-ggdb3 STRIP=$(which true) make

termdebugを使うと便利。

:packadd termdebug
:Termdebug ./src/vim

ただ、MacでGDBを使えるようにするのはちょっと面倒... (参考: MojaveでGDB 8.3を使う)

カバレッジからあたりをつける

元ネタはVim Advent Calendar 2017の2日目の記事

必要なもの:

  • lcov
  • カバレッジ用にビルドしたVim
# ./configureは省略
CFLAGS=--coverage LDFLAGS=--coverage make

1. 初期データを作る

# まずはゼロカバレッジの初期データを作る
cd ./src
lcov -c -i -b . -d objects -o objects/coverage_base.info

2. 比較用のデータを作る

# Vimを起動して即終了する
VIMRUNTIME=../runtime ./vim --clean -c 'q'

# ↑のカバレッジデータを作る
lcov -c -b . -d objects/ -o objects/coverage_quit.info
lcov -a objects/coverage_base.info \
     -a objects/coverage_quit.info \
     -o objects/coverage_baseline.info

# カバレッジをリセットしておく
lcov -z -d objects/

3. 確認したい操作を追加したデータを作る

# smileコマンドを追加
VIMRUNTIME=../runtime ./vim --clean -c 'smile | q'

# ↑のカバレッジデータを作る
lcov -c -b . -d objects/ -o objects/coverage_smile.info
lcov -a objects/coverage_base.info \
     -a objects/coverage_smile.info \
     -o objects/coverage_result.info

4. 差分をHTMLとして出力する

# genhtmlコマンドに-b(--baseline-file)オプションをつける
genhtml -b objects/coverage_baseline.info \
    objects/coverage_result.info -o objects
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment