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

スポンサーサイト

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

連番展開スクリプト(ruby版ver.2)

前回から更新してhexの連番に対応しました~
やっぱ仕事柄16進数の展開は欲しかったので。
あと、何回も言ってるけど後方参照は個人的にかなり便利。
正直自分では最強の連番展開だと思ってますw

vimから呼び出す場合は.vimrcに
command! -range ExpandSerialNumber ,!ruby E:\bin\runtime\ExpandSerialNumber.rb
としておいて、
:ExpandSerialNumber
としてください。複数行選択して一気に展開もできるよ!
試しにこのへんを展開してみてくだちい。
[0-3] [4-5] [6-7] : [\1] [\3]
[00-3] [4-5] [6-7] : [\1] [\3]
[0x4-0x7] [0Xd-0Xf] [0xa-0x8] : [\1*2] [\3+1]
ってことで

#!/usr/bin/env ruby
###############################################
# expand serial number                        #
# syntax  : foo[nStart-nEnd][...]             #
# example : before                            #
#             0: foo[0-1][3-2]bar[1+\2][\1-1] #
#           after                             #
#             0: foo03bar4-1                  #
#             1: foo02bar3-1                  #
#             2: foo13bar40                   #
#             3: foo12bar30                   #
###############################################

####### SUB FUNCTIONS
### TO_S UNDER HEX
def to_hs(sFoo, isHex)
    return sprintf(isHex == 2 ? "%X" : isHex == 1 ? "%x" : "%d", sFoo)
end
### DIGIT ALIGNMENT
def aligndigit(sFoo, nLen)
    return sFoo = "0" * [nLen - sFoo.length, 0].max + sFoo
end
### DECREMENT INDEX OF BACK-REFERENCE
def decrefindex(sFoo)
  if (sFoo =~ /(.*?\[.*?\\)(\d)(.*?\].*)/)
    return $1 + ($2.to_i-1).to_s + decrefindex($3)
  end
  return sFoo
end
### SUBSTITUTE BACK-REFERENCE "\1"
def substbackref(sFoo, sBar, isHex)
  if (sFoo =~ /.*\[(.*?)\\1(.*?)\]/)
    sEvl = aligndigit(to_hs(eval($1 + (isHex != 0 ? "0x" + sBar : sBar.to_i.to_s) + $2), isHex), sBar.length)
    substbackref(sFoo.gsub!(/\[#{Regexp.escape($1 + '\1' + $2)}\]/, sEvl), sBar, isHex)
  end
  return decrefindex(sFoo)
end
### SERIAL NUMBER EXPANTION
def expand(sFoo)
  if (sFoo =~ /(.*?)\[\s*((?:0[xX])?[0-9a-fA-F]+)\s*-\s*((?:0[xX])?[0-9a-fA-F]+)\s*\](.*)/)
    sPre   = $1
    nStart = eval($2)
    nLen   = $2.length
    nEnd   = eval($3)
    sSuf   = $4
    if ($2[0..1] == "0X" && $3[0..1] == "0X")
      isHex = 2 
    elsif ($2[0..1] == "0x" && $3[0..1] == "0x")
      isHex = 1 
    else
      isHex = 0
    end
    # increment/decrement
    nStep = nStart < nEnd ? 1 : -1
    nStart.step(nEnd, nStep){ |i|
      sAligned = aligndigit(to_hs(i, isHex), isHex != 0 ? nLen - 2 : nLen)
      expand(substbackref(sPre + sAligned + sSuf, sAligned, isHex))
    }
  else
    puts(sFoo)
  end
end

####### MAIN
ARGF.each_line{ |line| expand(line) }

# vim: expandtab ts=2 sw=2

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2010/07/29(木) 23:33:33|
  2. フリーソフト
  3. | トラックバック:0
  4. | コメント:0
<<連番展開スクリプト(ruby版ver.2.1) | ホーム | FreeType 2.4.0 (stable release)>>

コメント

コメントの投稿


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

トラックバック

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

プロフィール

Author:nocd5
30歳(男)
会社員

Last.fm



最近の記事

カテゴリー

カレンダー

07 | 2017/08 | 09
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ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。