■■■■■■□■■■■■■□■■■■■■□□□□□■■□■■■■■■
■■□□■■□■■□□■■□■■□□□□□■■■■■■□■■□□□□
■■□□■■□■■□□■■□■■□□□□□■■□□■■□■■■■■■
■■□□■■□■■□□■■□■■□□□□□■■□□■■□□□□□■■
■■□□■■□■■■■■■□■■■■■■□■■■■■■□■■■■■■

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  1. --/--/--(--) --:--:--|
  2. スポンサー広告

Vimのスクリプト書いてみた(2)

すごくちょっと修正。
複数行選択しての連番展開に対応。
command! -range ExpandSerialNumber <line1>,<line2>call s:ExpandSerialNumber()
"-----------------------------------------
" expand serial number
" syntax  : foo[nStart-nEnd][...]
" example : before
"                  0: foo[0-1][3-2]
"           after
"                  0: foo03
"                  1: foo02
"                  2: foo13
"                  3: foo12
"-----------------------------------------
function! s:ExpandSerialNumber() range
  let strPat = '\(.\{-}\)\[\(\d\+\)-\(\d\+\)\]\(.*\)'
  let nUndone = a:lastline - a:firstline + 1 " number of expr which has not been expanded
  let nOffset = 0

  while nUndone > 0
    let nLine = line(".") + nOffset
    let strLine = getline(nLine)
    let strMat = matchstr(strLine, strPat)

    " split [prefix, start-value, end-value, suffix]
    let strPre   = substitute(strMat, strPat, '\1', '')
    let strStart = substitute(strMat, strPat, '\2', '')
    let strEnd   = substitute(strMat, strPat, '\3', '')
    let strSuf   = substitute(strMat, strPat, '\4', '')

    if (strStart != "") && (strEnd != "")
      " str2int (I'm lazy...)
      let nStart = strStart + 0
      let nEnd   = strEnd + 0

      " if start-value > end-value, reverse flow direction
      let bReverse = nStart > nEnd ? 1 : 0
      let j = nEnd
      while j != nStart
        call append(nLine, strPre . j . strSuf) " append expanded string
        " if start-value > end-value, reverse flow direction
        let j += !bReverse ? -1 : 1
      endwhile

      call setline(nLine, strPre . j . strSuf) " replace expr to expanded string
      " add number of expanded string to nUndone
      let nUndone += !bReverse ? nEnd - nStart : nStart - nEnd
    else " if no expr is expanded, decrement nUndone and increment nOffset
      let nUndone -= 1
      let nOffset += 1
    endif
  endwhile
  return strPre
endfunction

テーマ:フリーソフト - ジャンル:コンピュータ

  1. 2007/11/15(木) 00:10:47|
  2. フリーソフト
  3. | トラックバック:0
  4. | コメント:1
<<bbLean mod 071117 | ホーム | bbLeanSkin mod 071113>>

コメント

v-10
  1. 2009/04/27(月) 15:11:20 |
  2. URL |
  3. 名乗るほどの者では #-
  4. [ 編集]

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://nocd5.blog59.fc2.com/tb.php/192-6a9778b4
この記事にトラックバックする(FC2ブログユーザー)
home

プロフィール

Author:nocd5
30歳(男)
会社員

Last.fm



最近の記事

カテゴリー

カレンダー

09 | 2017/10 | 11
Sun Mon Tue Wed Thu Fri Sat
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -

最近のコメント

最近のトラックバック

ブロとも申請フォーム

この人とブロともになる

ブログ内検索

Amazonアソシエイト

RSSフィード

リンク

このブログをリンクに追加する

FC2ブログランキング

FC2Blog Ranking

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。