くまのりくふん 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> に割り当てるのは微妙かな。

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

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

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

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

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

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

2008-09-24

system() の憂鬱

05:00 | はてなブックマーク - system() の憂鬱 - くまのりくふん

system() の結果は常に encoding として扱われるのだけど*1、こいつを何とかして適切なエンコーディングに変換しようと頑張って駄目だった記録。

作戦1 - fileencodings から変換を試みる

" コマンドの結果が、どのエンコーディングで返ってくるかは分からない
let result = system("hoge")

" よって、既存のファイルを開く時のように fileencodings の値で変換を試みる
let fencs = split(&fileencodings, ",")
" call filter(fencs, "v:val !=# 'ucs-bom' && v:val !=# 'guess'")
for fenc in fencs
  if !(iconv(result, fenc, &encoding) == "")
    let result = iconv(result, fenc, &encoding)
    break
  endif
endfor

echo result

はい、ばっけばけ。

あれ……? iconv() って変換に失敗したら空文字列を返すはずだよな? てことは化けてるけど成功してるのか。

僕の環境に問題があるようで、iconv() の第二、第三引数に何を指定しても変換成功します。化けてるのに。

というか、僕が iconv() の動作を理解してないだけか。こいつは駄目だ。次に行こう。

作戦2 - shell のエンコーディングから変換する

" コマンドの結果は大抵 shell のエンコーディングで返ってくるはずだ!
let result = system("hoge")

" dos なら cp932 で大抵上手くいくはずだ!
if !(iconv(result, "cp932", &encoding) == "")
  let result = iconv(result, "cp932", &encoding)
endif

echo result

作戦1よりはマシか……?

system() の結果のエンコーディングが分かっていれば、こういう方法もありかな。

diff とかだと即死だけど。

作戦3 - Rubyインタフェースを使う

ruby << EOF
require "kconv"
Enc_table = {"iso-2022-jp" => Kconv::JIS, "euc-jp" => Kconv::EUC, "cp932" => Kconv::SJIS, "utf-8" => Kconv::UTF8}
def ruby_kconv(content = "", enc = VIM.evaluate("&encoding"))
  in_code = Kconv.guess(content)
  out_code = Enc_table[enc]
  result = Kconv.kconv(content, out_code, in_code)
  VIM.command("let s:ruby_kconv_result = '" + result + "'")
end
EOF

execute "ruby ruby_kconv('" . system("hoge") . "')"
echo s:ruby_kconv_result

お、想定通り動いてるか? でもこの方法だとプラグインを配布する時に困りそうだな。

○○インタフェースが必要とかいうのはなるべく避けたいな。

作戦4 - 外部ツールを使う

とてもめんどくさいのでやりませんでした。

外部ツールが必要とかいうのはなるべく(ry

結論

:read! hoge

を使え。

JimmyJimmy2011/11/23 20:36Good points all around. Truly apperciaetd.

rmzcfwdirmzcfwdi2011/11/24 20:51xQS9cb <a href="http://szpqwjkqgfnk.com/">szpqwjkqgfnk</a>

bypmpwwnbypmpwwn2011/11/25 01:10Q0pVG9 , [url=http://jkhqmbxdwqfe.com/]jkhqmbxdwqfe[/url], [link=http://udxtjrfbkgpu.com/]udxtjrfbkgpu[/link], http://ntcghvzxthff.com/

apwykzbanapwykzban2011/12/01 02:29IyZ7w2 <a href="http://bisgwjztlugq.com/">bisgwjztlugq</a>

iquoibbniquoibbn2011/12/05 01:54aMMvxx , [url=http://iaplkwuqezqs.com/]iaplkwuqezqs[/url], [link=http://njnhkrntfvlq.com/]njnhkrntfvlq[/link], http://tvusbbquvice.com/

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

2008-09-11

あ、ありのまま今起こったことを話すぜ……

01:17 | はてなブックマーク - あ、ありのまま今起こったことを話すぜ…… - くまのりくふん

                            辞書型変数を使う前に言っておくッ!
                    おれは今辞書型変数をほんのちょっぴりだが体験した
                  い…いや…体験したというよりはまったく理解を超えていたのだが……
         ,. -‐'''''""¨¨¨ヽ
         (.___,,,... -ァァフ|          あ…ありのまま 今 起こった事を話すぜ!
          |i i|    }! }} //|
         |l、{   j} /,,ィ//|       『おれはキーに数値を指定したと
        i|:!ヾ、_ノ/ u {:}//ヘ        思ったらいつのまにか文字列になっていた』
        |リ u' }  ,ノ _,!V,ハ |
       /´fト、_{ル{,ィ'eラ , タ人        な… 何を言ってるのか わからねーと思うが
     /'   ヾ|宀| {´,)⌒`/ |<ヽトiゝ        おれも何をされたのかわからなかった…
    ,゙  / )ヽ iLレ  u' | | ヾlトハ〉
     |/_/  ハ !ニ⊇ '/:}  V:::::ヽ        頭がどうにかなりそうだった…
    // 二二二7'T'' /u' __ /:::::::/`ヽ
   /'´r -―一ァ‐゙T´ '"´ /::::/-‐  \    <C-u>だとかsetlocalだとか
   / //   广¨´  /'   /:::::/´ ̄`ヽ ⌒ヽ    そんなチャチなもんじゃあ 断じてねえ
  ノ ' /  ノ:::::`ー-、___/::::://       ヽ  }
_/`丶 /:::::::::::::::::::::::::: ̄`ー-{:::...       イ  もっと恐ろしいものの片鱗を味わったぜ…
let hoge = {1 : 'hoge'}
echo hoge
" => {'1' : 'hoge'}

ka-nachtka-nacht2008/09/12 02:08:help E713

kuhukuhunkuhukuhun2008/09/14 02:22おお、なんというか expand("<abuf>") の値が文字列だったのと同じくらいびっくりしました。どちらもバッファ番号周りの処理をする時は気をつけないと。

SheldonSheldon2012/06/27 20:45I am totally wowed and prepeard to take the next step now.

gypntaqbgypntaqb2012/06/28 13:11RLpr4W <a href="http://laxucsycnhxi.com/">laxucsycnhxi</a>

ktxtcctgzcqktxtcctgzcq2012/06/28 18:25jMmvfO , [url=http://fhlzwmtthush.com/]fhlzwmtthush[/url], [link=http://mhugyyseutvl.com/]mhugyyseutvl[/link], http://gueipwnomfwm.com/

ogbeubogbeub2012/06/29 07:51H8Dcoj <a href="http://fdhprxztddzl.com/">fdhprxztddzl</a>

totehutotehu2012/07/01 05:003INM3P , [url=http://uwixlssraslw.com/]uwixlssraslw[/url], [link=http://wwbzalhazkke.com/]wwbzalhazkke[/link], http://zqsjrzsmyirt.com/

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