84 tabshift.vim (8-1) tabshift.vimを好き勝手改造してみた

あと vim script 勉強するのに id:eclipse-a ( http://d.hatena.ne.jp/eclipse-a/archive?word=%2a%5bvim%5d ) にお世話になった。

TabShift.vim - KBDAHOLIC - やぬすさんとこ

あんまり「狙え」に良いことを書いた覚えはないけど、「お世話になった」なんて言われて嬉しかったので、tabshift.vim 試してみた。

動く動く!右にずれずれ、左にずれずれする。普段タブを使っていないし、vimperatorも使っていないので、そんなに:tabmove が重要なのかは知らない。知らないけど、たしかにタブをずらせないのは、おかしな気もするし、これが便利なのかはよくわからないけど、確かにこれくらいはできてもいいよね!

書かれているのは「移動量を引数で受け取って、現在のタブからそれだけ移動する」とそういうことみたい。

ざっと見て、よくわからないところがあったのでメモ。

  1. どうして変数にプリフィックスaがついているのか
  2. どうして数字確認に正規表現を使わないのか
  3. どうしてexecuteコマンドの引数を文字列結合しないのか
  4. どうして/が効かないのか

一つ目、どうして変数にプリフィックスaがついているのか。引数はa:*の形で受け取るんだけど、他は特になにも書かなくてもプリフィックスl(関数内のみ有効な変数)がついていることになるし、わざわざa:って書かなくても大丈夫かも。

二つ目、どうして数字確認に正規表現を使わないのか。数字かどうかを確認するには、正規表現使うといいんじゃないかな!下みたいな感じで。

if a:delta !~ '^[+-]\?\d\+$'
  return 0
endif

三つ目、どうしてexecuteの引数を文字列結合しないのか。正直どっちでも良いんだけど、executeコマンドの後は勝手に空白を入れてくれるので、空白を入れなくても良いと思う。もし入れるなら、文字列結合している方が自然かもしんない。

" 空白を勝手に入れてくれるからこれで大丈夫
execute 'tabmove' a:cur
" もちろん普通に文字列結合でも良い
execute 'tabmove ' . a:cur
" これだと空白が二個はさまるよ!問題はないけど!
execute 'tabmove ' a:cur

四つ目、どうして/が効かないのか。これは本当に謎。下みたいにしたらちゃんと動いたので、どうしてかなあ。別のプラグインが上書きしてるとか、そんな気がする。

nnoremap <silent> <special> <C-S-h> :call TabShift(-1)<CR>
nnoremap <silent> <special> <C-S-l> :call TabShift(1)<CR>

最後に、自分で好き勝手改造(というか圧縮)した分を挙げとく。マッピングもあわせて8行になった。これなら_vimrcに書けるね!

function! s:tabshift(delta)
  if a:delta !~ '^[+-]\?\d\+$' | return | endif
  let max = tabpagenr('$')
  let idx = (tabpagenr() - 1 + a:delta) % max
  execute 'tabmove' (idx >= 0 ? idx : max + idx)
endfunction
nnoremap <silent> <special> <C-S-h> :call <SID>tabshift(-1)<CR>
nnoremap <silent> <special> <C-S-l> :call <SID>tabshift(1)<CR>