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 が重要なのかは知らない。知らないけど、たしかにタブをずらせないのは、おかしな気もするし、これが便利なのかはよくわからないけど、確かにこれくらいはできてもいいよね!
書かれているのは「移動量を引数で受け取って、現在のタブからそれだけ移動する」とそういうことみたい。
ざっと見て、よくわからないところがあったのでメモ。
一つ目、どうして変数にプリフィックス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>