くまのりくふん RSSフィード

2008-10-03

連番ファイルを操作する

02:01 | はてなブックマーク - 連番ファイルを操作する - くまのりくふん

春頃の vimrc をサルベージできたので、使えそうなのをメモしておく。

function! s:operate_consecutive_file(...)
  let l:operate = exists("a:1") ? a:1 : "edit"
  let l:step = exists("a:2") ? a:2 : 1
  try
    let l:fname = s:get_consecutive_file(l:step)
    execute l:operate l:fname
  catch /.*/
    echoerr 'Caught "' . v:exception . '" in ' . v:throwpoint
  endtry
endfunction

function! s:get_consecutive_file(...)
  let l:step_num = exists("a:1") ? str2nr(a:1) : 1
  let l:base_file = expand("%:t:r")
  let l:fname_head = fnamemodify(expand("%:p:h"), ":p")
  let l:fname_front = matchstr(l:base_file, '^.\{-}\ze\d*$')
  let l:fname_extension = "." . expand("%:t:e")

  if l:base_file =~ '\d$'
    let l:base_num = str2nr(matchstr(l:base_file, '^.\{-}\zs\d\+$'))
  else
    let l:base_num = 1
  endif

  let l:target_num = l:base_num + l:step_num
  if l:target_num < 0
    throw "a negative number"
  endif

  let l:zero_cnt = len(matchstr(l:base_file, '^.\{-}\zs0\+\ze\d\+'))
  let l:zero_cnt += len(l:base_num) - len(l:target_num)
  if l:zero_cnt < 0 | let l:zero_cnt = 0 | endif

  let l:target_file = l:fname_head . l:fname_front . repeat(0, l:zero_cnt) . l:target_num . l:fname_extension
  return l:target_file
endfunction

s:operate_consecutive_file() が柔軟では無い。関数名に反して連番ファイルをあまり操作できない。

適当ながら例外処理を行なっている。例外を使わない現在の僕は猛省すべき。

この後に、以下のコマンド定義とキーマッピングが続く。

" command
command! -nargs=* ConsecutiveFileOperate  silent call s:operate_consecutive_file(<f-args>)
command! -nargs=? ConsecutiveFileEditNext silent call s:operate_consecutive_file("edit", (<q-args> == "") ? 1 : <q-args>)
command! -nargs=? ConsecutiveFileEditPrev silent call s:operate_consecutive_file("edit", (<q-args> == "") ? -1 : -(str2nr(<q-args>)))

" keymapping
nnoremap <silent> <C-a> :<C-u>ConsecutiveFileEditNext<CR>
nnoremap <silent> <C-x> :<C-u>ConsecutiveFileEditPrev<CR>

三項演算子必死だな。

ファイルの場合は、URLと違ってそれほど連番にアクセスすることが無い。

よって、 <C-a>, <C-x> に割り当てるのは微妙かな。

YanetYanet 2012/06/28 11:07 I see, I spoupse that would have to be the case.

inddsgmecinddsgmec 2012/06/29 04:42 qbrQcw <a href=\"http://xreobzsolpiu.com/\">xreobzsolpiu</a>

qxvwkvbcdqxvwkvbcd 2012/06/29 15:46 lscUrk , [url=http://svsyviktfzqk.com/]svsyviktfzqk[/url], [link=http://uhsycwryjily.com/]uhsycwryjily[/link], http://gbkpmnvekkxj.com/

yluntninazoyluntninazo 2012/07/01 01:29 Cu4jZE <a href="http://cwmouokdaayq.com/">cwmouokdaayq</a>

pjskyovybljpjskyovyblj 2012/07/01 06:22 TVAhc8 , [url=http://ebmrwfmlbudd.com/]ebmrwfmlbudd[/url], [link=http://cgoesqybwvje.com/]cgoesqybwvje[/link], http://wvpbffqjwjym.com/

ゲスト



トラックバック - http://vim.g.hatena.ne.jp/kuhukuhun/20081003