basyura's blog

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

vim - リンクしたファイルがリンクじゃなくなる

set backupcopy=yes
'backupcopy' 'bkc'   文字列   (UnixでのViの既定値: "yes"、それ以外: "auto")
            グローバル/バッファについてローカル |global-local|
    ファイルの書き込みをしてバックアップが作られるとき、その方法をこのオプ
    ションで指定する。このオプションはコンマで区切られた単語のリストである。

    主な値は次の通り:
    "yes"   先にファイルのコピーを作ってバックアップにして、更新した内容は
        元のファイルに上書きする
    "no"    先に元のファイルをリネームしてバックアップにして、更新した内容
        は新しいファイルに書き出す
    "auto"  どちらか適切な方を選ぶ

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 で移動できなかった。

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

来年の開催も楽しみだ。