[表示 : 全て 最新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]
みんなでスクリプトを覚えよう

37 名前:27 [01/12/23 04:11]
>>30
どうもありがとう。

vim6.0 使ってみましたが emacs のような高機能ぶりで驚きました。
スクリプト機能は emacs の elisp にあたると考えて良いのでしょうか?

38 名前:KoRoN@Vim%Chalice ◆ALICEsdk mailto:koron@tka.att.ne.jp [01/12/23 10:20]
>>37
難しい質問です。elispはemacsのベースとして存在しているのでまったく同様に捉え
られてしまうと間違いなのですが、エディタを制御したり内部の関数を利用できると
いう表面的な意味においては同じと考えても差し支えないでしょう。lispに比べれば
表現力に相当の制約がありますが、それでもいかにもvimらしい命令体系で強力なス
クリプトになっています。

39 名前:ヘッポコ訳者 ◆xBY/hgW2 mailto:sage [01/12/24 00:44]
41.4 条件

":if" コマンドは条件が満足された時のみ,それ以降の":endif" までの文を実
行しまっせ.まぁ普通は

:if {condition}
 {statements}
:endif

こんな感じで.つまり, {condition}が真(ゼロ以外)って評価された時のみ
{statements}が実行されるって事ね.当然その文はちゃんとしたコマンドじゃ
なきゃダメだぞ.余計な変なのがあったりすると Vim が ":endif"を見付け
られなくなっちまうからな.

んで,":else" も使えるぞ.まぁ一般的な使い方っつったら,

:if {condition}
 {statements}
:else
 {statements}
:endif

こうね.2番目の{statements}は最初の{statements}が実行されない場合に実行
されるぞ.

んでもって,やっとこさ":elseif"のご登場

:if {condition}
 {statements}
:elseif {condition}
 {statements}
:endif

これは,":else" の後に ":if" を使ったよーに動くぞ.ただ,余計な
":endif" はいらない(つまり最後の一個だけでいい)けどね.

vimrc ファイルに書くよーな,'term'オプションをチェックして,その値に応じて
ちょっとした事をする便利な例をご紹介.

:if &term == "xterm"
: " ここに xterm 用のコマンドを書くべし
:elseif &term == "vt100"
: " ここに vt100 ターミナル用のコマンドを書くべし
:else
: " 他のターミナルについてのコマンドをここに書くべし
:endif

40 名前:ヘッポコ訳者 ◆xBY/hgW2 mailto:sage [01/12/24 00:45]
<<<論理演算(っつーか単純な「比較」なだけなよーな)>>>

まーいくつかは例の中で使って来たわけなんだけど,良く使われるのは

a == b     等しい
a != b     等しくない
a > b     より大きい
a >= b     以上
a < b     より小さい
a <= b     以下

結果は条件が満たされてれ 1 で,そーじゃなかったら 0 ね.

例)
:if v:version >= 600
: echo "おめでたう"
:else
: echo "バージョン古いぞ,アップデートしろや!"
:endif

"v:version" ってのは Vimのバージョンを表す,Vim に既に定義されてる変
数ね.600 は バージョン 6.0 の事で,バージョン 6.1 は 601 ってなるぞ.
これ使うと,Vim の色々なバージョンで動くスクリプトを書く時には便利だ
ぞ. |v:version|

論理演算(っつーか比較なんぢゃぁ…)は数値にも文字列にも使えるぞ.文字
列を比較した時は数学的な差が使われるぞ.つまり,バイト値が比較される
から,言語によっては正しくない事もあるからな.

文字列と数値とで比較した場合は,まず文字列が数値に変換されて,それか
ら比較されるぞ.これはちょっとトリッキーで,文字列が数字と認識されない
場合は文字列はゼロとして扱われるぞ.つまり,

:if 0 == "one"
: echo "禿同"
:endif

ってやると,"one" が数字とは認識されないから,ゼロに変換されちゃって,
んでもって"禿同"が表示されちゃうわけよ.

41 名前:ヘッポコ訳者 ◆xBY/hgW2 [01/12/24 00:46]
文字列に対してはあと二つばかりまだあんのよ.

a =~ b  正規表現にマッチする
a !~ b  正規表現にマッチしない

左辺の "a" は文字列で,右辺の "b" は検索で使うような正規表現(以下パター
ン)だぞ.
例)

:if str =~ " "
: echo "str contains a space"
:elseif str !~ '\.$'
: echo "str ends in a full stop"
:endif

シングルクウォートで括った文字列をパターンに使ってる事にご注目.パター
ンって結構バックスラッシュ良く使うんだけど,ダブルクウォートの文字列
使うと,バックスラッシュ二重にしなくっちゃならないから,シングルク
ウォートの文字列使った方が便利なわけよ.

文字列比較する時は 'ignorecase' オプションが使われるぞ.もしそれが嫌
だったら,大文字小文字を考慮する場合は "#",無視する場合は"?" を演算
子の後に付ければいいぞ.つまり,"==?" は大文字小文字関係無く一致を調
べるし, "!~#" ってやれば,大文字小文字を考慮して,パターンにマッチしな
いかどうかを調べるってわけよ.まぁ完全な一覧は |expr-==| を見てくれや.


<<<ループについてもーちっとばかり>>>

":while" コマンドについてはもうしゃべっちまったけど,あと2つばかり
":while" と ":endwhile" の間に使えるコマンドがあるのよ,実は.


:continue    while ループの先頭まで戻ってループを続ける
:break      ":endwhile" まで飛んで,ループから抜ける

例)
:while counter < 40
: call do_something()
: if skip_flag
:  continue
: endif
: if finished_flag
:  break
: endif
: sleep 50m
:endwhile

":sleep" コマンドは待機するコマンド(makes Vim take a nap)ね. "50m"
ってのは 50 ミリ秒の事.まぁもーちっと例を挙げると,":sleep 4" ってやれ
ば 4秒間待機するってわけさ.

42 名前:ヘッポコ訳者 ◆xBY/hgW2 mailto:sage [01/12/24 00:48]
ハイ,クリスマスプレゼントは以上です(藁

ところで "LOGICAL OPERATION" って「論理演算」だよねぇ?
これって僕の勝手な感覚では「論理和」とかあっちの方の意味
なんだけど,この感覚ってもしかして間違ってる?

43 名前:1 [01/12/24 01:25]
全バッファに対して一括置換が行える便利スクリプトをマニュアルの中に発見しました。
:help map.txt|/Allargs でジャンプ

抜粋。
> :function Allargs(command)
> : let i = 0
> : while i < argc()
> : if filereadable(argv(i))
> : execute "e " . argv(i)
> : execute a:command
> : endif
> : let i = i + 1
> : endwhile
> :endfunction
> :command -nargs=+ -complete=command Allargs call Allargs(<q-args>)

function 〜 endfunction で関数定義。
argc() は バッファ数。
argv(i) は i 番のバッファ名の取得。(:ls で確認できる)
filereadable() は指定バッファが読み出せるか?
execute は ex コマンドの実行。

使う時。foo を bar に置換しまくる。
:Allargs %s/foo/bar/ge|update
eオプションをつけないと foo が無いというメッセージがのんびり表示されて、いつま
でたっても置換が終わらないので気をつけよう(それに気づかずに密かにハマった)
コマンドは | で連続で実行できて、update は変更のあったバッファだけを保存。と。

カレントの *.cpp を置換する場合は予め、
:ar *.cpp
ってやっとくと全部読み込まれる。
確認するには
:ar
と。

すげー便利というか、他のエディタだったら最初から
装備しているような機能だから当然、 _vimrc に書いといて、
_vimrc に書くときは何回定義しても起こられないように
function と command の後に ! を付けとくほうがいいかも。

>>36
縦分割って6.0から追加された機能あるの?? :sp とかじゃなくて?

>>42
御苦労さんです。LOGICALだと同じく or and って感覚ですねえ。

44 名前:名無しさん@お腹いっぱい。 mailto:sage [01/12/24 01:57]
>>38
わざわざどうもありがとう。
>>3 のリンクを見てなんとなく感じがつかめました。

今日から Vim Scriptor ということで宜しく。

45 名前:名無しさん@お腹いっぱい。 mailto:sage [01/12/24 03:27]
>>43
ctrl-W_V
とか



46 名前:45 mailto:sage [01/12/24 03:30]
スレ違いなのね
ちょっと反省

47 名前:1 mailto:(´Д`;) [01/12/24 22:34]
call confirm("クリスマスイブ", "逝ってよし(´Д`;)")

48 名前:1 mailto:(´Д`;) [01/12/24 22:57]
さぁて、お勉強。
とりあえずKoRoNさんのwc相当スクリプト解析

:function! s:CountChar(first, last)
"!をつけると上書き定義になる。んで s: をつけているから command! のところで
"<SID>CountChar と書かなくてはならない。
: let i = a:first "引数は a: を付けて参照する。a:first は先頭行
: let sum = 0
: while i <= a:last " a:lastは最後の行
: "echo "line: " . i " デバッグ用につけているみたい
: let sum = sum + strlen(substitute(getline(i), '.', ' ', 'g'))
" getline()は指定行の文字列取得。先頭行は0じゃなくて1
" substitute(a,b,c,d) は a =~ s/b/c/d と同等(たぶん)
: let i = i + 1
: endwhile
: return sum "戻り値はreturnで返す。Cと一緒。
:endfunction
:command! -range=% CountChar :echo "Count of characters: " . <SID>CountChar(<line1>, <line2>)
"command! で上書き。定義されるコマンド名は CountChar で別に関数名と同じにしなくちゃいけない
"という決まりがあるわけじゃない。-range=% とすると <line1> に最初の行 <line2> に後の行が格納される。
"<SID>はしらん。と。

49 名前:ヘッポコ訳者 ◆xBY/hgW2 mailto:sage [01/12/24 23:14]
41.5 式の実行

今んところコマンドは全部 Vim から直接実行されてたわけなんだが,
":execute" コマンドを使えば式の結果を実行する事が出来るぞ.こいつを使う
とコマンドを作って実行する時にカナリ便利!!

例として,変数に含まれてるタグまでジャンプするのを挙げてやろう.

:execute "tag " . tag_name

"." は "tag " という文字列と, "tag_name" という変数に格納されてる値
を結合するのに使ってるんだぞ.つまり "tag_name" って変数の値が
"get_cmd" だったとすると,

:tag get_cmd

っていうコマンドが実行される事になるわけよ.

":execute" コマンドはコロンコマンド(colon commands)しか実行出来ねーから
な.":normal" コマンドを使えばノーマルモードのコマンド(Normal mode
commands)が実行出来るぞ.でもその場合は引数は式じゃなくって,コマンドと
なる文字だからそこんとこ分かっとくよーに.つまり,

:normal gg=G

ってやると,最初の行にジャンプしてから "=" の操作によって最後の行までを
整形するってわけ.

":normal" を式と一緒に使いたければ,":execute"と組み合わせればいいぞ.
つまり,

:execute "normal " . normal_commands

ってやればいい."normal_commands" に格納されてる値はノーマルモードの
コマンドになる文字じゃないとダメなのは当然な.

":normal"
コマンドへの引数は完璧なコマンドじゃなきゃダメだぞ.そーしねーと Vim は
引数の最後まで実行した後はそのままそのコマンドを終了しちまうからな.
 # つまり,引数で指定されたコマンド以上の事は何一つとして余計な事は
 # しないって意味でしょうな,たぶん.
例えば,挿入モードを始めて,そこから抜け出すなんて事も出来る.

:execute "normal Inew text \<Esc>"

これで,カレント行に "new text " っていう文字列を挿入するぞ.特殊キー
"\<Esc>" を使ってるところに御注目あれ.こーすれば実際のエスケープ文字を
スクリプトに書かなく済むわけだ.

50 名前:ヘッポコ訳者 ◆xBY/hgW2 mailto:滅入り苦しみます!! [01/12/24 23:16]
今日はこれだけにしときます.
あー,ヤダヤダ.世間様は楽しんでるんだろうなァ・・・

51 名前:実話 mailto:sage [01/12/25 00:07]
KoRoN さんは今ごろセックスにふけってますよ

52 名前:ヘッポコ訳者 ◆xBY/hgW2 mailto:sage [01/12/26 00:53]
なんか一気にモチベーツョン下がった…
なんで漏れはこんななんだろう…
ハァ…………

53 名前:名無しさん@お腹いっぱい。 [01/12/26 01:03]
>>52
がんばってage

54 名前:あぼーん mailto:あぼーん [あぼーん]
あぼーん

55 名前:ヘッポコ訳者 ◆xBY/hgW2 mailto:sage [01/12/26 02:19]
今日はなんかやる気無くしちゃったのでお休み.
明日からは忘年会地獄の三連荘(しかも女っ気ゼロ)だからたぶん連休になります.
ご容赦あれ.

>53
ぐすっ…うっうっうっ…こんなヲレに愛の手を…



56 名前:1 [01/12/27 00:29]
foo.vim にある DoSp() の解読。

" 文字列中の<C-U>のような特殊文字を解釈して値を返す方法(?)
fun! DoSp(str)
 let s = substitute(a:str, '.*\<C-U>', "", "")
 return s
endfun

:echo DoSp("Hello<C-U>World")
World

特殊文字<C-U>でHelloが消されたと。
でも <C-U> に意味があるんじゃなくて単に
"〜<C-U>" が "" に置換されただけちゃうんかと。
まーええか。寝よ。

57 名前:1 [01/12/27 22:24]
" 入力モードにおける入力文字列を評価。特別文字<C-U>および<C-N>のように、入力
" モードで実行されるでしょう。生の<Esc>特徴は予測不能の結果を生むでしょう(Exciteより)
fun! EvalInput(string)
 new
 execute "normal a" . a:string . "\<Esc>ggyG"
 q!
 return @"
endfun

new は新しいウィンドウ作成
execute は引数の結果をコマンドとして実行。詳しくは>>49
a:string の a: は引数を参照するから付ける。
. は文字列の連結。
string が "Hello" なら normal aHello\<Esc>ggyG が実行されて
Hello が入力されて先頭(gg)から最後(G)までをヤンク(y)。
ちなみに ggyG は ggVGy でもいいけどチョトかっこ悪い。
q! はウィンドウを強制的に閉じる。
@ はレジスタ参照 " はヤンクのされたのが入っとるレジスタ。それが戻り値と。

今回もなにに使うのかよくわからんスクリプトじゃった。

58 名前:1 [01/12/29 13:10]
引き続き foo.vim の解読。

" HTMLの対応するタグにジャンプする
fun! HTMLmatch()
 if getline(".")[col(".")-1] !~ "\\a"
  normal! %
  return
 endif
 execute "normal ?\\A\<CR>"
 normal lye
 if getline(".")[col(".")-2] == '/'
  execute 'normal ?<\s*' . @" . "\<CR>l"
 else
  execute 'normal /<\s*\/' . @" . "\<CR>ll"
 endif
endfun

nmap % :call HTMLmatch()<CR>

getline(".") はカレント行取得。col(".") はカーソルのカラム値取得。(なんで1か
ら始まるんだろう・・・) 正規表現 \a はタグ名にヒットさせる為の [A-Za-z] の事で
マッチしないと通常の % を実行。?は後方検索。\A は [^A-Za-z] だからタグの< の
部分に移動。lye はでタグ名に移動(l)してからヤンク(ye)。んでカーソル前が / な
ら終了タグなので ?で後方タグ検索。/ じゃなければ前方タグ検索と。

nmap はノーマルモード時に有効なコマンド割り当てで、% をタイプされたら
:call HTMLmatch()<CR>
が自動的に実行されると。

これは結構勉強になったなー

59 名前:1 [01/12/30 15:07]
バッファに入った時、自動的に HelloWorld ダイアログを出す方法。

augroup Foo
 autocmd BufEnter *.cpp call confirm("HelloWorld", "OK")
augroup END

augroup 適当なグループ名 〜 augroup END の中で記述。
autocmd の引数は順に、どんな時? 対象ファイル どうする?

この機能があるから拡張子に対応したシンタックスハイライトが
自動設定されたりするわけかぁ。
だんだんVimの謎が解けてきた。

60 名前:名無しさん@お腹いっぱい。 mailto:sage [01/12/30 18:06]
なんか結構簡単に書けそうな気がしてきた。
もうちょっと勉強してみます。

61 名前:1 [01/12/31 14:04]
引き続き foo.vim の解読。

class Klass { などとタイプすると、

//-------------------- class Klass
class Klass {
};

となるスクリプト。
まず発動の準備。

augroup Foo
 autocmd BufEnter *.cpp,*.h inoremap { {<Esc>:call ClassHeader("-")<CR>a
 autocmd BufLeave *.cpp,*.h iunmap {
 " Keep your braces balanced!}}}
augroup END

*.cpp または *.h のバッファに移動した瞬間に挿入モードの時に { を
タイプすると、どさくさに ClassHeader("-") を実行する。
バッファから抜けた時(BufLeave)には { での発動を解除。

fun! ClassHeader(leader)
 if getline(".") !~ "^\\s*class"
  return
 endif
 normal yyP$x
 let width = 80
 if exists("&tw")
  let width = &tw
 endif
 execute "normal " . (width-virtcol(".")-3) . "I" . a:leader . "\<Esc>"
 execute "normal a \<Esc>"
 execute "normal I//\<Esc>"
 " Keep your braces balanced!{
 execute "normal! jo};\<Esc>"
 normal k$
endfun

行頭に空白が含まれるかもしれない class がある行じゃなかったら終了。
で、行を二重化(yyP)して、行末移動($)して "}" を削除(x)。
widthはデフォルトで80にしたけど、tw オプションがあればそっちを有効に。
virtcol(".") は画面上のカーソルX座標。col(".") とはチョット違う。
で、"60I-<ESC>" みたいなのが実行されて - がたくさん挿入されて
"a <ESC>" は右隣に一文字スペース挿入して、下移動(j)、下に一行挿入(o)して
}; を入力して、上の行の最後に移動(k$)。

って、これじゃ読んでる人わけわからんだろうーな。

ちなみに tw オプションが 0 なら上のスクリプトは "-" を負の個数分挿入する事に
なってうまく動作しないので exist("&tw") && &tw != 0 にしたほうがいいのかも。

あと、ハイライトが崩れないようにコメントで調整しているところもポイント!

なんかスクリプトの要領が若干つかめてきた感じがするなー

62 名前:1 mailto:sage [01/12/31 14:08]
>行末移動($)して "}" を削除(x)。

>行末移動($)して "{" を削除(x)。
でした。

63 名前:KoRoN@Vim%Chalice ◆ALICEsdk mailto:koron@tka.att.ne.jp [01/12/31 14:34]
>>61 Vim6向け補足

> *.cpp または *.h のバッファに移動した瞬間に挿入モードの時に { を
> タイプすると、どさくさに ClassHeader("-") を実行する。
> バッファから抜けた時(BufLeave)には { での発動を解除。

Vim6ではバッファ毎にマップを指定できるのでftplugin/c.vimに
(ftpluginはUNIXなら$HOME/.vim/ftplugin、Winなら$VIM/vimfiles/ftplugin)
 :inoremap <buffer> { {<Esc>:call ClassHeader("-")<CR>a
と書いておけば'filetype'が"c"の時に自動的に読み込まれる。だからaugroup Fooは
要らない。
# 'filetype'がcppの時は$VIMRUNTIME/ftplugin/cpp.vimの記述から'runtimepath'の
# c.vimが読み込まれるようになっているのでc.vimだけで良い。

あと<silent>フラグも指定すればマップ実行時にコマンドラインが汚れることもなくて
更にハッピー。例:
 :inoremap <silent> <buffer> { {<Esc>:call ClassHeader("-")<CR>a

64 名前:ヘッポコ訳者 ◆xBY/hgW2 mailto:sage [01/12/31 15:57]
41.6 関数を使う

Vim は沢山の関数を定義してて,んでもって大量の機能を提供してるわけよ.
まぁちぃとばかりこのセクションで例を挙げてやろう.全部のリストは
|functions| を見ておくれ.

関数は ":call"コマンドで呼び出されるぞ.引数はカッコの中にカンマで区
切って渡すべし.
例)

:call search("Date: ", "W")

この例は search() 関数を "Date: " と "W" という引数を渡して呼ぶぞ.
search() 関数は最初の引数を検索パターンとして使い,二番目の引数をフラグ
として使うぞ."W" フラグはファイルの最後まで検索が行ったらもう上には
戻って来ないようにするフラグ(doesn't wrap around the EOF)な.

関数は指揮の中で呼ぶ事も出来るぞ.
例)

:let line = getline(".")
:let repl = substitute(line, '\a', "*", "g")
:call setline(".", repl)

getline() 関数は現在のファイルの行を得るぞ.引数には行数を指定すべし.
この場合は "." が使われてるけど,コイツはカーソルのある行っつー意味にな
るぞ.

substitute() 関数は ":substitute" コマンドと同じよーな事をするぞ.最
初の引数は関数を適用する文字列で,二番目の引数は置換されるパターン,
三番目が置換する文字列,そんで最後の引数にはフラグを指定すべし.

setline() 関数は第一引数で指定された行の内容を第二引数で指定された文
字列にセットするぞ.つまり,この例ではカーソルのある行の内容を
substitute()関数の結果で置き換えるようになってるわけだ.んだからこの
三行は

:substitute/\a/*/g

と同じ事をやるってわけね.こーやって関数を色々使えば substitute()
を呼ぶ前や後にもっと色々やって面白い事が出来るようになるぞ.

65 名前:ヘッポコ訳者 ◆xBY/hgW2 mailto:sage [01/12/31 15:58]
<<<関数紹介>>>

まぁ沢山関数はあるわけなんだが,使用目的別にちょいと列挙してみようか.
アルファベット順のリストは |functions| を見てくれ. CTRL-] を関数名の
上で入力すればその関数の詳細なヘルプに飛べるぞ.

文字列操作:
 char2nr()  文字から文字コードを得る
 nr2char()  文字コードから文字を得る
 escape()   文字列中の文字達を'\'を使ってエスケープする
 strtrans()  文字列を表示可能な形に変換する
 tolower()  小文字に変換
 toupper()  大文字に変換
 match()   文字列中でパターンにマッチする場所を得る
 matchend()  文字列中で最後にパターンにマッチする場所を得る
 matchstr()  文字列中でパターンにマッチする文字列を得る
 stridx()   文字列に含まれる部分文字列の位置を得る
 strridx()  文字列に含まれる最後の部分文字列の位置を得る
 strlen()   文字列の長さを得る
 substitute() 文字列中でパターンにマッチしたものを置換
 submatch()  ":substitute" 中で特定のマッチを得る(n番目の括弧の中とかそーゆーヤツ)
 strpart()  部分文字列を得るget part of a string
 expand()   特殊キーワードを展開する(%=>現在のファイル名とか)
 type()    変数の種類を得る

カレントバッファのテキストに適用:
 byte2line()  あるバイト数の行番号を得る
 line2byte()  ある行までのバイト数を得る
 col()     マークやカーソル位置の列番号を得る(tab を 1 とカウントするとか)
 virtcol()   マークやカーソル位置のscreen columnを得る(tab を tabwidth 分だけカウントするとか)
 line()   マークやカーソル位置の行番号を得る
 wincol()    カーソル位置のwindow columnを得る(set nu の数字とかも含んでカウント)
 winline()   カーソル位置のwindow lineを得る
 getline()   バッファから行を得る
 setline()   バッファ中の行を置き換える
 append()    {lnum} で指定された行の後に{string}を追加する
 indent()    指定された行のインデント数を得る
 cindent()   指定された行のインデント数を cindent に従って得る
 lispindent()  指定された行のインデント数を lisp に従って得る
 nextnonblank()  次の空行でない行の行番号を得る
 prevnonblank()  手前の空行でない行の行を得る
 search()    パターンにマッチする行を得る
 searchpair()  find the other end of a start/skip/end # 対応する if とかを探すやつ.どう訳していいか分からん.



66 名前:ヘッポコ訳者 ◆xBY/hgW2 mailto:sage [01/12/31 15:59]
とりあえずちょっと復活.
でもなんかこの関数列挙あんま意味無いよーなあるよーな.
まぁ訳してるヲレ自身は詳細のヘルプ見たりして勉強にはなるから
いいんだけど.

67 名前:1 mailto:sage [01/12/31 21:32]
吉野家で「大盛りねぎだく玉」を頼んで
殺伐として帰る2chのイベントに参加してきたよ(w

>>KoRoNさん
補足どうもです。
バッファローカルで設定出来るってことは BufLeave での設定も
必要ないってことなんですかね。
ちなみにVim6スクリプトお勉強、といいつつマニュアルは
5.7の日本語化されたのしか読んでなかったりします(ぉ

>>へっぽこ訳者さん
やっぱり、人の作った(書いた)のを漠然と読むより自分で
調べた時に、身につくような気がしますねぇ。
でもまぁ、お勉強仲間がいると切磋琢磨できるので、
気にせずマイペースでカキコしちゃってください。

68 名前:名無しさん@お腹いっぱい。 mailto:sage [01/12/31 21:48]
今までQX一辺倒だったけどここ見て急にVIMが使ってみたくなったのです(●´ω`●)
ここに書かれてることスクリプトってWindowsでも共用なのですか?

69 名前:KoRoN@Vim%Chalice ◆ALICEsdk mailto:koron@tka.att.ne.jp [01/12/31 22:02]
>>67
おおお。で、どうでした?。殺伐としてましたか?。吉野家の「ねぎたく禁止令」はデ
マでしたか?。ちょっとレポートが聞きたかったり(苦笑)。なおBufLeaveでの設定も
勿論この例では要りません。

>>68
大丈夫です。使えます。Vimはキー操作が一般のエディタとはあまりにかけ離れてい
てきっと戸惑うこととは思いますが、幸運な出逢いであることを願っています。
日本語Windows版のダウンロードはこちらからどうぞ
 www.kaoriya.net/

70 名前:1 mailto:sage [01/12/31 23:07]
>>69
殺伐としてましたねぇ。んで突然「水きぼーん」の声。もうワライ堪えるのが大変。
詳しくはこちら↓今見たら、なんか元旦もやるとかいってるし(w
大晦日は殺伐と吉野家へ(集合)その7
corn.2ch.net/test/read.cgi/entrance/1009805196/

>>68
OSには依存しないから大丈夫。
Winで覚えたことはLinuxになってもそのまま活かせるし。

71 名前:名無しさん@お腹いっぱい。 [01/12/31 23:11]
なにやら新ルール {
つゆだくを頼むヤツがいたら鼻で笑ってやってください
牛鮭定食を頼むヤツがいたら舌打ちしてやってください
}とさ

72 名前:1 [02/01/01 22:28]
今日も吉野家逝ってきた。あえて牛鮭頼んだら
隣の奴がブチ切れだったららしい(w
というわけで<args>と<q-args>の違いの確かめる。

command! -nargs=* Test1 echo <args>
command! -nargs=* Test2 echo <q-args>

command! で Test1 と Test2 のコマンドを定義。
-nargs=* は引数を0個以上取る

:Test1 "Hello"
Hello

:Test2 "Hello"
"Hello"

<q-args>は " をクォートしてくれていると。
そんだけ。
明日から牛の鳴き声が聞こえるような所に帰省します、、、。

73 名前:1 mailto:sage [02/01/01 22:32]
なんか誤字が多いなー、牛乳飲も。

74 名前:ヘッポコ訳者 ◆xBY/hgW2 mailto:sage [02/01/03 01:02]
システム関数とファイル操作関数:
 browse()    put up a file requester(GUI バージョン使ってないから分からん)
 glob()     ワイルドカードの展開
 globpath()   指定されたパス内で glob
 resolve()    ショートカット先を探す(MS-Win)
 fnamemodify()  ファイル名変更
 executable()  実行可能プログラムがあるかどうか調べる
 filereadable() ファイルが読み込み可能かどうか調べる
 isdirectory()  ディレクトリがあるかどうか調べる
 getcwd()    カレントディレクトリを得る
 getfsize()   ファイルサイズを得る
 getftime()   ファイルの最終更新時を得る
 localtime()   現在時刻を得る
 strftime()   時間を文字列に変換
 tempname()   テンポラリファイル名を得る
 delete()    ファイル削除
 rename()    ファイルリネーム
 system()    シェルコマンドの実行結果を得る
 hostname()   システムのホスト名を得る

バッファ,ウィンドウ,引数リスト:
 argc()      引数リストの引数の数
 argidx()     引数リストでの現在位置
 argv()      引数リストから一つの要素を得る
 bufexists()   バッファが存在するかどうかを調べる
 buflisted()   バッファがバッファリストに存在するかどうかを調べる
 bufloaded()   バッファがロードされているかどうかを調べる
 bufname()    バッファ名を得る
 bufnr()     バッファナンバーを得る
 winnr()     カレントウィンドウのバッファナンバーを得る
 bufwinnr()    バッファのウィンドウナンバーを得る
 winbufnr()    ウィンドウのバッファナンバーを得る
 getbufvar()   バッファの変数を得る
 setbufvar()   バッファの変数を設定する
 getwinvar()   ウィンドウの変数を得る
 setwinvar()   ウィンドウの変数を設定する

75 名前:ヘッポコ訳者 ◆xBY/hgW2 mailto:sage [02/01/03 01:03]
なんか訳しててあんま楽しくない個所なんで今日はここまで(苦笑)



76 名前:名無しさん@お腹いっぱい。 mailto:sage [02/01/03 02:00]
陰ながら応援してますよ、がんばってください。

77 名前:KoRoN@Vim%Chalice ◆ALICEsdk [02/01/03 10:39]
>>75
eval.txtの翻訳の時、同じ気持ちになった(苦笑)

78 名前:ヘッポコ訳者 ◆xBY/hgW2 mailto:sage [02/01/03 23:31]
Folding:
 foldclosed()  ある行のfoldが閉じているかどうかを調べる
 foldlevel()   ある行のfoldの深さを調べる
 foldtext()   閉じている fold を表示する行の生成

シンタクスハイライティング:
 hlexists()   ハイライトのグループがあるかどうかを調べる
 hlID()     ハイライトのグループのIDを得る
 synID()     ある位置における syntax ID を得る
 synIDattr()   syntax ID の特定の属性を得る
 synIDtrans()  translated syntax ID を得る

履歴:
 histadd()    履歴に要素を追加
 histdel()    履歴から要素を削除
 histget()    履歴から要素を得る
 histnr()    履歴の現在のインデックスを得る

対話:
 confirm()    選択肢の表示
 getchar()    ユーザからの入力(文字)を得る
 getcharmod()  最後に入力された文字のモディファイア(CtrlとかShiftとか)を得る
 input()     ユーザからの入力(行)を得る
 inputsecret()  ユーザからの入力(行)を得る(表示はしない)
 inputdialog()  ユーザからの入力(行)を得る(ダイアログで)

Vim サーバ:
 serverlist()     サーバ名のリストを得る
 remote_send()     コマンド文字列を Vim サーバに送信
 remote_expr()     Vim サーバで式を評価
 server2client()    クライアントに返信
 remote_peek()     Vim サーバからの返答があるかどうかを調べる
 remote_read()     Vim サーバからの返答を読み込む
 foreground()     Vim のウィンドウを全面へ移動
 remote_foreground()  Vim サーバのウィンドウを全面へ移動

Various:
 mode()        現在の編集モードを得る
 visualmode()     最後に使われたビジュアルモード("v" or "V" or "C-V")
 hasmapto()      map が存在するかどうかを調べる
 mapcheck()      マッチする map が存在するかどうかを調べる
 maparg()       マッピングの実体(rhs)を得る
 exists()       変数,関数等が存在するかどうかを調べる
 has()         vim が機能を備えているかどうかを調べる
 cscope_connection()  cscope のコネクションがあるかどうか調べる
 did_filetype()    check if a FileType autocommand was used
 eventhandler()    イベントハンドラによって起動されたのかどうかを調べる
 getwinposx()     GUI Vim ウィンドウの X 位置を得る
 getwinposy()     GUI Vim ウィンドウの Y 位置を得る
 winheight()      ウィンドウの高さを得る
 winwidth()      ウィンドウの幅を得る
 libcall()       外部ライブラリの関数呼び出し(戻り値が文字列)
 libcallnr()      外部ライブラリの関数呼び出し(戻り値が整数値)

79 名前:ヘッポコ訳者 ◆xBY/hgW2 mailto:sage [02/01/03 23:32]
やっとツマランところ終了.
KoRoN 殿のような方々の辛さを実感(苦笑)

80 名前:KoRoN@Vim%Chalice ◆ALICEsdk mailto:sage [02/01/03 23:49]
>>79 お疲れさん!!

81 名前:名無しさん@お腹いっぱい。 mailto:sage [02/01/05 22:00]
現在行から一番近い上か下のマークへジャンプするスクリプトを作ってみました。
皆様のおかげです。厨房くさいスクリプトですが思い切って、投稿してみます。
まずいとことかあったら教えてください。
行単位でしか見てないので、一行に複数のマークがあっても無視してます。

"マークにジャンプする
function! JumpToMark(mode)
 let i = 0x61
 if a:mode == "up"
  let s:LineNo = 0
 endif
 if a:mode == "down"
  let s:LineNo = line("$") + 1
 endif
 let s:LineNoOrg = line(".")
 let s:MarkChar = ""
 "a-z をチェック
 while i < 0x7b
  let s:x = line("'" . nr2char(i))
  if (a:mode == "up" && s:LineNoOrg > s:x && s:LineNo < s:x) || (a:mode == "down" && s:LineNoOrg < s:x && s:LineNo > s:x)
   let s:MarkChar = nr2char(i)
   let s:LineNo = s:x
  endif
  let i = i + 1
 endwhile
 if (a:mode == "up" && s:LineNo > 0) || (a:mode == "down" && s:LineNo < line("$") + 1)
  "移動
  execute "normal `" . s:MarkChar
  echo "マーク" s:MarkChar "にジャンプ"
 else
  execute "echohl ErrorMsg"
  echo "該当するマークがない;;"
  echohl None
 endif
endfunction


■使い方
"上のマークへ
:call JumpToMark('up')
"下のマークへ
:call JumpToMark('down')

なぜか画面のスクロールを伴うマークへのジャンプをした後の echo で出力した
メッセージが表示されません(表示されて消える?)
スクロールされた後でもメッセージが表示できるようにする方法はあるんでしょうか?
win2000 のgvim 6.0 です。

82 名前:KoRoN@Vim%Chalice ◆ALICEsdk mailto:koron@tka.att.ne.jp [02/01/06 00:45]
折角公開してくれたのだから少し細かくコメントしましょう。こういうのは全く無反
応だと公開した方・使っている方、両方にとってためになりませんからね。

> function! JumpToMark(mode)
s:を使ってスクリプトファイルローカルに宣言しませう。
で、command SomeCmd call <SID>JumpToMark()な感じで呼び出すようにする。
>  let i = 0x61
let i = char2nr('a')とかのほうが意味合いがしっかりする。
もしくはlet markchar = "abc...xyz"としてmarkchar[i]でアクセスするように。
後者のほうが移植性に富むからベター。
>  if a:mode == "up"
演算子==は'ignorecase'の影響を受けるので==#とか==?とかも考慮する。
>   let s:LineNo = 0
関数内のletは関数にローカルな変数になるので特に必要性がないのならs:は使わな
い。(以下全変数同様)
>  endif
> (中略)
>   if (a:mode == "up" && s:LineNoOrg > s:x && s:LineNo < s:x) || (a:mode == "down" && s:LineNoOrg < s:x && s:LineNo > s:x)
この判定ロジック、もうちょっと工夫のしようがないかしら?。
同じような文字列の比較が何度も出てくる場合は簡潔に書き直せることが多い。
>    let s:MarkChar = nr2char(i)
> (中略)
>   execute "echohl ErrorMsg"
なんでここexecuteしてるの?。生で実行できる。
>   echo "該当するマークがない;;"
> (中略)
> :call JumpToMark('up')
前述のとおりcommandでコマンド定義するかmapすべし。

> なぜか画面のスクロールを伴うマークへのジャンプをした後の echo で出力した
> メッセージが表示されません(表示されて消える?)
マークでジャンプした後にredraw!で強制的に更新バッファをflushしませう。
Chaliceの中では多用しているテクニックです。

私からはこんなところです。

83 名前:81 mailto:sage [02/01/06 03:07]
KoRoNさんにこんなに詳細にコメントを頂けるなんて感激です。
ありがとうございます。
このスレでvimスクリプト入門を果たしたので知らないことばかりですが
これからも精進したいです。
修正したものを貼り付けます。
# マーク位置を判定 の部分は私の能力では簡潔に書き直せなかった;;

"マークにジャンプする
function! s:JumpToMark(mode)
 let markchars = "abcdefghijklmnopqrstuvwxyz"
 if a:mode ==? "up"
  let LineNo = 0
 endif
 if a:mode ==? "down"
  let LineNo = line("$") + 1
 endif
 let LineNoOrg = line(".")
 let MarkChar = ""
 let i = 0
 "a-z をチェック
 while i <= (char2nr('z') - char2nr('a'))
  let x = line("'" . markchars[i])
  "マーク位置を判定
  if (a:mode ==? "up" && LineNoOrg > x && LineNo < x) || (a:mode ==? "down" && LineNoOrg < x && LineNo > x)
   let MarkChar = markchars[i]
   let LineNo = x
  endif
  let i = i + 1
 endwhile
 if MarkChar != ""
  "移動
  execute "normal `" . MarkChar
  redraw!
  echo "マーク" MarkChar "にジャンプ"
 else
  echohl ErrorMsg
  echo "該当するマークがない;;"
  echohl None
 endif
endfunction

"コマンド定義
command! JumpToMarkDown call <SID>JumpToMark('down')
command! JumpToMarkUp call <SID>JumpToMark('up')

84 名前:KoRoN@Vim%Chalice ◆ALICEsdk mailto:koron@tka.att.ne.jp [02/01/06 04:05]
>>83 ナイスですねぇ。
>  while i <= (char2nr('z') - char2nr('a'))
ここだけwhile i < strlen(markchars)としたほうが良いでしょう。

私は変数名を大文字で始めるのは避けるようにしています。ユーザ定義コマンドや関
数名は大文字で始めなければなりませんよね。それとかぶって見づらいかなと思うわ
けです。スタイルの問題なのですぐ宗教論争になってしまいますが一応参考意見とし
て。

85 名前:81 mailto:sage [02/01/06 21:10]
>>KoRoNさん
> 私は変数名を大文字で始めるのは避けるようにしています。
確かにです。私もそうしたいと思います。
ほんとにありがとうございました。
これから vim online に逝ってきます。



86 名前:1 [02/01/06 21:42]
>>81-84
うーん、いろいろ勉強になりますなー。
<SID>はスクリプトローカル関数を呼ぶ時の為のものだったのか、、、

で、引き続き foo.vim の解読。

2〜4行目のfooをbarに置換するには、
:2,4 s/foo/bar/g
と書くけど 2 と 4 が変数a,bの場合、
:a,b s/foo/bar/g
と書いてしまうと正常に動作しない。
それに対応するのが次のスクリプト。

command! -nargs=* Line
 \ | let Line_range = matchstr(<q-args>, '\S\+')
 \ | let Line_range = "(" . substitute(Line_range, ",", ").','.(", "") . ")"
 \ | execute "let Line_range = " . Line_range
 \ | execute Line_range . substitute(<q-args>, '\S\+', "", "")
 \ | unlet Line_range

使い方。
:let a=2
:let b=4
:Line a,b s/foo/bar/g
あと範囲指定部分で演算が可能。
:Line a-1,b+1 s/foo/bar/g

スクリプト解読。
-nargs=* は引数を0個以上取る。
行をまたいで定義するには \ で繋ぐ。
<q-args>は引数を一つの文字列として参照する "a,b s/foo/bar/g"
\S\+ は1個以上の空白以外で matchstr は最初のにヒットするから、
matchstr("a,b s/foo/bar/g", '\S\+') は "a,b" がヒットする。
んで、ごちゃごちゃしているけど Line_range="(a).','.(b)" となって、次がポイント。
Line_range が execute で評価されて結果 "2,4" が Line_range に入る。
ちなみに let Line_range = execute(Line_range) などとは書けそうで書けない。
で、substitute(<q-args>, '\S\+', "", "") は a,b の部分を消して " s/foo/bar/g" が残る。
二つを連結して execute "2,4 s/foo/bar/g" が実行されると。

87 名前:1 [02/01/08 00:32]
逆転裁判(GBA)をやっとクリアした今日この頃。

じゃ、foo.vim解読の続き。

>>86の別のやり方。

command! -nargs=* Range
 \ | execute substitute(<q-args>, '\(\S\+\)\s\+\(\S\+\)\(.*\)',
 \ 'let Range_range=\1.",".\2', "")
 \ | execute Range_range . substitute(<q-args>, '\S\+\s\+\S\+', "", "")
 \ | unlet Range_range

a〜b行目を置換するには?
:let a = 2
:let b = 4
:Range a b s/foo/bar/g

ごちゃごちゃしている正規表現もよく見れば簡単。
\s は空白。\S は空白以外。+は前の文字が1個以上。
()で囲ったのは置換文字列内で順に \1 \2 とかで参照出来る。
+ と () には \ を付ける。

んで、let Range_range=a.",".b が実行されて変数が数値に展開されて、
execute "2,4" . " s/foo/bar/g" となると。

88 名前:1 [02/01/08 23:17]
可変長引数の参照方法。

fun! Foo(...)
 echo a:0 a:1 a:2
endfun

:call Foo("A","B")
2 A B

なんとも奇妙な感じがするけど、
a:1 から順に引数が入ってて a:0 に引数の数が入っていると。
ちなみに :call Foo("A") だと a:2 が参照出来ないのでエラーになった。

89 名前:名無しさん@お腹いっぱい。 mailto:sage [02/01/08 23:27]
初めて見てみたけどわけわかんないっす。
「じゃあ来るな」はナシよ。

90 名前:名無しさん@お腹いっぱい。 mailto:sage [02/01/08 23:30]
>>89
馴れろ

91 名前:KoRoN@Vim%Chalice ◆ALICEsdk mailto:koron@tka.att.ne.jp [02/01/08 23:56]
>>88 変数の有無のチェックにexists()を使う方法もあります。

>>89
確かにVimとは、Vimスクリプトとはなんぞや、
とかいうリンクは出てなかったかもしれませんね。
まとめてくれると嬉しいかも。

92 名前:1 mailto:sage [02/01/09 01:41]
>>89
漏れもわけわからんで(w
ま、とりあえず>>2からやってみよう。
踏み出せばその一足が道となり・・・(略

>>91
ナルホド。a:0 >= 2 と書くより、場合によっては
読み易さを考慮(?)して exists("a:2") と書く方法もありと。

93 名前:名無しさん@お腹いっぱい。 mailto:sage [02/01/09 02:04]
コメントの書き方って説明がまだ出てきてないみたいなんですけど
" で始まる行がそうなんでしょうか?

94 名前:KoRoN@Vim%Chalice ◆ALICEsdk mailto:koron@tka.att.ne.jp [02/01/09 11:06]
>>93 お察しのとおりです。

95 名前:68 mailto:sage [02/01/09 18:41]
>>68です。
やっとhjklに拒絶反応が出なくなりました。先は、、長いですね、、(●´ω`●)



96 名前:名無しさん@お腹いっぱい。 [02/01/09 22:17]
勉強age

97 名前:1 [02/01/10 01:05]
foo.vim解読の続き。

カーソル位置移動と画面上の表示開始行をセットする
コマンド文字列を取得するスクリプト。
ma 〜 `a に似てるけどちょっと違う。

fun! Mark(...)
 if a:0 == 0
  let mark = line(".") . "G" . virtcol(".") . "|"
  normal! H
  let mark = "normal!" . line(".") . "Gzt" . mark
  execute mark
  return mark
 elseif a:0 == 1
  return "normal!" . a:1 . "G1|"
 else
  return "normal!" . a:1 . "G" . a:2 . "|"
 endif
endfun

line('.')はカーソル行。virtcol('.')はカーソル桁。
G は指定行移動。| は指定桁移動。

引数なしで呼んでみると、
:echo Mark()
normal!20Gzt30G8|
このコマンド文字列を変数に保存しといて後で実行させれば元の位置に戻るという仕組みか。

20G は20行目にジャンプ。zt はその行を画面上での先頭に移動。
これで画面上での表示開始行がセットされる。
30G8| は 30行 8桁目に移動と。

引数1つの場合は指定された行番号でコマンド文字列を作る。
:echo Mark(100)
normal!100G1|

引数2つの場合は指定された行と桁でコマンド文字列を作ると。
:echo Mark(100,30)
normal!100G30|

実際に使う場合こんな感じ。
:let a = Mark()
:exe a

98 名前:名無しさん@お腹いっぱい。 mailto:age [02/01/11 00:11]
age

99 名前:1 [02/01/11 00:40]
Mark() の続きで取得したコマンド文字列から、
行または桁を取り出すスクリプトの解読。

" 行取得
fun! Line(mark)
 if a:mark =~ '\dG\d\+|$'
  return substitute(a:mark, '.\{-}\(\d\+\)G\d\+|$', '\1', "")
 else
  return line(a:mark)
 endif
endfun

" 桁取得
fun! Virtcol(mark)
 if a:mark =~ '\d\+G\d\+|$'
  return substitute(a:mark, '.*G\(\d\+\)|$', '\1', "")
 else
  return col(a:mark)
 endif
endfun

引数が 数字G数字| というフォーマットなら、、
Mark() で作ったコマンド文字列と見なして、
それ以外なら通常の関数に引数を渡す仕組み。

正規表現の初めて見る \{-} は最短一致する * らしい。
けど、どうして * を使うとまずかったのか、などということは深く考えない。

実際に試してみると、
:echo Line("normal!10Gzt20G30|") Virtcol("normal!10Gzt20G30|")
20 30

line() または col() としても機能する。
:echo Line(".") Virtcol(".")
31 23

ん?なんで Virtcol() のなかで呼ばれているのが、
virtcol() じゃなくて col() なんだろ? ま、いいか。

100 名前:KoRoN@Vim%Chalice ◆ALICEsdk mailto:koron@tka.att.ne.jp [02/01/11 13:49]
「100ゲット!!」 だけじゃあんまりだから、ちょっとマメ知識を。

vimスクリプトで1行が長くなってしまった時に、改行を入れて先頭を \ にすると次
行に繋がっていると見なされる。C言語の行末の \ と一緒。
# なおvimスクリプトでは \ の直前の空白は無視されるのでインデント可能

ここまでは一般常識。ここからが本題。実は'cpoptions'に"C"フラグが含まれていな
い時には、この \ が使えずエラーとなる。なので一般に公開したいスクリプトを書
くときには \ による行連結は使わないほうが良いかも。
# それともスクリプトごとに避ける設定があるのかしら?

101 名前:1 [02/01/12 02:24]
foo.vim解読の為の予習。
偶然Vim6スレでも話題になっている行範囲を、
関数側で受け取るテスト。

関数名定義の最後に range と書くだけで行範囲を、
a:firstline と a:lastline で参照出来るようになるらしい。

さっそく受け取った範囲を表示する関数を作ってみる。
fun! RangeCheck() range
 echo a:firstline a:lastline
endfun

そのままつかうと現在の行だけが対象
:call RangeCheck()
10 10

範囲指定すると、ちゃんと範囲が受けとれている
:3,7call RangeCheck()
3 7

全体行でも大丈夫。% は 1,$ と同等
:%call RangeCheck()
1 10

>>100
どもっ、でもなぜかCフラグが無いのに、
\が使えたので調べてたらCフラグの意味が逆??
それにしても options.txt すんげぇサイズ。
翻訳してくれてる人、大変だろうなぁ。

102 名前:KoRoN@Vim%Chalice ◆ALICEsdk mailto:koron@tka.att.ne.jp [02/01/12 03:16]
>>101
あ、逆でした。>>100は'cpoptions'に"C"が含まれる時には行頭の \ が連結の意味に
ならない、といので正しいです。

103 名前:mattn@Vim%Chalice mailto:sage [02/01/12 19:32]
>>74
> resolve()    ショートカット先を探す(MS-Win)
あれ〜・・・
bram氏、docの変更忘れてんのかなぁ・・・(^^;)
unix系はシンボリックリンクを解析するよう変更したはずのに・・・
と言っても訳は間違ってないのでsage

104 名前:1 [02/01/12 23:16]
foo.vim解読の続き。
現在の文書から引数で指定した単語を最後の行に出力するスクリプト。
:%call Pippo('\\\a\+') とやって LaTex での辞書を作る為の単語を収集するのに使うらしい。
(LaTex使ったこと無いからよくわからんけど)

fun! Pippo(...) range
 if a:0
  let pat = a:1
 else
  let pat = '\<pippo\d\+\>'
 endif
 let bot = line("$")
 execute a:firstline . "," . a:lastline . 'g/' . pat . '/copy $'
 if bot == line("$")
  return
 endif
 execute (bot+1) . ',$s/' . pat . '/&\r/ge'
 execute (bot+1) . ',$v/' . pat . '/d'
 execute (bot+1) . ',$s/.\{-}\(' . pat . '\)$/\1/e'
endfun

選択したテキストがこれ。先頭のは :set nu で表示した行番号。

10 pippo1 aaa pippo2 bbb
11 pippo3
12 ccc

そこで :10,12call Pippo() を実行すると :10,12g/\<pippo\d\+\>/copy $ が呼ばれ
て、10〜12行目でpippoの後に数値がある単語が含まれる行を最後の行にコピーすると
いう意味だから、最後の行が50だとこうなる。

50
51 pippo1 aaa pippo2 bbb
52 pippo3

copy はノーマルコマンドの p 同じような機能らしいから次行からペーストされる。
:51.$s/\<pippo\d\+\>/&\r/ge が実行される。& は検索文字列。\r は改行だから検索
文字列の直後に改行入る。

51 pippo1
52 aaa pippo2
53 bbb
54 pippo3

次に :51,$v/\<pippo\d\+\>/d の実行。v は検索されなかった行を返す。d は :delete
の事だから、

51 pippo1
52 aaa pippo2
53 pippo3

次に :51,$s/.\{-}\(\<pippo\d\+\>\)$/\1/e は pippo数値 の単語だけを残すから、

51 pippo1
52 pippo2
53 pippo3

になると。ふぅ勉強になった。

105 名前:1 mailto:sage [02/01/12 23:29]
copy 命令に感動したのでちょっと練習。

■20〜30行目を100行目にコピーするには?
:20,30copy 100

■カレント行を2重化するには?(:normal Yp と同じ)
:copy .

■全体行をを2重化するには?
:%copy $

■上の3つを短く書くと?
:20,30co100
:co.
:%co$

copy の仲間で move というのもあってこれがまた凄い。
コピーじゃなくて移動しちまう。

■20〜30行目を100行目に移動するには?
:20,30move 100

そんなところ。



106 名前:名無しさん@お腹いっぱい。 mailto:sage [02/01/13 01:45]
This script is intended to provide an easy and quick way of sending e-mail messages from within vim
vim.sourceforge.net/scripts/script.php?script_id=179

107 名前:名無しさん@お腹いっぱい。 mailto:age [02/01/13 02:11]
age

108 名前:1 [02/01/13 23:28]
>>106のViMail.vimを使ってみようとしたけど、
sendmail使っててCygwinだと無くて動かないようだから
練習でblatjに変えてみた。

BlatJ
www.piedey.co.jp/softs/blat182bj7.html

103,106c103,107
< let s:cmd = "cat " . s:tempfile
< let s:cmd = s:cmd . "\| sendmail -- " . s:to . " 2>&1"
< let s:error = system(s:cmd)
<
---
> let smtp_server = 'xxxx' " SMTPサーバー名を指定
> let mail_address = substitute(s:sender, '.*<\(.*\)>.*', '\1', '')
> call system('blatj -install ' . smtp_server . ' ' . mail_address)
> let s:error = system('blatj ' . s:tempfile . ' -t ' . s:to . ' -s ' . s:subject . ' -q')
>
123a125
>

109 名前:1 [02/01/14 00:31]
foo.vim解読の続き。

ALT+4 で行の最後の空白以外にカーソルを移動する方法
:map <M-4> 0:let@9=@/<Bar>set nohls<CR>/.*\S/e<CR>:let @/=@9<Bar>set hls<CR>

読みにくいのでバラしてみると下のようになる

0
:let @9=@/
:set nohls
/.*\S/e
:let @/=@9
:set hls

0 は行頭に移動。:let @9=@/ 〜 :let @/=@9 はレジスタ / を 9 に保存して復帰。
:set nohls 〜 :set hls は検索文字列ハイライトを一時的に無効化。
で残ったのが /.*\S/e でこれが最後の空白以外に飛ぶ処理をやっていると。
ちなみに /e をつけないとなぜか次の行にカーソルが飛ぶ。

110 名前:1 [02/01/14 21:56]
foo.vim解読続き。

>>109の別の方法
map <M-4> :call LastNonBlank()<CR>
fun! LastNonBlank()
 let i = matchend(getline("."), '.*\S')-1
 if i > 0
  execute "normal!0" . i . "l"
 elseif i == 0
  execute "normal!0"
 endif
endfun

現在行で .*\S で最後にヒットする位置を取得して最初に 0 で行頭に移動してからそ
の位置へ l で移動する。最初に 0 しないで | で直接指定カラムに飛べば if else は
必要無くなるような気がする。

111 名前:1 [02/01/15 23:22]
foo.vim解読の続き。
ちなみにfoo.vimとはこれのことです。
vim.sourceforge.net/scripts/script.php?script_id=72

キーワードからパターンを剥いでタグにジャンプするスクリプト

例えば、
nmap <C-]> :call StripTag("Hello")<CR>
と定義しておくと HelloWorld という単語の上で C-] した時、HelloWorld の Hello
の部分が削除されて残った World でタグジャンプしてくれる!
・・・これがどんな時に役に立つのかよくわからないけど。

nmap <C-]> :call StripTag("xxx")<CR>
fun! StripTag(pattern)
 let keyword = expand("<cword>")
 if keyword =~ '^' . a:pattern
  execute "tag!" . substitute(keyword, a:pattern, "", "")
 else
  execute "normal! \<C-]>"
 end
endfun

expand("<cword>") はカーソル位置の単語(キーワード)を返す。
指定パターンがキーワードの先頭からヒットしたらヒットした部分を消してタグジャンプ。
autowrite オプションを有効にしておくと tag 実行時に自動的にカレントのファイル
が保存されるけど、tag! にすると保存されない。
パターンがヒットしなかったら通常の <C-]> を呼ぶと。

112 名前:1 [02/01/17 08:28]
foo.vimの続き
拡張子が jsp のファイルを編集中 <scr と入力した瞬間に、

<script language="JavaScript">
function foo() {
 alert("Hello, world.");
}
</script>

↑ここまでふくれあがるスクリプト。

augroup Foo
autocmd BufEnter *.jsp imap r r<Esc>:call JS_template()<CR>a
autocmd BufLeave *.jsp iunmap r
augroup END

fun! JS_template()
if getline(".") !~ '<scr$'
return
endif
s/scr$/script language="JavaScript">/
append
function foo() {
alert("Hello, world.");
}
</script>
.
endfun

>>61にも登場した書き方で、*.jsp のバッファに入った時に、r を再定義してバッファ
から抜けたら解除。Ver6.0からはバッファローカルで設定出来るからいちいち入った
時、出たときって書かなくてよいらしい(>>63より)
append は次の行から . だけを含んだ行の前までを入力する。

これはCのコメント生成とかにも使えるかな。

113 名前:1 [02/01/17 22:45]
foo.vim続き。

C++ソースで << を次の行に続けて書いてると、

cout  << "Hello"
    << "World"
    << endl;

こんな風に << のカラムを一つ上の行に合わせて、
自動的にそろえていってくれるスクリプト。

augroup Foo
 autocmd BufEnter *.cpp imap < <<C-O>:call LineUpLT()<CR>
 autocmd BufLeave *.cpp iunmap <
augroup END

fun! LineUpLT()
 " 1行目や、<< だけを入力してない行ならなんもせん
 if line(".") == 1 || getline(".") !~ '^\s*<<$'
  return
 endif
 " 一つ上の行を取得して << が始まる位置を取得
 let newline = getline(line(".")-1)
 let col = match(newline, "<<")
 if col != -1
  " 上の行に << があったら << が始まる前までを取得して、全てスペースに置換し
  " て << を付け加える。
  let newline = strpart(newline, 0, col)
  let newline = substitute(newline, '\S', " ", "g") . "<<"
  " それをカレント行にセットしてカーソルを最後に移動
  call setline(line("."), newline)
  normal!$
 endif
endfun

114 名前:KoRoN@Vim%Chalice ◆ALICEsdk mailto:koron@tka.att.ne.jp [02/01/17 23:26]
まっつんさんのcalender.vim、次のように設定すると日本語暦。
 vim.sourceforge.net/scripts/script.php?script_id=52
 
 let g:calendar_mruler = '睦月,如月,弥生,卯月,皐月,水無月,文月,葉月,長月,神無月,霜月,師走'
 let g:calendar_wruler = '日 月 火 水 木 金 土'
これに加えて「平成14年」とか「皇紀2662年」
とかいう表記ができたらまさにパーフェクト(苦笑)

115 名前:名無しさん@お腹いっぱい。 mailto:sage [02/01/17 23:54]
それだったら縦書きとか
るせま読に左らか右
とかも出来るようにしないと。



116 名前:名無しさん@お腹いっぱい。 mailto:sage [02/01/18 00:29]
きれいなカレンダーにびっくり

117 名前:KoRoN@Vim%Chalice mailto:sage [02/01/18 14:24]
>>115
rightleft時にMBを正しく捌けるようにするか(苦笑)

118 名前:1 [02/01/18 23:17]
foo.vim解読続き。
指定パターンにマッチする行数を得るスクリプト。

例) Helloを含む行はいくつある?
:echo Count("Hello")
10

fun! Count(pat)
 let num = 0
 execute 'g/' . a:pat . '/let num = num + 1'
 return num
endfun

numを0で定義して g/ で検索したパターンが出現するたびに
num をインクリメントしてそれを返すと。

# calendar.vim使ってます。

119 名前:1 [02/01/20 21:40]
foo.vim解読の続き。
ハイライト設定一覧を新しいウィンドウでハイライト付きで確認出来るスクリプト。

fun! ShowHi()
 " a に hi の内容を取得
 let save_more = &more
 set nomore
 redir @a
 hi
 redir END
 let &more = save_more

 " 新しいウィンドウでハイライト設定
 new
 put a
 v/\h/d
 %s/.\{-}\(\h\w*\).*/syn keyword \1 \1/
 %y a
 @a
endfun

hi はハイライト設定一覧を表示する。その時、画面が一杯になると表示が止まってし
まうので more オプションを一旦保存して nomore に設定しておく。redir @a は、コ
マンドの出力がレジスタ a にも入るようにする。だから hi の表示結果が a にも入
る。redir END でリダイレクトを停止。

次に new で新しいウィンドウを開いて a に入っている hi の結果をペースト。v/ の
部分は、単語の先頭が [A-Za-z] で始まらない行を削除。%s の部分は、ハイライト設
定をハイライト設定名自身に反映させるコマンドとなるように置換。例えば :syn
keyword Visual save_more とするとsave_more の部分が選択範囲用の色になるみた
い。%y a は全体をレジスタ a に入れる。ノーマルコマンドで ggVG"ay という方法も
あるけど、%y a の方がずっと読みやすいな。で、コマンドとして @a を実行すると、
なんとレジスタ a の中のコマンドが一気に実行されてハイライトが反映される仕組み。

120 名前:名無しさん@お腹いっぱい。 mailto:sage [02/01/21 03:04]
>1
お疲れ様です。
# ちょっと前に、ハイライト表示の定義をしようとして出来なかったのですが
# もう一回チャレンジしようかな?

121 名前:mattn@Vim%Chalice mailto:sage [02/01/21 09:54]
>>118
> # calendar.vim使ってます。

どもです。
でも、実は使おうとおもって作ったわけじゃないんです。(^^;)
単に、cal を中呼びしてるスクリプトを見つけて、
「これならスクリプトだけでかける」と思ったのと
M-x calendar
があるなら
:Calendar
もあっていいかなと思って作り始めたのが、きっかけです。

122 名前:1 [02/01/21 21:09]
foo.vim解読の続き。
指定関数の内容を新しいウィンドウで見るスクリプト。

fun! EditFun(name)
 " 指定関数の中身をレジスタ a に取得
 let save_more = &more
 set nomore
 redir @a
 execute "function " . a:name
 redir END
 let &more = save_more

 " 新しいウィンドウに a をペーストして vim 用のハイライト設定
 execute "sp " . tempname()
 put a
 set ft=vim
endfun

前のスクリプトと似てるからあんまり書くことないけど、:function EditFun とすると
EditFun の内容が表示されて set ft=vim でvim用のハイライト設定になると。

>>120
漏れもハイライト定義の方法はまだよくわかってないです。
foo.vimが終わったら覚えようかな。

>>121
へー、なんかEmacsに対抗して作ってるのかなとは思ってましたが(w

123 名前:mattn@Vim%Chalice mailto:sage [02/01/22 12:25]
>>122
> ... なんかEmacsに対抗して作ってる ...
って言いつつも
emacs21 + navi2ch
xyzzy + 2ch-mode

が何時でも準備OKな状態だったりします。(w

124 名前:1 [02/01/22 19:58]
foo.vim解読の続き。
ユーザーが独自に定義したモードラインを取得するスクリプト

fun! GetModelines(pat, ...)
 " start と finish に範囲を求める
 let EOF = line("$")
 if a:0 > 1
  let start = a:1
  let finish = a:2
 elseif 0
  if a:1 > 0
   let start = 1
   let finish = a:1
  else
   let start = EOF + a:1 + 1
   let finish = EOF
  endif
 endif
 if !exists("start") || start < 1
  let start = 1
 endif
 if !exists("finish") || finish > EOF
  let finish = EOF
 endif

 " モードラインの行を n に取得
 let n = 0
 silent execute start . "," . finish
  \ 'g/' . escape(a:pat, "/") . "/let n=line('.')"

 " モードラインが見つかったら指定したパターンで置換
 if n
  execute "normal!<C-O>"
  return substitute(getline(n), '.\{-}\(' . a:pat . '\).*', n.':\2', '')
 else
  echo
  return "0:"
 endif
endfun

これよくわかんねーな。
とりあえず前半は臨機応変な範囲指定に対応する処理
GetModelines(pattern, 100)   ・・・先頭から100行まで
GetModelines(pattern, -100)  ・・・最後の100行
GetModelines(pattern, 50, 80) ・・・50行目から80行目まで
GetModelines(pattern)      ・・・全体行

んで、30行目に /* foo: bar=78 */ と書いておいて下のを実行すると、

:echo GetModelines('/\*\s*foo:\s*\(.\{-}\)\s*\*/')
30:bar=78

モードラインは g/ で検索されているから、その後の "normal!<C-O>" でモードライン
にジャンプすると。でも、30:bar=78 を受け取ってどうすりゃいいのだろう。
30はいらないとして、bar=78 ってのを独自のオプションとして取り込めばいいのかなぁ。

125 名前:ヘッポコ訳者 ◆xBY/hgW2 mailto:sage [02/01/23 02:44]
41.7 関数定義

Vim では独自の関数も定義出来るぞ.基本的には関数定義はこんな感じでやれば良し.

:function {name}({var1}, {var2}, ...)
: {body}
:endfunction

注意: 関数名は大文字で始めるべし.

とりあえず二つの値の小さい方を返す関数でも定義してみっぺかね.とりあえず最初の行は,

:function Min(num1, num2)

で,これは Vim に関数名が "Min" で,引数を"num1" と "num2" の二つ取るっ
てことを宣言しとるっぺよ.

まず最初はどっちが小さいかチェックせにゃいかんから,

: if a:num1 < a:num2

と."a:" っつー接頭辞は Vim にこの変数が関数の引数だって事を宣言しと
るだけぢゃ.んで,"smaller"という変数に,小さい方の数字を代入すれば OK
ね,と.

: if a:num1 < a:num2
: let smaller = a:num1
: else
: let smaller = a:num2
: endif

で,"smaller" って変数はローカル変数になるぞ.関数内で使われる変数は,
"g:"とか "a:", "s:" とかって接頭辞が付かない場合はローカル変数になる
からな.

注意:
グローバル変数に関数内からアクセスする場合は "g:" って接頭辞を付ける
べし.つまり,"g:count" を関数内から使うと,グローバル変数の "count" だ
し,普通に "count" ってやったら,それとは別の関数ローカルの変数になるっ
てわけよ.




126 名前:ヘッポコ訳者 ◆xBY/hgW2 mailto:滅入り苦しみます!! [02/01/23 02:44]

んで, ":return" 文を使って小さい方の値をユーザに返しましょーかね.
最終的にはこの関数は

: return smaller
:endfunction

ってな感じで終了するわけだ.まぁ完全な形で書くとこんな感じになるべさ.

:function Min(num1, num2)
: if a:num1 < a:num2
: let smaller = a:num1
: else
: let smaller = a:num2
: endif
: return smaller
:endfunction

ユーザ定義関数はビルトイン関数と同じように呼べるぞ.名前だけは違うけど.
だから,Min 関数はこんな感じで呼べるわけよ.

:echo Min(5, 8)

って.
>Only now will the function be executed and the lines be interpreted by Vim.
 何言ってるんだ?ココは.分からん(鬱
もし未定義の関数や変数使ってたり,なんか間違いがあったらエラーメッセー
ジが表示されるぞ.関数定義の時点ではエラーは検出されないんだよねー.

もし関数が ":endfunction" まで到達しちゃったり, ":return" が引数無しで
呼ばれたりしてたら関数はゼロを返すぞ.

既にある関数を再定義する場合は ":function" コマンドに ! を使えばいい.
つまり,

:function! Min(num1, num2, num3)

って事ね.


127 名前:ヘッポコ訳者 ◆xBY/hgW2 mailto:age [02/01/23 02:46]
ふぅ,お久しぶりでヤンス.
最近忙しいでヤンスよ.
まぁ暇が出来たらまたちょくちょくやるっす.
そんぢゃ.

128 名前:mattn@Vim%Chalice mailto:sage [02/01/23 17:53]
お遊びスクリプト・・・

if has('win32') && ($OSTYPE=='cygwin' || $TERM=='cygwin')
let cygwin_root = "c:\\cygwin"
let iargs = 0
let nargs = argc()
while iargs < nargs
let varg = argv(iargs)
if varg =~ '^/cygdrive/'
let varg = substitute(varg,'^/cygdrive/\(\a\)/\(.*\)','\1:/\2','g')
elseif varg =~ '^/'
let varg = cygwin_root.varg
endif
let varg = substitute(varg,'/','\\','g')
exec "argadd ".varg
let iargs = iargs + 1
exec "argdelete ".iargs
endwhile

let iargs = 0
while iargs < argc()
silent argdo! rewind
let iargs = iargs + 1
endwhile
unlet iargs
unlet nargs
unlet varg
unlet cygwin_root
endif

129 名前:1 [02/01/23 20:43]
Cygwin形式のパスをDOS形式に変換するスクリプトですかー
とりあえず、
argadd - 引数リストにファイル追加
argdelete - 引数リストからファイルを削除
argdo! - 引数の全てのファイル対してコマンドを実行
を覚えました。
これらって5.7のマニュアルには見つからなかったから最近のコマンドかな。

130 名前:KoRoN@Vim%Chalice ◆ALICEsdk mailto:sage [02/01/23 20:56]
余談ですけど、最近のCygwinってDOS形式(但しディレクトリセパレータは/)のパスを
受け付けますよね。おかげで'shellslash'との親和性がスゴク良い。
 % ls d:/HOME/vim/vim60
とか出来ますから。

>>129 そうですね。6.0の新機能です。
 :help new-argument-list

131 名前:1 mailto:sage [02/01/23 22:24]
>>43のAllargs関数を見つけた時はずいぶん喜んでたんだけど、
既にそれに代わるargdoってのがあったのかぁ。

それはいいとしてversion6.txt読んでたら gi って新コマンドを発見。
前回入力し終えた所にジャンプして i してくれる。これは(・∀・)イイ!!

132 名前:名無しさん@お腹いっぱい。 mailto:sage [02/01/24 01:19]
関係無いかもしれんけど
cygwinで cygpath っちゅうコマンドも便利だよ。
# 外出か?

133 名前:1 mailto:sage [02/01/25 02:15]
糞みたいな残業強制させられて今タクシーで帰宅。
これじゃお勉強する暇ねーよ。あーあ。

134 名前:KoRoN@Vim%Chalice ◆ALICEsdk mailto:sage [02/01/25 10:37]
>>133 お疲れさんです(^-^;

135 名前:1 [02/01/26 22:43]
foo.vim解読の続き。
入力モードの時に F7 で独自に指定したタブを挿入するスクリプト。

imap <F7> <C-R>=VarTab(virtcol("."),8,17,26,35)<CR>
fun! VarTab(c, ...)
 " 最初のタブ位置を探す
 let i = 1
 while i <= a:0
  execute "let num_sp = -a:c + a:" . i
  if num_sp > 0
   break
  endif
  let i = i + 1
 endwhile
 if i > a:0
  return ""
 endif
 " スペースを挿入する
 let spaces = " "
 let len = 1
 while len < num_sp
  let spaces = spaces . spaces
  let len = len + len
 endwhile
 return strpart(spaces, 0, num_sp)
endfun

可変長引数の部分でタブストップするカラム 8,17,26,35 が指定されている。
最初のタブを探す部分は定石として覚えとこ。
strpart() は spaces のインデックス 0 から num_sp 個分を返す関数。
上の場合 spaces の全体を返すから使う必要ない気もするけど。
そんだけ。



136 名前:名無しさん@お腹いっぱい。 [02/01/27 04:17]
これvimスクリプトかどうか分かんないんだけどステータスラインに
文字コードとか改行コードを表示させるって出来る?
もしかして、関数つくって呼ぶとかそんな方法ですか?
つか、自分で調べろって?・・・スマソ。

137 名前:1 [02/01/27 11:16]
>>136
set statusline=%<%f%h%m%r%=%b\ 0x%B\ \ %l,%c%V\ %P
↑これでできた(:help statusline より)

お勉強スレなので解説付き

重要なカレントの文字コードは %b と %B で解る
%b - 10進数
%B - 16進数

他のは
%f - ファイル名
%h - ヘルプを見ている時だけ[ヘルプ]になる
%m - nomodifiable の時 [-] になる
%r - readonly の時に [RO] になる
%l - 行番号
%c - カラム値
%V - 選択部分のライン番号。カラム値と同じ場合は表示されない? (再現できず)
%P - ページの位置らしい 先頭 or 末尾

んで表示制御が、
%< - 1行に入りきらなかった時にこの位置から表示する?? (再現できず)
%= - これ以降を右側に表示
あとスペースは \ でエスケープ

138 名前:136 [02/01/27 13:09]
>>137

いやそうじゃなくて
文字コード = euc-jp, sjis, jis, utf8
改行コード = CRLF, LF, CR
を言いたかったのです・・・。
説明の仕方が悪かったですかね・・・。

139 名前:ヘッポコ訳者 ◆xBY/hgW2 mailto:sage [02/01/27 13:25]
>136
function! GetStatusEx()
let str = ''
let str = str . '[' . &fileformat . ']'
if has('multi_byte') && &fileencoding != ''
let str = str . '[' . &fileencoding . ']'
endif
return str
endfunction
set statusline=%n:\ %<%f%y\ %m%r%h%w%{GetStatusEx()}\ %l,%c\ %P

確かコレ KoRoN 殿に教わったんだと思ったけど,こんな感じでどーよ?
ゴチャゴチャ付いてるのはヲレのヤツそのまんまだからっつーことで御免

翻訳しなくっちゃなー

140 名前:1 [02/01/28 22:51]
foo.vim解読の続き。
HTMLファイル編集中にバックスペース一発で   とかを一気に消すスクリプト。

augroup Foo
 autocmd BufEnter *.html,*.htm inoremap <BS> x<Esc>:call SmartBs('&[^ \t;]*;')<CR>a<BS><BS>
 autocmd BufLeave *.html,*.htm iunmap <BS>
augroup END

fun! SmartBs(pat)
 let init = strpart(getline("."), 0, col(".")-1)
 let len = strlen(matchstr(init, a:pat . "$")) - 1
 if len > 0
  execute "normal!" . len . "X"
 endif
endfun

カレント行のカーソル位置より前の文字列を init に取得。
その文字列の最後に   みたいな文字列があればその文字数を len に取得。
  みたいな文字列が無ければ matchstr は "" を返し、len は 0 になる。
だから len > 0 の時、その数だけバックスペースすれば   が消える仕組みらしい。

141 名前:1 mailto:sage [02/01/28 22:55]
ありゃりゃ消えとるがな。 &nbsp の事です。

142 名前:名無しさん [02/01/29 00:41]
Buf* の訳というか説明があるとイイナって思った。

BufNewとBufNewFileの違いが分からんし。

143 名前:ヘッポコ訳者 ◆xBY/hgW2 [02/01/29 00:45]
>142
さぁ,言い出しっぺの法則ぢゃ!!ガムバレ(・∀・)!!!
# ヲレ今風邪で寝込んどる.スマソ

144 名前:142 [02/01/29 00:48]
ウワー。
マジ勘弁。英語できないし。
誰かにパス。なんていうのはアマい(・∀・)?

145 名前:ヘッポコ訳者 ◆xBY/hgW2 mailto:sage [02/01/29 01:03]
>142
しゃーないのぅ autocmd.txt を見ると,

BufNewFile:
 存在しないファイルの変数を始めた時.
 スケルトンからの読み込み時でも使われる.

BufNew:
 新しいバッファを作成した直後.
 バッファ名をリネームした時にも使われる.
 バッファがバッファリストに追加された時は BufAdd も
 実行されるぞ.
 注::この autocommand が実行された時はカレントバッファ"%"
 はその時作成されようとしてる"<afile>" とは違うよん

とりあえず上記二つはこんな感じかな



146 名前:1 [02/01/29 23:40]
foo.vim解読続き。
sed の y コマンドを実現するスクリプト

使い方(aをxにbをyにcをzに置換するには?)
:Transform abc xyz    (カレント行を対象)
:%Transform abc xyz   (全体行を対象)

素直にsedを使うと?
:.!sed 'y/abc/xyz/'
:%!sed 'y/abc/xyz/'

command! -nargs=* -range Transform <line1>,<line2> call Transform(<f-args>)
fun! Transform(old, new, ...)
 if a:0
  let string = a:1
 else
  let string = getline(".")
 endif
 let i = 0
 while i < strlen(a:old) && i < strlen(a:new)
  execute "let string=substitute(string, '".a:old[i]."','".a:new[i]."','g')"
  let i = i + 1
 endwhile
 if a:0
  return string
 else
  call setline(".", string)
 endif
endfun

-range を付けているから <line1> と <line2> が有効に。
<f-args> は空白で区切った引数が自動的に , 区切りになって関数へ渡される。
だから :Transform abc xyz は Transform("abc", "xyz") となって関数が呼ばれる。
んで↓のように一文字ずつ対応するように置換されていく。
 let string=substitute(string, 'a', 'x', 'g')
 let string=substitute(string, 'b', 'y', 'g')
 let string=substitute(string, 'c', 'z', 'g')
setline(".", string) はカレント行を string の内容にする。

あと第3引数があればカレント行よりそっちを優先するので別のスクリプトからも使い
まわせる。

:echo Transform("abc", "xyz", "aabbcc")
xxyyzz

147 名前:KoRoN@Vim%Chalice ◆ALICEsdk mailto:koron@tka.att.ne.jp [02/01/30 00:19]
>>146
便利そうなスクリプトなので日本語対応版を書いてみました。ちょっと圧縮バージョ
ンなので見難いかもしれないけどこれも勉強になるでしょう。
# 香り屋版には組み込むかも。

command! -nargs=* -range Transform <line1>,<line2>call Transform(<f-args>)
function! Transform(from_str, to_str, ...)
  if a:0 | let string = a:1 | else | let string = getline(".") | endif
  let from_str = a:from_str | let to_str = a:to_str
  while 1
    let from_char = matchstr(from_str, '^.')
    if from_char == '' | break | endif
    let to_char = matchstr(to_str, '^.')
    let from_str = strpart(from_str, strlen(from_char))
    let to_str = strpart(to_str, strlen(to_char))
    let string = substitute(string, from_char, to_char, 'g')
  endwhile
  if a:0 | return string | else | call setline(".", string) | endif
endfunction

148 名前:ヘッポコ訳者 ◆xBY/hgW2 mailto:sage [02/01/30 00:26]
<<<範囲(Range) を使う>>>

":call" コマンドには行範囲(line range) を指定する事も出来るよん.
This can have one of two meanings.
関数が "range" キーワードと一緒に定義されてたら,その関数は行範囲を扱う
んだな.
そーゆー関数は,"a:firstline" と "a:lastline" っつー二つの引数が渡さ
れる事になるぜぃ.この二つは関数が呼ばれた時に指定されてる行範囲の最
初と最後の行数でござるよ.

例:
:function Count_words() range
: let n = a:firstline
: let count = 0
: while n <= a:lastline
: let count = count + Wordcount(getline(n))
: endwhile
: echo "found " . count . " words"
:endfunction

この関数は,

:10,30call Count_words()

と,こんな感じで呼び出せる.
この場合関数は一回のみ実行されて,その行範囲に含まれてる単語数を出力するよん.
# 訳者注: Wordcount っつー関数は自前で作らんとダメっぽい.
# ついでに, while の中に let n = n+1 が要るような気もするんだが・・・

ちなみに"range" keyword 無しで定義した関数で行範囲を扱う事も出来て,
例:

:function Number()
: echo "line " . line(".") . " contains: " . getline(".")
:endfunction

これを

:10,15call Number()

って呼んでやると,この関数が 6 回呼ばれるよーになるのだ.

149 名前:ヘッポコ訳者 ◆xBY/hgW2 [02/01/30 00:27]
訳注のところってもしかして嘘書いてます?
getline は行数 n をインクリメントしたりしないですよねぇ…?
風邪引いてるんで今日はここまで


150 名前:KoRoN@Vim%Chalice ◆ALICEsdk mailto:sage [02/01/30 00:34]
>>149
試せばすぐわかりますがインクリメントはきっと必要でしょう。
# 丁度Transformもrangeの無い例になってて、タイムリーですなぁ

151 名前:名無しさん@お腹いっぱい。 mailto:sage [02/01/30 01:31]
>146
ご苦労様です。
>sed の y コマンドを実現するスクリプト
cygwin で man sed したんですが、s コマンドと y コマンドの違いがいまいちわからなかったです。
わかりやすく説明してるようなサイトなど教えていただけないでしょうか?
スレ違いでごめんなさい。



152 名前:ヘッポコ訳者 ◆xBY/hgW2 [02/01/30 01:43]
>KoRoN殿
ええ,一応試してはみたんですよ,ハイ(^^;
ただなんとなくちょっと自信が無かったので…

>151
日本語 man より

[2addr]y/string1/string2/
string1 に現れるパタンスペース中の文字を string2 の対応した文字に
置換する。たとえば、`y/abc/ABC/' はパタンスペース中の文字 a、b、c
を大文字に置換する。バックスラッシュと改行以外のすべての文字を区
切りとして用いることができる。 string1 、 stirng2 中では、`\' 直
後の改行以外の文字はリテラルに解釈され、`\n' は改行と解釈されま
す。

あぁ,コリャ分からんかもね.

つまり,s/sage/mona/ だと,'sage' が 'mona' に置換されるけど,
y/sage/mona' だと
s->m
a->o
g->n
e->a
ってな感じで置換される.分かるかな?これで.

例を挙げると,'sega' は s/sage/mona/ だと何も起こらんけど,
y/sage/mona/ だと 'mano' になるのよ.

153 名前:151 mailto:sage [02/01/30 02:04]
>152
ヘッポコ訳者さん、ありがとうございます。
試してみてわかりました。キャラクタ単位で複数の置換を一度にするって感じでしょうか?
風邪はやってますね。翻訳がんばってください。では


154 名前:1 [02/01/31 01:08]
foo.vim解読の続き。
指定パターンを検索してセレクトモードで囲むスクリプト

command! -nargs=1 Search call Search(<f-args>)
fun! Search(pat)
 execute "normal! /" . a:pat . "\<CR>"
 execute "normal! v//e+1\<CR>\<C-G>"
endfun

-nargs=1 だから 1 個の引数が必要。
:Search foo だと /foo が実行されて次の foo にジャンプする。
v//e+1 は v でビジュアルモードにして //e+1 で再び検索ジャンプする。
// という表記は間に前回の検索文字列が省略されているので /foo/e+1 の
意味になってカーソル位置の foo の最後の文字の次のカラムまでカーソル
移動する。最後にビジュアルモードを Ctrl+G でセレクトモードに変更。

/foo の後に v//e+1 やらならくても単に vel でいいんじゃないのかと
思ったけど、検索されるのは単語とは限らないから v//e+1 の方がいいのかな。

あと Ctrl+G のセレクトモードって初めて知ったけど単純にWindowsの選択と
同じように選択後に何か入力すると選択部分が消えるモードらしい。

155 名前:mattn@Vim%Chalice mailto:sage [02/01/31 19:45]
UNIXユーザへ送る条件演算子の応用
imap <silent> <c-\> <C-O>:let &iminsert=(&iminsert==2?0:2)<CR>



156 名前:1 [02/01/31 23:43]
foo.vim解読の続き。
挿入モード時に _foo_ のように入力すると FOO に変換されるスクリプト

:imap _ _<Esc>:call Capitalize()<CR>s
fun! Capitalize()
 if exists("b:Capitalize_flag")
  unlet b:Capitalize_flag
  normal! vF_Ux,
 else
  let b:Capitalize_flag = 1
  execute "normal! a_\<Esc>"
 endif
endfun

挿入モードで _ をタイプすると _ を挿入してノーマルモードにして Capitalize() が
呼ばれる。最初は b:Capitalize_flag は定義されていないので else 側の a_<ESC> が
実行されてもう一個 _ が入力される。そして Capitalize() を抜けて s で _ が
消えて挿入モードに戻る。 _ は入力しないで a で挿入モードに戻ればいいような気も
するけど。

んで _foo_ までタイプすると再び Capitalize() が呼ばれて b:Capitalize_flag はさっき
定義されたので if 側が実行される。vF_UX, はビジュアルモードにして foo の左側の
_にジャンプして全部大文字にして _ を消して右側の _ に移動するという意味。で、s
で右側の _ も消されて挿入モードに戻ると。 b: はバッファローカルという意味。

>>155
Ctrl+\ でIMEをトグルする方法っすね。

157 名前:1 [02/02/02 23:04]
foo.vim解読の続き。
カレントウィンドウをマウスの左クリックで切り替えた時に、
前のウィンドウの入力モードを保持するスクリプト。

inoremap <LeftMouse> <Esc>:let w:lastmode="Insert"<CR><LeftMouse>
 \ :if exists("w:lastmode") && w:lastmode=="Insert"<Bar>
 \ startinsert<Bar>endif<CR>

nnoremap <LeftMouse> <Esc>:let w:lastmode="Normal"<CR><LeftMouse>
 \ :if exists("w:lastmode") && w:lastmode=="Insert"<Bar>
 \ startinsert<Bar>endif<CR>

前者は挿入モードで左クリックされた場合でウィンドウローカルなユーザー変数
lastmode を "Insert" に設定。後者はノーマルモード時で "Normal" に設定する。ん
で左クリックでウィンドウに戻ってきた時、lastmode == "Insert" だったら、
startinsert にする。startinsert はスクリプトが終了した後に挿入モードになる命令
らしい。

おまけ。
nmap (マッピングあり) と nnoremap (マッピングなし) の違いをテスト。

↓マッピングありの場合 _a → _b → OKの表示
:nmap _a _b
:nmap _b :echo "OK"<CR>

↓マッピングなしの場合 _a → _b で何も起こらない
:nnoremap _a _b
:nmap _b :echo "OK"<CR>

これで foo.vim 解読は全部終わり。

158 名前:151 mailto:sage [02/02/03 01:29]
> 1さん
おつかれさまです。

159 名前:1 [02/02/05 01:38]
これこそVimの醍醐味!? シンタックスハイライト設定のお勉強その1
とりあえず独自の設定を作ってみる。

まず :set filetype=memo と設定した時には runtime/syntax/memo.vim というファイル
を vim は開こうとするようなので runtime/syntax/memo.vim を作ってみる。
中には↓これを書いてみる。

highlight MemoHead guifg=#00FFFF
syntax match MemoHead display "^■.*"

水色設定を MemoHead って名前にして正規表現 ^■.* にマッチする部分を
MemoHead の設定色にするという意味。
んで適当なファイルを開いて行頭から ■なんとか と書く。
んで :set filetype=memo を実行。「■なんとか」 の行が水色になったら成功と。

もうちょっと調べたいけど、もう寝ないとやべぇ。

160 名前:名無しさん@お腹いっぱい。 mailto:sage [02/02/06 00:23]
スクリプト実行してるとき例えば

exe "normal i\<C-D>"

ってなってると i_CTRL-D が実行されるけど、
これってユーザー毎に Mapping を変更していたら違う結果が返ってくるよね?
これを Mapping に依存せずに本来の動作をさせたいんだけど
どうすればよいの?

161 名前:160 [02/02/06 00:24]
sage が残ってた。
age

162 名前:KoRoN@Vim%Chalice ◆ALICEsdk mailto:koron@tka.att.ne.jp [02/02/06 00:27]
>>160
「!」を使ってこうします。
  :exe "normal! i\<C-D>"

163 名前:名無しさん@お腹いっぱい。 [02/02/06 00:41]
>>162
おお、ありがとう
テトリス落としてやってたんだけどなんか表示が変だなって思って調べてたら・・・

案外こういうのっていいかげんに思われてるんですかねえ。
まあこういう(どんな環境でも動作させようという)意識の差っていうのは個人差があるんでしょうけど。

164 名前:名無しさん@お腹いっぱい。 mailto:sage [02/02/06 00:46]
>163
テトリスって?検索したけどわからなかった。
vim でテトリス?

165 名前:160 mailto:sage [02/02/06 00:57]
vim.sourceforge.net/
の Recent Script Updates にあったんで試してみた



166 名前:名無しさん@お腹いっぱい。 mailto:sage [02/02/06 01:15]
ありがとう、おもしろい。
こんなこともできるんですね。

167 名前:名無しさん@お腹いっぱい。 [02/02/06 01:22]
> Source it! To start the game, press <Leader>te.

の <Leader> って何?

168 名前:名無しさん@お腹いっぱい。 mailto:sage [02/02/06 01:23]
:h <leader>

設定してなければ\らしい

169 名前:160 mailto:sage [02/02/06 01:24]
オレもよう分からんけどとりあえずノーマルモードで
\te
ってやったらできるぞ

170 名前:167 mailto:sage [02/02/06 01:46]
>168,169
thanx!

171 名前:名無しさん@お腹いっぱい。 [02/02/10 22:36]
emacsの〜-modeみたいに、新しい言語のモードを作ろうと思った場合、
vimではどうやるんですか?

172 名前:名無しさん@お腹いっぱい。 [02/02/10 23:02]
>>171
:help ftplugin
:help mysyntaxfile

173 名前:名無しさん@お腹いっぱい。 mailto:sage [02/02/12 18:59]
Tetrisに続いてSokobanなるゲームが(w まだ試してないけど。

174 名前:1 [02/02/12 23:00]
>>173
遊んでみました。
j と k のマッピングが逆になってたから直さないとやり辛いよ(w
Tetirsと違ってソースは解り易く書かれててうれしいね

175 名前:名無しさん@お腹いっぱい。 mailto:sage [02/02/13 19:17]
>>174
マッピングは明らかなミスですよね。まだアップデートされてないみたい
だけど。そんなことよりレベル1で258歩も歩いてしもた…。鬱打。



176 名前:名無しさん@お腹いっぱい。 [02/02/17 23:29]
age

177 名前:名無しさん@お腹いっぱい。 mailto:sage [02/02/18 00:42]
カーソル行のフォールドが開いてるか閉じてるかを調べる関数、乃至
変数なんて無いですよね。今後実装されるかは別として。
何で聞くかというと、それで困ってる人がいるんですよ。winmanagerの
作者さんなんだけど。

178 名前:KoRoN@Vim%Chalice ◆ALICEsdk mailto:koron@tka.att.ne.jp [02/02/18 00:49]
>>177
See :help foldclosed() and its families.

179 名前:177 mailto:sage [02/02/18 00:50]
スレ違いかな? ま、マルチポストは控えときます。

180 名前:177 mailto:sage [02/02/18 00:51]
>>178
うわ、見ずに投稿しちった。スマソ

181 名前:KoRoN@Vim%Chalice ◆ALICEsdk mailto:sage [02/02/18 01:09]
>>177 天気予報みたいだね

182 名前:177 mailto:sage [02/02/18 01:19]
>>178
改めて、有難うございます。言い訳ですが、作者さんは、foldlevel という
関数はご存知でしたし、ずいぶん長いこと悩んでる様だったので、
てっきり調べ尽くしてるものと思っちゃいました。あと、今yahooのvim-ml
のアーカイブを見たんですが、すでにそこで回答を得られてたようです。
二重に失礼。
# もっとヘルプ読もう。

183 名前:177 mailto:sage [02/02/18 01:21]
>>181
あ、今気付いた。なんか嬉しい。てか、また見ずに投稿(以下略

184 名前:KoRoN@Vim%Chalice ◆ALICEsdk mailto:sage [02/02/18 01:30]
>>183 (>177)
刑法177条は(以下略)。昔、そういうゲームも(以下略)

185 名前:177 mailto:sage [02/02/18 18:23]
>>184
> 刑法177条は
ガ━━(゚Д゚;)━━ン!せっかく気に入ってたのに…。
# 開き直ってコテハンにでもするか。



186 名前:名無しさん@お腹いっぱい。 [02/02/19 00:11]
Linux版のVIMの日本語判定をどうにかするスクリプト作って〜♥

187 名前:名無しさん@お腹いっぱい。 mailto:sage [02/02/19 00:33]
>>186
「どうにかする」は「無効にする」もしくは「決め打ちする」と
解釈してよろしいでしょうか?

188 名前:KoRoN@Vim%Chalice ◆ALICEsdk mailto:koron@tka.att.ne.jp [02/02/19 08:56]
>>185(177)
> # 開き直ってコテハンにでもするか。
漢を感じちゃった。カコ(・∀・)イイ!!

>>186
187の言う通り、どうして欲しいのかを具体的にハッキリさせてくれたら書く可能性
が高いです。というよりも、既に書いてある可能性も高いけど。

189 名前:名無しさん@お腹いっぱい。 [02/02/19 22:06]
>>186 >>187
正しく判定するようにして〜♥

190 名前:KoRoN@Vim%Chalice ◆ALICEsdk mailto:koron@tka.att.ne.jp [02/02/19 23:10]
>>188
私の環境では判定について特に問題はないので、
具体的にどういうときに誤判定するのか教えてくれないと
修正のしようがありません。

またeuc-jpの文がcp932の半角カナ文として認識されてしまうことがあるのは、
それは基本的には仕方のないことでしょう。

191 名前:名無しさん@お腹いっぱい。 [02/02/19 23:17]
Linux版だと確実にcp932とeuc-jpの判定に失敗する。
fileencodingsで先に書いてる方になっちゃう。

192 名前:名無しさん@お腹いっぱい。 mailto:sage [02/02/19 23:47]
テキストの最初の方の行に「焼肉定食」と入れておくと吉かも
漏れはそうしてる(藁

193 名前:KoRoN@Vim%Chalice ◆ALICEsdk mailto:koron@tka.att.ne.jp [02/02/20 02:14]
>>191
2つおかしい点が。
  1. encをeuc-jpにしている場合にはfencsにeuc-jpを含めるべきではない。
  2. 「確実に」は疑わしい。

「euc-jpのファイルをcp932として誤読することがある」というならば納得します。

194 名前:名無しさん@お腹いっぱい。 [02/02/23 00:46]

             ∩
                 | |
                 | |
                 | |
                 | |
        ∧_∧   | |   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
       ( ´Д`)/ /  < 先生!忙しいんですか?
      /      /     \________________
     / /|    /
  __| | .|    |
  \   ̄ ̄ ̄ ̄ ̄ ̄ ̄\
  ||\             \
  ||\|| ̄ ̄ ̄ ̄ ̄ ̄ ̄|| ̄
  ||  || ̄ ̄ ̄ ̄ ̄ ̄ ̄||
     .||              ||



195 名前:KoRoN@Vim%Chalice ◆ALICEsdk mailto:sage [02/02/23 03:09]
>>194
25日までは死ねます。



196 名前:名無しさん@お腹いっぱい。 [02/03/02 01:50]
空揚げ

197 名前:オコジョさん mailto:sage [02/03/02 02:32]
ん?カラアゲ?.....どこだ?


198 名前:名無しさん@お腹いっぱい。 mailto:sage [02/03/06 02:48]
ほとんど(全部に近い) KoRoN さんのおかげですが、現在行の URL を開くスクリプト。
chalice.vim から、OpenURL と DoExternalCommand を借りてくれば動くのでは?
win では動きました。

"
" 現在行に URL 文字列があるとき、それを取得しOpenURLへ渡す
" URL 文字列がない場合素の <CR> を実行
"
function! s:CheckURL()
 let url = matchstr(getline("."), '\([-#%&+,./0-9:;=?@A-Za-z_~]\+\)')
 if url != ''
  call <SID>OpenURL(url)
 else
  :exe "normal! \<CR>"
 endif
endfunction

"map 定義
nnoremap <silent> <buffer> <CR> :call <SID>CheckURL()<CR>

既にありそうですね。

199 名前:良スレ救済 [02/03/11 00:32]
age

200 名前:名無しさん@お腹いっぱい。 [02/03/16 21:24]
1さん & ヘッポコ訳者さん
降臨希望age

201 名前:名無しさん@お腹いっぱい。 [02/03/21 17:39]
保全age

202 名前:名無しさん@お腹いっぱい。 [02/03/22 00:38]
指定した単語の個数を数える関数ってないですか?
:g/pattern/let n=n+1
だと同じ行にふたつ以上あってもひとつとしか数えないので。

203 名前:Vim6スレからお引っ越し mailto:sage [02/03/23 01:19]
com! Test call <SID>VimTest()

let s:foo = 'foo'

fun! s:VimTest()
python << EOF
from vim import *

foo = eval('s:foo')
print foo

hoge = 'hoge'
buf = '"'+hoge+'"'
command('let s:test='+buf)

command('call s:Show()')

EOF
endfun

fun! s:Show()
    execute 'echo s:test'
endfun

こうすれば、変数を渡せました。
出来たのでまとめとしてここに書いておきます。
KoRoN さんありがとうございました。

204 名前:KoRoN@Vim%Chalice ◆ALICEsdk mailto:koron@tka.att.ne.jp [02/03/24 13:23]
最近、漫画「ヒカルの碁」の影響を受けて碁を始めたので(苦笑)、碁盤スクリプトを
作ってみました。
  www.kaoriya.net/dist/goban_vim-1.0.tar.bz2
:sourceして:GobanSplitで碁盤ができます。bで黒、wで白、xで石を消せます。誰か
棋譜を作成できるように拡張してみませんか?。

205 名前:名無しさん@お腹いっぱい。 [02/03/31 00:46]
age



206 名前:名無しさん@お腹いっぱい。 mailto:sage [02/03/31 14:46]
>>204
せっかくだから趙治勲を倒せるvim scriptきぼんぬ


207 名前:mattn@Vim%Chalice mailto:sage [02/04/10 09:15]
Calendarちとだけ機能追加...

let g:calendar_erafmt = '平成,-1988'
let g:calendar_mruler =
 \'睦月,如月,弥生,卯月,皐月,水無月'.
 \',文月,葉月,長月,神無月,霜月,師走'
let g:calendar_wruler = '日 月 火 水 木 金 土'



    平成14/4(卯月)
 日 月 火 水 木 金 土
     1  2  3  4  5  6
  7  8  9*10 11 12 13
 14 15 16 17 18 19 20
 21 22 23 24 25 26 27
 28 29 30                

こんな風になります。
これがいっぱい設定できれば

>>114
> これに加えて「平成14年」とか「皇紀2662年」
> とかいう表記ができたらまさにパーフェクト(苦笑)

パーフェクトへ一歩近づけますか?(笑)

208 名前:KoRoN@Vim%Chalice ◆ALICEsdk mailto:koron@tka.att.ne.jp [02/04/10 13:17]
>>207
let calendar_erafmt = '皇紀,660'
とかやってみました。最高です!

209 名前:名無しさん@お腹いっぱい。 mailto:sage [02/04/10 14:49]
('-`).oO○(ヒジュラ暦。。。

210 名前:名無しさん@お腹いっぱい。 [02/04/11 05:54]
以前ここで紹介されたテトリス、すごい人気になってますね。
vim.sourceforge.net/scripts/script.php?script_id=172

211 名前:名無しさん@お腹いっぱい。 [02/05/01 08:57]
保守上げ

212 名前:KoRoN@Vim%Chalice ◆ALICEsdk mailto:koron at tka.att.ne.jp [02/05/06 10:01]
ネタ出し。普通の人が考えるいわゆるアウトライン機能。
- outlineMode.vim
    URL: vim.sourceforge.net/scripts/script.php?script_id=287
    必要軟件: ctags
    必要設定: let Flist_Ctags_Cmd = 'ctags' " $PATHが通ってない時はフルパスで指定
    使用方法: Cのソースを開いて<F2>で起動。起動キーはFlist_Keyで設定可能
- funclist.vim
    URL: vim.sourceforge.net/scripts/script.php?script_id=273
    解説: 上記outlineMode.vimのベースになったスクリプトらしい。

213 名前:名無しさん@お腹いっぱい。 mailto:sage [02/05/06 11:33]
>>212 outlineMode.vim(・∀・)イイ!
関数の中にカーソルを置いてると勝手にその関数がハイライトされる…。はじめ
てCursorHoldなんてイベントを知りましたよ。

214 名前:名無しさん@お腹いっぱい。 [02/05/08 06:55]
KoRoNさんのAutodate.vimがアップされてる。
autodate.vim : Custumizable auto update time stamp tool
vim.sourceforge.net/scripts/script.php?script_id=291

215 名前:名無しさん@お腹いっぱい。 mailto:sage [02/05/08 11:18]
>>214 こっちより高機能だということは明瞭なんだけどね…。
vim.sourceforge.net/scripts/script.php?script_id=259

え、英語を添削させてくれーっ!!



216 名前:名無しさん@お腹いっぱい。 mailto:sage [02/05/08 11:21]
>>215
> え、英語を添削させてくれーっ!!
KoRoN氏、確かどっかで英語のドキュメンタリスト募集してたから
more than welcomeと思われ

217 名前:名無しさん@お腹いっぱい。 mailto:sage [02/05/08 12:49]
This plugin inserts and updates a time stamp automatically.

Users can specify a format and position of the time stamp by options.
By default, autodate.vim searches a keyword "Last Change: ."
in the first 50 lines of the buffer, and inserts a time stamp. Example:
Last Change: 07-May-2002.

添削に挑戦してみる。(>>215 さんじゃないけど)

誰か英語力のある人が、とくにマルチバイト関連のやり取りで、バリバリドキュメントを
書いてくれるとうれしいかも。

218 名前:名無しさん@お腹いっぱい。 mailto:sage [02/05/08 12:52]
追加。
autodate.vim の副題
>Custumizable auto update time stamp tool.
Customizable

219 名前:名無しさん@お腹いっぱい。 mailto:sage [02/05/08 13:32]
>>216
ここかな?
pc.2ch.net/test/read.cgi/unix/1019011083/165

220 名前:215 mailto:sage [02/05/08 14:00]
>>217-218 ここでやるのはどうかと。

221 名前:名無しさん@お腹いっぱい。 mailto:sage [02/05/08 16:16]
>>220
おっしゃるとおりでした。

222 名前:KoRoN@Vim%Chalice ◆ALICEsdk mailto:koron at tka.att.ne.jp [02/05/08 20:02]
>>214-221
ありがとうございます。まずは>>217に差し替え、加筆します。続きを行なう場合は
こちらの掲示板を使ってください。
    www.kaoriya.net/bbs/bbs.cgi?article=1586

223 名前:名無しさん@お腹いっぱい。 [02/05/15 15:45]
taglist.vimあげ。>>212 のfunclist.vimに置き換わるものです。ちなみに
outlineMode.vimは引退されたようです。
vim.sourceforge.net/scripts/script.php?script_id=273

224 名前:名無しさん@お腹いっぱい。 mailto:sage [02/05/15 16:30]
すばらしい。

225 名前:名無しさん@お腹いっぱい。 mailto:sage [02/05/17 11:03]
>>223
これはこれで便利だとは思うけど、ある程度大きいプログラムを扱う時は
そのファイルだけじゃなくて全てのファイルのタグが入ってないとあまり
意味がないような気も…

参照したい関数が編集中のファイル内にあることの方が珍しいので。



226 名前:  mailto:sage [02/05/17 13:15]
>>225 winmanagerに付属のタグ・エクスプローラってのはどう?

227 名前:名無しさん@お腹いっぱい。 [02/05/19 04:35]
Vim-Improved eMACS: Emacs emulation for Vim
vim.sourceforge.net/scripts/script.php?script_id=300
ワラタ

228 名前:名無しさん@お腹いっぱい。 mailto:sage [02/05/19 05:20]
Vimacs utility -1 1 Vim-Improved eMACS: Emacs emulation for Vim
emacs.vim color scheme -9 553 Emacs like colors

229 名前:KoRoN@Vim%Chalice ◆ALICEsdk mailto:sage [02/05/19 11:02]
>>227 いきなりマイナスに点数がつくんですよね(^-^;;;

230 名前:名無しさん@お腹いっぱい。 mailto:sage [02/05/19 13:23]
>>227
メーリングリストまであるがな

231 名前:名無しさん@お腹いっぱい。 mailto:sage [02/05/24 16:17]
vimacs では <M-x> は使えないんですか?

232 名前:名無しさん@お腹いっぱい。 mailto:sage [02/05/26 17:11]
>>231
しらんけど、elisp動いてるわけでもないのに<M-x>使う意味あるのかなあ?
なんなら<M-x>を:にmapするとか

233 名前:名無しさん@お腹いっぱい。 mailto:sage [02/05/27 10:31]
>>232
nmap <M-x> :
としてますが、動きません。

234 名前:名無しさん@お腹いっぱい。 mailto:sage [02/05/27 10:38]
>>233
nmap <Esc>x :

235 名前:名無しさん@お腹いっぱい。 mailto:sage [02/05/27 11:13]
素早いレス thanx です。
emacs のように meta(alt) キーを使っての1ストローク
は使えないということでしょうか?



236 名前:KoRoN@Vim%Chalice ◆ALICEsdk mailto:sage [02/05/27 11:53]
>>235
完全に把握しているわけではないですが、端末の種類や設定などによって違ってきま
す。経験則ではterm経由だと<M->はEscなんとかにと記述してやる必要があります。

237 名前:mattn@Vim%Chalice mailto:sage [02/05/27 12:09]
>>235
ソースをみましたが、
おそらく、<m-x> がマルチバイト文字のリードバイトと判断されて
いるため、トレイルバイトの入力を要求されているかと思います。
2回入力してませんか?

238 名前:mattn@Vim%Chalice mailto:sage [02/05/27 12:26]
追記・・・
もし開発環境をお持ちならば以下のパッチを試してもらえますか?

*** getchar.c~ Mon May 27 12:23:48 2002
--- getchar.c Mon May 27 12:23:38 2002
***************
*** 1843,1849 ****
    * multi-byte char.  Happens when mapping
    * <M-a> and then changing 'encoding'. */
   if (has_mbyte && MB_BYTE2LEN(c1)
!      > (*mb_ptr2len_check)(mp->m_keys))
       mlen = 0;
  #endif
   /*
--- 1843,1849 ----
    * multi-byte char.  Happens when mapping
    * <M-a> and then changing 'encoding'. */
   if (has_mbyte && MB_BYTE2LEN(c1)
!      > (*mb_ptr2len_check)(mp->m_keys) && mp->m_keylen > 1)
       mlen = 0;
  #endif
   /*

239 名前:名無しさん@お腹いっぱい。 mailto:sage [02/05/27 12:42]
>>238
当方、cygwin ですが、vimacs で m-x が使えました V(^_^)V パチパチ

240 名前:名無しさん@お腹いっぱい。 mailto:sage [02/05/27 14:05]
>>238
開発環境がないのでリリースされるのを待ちます。m(_ _)m

241 名前:名無しさん@お腹いっぱい。 mailto:sage [02/05/28 00:18]
>>240
されるのか!?

242 名前:mattn@Vim%Chalice mailto:sage [02/05/28 09:52]
>>240,>>241
vim-dev には送ったんですが、bram 氏は今週カンファレンスらしくて
来週以降にみると返事が来てます。
よって来週になって、「ダメ」と言われるかもしれません。(^_^;)
リリースされるのはパッチですので、win32 ならば KoRoN 氏の NetupVim で
更新、それ以外のプラットフォームならば開発環境を用意して頂くことに
なります。

243 名前:KoRoN@Vim%Chalice ◆ALICEsdk mailto:sage [02/05/29 12:52]
>>242
> リリースされるのはパッチですので、win32 ならば KoRoN 氏の NetupVim で
暫定的にまっつんさんのパッチを取込ませてもらいました。

244 名前:KoRoN@Vim%Chalice ◆ALICEsdk mailto:sage [02/06/04 17:48]
う〜ん…まっつんさんのパッチあてたんだけど、たとえば
:nmap <M-X> :
がうまく出来ませんね。環境は香り屋版W2Kです。
:help map-multibyte
にあるようにencをlatin1に設定してmapしてみたりもしたんですけど。
う〜ん…なんでだろ?

245 名前:mattn@Vim%Chalice [02/06/04 18:59]
>>244
Alt + Shift + x もしくは
:nmap <M-x> :
で動きませんか?



246 名前:KoRoN@Vim%Chalice ◆ALICEsdk mailto:sage [02/06/04 19:53]
>>244 あ、動きました。失礼しました。

247 名前:名無しさん@お腹いっぱい。 mailto:sage [02/06/05 19:52]
>>226
超亀レスですみませんが、ありがとうございました。

しかし、これ、ちょっと遅すぎるような。。。(褪

248 名前:名無しさん@お腹いっぱい。 [02/06/07 14:09]
現在分割しているウインドウの数を返す命令って何になりますか?

249 名前:名無しさん@お腹いっぱい。 mailto:sage [02/06/07 14:47]
bufwinnr('$')

250 名前:226 mailto:sage [02/06/07 14:50]
>>247 そうですねぇ。かなり欠点は多いかもしれませんが。逆に改善の余地は大
いにあるかもね。パッチ送ると喜ばれますよ。

>>248 一番ボトムのウィンドウに行って :echo winnr() ぐらいかなぁ。。
>>249 それは違うと思います。

251 名前:名無しさん@お腹いっぱい。 [02/06/08 15:13]
>249
>250
bufwinnr('$')では駄目でしたが、一番下のウィンドウでwinnr()は巧くいきました。
ただし、一番下に行く方法ってありますか?
安直かもしれないけど、ループさせて一番大きかった値が分割ウィンドウの数って
判定も出来るかもしれないけど…。

252 名前:名無しさん@お腹いっぱい。 mailto:sage [02/06/08 19:49]
>>251
Ex command であれば、:wincmd b です。(元に戻るには :wincmd p)
詳しくは :h windows を読みませう。

253 名前:名無しさん@お腹いっぱい。 [02/06/09 01:23]
>252
ありがとうございます。 確認できました!

254 名前:名無しさん@お腹いっぱい。 [02/06/21 19:36]
保守。

255 名前:名無しさん@お腹いっぱい。 mailto:sage [02/06/22 23:21]
自由。



256 名前:KoRoN@Vim%Chalice ◆ALICEsdk mailto:koron at tka.att.ne.jp [02/07/08 00:02]
高度なテクニックの紹介: コールバックの実装

2つのファイルを作りこのようなコマンドを実行する
:so manager.vim
:so callback.vim
:call DoCallback()

----ファイル: manager.vim
" コールバック関数登録用変数と関数
let s:procs = ''
function! RegistFunc(proc)
  let s:procs = s:procs . a:proc . ';'
endfunction
" ダミーコールバック
function! s:Dummy1()
  echo "Dummy1"
endfunction
" ダミーコールバックを登録
call RegistFunc('s:Dummy1')
" コールバックを実行する関数
function! DoCallback()
  let mx = '^\([^;]\+\);\(.*\)$'
  let procs = s:procs
  while procs != ''
    let proc = substitute(procs, mx, '\1', '')
    let procs = substitute(procs, mx, '\2', '')
    if proc != '' && exists('*'.proc)
      call {proc}()
    endif
  endwhile
endfunction

----ファイル: callback.vim
" スクリプトIDを取得
map <SID>xx <SID>xx
let s:_id = substitute(maparg('<SID>xx'), 'xx$', '', '')
unmap <SID>xx
" コールバック関数
function! s:Proc()
  echo 'callback.vim:Proc()'
endfunction
" コールバック関数を登録
call RegistFunc(s:_id.'Proc')

257 名前:KoRoN@Vim%Chalice ◆ALICEsdk mailto:koron at tka.att.ne.jp [02/07/29 12:11]
VimでAAアニメを作るためのライブラリとサンプルアニメーションを作ってみました。

    ライブラリ: www.kaoriya.net/testdir/animate.vim
    サンプル1: www.kaoriya.net/testdir/gikozuza.vim
    サンプル2: www.kaoriya.net/testdir/moukoneyo.vim

ライブラリとサンプルファイルを同じディレクトリにダウンロードして、Vim上で
    :source gikozuza.vim
    :source moukoneyo.vim
とタイプしてください。なおアニメーションの実行には+clientserverが正しく動作
する環境が必要です。Windows版のgvim,vimおよびLinux + GTKのgvimでは動作確認し
ました。

なにか面白い作品ができたら是非公開してください。スプライト風に実装しているの
でゲームなども作れるかもしれません。

258 名前:名無しさん@お腹いっぱい。 [02/08/14 01:55]
winのみですが、vimからCMAIL WRITERでメール送信。ウマー


259 名前:KANO_Dai@Vim%Chalice ◆EONKKhcc mailto:age [02/08/16 11:43]
標準プラグイン netrw.vim を使って
    :e ftp://ftp.hoge/hage
とやるとエラーになってしまいました。
    :Nread ftp://ftp.hoge/hage 
だとうまくいくのに。
'verbose' を設定してメッセージを出させ、それに従って netrw.vim を見てみると、
FTPを扱っているところで
    exec "norm! mzoopen " ファイル...
となっています。
"mz" は後の操作のためにマークをつけているんだろうけど、
まず "o" が分かりません。新しい行を開いている?
そして "open" って何でしょう? :open なら obsolete なコマンドだとヘルプにありました。
どなたかお助け。

ちなみに、netrw.vim ではHTTPを持ってくるときにwget.exeを使う仕組みになっていますが、
Chaliceのために手に入れたcurl.exeを使うように手を加えてあります。
それがいけないのかな?しかしFTPにはftp.exeを使うので影響ないはず。

260 名前:あぼーん mailto:あぼーん [あぼーん]
あぼーん

261 名前:名無しさん@お腹いっぱい。 mailto:sage [02/08/16 18:23]
>>259
> "open" って何でしょう?

直接解決にはならないですけど、こういうことをやってるみたいです。

open servername port
username passwd
mode
get remote-filename local-filename

↑のようなコマンド行を生成し、その部分をftpに渡して実行、と。

なぜエラーになるかはちょっとわかんないっす。

262 名前:KANO_Dai@Vim%Chalice ◆EONKKhcc mailto:sage [02/08/17 11:43]
ああ、"open" はFTPのコマンドでしたか。少し分かってきたような気がします。
完全に修正できたら報告します。
少し分かったのは、netrw.vimの

" which the following blots out.  Does Win-NT/98/2000 do the same???
exe "'y-3,'yd"

というところでexeをコメントアウトするとよいことにはすでに気づきました。
何でもWin95のFTPには空行を勝手にくっつける癖があるそうで、
それを消そうとしているのですが、私のWin98のFTPではそんな癖がないのでいらないんです。
でもVimスクリプトではWin95とWin98の区別ができませんから、おかしくなっていました。

263 名前:KANO_Dai@Vim%Chalice ◆EONKKhcc mailto:sage [02/08/22 10:07]
訂正っす。
.vimrc で let netrw_win95ftp = 0 とすると、
上記のコメントアウトは必要ありませんでした。
なんでこういう変数を Options: で説明しないで、
ずっと下の方の Variables: なんて項目に載せておくんだ?

netrw で FTP が使えないのは、BufReadCmd 内で >>261 さんのおっしゃるような
コマンド文字列の生成ができていないためだ、という気がしてきました。
exe "'z+1,.!ftp -i -n" とすることで、
コマンド文字列を ftp.exe をフィルタ扱いにすることで送っているらしいですが、その前に
exe "'z+1,.w c:/windows/temp/cmdtmp"
exe "'z+1,.d"
を付け加えても、空行2行しか保存されません。この辺りが鍵?
こうした後に :r ftp://hoge/hage としたときはちゃんとftp.exeに対するコマンドが
ファイルに保存されるんですよ。こちらでは FileReadCmd を使っているので動作するのかな。

264 名前:名無しさん@お腹いっぱい。 mailto:sage [02/08/28 18:25]
保守さげ

265 名前:KANO_Dai@Vim%Chalice ◆EONKKhcc mailto:age [02/09/17 05:11]
相変わらずわからんちんです。
学校始まって忙しいのであまりハックできない...鬱
Chaliceスレではw3m.vimネタがまた出たみたい。



266 名前:名無しさん@お腹いっぱい。 mailto:sage [02/10/19 04:10]
vimスクリプトなんて書いたことないけど、し、質問があります。
ぼ、僕は正規表現厨房なので、

:% s/hoge11/moge
:% s/hoge2232/moge
:% s/hoge_3_3/moge
   ・
   ・
   ・
と連続して実行するのに、
上の文字列をどっかに記憶させて、それを読み込んで実行するって出来ますか?


267 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [02/10/19 10:39]
>>266
先頭のコロンを削除して

%s/hoge11/moge
%s/hoge2232/moge
%s/hoge_3_3/moge
   ・
   ・
   ・

というテキストを作成しtest.vimとして保存します。
あとは :source test.vim とすれば実行できます。
詳細は :help :source を参照してください。

268 名前:・・・うまく行くかな? mailto:sage [02/10/20 22:20]
>>266
:%s/hoge11/moge^M^[:%s/hoge11/moge^M^[:%s/hoge_3_3/moge^M^[
と書いて、その行の上で、
例えば、
"aY
と入力する。

その後、実行したい時には、
@a
とする。


269 名前:名無しさん@お腹いっぱい。 mailto:sage [02/10/20 22:28]
独り言ですが、
hywr.kuciv.kyoto-u.ac.jp/~shiiba/documents/unix/openmemo.html#3
の説明にあるtable.el重宝しそうなんだけど、今ダウンロードできないです。

こういったスクリプト向けにvimスクリプトは向いていますか?
かなり欲しい機能なので、この際、table.vim書きながら
vimスクリプト勉強してみよっかなー。

270 名前:名無しさん@お腹いっぱい。 mailto:sage [02/10/20 22:48]
ぜんぜん関係無いけど、>>269みたいに今現在アクセスできない所も、
Googleの検索窓にURLを入れて検索すると、キャッシュでは見ることが出来ます。
(キャッシュがあればね)

>>269のは、本人の説明はないが、
+---+----+-----+
| a | g  | hig |
+---+----+-----+
| a | ss |  s |
| b | s  |  i |
+---+----+-----+
こういうのを作るスクリプトのようです。


271 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:koron at tka.att.ne.jp [02/10/20 23:24]
>>269
> こういったスクリプト向けにvimスクリプトは向いていますか?
向いているか向いてないか、という問なら間違いなく向いていません。配列やデータ
構造とかそういう高級な機能は一切ありませんから、ちょっと複雑なことをしようと
すれば作成側の知恵が試されることになります。そこが面白いところではあります。

望みの処理を行なってくれる既成の外部ツールがあるのなら、フィルタとしてそちら
を使うようにしたほうが利口なのは確実です。でもテーブル用スクリプトは既にどこ
かにあったような気もします。

272 名前:269 mailto:sage [02/10/21 00:55]
>>271
>でもテーブル用スクリプトは既にどこかにあったような気もします。
これのことでしょうか?
table.sourceforge.net/



273 名前:269 mailto:sage [02/10/21 00:58]
さっき見つけた。
www.psyc.nott.ac.uk/staff/ritter/papers/dismal/dismal.html
は古いけど高機能。表計算も出来るとか。


274 名前:269 mailto:sage [02/10/21 00:59]
ここはvimだった……
すみません。すれ違いでした。

275 名前:名無しさん@お腹いっぱい。 [02/11/13 21:13]
age



276 名前:名無しさん@お腹いっぱい。 mailto:sage [02/11/19 06:54]
Vim scriptって便利そうですね。
今までキーレコーディングで満足してたから…。

277 名前:名無しさん@お腹いっぱい。 mailto:sage [02/11/24 23:24]
debug.vim : Simple utility to assist in debugging vim scripts
vim.sourceforge.net/script.php?script_id=491

debug.vim 1.0.0
22-Nov-2002
6.0
kam onn siew
Initial upload

278 名前:名無しさん@お腹いっぱい。 mailto:sage [02/11/27 17:25]
>277 便利なの?

279 名前:名無しさん@お腹いっぱい。 [02/12/02 23:20]
vim初心者ですが、vim上でメール見れますか?

280 名前:名無しさん@お腹いっぱい。 mailto:sage [02/12/02 23:51]
>>279
スクリプトは色々あるみたい。
入れてみて報告きぼんぬ
vim.sourceforge.net/script_search.php?keywords=mail&script_type=&order_by=rating&direction=descending&search=search

281 名前:名無しさん@お腹いっぱい。 mailto:sage [02/12/03 22:24]
Windowsで香り屋gVimを使わせて頂いております。

起動するたびにcolorsディレクトリ以下にあるcolor schemeを
ランダムに呼ぶVimスクリプトを作ろうかと考えています。

質問1)そんなスクリプト、すでにありますか?あるなら、どこにあるか教えて下さい。
質問2)俺には、そんなスクリプトを作るのは無理ですか?
質問3)もしかしてVimスクリプトに乱数って無いんですか?

当方、シロウトに縮れ毛が生えた程度の似非プログラマです。

282 名前:名無しさん@お腹いっぱい。 mailto:sage [02/12/03 22:31]
秒数の1桁目を取得して擬似的に乱数をつくればいいんじゃなかろか。

283 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:koron at tka.att.ne.jp [02/12/03 22:37]
>>281
> 質問1)そんなスクリプト、すでにありますか?あるなら、どこにあるか教えて下さい。
vim.sf.netを見る限りなさそうです。

> 質問2)俺には、そんなスクリプトを作るのは無理ですか?
それは自分で決めてください。できないと思ってしまえばどんな些細なことであって
も絶対にできません。逆にできると思えば大概のことはできるものです。あとはやる
かやらないか。

> 質問3)もしかしてVimスクリプトに乱数って無いんですか?
無いです。線形合同法等を使って擬似乱数生成関数を書くなり、もしくは外部ライブ
ラリを利用する必要があります。線形合同法についてはこちらを参照:
    www.ysr.net.it-chiba.ac.jp/data/rand/node5.html

284 名前:名無しさん@お腹いっぱい。 mailto:sage [02/12/03 22:44]
ヒントはtetris.vimにあり

285 名前: mailto:sage [02/12/03 22:48]
【中学生?】YAHOO祭り♪【高校生?】
ヤフーの音声チャットでお祭り騒ぎ!
こ、これマジっすか?と耳を疑うような
乱交ぶり!ただいま順番待ち殺到!
あと、3時間待ちか?w
↓↓↓↓↓↓実況スレ↓↓↓↓↓↓↓
choco.2ch.net/test/read.cgi/bobby/1038742045/



286 名前:名無しさん@お腹いっぱい。 mailto:sage [02/12/03 22:50]
たまにageると早速↑こういう目にあう。トホホ

287 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [02/12/03 23:01]
(´・ω・`)…ゴメンなさい。

288 名前:名無しさん@お腹いっぱい。 mailto:sage [02/12/03 23:22]
>>287
悪いのは>>285ですよぉ、いやだなあ

289 名前:281 mailto:sage [02/12/03 23:39]
>>283
ありがと。

いきなり壁に突き当たってしまった。
let color = "evening"
colorscheme color
→カラースキームcolorが見つかりません

let color = "evening"
echo ":colorscheme " color
→:colorscheme evening(と下に表示されるだけ)

なんかヒント欲しいです・・・

290 名前:名無しさん@お腹いっぱい。 mailto:sage [02/12/03 23:57]
>>289
:help :execute なんてどうでしょ。

291 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [02/12/03 23:58]
>>289
let color = "evening"
execute "colorscheme ".color

:help :execute

292 名前:名無しさん@お腹いっぱい。 mailto:sage [02/12/04 00:51]
vim.sourceforge.net/tip_view.php?tip_id=358

293 名前:281 mailto:sage [02/12/04 21:26]
>>290-291
ご教授ありがとうございます。
またVimスクリプトを書こうかなって思ったら、
またこのスレに来ますんでよろしくお願いします。

>>292
あらら、あったのね。どうもです。
早速使わせて頂きました。希望通りの動きでとっても幸せです。

294 名前:名無しさん@お腹いっぱい。 mailto:sage [02/12/04 21:33]
>>293
おいしいスクリプトが出来たらvim.orgにうpしてね♪

295 名前:名無しさん@お腹いっぱい。 mailto:sage [02/12/08 21:22]
現在のバッファの情報を外部アプリケーションに渡すには、一時ファイルを作ってそれを渡す
というのが、Vim スクリプトの作法なのでしょうか?
cvscommand.vimスクリプトってのを見てたら、そう思いました。



296 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [02/12/08 21:26]
>>295
パイプで繋いでどうこうということは残念ながらできないので、
そういう情報が必要ならば一時ファイルを作ることになります。
引数だけで済む場面では勿論引数で済ませます。

297 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [02/12/08 21:34]
>>296
あ、フィルタ使う方法はありますね。前書き込みのパイプ云々は外部コマンドと
動的にインタラクションするということを頭の片隅に置いた上での発言と読んでください。
まぁ、最終的にどれを使うかは個人の裁量です。作法とかそういったものは気にせず、
その時一番efficientだと思えた方法を使うのが吉でしょう。

298 名前:295 mailto:sage [02/12/08 21:35]
いろいろ調べてみましたが、そのようですね。
とりあえず、現行の編集ファイル (バッファではない) に対して、
やりたいことができるようになってから考えます。

299 名前:名無しさん@お腹いっぱい。 mailto:sage [02/12/13 23:56]
Printer Dialog : vim onlineより。
vim.sourceforge.net/script.php?script_id=512

このスクリプトのソースコード、むちゃ見やすい。綺麗。
vimスクリプトのコーディング規則とか考えちまった。

300 名前:300 mailto:age [02/12/16 13:04]

300

301 名前:名無しさん@お腹いっぱい。 mailto:sage [02/12/19 01:46]
>>225
vim.sourceforge.net/script.php?script_id=483
これいいですよ。

302 名前:名無しさん@お腹いっぱい。 mailto:sage [02/12/19 02:04]
>>301
225じゃないけど、土日に試して見る。

303 名前:名無しさん@お腹いっぱい。 mailto:sage [02/12/19 17:41]
すれ違いですが
vim.sourceforge.netにあるスクリプトを全部おとすのはどうすればいいですか?
wget 'vim.sourceforge.net/script_download.php?src_id=1423'
とやるとscript_download.php?src_id=1423って名前になります。

304 名前:名無しさん@お腹いっぱい。 mailto:sage [02/12/21 03:01]
sokoban.vimはxsokobanと同じだった。

305 名前:sage [02/12/24 00:59]
vimスクリプトに配列ってありますか?



306 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [02/12/24 01:19]
>>305
配列そのものは無いです。が、ダミーバッファに対してsetline()/getline()を使っ
たり、{}記法を使うことで代用品を仕立てることはできます。後者は次のような感じ
で使います。
    :let index = 2
    :let array_{index} = "some string";
    :let index = 3
    :let array_{index} = "another string";
    :echo array_2
    some string
    :echo array_{index}
    another string
あと、これはVimに閉じないのですがif_perlやif_rubyを使う方法も考えられます。

307 名前:名無しさん@お腹いっぱい。 [02/12/26 00:21]
emacsでいうところの vc-mode のようなことをvimスクリプトで実現した
例はあるのでしょうか。


308 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [02/12/26 00:36]
>>307
> emacsでいうところの vc-mode のようなことをvimスクリプトで実現した
> 例はあるのでしょうか。
emacs使わないのでvc-modeがどんなモノか知らないのですが、
例えばこんなのでしょうか?
    www.vim.org/script.php?script_id=90

309 名前:307 mailto:sage [02/12/26 11:31]
>>308
searchの使い方が分かりました :)
どちらかというと欲しいのはRCSに対するものです。emacsのものだと、

- RCSのファイルが転がっていると自動的にRCSモードの表示に
- C-x C-q で write-protectedを解除 → co -l foo
- 修正後 c-x c-q で write-protectedに → commitメッセージを聞いてきて
  C-c C-c で ci -u -m"メッセージ" foo

てなことをやってくれるようなんです。
vimで
- ファイルオープン時に実行されるフック
- set readonly状態の時に何かバッファを修正したら実行されるフック
- set readonly状態を変更したら実行されるフック

があればなんとかできそうかなと思います。


310 名前: [02/12/30 00:17]
HTML で困るものをエスケープするスクリプトを書いたんですが、
範囲選択の後に :'<,'>call HtmlEscape と入力しなければならないです。
そうじゃなくて、:'<,'>HtmlEscape にするにはどうすればいいの?
# command あたりがあやしかったがわからなかった...

if exists("loaded_html_escape")
finish
endif
let loaded_html_escape = 1
function HtmlEscape() range
let index = a:firstline
while index <= a:lastline
let line = getline(index)
let line = substitute(line, "&", "\\&", "g")
let line = substitute(line, "<", "\\<", "g")
let line = substitute(line, ">", "\\>", "g")
call setline(index, line)
let index = index + 1
endwhile
endfunction

311 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:koron at tka.att.ne.jp [02/12/30 00:44]
>>310
:command! -range HtmlEscape <line1>,<line2>call HtmlEscape()
多分こんな感じです。
:help E177

312 名前: [02/12/30 01:55]
E177 のヘルプ見たのにー!
そうか。 <line1>と<line2>はそうやって使えばいいのか。

これで年が越せます。ありがとう!>KoRoN 氏

313 名前:301 mailto:sage [03/01/01 16:59]
>>301>>226氏の言うwimmanagerに付属のやつでしたか。すみませぬ。

314 名前:226 mailto:sage [03/01/03 16:06]
別もんですよん

315 名前:名無しさん@お腹いっぱい。 [03/01/05 15:23]
なかなか便利だ。

A vim plugin for browsing tarfiles
vim.sourceforge.net/script.php?script_id=522



316 名前:名無しさん@お腹いっぱい。 mailto:sage [03/01/06 07:57]
>>315
そういえばデフォルトでgzip.vimってのがはいってるね。

317 名前:名無しさん@お腹いっぱい。 mailto:sage [03/01/07 02:02]
vim素人の私は最近、zcatってコマンドライン覚えたよ。
こういうのがエディタ上から、呼び出せるのはvimのいいところね。

318 名前:名無しさん@お腹いっぱい。 mailto:sage [03/01/07 22:39]
vim.sourceforge.net/script.php?script_id=52
calendar.vim 1.3o 06-Jan-2003

otu-

319 名前:山崎渉 mailto:(^^)sage [03/01/15 13:02]
(^^)

320 名前:名無しさん@お腹いっぱい。 mailto:sage [03/01/17 14:19]
alias Info="vim -c 'source hoge/info.vim|Info'"
便利です

321 名前:名無しさん@お腹いっぱい。 mailto:sage [03/01/26 07:03]
激しく禿同

322 名前:名無しさん@お腹いっぱい。 mailto:sage [03/01/26 13:23]
最近スクリプトを覚えようと思って、この板にやってきました。
mattnさんの >>128 を試しているんですが、
      silent argdo! rewind
のラインを
      silent argdo! rewind!
にしないとE37が出たり gvim ~/vimrc が開けず、でもrewind!にすると
after/ftplugin/ 以下が読みこまれないという症状に悩まされています。
上記スクリプトを.vimrcのどの位置で定義するのかにも関係するんですかね?

:h rewind しても良くわからなかったのでカキコしてみました。

323 名前:322 mailto:sage [03/01/27 01:57]
自己レス。
cyg-wrapper.shでウマー 
    hermitte.free.fr/cygwin
でした。

324 名前:名無しさん@お腹いっぱい。 mailto:sage [03/01/29 06:57]
KaoriYa タンのは FreeBSD PORTS には入らんの?

325 名前:324 mailto:sage [03/01/29 06:59]
微妙に誤爆。スマソ



326 名前:名無しさん@お腹いっぱい。 [03/02/10 00:32]
file(*.vim)はどこに置くの?


327 名前:名無しさん@お腹いっぱい。 mailto:sage [03/02/10 00:38]
>>326
OSによって違う。UNIXっぽいシステムだったら、
~/.vim/plugin/
あたり。システムグローバルは :echo $VIMRUNTIME あたりに。

328 名前:名無しさん@お腹いっぱい。 [03/02/10 00:42]
linuxだけど、好きなところには置けないですか?


329 名前:名無しさん@お腹いっぱい。 mailto:sage [03/02/10 00:47]
>>328
.vimrcでその「好きな所」を
set runtimepath+=好きな所
すれば好きな所に置けるけど、~/.vim/plugin で問題ある?

330 名前:329 mailto:sage [03/02/10 00:48]
嘘。runtimepath+=hoge だったら、hoge/plugin/ だな。

331 名前:名無しさん@Vim%Chalice mailto:sage [03/02/10 04:12]
正規表現で制御文字そのものを表すatomって無いんでしょうか?
<Esc>, <Tab>, <CR>, <BS>は既に存在する(\e, \t, \r, \b)んですが、
^Jなどは表現できないですよねぇ…?

例えば、レジスタaに入ってる文字列から<Ctrl-J>を削除しようとした時に
   substitute(@a, '^@', '', 'g')
のように、関数内で<Ctrl-V><Ctrl-J>して直接char codeを入れちゃうと
実行時にエラーになってしまうので…
# ^@の部分が<Ctrl-V><Ctrl-J>です。
# ^@は改行を意味するのでsubstitute()の呼び出しが無効になります。
<Ctrl-V><Ctrl-J>の代わりに\rや[:cntrl:]で置換しようとしてもできませんでした。

文字を直接ascii codeで指定できたりすると良いんですけどね…
\0x0a (← ctrl-J)みたいな感じで (\0x61なら'a'になるみたいな)

332 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [03/02/10 04:44]
>>331
Chalice内のplugin/alice.vimにあるAL_firstline()とかが参考になるかもしれませ
ん。レジスタ内の改行記号^Jには"\<NL>"が対応します。このあたりはVimが文字列を
どのように扱っているかを知っていれば至極当然なのですが、知らないとかなりメン
ドイので以下のように慣用句として覚えてしまうのが良いでしょう。
   substitute(@a, "\<NL>", '', 'g')

333 名前:名無しさん@Vim%Chalice mailto:sage [03/02/11 03:03]
331です。

>>332
KoRoNさん、解説どうもありがとうございました。

とりあえず納得はしたのですが、"至極当然"とか言われちゃうと
どうしても文字列をどのように扱ってるかが気になってしもたので、
vimのsource codeを見てみましたが、漏れには解析追いつかずでした… (´Д⊂グスン

しかし!
trans_special()が定義されているmisc2.c内で偶然<Char->の存在を知り、
   :help <Char->
を見ると、なんと!ロトのつるぎを見つけた! …じゃなくて、
漏れが >>331
> > 文字を直接ascii codeで指定できたりすると良いんですけどね…
> > \0x0a (← ctrl-J)みたいな感じで (\0x61なら'a'になるみたいな)
と言っていた機能が既に有るではないですかぁ!

てことで、
   substitute(@a, "\<Char-0x0a>", '', 'g')
と書いても
>   substitute(@a, "\<NL>", '', 'g')
これと同じ動作になることが確認できますた。 ヽ(´▽`)ノ

<Char->は元々multi-byteを扱うのに便利な機能として用意されていたらしいですが、
これなら\e, \t, \r, \b以外の制御文字も(知ってればですが)扱えますね。
あまり綺麗じゃありませんし、素人にはお勧めできない諸刃の剣かもしれませんが…
# もしかして反則技ですか?

あ! ASCIIじゃなくてEBCDICの時に使えないですね…
# 早くもダメケースをハケーンしてしまった…  ΣΣ(゚д゚lll)ガーン!!

334 名前:331@Vim%Chalice mailto:sage [03/02/11 03:05]
もっかい331です。

>>332
ついでに…
余談ですがregexp.cのbackslash_trans()で
\r, \t, \e, \b の振る舞いが書かれてますね。
あくまで仮の話になりますが、
   static char_u REGEXP_ABBR[] = "nrtebj";
というように、jを加えて
   case 'j':   return NL;
のようなcaseを1個追加するだけで、正規表現として
   \j が <NL> にマッチする
といった動作になったりするんですかね…?
# 考えが浅はかかな?…


んー。なんかスレ違いになってきちゃったかな? ^^;
これぢゃVim6ソースコードお勉強スレですな(w

335 名前:名無しさん@お腹いっぱい。 [03/02/20 19:42]
autocmd BufReadPost *
\ if line("'\"") > 0 && line("'\"") <= line("$") |
\ exe "normal g`\"" |
\ endif
vimrc_exampleのこの部分ですが、2行目と3行目の最後の|はなんですか?
それと g`\"のgはなんのためにあるのですか?



336 名前:名無しさん@お腹いっぱい。 mailto:sage [03/02/20 19:47]
| はコマンドの連結
g を前置するのはジャンプリストを変更しないようにジャンプする

337 名前:335 mailto:sage [03/02/20 20:26]
>>336
autocmdだから1行にする必要があるのですね。
gの方は:h g'にありましたね。ありがとうございます。

338 名前:名無しさん@お腹いっぱい。 mailto:sage [03/02/22 10:53]
vim.sourceforge.net/scripts/script.php?script_id=575
gnu-c : A filetype plugin to encourage the GNU C style.

これっていままでup されていなかったけど、多くのひとが自分用に作っていそう。

339 名前:名無しさん@お腹いっぱい。 mailto:sage [03/02/27 11:13]
>>337
1行にするのは行頭の '\' の働き.
'|' は,本来autocmdで実行するのは単一のコマンドだから,
複数のコマンドを実行するために連結が必要になっているということ.

340 名前:名無しさん@お腹いっぱい。 mailto:sage [03/03/01 02:34]
質問があります。
vimのevalはかなり高機能なので、スクリプトインタプリタとして
使用してみようと思い、いろいろ試行錯誤してみたのですが、
そもそも、echoが標準出力に出力できないです。
どうすればできるのでしょうか?

341 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [03/03/01 02:46]
多分標準出力には出せないと思われます。
一時ファイルを使うのが良いでしょう。

342 名前:名無しさん@お腹いっぱい。 mailto:sage [03/03/01 03:06]
>>341
了解しました。
perlやpythonが使えるので、逆にevalが独立して
スクリプトインタプリタとして使えると楽しめそうなんですが。
あと、ソケットをたたくAPIが追加されるとChaliceが完全に
evalだけでできそうだし、いろいろできそうなんで、ぜひ
追加してほしいもんです。

343 名前:名無しさん@お腹いっぱい。 mailto:sage [03/03/01 11:48]
既に備わってるlibcall()で(間に自作DLLをはさめば)ソケットが使える...かもね。
ただ標準DLLを呼ぶには力不足、とかマニュアルに書いてあるしなあ。
Vimはマルチプラットフォームが原則だから,難しいんじゃないの?
でもソースがあるんだから自分で追加というのもできないことではない.

344 名前:名無しさん@お腹いっぱい。 mailto:sage [03/03/01 13:02]
perl使えばいいじゃん

345 名前:名無しさん@お腹いっぱい。 mailto:sage [03/03/02 01:31]
>>344
それじゃVIMを使う意味もないと思う。

>>343
Unix,Mac,Windowsで動くマルチプラットホームなソケットライブラリ
はいくつも存在するから、ようはBramの気分次第のような気がしないでもない。
そのときには、evalはどういう感じになるんだろう。いまいち想像つかないが。
まぁ、いつの日か、
+socket
が表示される日を夢見てevalをいじくるとしよう。



346 名前:名無しさん@お腹いっぱい。 mailto:sage [03/03/05 20:59]
www.vim.org/scripts/script.php?script_id=563
これけっこう便利だけど、\rlogがうまく動いてくれない。

347 名前:名無しさん@お腹いっぱい。 mailto:sage [03/03/21 18:07]
勉強ついでに
Namazuのvimクライアントつくろーかと思ったけど、
pinna.cside4.jp/tips/vim/search.html
で発見。期待待ち。


348 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [03/03/21 19:06]
>>347
あ、本文の方が無いんですね(^-^;
そこのサイトマスター、友人なので執筆のお願いしてみましょうか?

349 名前:名無しさん@お腹いっぱい。 mailto:sage [03/03/22 01:26]
vim.sourceforge.net/scripts/script.php?script_id=595
HelpClose : Close all help windows

1 get ズサーしますた。

350 名前:名無しさん@お腹いっぱい。 mailto:sage [03/03/22 01:39]
2get!

351 名前:名無しさん@お腹いっぱい。 mailto:sage [03/03/22 21:34]
私昨夜3getしたみたいです。
>>348
せかさなくて、いいです。更新直後のようですから。
今後の更新をのんびり待ちます。期待して。

352 名前:名無しさん@お腹いっぱい。 mailto:sage [03/04/04 11:01]
vimにこういうのないかなあ。
www1.odn.ne.jp/ymtz/image/jtc-string.gif
www1.odn.ne.jp/ymtz/image/jtc-list.gif

353 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [03/04/04 11:26]
私もちゃんとは試してないんですがCreamがなんかやってます。
    cream.sourceforge.net/index.html
    cream.sourceforge.net/screenshots.html
あとはcppcomplete.vimくらいしか思いつきません。
    www.vim.org/scripts/script.php?script_id=527

# Vimは構造的にそういう拡張は難しいんですが…

354 名前:名無しさん@お腹いっぱい。 [03/04/05 00:13]
www.vim.org/scripts/script.php?script_id=356
db_ext というプラグインを使おうと思ったのですが、途中で
if exists("g:default_db_ext_{b:db_ext_type}_cmd_terminator")
という行があって、
b:db_ext_type = 'PGSQL' なんかの時に、g:default_db_ext_PGSQL_cmd_terminator
について exists() したいんだと思うのですが、そのようには動いてくれません。
つーか、そのように動かなくて正解のような気がするんですが、
実際どうなんでしょう。なんか設定とかバージョンとかなんでしょうか。

355 名前:名無しさん@お腹いっぱい。 mailto:sage [03/04/05 00:44]
6.1.255あたりのパッチでcurly braces変数がexists()で評価できるようになったと思う。



356 名前:354 [03/04/05 23:16]
>>355
できました。サンクスコ。
ところでスクリプト作るのって、ちょっと書いて :source して、、、ってやるんでしょうか?
例えばバッファ内のスクリプトを保存せずに実行する方法とかあるんでしょうか?

vim スクリプトの開発/デバッグのテクニックとかあったらおしえて下さい。


357 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [03/04/05 23:33]
>>356
> 例えばバッファ内のスクリプトを保存せずに実行する方法とかあるんでしょうか?
そういうスクリプト書いちゃえばできないことはないですが、
だったら適当な名前で保存して :so% したほうが手っ取り早いです。

358 名前:山崎渉 mailto:(^^) [03/04/17 12:00]
(^^)

359 名前:あぼーん mailto:あぼーん [あぼーん]
あぼーん

360 名前:名無しさん@お腹いっぱい。 [03/04/24 19:40]


361 名前:名無しさん@お腹いっぱい。 mailto:sage [03/04/30 21:45]
Chalceで学んだことですが、スクリプトでバッファを変更する時に、一時的に
undolevelsを-1にするのは非常にナイスなアイデアですよね。一回のundo分でも
無制限にメモリを消費できてしまうわけですからね。vim標準のgzip.vimとか、
いろんなスクリプトでこれをやってほしいなぁ

362 名前:名無しさん@お腹いっぱい。 mailto:sage [03/04/30 21:46]
x Chalce
o Chalice

363 名前:名無しさん@お腹いっぱい。 [03/05/15 11:54]
emacsであるような、ChangeLogの作成を支援してくれるような
vimスクリプトってありませんか??

364 名前:名無しさん@お腹いっぱい。 mailto:sage [03/05/15 12:22]
こんなんがあるが…
ttp://www3.kobedenshi.ac.jp/~s1009790/vim/index.html

ちょっと修正すりゃそれなりになるんじゃない?

365 名前:あぼーん mailto:あぼーん [あぼーん]
あぼーん



366 名前:363 [03/05/15 13:32]
自分もこんなの見付けました。
ttp://apollo.u-gakugei.ac.jp/~yoshiki/cltips.php

367 名前:名無しさん@お腹いっぱい。 mailto:sage [03/05/17 09:21]
+,-などの記号を入力したときに両側にスペースを入れたいです。
そのときすでにスペースが入っていたらスペースを入れないようにします。
それで次のような関数を作ったのですがうまくいきません。
というかvimスクリプトがぜんぜんわかりません。
直してください。
inoremap <buffer> ( <c-o>:call InsertSpace()<cr>(
inoremap <buffer> , <c-o>:call InsertSpace()<cr>,<space>
inoremap <buffer> + <c-o>:call InsertSpace()<cr>+<space>
inoremap <buffer> - <c-o>:call InsertSpace()<cr>-<space>
inoremap <buffer> * <c-o>:call InsertSpace()<cr>*<space>
inoremap <buffer> / <c-o>:call InsertSpace()<cr>/<space>
inoremap <buffer> = <c-o>:call InsertSpace()<cr>=<space>
function! InsertSpace()
if strlen(getline(".")) == col(".")
if strpart(getline("."), col(".")-1, 1) != " "
normal a
endif
else
if strpart(getline("."), col(".")-2, 1) != " "
normal a
endif
endif
endfunction

368 名前:名無しさん@お腹いっぱい。 mailto:sage [03/05/17 19:09]
>>367
まず、
getline(".")[col(".")-1]
みたいに、配列を使ってみたら。

369 名前:名無しさん@お腹いっぱい。 mailto:sage [03/05/17 19:57]
>>367
とりあえず、それっぽく動くのができたよ。

inoremap <buffer> + <C-O>:call InsertSpace('+')<CR>
function! InsertSpace(chr)
  let left = getline(".")[col(".")-2]
  let right = getline(".")[col(".")-1]
 
  if left == ' ' && right == ' '
    execute "normal i\<C-V>".a:chr."\<Right>"
  elseif left != ' ' && right != ' '
    execute "normal i \<C-V>".a:chr." \<Right>"
  elseif left != ' '
    execute "normal i \<C-V>".a:chr."\<Right>\<Right>"
  elseif right != ' '
    execute "normal i\<C-V>".a:chr." \<Right>"
  endif
endfunction

370 名前:367 mailto:sage [03/05/17 22:00]
>>369
ありがとうございました。すごく勉強になります。
しかし、行の最後にいるときにうまくいきません。
場合分けしたのですが、最後の\<Right>がうまく機能しません。
function! InsertSpace(chr)
let left = getline(".")[col(".")-2]
let right = getline(".")[col(".")-1]
if strlen(getline(".")) == col(".")
if right == ' '
execute "normal a\<C-V>".a:chr." \<Right>"
else
execute "normal a \<C-V>".a:chr." \<Right>"
endif
else
if left == ' ' && right == ' '
execute "normal i\<C-V>".a:chr."\<Right>"
elseif left != ' ' && right != ' '
execute "normal i \<C-V>".a:chr." \<Right>"
elseif left != ' '
execute "normal i \<C-V>".a:chr."\<Right>\<Right>"
elseif right != ' '
execute "normal i\<C-V>".a:chr." \<Right>"
endif
endif
endfunction

371 名前:369 mailto:sage [03/05/17 22:51]
>しかし、行の最後にいるときにうまくいきません。
ほんとだ。σ(^◇^;)

>場合分けしたのですが、最後の\<Right>がうまく機能しません。
ほんとだ。(?_?)
これはちょっとわからないな。ちょっと調べてみるけど、
あてにはしないでね。なんか仕様っぽい気もするし。

372 名前:MiMi@Vim%Chalice ◆fI1wYbzaMQ mailto:sage [03/05/18 00:20]
違うアプローチで作ってみました.
挿入モードで演算子を入力するとスペースを挿入します.
# コマンドモードに戻る必要はありません.

●注意事項
  プログラミング言語の仕様に+と++のような同じ文字を使った
  二種類の演算子がある場合は両方をmapして下さい.
  第2引数でスペースを入れるかどうかを指定します.
  これにより,++の時はスペースを入れない,==の時はスペースを入れる
  といった使い分けが出来ます.
  スペースを入れない仕様は意味が無さそうですが,+をmapして++をmapしないと,
  ++が入力できなくなってしまうので仕方なくこういう仕様にしました.

●1点だけごめんなさい項目があります.
  行頭ではmapした記号を入力できません.
  ただし,一般的にはインデントを入れるので気にならないでしょう.

" 両側にスペースを入れたい演算子をmappingする
inoremap <buffer> <silent> + <Esc>:call InsertSpaceOnBothSides('+', 1)<CR>a
inoremap <buffer> <silent> - <Esc>:call InsertSpaceOnBothSides('-', 1)<CR>a
inoremap <buffer> <silent> * <Esc>:call InsertSpaceOnBothSides('*', 1)<CR>a
inoremap <buffer> <silent> / <Esc>:call InsertSpaceOnBothSides('/', 1)<CR>a
inoremap <buffer> <silent> % <Esc>:call InsertSpaceOnBothSides('%', 1)<CR>a
inoremap <buffer> <silent> = <Esc>:call InsertSpaceOnBothSides('=', 1)<CR>a

inoremap <buffer> <silent> ++ <Esc>:call InsertSpaceOnBothSides('++', 0)<CR>a
inoremap <buffer> <silent> -- <Esc>:call InsertSpaceOnBothSides('--', 0)<CR>a
inoremap <buffer> <silent> == <Esc>:call InsertSpaceOnBothSides('==', 1)<CR>a

373 名前:MiMi@Vim%Chalice ◆fI1wYbzaMQ mailto:sage [03/05/18 00:20]
" 演算子の両側にスペースを入れる
function! InsertSpaceOnBothSides(operator, isspace)
  let pre_str  = strpart(getline("."), 0, col(".")) " 行の前半
  let post_str = strpart(getline("."), col("."))    " 行の後半

  if a:isspace == 1
    if strpart(pre_str, strlen(pre_str)-1, 1) != ' '
      let pre_str = pre_str . ' '       " 前半最後にスペース挿入
    endif
    if strpart(post_str, 0, 1) != ' '
      let post_str = ' ' . post_str     " 後半最初にスペース挿入
    endif
  endif

  " 前半と後半の間に演算子を挿入
  call setline(".", pre_str . a:operator . post_str)

  " 次の挿入位置へ移動
  if post_str == matchstr(post_str, '\s*$', 0)  " 演算子挿入位置が行末の時
    let motion_cmd = 'normal $'     " 行末へ
  else
    let motion_cmd = 'normal 2wh'   " 演算子を飛ばして次の単語の1文字前へ
  endif
  execute motion_cmd
endfunction

374 名前:名無しさん@お腹いっぱい。 mailto:sage [03/05/18 00:27]
歩野?

375 名前:367 mailto:sage [03/05/18 15:16]
>>372-373
ありがとうございます。
後半ちょこっと変えてみました。
function! InsertSpaceOnBothSides(operator, isspace)
let pre_str = strpart(getline("."), 0, col(".")) " 行の前半
let post_str = strpart(getline("."), col(".")) " 行の後半
let move = 2

if a:isspace == 1
if strpart(pre_str, strlen(pre_str)-1, 1) != ' '
let pre_str = pre_str . ' ' " 前半最後にスペース挿入
let move = 3
endif
if strpart(post_str, 0, 1) != ' '
let post_str = ' ' . post_str " 後半最初にスペース挿入
endif
endif

call setline(".", pre_str . a:operator . post_str)

exec "normal " . move . "l"
endfunction



376 名前:あぼーん mailto:あぼーん [あぼーん]
あぼーん

377 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:koron at tka.att.ne.jp [03/05/25 00:08]
大手4紙のサイトにアクセスして、ヘッドラインをだけ抜き出し表示するスクリプトを
作りました。
www.kaoriya.net/testdir/headline.vim
curl, alice.vim, +iconvが必須です。つまりChaliceを使っている人ならば、プラグ
インのディレクトリにスクリプトを置くだけで簡単に導入できるでしょう。導入後は
:Headline Asahi
:Headline Yomiuri
:Headline Sankei
:Headline Mainichi
とすることで各紙のヘッドラインが表示されます。指定する名前はasaやyomiのように、
多少の揺らぎがあっても大丈夫です。今は4紙のみの対応ですが、拡張性を考慮して設
計したので、少しの労力で他のサイトにも応用できるでしょう。興味がある方は試して
ください。

378 名前:あぼーん mailto:あぼーん [あぼーん]
あぼーん

379 名前:名無しさん@お腹いっぱい。 mailto:sage [03/05/25 19:13]
うう、KoRoNさんに「Vimから出ない人」にされちゃうよー

nikkei.co.jpは「宿題」?

380 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [03/05/25 21:03]
>>379
是非書いてください。<nikkei.co.jp
日経はコメント使ってマーキングされているから
やりやすそうですねぇ。

381 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [03/05/26 17:20]
>>377
www.kaoriya.net/testdir/headline-20030526.tar.bz2
アップデートしました。更新点は以下のとおりです。
- プラグイン方式を導入して対応サイトの追加を行ない易く
- まっつんさんの協力によりスラッシュドットジャパンとYAHOO JAPANに対応

382 名前:あぼーん mailto:あぼーん [あぼーん]
あぼーん

383 名前:名無しさん@お腹いっぱい。 mailto:sage [03/05/30 14:04]
:%!lynx -dump www.nikkei.co.jp/

384 名前:名無しさん@お腹いっぱい。 mailto:sage [03/05/30 14:32]
www.kaoriya.net/testdir/headline-20030530.tar.bz2
日経とかいろいろ追加されている。

385 名前:名無しさん@お腹いっぱい。 mailto:sage [03/05/30 15:13]
scriptencoding cp932を headline/以下にも書いてほしいんだけど。



386 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [03/05/30 15:46]
>>385 了解。忘れてた。

387 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [03/05/31 00:18]
直しました。
www.kaoriya.net/testdir/headline-20030531.tar.bz2
scriptencoding cp932の追加とasahiのURL変更に対応

388 名前:名無しさん@お腹いっぱい。 [03/06/01 11:23]
info.vimでinfoをみてるときにhおすとヘルプ(?)がでてしまうんですが…

389 名前:名無しさん@お腹いっぱい。 mailto:sage [03/06/01 13:04]
>>388
hでは出ないぞ。c-hじゃないのか?

390 名前:名無しさん@お腹いっぱい。 mailto:sage [03/06/01 14:17]
>>388 でるけど、何か困るのか?

391 名前:名無しさん@お腹いっぱい。 mailto:sage [03/06/01 16:02]
hで左に移動できないじゃん。

392 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [03/06/02 11:27]
Headline更新
www.kaoriya.net/testdir/headline-20030602.tar.bz2
Slashdotが6月になっておかしくなったのを修正

393 名前:名無しさん@Vim%Chalice mailto:sage [03/06/03 02:11]
そろそろg:chalice_curl_optionsみたいなcurlオプションキボーン
防火壁ナノネン. . .

394 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [03/06/04 11:37]
>>393
www.kaoriya.net/testdir/headline-20030603.tar.bz2
対応しました。

395 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:koron at tka.att.ne.jp [03/06/17 19:39]
まっつんさんとのコラボーレーション。Exciteを使った日英翻訳です。
  www.kaoriya.net/testdir/excitetranslate.vim
範囲選択して:ExciteTranslation。なお翻訳結果は保証されません。



396 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [03/06/17 19:42]
>>395
> KORABORESHON with Mr. まっつん. It is Japanese-English translation using Excite.
コラボーレーションは無いよなぁ…(´・ω・`)

397 名前:名無しさん@お腹いっぱい。 mailto:sage [03/06/18 01:28]
>>395
ご苦労様です。
早速試してみたところ、なんかエラーが出ましたが翻訳出来ました。

出てきたエラーはこんな奴:
E177: 未知の関数 AL_echo
33 call AL_echo('Translating...', 'WarningMsg')

良く分からなかったのでコメントアウトしちゃいました。

多分、うちの設定が悪いかなんかのせいだと思うのですが、
一応使ってる奴のバージョンをご報告しておきます。
香り屋版 Windows用y gvim V6.1
適用済みパッチ: 1-474

398 名前:名無しさん@お腹いっぱい。 mailto:sage [03/06/18 01:46]
>>397
chaliceに同梱されてるalice.vimが無い模様。
  www.kaoriya.net/dist/chalice-1.8.019.tar.bz2
これを取ってきなされ。

chaliceがインスコされてないということはcurlとかも無さそうだな。
  www.kaoriya.net/dist/curl-7.10.4-win32-ssl.tar.bz2
たぶんこれも取ってくることになるだろう。

399 名前:名無しさん@お腹いっぱい。 mailto:sage [03/06/18 02:05]
>>398 訳が出てくるということはcurlは入っていると思われ

400 名前:397 mailto:sage [03/06/18 02:07]
>>398
ありがとうございます。
ご指摘通り、chaliceのバージョンが古いせいでした。
v1.7を使用していたのですが、
v1.8に上げたところ、エラーが出なくなりました。

お騒がせ致しました。

いや、それにしても、このプラグインは便利ですね。
感謝感謝です。

401 名前:名無しさん@お腹いっぱい。 mailto:sage [03/06/18 17:25]
calendar.vim : Calendar
calendar.vim 1.3t 2003-06-17
vim.sourceforge.net/scripts/script.php?script_id=52
更新されてます。

402 名前:名無しさん@お腹いっぱい。 mailto:sage [03/06/20 12:35]
VimTweak : The tweaking dll for GVim.exe.
vim.sourceforge.net/scripts/script.php?script_id=687
Initial upload
またまた、「まっつん」さんです。

403 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:koron at tka.att.ne.jp [03/06/20 12:56]
前からtweakが公開されれば、KaoriYa版からキャプション機能を削除しても良いかなぁって考えていたんです。
でもtweakでキャプションを消すとテキストエリアのウィンドウがズレることが発覚。どうしよ。

404 名前:名無しさん@お腹いっぱい。 mailto:sage [03/06/20 22:38]
ウィンドウがズレるのは、ちょっとやだなぁ。
てか、キャプションってなんですか?
Windows版で、透明度がうんたらっちゅーやつですか?

405 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [03/06/20 23:00]
>>404
Windowsではタイトルバーというのが分かりやすいでしょうか?。
香り屋版を使っているならば :set guioptions+=C してみれば一発でわかります。
なお戻すには :set guioptions-=C



406 名前:名無しさん@お腹いっぱい。 mailto:sage [03/06/21 22:18]
.gvimrcに、

syntax match Trailing "\s\+$"
highlight link Trailing Error

と書いたのですが、うまく反映されません。
なんかfiletypeとかsyntaxかがないときだけうまくいく感じです。

いつでも反映されるようにしたいのですが、
どこが間違っているんでしょうか。

407 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [03/06/21 22:45]
>>406
Vimの基本的な動作に対する理解が足りない、のが原因です。syntaxはその型のファ
イルを開いた際に毎回設定され、その設定開始前に必ず:syntax resetかそれ相当の
処理が行なわれています。そのため起動時に1度だけ実行される.gvimrcの設定はその
時点で上書されてしまい、効力を発揮することはありません。

そんなわけなのでsyntaxの設定が終わった後に、それらの設定が追加されるように
autocmdにSyntax等々を組み合わせてみるのが良いでしょう。以下はその例です。た
ぶんこのままでは思い通りに動かないので適当に修正してみてください。

function! s:TrailingError()
  syntax match Trailing "\s\+$"
  highlight link Trailing Error
endfunction
autocmd Syntax * call s:TrailingError()

408 名前:名無しさん@お腹いっぱい。 mailto:sage [03/06/21 23:30]
まぁそういうおまいも vi に対する理解があるとはとても
おもえんのだが。いいかげんやめたら?

409 名前:名無しさん@お腹いっぱい。 mailto:sage [03/06/21 23:42]
タイミングだからゆうぞ。はっきりあんた臭い。コードの占有意識高すぎ。
やることがいちいち SHIFT-JIS 臭い。 architecutre dependentily.
抱える人間としては最悪に近い。

あんたが vim を手放せば一年の停滞はあってもトータルでみな
幸せになると思う。そうおもったことはない?

410 名前:名無しさん@お腹いっぱい。 mailto:sage [03/06/22 00:08]
>>408
>>409
まぁまぁ、vimに貢献しているのは間違いないんだから。
ただ、KoRoNさんもこのスレだけじゃないんだけど、発言にトゲ
があることを自覚してないんだろうな。

411 名前:404 mailto:sage [03/06/22 00:09]
>>405
タイトルバー 消えたーー
なるほど、よう分かりました。
これで更に1行多く表示できる。 新たな発見だわぁ…

412 名前:名無しさん@お腹いっぱい。 mailto:sage [03/06/22 21:21]
KoRoN氏は別に嘘ついたりはしてないだろ。
時々ずばっと言った真実に、自分が痛いヤツだって
ことを指摘されたくせに、それを認めたくない厨ども
には嫌な人に見えるかもしれんが、それだけのこと。

現実を見ずに出る杭を打ちたいだけの馬鹿は氏んでいいよ。

413 名前:410 mailto:sage [03/06/23 01:48]
>>412
自分より頭のいい人間に、「おまえ馬鹿だな」と言われて
その人間をやな奴と思うのは普通だと思うが。
そのやりとりを聞いている周りの人間もイヤな気分になるのも
普通だと思うが。
そもそも、たかが掲示板で人を否定する必要はないはずだが。
いや、匿名の掲示板だからこそ否定することができるのか。
ここは、厨房お断りのスレなのか?
だったら、「vim用のくだ質」みたいなものを作らなきゃダメかな。

まぁ、そういう感情を理解せずに、論理的に肯定しようとする
お前こそいい人ぶろうとしているだけだろう。
自分ができるから当然ほかの奴もできるだろみたいに思っている
奴ほど最低なものはないからな。

414 名前:名無しさん@お腹いっぱい。 mailto:sage [03/06/23 01:50]
>>413
ちょっとやめて頂けませんか。見苦しい。

415 名前:名無しさん@お腹いっぱい。 mailto:sage [03/06/23 02:56]
>>413
どこが間違ってるか聞いたら、間違ってる箇所を指摘してくれただけでしょ。
言い方が気にくわない人がいるのはわかるけど、気にくわなくない人まで
否定する姿勢は見苦しいよ。

> そもそも、たかが掲示板で人を否定する必要はないはずだが。
そうですねぇ、本当に。



416 名前:名無しさん@お腹いっぱい。 [03/06/24 01:25]
>>408
なぜにvi?
KoRoNさんは、viに対する理解といってないが。。

417 名前:名無しさん@お腹いっぱい。 mailto:sage [03/06/27 18:29]
保存してないバッファでZoomWinを使うと、
バッファが/tmp/v012345/0になってしまう。

418 名前:名無しさん@お腹いっぱい。 mailto:sage [03/06/27 20:42]
VimSpeak : Speak selected text with MS Agent
vim.sourceforge.net/scripts/script.php?script_id=692
また新しいのが登録されました。

419 名前:名無しさん@お腹いっぱい。 mailto:sage [03/06/28 02:22]
>>407
もう一つ
応用的な(略
があれば原因は100%特定出来そうだなw

420 名前:名無しさん@Vim%Chalice mailto:sage [03/07/07 22:08]
同じキーに2つ以上mappingされている時に
片方だけをunmapすることは出来ますか?

421 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [03/07/07 22:16]
>>420
何を聞きたいのかイマイチわからないので想像で答えます。
:map <C-D> somestring1
:map <C-D> somestring2
このように続けて登録した時は後者が優先されるので、そもそも同じキーにマップす
るという概念が成り立ちません。次に
:map <C-D>1 somestring1
:map <C-D>2 somestring2
とした時には、これは別のマッピングとして登録されるのでそれぞれ
:unmap <C-D>1
:unmap <C-D>2
で別々に解除できます。但し「<C-D>で始まるマッピング全てを解除する」という方
法はちょっと思いつきません。

422 名前:420 mailto:sage [03/07/08 00:05]
>>421
分かりにくくてすいません。
ちゃんと具体例を書けば良かったですね。

<buffer> 有りでmappingされているものと、
<buffer> 無しで登録されているものの2つがダブって見えてただけでした。

例えば、
  nnoremap <C-N> somestring1
  nnoremap <buffer> <C-N> somestring2
の違いでした。ここで:nmapをすると、
    n <C-N> * :somestring1
    n <C-N> *@:somestring2
となります。@はbuffer localの印ですよね。

やりたいことは「どちらか片方を指定してunmapしたい」ということなのですが、
ヘルプを読んでunmapにも<buffer>を指定できることが分かりました。

<buffer>付きでmapしたら<buffer>付きでunmap、
そうでなければ<buffer>を付けずにunmapということで落ち着きました。

というわけで結局、自己解決しました。お騒がせしました。

423 名前:あぼーん mailto:あぼーん [あぼーん]
あぼーん

424 名前:名無しさん@お腹いっぱい。 mailto:sage [03/07/26 00:24]
vim-scriptでTimer(event)は無いのでしょうか?
無い場合、何か代替案はありますか?

425 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [03/07/26 00:28]
>>424
:help CursorHold
くらいでしょうか。単にウェイトさせるだけなら
:help :sleep
を参照してください。



426 名前:名無しさん@お腹いっぱい。 mailto:sage [03/07/26 01:14]
>>425
ありがとうございます。
どちらも知っている内容でした。

ということは定期的にTimerEventを発生させる方法は無いのですね...
perlなどのI/Fを使うしかないのかな?

427 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [03/07/26 10:41]
>>426
いや、それも無理です。if_perl主導で何かコトを起こすことができないんです。Perl
のスレッドを回してVIM::DoCommand使うとか、出来なくは無いんですがいろいろ不具合
があります。また私が直接確認したわけではありませんが、純粋にPerlスレッドとVim
の相性の問題も最近報告されました。

あとは外部プロセスからvim --remote-*を定期的に起動する、という方法も考えられま
すけど、これだと頻度の問題があるでしょう。

なんにしても用途に応じて別の解決法を模索した方が良いかもしれません。ユーザの操
作に割込んで、タイマーを含む何らかのイベントを起こすということはできません。そ
のようなことをしたければ半無限ループ内でgetchar()を使って、完全に入力をコント
ロールするしかないでしょう。

428 名前:名無しさん@お腹いっぱい。 mailto:sage [03/07/26 11:01]
>>427
> if_perl主導で何かコトを起こすことができないんです。
そうだったんですか...

> Perlのスレッドを回してVIM::DoCommand使うとか、出来なくは無いんですがいろいろ不具合
> があります。また私が直接確認したわけではありませんが、純粋にPerlスレッドとVim
> の相性の問題も最近報告されました。
ちなみにどのような不具合/相性問題なんでしょうか?

> ユーザの操作に割込んで、タイマーを含む何らかのイベントを起こすということはできません。
なるほど勉強になります。

> そのようなことをしたければ半無限ループ内でgetchar()を使って、完全に入力をコント
> ロールするしかないでしょう。
残念ながらキー入力等を受け取った時にしかできそうにないんですね。
放っておいても定期的にEventが来る。ということはできないのか...

429 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [03/07/26 11:12]
>>428
> ちなみにどのような不具合/相性問題なんでしょうか?
完全に再現条件を把握してないのですが、私が試した際にはVimを巻き込んでロック
したり落ちたりしました。

> 残念ながらキー入力等を受け取った時にしかできそうにないんですね。
getchar(0)とかすれば、キーが無くても即帰ってきます。

> 放っておいても定期的にEventが来る。ということはできないのか...
それができないからIRC on Vimとか諦めました。

430 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [03/08/01 20:24]
Headline更新しました。
www.kaoriya.net/testdir/headline-20030801.tar.bz2

431 名前:名無しさん@お腹いっぱい。 mailto:sage [03/08/01 21:23]
>>430
取扱説明書イイ!

432 名前:331 mailto:sage [03/08/01 22:00]
>>348
s/330/331/

まぁ、それはともかく。
別にどこにばれようと問題なしです。
でなきゃURL晒さないですってば。

433 名前:331 mailto:sage [03/08/01 22:00]
>>432
誤爆。スマソ

434 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [03/08/01 23:57]
>>431 取扱説明書、というより各ヘッドラインの寸評ですね。

私はZDNetとAsahiとYomiuriにZDNet、それにSlashdotJapanを主に見てます。

435 名前:名無しさん@お腹いっぱい。 mailto:sage [03/08/02 18:31]
plugin/headline/1101com.vim~
チルダがついてますが。



436 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [03/08/02 20:43]
作ろうかなぁと考えて、結局止めたからです。

437 名前:名無しさん@お腹いっぱい。 [03/08/06 14:08]
現在編集中のバッファ(ファイル)が未保存かどうかを
取得する関数などはありませんか??

438 名前:名無しさん@Vim%Chalice mailto:sage [03/08/06 14:12]
getbufvar()

439 名前:あぼーん mailto:あぼーん [あぼーん]
あぼーん

440 名前:名無しさん@お腹いっぱい。 mailto:sage [03/08/06 14:34]
:echo &modified

441 名前:437 [03/08/06 14:58]
&modifiedで状態を取得することが出来ました。
どうもありがとうございました。

442 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [03/08/07 20:42]
某スレで「foldはアウトラインとしては使いにくい」という至極納得な意見が出され
ていたので、なんとかしてみるスクリプトを書いてみました。
    www.kaoriya.net/testdir/folddigest.vim
foldが有効になっているテキストバッファで :call FoldDigest() を実行すると、
foldのダイジェストツリーが表示された新バッファができます。そのバッファの方で
注目したい項目の行で<CR>すると、テキストバッファの該当箇所へカーソルが飛びま
す。これで少し使いやすくなるでしょうか?。

443 名前:名無しさん@お腹いっぱい。 mailto:sage [03/08/08 00:04]
>>442
某スレから参りました。
はぁ、便利。

あのスレの影響で使い始めたんですけど良いエディタですね。
使っていて気持ちが良いというか、リズムがあるというか。
スクリプトはだいぶ先になると思いますがちょこちょこ勉強していこうと思います。

444 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [03/08/08 00:19]
>>443
動くようになったばかりなのでα版と考えてください。自動かそれに順ずる方法で
call FoldDigest()する仕組みとか、行がズレた時の処理とか、ウィンドウの取り回
しとか考えていますんで、もうちょっと使えるものになるでしょう。

ま、Vimに限りませんがイッペンにイロイロ覚えようとはせず、その時に必要なもの
を必要なだけ覚えていくのが良いんじゃないでしょうか。

445 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [03/08/08 23:31]
folddigest.vimをアップデートしました。
    www.kaoriya.net/testdir/folddigest.vim
使い方は>>442と一緒ですが…

> 行がズレた時の処理
主にコレについて修正しました。
    :let folddigest_options = "quickfix"
とすることで+quickfixを利用し、編集してズレたり消えたりしてもちゃんと飛べる
ようになります。ただし:makeや:grepと併用できなくなるので注意してください。

    :let folddigest_options = "flexnumwidth"
とすると、行番号の桁数が必要最小限になるので画面幅が狭いときには有効です。

オプションはカンマで接続して複数指定することができます。例:
    :let folddigest_options = "quickfix,flexnumwidth"
この場合、行番号は一切表示されません。スッキリです。



446 名前:名無しさん@お腹いっぱい。 mailto:sage [03/08/11 05:51]
>>418
うまく動かなかった・・
喋る前に消えたな・・


447 名前:名無しさん@お腹いっぱい。 mailto:sage [03/08/13 13:05]
>>412
ずばっと言った真実て…(激藁

448 名前:名無しさん@お腹いっぱい。 mailto:sage [03/08/14 09:07]
>>445
vim.sf.netではVim versionが6.0になっていましたが、6.1で試したらgetregがな
いとエラーが出ました。
vim.sourceforge.net/scripts/download_script.php?src_id=2230

449 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [03/08/14 09:15]
>>448
ありがとうございます。descriptionに追記しておきました。vim.orgに登録する時に
は5.0か6.0しか選べません。そのため6.2でも6.0としか表示できないのです。

450 名前:あぼーん mailto:あぼーん [あぼーん]
あぼーん

451 名前:名無しさん@お腹いっぱい。 [03/09/16 19:42]
Vine Linuxでgvim(日本語版)を使っていますが、
起動時に検索など全ての文字入力が日本語になっており、
いちいち日本語をオフにしなくてはいけません。

初期設定は日本語(IME)をオフにする方法をどなたか御存じでしょうか?

452 名前:名無しさん@お腹いっぱい。 mailto:sage [03/09/16 20:08]
>>451
h 'imi'
h 'ims'
スレ違い。
pc.2ch.net/test/read.cgi/unix/1058706125/

453 名前:名無しさん@お腹いっぱい。 mailto:sage [03/10/05 05:25]
昔は、は〜 むずかしそ〜だね〜と見ていたが、
今日からちょっとやってみた。
役に立ちそうな関数って何気にたくさんあるのね。

454 名前:名無しさん@お腹いっぱい。 [03/10/12 02:12]
すみません、前スレでfoldexprの連番処理についてカキコされたかたいらっしゃいますでしょうか?
もう一度functionを書いてくれるとありがたいのですが・・・。

1
1.1
1.1.1
2
2.2
2.2.2

みたいなのを
function! MyFoldFunc()
 let line = getline(v:lnum)
  if line =~ '\m^\s*[1234567890]'
   return '>1'
  elseif line =~ '\m^\s*[1-9]'
   return '>2'
  elseif line =~ '\m^\s*■'
   return '>3'
  else
   return '='
  endif
endfunction
set foldmethod=expr foldexpr=MyFoldFunc()

で処理したい!

455 名前:名無しさん@Vim%Chalice mailto:sage [03/10/12 11:50]
>>454
そのスクリプトが書き込まれたのはVim6スレのPart5ですね。書かれたのはまっつんさんですが、
    www.kaoriya.net/testdir/orderedlist_fold.vim
ココにコピーを置いておきました。細かいところはご自分で修正してください。



456 名前:名無しさん@Vim%Chalice ◆8XALICEsdk mailto:sage [03/10/12 11:51]
>>455 間違えて名無しさん+トリップ無しで書き込んでしまいました。

457 名前:名無しさん@お腹いっぱい。 [03/10/12 12:17]
>>455
ありがとうございます。

何度も甘えてすみませんが、連番が入ったテストテキストファイルをvimでオープンしてもfoldされません。
何か呪文があるのでしょうか?

458 名前:名無しさん@お腹いっぱい。 [03/10/12 12:26]
>>457
すみません、できました。逝ってきます。。

459 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [03/10/12 12:26]
>>457
オープンした後に :source orderedlist_fold.vim してもダメですか?

460 名前:名無しさん@お腹いっぱい。 [03/10/12 16:43]
>>459
あ、いえ、出来ました。とってもいい具合です。
ありがとうございます。今まで楽してきましたが、徐々にVimスクリプト勉強してみたいと思います。
ところで、このfoldはtaglistみたいに、vsplitしたwindowに表示とかはできないのでしょうか?

461 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [03/10/13 00:50]
>>460 >>442を参照してください。

462 名前:名無しさん@お腹いっぱい。 [03/10/13 11:17]
>>461
あ、どもです。
ところで、>>455のfoldexpr=の後には、複数の関数つけても駄目でしょうか?


463 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [03/10/13 13:56]
>>462 ダメです。

464 名前:名無しさん@お腹いっぱい。 [03/10/13 16:11]

すみません。>>454を質問したものですが、
以下のように、連番の下にさらに■が先頭にあったら、カレントの階層から一つもぐるようにするにはどうすればいいでしょうか。。
どうか初心者にお恵みを(-人-)。。


1. 折り畳み1
これは折り畳み1のテキスト

これは折り畳み1■のテキスト
2. 折り畳み2
これは折り畳み2のテキスト
2.1. 折り畳み2.1
これは折り畳み2.1のテキスト
これは折り畳み2.1のテキスト

これは折り畳み2.1■のテキスト
2.1.1. 折り畳み2.1.1
これは折り畳み2.1.1のテキスト
これは折り畳み2.1.1のテキスト

これは折り畳み2.1.1■のテキスト
2.1.2. 折り畳み2.1.2


465 名前:名無しさん@お腹いっぱい。 mailto:sage [03/10/18 11:15]
>>464
(´・ω・`) ショボーン



466 名前:名無しさん@Vim%Chalice [03/10/19 23:52]
script内で/やGでジャンプしてもjumplistに
履歴が残らないようにする方法ってあるのでしょうか?

scriptユーザが<C-I><C-O>でびっくりしないようにしたいのです。
できれば:Explorerがjumplistを汚さないように修正したいな〜と思いまして。

よろしくおながいします

467 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [03/10/20 00:13]
>>466
> script内で/やGでジャンプしてもjumplistに
/の代わりにsearch()、Gの代わりにexecute linenum使ってみてください。

468 名前:466@Vim%Chalice [03/10/20 00:25]
>>467 おお!早速のお返事ありがとうございます。

あと、もとの場所に戻りたいときhjklで何とかしようと思って↓みたいにしてます。
気分はma, `aなんですが。。。
もっとうまい方法は無いでしょうか?

function! s:Mark() "{{{2        jumplistを汚さないMark&Jump
    return s:Cons(line('.'), col('.'))
endfunction

function! s:Jump(marker) "{{{2  jumplistを汚さないMark&Jump
    let l:ml = s:Car(a:marker)
    let l:mc = s:Car(Cdr(a:marker))
    let l:cl = line('.')
    if l:ml < l:cl
        let l:vmotion = (l:cl - l:ml) . 'k'
    elseif
        let l:vmotion = (l:ml - l:cl) . 'j'
    else
        let l:vmotion = ''
    end
    exe 'norm 0' . l:vmotion . (l:mc-1) . 'l'
endfunction

469 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [03/10/20 00:56]
>>468 :help cursor()

470 名前:パパパッチ466@Vim%Chalice mailto:sage [03/10/20 01:19]
>>467 おおおお!またまたお返事ありがとうございます。一行になりますた。

    function! s:Jump(marker) "{{{2  jumplistを汚さないMark&Jump
        call cursor(s:Car(a:marker), s:Car(Cdr(a:marker)))
    endfunction

てゆーか、漏れの真の要求が分かりますた。
scriptの副作用をユーザに与えたくないのです。
具体的には、こいつらを一発で退避・復帰したいな〜と思ってるのです。
    :registers
    :jumps
    :marks
    undobuffer
undolevels=-1だとバッファが丸ごと消えちゃうから厳しいです。
:reと:marksはスクリプトで出来そうだけど、:juとundobufferは
VIM本体に機能を追加するしかないのかな。。。
:juやundobufferについては
    call これよりundobufferに追加しない()
    "バッファを編集
    call これよりundobufferに追加する()
みたいな機能でも充分なんだけど。
「よ〜し、パパパッチ当てちゃうぞー」とか思う人、居ません?
ちなみに、漏れは「よ〜し、パパC開発環境作っちゃうぞー」レベルだす。

#質問乱発で失礼しました >KoRoNさん

471 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [03/10/24 11:45]
>>470
> scriptの副作用をユーザに与えたくないのです。
Chaliceとかイロイロ作っている経験から言いますと…「独立したアプリケーション」
じゃなくて「エディタのスクリプト」なんですから、そういうことに神経使う手間と時
間で別の仕事に取り掛かったほうが良いでしょう。

472 名前:名無しさん@Vim%Chalice [03/10/31 01:02]
class ●● {
    ...

};
をfoldingしたい。
何か良い方法はありますか?

以下試したこと

fdm=markerは正規表現使えなさそうだし,
# class定義毎に予め {{{ }}} で囲んであればいいけどそんなのはまず有り得ないので
fdm=exprはregion指定ができない?(できるのか?)

fdm=syntax で syntax region start="^class" end="^};" しようとしたら
$VIMRUNTIME/syntax/cpp.vim の keyword cppStructure に含まれる"class"の方が優先度高くて
region の方で class が引っかかってくれなかった

cppStructure を clear するか、clear 後にcontains付きで再定義すればOKだったが…
# containedの場合は、region側で contains=cppStructure が必要

うーむ。一筋縄で行きそうにない…
foldtextとか使えば出来るのかなぁ?(使ったことないから分からない…)

473 名前:472@Vim%Chalice mailto:sage [03/10/31 01:03]
× clear 後にcontains付き
○ clear 後にcontained付き

474 名前:名無しさん@お腹いっぱい。 mailto:sage [03/10/31 08:16]
おれはそういうのはexprでやった。
www.vim.org/tips/tip.php?tip_id=523
setl foldexpr=FoldBrace()      
setl foldmethod=expr              
function! FoldBrace()          
    if getline(v:lnum) =~ '^class .*{$
    return '>1'                    
    endif                            
    if getline(v:lnum) =~ '^};$'      
    return '<1'                    
    endif                            
    return foldlevel(v:lnum-1)      
endfunction                        
~                                  

475 名前:名無しさん@お腹いっぱい。 [03/10/31 20:24]
検索をすると、次に起動したときに、その検索語が色づけされます。
これをキャンセルする、または色づけしないようにするにはどうしたらいいですか?



476 名前:名無しさん@お腹いっぱい。 mailto:sage [03/10/31 20:47]
>>475
pc.2ch.net/test/read.cgi/unix/1058706125/531-533
スレ違い?

477 名前:475 mailto:sage [03/10/31 22:25]
>>476
アリガトン

478 名前:472 mailto:sage [03/10/31 23:37]
>>474
d!
vim online に tips があったんだね

479 名前:472 mailto:sage [03/11/04 03:13]
>>474
試してみたんですが、returnする時に'<1'表記するとバグりません?
foldlevelが1のまま0に減らないんですよ…
'>1'の方は正しく1になっているようですが…

これらを'a1'と's1'に変えるとより分かり易く再現されます。
最初のs1の部分で減らないので、2回目にa1が実行される所でfoldlevelが更に増えて2になります。
ですが、2回目のs1の所まで来ると、一気に0まで戻ります。

vimのfold関係のバグかな?

480 名前:474 mailto:sage [03/11/04 07:55]
>>479
最後の
return foldlevel(v:lnum-1)      

return '='
にするとうまくいくかも。
helpにはfoldlevel(v:lnum-1)を使えって書いてあるけど、実際には
-1にしかならない。
シングルクウォートがぬけてました。
if getline(v:lnum) =~ '^class .*{$'

481 名前:名無しさん@お腹いっぱい。 mailto:age [03/11/13 21:19]
ChangeLogMemoをVimでお手軽に作れるようにとスクリプトに挑戦してみたけど
どーもうまくいかん。normalが未定義と言われ無効な表現と怒られる。
:Changelogでmemo.changelogってーファイルを開いて先頭に整形した
日付とかを入れたい。
どこがどう間違ってるか教えて。以下の関数とかは全部_vimrcに記述している。
ttp://apollo.u-gakugei.ac.jp/~yoshiki/clmemo/cltips.php
ここのは試したけど動かせなかった。

command! Changelog :call Chlog()

function Chlog()
execute ":e c:\Program Files\Vim\memo.changelog"
execute "normal gg0"
map ,d ggi<CR><CR><ESC>kki<C-R>=strftime(\"%c\")<CR>
\ nanasisan <nanasi@2ch.net><ESC>o<CR><TAB>*
endfunction

482 名前:481 mailto:age [03/11/14 21:13]
いろいろ調べてよーやく望む動作ができるようになったぞい
多分とても原始的な方法。ま、せっかく作ったんで書いとくよ。

" ,d : 時刻と署名を先頭に挿入
" ,n : エントリを追加
" どちらもChangeLogMemo用
map ,d ggi<CR><CR><ESC>kki<C-R>=strftime("%Y-%m-%d(%a) %X")<CR> nanashisan <nanashi@3ch.net><ESC>o<CR><TAB>*
map ,n ggo<CR><TAB>*

" :Changelog : clmemo.changelogファイルを開くコマンド
command! Changelog :call Changelog()

function Changelog()
let clmemo = $VIM . "\\clmemo.changelog"
execute ":e " . clmemo
let timestamp = getline("$")
let now = strftime("%Y-%m-%d")
if (timestamp ==? now)
execute "normal " . ",n"
else
execute "normal " . ",d"
endif
endfunction

483 名前:名無しさん@お腹いっぱい。 mailto:sage [03/11/27 16:47]
viつかいだして2年ぐらいになるし,
そろそろスクリプトも書けなあかんなぁと思ってこのスレを読んでみると,
簡単なことでも四苦八苦する様を見てemacsに移行しようかと
思ってしまった. lispは応用効くし.

484 名前:名無しさん@お腹いっぱい。 mailto:sage [03/11/27 17:13]
その程度の動機でemacsに移行できるならしとけ

485 名前:名無しさん@お腹いっぱい。 [03/12/02 21:58]
機能多すぎてさ。迷っちゃうわけよ。どの編集方法がもっとも最速か?少ないキータッチで実現できるか?
入力補完を使用した方が早いのか、画面ないの単語まで移動してコピって作成した方が早いのか?
迷ってるうちにマウスとキーボードでコピってるヤツの方がサクサクッと仕上げちゃってるわけよ。
編集そのものよりいかにエディタを使いこなすか?にずれちゃってるわけよ。ある程度学習すればリターン
の方が大きくなるであろうとは思うのだけれど、なかなかその道が見えてこないわけよ。半年以上はvi
使ってると思われるんだけど、いまだにその辺のエディタと対してスピード変わってねーんじゃねー?
っていう疑いをぬぐい切れぬわけよ。



486 名前:名無しさん@お腹いっぱい。 mailto:sage [03/12/02 22:04]
とりあえず、ここはvim6の、それもスクリプトを専門に扱うスレなので
ここはスレ違い。

vi 2nd
ttp://pc.2ch.net/test/read.cgi/unix/1020611467/
EmacsとViはどっちが★腐れたエディタ★か
ttp://pc.2ch.net/test/read.cgi/unix/987839931/
Vim vs Emacs (Editor War)
ttp://pc.2ch.net/test/read.cgi/unix/983911547/

487 名前:名無しさん@お腹いっぱい。 [03/12/03 13:03]
485 には vi 使いこなす能力がないっつーことだ

488 名前:名無しさん@お腹いっぱい。 mailto:sage [03/12/08 17:49]
初めて vim スクリプトを勉強するなら、 eval.txt と usr_41.txt のどっちの方を先に
読んだ方がいいですか?

行数が eval は 41 のほうの 3 倍もあるので、どんな感じなのかと。

489 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [03/12/08 18:19]
>>488
他のプログラミング言語に慣れているのであれば、リファレンスマニュアルである
eval.txtを必要なところだけかいつまんで読み、差分を理解するようにしたほうが近道
です。そうでないならusr_41.txtを読みながら1つ1つ順番に試した方が早く習得できる
でしょう。

490 名前:名無しさん@お腹いっぱい。 mailto:sage [03/12/08 20:42]
>>489
eval を斜め読みしてみます。

491 名前:名無しさん@お腹いっぱい。 mailto:sage [04/02/07 15:30]
このスレとか:help augroupとか色々なスクリプトとか読んでみたんだけど、
未だにaugroupが何の為にあるのか分からない。
これ使うとどんな嬉しい事があるの?

492 名前:名無しさん@お腹いっぱい。 mailto:sage [04/02/07 15:38]
スクリプトが自分でインスコしたautocmdだけを綺麗に消せる

493 名前:491 mailto:sage [04/02/07 18:52]
なるほど、そういう用途の為にあるのか。
教えてくれてどうもありがとう、>>492さん。

494 名前:名無しさん@お腹いっぱい。 mailto:sage [04/02/18 09:08]
vimスクリプト開発に便利なコマンドってどんなのがありますか?
とりあえず :source ってのは使えそうだけど、Emacs の
eval-last-sexp みたいな、カーソル行をコマンドとして解釈して
実行、みたいなのがあると便利なんですが。これ自体スクリプトで
書けそうだけど…。


495 名前:名無しさん@お腹いっぱい。 mailto:sage [04/02/18 09:21]
>>494 yy:<C-R>"



496 名前:493 mailto:sage [04/02/18 11:15]
>>495
おおっ、こりゃ便利です!! ありがとうございます。
ストローク数多くなるけど、^y$:<C-R>" でもイケますね。
(行末の ^M を省くため)


497 名前:名無しさん@お腹いっぱい。 mailto:sage [04/02/18 11:29]
お気軽スクリプト生成コマンドとしてはq:もあるね。
コマンドラインの履歴を編集してそのままスクリプトに出来る。

498 名前:名無しさん@お腹いっぱい。 mailto:sage [04/02/18 13:06]
ストローク数だけで言うなら Y:<C-R>"<C-H>

499 名前:493 mailto:sage [04/02/19 09:16]
>>497
ときどき :q と間違えて q: を押すと出てきてたのはこれだったのか…
vi初心者なもので…
これで望みどおりのことができそうです。ありがとうございます!


500 名前:名無しさん@お腹いっぱい。 mailto:sage [04/02/19 09:55]
そう言えば、ストローク数だけで言うなら Yq:P の方が短いな

501 名前:名無しさん@お腹いっぱい mailto:sage [04/02/20 21:20]
起動したスクリプトのディレクトリを取得しようとしています。
Chalice.vimをみると、
let s:scriptdir = expand('<sfile>:p:h')
というのがあったので、

let s:name = 'ScriptDir'
if exists("ScriptDir")
finish
endif

command -nargs=0 ScriptDir :call s:ScriptDir()

function! s:ScriptDir()
let s:scriptdir = ''
let s:scriptdir = expand('<sfile>:p:h')
echo "This script is here.: \"" . s:scriptdir ."\""
endfunction

などというのをでっち上げ、gvimを立ち上げて:ScriptDirしてみたのですが、ホームディレクトリが表示されます。
なんか大きく勘違いしていると思うのですが、どこで勘違いしているのかわかりません。
ご教示いただければ幸甚です。
よろしくお願いいたします。

502 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [04/02/20 21:45]
>>501
let s:scriptdir = expand('<sfile>:p:h')
command! -nargs=0 ScriptDir :call s:ScriptDir()
function! s:ScriptDir()
  echo "This script is here.: \"" . s:scriptdir ."\""
endfunction

expand('<sfile>:p:h') が評価されるタイミングが問題です。動作だけから判断する
と<sfile>はsource中にしか定義されないようなので、source時に確実に評価される
ように気をつける必要があります。

503 名前:名無しさん@お腹いっぱい mailto:sage [04/02/21 01:33]
なるほど。ありがとうございます。
思ったような動作をするようになりました。

504 名前:初心者 [04/02/26 07:50]
platexをですね、
:platex %
なんて打ったら、コンパイルしてくれるわ
dvioutを起動してくれるわ
なんていうふうにするには
どんなスクリプトをかけばよいのですか?

505 名前:名無しさん@お腹いっぱい。 mailto:sage [04/02/26 08:15]
>>504
ちょっと違うが。
nnoremap <buffer> <c-m> :!platex %<cr>:sil !xdvi %<.dvi >/dev/null 2>&1 &<cr>



506 名前:名無しさん@お腹いっぱい。 mailto:sage [04/03/03 09:56]
IRC (;´Д`)ハァハァ

507 名前:名無しさん@お腹いっぱい。 mailto:sage [04/03/07 15:29]
VimIRC.vim : An IRC client script
vim.sourceforge.net/scripts/script.php?script_id=931


508 名前:名無しさん@お腹いっぱい。 mailto:sage [04/03/08 13:50]
だれか #Vim つくって...

509 名前:名無しさん@お腹いっぱい。 mailto:sage [04/03/08 16:04]
>>508
splitしてるでしょ。確かグローバルには#vimがあったはず。

510 名前:名無しさん@お腹いっぱい。 mailto:sage [04/03/08 21:03]
>>508
どこのネットワークだよ。
WIDE系?freenode?2ch?

511 名前:名無しさん@お腹いっぱい。 [04/04/17 20:53]
age

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