月別アーカイブ: 2016年11月

【解決済】Windows で vimtex 使ってたら main を見つけてくれなくなった話

vimtex いい。ところが、プラグインをアップデートしたら Windows 環境で main を見つけてくれなくなってしまった。それまではできていたはずなのに・・・

調べてみたら、以下のコミットが原因。
https://github.com/lervag/vimtex/commit/68e6e3b27a04b518d64a9d67c4d987cedf80ff85

let l:file = matchstr(l:line,
      \ '\v\\%(input|include|subimport\{[^\}]*\})\s*\{\zs\f+')

windows 環境下だと、isfname に { や } が含まれているので } が正規表現にマッチしてしまうのが理由。
正規表現の最後に } を書いてくれればそれで良いのだけど、調べてみると以下の記述を発見。

                                                           vimtex-faq-isfname
Q: Vim throws error when jumping to file with gf.
A: This might be due to the isfname setting, which by default contains {,}
   on windows.  isfname is a global option, and can therefore not be set by
   vimtex.  Suggested solution is to remove {,} from isfname by:

  set isfname-={,}

ということで、 .vimrc に追記した。

"" lervag/vimtex
let g:vimtex_latexmk_continuous = 1
let g:vimtex_latexmk_background = 1
"let g:vimtex_latexmk_options = '-pdf'
let g:vimtex_latexmk_options = '-pdfdvi'
"let g:vimtex_latexmk_options = '-pdfps'
if (has('win32') || has('win64') || has('win32unix'))
  set isfname-={,}
  let g:vimtex_view_general_viewer = 'SumatraPDF'
  let g:vimtex_view_general_options
        \ = '-reuse-instance -forward-search @tex @line @pdf'
  let g:vimtex_view_general_options_latexmk = '-reuse-instance'
elseif (has('mac'))
  let g:vimtex_view_general_viewer
        \ = '/Applications/Skim.app/Contents/SharedSupport/displayline'
  let g:vimtex_view_general_options = '-r @line @pdf @tex'

  " This adds a callback hook that updates Skim after compilation
  let g:vimtex_latexmk_callback_hooks = ['UpdateSkim']
  function! UpdateSkim(status)
    if !a:status | return | endif

    let l:out = b:vimtex.out()
    let l:tex = expand('%:p')
    let l:cmd = [g:vimtex_view_general_viewer, '-r']
    if !empty(system('pgrep Skim'))
      call extend(l:cmd, ['-g'])
    endif
    if has('nvim')
      call jobstart(l:cmd + [line('.'), l:out, l:tex])
    elseif has('job')
      call job_start(l:cmd + [line('.'), l:out, l:tex])
    else
      call system(join(l:cmd + [line('.'), shellescape(l:out), shellescape(l:tex)], ' '))
    endif
  endfunction
endif
if (!has('clientserver'))
  let g:vimtex_latexmk_callback = 0
endif

いつの間にか perf tool で複数イベントを調べるときにイベントごとの period や freq 指定がサポートされてる話

Linux でパフォーマンスカウンタの値を取得するために便利な perf tool

perf record のヘルプを見ると、

-e, --event=
  Select the PMU event. Selection can be:

  . a symbolic event name (use perf list to list all events)

  . a raw PMU event (eventsel+umask) in the form of rNNN where
    NNN is a hexadecimal event descriptor.

  . a symbolically formed PMU event like pmu/param1=0x3,param2/
    where param1, param2, etc are defined as formats for the PMU
    in /sys/bus/event_source/devices/<pmu>/format/*.

  . a symbolically formed event like
    pmu/config=M,config1=N,config3=K/

    where M, N, K are numbers (in decimal, hex, octal format). Acceptable
    values for each of 'config', 'config1' and 'config2' are defined by
    corresponding entries in /sys/bus/event_source/devices/<pmu>/format/*
    param1 and param2 are defined as formats for the PMU in:
    /sys/bus/event_source/devices/<pmu>/format/*

    There are also some params which are not defined in .../<pmu>/format/*.
    These params can be used to overload default config values per event.
    Here is a list of the params.
    - 'period': Set event sampling period
    - 'freq': Set event sampling frequency
    - 'time': Disable/enable time stamping. Acceptable values are 1 for
              enabling time stamping. 0 for disabling time stamping.
              The default is 1.
    - 'call-graph': Disable/enable callgraph. Acceptable str are "fp" for
                   FP mode, "dwarf" for DWARF mode, "lbr" for LBR mode and
                   "no" for disable callgraph.
    - 'stack-size': user stack size for dwarf mode
    Note: If user explicitly sets options which conflict with the params,
    the value set by the params will be overridden.

    Also not defined in .../<pmu>/format/* are PMU driver specific
    configuration parameters.  Any configuration parameter preceded by
    the letter '@' is not interpreted in user space and sent down directly
    to the PMU driver.  For example:

    perf record -e some_event/@cfg1,@cfg2=config/ ...

    will see 'cfg1' and 'cfg2=config' pushed to the PMU driver associated
    with the event for further processing.  There is no restriction on
    what the configuration parameters are, as long as their semantic is
    understood and supported by the PMU driver.

ってなってて、イベントごとに config を書けるようになってる。

具体的には、以下のようにすれば OK。

$ perf record \
    -e cpu/cpu-cycles,period=100000/ \
    -e cpu/cache-misses,period=100/ \
    -- openssl speed rsa512

どのバージョンから使えるようになったのかはわかっていないけど、個人的には待望の機能なのでとてもありがたい。

Windows の gVim で set shellslash してるときに editorconfig-vim を使うと設定のロードに失敗する話

editorconfig って、考え方がいいと思う。エディタ横断、協働を助ける。
プロジェクトに関わっている人がそれぞれの心地よい道具を使いながら、必要な部分を必要なだけすり合わせるというのが素晴らしい。

vimtex を使うためには set shellslash する必要があるんだけど、すると editorconfig-vim をロードするときにエラーが出る。
いろいろ調べた結果、editorconfig-vim\plugin\editorconfig.vim が原因だった。
現状は以下のようにするとエラーを回避することができる。

function! s:UseConfigFiles_Python_External() " {{{2
" Use external python interp to run the python EditorConfig Core

""" I added from HERE """
if has('win32') && empty(matchstr(&shell, 'sh'))
let l:old_shellslash = &l:shellslash
setlocal noshellslash
endif
""" I added to HERE """

let l:cmd = shellescape(s:editorconfig_python_interp) . ' ' .
\ shellescape(s:editorconfig_core_py_dir . '/main.py')

""" I added from HERE """
" restore 'shellslash'
if exists('l:old_shellslash')
let &l:shellslash = l:old_shellslash
endif
""" I added to HERE """

call s:SpawnExternalParser(l:cmd)

return 0
endfunction

Windows 10 で gVim + vimtex + SumatraPDF で快適 TeX 執筆環境を作る

Mac で MacVim + vimtex + skim は比較的簡単なんだけど、 Windows で gVim + vimtex + SumatraPDF はちょっと大変だった。

嵌りポイントは、.vimrc で

set shellslash

するところと、
:h vimtex

して見れる、inverse search に関する設定の部分、
let g:vimtex_view_general_viewer = 'SumatraPDF -reuse-instance '
    \ . '-inverse-search "gvim --servername ' . v:servername
    \ . ' --remote-send \"^<C-\^>^<C-n^>'
    \ . ':drop \%f^<CR^>:\%l^<CR^>:normal\! zzzv^<CR^>'
    \ . ':execute ''drop '' . fnameescape(''\%f'')^<CR^>'
    \ . ':\%l^<CR^>:normal\! zzzv^<CR^>'
    \ . ':call remote_foreground('''.v:servername.''')^<CR^>\""'

が罠で、(少なくとも Windows では)効かなくて、 SumatraPDF の設定に

と書いておくとうまく言うというところ(gvim のパスは適宜読み替えること)。

というわけで、現在の vimtex 関連の設定(.vimrc)はこんな感じ。
(関連:【解決済】windows で vimtex 使ってたら main を見つけてくれなくなった話

"" lervag/vimtex
let g:vimtex_latexmk_continuous = 1
let g:vimtex_latexmk_background = 1
"let g:vimtex_latexmk_options = '-pdf'
let g:vimtex_latexmk_options = '-pdfdvi'
"let g:vimtex_latexmk_options = '-pdfps'
if (has('win32') || has('win64') || has('win32unix'))
  let g:vimtex_view_general_viewer = 'SumatraPDF'
  let g:vimtex_view_general_options
        \ = '-reuse-instance -forward-search @tex @line @pdf'
  let g:vimtex_view_general_options_latexmk = '-reuse-instance'
elseif (has('mac'))
  let g:vimtex_view_general_viewer
        \ = '/Applications/Skim.app/Contents/SharedSupport/displayline'
  let g:vimtex_view_general_options = '-r @line @pdf @tex'

  " This adds a callback hook that updates Skim after compilation
  let g:vimtex_latexmk_callback_hooks = ['UpdateSkim']
  function! UpdateSkim(status)
    if !a:status | return | endif

    let l:out = b:vimtex.out()
    let l:tex = expand('%:p')
    let l:cmd = [g:vimtex_view_general_viewer, '-r']
    if !empty(system('pgrep Skim'))
      call extend(l:cmd, ['-g'])
    endif
    if has('nvim')
      call jobstart(l:cmd + [line('.'), l:out, l:tex])
    elseif has('job')
      call job_start(l:cmd + [line('.'), l:out, l:tex])
    else
      call system(join(l:cmd
        \ + [line('.'), shellescape(l:out), shellescape(l:tex)], ' '))
    endif
  endfunction
endif
if (!has('clientserver'))
  let g:vimtex_latexmk_callback = 0
endif