basyura's blog

あしたになったらほんきだす。

Vim-Plug

いままで任意のフォルダ配下を全読みするように runtimepath を設定していたけど vim-plug を使うようにしてみた。ついでに vimrc の大掃除をしてみたけど思ったほど消えない。plugin ごとに設定ファイルを分けるようには元々していたので

if !has_key(g:plugs, 'asyncomplete.vim')
  finish
end

のようにすれば plugin を使ってない場合に読み込まれないようにできたので便利。unite.vim の代替を探し始めてみたけど、unite.vim の plugin を含めて手に馴染みすぎて見つけられる気がしないので当分使う予定 (これも fork したちょっと古い版に手を入れたもの)。

asyncomplete.vim に乗り換えを試みる

ずっと neocomplete をfork して一部いじったものを使っていて、不満は無くはないけど使えてるのでまあいいかで今まで来たのだけど試しに乗り換えを試みてみる。第一候補の asyncomplete.vim を触ってみると autopopup はいいのだけど、enter 押したら第一候補を確定してほしいけどしてくれないとか、ポップアップメニューのチラツキが多いのが気になるとかあって久々に Vim script してみた。

inoremap <expr> <cr> pumvisible() ? <SID>decide() : "\<cr>"

function! s:decide()
  return "\<C-n>\<C-c>a"
endfunction

let s:min_chars = 2
let s:popup_delay = 200

augroup MyAllAsyncompleteStting
  autocmd!
  autocmd BufEnter *  call s:all_settings()
augroup END

let s:settings = {
  \ 'html' : {'min_chars': 2, 'popup_delay': 50},
\}

function! s:all_settings()
  let setting = {'min_chars': s:min_chars, 'popup_delay': s:popup_delay}
  if has_key(s:settings, &filetype)
    let setting = s:settings[&filetype]
  end

  let g:asyncomplete_min_chars = setting.min_chars
  let g:asyncomplete_popup_delay = setting.popup_delay
endfunction

let s:before = {'len': 0, 'word': ''}
function! s:my_asyncomplete_preprocessor(options, matches) abort
  let l:visited = {}
  let l:items = []
  for [l:source_name, l:matches] in items(a:matches)
    let l:startcol = l:matches['startcol']
    let l:base = a:options['typed'][l:startcol - 1:]
    for l:item in l:matches['items']
      for l:item in matchfuzzypos(l:matches['items'], l:base, {'key':'word'})[0]
        if has_key(l:visited, l:item.word)
          continue
        end
        call add(l:items, s:strip_pair_characters(l:base, l:item))
        let l:visited[l:item.word] = 1
      endfor
    endfor
  endfor

  if len(l:items) == 0
    call asyncomplete#preprocess_complete(a:options, l:items)
    let s:before = {'len': 0, 'word': ''}
    return
  end

  if s:before.len != len(l:items) && s:before.word != l:items[0].word
    call asyncomplete#preprocess_complete(a:options, l:items)
  endif

  let s:before = {'len': len(l:items), "word": l:items[0].word}
endfunction

let s:pair = {
\  '"':  '"',
\  '''':  '''',
\}
function! s:strip_pair_characters(base, item) abort
  " Strip pair characters. If pre-typed text is '"', candidates
  " should have '"' suffix.
  let l:item = a:item
  if has_key(s:pair, a:base[0])
    let [l:lhs, l:rhs, l:str] = [a:base[0], s:pair[a:base[0]], l:item['word']]
    if len(l:str) > 1 && l:str[0] ==# l:lhs && l:str[-1:] ==# l:rhs
      let l:item = extend({}, l:item)
      let l:item['word'] = l:str[:-2]
    endif
  endif
  return l:item
endfunction

let g:asyncomplete_preprocessor = [function('s:my_asyncomplete_preprocessor')]



call asyncomplete#register_source(asyncomplete#sources#buffer#get_source_options({
      \ 'name': 'buffer',
      \ 'allowlist': ['ruby', 'html'],
      \ 'blocklist': [],
      \ 'completor': function('asyncomplete#sources#buffer#completor'),
      \ 'config': {
        \    'max_buffer_size': 5000000,
        \  },
        \ }))

call asyncomplete#register_source(asyncomplete#sources#file#get_source_options({
      \ 'name': 'file',
      \ 'allowlist': ['*'],
      \ 'priority': 10,
      \ 'completor': function('asyncomplete#sources#file#completor')
      \ }))

call asyncomplete#register_source(asyncomplete#sources#neosnippet#get_source_options({
      \ 'name': 'neosnippet',
      \ 'allowlist': ['*'],
      \ 'blocklist': [],
      \ 'priority': 100,
      \ 'completor': function('asyncomplete#sources#neosnippet#completor'),
      \ }))

自分向けにいい感じなったとも言えるが・・・様子を見てみる。

VimConf 2017

f:id:basyura:20171105104254p:plain

VimConf 2017 - An international Vim Conference

勉強会やカンファレンスへの参加が久しぶり。さらに久々の TweetVimUserStream を発動。vimconf のタイムラインは vim で見る ( ー`дー´)キリッ 。通常のストリームに vimconf の検索結果をひっかけて表示。発言するときにはタグを最初から入れておく。便利だと思うんだけど使ってる僕ぐらいだと思われ。

:let g:tweetvim_appendix = " #vimconf2017"
:TweetVimUserStream vimconf

11 時ぐらいに一回 Vim を立ち上げなおして 15 時すぎに 2000 行に達したあたりで json の decode に失敗するエラーがでて vim を再起動。原因は・・・調べるのがだるかったのでスルー。デバッグ機能を入れるべきか。

Vim, Me and Community - haya14busa

プログラミング始めて 5 年でアウトプットしまくって某社に入るのすごい。見習いたい。 easymotion 便利という話はよく聞くけど使い方というか、どういうものなのか今までよく知らなかった (実は)。ちょっと触ってみようと思う。clever-f は分かりやすいから人気があるのかなと思った。

Diversity of Vim community - Type of Vim users の絵が良すぎてセンスを感じる。

The Past and Future of Vim-go - Fatih

go は 6 年ぐらいに前に勉強を始めてイイじゃん!と思ったものの、僕には ruby で事足りるわ・・・とうとうの事情により中断してそのままになってた。最近再開したので vim-go を使い始める。便利。Github で 7400 スターが付いていて donation が $200/月。これが多いと取るか少ないと取るかは人それぞれだと思うけど、ありがたく使わせてもらう。英語が聞き取りやすかった。

Talk show - mattn_jp, k_takata, kaoriya

  • mattn さんが服着てた。vim 2 から。
  • k_takata さんが 5 から。git を使い始めたらコミットメッセージが vim だったから
。

mattn さんが "死ぬまで patch を書く。他のエディタを使っているのは vim にフィードバックするため" と言ってたのはカッコよかったなぁ。

Creating your lovely color scheme - cocopon

人生の 1/3 が colorscheme の時間だった

vim-mode-plus: The most ambitious vim emulator in the world - t9md

  • すごいのは分かった。が、atom を使う日はとうぶん来そうになそう。来たら速攻入れたい。
  • 安心のこだわり感がある。

日頃、仕事で使っている Visual Studio では ViEmu を使っていて気になる所はあるものの概ね満足している状態では有るのだけど・・・Visual Studio でもうごかないかなぁ・・・せめて VsCode で、とは思う。

Vim and Compatibility - senopen

posix 原理主義

neosnippet.vim + deoppet.nvim - ShougoMatsu

neocomplcache からお世話になっているのだけど、necomplete の開発が終了。特に解決できない大きな問題が発生しなければこのまま継続して使うと思う。untie.vim も古いバージョンを使ってたりする。

blog を読み返してみると 2009 年 5 月にインストールしたけど set paste してて動かないのに気が付かず、9 月になってようやく解決となっていた。仕事等でも色々便利に使って今に至るので 8 年ぐらい経ってた。

How ordinary Vim user contributed to Vim - dice_zu

運用で回避というパワーワード。サラッと結構な数のパッチを送っていて驚いた。すごいなぁ。 これが vim を使ってたら結婚して家建てて転職したパワーか。

The new syntax highlighter for Vim - p_ck_

:synmaxcol の default が 3000 で、それをこえるとハイライトしないようにするの知らなかった。

iro.vim

  • ruby のコードを完璧に highlight する。
  • 行数が多すぎると matchaddpos の大量発行で固まる。

こだわり感あっていい。

You've been Super Viman. After this talk, you could say you are Super Viman 2 -- Life with gina.vim - lambdalisue

くっそ便利そうだけど仕事では Visual Studio + git for windows な環境なので常用は難しいかなぁ。なんだかんだでコマンドをいろいろ発行したり状態を見たりするし、コマンドの扱いがバグってなんかあったら嫌だなぁとか思ってしまって踏み込めない。

以前に vim-gita の発表も見たけど勢いがあっていい。

まとめ

  • 司会者の英語が聞き取りやすかった (Vimmer は英語話せる率高いの?)
  • あいかわらず kaoriya さんが元気。コミケで買ったタオルを頭に巻いて無双してた。
  • スポンサーが沢山ついてて驚いたけど赤字らしい。仕事が忙しすぎてお手伝いは完全に不可だったので個人スポンサーで恩返し。
  • 翻訳がめちゃくちゃ大変そう。と思ったら何やら面白いことになってたようだ。よく分からないタイミングで笑いが起きるので何だろうと思ってたのだけど、そういうことか。
  • 席はあと 2 か 3 列ぐらい後ろの方が良かったかな。椅子を倒せないのでじゃっかんしんどかったけど発表ごとに休憩が入って運動がてらお手洗い移動ができたのは良かった。
  • 当たり前のように安定した wifi が使えた。電源完備で、水とコーヒーが飲めて良さしかない。コーヒーの Vim 仕様はスリーブだけかと思ってたらコーヒーカップもだった。良さ。
  • vimconf のページが js を抑制しているようで cvim も keysnail も動かなくて C-d C-u j k で移動できなかった。

ここ数ヶ月仕事が忙しくてどんより腐ってる状態だったけど上向きになる良い機会だったと思います。スピーカーの皆さん、スタッフの皆さんありがとうございました!

来年の開催も楽しみだ。

MacVim + Ruby 2.3

rbenv に乗り換えて ruby 2.3 を入れたまでは良かったけど vim から見える ruby がシステムデフォルトの 2.0 になってた。rvm を使っていたときは DYNAMIC_RUBY_DLL か rubydll で libruby.*.dylib を指定していたように思うけど設定ファイルを消失してしまって思い出せない。dropbox の履歴が去年の 11 月までしか見れず、"旧バージョンを表示" リンクを選んでも直近の履歴が表示されてループする (バグ?)。.rbenv 配下に dylib が無いようなので vimrc でパスを通したら動いた。

let $PATH = $HOME. '/.rbenv/shims:' .  $PATH
let $GEM_PATH = $HOME . '/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0'

set rubydll すると rubydll=libruby.2.0.0.dylib が出力されるけど、puts RUBY_VERSION が 2.3.3 って出るし gem も読んでくれてるのでとりあえず ok かな。

Yokohama.vim #8 に行ってきた

#7 から一年ぶり。会場には何回も来てるはずなのに 3 階のエレベータにたどり着くまでにいつも迷ってしまう。途中でトイレに入るとどっちから来たかも分からなくなるので方向音痴には厳しいビルだ。

vim8 と yokohamavim #8 がかかっていることに始まってから気がつくなど。

アイスブレイク

  • 自己組織化?
  • 二人一組
  • 一人が J K H L で進行方向を指示
  • もう一人が指示に従って動く
  • 歩いた歩数を数える

Watson_DNA さん

DSL でナンデモプログラミング!?

  • かしこさ
  • vi のキーバインドはチューリング完全
    • 某漁船のことか

りんだんさん

  • Vim で C コンパイラ
  • C を Vim script でコンパイルして vim script を吐く
  • 何処を目指しているのかと思ったら楽しいかららしい

thinca さん

  • 安定のマンボウ
  • Vim8 説明ありがたい

Job, Channel, Timer を勉強する

そもそもどういうものかよく分かってないので thinca さんの説明を聞きながら勉強。 tweetvim で user stream からツイートを取得する際に updatetime のタイミングで発動する CursorHold, CursorHoldI を使っていたのだけど、これを消すことができた。特に問題無さそうだったので dev ブランチに push 済み。次は vimproc を使って curl を叩いている箇所の置き換えにチャレンジしてみる。

あとは vim8 になって数値が 64bit 化されたからなのか、vim で sha1 を生成する結果が異なるようになってた。webapi.vim から持ってきているのだけどよく分からない・・・。ruby か python か perl が使えれば Vim script の代わりに生成するようにしているので、vim8 に変わったら動かなくなったーという方はお試しください。

懇親会

腹一杯。

まとめ

gu4 さん開催ありがとうございました。やっぱ vim 楽しいなというのを再認識できました。

自分も発表したいなと思っていたのだけど・・・仕事の疲れ度が最近半端ないのもあって家で手がなかなか動かせないまま当日に至ってしまった。勉強会に参加するのも億劫になってたりするので・・・またの機会に。