[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 03/18 19:04 / Filesize : 368 KB / Number-of Response : 974
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Vim6スクリプトお勉強スレ



1 名前:名無しさん@お腹いっぱい。 [01/12/17 12:15]
みんなでスクリプトを覚えよう

512 名前:名無しさん@お腹いっぱい。 mailto:sage [04/05/11 13:26]
>>507
なんもかんがえずにとりあえず立ち上げてみたら、
いきなりsegmentation fault...

うーむ。

513 名前:名無しさん@お腹いっぱい。 mailto:sage [04/05/11 13:30]
>>512
segfはvimのバグじゃねーか?

514 名前:名無しさん@お腹いっぱい。 mailto:sage [04/05/16 15:19]
nomagicのときに
/.
と同様にハイライトさせたいのですが
let @/='.'
とやってもうまくいきません

何か良い方法はありませんか?

515 名前:名無しさん@お腹いっぱい。 mailto:sage [04/05/16 21:13]
>>514
よくわからないけど
/\.
じゃなくて?
let @/='.'
でもうまくいくけど、一回検索しないと反転しないね。そゆこと?


516 名前:514 mailto:sage [04/05/16 23:24]
>>515
set nomagicのときlet @/='.'だと全部が反転しませんか?
.と言う文字を反転させたいんです

やりたいことはノーマルモードの*と同じようなことを
ビジュアルモードで選択した部分のみをやらせたいんです

現状はこんなコードです
function! s:vsearch()
  if line("'<")!=line("'>")
    execute "normal! *"
  else
    let bkupreg=@@
    silent normal gvy
    if @@=~'.*\n'
      let @@=strpart(@@,0,strlen(@@)-1)
    end
    if &magic
      let @@=escape(@@,'^$.*~[]\')
    else
      let @@=escape(@@,'^$\')
    end
    exe "normal /".@@
    let @/=@@
    exe "normal n"
    let @@=bkupreg
  end
endfunction
vmap * :call <sid>vsearch()<cr>

>一回検索しないと反転しないね。そゆこと?
それも悩み所です

517 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [04/05/16 23:49]
>>516 こんな感じで
let @/ = '\V'.escape(@@, '\')

518 名前:514 mailto:sage [04/05/18 22:48]
>>517
お礼が遅くなってすみません

おかげさまで友人に見せても
文句の出ない(出ても一蹴できる)程度の
物になりました。

519 名前:名無しさん@お腹いっぱい。 mailto:sage [04/05/25 23:17]
format.vimにenc=utf8でも禁則処理をして欲しいのでこんな感じにしてみた。

begin 644 format.vim.diff.gz
M'XL("/%1LT``"V9O<FUA="YV:6TN9&EF9@#-5-NJTT`4?3Z%_L-JD--K2A+M
M%2OHHR(^>`1!I*3IM!E))R69E!XY+Y-7+^`7B(CX'7Z*B&^^^`?.9)KT<EJ?
M/.!0FLE>:Z\]>\_.;C0:F(71PN7M%5VTPXC.SRX2@L?N)9P.''MH]X>6W%C6
MG7+)-,T=]A[1&7;Z\K<A-O979D#/:O4ZT.]*2;[W'<B=62Y!KH!PS(=:?TS9
ME#`^C@F+*:<K@A$L12-L2F=J4RXU861_,#8^@<OFB3LG1H'1&2ID36,>UXQ"
MNJ#5%>4@;@[*>,8K=^DR$FN]3>`F5'##_'<KTSN3"WB:3/!DR6G(XLQZHI"#
M;LNVG$TE,YI.(A[&[HJ,"?/"*65SF<)YOL\IYSM@-<NO6BY55)UVD-&ATO9^
M6#B>*-?J-5/V:,,0'R#>0,P@?(C?$&\AWD&\A[@/\0#B.40$P2%6$&N(UQ"!
M3N"H6/H1Z2>DGY%^0?H5Z3>DWY'^0/H3Z2^(AQ"/("X@GBD-U5.V=5O69E!T
MU<W7!E=7Q[HGEY#M<[U6_V7YCK9:M]]I=0>=HM<VQ>21C#(G/*",U(RV^I)R
MC$[7$O/"(+-#7LD6\WP)2><7DO12U1:JNI[O1@Z+:IY?Q[T1;*>O(2`B/(F8
M\EBZ$:_)9TOIM^#4-84$,='R!=GSM:$8%'(S2YBGOBH]-Y`W2W?@M'JV?3""
M;BZYNSJWOQVW"3V3#"R2@-/))2?:P%2#!14$VYDEXXS9M>/LDOTM.2"*JEU,
F]=20/&&&9-.U">RQ,^%;6GC7Z>"L)V])JM1/W\`?NMXJ$GL&```M
`
end

520 名前:519 mailto:sage [04/05/26 00:34]
訂正。一文字とるなら
" multibyte
let str = strpart(str, idx)
let len = strlen(nr2char(char2nr(str)))
return strpart(str, 0, len)
のがカッコええか



521 名前:519 mailto:sage [04/05/26 00:38]
すまそ
" multibyte
return nr2char(char2nr(strpart(str, idx)))
これでええやん

522 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [04/05/26 01:34]
>>519 ありがとうございます。次のファイルをテストしてみてください。
www.kaoriya.net/testdir/patches-vim/format.vim

ちなみにスクリプトで単体の文字を扱う技術はChalice等の開発により無茶苦茶発達
してまして
  matchstr(getline("."), ".", col(".") - 1)
こんな感じでmatchstrを使うのが定石です。近い将来format.vimも全面的に見直さな
ければいけませんな。

523 名前:名無しさん@お腹いっぱい。 mailto:sage [04/05/26 08:00]
>>522
pc5.2ch.net/test/read.cgi/unix/1073825479/755の修正も
お願いします。

524 名前:519 mailto:sage [04/05/26 13:20]
>>522
バッチリっス。サンクスコ

525 名前:名無しさん@お腹いっぱい。 [04/05/27 12:30]
タブ押したら半角スペースが4つ分になるようにしたい

526 名前:名無しさん@お腹いっぱい。 mailto:sage [04/05/27 13:17]
>>525 (・∀・)カエレ!!

527 名前:525 [04/05/27 14:53]
>>526
帰る

528 名前:名無しさん@お腹いっぱい。 mailto:sage [04/05/27 15:26]
>>527


529 名前:名無しさん@お腹いっぱい。 mailto:sage [04/05/28 07:53]
>>525
se expandtab tabstop=4

530 名前:525 mailto:sage [04/05/29 04:58]
>>529
帰らなくて良かった



531 名前:名無しさん@お腹いっぱい。 mailto:sage [04/05/30 04:40]
hoge.texを編集してるときに
:!xdvi % &
としたら
%はhoge.texを指してしまうわけですが、拡張子を除いた(hogeの)部分だけを表すには
どうすればよいでしょうか?

532 名前:名無しさん@お腹いっぱい。 mailto:sage [04/05/30 08:03]
>>531
%<

533 名前:531 mailto:sage [04/05/30 13:28]
>>532
ありがとうございました。

534 名前:名無しさん@お腹いっぱい。 mailto:sage [04/05/30 16:53]
起動するときにウインドウを希望の位置に希望の大きさで立ち上げたい

535 名前:名無しさん@お腹いっぱい。 mailto:sage [04/05/30 17:25]
>>534
:winp[os] {X} {Y}
:win[size] {width} {height}

536 名前:名無しさん@お腹いっぱい。 mailto:sage [04/05/30 19:24]
>>535
Thx
胃に空いた穴が塞がりそうです

537 名前:名無しさん@お腹いっぱい。 mailto:sage [04/05/30 19:30]
オートインデントは一切半角スペースで構成されるものでお願いしたい

538 名前:名無しさん@お腹いっぱい。 mailto:sage [04/05/30 20:56]
>>537
誰に言っているのですか?

539 名前:名無しさん@お腹いっぱい。 mailto:sage [04/05/30 21:02]
あなたですよ、m9(・∀・)あなた!

540 名前:538 mailto:sage [04/05/30 21:12]
私は半角スペースでインデントしています。



541 名前:名無しさん@お腹いっぱい。 mailto:sage [04/05/30 23:25]
>>537
:se expandtab

542 名前:名無しさん@お腹いっぱい。 mailto:sage [04/05/31 00:26]
スクリプトと関係ない話はvim6本スレでよろしこ

543 名前:名無しさん@お腹いっぱい。 mailto:sage [04/06/03 22:21]
カーソルの下にある文字列の長さを取得する関数を書いてみた。

function! UnderCursorStringLength()
let line = getline(".")
let cur = col(".")-1
let l = strlen(line)
let backward = strpart(line, 0, cur)
let forward = strpart(line, cur, l)
let b = strlen(matchstr(backward, ".*\""))-1
let e = cur + match(forward, "\"")
echo e-b-1
endfunction


544 名前:名無しさん@お腹いっぱい。 mailto:sage [04/06/04 00:11]
>>543
解説プリーズ

545 名前:名無しさん@お腹いっぱい。 mailto:sage [04/06/05 01:18]
カレント行をゲット。
カーソルが何桁目がをゲット。
カーソル位置より前と後にわけて、
前の部分の最後の"をbとする。
後の部分の最初の"をeとする。
長さはe-b-1。

複数行にわたってると無理だし、\のエスケープもわからない。
あんまり信用しないでね。

546 名前:名無しさん@お腹いっぱい。 mailto:sage [04/06/05 20:51]
僕は、カーソルの下の文字列を取得する関数を書いて
let len = strlen(UnderCursorString())
こんな感じのほうが好みかな。

547 名前:名無しさん@お腹いっぱい。 mailto:sage [04/06/06 17:41]
" の正規表現は \ を考慮して \(\\\@<!\(\\\\\)*\\\)\@<!" でどうか

548 名前:名無しさん@お腹いっぱい。 mailto:sage [04/06/06 21:04]
二つほどお聞きしたいのですが

行頭からカーソル位置を含む位置までの文字列を取得したいとき
strpart(getline('.'),0,col('.'))
としてみたところカーソル位置が日本語だとうまくいきません。

指定した行を削除したいのですが
exec lnum.'d _'
としたのですがfoldingされている行だとfoldingごと纏めて消えてしまいます。

何か方法はありませんか?

549 名前:名無しさん@お腹いっぱい。 mailto:sage [04/06/06 21:52]
function! DelLine(num)
  if &foldenable != 0
    set nofoldenable
    exec a:num.'d _'
    set foldenable
  else
    exec a:num.'d _'
  endif
endfunction
縺薙s縺ェ諢溘§シ

550 名前:名無しさん@お腹いっぱい。 mailto:sage [04/06/06 21:54]
化けた・・・
最後の行は無視してください



551 名前:名無しさん@お腹いっぱい。 mailto:sage [04/06/06 22:12]
function! GetPart()
let lnum = line('.')
let cnum = col('.')

let line = getline(lnum)
let cur_char = matchstr(line, '.', cnum - 1)
let part_len = cnum + strlen(cur_char) - 1
return strpart(line, 0, part_len)

" 一行で書くと
"return strpart(getline('.'),0,col('.')+strlen(matchstr(getline('.'),'.',col('.')-1)) - 1)
endfunction
これでどうよ

552 名前:名無しさん@お腹いっぱい。 mailto:sage [04/06/06 22:51]
>>547
解説プリーズ

553 名前:548 mailto:sage [04/06/07 00:12]
>>549
>>551

ナルホド、参考になりました。

foldenableなんて知らなかったし
matchstrをそんな風に利用するとは思いつきませんでした。

まだまだ、修行不足ですな、精進します。

554 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [04/06/07 00:21]
>>547
\によるエスケープを考慮した""文字列にマッチする正規表現は慣用句でして
    /"\(\\.\|[^"]\)*"
と書くことが多いです。これは、クォーテーションで始まってクォーテーションで終わ
る文字列のうち、エスケープされた文字「\\.」、もしくはクォーテーション以外の文
字「[^"]」のみで構成されるもの、という意味になります。

>>548
    echo matchstr(getline('.'), '^.*\%'.col('.').'c.')
こんな風にひとつのmatchstr()で行うのが速度面から有利です。わかりやすさであれば
551さんの方法が優れています。

555 名前:名無しさん@お腹いっぱい。 mailto:sage [04/06/07 01:50]
つまりこういうことか!
"エスケープバージョン
function! UnderCursorStringLength()
  let line = getline(".")
  let cur = col(".")-1
  let l = strlen(line)
  let backward = strpart(line, 0, cur)
  let b = matchend(backward, '.*\\\@<!"')
  let str = matchstr(line, '\(\\.\|[^"]\)*', b)
  echo strlen(str)
endfunction

556 名前:名無しさん@お腹いっぱい。 mailto:sage [04/06/07 02:09]
ちなみに >>547 の意味は直前に奇数個の \ が存在しない "

557 名前:名無しさん@お腹いっぱい。 mailto:sage [04/06/07 11:23]
>>555
こうだね
!   let b = matchend(backward, '.*\(\\\@<!\(\\\\\)*\\\)\@<!"')

558 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [04/06/07 11:49]
>>555
カーソルの下にある特定の正規表現にマッチする文字列を取得する方法はChaliceに含
まれるplugin/alice.vimに含まれるAL_matchstr_undercursor()が参考になります。
> function! AL_matchstr_undercursor(mx)
>   let column = col('.')
>   let mx = '\m\%<'.(column + 1).'c'.a:mx.'\%>'.column.'c'
>   return matchstr(getline('.'), mx)
> endfunction
この/%cを使う方法であれば、正規表現を前半と後半に分けたためにわかりにくくなっ
てしまう、ということを回避できます。
  let quoted = AL_matchstr_undercursor('"\(\\.\|[^"]\)*"')

559 名前:名無しさん@お腹いっぱい。 mailto:sage [04/06/21 22:27]
質問があります。
VIM上でファイル検索>>リスト出力>>選択>>編集
が行えるようなスクリプトなどはあるでしょうか?

winmanager.vim や explorer.vim では subディレクトリまで
検索してくれないので困ってます。タスケテ



560 名前:名無しさん@お腹いっぱい。 mailto:sage [04/06/22 04:54]
よく分かりませんが
> VIM上でファイル検索>>リスト出力
:new | read !find ./ -name "*.txt"
or
:new | read !dir /s /b "*.txt"
> 選択
 ご自由に
> 編集
:execute 'edit! ' . getline('.')



561 名前:名無しさん@お腹いっぱい。 mailto:sage [04/06/22 06:26]
>>560

ありがとうございます。
winmanagerみたいなToggle型(?)で実装してるスクリプトがあればうれしかったんですが、
ちょっとがんばって組んでみまふ ノシ

562 名前:561 mailto:sage [04/06/22 10:20]
スクリプト書こうと思ってましたが、mapで済ませてしまいました。

map <F5> :let obufclnline = getline('.')^M^W^W:execute 'e ' . obufclnline^M

:new | read !dir /s/b *.txt 等でリストを作成し、2つ以上ウィンドウがあることが
前提の仕様にしてます(´Д⊂グスン
(本心は"ウィンドウが無かったら作る"というのをやりたかった)
e! にしてないので、安全です^^ もっと良い方法ってありますかね?

微妙にスレ違いですか…そうでつか or2゜



563 名前:名無しさん@お腹いっぱい。 mailto:sage [04/06/22 10:46]
>>562 ファイル名の上で <C-]> もしくは <C-W><C-]>

564 名前:561 mailto:SAGD [04/06/22 17:54]
>>563
ありがとうございます。・゜・(ノ∀`)・゜・。
そんな簡単な方法があったとは…
vimは最近始めたのですが、viを長年つかっていた身としてなんか
妙にクヤシクなったので、スクリプト書いてみました。
処女作ですが、みなさんの忌憚の無いつっこみおまちしてます。

command! -nargs=1 Findmode :call s:StartFindMode(<f-args>)
function! Findg()
let obufclnline = getline('.')
if filereadable(obufclnline)
normal ^W^W
execute 'e ' . obufclnline
endif
endfunction
function! Finding(...)
let startcmd = "read !dir /s/b ".a:1
normal 1GdG
silent execute startcmd
endfunction
function! s:FindWindow()
nnoremap <buffer> <CR> :call Findg()^M
nnoremap <buffer> <ESC> :bd!^M
command! -buffer -nargs=1 Finding :silent call Finding(<f-args>)
endfunction
function! s:StartFindMode(...)
let startcmd = "10new __findlist__ | read !dir /s/b ".a:1
silent execute startcmd
endfunction
au BufEnter __findlist__ call s:FindWindow()



565 名前:名無しさん@お腹いっぱい。 mailto:sage [04/06/22 18:02]
>>564
:help gf
:help :cfile
:help :copen
:help errorformat

566 名前:名無しさん@お腹いっぱい。 mailto:sage [04/06/22 22:56]
>>565 無駄のない簡潔なメッセージだが何を言いたいのか分からない。

>>564
command! -nargs=1 Findmode :call s:StartFindMode(<f-args>)
function! Findg()
  let obufclnline = getline('.')
  if filereadable(obufclnline)
    " ポータビリティーのため
    execute 'wincmd w'
    execute 'e ' . obufclnline
  endif
endfunction
function! Finding(...)
  let startcmd = "read !dir /s/b ".a:1
  " 好み。俺はこの方が分かりやすい。
  execute '1,$delete _'
  silent execute startcmd
endfunction

567 名前:名無しさん@お腹いっぱい。 mailto:sage [04/06/22 22:59]
続き

function! s:FindWindow()
  " ポータビリティーのため。^Mより<CR>がいい。
  nnoremap <buffer> <CR> :call Findg()<CR>
  nnoremap <buffer> <ESC> :bd<CR>
  command! -buffer -nargs=1 Finding :silent call Finding(<f-args>)
endfunction
function! s:StartFindMode(...)
  let startcmd = "10new __findlist__ | read !dir /s/b ".a:1
  silent execute startcmd
  " 好み
  normal gg
  " 一時的なバッファにする。よく知らない。|special-buffers|
  set buftype=nowrite
  set bufhidden=delete
  set noswapfile
endfunction
au BufEnter __findlist__ call s:FindWindow()

感想:使ってみたら意外と便利だった。

568 名前:561 mailto:sage [04/06/22 23:53]
>>564

errorformatにならって、findファイルリストをつくって
cfileで読み込んで、copenで開いて
gfで開けってことかな? いろいろためしてみたけど、いまいちうまくいきません(´Д⊂グスン
つかえたら、copenは便利そうですね。

>>566

丁寧にありがとうございます^^
あと感想ありです。誉めてもらったヽ(´ー`)ノ

なるほど wincmdかぁ、ほんとは__findlist__があるか判定して、
バッファ名でやりたかったんですが、よくわかりませんでした(´ヘ`;)

setはカレントバッファにしか影響をおよぼさないんですね?
勉強になります。
あと、modifiableとかをオフにしておいたほうがいいのかな

windowsでしかうごきませんが、使ってみて要望とかありましたらお願いします。
できるかぎり、、がんばってみます(;・∀・)


569 名前:名無しさん@お腹いっぱい。 mailto:sage [04/06/23 16:25]
>>568
バッファがあるかどうかはbufexists()とかbufloaded()とかかな?

余裕があるならプラグインの形にまとめてどこかにうpしとくと誰かが喜ぶと思います。
なんならvim.orgに…。
あとこんぐらいしか思いつかないが
ファイル検索コマンドを変更可能に。これだけでマルチプラットフォーム。
ウインドウを縦分割に変更可能に。
ファイルを開く時に新しいウインドウを作ったり作らなかったり。
あとこんなの
nnoremap <buffer> <Space> :call Findg()<CR>:execute 'wincmd W'<CR>j
nnoremap <buffer> <S-CR> :call Findg()<CR>:execute 'wincmd W'<CR>

570 名前:561 mailto:sage [04/06/26 10:24]
>>568
プラグインっぽくしてみました。
使用方法は、ファイルのヘッダに簡単に記載してます。

ttp://rupan.zive.net/~kain/cgi-bin/up/src/up1193.zip





571 名前:561 mailto:sage [04/06/26 10:26]
s/568/569/
まちがえました(´Д⊂グスン

572 名前:名無しさん@お腹いっぱい。 [04/06/26 14:03]
Findmode便利
まったりだけど良スレ

573 名前:名無しさん@お腹いっぱい。 mailto:sage [04/07/01 14:05]
" modelineの拡張
if !exists('g:MX_mx')
  let g:MX_mx = 'vimex:\(.*\)'
endif

command! ModeLineEx :call s:DoModeLineEx()

function! s:DoModeLineEx()
  let mx = g:MX_mx
  if exists('b:MX_mx')
    let mx = b:MX_mx
  endif
  let lnum = line('.')
  let cnum = col('.')
  if search(mx, 'w') > 0
    normal G$
    let flags = 'w'
    let fname = tempname()
    execute 'redir > ' . fname
    while search(mx, flags) > 0
      let l = matchstr(getline('.'), mx)
      let cmd = substitute(l, mx, '\1', '')
      silent! echo cmd
      let flags = 'W'
    endwhile
    redir END

574 名前:名無しさん@お腹いっぱい。 mailto:sage [04/07/01 14:07]
    if filereadable(fname)
      execute 'source ' . fname
      call delete(fname)
    endif
    call cursor(lnum, cnum)
  endif
endfunction

" 自動化するならセキュリティー的にはこんな処置でいいと思う
au BufReadPost * if getline(1) =~ 'vimpass:MYPASSWORD' |
               \   silent! ModeLineEx |
               \ endif

" と、書いてみたが有効な使い道が思いつかない...orz

575 名前:名無しさん@お腹いっぱい。 mailto:sage [04/07/01 14:17]
ちなみに使い方はファイルのどこでもいいので
vimex: function! SayHello()
vimex:   return 'Hello'
vimex: endfunction
vimex: let test = SayHello()
このようにスクリプトを書いておくと、その部分だけ抜き出して実行します。
フォーマットは g:MX_mx か b:MX_mx を書き変えて変更します。

576 名前:名無しさん@お腹いっぱい。 mailto:sage [04/08/20 17:19]
2つ以上の name spaces を同時に指定するのはできないんですよね
b:s:hoge とか bs:hoge みたいなかんじで

577 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [04/08/20 18:37]
>>576
たしか、SIDをmapargを使って取得して、curly-braces-namesで擬似的にb:s:を実現す
ることは可能です。

map <SID>xx <SID>xx
let s:sid = substitute(maparg('<SID>xx'), 'xx$', '', '')
unmap <SID>xx

let b:somename_{s:sid} = "buffer script local variable"

578 名前:576 mailto:sage [04/08/21 06:48]
>>577
そんな方法が。参考になりました。

579 名前:名無しさん@お腹いっぱい。 [04/10/19 12:36:56]
"レジスタに値が入った時点でなんだかの動作を起こすことって可能でしょうか?
具体的にはレジスタの履歴をyyした時点で保存したいのですが。

580 名前:名無しさん@お腹いっぱい。 mailto:sage [04/10/20 00:22:22]
>>579
:help event 見てもそれらしきイベントは無いねぇ
map yy とかするしか無いんじゃない?

ちなみにviminfoファイルにレジスタ履歴その他を保存しておくことができるけどね
どういうものを残すかはオプションで指定できる
:help 'viminfo'



581 名前:579 [04/10/21 12:05:35]
>>580
返信ありがとうございます。
やっぱりひとつひとつキーマップしかないのですかねぇ。
viminfoでの履歴は、a-z 0-9なんかのレジスタしか保存できませんよね?
かたっぱしからレジスタにつっこんだ履歴を保存したので…。

582 名前:名無しさん@お腹いっぱい。 mailto:sage [04/10/22 00:45:29]
スクリプトで、他のファイルに退避して、
使うときに読み込むのはどうかな?

583 名前:名無しさん@お腹いっぱい。 [05/01/03 05:39:50]
Vimって:wを連続で行ったときもバックアップを作ってくれちゃうから、
一定時間経過したときのみバックアップするようなスクリプトを
考えてみた。つっこみ頼みます。

" 指定したファイルのバックアップが一定時間以上古ければバックアップを作り直す。
" 例: call MyBackup("%")

" この値以上古ければ更新(単位:秒)
let g:my_backup_interval=1800
" バックアップファイルの拡張子
let g:my_backup_ext=".bak"
" バックアップを作るディレクトリ
let g:my_backup_dir="~/.bak"

function! MyBackup(orgfile)
let fn = substitute(expand(a:orgfile), ".*/", "", "")
let bakfile = glob(g:my_backup_dir) . "/" . fn . g:my_backup_ext
let baktime=getftime(bakfile)
if (localtime() - baktime) > g:my_backup_interval
exe "w! " . bakfile
echo "Backup: " . bakfile
endif
endfunction

584 名前:名無しさん@お腹いっぱい。 [05/01/04 01:44:42]
時間よりも内容の変化で区切ってバックアップしたほうがいいと思う。
バックアップというよりバージョン管理か。
転ばぬ先の杖としてならそういう仕組もありかもね。
スクリプトは特に問題ないような気がします。
#autocmdを使って
#BufWritePre: 時間が経っていなければset nobackup
#BufWritePost: &backupを復元
#って手もあるけど、別口で保存しといたほうが安心か。

585 名前:名無しさん@お腹いっぱい。 mailto:sage [05/01/04 03:29:23]
保存するごとに、バージョン番号を付けたコピーを作成する
スクリプトがあったよ。確か。

ふと、バックアップディレクトリを覗くと、そこにはっ、、、!!

586 名前:名無しさん@お腹いっぱい。 [05/01/15 15:47:37]
vimonline.vim に current version の 表示を加えてみました <br> <br> begin 644 vimonli
ne.diff <br> M+2TM('9I;6]N;&EN92YV:6TN;W)I9PE4:'4@2F%N(#$S(#`T.C0V.C,W(#(P <br> M,#4**RLK('
9I;6]N;&EN92YV:6T)4V%T($IA;B`Q-2`Q,SHU.#HQ-B`R,#`U <br> M"D!`("TR-2PV("LR-2PW($!`"B`@('-I;&
amp;5N="$@)7,O+R]G"B`@('-I;&5N <br> M="$@)6<O/'-P86X@8VQA<W,](FYE=W-D871E(B?L+UY<&
lt;RH?"]P/B0O:F]I <br> M;@H@("!S:6QE;G0A("5G+SQT9"!C;&%S<STB;F5W<V1A=&4B+RPO/%PO
=&0^ <br> M)"]J;VEN"BL@('-I;&5N="$@)7,O7EPH7&1<9"I<+EQD7&0J7"Y<9%QD*EP
I <br> M)"??:#$^5FEM(%PQ(&ES('1H92!C=7)R96YT('9E<G-I;VX?"]H,3XO"B`@ <br> M(&-A;&
;P@04Q?97AE8W5T92@G)7,O+BI<*$YE=W-<*3Q<+W-P86X^+BHO7U]? <br> M)RYG.FAE861L:6YE36%R:T-A
=&5G;W)Y+B=<,2]I)RD*("`@8V%L;"!!3%]E <br> M>&5C=71E*"<E<R?N*EPH4F5C96YT(%-C
<FEP="!5<&1A=&5S7"D?"]S<&%N <br> M/BXJ+U]?7R<N9SIH96%D;&EN94UA<
FM#871E9V]R>2XG7#$O:2<I"B`@(&-A <br> M;&P@04Q?97AE8W5T92@G)7,O+BI<*%)E8V5N="!4
:7`@061D:71I;VYS7"D? <br> M7"]S<&%N/BXJ+U]?7R<N9SIH96%D;&EN94UA<FM#871E9V]R>
;2XG7#$O:2<I <br> !"@`` <br> ` <br> end<br><br>

587 名前:& ◆h9Bn.Lr5Ro [05/01/15 15:54:13]
失敗しました。>>586

begin 644 vimonline.diff
M+2TM('9I;6]N;&EN92YV:6TN;W)I9PE4:'4@2F%N(#$S(#`T.C0V.C,W(#(P
M,#4**RLK('9I;6]N;&EN92YV:6T)4V%T($IA;B`Q-2`Q,SHU.#HQ-B`R,#`U
M"D!`("TR-2PV("LR-2PW($!`"B`@('-I;&5N="$@)7,O+R]G"B`@('-I;&5N
M="$@)6<O/'-P86X@8VQA<W,](FYE=W-D871E(B?L+UY<<RH?"]P/B0O:F]I
M;@H@("!S:6QE;G0A("5G+SQT9"!C;&%S<STB;F5W<V1A=&4B+RPO/%PO=&0^
M)"]J;VEN"BL@('-I;&5N="$@)7,O7EPH7&1<9"I<+EQD7&0J7"Y<9%QD*EPI
M)"??:#$^5FEM(%PQ(&ES('1H92!C=7)R96YT('9E<G-I;VX?"]H,3XO"B`@
M(&-A;&P@04Q?97AE8W5T92@G)7,O+BI<*$YE=W-<*3Q<+W-P86X^+BHO7U]?
M)RYG.FAE861L:6YE36%R:T-A=&5G;W)Y+B=<,2]I)RD*("`@8V%L;"!!3%]E
M>&5C=71E*"<E<R?N*EPH4F5C96YT(%-C<FEP="!5<&1A=&5S7"D?"]S<&%N
M/BXJ+U]?7R<N9SIH96%D;&EN94UA<FM#871E9V]R>2XG7#$O:2<I"B`@(&-A
M;&P@04Q?97AE8W5T92@G)7,O+BI<*%)E8V5N="!4:7`@061D:71I;VYS7"D?
M7"]S<&%N/BXJ+U]?7R<N9SIH96%D;&EN94UA<FM#871E9V]R>2XG7#$O:2<I
!"@``
`
end


588 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [05/01/15 16:49:59]
>>587
なんかその diff 微妙におかしくありませんか?

あ、全角「?」が含まれている?

589 名前:名無しさん@お腹いっぱい。 mailto:sage [05/01/15 17:05:54]
そろそろuuencode.vimほすい鴨
↓がんがれ

590 名前:586 mailto:sage [05/01/15 18:49:10]
やっぱり失敗してます。>>587
もう1回挑戦

--- vimonline.vim.orig Thu Jan 13 04:46:37 2005
+++ vimonline.vim Sat Jan 15 13:58:16 2005
@@ -25,6 +25,7 @@
silent! %s///g
silent! %g/<span class="newsdate"/,/^?s*<?/p>$/join
silent! %g/<td class="newsdate"/,/<?/td>$/join
+ silent! %s/^?(?d?d*?.?d?d*?.?d?d*?)$/<h1>Vim ? is the current version<?/h1>/
call AL_execute('%s/.*?(News?)<?/span>.*/___'.g:headlineMarkCategory.'?/i')
call AL_execute('%s/.*?(Recent Script Updates?)<?/span>.*/___'.g:headlineMarkCategory.'?/i')
call AL_execute('%s/.*?(Recent Tip Additions?)<?/span>.*/___'.g:headlineMarkCategory.'?/i')




591 名前:586 mailto:sage [05/01/15 19:21:50]
すみません。
590も変。
全角?を半角backslashにしただけじゃ直りませんね。

1行足しただけです。
あと、"Vim ? is"の所はbackslashの後に1を足して下さい。

顔を洗って寝直して来ます。


592 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [05/01/15 20:10:56]
>>589
www.kaoriya.net/testdir/base64.vim

既にあるかも。
:call Uudecode()
でカーソル行以降の最初のbegin〜endブロックをデコードしてカレントディレクトリ
に保存します。Chaliceのバッファに対しても使えます。一応
:call Uuencode(filename)
もあるみたいだけど、なんかうまく動いてないかも。

593 名前:586 mailto:sage [05/01/16 23:20:25]
悔しいので再挑戦させてください。

begin-base64 644 vimonline.diff.gz
H4sICEfG6kEAA3ZpbW9ubGluZS5kaWZmALWQwU+DMBjFz9tf8bnMMMZoYWMjI0hYvBn14KanZoTQ
BqqskLZM/e8tmR5mjIkHD22aL+/33vfqui4c+aERNRcMmRdqJC8Hu6qDm1yAvwAviIJVtAhh7nnL
oeM45/rBthMn6Qr8dRSEkb8+SdMU3PlytgLH3CGk6RAAFK+Z0BdwqTDG5dmkxLFqjVFR50pdjQR7
VTTXbIRneE/UNCa4Tcb4ueHiO6bpT5ABNP0inLPoPZkQStDncYg9xnHlJ0/8AMQHrkBXDIpOSgPA
kUnFG2HsjAT32UVe17C5zdgbKzrNJpaxRFMyuTfpxDbCvkeCpjjLMguVUcVy2v/XXS5frs12ZSPf
kUV8zC37N78HVvQLbAvJWw2Pbd/sPwJ2vIUNpVybmn/3/wAkbgcXQwIAAA==
====

少し変更しました。


594 名前:586@Vim%Chalice mailto:sage [05/01/23 11:41:11 ]
headline/sankei.vimを
記事のタイトルを左に、
urlを補完して右に移動するように
変更してみました。

begin-base64 644 sankei.vim.diff.gz
H4sICKwH80EAA3NhbmtlaS52aW0uZGlmZgCdUtuK2zAQfY6/YmxafIvl2Lm0NY5JWFpKm1Do7tKH
KFm0tmJrY8vBlkv7mD+vFGeX0FIKBXmYkc7xnDmS53nQEn6gDH1nFaoblg/uig4+EQ7BWK5oMo0m
MwhHo6nmuu4VeHDb8TMulLggGs2i6dset1iANx6+AVeFxUID44oGHtyeC/hGH+FYdjnjsK8bKCjJ
SsapAkmKYq0J40J+tIkG6/uvyy+fl3BHmhriQ93UfCEOBBEhkCQ9HRPNM2BFWgE3BeE5jQZB6El9
ntQ0QZr722E4fj6cIg00aNOGHQXlaZ0xnkN6fDcO5b6aZRIOJ+DK2E8D0LKScqHD61bH1S5mVb7Z
JVsniQkUDd3PDWxtdsYWu9g2EpXHWwfbsU8S5LzS8fzjZdQPdVMRsZKZ1XaPMk0LK7SH8FIEsjBN
W/+z6en9v5ttdie2dU4MWzjDma8CqBCpgO3T03+oeSnGdi8rJWUJy9UD/UHTTlDLvJgiMnmjLC/E
3AhmRqJMQk68r7noveqVKtWxr3alNbqJ8uj5GaxJc7ghguZ18xOZONBNW3P/0s66GGHrOLj+x31T
PvSP7cztoUIcI+RgVIgK29iSqS1dCEG2yHuUH/cSfT/XgPJs3/FUsJprvwDOsrrWLgMAAA==
====

595 名前:586@Vim%Chalice mailto:sage [05/01/23 18:08:57 ]
>>594を再考し
日付、記事タイトル、url
の順番にしてみました。(diffの後半)

後、トップニュースが、表示されるようにしてみましたが、
今日の紙面?でしか試していません。(.diffの前半)

begin-base64 644 sankei.vim.diff.gz
H4sICCFm80EAA3NhbmtlaS52aW0uZGlmZgCdVF2PmlAQfV5+xUB2g4qA4EcTg4Sm2aZpbPuw9smr
BuUKt4uXBq52N+mL/6M/tnfED/zYNGmil2E4nDlzZoJpmlCE/Jkya8NWVpaz+G6UrOFzyMFpy1+/
0+13euC2Wl3FMIwK+O5pzXc4V+LeSVC/1S5xQQCm0206DhjlJQgUANDg21yEjIPIfnL6q8BcSoWk
3NBZTmMYQKBhkmf5KkxViGPFBChYSrlQwZ56qmlu/8i3iVWI0DR9u/rcakpExDYQpizmAy2lS6H5
9qsUrBiXNGckxgXJMuOifG+vcN5PaBiljNNRKX3EREql3mI9LwQTa0Frt8NAa4JGvK9DXwa6Lv+x
Xpcpb57vMoAphindG0/9CTF8/QTE+hXd181d9X9yiPIIm7ts/4C6whyGIfLzvm52cECvXhyJ1rEb
UrMapL5lpEYiEtl4AB59PMjv3cMfXghJTpcDjdTGU012S+qar5/Y3HO2N+C4Xx232QFDnr39dh0a
fChUspp6bBWjnw3/JgfG3gQr2KFvNe5VMvi0n/BHXD4xlBHOUYaLpObK+RxvHByWXlevi24f/11s
PN2ySeMtm6RF/6HmeNOul7IWYZrC++GMvtAFzlDfmyIiSCiLEzHQnJ7mo0lWY7fupVelUlTt2ZiV
1qi6FR+3/0uYP38IBY2z/NXSiaPKTajs1r4cYLkbDmAs54qXe9UnbSAuVNm/5+nsqfy87Lir1A+F
7ZUabTtWQC7ucs0XgmVc+QuinupGwwQAAA==
====

596 名前:名無しさん@お腹いっぱい。 mailto:sage [05/01/26 19:57:33 ]
あ・・・あのですねあの・・
this->hoge[ i ]なんてなってるのが200行くらいあるんですよ
これら全てを急遽
(*(this->hoge + i))
に変更したいんですよ
あのよろしかったら・・・その・・・・ねそのぉ・・・教えて下さい.

597 名前:名無しさん@お腹いっぱい。 mailto:sage [05/01/26 20:49:34 ]
>>596
なぜ変更したいの?

598 名前:名無しさん@お腹いっぱい。 mailto:sage [05/01/27 09:53:59 ]
そのままポインタ参照したらいいやん

599 名前:名無しさん@お腹いっぱい。 mailto:sage [05/01/27 12:46:10 ]
こんな感じ?
s@\(\k\+\)->\(\k\+\)\[\s*\(\k\+\)\s*\]@(*(\1->\2 + \3))@
これでダメならPerlスレとかで聞いた方がいいかも.

600 名前:名無しさん@お腹いっぱい。 mailto:sage [05/02/12 11:40:41 ]
要望:
1.
hz_ja.vimに変な文字を全部正規化する関数が欲しいなぁ。具体的にはgHA, gZJ

2.
あるフォルダ内のファイルを再帰的に検索するプラグインが欲しいなぁ。
grep -r とか find . -type f | xargs grep みたいなやつ。
Windowsでgrep.exeやcygwin用意するのが面倒な場合があるんで。
あと符号化方式の自動認識を考えたらvimでやっちゃうのも悪くないだろうし。
一個、そういうプラグインを見つけたんだけど、やたら遅くて使い物にならなかった。

それから、検索だけじゃなくて置換も出来ると良いな。リファクタリングするとき便利なんだよね。



601 名前:名無しさん@Vim%Chalice mailto:sage [05/02/12 15:13:46 ]
自分で書け

602 名前:名無しさん@お腹いっぱい。 mailto:sage [05/02/12 20:57:04 ]
WinのCygwin上でvim使ってる人いる?
見ためがいいからgvim使ってるけど,ちょっとしたとき<C-z>で
シェルに降りられるのも便利なんだよねえ.

603 名前:名無しさん@お腹いっぱい。 mailto:sage [05/02/14 08:38:41 ]
>>601
やはりそうなるのか。
「同じ事考えてますねー。ボクは作っちゃいましたよ!」という人が現れるのを期待してたんだが。

604 名前:名無しさん@お腹いっぱい。 mailto:sage [05/02/14 09:34:10 ]
> あるフォルダ内のファイルを再帰的に検索
project.vim で出来るかな。

605 名前:名無しさん@お腹いっぱい。 mailto:sage [05/02/15 00:56:08 ]
>>604
ありがとー。試してみるよ。これでダメなら書くか...

606 名前:586@Vim%Chalice mailto:sage [05/02/15 21:44:24 ]
ttp://cvs.kaoriya.net/svn/kaoriya/vimscript/headline/trunk/plugin/headline/
から 2/13 に頂いた sankei.vim にジャンルの表示を加えてみました。

--- sankei.vim.origSun Feb 13 00:37:00 2005
+++ sankei.vimTue Feb 15 21:37:33 2005
@@ -36,14 +36,12 @@
   let @" = save_reg
   " Format headlines
   silent! %s/<br>/\r/g
-  silent! g/\m^<td height="16"><img.*Special/delete _
-  silent! g/\m^<td height="16"><img.*お知らせ/delete _
-  silent! g!/\m^<img[^>]*><a href="[^"]*.htm"\|^・<a href="[^"]*.htm"\|^<td height="16"><img[^>]*><b>/delete _
+  silent! g!/\m^<img[^>]*><a href="[^"]*.htm"\|^・<a href="[^"]*.htm"\|^<td width="110">/delete _
   silent! %s!\m^<img[^>]*><a href="\([^"]\+\)">\([^<]*\)</a>(\(\d\d/\d\d \d\d:\d\d\)).*$!\=HeadlineFormatLine(submatch(2), submatch(1), submatch(3))!
   silent! %s!\m^<img[^>]*><a href="\([^"]\+\)">\([^<]*\)</a>.*$!\=HeadlineFormatLine(submatch(2), submatch(1), '')!
   silent! %s!\m^・<a href="\([^"]\+\)">\([^<]*\)</a>[^(]*(*\(\d\d/\d\d \d\d:\d\d\))*.*$!\=HeadlineFormatLine(submatch(2), submatch(1), submatch(3))!
   silent! %s!\m^・<a href="\([^"]\+\)">\([^<]*\)</a>.*$!\=HeadlineFormatLine(submatch(2), submatch(1), submatch(3))!
-  call AL_execute('%s!\m^<td height="16"><img.*<font[^>]*>\([^<]\+\)</font>.*!'.g:headlineMarkCategory.'\1!')
+  silent! execute '%s/^<td width=.*alt="\([^"]*\)".*$/'.g:headlineMarkCategory.'\1/'
   silent! execute '%s!"\([^"]\+\)">\([^<]\+\)\(.\+\)$!>\3 \2 '.g:headlineUrl_Sankei.'\1!'
   silent! %s/<[^>]*>//g
 endfunction

607 名前:名無しさん@お腹いっぱい。 [05/02/17 14:15:23 ]
:syntax match

:match
は、どういう風な違いがあるんですか?
一緒??

608 名前:名無しさん@お腹いっぱい。 mailto:sage [05/02/17 14:32:38 ]
>>607 matchは1つしか定義できないし、複雑な条件を付加することもできない

609 名前:名無しさん@お腹いっぱい。 mailto:sage [05/02/17 15:15:21 ]
ありがとう。
そっか、だから match none でも動くのか。

610 名前:名無しさん@お腹いっぱい。 mailto:sage [05/02/18 03:03:35 ]
:match yocchan toshichan



611 名前:名無しさん@お腹いっぱい。 mailto:sage [05/02/21 09:30:55 ]
>>610 で「tanokin torio」がマッチするようになりました。
ありがとうございました。

612 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/03/21(月) 04:20:16 ]
windows環境でgtags.vimを利用している方はいますか?
私の環境だとエラーがでて動かないのですが

613 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/04/23(土) 11:54:58 ]
SuperTab.vim、(GTKの)ximと相性悪くない?
<C-X>押すとximがonになるからいちいちoffにしないと次の操作を受け付けない。

614 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/06/01(水) 14:07:44 ]
Vim7のスクリプトがだいぶ強まってるので
無意味にベイジアンフィルタを書いてみた
ttp://tokyo.cool.ne.jp/hopper2/is_spam.vim
そのうちpythonになっちゃいそうないきおいだ

615 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/06/05(日) 06:54:04 ]
どんなとこが強まってるのかちょっと紹介してもらえるとうれしいです。

616 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/06/05(日) 08:15:44 ]
配列や連想配列が実装された

617 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/06/05(日) 11:37:39 ]
スクリプト勉強中です。環境はWin2K + Kaoriya版Vim6.3です。
自力では解決できなかったので教えてください。

これは動作しますが、Dos窓を閉じる必要があり面倒だなと思い
execute "! dir > C:\\test"

以下の方法を試しましたが、うまく動作しません。
let value = system("dir > C:\\test") "test.txtは作成されない
echo value "エコーは出力される

何故・・・

618 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/06/05(日) 13:38:25 ]
system()は出力をリダイレクトで受け取るから実際に実行するコマンドが
  dir > C:\test > tmpfile
的なことになってるとおもわれ
  :9verbose echo system("dir > C:\\test")
とかすれば確認できる。出力を直接受け取る必要がないなら
  :silent execute "! dir > C:\\test"
で、目的の動作になると思う

619 名前:617 mailto:sage [2005/06/05(日) 21:57:30 ]
>>618
ありがとうございました。期待の動作になりました。

>>612
618さんのアドバイスのおかげで、Win2Kではgtags.vimに以下の変更を加えたらとりあえず動きました。
オプションの変更は正直よく理解してません。

"let cmd = 'global' . sep . '-tq' . option . sep . pattern
let cmd = 'global' . sep . '-tq' . sep . pattern
"let stuff = system(cmd . " > " . tmpfile)
:silent execute "!" . cmd . ">" . tmpfile

ところでglobalってC++のオーバーロードも判断してくれるんですかね?期待して調べたんですが。
なんか無理っぽくてちょっとがっかり気味。

全体で数百万ステップを超えるソフトの改造に入ったんですが、でかすぎてさっぱり分からんのです。
オーバーロードを認識しないctagsでは役に立たない。
VC++で定義位置とかを追うとビルドばっかりで時間がかかり使い物にならず。

助けてくだされ。

620 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/06/05(日) 23:36:16 ]
globalはオーバーロードした関数ごとにタグ作ってるみたいだから
普通に使えるんじゃないの。さすがに文脈を判断してジャンプする
とかむりだろうけど、複数候補から自分で選ぶくらいはできそう。



621 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/06/07(火) 23:32:27 ]
>>615
直接ファイルの入出力ができるようになったのが便利。
あと、まだ実装されてないみたいだけど文字列をforループで処理できるようになるらしい。
つーかリストはやっぱり強力やなぁ。

622 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/06/07(火) 23:52:46 ]
ショパン最強

623 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/06/08(水) 12:51:36 ]
Vim7はこんな風にluaやjavascriptみたいなクラスが書けるのもおもしろい

let counter = {}
let counter.count = 0
function counter.next() dict
  let self.count += 1
  return self.count
endfunction

echo counter.next()

624 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/06/10(金) 23:02:05 ]
言語の強化よりも、もっとvim内部をいじれるように
してほしいんだけど。
そういう改良はないの?

625 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/06/10(金) 23:26:33 ]
>>624
ソースがある。

626 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/06/12(日) 01:05:50 ]
いい加減そういう反応はやめましょうよ…

627 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/06/12(日) 01:09:13 ]
改良を望む人自身が改良するのが一番いいだろ。

628 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/06/12(日) 01:29:23 ]
624の言ってるのは、スクリプトそのものの言語仕様をいくら高めたところで
vim側がスクリプトに委ねてくれるものが今のままでは
どのみち大したことはできないってことなんじゃないの。

スクリプトで出来ることを増やそうと言っているのに
その答えがソース弄れというのは頓珍漢。

629 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/06/12(日) 01:34:56 ]
これは凄いエスパーだな。

630 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/06/12(日) 02:09:28 ]
ソース弄らなきゃその「スクリプトで出来ることを増やす」こともできないだろ
問題は誰がどのように弄るかなの

だったらどうしたいかアイデアを持っている人がやるのが手っ取り早い



631 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/06/12(日) 02:34:21 ]
外部でそういう部分を弄って持ち込んでも某mattn氏の二の舞になるだけだからなあ。
hackするのと、開発の方向性を変えるのとは別次元の問題だよ。

632 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/06/12(日) 03:00:32 ]
とはいえ、開発の方向性を変えるのにパッチを送る以外に有効な方法ある?

まぁ、コミュニティの方向性を変えたいならパッチを送るだけじゃなくって
そういう方向に向くように開発者を説得するのも必要かもしれないが、
それにしたってまず最初にパッチは必要だよね。

633 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/06/12(日) 03:32:00 ]
こういう件に関しては、あまりそうは思わないな。

単なるhackならとりあえず自分の役には立つが、
scriptingのようなものは正式に取り込まれて初めて意味を持つ。
方向性も定まらないうちに闇雲に書いてみても労力が無駄になるだけだ。
socialを先にすべき問題だろう。

634 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/06/12(日) 03:33:33 ]
ま、一つ二つ見本くらいは作ってみせてもいいだろうけどネ

patch出して取り込んで、というものとは少々違うわけですよ。

635 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [2005/06/12(日) 10:34:46 ]
一応参考まで。

私の経験で言うとscriptingの拡張としては、User Defined CompletionがVim7で取り
込まれました。パッチはBram氏には相談せずに書き始めました。書き始めた時には無
駄になることも覚悟の上でしたが、ちょうどWin専用で無理矢理Intellisenceを行う
スクリプトが発表された直後だったこともあり、コンセプトは受け入れてもらえると
確信はしていました(まさか関数の定義方法とか殆どそのままだとは思いませんでし
たがorz)。仕様が小さくなかったのでVim6には見送られましたが、Vim7で日の目を見
たというわけです。

逆に言えばVim7開発中である今なら、比較的取り込んでもらいやすいでしょう。もち
ろんパッチの形のほうがBram氏の手間が低くなるので取り込んでもらえる確率は高い
のですが、海外の方はたとえ信義に反しても理に適っていれば納得する傾向があるの
で、コンセプトだけでも背景や考え方つまり説得力があれば、採用される可能性は高
くなるでしょう。

特にMzScheme用のマルチスレッドや、関数ポインタが導入された今ならば、上手くす
れば相当に面白い機能を突っ込める気がしています。

636 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/06/12(日) 15:17:25 ]
文字コード判定スクリプト。gaucheのguess.cを移植してみた。
ttp://tokyo.cool.ne.jp/hopper2/guess_enc.vim
こっちはlibiconvの移植。(要vim7)
ttp://tokyo.cool.ne.jp/hopper2/vimiconv.tar.bz2

ありえないほど遅いです。
...とんだ無駄足だったよorz

637 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/06/12(日) 15:22:53 ]
>>636
いやいや、興味深い。
今日の夜にでも試させてもらうよ。



638 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [2005/06/12(日) 15:44:21 ]
>>636
> ありえないほど遅いです。

{}による名前の解決が多いのが原因かもしれないですねぇ。だとすればC++のテンプ
レートみたいに、functionの中でfunctionを定義する、ジェネリックなことができれ
ば解決できるかもしれません。

libcall()使っちゃうのが王道だとは思いますけど。

639 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/06/13(月) 01:20:26 ]
>>636
試してみた。
500行くらいまでなら、ありえないってほどには遅く感じなかったよ。
10000行のファイルは帰ってこねぇ、、、

640 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/06/17(金) 23:53:41 ]
synID(line,col,flag)のflagって0でも1でも同じに感じるんですが
どう違うんでしょうか?いまいちわからない…



641 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/06/19(日) 23:02:44 ]
transparent 属性がついてる構文アイテムの上では違う結果を返すんじゃない。
:set ft=c として ( の上で
:echo synID(line("."),col("."),1)
:echo synID(line("."),col("."),0)
すると違う結果になるよ。


642 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/06/20(月) 21:13:20 ]
ttp://tokyo.cool.ne.jp/hopper2/undo_ex.vim
undoのシリアライズとemacsのselective undoもどき(要vim7)

643 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/08/02(火) 05:10:24 ]
ttp://tokyo.cool.ne.jp/hopper2/kanaconv.vim
簡易ローマ字入力メソッド(要vim7)
まともな辞書を用意すればなんとか使いものになる...かも?

644 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/08/02(火) 12:08:37 ]
それよりim_customの強化きぼんぬ

645 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/08/03(水) 03:48:22 ]
ttp://tokyo.cool.ne.jp/hopper2/kanaconv.vim.gz
とりあえず、
かんな辞書の取り込み
変換リストのプレビュー
文節区切りの変更
MeCabや茶筌などの形態素解析器との連携
を実装した。
初期変換の制度を上げるのは難しそうだなぁ。

646 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/09/26(月) 19:30:09 ]
DLLの扱いが
libcall() -> DLLロード -> 関数呼び出し -> DLLアンロード
じゃなくて
libopen() -> DLLロード
libcall() -> 関数呼び出し
libclose() -> DLLアンロード
とか、DLLのインスタンスを保持できるようになってないのがちょっと不思議。

647 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [2005/09/26(月) 20:58:17 ]
>>646
インスタンスを保持する変数が無いから。というより変数にはインスタンスを保持でき
なかったから、と考えるのが正確かも。Vim7の変数は多少事情が違うので、うまく議論
できればそのようにすることは不可能じゃない、とは思います。

648 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/09/26(月) 21:46:15 ]
単純にDLLが状態保持できればと思ったんだけど、でもそうか、
どうせなら複数インスタンスを作れた方がおもしろそうだ。
それならlibopen()がDLLから関数リストをもらって、その関数をセットした
ディクショナリを返すとかがいいな。ついでに引数の制限もゆるめてほしい。
まぁ議論なんてできないわけだが...on

649 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [2005/09/27(火) 08:44:17 ]
>>648
> それならlibopen()がDLLから関数リストをもらって、

DLL自体にはタイプライブラリ機能はありませんから。COMやXPCOMとかいうあたりがな
いとダメでしょう。

> ついでに引数の制限もゆるめてほしい。

マーシャリングですねぇ。つい最近vim-devで、if_*で呼び出せるスクリプト言語か
ら、Vim本体の変数を操作するようなジェネリックな方法がどうとか、そういう議論が
ありました。ガンバレばその流れで関連技術を滑り込ませられるかもしれません。

とはいえ、なんかそれって.NETだよなぁ。

650 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/09/27(火) 20:06:51 ]
おれはVim専用のDLLを考えてました。
char* vim_getfunclist() という関数から"1,1,func1,1,3,func2"
みたいな文字列が返ってきて、この場合なら引数を一つ取るfunc1()と、
一つから三つまでの引数を取るfunc2()を、DLLは持っている。
関数のプロトタイプは char** func(int argc, char* argv[])
で、文字列のリスト(NULL終端)を返す。みたいな簡単なの。
あとはVimの関数をDLLに渡して、pVim->eval("@a")とかできるようにしたり。
あんまり深くVimの内部まで操作出来るようにすると、お手軽じゃなくなりそうなんで、
Vimへのアクセスは他のスクリプトと同程度になりそうだけど、DLLをC言語で書くなら
Vimの内部表現を直接いじりたいかも。
うーん…欲しいなぁ。



651 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/09/27(火) 21:38:28 ID:0]
あー、でもどうせvimスクリプトでDLLをラップするだろうから
DLLの扱いはシンプルでいいのかも。

652 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [2005/09/27(火) 22:01:32 ID:0]
内部表現をいじるなら、先ずはソースコードを直接触っちゃったほうが速いでしょう。
難しいところなんですが、エディタとしての価値を直接高めるのに必要な拡張であれ
ば、思いの他すんなり通るものです。一方、間接的なもの、スクリプトの表現力を上げ
てそれが結果的に、というのはなかなかに難しそうです。

653 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/09/28(水) 03:33:56 ]
どうもDLLをロードするたびに新しいインスタンスが作られるわけではないようで、
複数インスタンスを作るのは難しそう。
というわけで、DLLのインスタンスを保持するだけの最低限のものを作成。
これでもけっこう遊べるかな。
www.uploda.org/file/uporg203304.zip.html
こんな感じで使う
:call libopen('sum.dll')
:echo libcallnr('sum.dll', 'add', 1) => 1
:echo libcallnr('sum.dll', 'add', 32) => 33
:call libclose('sum.dll')
:echo libcallnr('sum.dll', 'add', 43) => 43  "いままでどおり使うこともできるが
:echo libcallnr('sum.dll', 'add', 32) => 32  "毎度初期化される
これだけでだいぶ幅が広がると思うんだけど…
GUIのウィンドウとか、通信とか...

654 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/09/28(水) 04:22:52 ]
そういうのは今でも出来るけど、ちょっとしたサーバ(daemon?)を作るのが面倒くさいな。

655 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/09/28(水) 06:02:12 ]
> 6   Add support for loading shared libraries, and calling functions in it.
>       :libload internal-name libname
>       :libunload internal-name
>       ...
優先度は低いながらもいちおうTodoには入ってるようで、ver5.3のころから。
たぶんこれはlibcall実装前のTodoな気もしますが…。
libcallの引数を増やすのも、DLLからVimのコマンドを呼べるようにするのも
Todoに入ってますね。

656 名前:名無しさん@お腹いっぱい。 [2005/11/14(月) 23:07:34 ]
verilogの回路を、vimを使ってで記述しています。
で、vimだけ(一部、tag生成のためにperl)をつかって、ドライブ元を自動検索する
スクリプトを作成中です。
そこで、質問ですが、以下の信号を検索するための正規表現をどうしたら最適だと思いますか?
正規表現が無理なら、関数でも可能です。
1.
xxxxが入力ピンとして存在することを調べる
input   xxxx;

input   yyyy,   /*testdesu*/
        xxxx;
2.xxxxが、ドライブされていることを検索
xxxx = yyyy ;

xxxx <= (zzzz <=
    yyyy) ;
3.xxxxが、接続されているピンを検索
.yyyy(xxxx)
や、
.yyyy(  // pin
    /* test */
    xxxx )
今の僕の検索は
1.input\_[^;]*\<xxxx\>
2.\<xxxx\>\_[ \t\[\]0-9:{}]*<\==\_[^;=]\+\_[^;]*;
3.(\_\s*\(\/\*\_.\{-\}\*\/\)\=\_\s*xxxx\>
なんて感じです。結構適当ですが、まぁ、そこそこヒットします。
微妙にスレ違いかもしれませんが、いいアイディアがあれば教えてもらえればと思います。
結構コメントがいろいろ入る可能性があるので、本来は構文解析させるべきなんでしょうが、
それだと、リアルタイム性が薄れるので、なんとか、ベースは検索+関数って感じで
やりたいと思っています。

657 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/11/20(日) 08:30:23 ]
Verilogというハードウェア記述言語のソースを書いていて、
それをサポートするツールをVimスクリプトで作っていて、
んで、C言語で例えるなら、ある変数の宣言位置や、代入されている位置や、
その変数を引数に取っているある関数を探したい、ということなんかな?
なにが問題なのかよくわかんないからなんとも言えないけど、
そこそこの割り切りは必要じゃないかと。
検索するだけなら:g/xxxx/.-3number 6とかして目視とかョョョ

658 名前:名無しさん@お腹いっぱい。 [2005/11/24(木) 11:56:54 ]
vim スクリプトで skk を実装してみました。
あやしいところが多々ありますが、
とりあえず動いているようです。
よかったら使ってみてください。
www.jt200x.com/uploder/src/up0272.zip

659 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/11/24(木) 16:12:56 ]
>>658
すごいですね。

660 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/11/24(木) 16:14:05 ]
たしかにあやしいw
けどまっつんさんのskkim.vimより変換がかろやか



661 名前:名無しさん@お腹いっぱい。 [2005/11/25(金) 00:30:13 ]
rate this script│(*)God ( )Life Changing ( )Helpful ( )Unfulfilling [rate]

再帰登録や補完にまで対応とは、凄いですね。さっそく使わせて頂いております。


ちょっとだけ改造してみました。検討して頂けると嬉しいです。
ttp://www.jt200x.com/uploder/src/up0293.zip
・▽を<C-H>で削除した後に挙動がおかしくなる現象を修正
・gSで辞書を手動セーブ
・以下のオプションを追加
let skk_egg_like_newline = 1 " <CR>で確定しても改行しない
let skk_show_annotation = 1 " skkinput2ライクなannotation表示 (ださい)
" skkサーバなんちゃって対応 (設定するとL辞書は読まない)
let skk_external_prog = "/usr/bin/env ruby -Ke ~/ruby/skkservcaller.rb -w"
"let plugin_skk_disable = 1 " pluginの無効化

直せなかったもの:
・「. /./・/。/…;.../」のような . や \ などを見出しに含むエントリがおかしい。
 search()が正規表現と解釈するため。(これはこれで/anno.* とかできて面白い?)
・タイプ速度が速いとキーを取りこぼす
・検索やコマンドラインなどで入力できない
・カタカナモードでの変換結果がかなを含む場合はトグルする必要がある(▽ヨミカタ→「読ミ方」)
・Chaliceでは[SKK:あ]が表示されない

その他:
mfdは200はないとダメみたいです。
Lisp対応は(concat "hoge")ってのだけあれば十分だと思います。
今後に大いに期待しておりますので、がんがって!

662 名前:658 mailto:sage [2005/11/25(金) 17:22:12 ]
>>659
>>660
さっそく使ってみてくれてありがとう。

>>661
素早い手直しありがとうございます。
ほとんど使わせてもらいましたが、
> ・▽を<C-H>で削除した後に挙動がおかしくなる現象を修正
これがよくわからないので詳しく説明して!
> ・gSで辞書を手動セーブ
ここにすると skk_keep_state == 0 のときに map されないので、
グローバルにしてみました。skk_manual_save_jisyo_keys を
空にするとこのグローバルマッピングは行わないことにしました。
> " skkサーバなんちゃって対応 (設定するとL辞書は読まない)
> let skk_external_prog = "/usr/bin/env ruby -Ke ~/ruby/skkservcaller.rb -w"
これはskkサーバを動かしていないのでわからない。取り入れたけど。

> ・「. /./・/。/…;.../」のような . や \ などを見出しに含むエントリがおかしい。
これは直しました。これを直してるときに SkkSaveEnv のバグを
発見したのでここも直しました。
> ・タイプ速度が速いとキーを取りこぼす
これは腕がないので再現できません。とりあえず screen の paste では
取りこぼしはないように見えるんだけど…。
> ・検索やコマンドラインなどで入力できない
やる気はあるけどちょっと時間がかかりそう。
> ・カタカナモードでの変換結果がかなを含む場合はトグルする必要がある(▽ヨミカタ→「読ミ方」)
これはわりとすぐにできそうです。
> ・Chaliceでは[SKK:あ]が表示されない
これは確かに自覚症状があったので、ちょっと調べてみます。

とりあえず今日できたところまで
ttp://www.jt200x.com/uploder/src/up0309.zip

663 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/11/25(金) 22:58:06 ]
>>662
おお、ありがとうございます。良い感じです。

> > ・▽を<C-H>で削除した後に挙動がおかしくなる現象を修正
> これがよくわからないので詳しく説明して!
次の手順で再現できると思います。
/ "▽|"
<C-H> "|"
/ 'Already in ▽ mode'

> elseif b:skk_henkan_mode == 1 && s:SkkCursorCol() < b:skk_hstart
ここでのSkkCursorCol()はカーソル移動「前」の値なので
"<"が成立せず、▽を消しても▽モードから抜けられない結果になります。
「消去後に、変換開始位置とカーソルが一致する」のが正しい条件なので:
> elseif b:skk_henkan_mode == 1 && s:SkkCursorCol() <= b:skk_hstart + 2


> > ・タイプ速度が速いとキーを取りこぼす
> これは腕がないので再現できません。
マシンがボロい(か、辞書がデカい)と再現するのかもです。


> > let skk_external_prog = "/usr/bin/env ruby -Ke ~/ruby/skkservcaller.rb -w"
> これはskkサーバを動かしていないのでわからない。取り入れたけど。
あるといろいろ面白いですよ。複数辞書に対応できたりして。
本当はvim scriptで直接サーバと更新できるといいのですが。

664 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/11/25(金) 23:07:38 ]
.vimrcの設定例を晒しておきましょう。

let skk_jisyo = "~/.skk-vim-jisyo" " .skk-jisyoだとemacsが起動してたら危険
let skk_show_candidates_count = 2 " これ気が効いてる
let skk_keep_state = 1
let skk_egg_like_newline = 1
let skk_show_annotation = 1
let skk_special_midasi_keys = ">" " ?は普通に使いたい
let skk_user_rom_kana_rules = ""
\. "z<《\<NL>"
\. "z>》\<NL>"
\. "z  \<NL>"
let skk_user_rom_func_rules = ""
\. ";SkkSetHenkanPoint1(kana)\<NL>"
" 要はサーバさえ呼べれば何でもいい
let skk_external_prog = "/usr/bin/env ruby -Ke ~/bin/skkservcaller.rb -w"
set maxfuncdepth=200


実際このスクリプトはかなりのものだと思うので、
できるだけ早い段階で陽の当たる場所へ出してやってほしいです。
vim scriptのSKK! かなりインパクトありますよ。

665 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/11/26(土) 15:13:56 ]
置く所無いんだったら vim wiki にでも置かせてもらったら?
つ ttp://vim.mydns.jp/?scripts

666 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/11/28(月) 17:26:12 ]
tokyo.cool.ne.jp/hopper2/if_spidermonkey.diff
VimのSpiderMonkeyインターフェース。
適当にmakefileを書き換えればコンパイルできます。

667 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/11/28(月) 19:01:41 ]
>>663
なるほどよくわかりました。ただ skk_marker_white を変数に
しているので strlen(g:skk_marker_white) としました。

・カタカナモードでの変換結果がかなを含む場合
これは直しました。

・Chaliceでは[SKK:あ]が表示されない
これは調べてみたら Chalice は statusline を使っていて
親切にも chalice_status_line という変数があったので
let chalice_statusline = '%{SkkGetModeStr()}'
とすれば表示されるようになりました。

>>664
>>665
もうちょっとこの場所で続けさせてください。
ttp://www.jt200x.com/uploder/src/up0548.zip

668 名前:mattn@Vim%Chalice mailto:sage [2005/11/28(月) 20:49:30 ]
# skk.vim
良いっすね。
期待してまつ。

669 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [2005/11/28(月) 21:55:18 ]
>>666 それ、vim-devに投げてみたらどうですか? 結構賛同者は多い予感がします。

670 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/11/28(月) 23:55:14 ]
>>669
まともに受け答えできそうにないのでやめときます。
いやほんとお恥かしい…。



671 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [2005/11/29(火) 08:57:08 ]
>>670
インストールの手順とかSpiderMonkeyのリソースなどについて、日本語で簡単に解説
してもらえますか? 何が必要で、どこから持ってきてどうすれば良いのかとかどんな
環境で動作確認できたとか。

# これだけの仕事量をうもらせてしまうのは忍びありません

672 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/11/29(火) 17:46:33 ]
>>671
おお、代わりに投げてくださるんでしょうか。ありがとうございます。
ざっくりとコンパイル手順を書いてみました。
FreeBSD6とWindowsXP(+mingw)でコンパイル、動作確認しています。
tokyo.cool.ne.jp/hopper2/if_spidermonkey_make.html

673 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/11/29(火) 21:39:14 ]
>>672
乙。でも使用方法や例といった本当のドキュメントも欲しいなぁ。
っちゅうか、ドキュメントなかったら、相手してくんないかも。

674 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/11/30(水) 03:37:00 ]
tokyo.cool.ne.jp/hopper2/if_spidermonkey.txt
でっちあげコピペヘルプ。
整理したらオブジェクト設計の迷いがうきぼりに...orz

675 名前:名無しさん@お腹いっぱい。 [2005/12/01(木) 19:08:05 ]
あ…あの…
カレントファイル名フルパスの文字列の長さを得るにはどうすればよろしいですか…?

676 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/12/01(木) 19:14:25 ]
:echo expand("%:p")

677 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/12/01(木) 19:16:04 ]
違った...
:echo strlen(expand("%:p"))

678 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/12/01(木) 19:21:29 ]
>>676
ありがとうごさいました

679 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/12/01(木) 20:21:18 ]
最近やたら濃かったから、何か清々しくていいなw

680 名前:名無しさん@お腹いっぱい。 [2005/12/02(金) 12:30:57 ]
二行以上(表示が)になってしまう行は、背景を違う色にしたいのですが、どうすればよろしいですか?



681 名前:名無しさん@お腹いっぱい。 [2005/12/02(金) 13:07:17 ]
ファイルパスの文字列からファイル名文字列のみ抽出するにはどうすればいいですか?

682 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/12/03(土) 21:03:55 ]
>>681
:echo fnamemodify("/path/to/file.txt", ":p:t")

>>682
ムリ。一時的に強調するだけならなんとか…
function! MatchLongLine()
  let w = winwidth("%")
  let w = w - &foldcolumn
  if &number
    if v:version >= 700
      let w = w - &numberwidth
    else
      let w = w - 8
    endif
  endif
  if &list && &listchars =~ 'eol:'
    let w = w - 1
  endif
  if has('signs')
    redir @a
    silent sign place
    redir END
    if @a =~ 'line='
      let w = w - 2
    endif
  endif
  execute 'match Error /^.*\%>' . w . 'v..*$'
endfunction

683 名前:名無しさん@お腹いっぱい。 [2005/12/05(月) 01:31:37 ]
ありがとうございました^^

684 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/12/05(月) 02:20:12 ]
skk.vimの調子はいかがー?

685 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/12/06(火) 14:20:19 ]
skk.vim
コマンドライン入力を可能にしました。
(concat "文字列")に対応しました。
試してみてください。
ttp://49uper.com:8080/html/img-s/98992.zip

それとコマンドラインに入ったときは必ず off の状態になるように
したんですが、ここら辺への意見を聞かせてください。

686 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/12/06(火) 15:03:17 ]
>それとコマンドラインに入ったときは必ず off の状態になるように
>したんですが、ここら辺への意見を聞かせてください。
>>685
コマンドラインでは日本語を入力することはあまりないので問題な
いと思います。
検索の場合は日本語を入力することも多いでしょうから前回の状態
を保存できるといいかもしれません。

687 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/12/06(火) 20:49:13 ]
>skk.vim
変換候補の先頭でのxと末尾でのスペースの挙動が変です。
例えば、
1) A:藹  S:姶  D:会  F:饗  [残り 0]
2) あい<space>
となります。まぁホンモノのskkは知らないのだけれど。
あとできればESCで変換をキャンセルしたいです。
困ったときのESC連打が通用しないとパニくります。

688 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/12/07(水) 05:35:16 ]
>>685
imapやcmapじゃなくてlmapを使うと
状態管理とかしなくていいし楽なんじゃなかろうか。
mapのバッティングとか気にしなくていいし、
カーソルの色も変るし。

689 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/12/07(水) 17:33:28 ]
>>687
> 変換候補の先頭でのxと末尾でのスペースの挙動が変です。
第一候補で x 読みに戻す。
最終候補で <space> 登録モードに入る。
ということでしたらこれは正しい挙動だと思いますが…。

> 困ったときのESC連打が通用しないとパニくります。
困ったときは <C-g> を連打してください。

690 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/12/07(水) 17:34:29 ]
>>688
> imapやcmapじゃなくてlmapを使うと
> 状態管理とかしなくていいし楽なんじゃなかろうか。
あ、これいけるかも。
lmap = keymapファイルというイメージがあったので、
端から除外していました。
ちょっととりかかってみます。



691 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/12/07(水) 19:11:13 ]
undoはなんとかしたいところだが、これはvimscriptの構造的な問題だな。
scriptをブロック化してundoの単位を指定する命令がないんだもん。

692 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/12/12(月) 11:17:15 ]
vimでプロセスを起動してそのプロセスと通信するにはどうすれば
いいですか?
emacsのstart-process, process-send-stringのようなものです。

693 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/12/12(月) 13:47:29 ]
>>685
コマンドラインや検索ではskk_egg_like_newlineが効いていないようです。
あと、コマンドラインや検索を<C-H>で抜けられなくなるようです。

694 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/12/12(月) 15:23:51 ]
>>692
if_perlとかif_rubyとか使うのが簡単じゃないすかね。
もしくはvimと他プロセスを仲介してくれるサーバーを書くとか。

695 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/12/12(月) 15:47:12 ]
if_rubyの実際の使用例やサンプルって:h ruby以外にはありませんか?
ruby側と引数をやり取りする方法とかさっぱりわかんないっす。

696 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/12/12(月) 16:43:53 ]
>>695
rrb

697 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/12/12(月) 16:45:27 ]
>>694
>もしくはvimと他プロセスを仲介してくれるサーバーを書くとか。
そのサーバとどうやってやりとりするのですか?

698 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/12/12(月) 16:56:56 ]
skk.vimがないのですが。
再うpきぼんです。

699 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/12/12(月) 17:27:08 ]
>>696
ありがとうございます、読んでみます。

700 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/12/12(月) 17:36:21 ]
>>697
:!client send message > result
とかlibcall()とか
クライアントの中身はソケットでもSendMessage()でもなんでも



701 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/12/12(月) 17:42:00 ]
>>700
どうも。if_{perl,ruby}使った方が楽そうですね。

702 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/12/13(火) 17:15:48 ]
skk.vim
>>693
とりあえず回避しました。

maxfuncdepthの件
おおよそ今までの半分ぐらいで大丈夫になったんじゃないかと思います。
(本当はループで回せればいいんだけど再描画がうまくいかなくて...。)

暫定バージョンです。
ttp://49uper.com:8080/html/img-s/99866.zip

cmapの<c-\>eと<c-r>=の違いについて
throwすると<c-\>eの方はすぐに反応が返ってくる(input()を抜ける)のに、
<c-r>=だと固まる(というかinput()を抜けずにそのままの状態でいる)
わけを誰が知っていたら教えてください。

703 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/12/13(火) 20:17:43 ]
c_CTRL-R_= の処理でエラーチェックしてないから
この辺
*** ex_getln.c.orig     Tue Dec 13 19:04:59 2005
--- ex_getln.c  Tue Dec 13 19:28:15 2005
***************
*** 1048,1053 ****
--- 1048,1054 ----
                break;
  #endif
 
+ case_esc:
        case ESC:       /* get here if p_wc != ESC or when ESC typed twice */
        case Ctrl_C:
                /* In exmode it doesn't make sense to return. Except when
***************
*** 1094,1099 ****
--- 1095,1105 ----
                        save_cmdline(&save_ccline);
                        c = get_expr_register();
                        restore_cmdline(&save_ccline);
+                       if (get_expr_line() == NULL)
+                       {
+                           beep_flush();
+                           goto case_esc;
+                       }
                    }
                }
  #endif

704 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/12/14(水) 11:53:11 ]
>>703
ありがとうございます。
ということは、現時点では <C-\>e を使うしかないということか…。
まぁ、登録の時だけなので cmap を切り替えてやってみます。

705 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/12/15(木) 20:56:05 ]
skk.vimで▽モードのときに色を付けるのはvimスクリプトでは無理?

706 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/12/16(金) 02:09:37 ]
漢字変換の仕方がわからない、、、

707 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/12/16(金) 02:21:48 ]
>>706
skkを勉強しなさい

708 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/12/16(金) 22:34:34 ]
skk.vim をwindowsで使用しているのですが、
skk_jisyoに空白があるパスを指定するとエラーが出てしまいます。

この場合何か特別な書き方があるんでしょうか?

709 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/12/16(金) 23:49:43 ]
skk.vim,便利に使わせて頂いてます.
2点報告と,1点要望です.

その1 single-repeatの挙動

あほ
あほ
あほ

1. コマンドラインで /あほ
(「あほ」を検索)

2. 最初の「あほ」の「あ」の位置で cwばか<esc>
ばか
あほ
あほ

3. n.n.
ばか
ばか
ばか
となってほしいところが
ばか
bばkか
bばkか
となる

710 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/12/16(金) 23:52:18 ]
その2 変換中に折り返しが来る場合の挙動
1. :set tw=20 (便宜上,少な目に)

2. 行頭から以下を入力(日本語モードで)
choudoOrikaesi<spc><c-j>deHenkan

ちょうど折り返しで▽
hへんかん

となる


その3
skk_imみたいにモード表示がほしい
(これはただの要望なので,聞き流してください)




711 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/12/17(土) 00:03:45 ]
>>710
モード表示ありますよ。
se stl&

712 名前:710 mailto:sage [2005/12/17(土) 00:32:16 ]
>>711
ありがとう,知りせんでした.

しかも skk_im ってなんだよ…
im_customの間違いでした orz


713 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/12/18(日) 17:06:28 ]
>>700
dllの中で自身をロードすれば、libcallの呼び出し後もdllは開放されないので、
状態を保持しなきゃいけないような拡張もlibcallとdllだけで可能。

714 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/12/19(月) 17:56:01 ]
>>708
let skk_jisyo = 'C:\Program\ Files\hoge' または
let skk_jisyo = "C:\\Program\\ Files\\hoge"

>>709-710
うーん、どっちも悩ましい問題です…。
しばらく宿題とさせておいてください。

715 名前:708 mailto:sage [2005/12/19(月) 19:39:07 ]
>>714
ありがとうございます。無事下記のようにして読み込むことができました。
let skk_jisyo = escape( $VIM ,' ').'\_skk-jisyo'


716 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/12/24(土) 03:21:17 ]
tokyo.cool.ne.jp/hopper2/vimuim.c
tokyo.cool.ne.jp/hopper2/uim.vim
uimを使った文字入力。オモチャだけど...。今のところほぼ挿入モード専用です。

使い方:
1. vimuim.cを適当にコンパイルする。
  $ cc -shared -o vimuim.so -I/usr/X11R6/include/uim vimuim.c -L/usr/X11R6/lib -luim
2. uim.vimとvimuim.soをruntime/keymap/にコピーする。
3. :set keymap=uim と設定する。
  CTRL-^で言語を切り替えれば入力できるようになります。

オプション:
g:uim_lang (デフォルト"ja")
g:uim_engine (デフォルト"anthy")

717 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/12/24(土) 08:21:39 ]
>>716
実は私もvim-uimをrubyで作ろうとしていたのでした。(まだ手をつけていないけど)
今後の開発に期待しております。

718 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/12/25(日) 23:48:41 ]
みんな濃いなあ。。。
やっぱり日本語入力はvimmer共通の悩みなのね

719 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/12/26(月) 22:18:51 ]
>>716
コマンドラインを使えば、プリエディットに色をつけれるのか。
バッファ内にプリエディットを表示させるときは色はつけれないで
すよね?

720 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/12/27(火) 08:37:12 ]
例えば、2行3列目の文字を強調する
:syn match Error /\%2l\%3c./
とか細かい指定もできるので一応できます。
ただ、C言語のコメントのような、syn-regionで範囲指定された
空間の中はどうがんばっても無理です。たぶん。



721 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/12/27(火) 11:59:07 ]
skk.vim
・lmapを使うように変更しました。
・>704 の問題を直しました。おまけとして undo がだいぶきれいになりました。
・変換時の色付けを追加しました。
・ウィンドウサイズが崩れなくなりました。
ttp://49uper.com:8080/html/img-s/101947.zip

722 名前:名無しさん@お腹いっぱい。 [2005/12/27(火) 13:13:46 ]
s/>704/>709
の間違いでした...

723 名前:mattn@Vim%Chalice mailto:sage [2005/12/28(水) 09:09:36 ]
# skk.vim
vim.org の scripts に入れて見られてはどうですか?
結構日本人には、反響あると思いますし、防火壁内の人にも
よいのでは?
# もちろんそのあかつきには、「Life Changing」です。

724 名前:709+710 mailto:sage [2005/12/28(水) 16:31:09 ]
>>709 に関してはバッチリ直っていることを確認しました.

(前バージョンでは出なかった)以下のエラーが出ました.
例えば >>710 の操作で再現すると思います.

Error detected while processing function <SNR>18_SkkKey..<SNR>18_SkkInsert..<SNR>18_SkkInsertKana..<SNR>18_SkkEraseRom..<SNR>18_SkkDeleteRange:
line 23:
E474: Invalid argument: backspace+=indent,eol

Error detected while processing function <SNR>18_SkkKey:
line 42:
E171: Missing :endif


…いつも報告ばかりでスミマセン.
大掃除が終わり次第自分でも中身を見てみたいと思いますが,取り急ぎご報告まで.

725 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/12/28(水) 17:33:26 ]
>>724
こちらでは再現できません。
vim のバージョンはいくつでしょうか?

また、set backspace=indent,eol か
let &backspace = "indent,eol"
でエラーは出ますか?

726 名前:725 mailto:sage [2005/12/28(水) 18:41:33 ]
>>724
理由がわかりました。'backspace' の値が数値だとエラーが出るようです。
以下のパッチを当ててください。
1121c1121
< set backspace+=indent,eol
---
> set backspace=indent,eol
1196c1196
<     set backspace+=indent,eol
---
>     set backspace=indent,eol
1297c1297
<   exe "lnoremap <silent> <buffer> " . g:skk_abbrev_to_zenei_key . " <C-r>=<SID>SkkKey(\"<C-v>" . g:skk_abbrev_to_zenei_key . "\")<CR>"
---
>   exe "lnoremap <buffer> " . g:skk_abbrev_to_zenei_key . " <C-r>=<SID>SkkKey(\"<C-v><C-q>\")<CR>"
1366c1366
<   elseif a:key ==# g:skk_abbrev_to_zenei_key
---
>   elseif a:key == "\<C-q>"

727 名前:724 mailto:sage [2005/12/28(水) 20:00:54 ]
>>726
素早い反応ありがとうございます.

> 以下のパッチを当ててください。
修正(>>721以前のスクリプトの挙動になっていること)を確認しました ♪

728 名前:名無しさん@お腹いっぱい。 [2005/12/29(木) 00:23:01 ]
gvim は uim 1.0.0 以上の vim 協調モードでOKな気がする。
コンソールは uim-fep でこれまたOK

729 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/12/29(木) 00:43:00 ]
文章書きたい人には毎回offで始まる協調モードはあまりOKじゃないっす。

730 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/12/29(木) 01:52:54 ]
onだったらコマンド送れないやん



731 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/12/29(木) 01:54:28 ]
そりゃ当たり前。
だからコマンドモードではoff、挿入モードではonまたは前回と同じ状態という
制御が求められるのですよ。

732 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/12/29(木) 13:34:23 ]
>>716
こりゃいーわ
imcustomみたいで

733 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/12/29(木) 14:45:59 ]
というかgvimのmbyte.cは腐ってるから、誰か書き直さない?


734 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/12/29(木) 17:13:53 ]
先生!アボートしますた。

*** glibc detected *** double free or corruption (out): 0x085089e8 ***
Vim: 致命的シグナル ABRT を検知しました

735 名前:名無しさん@お腹いっぱい。 mailto:sage [2005/12/30(金) 18:10:01 ]
>>733
そういえば文字化けしまくるな

736 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/01/12(木) 20:58:14 ]
インストールされているカラースキームを数秒ごとにスライドショーのように
表示するスクリプト、作成お願いします。

737 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/01/12(木) 22:06:03 ]
let i = 0
let color_files = globpath(&runtimepath, "colors/*.vim")
while i < strlen(color_files)
  let file = matchstr(color_files, "[^\n]*", i)
  execute "source " . file
  redraw
  echo g:colors_name
  let i = i + strlen(file) + 1
  sleep 1
endwhile

738 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/01/13(金) 16:21:19 ]
神光臨!

それにしても、colors_name を設定していない不届き者が何名がおるの。
自分がインストールしている範囲で、6カラースキームあった。

739 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/01/14(土) 13:23:56 ]
skk.vim取れないよん
再うpよろ

740 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/01/16(月) 18:23:43 ]
skk.vim
ちょっとだけしか手を入れてないけど
ttp://49uper.com:8080/html/img-s/105893.zip



741 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/01/18(水) 14:27:05 ]
>>740
ありがとうございます。DLできました。

742 名前:739 mailto:sage [2006/01/20(金) 00:55:45 ]
あー、ちょっとこのスレ覗かないうちに・・
うpしてくれたけど、もう落とせない・・ ガーソ

743 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/01/20(金) 17:28:40 ]
skk.vim
>740 とまったく同じ
ttp://49uper.com:8080/html/img-s/106584.zip

744 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [2006/01/20(金) 17:38:06 ]
>>743 www.kaoriya.net/testdir/skkvim-20060116.zip
にコピーを置いておきます。

745 名前:743 mailto:sage [2006/01/23(月) 09:25:21 ]
>> KoRoN 様
お手数をおかけして申し訳ありません。
ありがとうございました。

746 名前:743 mailto:sage [2006/01/24(火) 02:27:19 ]
>>744
やっと落とせた
おおきに!

747 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/01/26(木) 16:44:31 ]
vimスクリプトの関数って2つの値を返す、もしくは引数の値を書き
換えることってできないのですか?

748 名前:mattn@Vim%Chalice mailto:sage [2006/01/26(木) 17:40:25 ]
>>747
function! Test()
  let l = [1, 2]
  return l
endfunction
let r = Test()
echo r[0]
echo r[1]

では駄目ですか?

749 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/01/26(木) 17:53:16 ]
>>748
それ、vim7ですよね。

750 名前:mattn@Vim%Chalice mailto:sage [2006/01/26(木) 18:00:43 ]
そうですね。
vim6 では、セッション変数を利用するしかないと思われます。
# もしくは改行などのセパレータを使った文字列を返す等



751 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/02/02(木) 02:17:24 ]
知らんかった。感動した。
:let filename = "hoge.txt"
:e `=filename`

752 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/02/03(金) 01:27:09 ]
gvimでなくvim(GUIでなくターミナルでvimが起動している)という判定を
vimscriptで書くとどうなりますか?

753 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/02/03(金) 01:34:09 ]
:echo has('gui_running')

754 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/02/03(金) 01:37:35 ]
>>752
if has("gui_running")
    "GUI
else
    "CUI
endif

755 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/02/04(土) 02:50:26 ]
>>753-754

ありがとうございました。


756 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/02/05(日) 09:14:25 ]
vim scriptだけでskkが動くのならmigemoもできるかも?

757 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [2006/02/05(日) 10:22:44 ]
>>756
1行の候補を探せば良いだけのSKKと、探し出した複数行の候補を正規表現へ組み立て
なければならないMigemoでは少し事情が違い、大量のCPUとメモリを使ってしまうで
しょう。回避策はいくつか考えられますが、実用になる速度+メモリで動くようにな
るには少し時間がかかる気がします。

758 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/02/07(火) 21:23:34 ]
scriptの中で
% s/a/b/g
を実行したときにaが見つからないと

処理中にエラーが検出されました。
E486: パターンはみつかりませんでした。: a

のようなエラーメッセージが表示されてうるさいので
try〜catch文で囲ってるんですがどうもcatchできない
みたいです。パターンがなくてもエラーメッセージが
出ないようにしたい場合どうすればいいんでしょうか?

759 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/02/07(火) 21:26:54 ]
%s/a/b/ge

:h :s_flags

760 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/02/07(火) 21:59:59 ]
>>759 うまくいきますた。謝呀



761 名前:名無しさん@お腹いっぱい。 [2006/02/24(金) 13:46:01 ]
:let foo = "Hello World"
:echo foo
Hello World
:let foo = 5
:let bar = "2"
:echo "foo+bar=" . (foo + bar)
foo+bar=7



762 名前:名無しさん@お腹いっぱい。 [2006/03/14(火) 10:56:49 ]
skk.vim
お久し振りです。
>>710 への一つの解として Auto Fill モードを付けてみました。
format.vim がロードされてないと自動で折り返しはしません。
デフォルトではトグルキーを <C-k> にマップしてあります。
ttp://aploda.org/dl.php?mode=pass&file_id=0000000092

763 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [2006/03/14(火) 11:50:40 ]
>>762 おつかれさまです。コピー置いておきます。
www.kaoriya.net/testdir/skkvim-20060314.zip

764 名前:710 mailto:sage [2006/03/15(水) 06:55:59 ]
>>762
素晴らしいです.実用には十分です.
現在も100% skk.vimを常用しているので引き続きテストします.

本当にありがとうございます.

765 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/04/10(月) 22:31:47 ]
skk.vim すげぇぇぇ!!!!

766 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/04/21(金) 19:51:55 ]
良スレ

767 名前:名無しさん@お腹いっぱい。 [2006/04/24(月) 00:54:56 ]
>>751

えと、これはどう解釈したらいいのでしょ?

`=foo` の部分がどういう意味の構文だかわからんす。

768 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/04/24(月) 03:46:40 ]
:h `-expansion

769 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/05/03(水) 00:48:03 ]
テキストファイルがたくさんあって中身に必ず"DT[YYYY-MM-DD]"という文字列が
あります(YYYY-MM-DDは年月日)。これらのファイルのうち例えば1989年以降の
ファイルだけカウントしたい場合どうしたらよいでしょうか?
s/DT\[\([0-9]\{4}\)/\1/g
の\1みたいにマッチした文字列を変数に取り出すみたいなことはできるのでしょうか。

770 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/05/03(水) 10:50:12 ]
vimよりは、普通にegrep+wcでやっつけたほうが楽だとおもうけど...



771 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/05/03(水) 14:13:38 ]
よくわかんないけどこういうの?
function! Func()
  let year = matchstr(getline('.'), 'DT\[\zs\d\{4}\ze-\d\{2}-\d\{2}\]')
  if year >= 1989
    echo "ウホッ"
  endif
endfunction
g/DT\[\d\{4}-\d\{2}-\d\{2}\]/call Func()

772 名前:769 mailto:sage [2006/05/03(水) 22:55:57 ]
>>771 おおっありがとう。
function! CountPeriod( period )
  let s:check_sum = 0
  let s:period_sum = 0
  bufdo call s:DoCounts( a:period )
  echo a:period "以降のファイルは" s:period_sum "個でした。"
  echo "チェックしたファイル数 "s:check_sum
endfunction
function! s:DoCounts( period )
  g/DT\[\d\{4}[0-9\-,]*\]/call s:Counts( a:period )
endfunction
function! s:Counts( period )
  let s:check_sum = s:check_sum + 1
  let year = matchstr(getline('.'), 'DT\[\zs\d\{4}\ze[0-9\-,]*\]')
  if year >= a:period
    let s:period_sum = s:period_sum + 1
  endif
endfunction
こんな感じで思っていた事ができました。

773 名前:名無しさん@お腹いっぱい。 [2006/05/11(木) 17:49:17 ]
不特定多数行の内、
folderの単語の無い行を取り去りたいのですが、どうしたらよいですか?

774 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [2006/05/11(木) 18:13:37 ]
:g/folder/d

かな? 「folderの単語の無い」っていうのの意図がわかりません。

775 名前:名無しさん@お腹いっぱい。 [2006/05/11(木) 18:45:12 ]
"folder"という単語が一度も登場しない行の事です。

776 名前:名無しさん@お腹いっぱい。 [2006/05/11(木) 18:53:00 ]
要するに、"folder"が登場する行をコレクトしたいのです。

777 名前:匿名希望@Vim%Chalice mailto:sage [2006/05/11(木) 21:19:53 ]
:v/folder/d
のことか

778 名前:名無しさん@お腹いっぱい。 [2006/05/11(木) 23:12:54 ]
ありがとう匿名の人

779 名前:名無しさん@Vim%Chalice mailto:sage [2006/05/12(金) 23:08:03 ]
:g!は:vとも書けるのか、はじめて知った
でもスレ違い気味だね

780 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/05/14(日) 21:25:17 ]
vim7にしてkaoriyaのパッチを当てたけど、migemoが効かない。
:versionでは+migemoになってるのに。



781 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/05/14(日) 21:26:43 ]
スマン。書くスレ間違えた。

782 名前:780 mailto:sage [2006/05/14(日) 21:32:12 ]
migemodictが設定されてませんでした。

783 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/06/08(木) 08:20:17 ]
tokyo.cool.ne.jp/hopper2/vimproc.zip
Vimスクリプトでプロセス間通信やソケット通信しちゃうライブラリ。
例えばこのように遊べます...
let sock = g:vimproc.socket_open("www.yahoo.com", 80)
call sock.write("GET / HTTP/1.0\r\n\r\n")
let res = ""
while !sock.eof
  let res .= sock.read()
endwhile
call sock.close()
for line in split(res, '\r\n\|\r\|\n')
  " ...
endfor

784 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/06/20(火) 17:05:11 ]
>> 783
おもすれー。
ところで proc.vim の関数定義で書いてある dict ってどういう意味があるのでしょうか。

785 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/06/20(火) 23:52:54 ]
dict を指定した関数では self という変数が暗黙的に使えるようになります。
c++ の this や python の self みたいなもんです。
ディクショナリとともに使い、オブジェクト指向っぽいコードが書けます。

:help Dictionary-function より
  :function Mylen() dict
  :   return len(self.data)
  :endfunction
  :let mydict = {'data': [0, 1, 2, 3], 'len': function("Mylen")}
  :echo mydict.len()
この例だと、selfにはmydictが代入されます。

普通の関数と同じようには呼べません。
  :call Mylen()   <- これはエラーになる

関数の定義とディクショナリへの設定をまとめてすることもできます。
:help numbered-function  より
  :let mydict = {'data': [0, 1, 2, 3]}
  :function mydict.len() dict
  :   return len(self.data)
  :endfunction
  :echo mydict.len()
(この方法で定義した関数には名前ではなく番号が付けられるので、
エラーが起きたときに「関数 3 でエラー」みたいに表示されて泣けます)

786 名前:784 mailto:sage [2006/06/21(水) 11:35:50 ]
いえ、dict を指定しなくても self が参照できるため、疑問に思ったのです。

:let mydict = {'data': [0, 1, 2, 3]}
:function mydict.len()
: return len(self.data)
:endfunction
:echo mydict.len()

という dict を書かない書き方でも self が参照でき、
期待した値が帰ってくるので、dict 書かなくてもいいんじゃないかなぁ、
と思った次第です。

787 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/06/21(水) 22:03:00 ]
あーホントだ。
It is not necessary to use the "dict" attribute for a numbered function.
ですね。気づかなんだ。

788 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/06/22(木) 23:53:45 ]
>>784 の vimproc を利用して簡単な HTTP クライアントを作ってみました。
www.bigbold.com/snippets/posts/show/2227

let h = HTTP.new('www.bigbold.com')
let res = h.get('/snippets/')
echo res.headers
if res.code < 400
echo res.body
else
echo 'error ' . res.code
endif

などして使うことができます。
エラー処理周りは全くやってないのでお遊び程度にしか使えませんが…。

789 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/06/23(金) 11:14:41 ]
むー、>>783のやつ面白そうなんだけど、
Windowsでも使えるようにするには、どうやってコンパイルしたらいいんだろー

790 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/06/23(金) 19:52:23 ]
Windowsでも使えるようにしたので適当にどうぞ。urlは同じです。dllも入ってます。
vimproc.dllはVisual Studioでコンパイル、vimproc_mingw.dllはmingwでコンパイル
したやつです。たぶん大丈夫だろうけどダメなら交換してください。
pipeは怪しいけど他はそれなりに動くと思います。

...ちゃんとマニアックな人がいて良かったw



791 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/06/24(土) 08:11:35 ]
>>790
やーべー、言ってみるもんだw
ありがとーです。遊ばしてもらいます。

792 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/06/29(木) 11:15:13 ]
skk.vim
毎回毎回同じローマ字ルールを計算するのも無駄なので SkkAddRulesSection()
というのを作りました。これはコンパイル済のデータを自分自身に書き込みます。
読み込み時間は多少増えますが、気にならないレベルだと思います。
削除するには SkkDeleteRulesSection() を呼んでください。
あと vim7 にも対応したつもりです。
それと、いつまでも KoRoNさんのところをお借りしているわけにもいかないので、
まっつんさんが言われたように vim.org の scripts に公開してみることにしました。
ttp://www.vim.org/scripts/script.php?script_id=1589

793 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/06/29(木) 16:28:04 ]
キタ━━━━━━(゚∀゚)━━━━━━ !!!!!

794 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/07/17(月) 07:31:45 ]
function! g:GetHere()
  redir => str
  silent function g:Here
  redir END
  let lines = split(str, '\n')[1:-2]   " 前後のゴミ(関数宣言)を削除
  let lines = map(lines, 'v:val[3:]')  " 行番号を削除
  return join(lines, "\n")
endfunction

function! g:Here()
ねんがんの ヒアドキュメント をてにいれたぞ
endfunction
let a = g:GetHere()

function! g:Here()
これは
ヒアドキュメントです
ウヒョヒョ
endfunction
let b = g:GetHere()

795 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/07/17(月) 16:25:04 ]
>>794
これはどう使うものなんだい?

796 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/07/17(月) 18:39:23 ]
どうって言われてもな。見たまんまだよ
:fu! g:Here()
:  テキスト
:endf
:echo g:GetHere()
テキスト

797 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/07/19(水) 22:07:18 ]
>>794
うまいね。vimスクリプトでここまでトリッキーな
技は始めて見た。

798 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/08/01(火) 03:41:45 ]
Vimの関数はグローバル関数と無名関数の二種類しかないという話。

fun Func()
endf
fun g:Func()  <- Func()とは区別される
endf
fun g:func()
endf
fun b:func()
endf
fun w:func()
endf
fun s:func()
endf
fun hogehoge::func()
endf

全部グローバル関数。
b:とかw:とかに特殊な意味はなくて、単に関数名にコロンが使えるってことでしかない。
s:func()は特別扱いだけど、<SNR>123_func()という特殊な名前のグローバル関数に
過ぎないので、スクリプト番号さえわかればどこからでも呼び出せる。

ちなみに関数と変数は名前空間が分かれている。

799 名前:カラーロゴなり (1/2) mailto:sage [2006/08/02(水) 11:21:56 ]
let h = ["black", "darkblue", "darkgreen", "darkcyan", "darkred", "darkmagenta", "brown",
      \ "lightgray", "darkgray", "blue", "green", "cyan", "red", "magenta", "yellow", "white"]
for i in range(16)
  execute printf('syn match _%x /\c%x/', i, i)
  execute printf('hi _%x guifg=%s guibg=%s ctermfg=%s ctermbg=%s', i, h[i], h[i], h[i], h[i])
endfor
put ='                   A                   '
put ='                  A2A                  '
put ='   7777777777777AA222AA7777777777777777'
put ='   788888888888822222227888888888888888'
put ='   00888888888002222222008888888888000 '
put ='     888888888222222222278888888800    '
put ='     7888888882222222227888888880      '
put ='     788888888222222277888888800       '
put ='     78888888822222278888888802A       '
put ='     788888888222277888888800222A      '
put ='    A7888888882227888888880222222AA    '
put ='   A2788888888277888888800222222222A   '
put =' AA227888888887888888880222222222222AA '

800 名前:カラーロゴなり (2/2) mailto:sage [2006/08/02(水) 11:23:32 ]
put ='22222788888888888888880022222222222222A'
put =' 2222788888888888888008822222222222200 '
put ='   227888888888888002888222222222220   '
put ='    2788888888888022222222222222220    '
put ='     7888888888002222888228888828888   '
put ='     78888888802222228882288888888888  '
put ='     788888800222222288822882288   88  '
put ='     788888022222222888822882 88   88  '
put ='     788800 222222228882288   88  88   '
put ='     7880    22222228882288  88   88   '
put ='     780       222228882 88  88   88   '
put ='     00         2222888  88  88   88   '
put ='                  220                  '
put ='                   0                   '



801 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/08/09(水) 21:47:02 ]
メールアドレスを補完する completefunc を作ろうとしたけど
完全なものにするのはかなり大変だとわかった。
誰か改良して。

function! CompleteMail(findstart, base)
if a:findstart
let line = getline(".")
let start = col(".") - 1
while start > 0 && line[start - 1] =~ '[A-Za-z@\.\-]'
let start -= 1
endwhile
return start
else
let res = []

802 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/08/09(水) 21:47:57 ]
        while 1
            let match = search('\<' . a:base, "bW")
            if match <= 0
                return res
            endif
            let line = getline(".")
            let b = col(".") - 1
            let e = match(line, '[^A-Za-z@\.\-]', b + 1)
            if e < 0
                let e = strlen(line)
            endif
            call add(res, strpart(line, b, e-b))
            if complete_check()
                return res
            endif
        endwhile
    endif
endfunction

set completefunc=CompleteMail

803 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/08/11(金) 16:40:31 ]
こんなかんじだろうか
function! CompleteMail(findstart, base)
  if a:findstart
    let str = getline(".")[: col('.') - 2]
    let start = match(str, '[[:alnum:]_.-]*\%(@[[:alnum:]_.-]*\)\=$')
    return start
  else
    redir => str
    silent g/[[:alnum:]_.-]\+@[[:alnum:]_.-]\+/
    redir END
    let mx = '[[:alnum:]_.-]\+@[[:alnum:]_.-]\+'
    let i = match(str, mx)
    while !complete_check() && i != -1
      let address = matchstr(str, mx, i)
      if stridx(address, a:base) == 0
        call complete_add(address)
      endif
      let i = match(str, mx, i + len(address))
    endwhile
    return []
  endif
endfunction

804 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/08/11(金) 21:04:47 ]
>>803
すばらしい。とても勉強になります。
ありがとうございます。
ところでメールアドレスに使える文字の正規表現は
けっこう複雑らしい。
www.tohoho-web.com/lng/199809/98090025.htm

805 名前:名無しさん@お腹いっぱい。 [2006/09/11(月) 10:54:33 ]
ふと。skk.vim にも変換予測が付かないかと思ってしまった。


806 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/09/11(月) 18:41:32 ]
>>805
変換予測って具体的にはどんなイメージですか?

807 名前:名無しさん@お腹いっぱい。 [2006/09/11(月) 23:22:16 ]
携帯の入力のように かな文を打つている片っ端から
候補が出でくるようなのがあったら良いな、と思いました。

具体的には、
UNIX系で 出ている予測入力システムだと PRIME と言うのがあるようです。
そこに出ている説明ページ
taiyaki.org/prime/prime.html
にあるような機能です。


808 名前:名無しさん@お腹いっぱい。 [2006/09/12(火) 01:50:44 ]
>>807
pitecan.com/OpenPOBox/

POBOXとかどうよ

809 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/09/12(火) 11:34:21 ]
>>807
そこまでいっちゃうと skk じゃないような気がします。

810 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/09/12(火) 11:46:51 ]
skk-dcomp.el みたいなやつ?



811 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/09/12(火) 11:55:44 ]
>>810
そうですね。そこらへんならそんなに操作性も変わらないし。

812 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/09/14(木) 04:59:12 ]
タイマーっぽい

set updatetime=1000
autocmd CursorHold * call Timer()
function Timer()
  echo strftime("%c")
  let K_IGNORE = "\x80\xFD\x35" "特殊な内部コード
  call feedkeys(K_IGNORE)
endfunction

813 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/09/17(日) 06:00:05 ]
一番でかいvimスクリプトってなんだろう。chalice?

814 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/09/22(金) 19:01:16 ]
>>810
それならuimでできるし。


815 名前:高一 mailto:sage [2006/09/23(土) 10:50:13 ]
タイムサービスに勝つスクリプトってありますか?
瞬時に住所、名前とかかけちゃうような・・・
なんでもいいので攻略法あったら教えて下さい

816 名前:名無しさん@お腹いっぱい。 [2006/09/24(日) 08:56:08 ]
あげ

817 名前:名無しさん@お腹いっぱい。 [2006/09/24(日) 18:12:57 ]
なんで?

818 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/09/26(火) 19:07:17 ]
外部ファイルから文字読込んで、ループで対象文字を検索して、
それを変数に代入するコードはどんな感じになるでしょうか?

819 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/09/27(水) 20:14:13 ]
こんな感じ?
function F(fname, pat)
  for line in readfile(a:fname)
    if line =~ a:pat
      let match = matchstr(line, a:pat)
    endif
  endfor
endfunction

820 名前:名無しさん@お腹いっぱい。 [2006/09/28(木) 03:49:31 ]
setで変数をオプションに代入したいのですがうまくいきません
set fdc=3 と定数にするとうまくいきます

fun! Outline#Set(...)
  let fdc_ = 3

  if a:0==1
    let fdc_ = a:1
  endif

  set foldmethod=expr
  set foldexpr=Outline#FoldLevel(v:lnum)
  set fdc=fdc_ "E521: = の後には数字が必要です: fdc=fdc_
endf

com! -nargs=? Outline call Outline#Set(<args>)



821 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/09/28(木) 11:34:01 ]
>>820
let &fdc=fdc_

822 名前:名無しさん@お腹いっぱい。 [2006/10/02(月) 06:20:22 ]
rubyで作った文字列とかvim scriptの変数にいれれるん?

fu! Aaaa()
let vimstr = ""

ruby vimstr = "Hello Ruby!!"

....

823 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/10/03(火) 19:47:23 ]
レジスタとか経由すれば

824 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/10/04(水) 07:08:18 ]
rubydo VIM::command('let g:xyz=45')

825 名前:822 mailto:sage [2006/10/04(水) 22:17:44 ]
>>824
できすまた
ありがとうございます

826 名前:名無しさん@お腹いっぱい。 [2006/10/13(金) 10:08:09 ]
snippetsEmu www.vim.org/scripts/script.php?script_id=1318
このスクリプトがかなり便利なんだけど使っている人いる?

827 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/10/13(金) 10:56:21 ]
>>826
なにできるの?

828 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/10/13(金) 10:59:04 ]
10行コピーしたレジスタから、1行1行取り出して処理を加えるにはどうすればいいでしょうか?

829 名前:名無しさん@お腹いっぱい。 [2006/10/13(金) 12:25:57 ]
>>827
iabbrevで指定位置へのカーソル移動と複数箇所の同時編集をできるようになる。

例えば
:Iabbr class class <class><CR>{<CR>public:<CR><class>();<CR>virtual ~<class>();<CR><><CR>};
"class<space>a<S-Del>"
と入力すれば

class a
{
public:
a();
virtual ~a();
<カーソル位置>
}
というテキストが入力される。

830 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/10/13(金) 17:18:03 ]
TextMateのエミュか。
まえにTextMateのデモムービー見て感動したなぁ。
使い方も簡単だしけっこう良さげだね。



831 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/10/13(金) 21:37:19 ]
>>828
let lines = split(@@, '\n')
for i in range(len(lines))
  let lines[i] = "hoge"
endfor
call setreg("@", join(lines, "\n"), getregtype("@"))

832 名前:名無しさん@お腹いっぱい。 [2006/10/28(土) 00:16:14 ]
>>826
code.google.com/p/snippetsemu/source
ここからソースを取ってくると最初から定義済みのスニペッツが付いてきて便利。


833 名前:名無しさん@お腹いっぱい。 [2006/10/28(土) 20:52:52 ]
>>832
おぉ、

834 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/10/31(火) 11:28:33 ]
こんなのつくってみた。+migemoでない人向け。
if has("migemo")
  finish
endif
let cmigemo_cmd = "cmigemo -q -v -d /usr/local/share/migemo/euc-jp/migemo-dict"

fun! s:init_cmigemo()
  let s:in = tempname()
  let s:out = tempname()
  let cmd = 'touch ' . s:in . '; mkfifo ' . s:out . "\n"
  let cmd = cmd . 'tail -f ' . s:in . '|' . g:cmigemo_cmd . '|'
  let cmd = cmd . 'while read -r line; do '
  let cmd = cmd . 'echo "$line" >' . s:out . ';'
  let cmd = cmd . 'done & jobs -ls'
  let s:pids = substitute(system("sh", cmd), "\n", " ", "g")
  au VimLeavePre * call system('kill ' . s:pids)
endf

fun! s:search_cmigemo(str)
  if !exists("s:in")
    call s:init_cmigemo()
  endif
  return system('sh', "echo '" . a:str . "' >>" . s:in . '; cat ' . s:out)
endf

835 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/10/31(火) 11:29:53 ]
続き
fun! s:query_cmigemo(dir)
  let str = input('migemo' . a:dir)
  if !strlen(str)
    return ''
  endif
  let str = s:search_cmigemo(str)
  return strlen(str) ? a:dir . str : ''
endf

nnoremap <silent> <expr> g/ <SID>query_cmigemo('/')
nnoremap <silent> <expr> g? <SID>query_cmigemo('?')

836 名前:mattn@Vim%Chalice mailto:sage [2006/11/01(水) 00:56:47 ]
たしかmigemo.vimにも+migemoでない場合の処理が書いてあったと思いますよ。

837 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/11/01(水) 17:33:40 ]
そうなんだけど検索するたびにcmigemoを起動して辞書を読むのを避けて
2回目以降は前に起動したのと会話するようにしたつもりなんだけど...

838 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/11/09(木) 00:55:39 ]
文章整形プラグインを作ってみました。
yukihiro.nakadaira.googlepages.com/autofmt.vim
~/.vim/autoload/ にコピーして :set formatexpr=autofmt#FormatExpr() と設定すれば使えます。
あんまりテストしてません。細かい設定とかできません。

839 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/11/22(水) 06:01:20 ]
gVimなんですが、ウインドウのサイズって取得できますか?
やりたいのは
1. サイズ取得して変数x, y にいれとく
2. フォントのサイズを変える
3. winsize x y でサイズを戻す
これだけなんですが。

840 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/11/22(水) 16:50:23 ]
let x = &columns
let y = &lines



841 名前:839 mailto:sage [2006/11/22(水) 20:21:12 ]
>>840
ありがとうございます。
ちょっと勘違いしていました、winsizeはピクセルで指定するものだと・・
フォントのサイズを変えると、ウインドウのサイズも変わってしまうので
それを防止したかったんです。

842 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/11/27(月) 13:07:08 ]
vimにて、
:split FILE
などで、別ディレクトリにあるファイルを開いたとき、
また、
^W h
などで、ウィンドウ(?)を切り替えたときに
自動でそのファイルがあるディレクトリにチェンジディレクトリするようにするには
どうすればよいでしょうか?


843 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/11/28(火) 01:09:34 ]
:set autochdir
または
:autocmd BufEnter * :cd %:p:h
たぶん

844 名前:852 mailto:sage [2006/11/28(火) 09:30:37 ]
>>843
思い通りの動作をするようになりました。
どうもありがとうございます。

845 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/11/28(火) 15:35:25 ]
let count = 1
E46: Cannot change read-only variable "count"
(゚Д゚)

846 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/01/10(水) 04:17:20 ]
vimwiki の incbufswitch.vim を使いやすくするべく改造
していたんですが、いつのまにか echo "\r" が効かなく、
候補リストが複数行にわたる場合、前の表示が残るように
なってしまいました。どこを直せばいいでしょうか?

command! ISwitchB :call ISwitchB()
hi link ISWitchBCurrent Search
hi link ISWitchBOnlyOne IncSearch

function! ISwitchB_ShowList(buflist, partial_name, current)
echon "\riswitch " . a:partial_name . "{"
let i = 0
for fname in a:buflist
if i != 0
echon ","
endif
if i == a:current
if len(a:buflist) == 1
echohl ISWitchBOnlyOne
else
echohl ISWitchBCurrent
endif
endif
echon fname
if i == a:current | echohl None | endif
let i = i + 1
endfor
echon "}"
endfunction


847 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/01/10(水) 04:18:39 ]
function! ISwitchB()
let orig_bufnr = bufnr("%")
let altbufnr = bufnr("#")
let lastbuf = bufnr("$")
let allbuflist = []
" 代替バッファ # がリストの先頭に来るように
if bufexists(altbufnr) != 0 && buflisted(altbufnr)
call add(allbuflist, expand("#" . altbufnr . ":t"))
endif
let i = 1
while i <= lastbuf
if bufexists(i) != 0 && buflisted(i) && i != altbufnr && i != orig_bufnr
call add(allbuflist, expand("#" . i . ":t"))
endif
let i = i + 1
endwhile

let buflist = allbuflist
let partial_name = ""
let current = 0


848 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/01/10(水) 04:20:21 ]
while 1
call ISwitchB_ShowList(buflist, partial_name, current)
let c = getchar()
if c == 13 " <CR> 決定
exe "silent buffer " buflist[current]
break
elseif c == 27 || c == 3 " <ESC> or <C-c> キャンセル
echon "\r "
break
elseif c == "\<BS>"
let partial_name = strpart(partial_name, 0, strlen(partial_name)- 1)
if partial_name == "" | break | endif
elseif c == 9 " <tab> 次のマッチを選択
let current = current + 1 >= len(buflist) ? 0 : current + 1
else
let partial_name = partial_name . nr2char(c)
endif
let buflist = ISwitchB_FilterBufList(allbuflist, partial_name)
endwhile
" Hit Enter が出ないように
call feedkeys("\<left>\<right>")
echo
endfunction


849 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/01/10(水) 04:22:43 ]
function! ISwitchB_FilterBufList(buflist, partial_name)
let result = []
for fname in a:buflist
if a:partial_name == "" || stridx(fname, a:partial_name) >= 0
call add(result, fname)
endif
endfor
return result
endfunction


850 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/01/10(水) 09:45:24 ]
別のやり方としてこんなのはどうかな?
--- incbufswitch-color.vim.orig Tue Jan  9 17:36:31 2007
+++ incbufswitch-color.vim      Wed Jan 10 09:26:21 2007
@@ -103,6 +103,7 @@
 " Perform an incremental buffer switch
 "
 function! <SID>IncBufferSwitch()
+    let v:scrollstart = ""
     let origBufNr = bufnr("%")
     let partialBufName = ""
     let s:tabStop = 0
@@ -155,4 +156,7 @@
         "echon ' {'.s:buflist.'}'
         call ShowBuflist(partialBufName, s:buflist)
     endwhile
+    if v:scrollstart != ""
+        call feedkeys("\<CR>")
+    endif
 endfunction



851 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/01/10(水) 23:03:32 ]
ちらついても構わないなら毎回 :redraw! で再描画するとか

個人的にはwildmenuを使った標準的な方法をお勧めする
(:buffer <Tab> および :help :command-completion)

852 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/01/11(木) 03:58:25 ]
HIT ENTERはfeedkeysで解決できることわかったんですが、
なぜか846のバージョンだと、候補リストが全部消え切らず、残ってしまうんですよ。
一行だけの場合は\rで行頭復帰してそこに上書きするので
前回の候補リストが消えるのですが。
もとのincbufswitch-colorと表示の方法は変えていないし、
なぜこうなってしまったのか原因も気になるんですよね。

853 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/01/12(金) 00:49:05 ]
redraw してないから

854 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/01/12(金) 02:12:33 ]
>>853
ISwitchB_ShowList()の1行目にredrawをいれたら直りました。
ありがとうございます。
けど実用上はlookupfile.vimがあれば十分かもしれないですね。
ttp://subtech.g.hatena.ne.jp/secondlife/20070105/1167980175
このプラグインは本当にすごい。

>>851
確かにvim標準の方法で満足できるならベターですけどね。
しかし、そのためにはvim標準の設定・機能は利便性が低過ぎると
いつも感じます。

855 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/01/12(金) 19:58:53 ]
エコーエリアをクリアする関数と
Press ENTER プロンプトを表示しない :echo は欲しいね

856 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/01/17(水) 20:41:00 ]
名無しに反応するオートコマンド
:autocmd WinEnter {} :echo "hoge"

オートコマンドで否定のパターンは使えないのかなぁ
*.txt以外のファイルみたいな

857 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/01/18(木) 20:15:13 ]
au WinEnter * if expand("<afile>")=~? '\.txt$'|echo|endif
amatchとかafileで判定すればいいんじゃない?

858 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/01/23(火) 22:57:20 ]
>>716に出てた
yukihiro.nakadaira.googlepages.com/#uim-vim
これってvim7じゃ動かないのかなぁ?

Error detected while processing function <SNR>16_input..10..22:
とか
E10: \ should be followed by /, ? or &
Press ENTER or type command to continue
Error detected while processing function <SNR>16_input..10..22:
とかいうエラーがでまくるんだが


859 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/01/26(金) 19:04:59 ]
>>858
むしろ vim7 でしか動かないです。
E10 エラーは行継続の \ が原因だと思います。
compatible モードで使ってたりするんでしょうか。
行継続を使わないように変更したので新しいやつを試してみてください。

860 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/01/27(土) 15:19:23 ]
>>859
compatible モードで使ってました
でも新しいやつ試したら日本語入力でキタ━━━━(゚∀゚)━━━━!!!!!!
ありがとうございます

でも今度は日本語入力モードでバックスペースすると
??b
が入力される・・・
文字コードUTF-8にしたら平気だった
EUC-JPじゃ無理ですか?



861 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/01/27(土) 17:22:24 ]
>>860
修正したので新しいの使ってみてください。

862 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/01/27(土) 18:57:02 ]
>>861
できるようになりました
ありがとうございます!
これでnvi+canna捨てられるかも

863 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/04(日) 23:57:23 ]
C言語のファイルを開いたときに適切なインデント設定をするスクリプト
単純だけどけっこう楽になった
いろんな言語を認識できるようにしたら便利だろうなぁ
だれかやってくんないかなぁ…

autocmd FileType c,cpp call s:SetIndent()
function! s:SetIndent()
  let pos = getpos('.')
  if search('{$') != 0 && search('^\s\+\S', 'W') != 0
    let &l:shiftwidth = indent(line('.'))
    let &l:softtabstop = indent(line('.'))
    let &l:expandtab = (search('^\t') == 0)
  endif
  call setpos('.', pos)
endfunction

864 名前:名無しさん@お腹いっぱい。 [2007/03/28(水) 21:41:19 ]
    getchar()の使い方が良く分からない。
    下記のスクリプトでは、
        Aで、"私の名前は"を表示する
        Bで、入力する
        Cで、入力した内容を表示して、その後に"です。"を表示する
    の様な処理をしたいのですが、実際は下記の様になります。
        1. Bで入力をするまで、何も変化は発生しない。
        2. Bで入力をすると一気にAとCを表示する。

    どこが、まずいのでしょうか?そもそもが、出来ない事をやろうとし
    ているのだろうか?
        
        @function! s:Map(...)
        A  execute "normal i私の名前は\<esc>"
        B  let s:name=getchar()
        C  execute "normal a" . s:name . "です。\<esc>"
        Dendfunction


865 名前:名無しさん@お腹いっぱい。 [2007/04/20(金) 19:23:18 ]
libcallで呼び出されたCの関数のなかでvimの組み込み関数を呼ぶ仕組みは用意されてますか?

高速に補完用のリストを作るためにcall complete_add相当をCの関数の中から呼びたいです
libcallの戻り値をcomplete_addに渡すと長い文字列のコピーが行われてしまうかもしれないのでCの関数から直接complete_addを呼びたいです

866 名前:名無しさん@お腹いっぱい。 [2007/04/20(金) 19:25:58 ]
沖縄県の方へ(命に関わる注意事項です)

沖縄県での選挙ですが、どうか民主党だけは避けてください。県民の生命に関わる可能性があります。
民主党の最大の公約は一国二制度(※)ですが、一度「一国二制度 沖縄 三千万」で検索をお願いします。
この際、民主党のHPで調べても良いです。以下の注釈↓と矛盾することは書いてないはずですから…

※一国二制度
 簡単に言えば沖縄を中国と日本の共有物にし、そこに3000万人の中国人を入植させます。
 (つまり沖縄人口の 96% を中国人にして、実質、沖縄を中国人の居住地とします。)
 さらに「自主」の名の下、沖縄で有事が起きても自衛隊は干渉できません。
 3000万人の中国人が、少数派となった130万人の日本人に何をしても、です。
 そして反日教育を受けた中国人の反日感情の強さは、ほとんどの日本人の理解を超えるものです。

今回の選挙で民主党が勝った場合、「自主」「発展」を連呼しつつ段階的に進めていくことになります。
自主と言っても、自主を認めるのが「住人の96%が中国人となった」後だということに気をつけてください。
発展と言っても、新沖縄の少数派となった「少数民族日本人」の発展ではないことに気をつけてください。

867 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/04/21(土) 10:20:51 ]
>>865
pythonの拡張を作ってその中からでvim.eval()を呼ぶみたいな方法しかないとおもう
はやいかどうかはしらん

868 名前:初心者 [2007/05/02(水) 13:44:56 ]
GVim7で関数のリファレンスの使い方が良く分かりません。下記で次
の現象となります。どこが悪いのでしょうか?

最初にリストを送ります。

 01 if exists("loaded_ShuffleB")
 02     finish
 03 endif
 04 let loaded_ShuffleB=1
 05 command! -nargs=? ShuffleB :call <sid>Map(<q-args>)
 06 function! s:Map(...)
 07     let b:pgname = ["<SID>This1","<SID>This2","<SID>This3"]
 08     let b:Prg=function(b:pgname[1])
 09     imap <buffer> <silent> o O<c-o>:call b:Prg("O")<cr>
 10 endfunction
 11 
 12 function! s:This1(current)
 13     exec "normal o" . a:current . "最初はグー"
 14 endfunction
 15 
 16 function! s:This2(current)
 17     exec "normal o" . a:current . "最初はチョキ"
 18 endfunction
 19 
 20 function! s:This3(current)
 21     exec "normal o" . a:current . "最初はパー"
 22 endfunction


869 名前:初心者 [2007/05/02(水) 13:47:18 ]
先のリストで、下記のエラーが出ます。
どこが悪いのでしょうか?

1. pgnameに<SID>を付加した場合(7行目)
  oを入力した時にOを表示して下記のエラーが出る
  E120: スクリプト以外で<SID>が使われました:<SID>This2

2. pgnameの<SID>を外した場合(7行目)
  起動時にE700: 未知の関数です: This2が表示される。
  oを入力した時にOを表示して、下記のエラーが出る
  E117: 未知の関数です: b:Prg



870 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [2007/05/03(木) 00:02:52 ]
>>868-869 "<SID>This2"を"s:This2"という風に書き換えてみてください。



871 名前:初心者 [2007/05/03(木) 13:01:04 ]
KoRoNさん、早速ありがどう御座いました。7行目のみ下記の様に変更
しました。
  let b:pgname = ["s:This1","s:This2","s:This3"] 

実行しましたら、今度は下記のエラーが出ます。
  E120:スクリプト以外で<SID>が使われました: s:This2

Windows XP 
KaoriYaからのVim7.0.216 14-mar-2007を使っています。

頭の悪い初心者ですが、1つ宜しくお願いします。
    


872 名前:初心者 [2007/05/03(木) 13:14:31 ]
全体を下記の様に、修正したら今度は動作する。動いた理由と、前回
のが動かなかった理由が、さっぱり分からない。
下記に今回の内容を示します。
  if exists("loaded_ShuffleB")
      finish
  endif
  let loaded_ShuffleB=1
  command! -nargs=? ShuffleB :call <sid>Map(<q-args>)
  function! s:Map(...)
    let b:pgname = ["b:One","b:Two","b:Three"]
    let b:Prg = function(b:pgname[2])
    call b:Prg(10)
    imap <buffer> <silent> o O<c-o>:call b:Prg(31)<cr>
  endfunction
  
  function! b:One(current)
    exec "normal o" . a:current . "最初はグー"
  endfunction
  
  function! b:Two(current)
    exec "normal o" . a:current . "最初はチョキ"
  endfunction
  
  function! b:Three(current)
    exec "normal o" . a:current . "最初はパー"
  endfunction


873 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [2007/05/03(木) 15:49:43 ]
>>872
function! s:MyFunc()
  return 321
endfunction

let Fn = function('s:MyFunc')
echo Fn()

こういうスクリプトをtest.vimとして保存して、so test.vimをすると動きます。と
いうことは、もしかしてfunction('s:...')の、s:の評価は実行時のコンテキストに
依存するのかもしれませんね。

874 名前:初心者 [2007/05/03(木) 16:36:43 ]
     KoRoNさん、返事有り難う。しかし、最初から実行時のコンテキス
    トと言われても、範囲が広すぎて途方に暮れる。この場合のコンテキ
    ストは、何でしょうか?

    エラーメッセージでは、スクリプト以外で<SID>が使われましたです
    が、他のスクリプトでは使っていません。実行時に何が影響するのだ
    ろうか?初心者は挫折しそうだ。


875 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [2007/05/03(木) 18:02:35 ]
>>874
挫折して済む話ならば、挫折しちゃったほうが良いかも知れませんよ。

まずb:の時に動くのは、それがバッファに対して定義された関数だからです。
ShuffleBを実行したのがそのスクリプトを読み込んだのと同じバッファであれば、特
定可能で呼出せることになります。逆にいうとスクリプトを読み込んだ後で、別の
ファイルを開いてそちらにカーソルがある状態でShuffleBを実行すると、そのファイ
ル用のバッファには関数が定義されていませんから動かないでしょう。

s:についてはちょっと実験してからもう一度書きます。

876 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [2007/05/03(木) 18:09:07 ]
>>874
っていうか、このスクリプトはどういう目的で何をしようとしているのですか?
なんかいろいろ間違ってる気がしてきました。

877 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [2007/05/03(木) 19:22:50 ]
>>874-875
実験してみました。結論からいうと>>870は誤りで、>>873で示唆したように、s:や
<SID>の評価が参照解決の実行時のコンテキストに依存している、ということになり
ます。まずはこのスクリプトをみてください。

function! s:MyFunc()
  echo "MyFunc is executed"
endfunction
let g:FnRef = function('<SID>MyFunc')

function! s:KickMyFunc()
  call g:FnRef()
endfunction

command! -nargs=0 KickMyFunc :call <sid>KickMyFunc()

このスクリプトを実行するとグローバル変数g:FnRefにs:MyFuncへの関数リファレン
スが格納されます。コマンドKickMyFuncを実行した際には関数s:KickMyFuncを経由し
てg:FnRefが呼出され、正しくs:MyFuncを呼出すことができます。一方、コマンドラ
インで:call g:FnRef()と直接呼出した場合にはE120が発生します。これはつまり、
関数の参照解決はfunction()ではなく実際の関数の呼出し時に行われるので、<SID>
を含むFuncRefは同じスクリプト内からでなければ使えない、ということです。

>>868の例で言えば、imapで実行されるb:Prgは、Vimにとってスクリプト内の出来事
ではありませんから<SID>を含む参照が解決できていないのでしょう。なおmapであれ
ば:help :map-scriptにあるとおり<script>を使うことで解決できそうです。でもス
クリプトローカルな関数のFuncRefを別のスクリプトに渡して実行させる、というこ
とはちょっとできそうにないですね。

878 名前:初心者 [2007/05/08(火) 20:32:57 ]
     休暇で岩登りの為、両手両足が使えず。返事が遅くなりました。懇
    切丁寧な回答有り難う。良く分かりました。頑張ってみます。


879 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/21(月) 19:21:33 ]
日本語全角モードになってたとき
ESC押せば、全角モードも同時に消えるようにするには、
どうしたらいいのだろうか

880 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/21(月) 20:30:27 ]
>>879
gvimならこれでいけるけど、コンソールのvimだとむりぽ?

香り屋氏のgvimrcより抜粋

" 日本語入力に関する設定:
"
if has('multi_byte_ime') || has('xim')
  " IME ON時のカーソルの色を設定(設定例:紫)
  highlight CursorIM guibg=Purple guifg=NONE
  " 挿入モード・検索モードでのデフォルトのIME状態設定
  set iminsert=0 imsearch=0
  if has('xim') && has('GUI_GTK')
    " XIMの入力開始キーを設定:
    " 下記の s-space はShift+Spaceの意味でkinput2+canna用設定
    "set imactivatekey=s-space
  endif
  " 挿入モードでのIME状態を記憶させない場合、次行のコメントを解除
  "inoremap <silent> <ESC> <ESC>:set iminsert=0<CR>
endif




881 名前:名無しさん@お腹いっぱい。 [2007/06/04(月) 08:58:22 ]
Hacking Vim: A Cookbook to get the Most out of the Latest Vim Editor (Paperback)
by Kim Schulz (Author)
www.amazon.com/Hacking-Vim-Cookbook-Latest-Editor/dp/1847190936/ref=sr_1_1/104-7688553-6715938?ie=UTF8&s=books&qid=1180914185&sr=8-1

題名のとおり、Vimスクリプトによる拡張やカスタマイズ、その他のディープな機能に的を絞った本らしい。

882 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/06/04(月) 17:00:40 ]
vimのscriptの勉強をしてます。
:lsした時に取れる、各bufferのstatusってどうやったらvimのscript上から取れるのでしょうか?
例えばイジってあるbufferである+のstatusとか。
一応次ぎのようなscriptで、一覧を取得出来る所までは出来ました。

続く

883 名前:882 mailto:sage [2007/06/04(月) 17:02:26 ]
続き
command! -nargs=? EnumBufs :call <SID>EnumBufs(<f-args>)
function! s:EnumBufs(...)
let arg = "^.*$"
if a:0 == 1
let arg = a:1
endif
let buf_idx = bufnr("$")
let bufnames = []
while buf_idx > 0
try
if ! bufexists(buf_idx) || ! buflisted(buf_idx)
continue
endif
let bufname = bufname(buf_idx)
let bufnum = bufnr(buf_idx)
if bufname =~ arg
call add(bufnames, [ bufnum, bufname ])
endif
finally
let buf_idx -= 1
endtry
endwhile
echo s:list2str(bufnames)
endfunction
続く


884 名前:882 mailto:sage [2007/06/04(月) 17:03:21 ]
続き
function! s:list2str(list)

let output = ""

for buf in a:list
let output .= buf[0] . ":" . buf[1] . "\r\n"
endfor

return output

endfunction
以上


885 名前:882 mailto:sage [2007/06/04(月) 17:06:12 ]
あー、indentが崩れてる。ごめんなさい。。。

886 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/06/04(月) 23:51:12 ]
>>882
+ &modified
= &modifiable
bufloaded()
&buflisted
h bufwinnr()

statのような便利なものはないのでヘルプを見ながらがんばりんさい。
バッファエクスプローラプラグインはたくさんあるから参考にするといいかも。

887 名前:882 mailto:sage [2007/06/05(火) 23:43:00 ]
出来ました。thx。
ずっと関数だと思って、optionは探していなかったよ。

888 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/06/06(水) 14:46:24 ]
>>881
amazon.co.jpだと
通常3~5週間以内に発送します
なんだが、もっと早く手に入るところってないかな?

889 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/06/06(水) 17:58:43 ]
>>881
ebookで買ってみた。
内容は、ディープとまでは感じなかった。Vimスクリプトバリバリ書いてる人は必要なし。
ヘルプにも書いてあるような解説+こう使うと便利になるよというサンプル少々。
>>803のCompleteMailやvim wikiのAutoSaveSessionに似たスクリプトも書いてあった。
やはりこれを買うよりヘルプ、vim wiki、vim onlineのTipsを熟読した方がいいと思う。


890 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/06/14(木) 12:50:55 ]
質問です.

「文章中にある文字列をもとに 辞書を引く」…というような
スクリプトを書こうとしています.

「カーソル位置の単語を拾い出す」のは expand("<cword>")
で…簡単に作ることができたのですが

でも 調べたい(拾いたい)文字列が 丁度 単語単位とは限らないので
「自分で範囲選択した箇所を スクリプトに渡せるようにしたい」と
考えています.

(小文字の)v キー&範囲選択直後に,
その「選択中の文字列」を 取り出すには どうしたらよいのでしょうか?

<cword> 同様に, 範囲の中身が取り出せるキーワードが
あるような気がするのですが…なかなか探せない....

あるいは 選択範囲の 開始&終了の文字位置 が分かれば
それを手がかりに 取り出せると思うのですが
これもわからない... (どちらも「行単位」なら楽勝なのですが)

…というわけで
何か分かるかた 以上よろしくお願いします.




891 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/06/14(木) 21:21:08 ]
いったんレジスタにヤンクするのが定石だと思う。

function! Select()
let a_save = @a
normal! gv"ay
let selected=@a
let @a=a_save
return selected
endfunction

function! Dict(word)
echo "「". a:word . "」の意味はわかりません"
endfunction

vnoremap \d <Esc>:call Dict(Select())<CR>


892 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/06/14(木) 21:34:49 ]

expand('<selected>') みたいなものがあればいいのにな
と思う。

893 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/06/14(木) 22:43:06 ]
>>891
normal! gv"ay
だけで もう満足です(笑)なるほど
gv って コマンドも 今,知りました
以上 ありがとうございました.


894 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/06/29(金) 16:49:21 ]
>>795
いまさらなんだけど
このヒアドキュメントで関数名と関数定義をとりだして、
関数名をごにょごにょして、スクリプト内の関数にevalさせれば、
外部から動的に関数できる

function! pluginHoge#eval(source_func_name,new_define_name)
 let savelist=&list
 setlocal nolist
 redir => str
 exec "silent function " a:source_func_name
 redir END
 let &list=savelist

 let lines = split(str, '\n')
 let lines[0]=substitute(lines[0],'function[^(]\+',"function! ".a:new_func_name,'')
 let lines = map(lines, 'v:val[3:]')
 let str = join(lines, "\n")

 exec str
endfunction

895 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/07/18(水) 03:28:53 ]
VimのrangeとPythonのrangeって違うのね。
Vim:
range(2, 3) => [2, 3]
range(2, 2) => [2]
range(2, 1) => []
range(2, 0) => エラー

Python:
range(2, 3) => [2]
range(2, 2) => []
range(2, 1) => []
range(2, 0) => []

896 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 00:45:26 ]
関数名はけっこうアバウト

fun! <SNR>99_func()
endfun
fun! <SNR>func()
endfun
fun! hoge:func()
endfun
fun! hoge::func()
endfun
fun! foo:bar:func()
endfun

897 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/07/29(日) 23:48:10 0]
>>896 解説キボン

898 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/07/30(月) 19:37:54 ]
スクリプトのローカル関数(s:func() or <SID>func())はVim内部では
<SNR>99_func()という名前(数字はスクリプト番号)のグローバル関数になってるんだけど
実は直接 :function <SNR>99_func() と書いて関数を定義できる。(:callもok)
だからスクリプトのローカル関数を外部から変更できてしまう。(ただしs:var変数にはアクセスできなさそう)
let sid = GetSid("plugin.vim") " redir + scriptnames で番号取得
function! <SNR>{sid}_func()
  ...
endfunction
名前が正しいかどうかはチェックしてないみたいなので存在しないスクリプト番号が使えたり番号指定がなくても大丈夫だったりする。
そんで、おそらくs:func()とかが使える関係で関数名にコロンが使えるようになってるけど
その辺の処理は適当らしくてhoge:func()とかfoo:bar:func()とかいう名前も使える。(変数名はダメらしい)
どちらもundocumentedな動作。

899 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/07/30(月) 23:12:59 ]
>>898
解説サンクス。
スクリプトローカル関数を外部から変更する方法は欲しいね。
Vim onlineにあるスクリプトはどうもイマイチなのが多くて
手を加えたくなってしまう。

あと話はずれるけど、プラグイン内で勝手にマッピングを
作るのはやめてほしい。
プラグインでは関数定義だけを提供して、.vimrcでそこへのマッピングを
作るのが理想だと思うのだが。
それプラス、
 (iswitchb-default-keybindings)
みたいにマッピングを作る関数を提供するとか。

900 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/08/06(月) 19:05:18 ]
>>899
もっともな意見なので自作スクリプトを修正するよ。後で。



901 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/08/06(月) 20:40:46 ]
NERDTreeでは
let g:NERDTreeMapOpenSplit = 'i'
という変数を定義することでOpenSplit機能へマッピングするキーを
変更できるようになってるね。
この辺の作法が統一されればいいんだけど。

902 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/08/08(水) 06:47:00 ]
:exe "exe \"exe \\\"exe 'new'\\\"\""
どんくらいネストできるんだろw

903 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/08/13(月) 02:20:25 ]
>>899
>それプラス、
> (iswitchb-default-keybindings)
>みたいにマッピングを作る関数を提供するとか。
いまそれやろうとして気付いたけど、最初に読み込まれるのは~/.vimrcだから、
そういう関数を呼ぼうにもまだ定義されていないという。

と書いてau VimEnter経由で呼べば良いことに気付いた。

904 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/08/13(月) 09:15:53 ]
関数じゃなくてフラグ変数にすればいいんじゃない?
let g:iswitchb_default_keybindings = 1

905 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/10/15(月) 09:53:15 ]
>>863
これがそうかも。
www.vim.org/scripts/script.php?script_id=513

906 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/10/24(水) 14:38:03 ]
vim 7.1以内で関数名と変数名の扱いで挙動が変わったようだ??

:let Fn=function("A")
:let Fn=function("B")

みたいな関数参照の再代入ができなくなった。E705がでる
場合に応じて関数名を繋ぎかえて動かしてた人は動かなくなる
対策として

:let fnlist=[function("A"),function("B")]

:call call(fnlist[1],[])
:call fnlist[1]()

とか

:let fndict={"A":function("A"),"B":function("B")]

:call call(fndict["A"],[])
:call fndict.A()

とかして、当面は切り抜けるとよいと思う
どっかに変更の記述てあるのか

907 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/10/24(水) 23:48:06 ]
>>906
:let Fn=function("A")
:let Fn=function("B")

エラーでないけど。

908 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/10/25(木) 10:23:47 ]
>>907
うおー別ので試したらでなかった

うちのkaoriyaのwindows gvim7.1 10月13日コンパイルバージョンだけでる

909 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [2007/10/25(木) 23:12:55 ]
7.1.098のパッチの副作用みたいです。香り屋のバージョンでいうと20070831から
20070909の間ですね。

> Patch 7.1.098
> Problem: ":call s:var()" doesn't work if "s:var" is a Funcref. (Andy Wokula)
> Solution: Before converting "s:" into a script ID, check if it is a Funcref.

試しにこのパッチを外してコンパイルしてみたら、エラーがでなくなりました。

910 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/10/26(金) 10:41:40 ]
>>909
ありがとう
当面困ってなかったので古いバージョンに戻しておきます



911 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/10/29(月) 17:00:40 ]
:s//\=/ と eval を組み合わせると簡易テンプレートエンジンになる

たとえば
これが: 今の時間は ${strftime("%c")}
  :%s/${\([^}]*\)}/\=eval(submatch(1))/g
こうなる: 今の時間は 2007/10/29 16:55:21

912 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/10/31(水) 17:21:56 ]
すいません。
現在のカーソル位置が行末がどうかを調べるにはどうすればいいでしょうか?


913 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/10/31(水) 17:30:54 ]
getpos(".")
の現在位置のうちの列と
len(getline("."))
が同じとかどうよ

914 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/10/31(水) 17:54:30 ]
if getpos(".")[2]==strlen(getline(".")) | echo "at the end" | endif
行末の2バイト文字上に、カーソルがあるとダメだった。
# ver7 のヘルプ全然読んでいないから getpos() の戻り値に驚き。w

なんかスゲー面倒。
command! IsEnd call <sid>IsEnd()
function! s:IsEnd()
let ls=getline(".")
if ls==# ''
echo '行末'
else
"カーソル位置から、行末まで全部。
let str=matchstr(ls, '.\+', col('.')-1)
"カーソル位置の1文字
let chr=matchstr(ls, '.', col('.')-1)
if str ==# chr
echo '行末'
else
echo '行末じゃない'
endif
endif
endfunction

915 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/10/31(水) 18:10:13 ]
" >>912
" これでどうだろう?
function! IsTheCursorAtTheEndOfLine()
return search('\%#.$', 'cn')
endfunction

916 名前:912 mailto:sage [2007/10/31(水) 19:55:59 ]
おお!皆さんありがとうございます。
自分で作ったスクリプトが挙動不審だったので皆さんのヤツで試してみます。

更に質問なんですが、現在開いているバッファの数ってどうやって取得するんでしょうか?
何も開いてないかどうかを知れたらそれでいいのですが。

よろしくお願いします。

917 名前:914 mailto:sage [2007/10/31(水) 22:47:10 ]
>>915
それすごいな。
search() のオプションとか知らなかった。

918 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/11/01(木) 10:29:15 ]
もしかするとこんな感じでやるしかないかな?

function! BufCount()
let cnt = 0
let lastbufnr = bufnr("$")
let i = 1
while i <= lastbufnr
" :lsで表示されるものだけカウントする
if bufexists(i) && buflisted(i)
let cnt += 1
endif
let i += 1
endwhile
return cnt
endfunction

919 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/11/01(木) 10:33:32 ]
空バッファをカウントしたくないなら条件に↓を追加
&& bufname("%") != ""

920 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/11/01(木) 12:28:00 ]
バッファのカウントなら tabpagebuflist() 使うといいかもしれない



921 名前:912 mailto:sage [2007/11/01(木) 12:58:22 ]
みなさんありがとうございます。
とりあえずコピペで動いてくれています。

tabpagebuflist()という名前にまた錯乱ぎみなんですが、
VIMはタブとバッファは完全に別物で、
データとビューの関係なんですよね?

あとヘルプによく出てくるウィンドウ(変数でいう「w」)ってのはサーバーの事なんでしょうか?
グローバル(g)との違いが分かりません。


922 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/11/01(木) 13:21:41 ]
>VIMはタブとバッファは完全に別物で、
>データとビューの関係なんですよね?
そう。ウィンドウは:spなどで分割できるやつのこと。

let w:hoge = 1 とかすると、hogeはそのときのカレントウィンドウでのみ参照可能になる。
:h w: で出てくる。日本語版ヘルプもあるからその辺読むといいよ。
yukihiro.nakadaira.googlepages.com/#vimdoc
:h 41.2 のユーザーマニュアルの方がわかりやすいかな。

923 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/11/01(木) 13:30:45 ]
こんなんでもよくね

len(filter(range(1,bufnr('$')),"buflisted(v:val) && bufexists(v:val)"))


924 名前:912 mailto:sage [2007/11/01(木) 13:42:57 ]
>>922
ははー、ウインドウはTABや分割された領域単位って事ですね。
って事はグローバル(g)がサーバー(exe)単位ですね。

>>923
・・・ちょっとマニュアルとにらめっこしてきますw

925 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/11/01(木) 14:15:56 ]
range(1,8) => [1,2,3,4,5,6,7,8]
みたいな配列つくって
それをfilter()でいるものだけ取り出したんだよ
buflited()とbufexists()は真なら1を返すのでandした


filter([1,2,3],1) => [1,2,3]
filter([1,2,3],0) => []
filter([1,2,3,4,5,6],"(v:val % 2) == 0") => [2,4,6]
filter([1,2,3,4,5,6],"(v:val % 2)") => [1,3,5]


926 名前:912 mailto:sage [2007/11/01(木) 14:50:07 ]
なるほど!perlの正規表現でいえば、「e」ですな。
それを全要素に対して処理をしてくれると。

こうやって勉強してみるとVIMスクリプトはしょぼいしょぼい言われているけど、
ネットワーク関連の組込み関数がない(?)ぐらいで、それほどひどかないですよね。


927 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/11/24(土) 12:25:16 ]
:echo ++++++++++++++++++++++++++++++++++++++++++++++++++++++++3

928 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/11/24(土) 13:04:27 ]
機能という点では何とでもなるけど
exコマンドが元になってるからスクリプト言語としては
根本的に文法が腐ってると思います
まあよしあしですけども

929 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/11/25(日) 00:24:37 ]
文法なんてこんなもんじゃないかな
いわゆる一つの言語的機能と普通のコマンドが混在してるから慣れが必要だけど

930 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/11/26(月) 09:15:26 ]
文法はなれれば我慢できるが、exコマンドが元になってるから機能的に腐ってる。
関数によって特殊文字にエスケープが必要だったりそうじゃなかったり。
bunname()とかわけわからん。
オプションの退避とかカーソル、レジスタの復元とか書かせるのも勘弁。



931 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/11/26(月) 19:50:36 ]
> 関数によって特殊文字にエスケープが必要だったりそうじゃなかったり。
そんな関数あったっけ

932 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/11/27(火) 13:07:14 ]
bufname() file-patternが展開される。代替ファイルは"#"または0
bufnr() bufname()と同じ。でも"$"で最後のバッファ。
bufexists() 展開されない。代替ファイルはbufexists(0)

vimはCの関数がすでにコマンドべったりで書かれてるからなあ。

933 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/11/28(水) 01:08:53 ]
なるほど。
他にはなんかある?

934 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/11/28(水) 10:12:55 ]
winheight(0) => 現在のウィンドウの高さ
winnr(0) => エラー
winnr("%") => エラー
winnr() => 現在のウィンドウの番号
winnr("#") => 最後にアクセスしたウィンドウの番号
winnr("$") => 最後のウィンドウの番号
とか。カレントを表すのも関数によって"%"や"."だったりするけど、
一応バッファが"%"で行が"."になってるのかな。

エスケープについては、関数だけじゃできなくて、文字列を組み立てて :exe
するときがけっこう嫌らしい。

935 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/11/28(水) 17:17:04 ]
じらさないで全部教えてくれよ(;´Д`)ハァハァ

936 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/11/28(水) 17:27:46 ]
>>935
:h

937 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/11/28(水) 18:01:02 ]
:echo +-+-3
:echo 1++-+-3

938 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/11/29(木) 16:23:03 ]
そういや一時期Ctrl+@にESCあててたな
日本語ノートね

無変換、前候補、かたかな・ひらがな、でもホームに近い余ってるキー
いくらでもあるからな
そういやスペースの両隣のキーにshiftあてるのがエルゴノミクスとか周りではやった

939 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/11/29(木) 17:32:40 ]
本スレと勘違いしたか

940 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/12/03(月) 00:28:47 ]
バッファの変更と、その内容をフックしたいのですが、できますかね?



941 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/12/03(月) 02:18:39 ]
インサートモードで入力したテキストだけならこんな感じでできそうだけど。

augroup meso
au!
au InsertEnter * call InsertEnterCB()
au InsertLeave * call InsertLeaveCB()
augroup END

function! InsertEnterCB()
let g:modified_save = &modified
set nomodified
endfunction

function! InsertLeaveCB()
if &modified
echomsg "inserted text='". @. ."'"
endif
let &modified = g:modified_save
endfunction

942 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/12/03(月) 03:03:25 ]
>>940
無理。
FilterReadPreとかで限定的なものはできそうだけど。

>>941
<C-c>されるとInsertLeaveは発行されないよ。

943 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/12/03(月) 19:17:27 ]
>>940
help {event}

で見合うものを探すのだ

944 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/12/20(木) 05:10:46 ]
関数名の最初の文字はアンダースコアでも通るみたい。

function! _havesex()
echo "not implemented"
endfunction

945 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/12/24(月) 20:33:06 ]
>>944
have sex. not implemented w

946 名前:名無しさん@お腹いっぱい。 [2008/01/09(水) 12:26:12 ]
vimのなかでgccでコンパイルするにはどうしたらいいですか?
perlのやり方は調べたら分かったのですが、cについてはgoogle検索でざざーっと
数十件くらいそれっぽいものを見てみても見つかりませんでした。
お願いします。

947 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/01/09(水) 13:03:15 ]
:set makeprg=gcc\ %
:make

948 名前:名無しさん@お腹いっぱい。 [2008/01/09(水) 15:08:18 ]
>>947
ありがとうございます。希望どおりの動作になりました。

949 名前:名無しさん@お腹いっぱい。 [2008/01/09(水) 22:39:22 ]
:compiler gcc
するとerrorformatを設定してくれるよ

950 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/01/20(日) 14:57:42 ]
このスレ7年目にしてようやく次スレが見えてきたのかよワロタ



951 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/01/23(水) 00:18:49 ]
おお、ほんとだ。ようやくだな。
次スレではvim8に突入しちゃうかもな

952 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/01/23(水) 14:33:17 ]
スレタイは

vim7スクリプトお勉強スレ

なのか、汎用的に

vimスクリプトお勉強スレpart2

なのか

953 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/01/23(水) 15:32:03 ]
>>952
バージョン入れる必要性はないから後者の方が良いね。
むしろ本スレに統合しても問題ない気もする。分離する必要性ってある?

954 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/01/23(水) 16:46:31 ]
>>953
あんまりないな

最初は珍しかったから「お勉強」ということだったんだろう
スレの最初の方のレスの流れをみてもそうだけど

955 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/02/17(日) 14:46:07 ]
>>951-953
次スレを
vim7スクリプトお勉強スレ
にしても
次々スレが
vim8スクリプトお勉強スレ
になって(ry

956 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/02/20(水) 23:37:56 ]
Vim Part15
pc11.2ch.net/test/read.cgi/unix/1202050038/

953の言ってるとおり↑でいいべ

957 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/02/22(金) 18:56:26 ]
>>955
そいつはめでてーなぁ

958 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/07(金) 01:02:27 ]
Windowsのvim7のinputlist()っていう選択肢の中から選ばせる関数使うと、

*********(<Enter> でキャンセル)

ってメッセージが表示されるんだけど、
Enter押すと、最初の項目が選択されたことになってる。(0が返ってくる)
これって仕様ということでいいのかな?

959 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/07(金) 01:54:06 ]
サンプルコードを見ると、最初の要素はプロンプト的な使い方をするぽい

960 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/08(土) 21:03:02 ]
ほー、なるほど



961 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/09(日) 02:42:55 ]
vim6を使っているけどrenamer.vimがうらやましかったので
6でも動くようにパッチしてみた。

よかったらどうぞ

ttp://sakuratan.ddo.jp/uploader/source/date73498.gz

962 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/15(火) 18:37:36 ]
>>911
command! -range=% TemplateEngine <line1>,<line2>substitute/#{\(.\{-}\)}/\=eval(submatch(1))/g

コマンドにしておくと便利

963 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/19(土) 18:18:32 ]
>>962
で、この TemplateEngine コマンドは
如何に使うとよかですか?


964 名前:名無しさん@お腹いっぱい。 [2008/04/24(木) 23:04:43 ]
tcvime.vimの文字ヘルプを使う時は、<Leader>?を入力します。この場
合の<leader>のデフォルトは<C-K>です。この<C-K>?を
tcode_cp932.vimのjfjにマップしたいのですが、下記のマップでは動作
しません。何が悪いのでしょうか?

jfj<tab>~K?

勿論fjのマップは外しています。宜しく、お願いします。


965 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/24(木) 23:22:12 ]
:h mapleader

966 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/25(金) 23:50:00 ]
>>964
tcvime.vimで<Leader>?にマップされてる文字ヘルプは、
Normal Mode時にカーソル位置にある文字の入力方法を表示する機能ですが、
Insert Mode用keymap(tcode_cp932.vim)のjfjにマップして、
どういう動作を期待してます?
Insert Modeでjfjと打ったら直前の文字のヘルプを表示して欲しいのでしょうか?

967 名前:名無しさん@お腹いっぱい。 [2008/04/26(土) 07:38:23 ]
>966
    失礼しました。もしかしたら、keymapのファイルはInsert Mode用に
    定義されているのですか?私は、全てのモードに定義されていると思
    っていた物ですから。やりたい事は、ノーマルモードで、jfjを^K?に
    マップしたい。

    例えば、nmap jfj ^Kqは動作するが、若しもの事を考慮してnnoremap
    jfj ^?と定義すると、何故か動きません。jもfもキーマップは定義
    していないのですが。

    済みません。宜しくお願いします。



968 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/26(土) 09:04:38 ]
keymapは主にInsert mode用です(lnoremapされるものです。mbyte-keymapのヘルプ参照)。
Normal modeで<C-K>?にマップされている機能を別のキーにマップしたい場合は、
nnoremapではなくnmapを使います(nnoremapとnmapのヘルプ参照)。
:nmap jfj <C-K>?

969 名前:名無しさん@お腹いっぱい。 [2008/04/26(土) 10:40:22 ]
>968
    mbyte-keymapのヘルプを読んだが、今一つnmapとnnoremapとの違いが
    分からない。この場合、nnoremapが動かないのは、再定義するキー
    マップが無いからなのだろうか?

    逆に、考えると確実にそのキーマップが存在していないと、nnoremap
    は動かないと考えるべきなのか。私が、nnoremapにこだわるのは何処
    でキーマップを使うか分からないので、誤動作を防ぎたい。それだけ
    の理由ですが、逆にこれが動かない結果となる。原因が分からな
    い。

    宜しく、お願いします。


970 名前:名無しさん@お腹いっぱい。 [2008/04/26(土) 19:27:08 ]
質問をさせてください。

コマンドの結果を変数に保存する場合、どのような記述をすれば良いのでしょうか。

以下が、やりたい事をvim の疑似言語で表したものです。
ここでは、:put を実行した時に出力される内容を変数に格納したいです

let tmp = `put`

どうかよろしくお願いします。



971 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/26(土) 22:41:23 ]
>>969
<C-K>?はtcvimeによってマップされているキーなのでnmapを使う必要があります。
:nmap jfj <C-K>?
としてjfjを打った場合、
以下の例のように<C-K>?はさらに展開されるので、tcvimeの関数が呼び出されます。
jfj → <C-K>? → :<C-U>call <SNR>4_ShowStrokeHelp()<CR>
一方、
:nnoremap jfj <C-K>?
としてjfjを打った場合、<C-K>?は展開されないので、
tcvimeの機能は呼び出されません。
jfj → <C-K>?

972 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/27(日) 00:00:11 ]
>>970
let tmp = system("put")

redir => tmp
put
redir END

上か下、どちらかでいけるよ。
どちらが使えるかは、put次第

973 名前:名無しさん@お腹いっぱい。 [2008/04/27(日) 10:32:29 ]
>971
    詳しい説明、有り難う御座います。何となく、mapとremapの違いが分
    かった様な気がします。
>965
    確かに、mapを指定するのでは無くてmapleaderの設定を変更した方が
    早いかも知れません。







[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](;´∀`)<368KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef