1 名前:名無しさん@お腹いっぱい。 [01/12/17 12:15] みんなでスクリプトを覚えよう
2 名前:1 [01/12/17 12:22] まずはHelloWorldから。 適当なファイル hello.vim とかに echo "HelloWorld" とだけ書いて :source hello.vim で実行 HelloWorld が表示されれば大成功!
3 名前:名無しさん@お腹いっぱい。 mailto:sage [01/12/17 14:39] もう終わりかよ! とりあえず vim.sourceforge.net/scripts/ 位書いとけ。
4 名前:名無しさん@Vim%Chalice [01/12/17 14:53] >>3 を見に行った。 emacs時代にこよなく愛していたlatex支援のauctexが vim6に対応してた。 泣いた。ただただ泣いた。 さて、使ってみるか…
5 名前:KoRoN@Vim%Chalice ◆ALICEsdk mailto:koron@tka.att.ne.jp [01/12/17 15:16] >>1 なんかあっという間に叩かれ荒される危険が伴ってますが…スレ建て記念にマメ知識 を紹介しておきます。 ■変数代入 実行例: :let foo = "Hello World" :echo foo Hello World :let foo = 5 :let bar = "2" :echo "foo+bar=" . (foo + bar) foo+bar=7 スクリプトの中では例のように変数に値を代入できます。代入できるのは整数値もし くは文字列で、Perlのようにコンテキストに応じて相互に自動変換されます。変数名 は必ず英小文字で始まり、英小文字、アンダーバー(_)、数字を組み合わせて構成し ます。本当は他に幾つかの文字が使えます。"b:"、"s:"、"v:"、"&"、"$"等の文字で 始まる変数には特別な意味があります。しかし今はまだ覚えなくて良いでしょう。
6 名前:1 [01/12/17 21:48] なるほどー、なんとなく数値文字列から数値変換はstrtol関数使ってる だけなのかなって気がするけど、実際のソースは見たことないからわからん とりあえず :echo "0xff"==255 1 となった。真は1らしい。 で、& はオプション変数に付けて $ は環境変数に付けるらしい(:help variableより) :set number :echo &number 1 :echo $shell /bin/bash :echo $SHELL /bin/bash 大小文字は問わないと。
7 名前:ヘッポコ訳者 ◆xBY/hgW2 [01/12/17 22:16] 41.1 イントロ まずは vimrc から始めよーかね.Vim は起動時にこいつを読み込んで実行すん のよ.んでもって,vimrc では変数は好きなように設定出来るし,好きなコ マンドも実行出来る. ちなみに syntax ファイルも vim script なんだな,コレが. > As are files that set options for a specific file type. (コレはどー訳すべか? 「特定のファイルタイプに応じた設定をするよーなファイルだぜ」 でいいのかな?) んでもって,複雑なマクロは vim script の別ファイルにも出来るのさ. > You can think of other uses yourself. (「あとは色々あるけど皆でテキトーにやってくれ」ぐらいの意味か?) よーし,そんじゃシンプルなのから始めるぜ! :let i = 1 :while i < 5 : echo "count is" i : let i = i + 1 :endwhile # おっと,ここで注意だ.実は行頭の ":"コマンド入力の時はいるんだけど, # Vim script のファイルの中ではいらねーからな.まーここでは目立って分か # りやすくするためにも行頭に":"は入れとくことにすっからヨロピク.
8 名前:ヘッポコ訳者 ◆xBY/hgW2 [01/12/17 22:16] ":let" ってのは変数に値を代入する命令ってヤツよ.ま,一般的には :let {variable} = {expression} ってな感じで使うと思ってくれ.んだから,上の例(の一行目)の場合は変数 名(variable)が "i" で,式(expression)はただの値である 1 ってわけさ. ":while" コマンドはループの開始な.フツーは :while {condition} : {statements} :endwhile こんな感じで使うぞ.":endwhile" までにある文(statements)は条件 (condition) が真の間はずっと実行されるからな.上の例だと条件は "i < 5" ってヤツな.これは i が 5 より小さい時は真になんのよ. んでもって ":echo" コマンドは引数を表示するコマンドね.上の例だと, "cout is" と,変数 i の値が表示されるってわけ. んだから最初は i の値は 1 だから, count is 1 って表示されるってなもんよ.んで,その後にはまた別の ":let i=" ってコマ ンドが出てきてるよな.んで右辺には "i + 1" っつー式が使われてる.これは 変数 i の値に 1 を足した値を i に代入するって事な. んだもんで,上の例の最終的な出力はこーなる. count is 1 count is 2 count is 3 count is 4 # 間違って無限ループにハマっちまったら CTRL-C で中止出来るからビビら # んよーに.(Win では CTRL+Break な)
9 名前:ヘッポコ訳者 ◆xBY/hgW2 mailto:sage [01/12/17 22:17] <<<三種類の数値>>> 数値は10進数か,8進数,もしくは16 進数が使えるぞ.16進数は頭に "0x" か "0X" を付けるべし.たとえば "0x1f" っつったら10進数の 31 な.んで, 8進数は頭に "0" を付けるべし.つまり "017" で10進数の 15 ってことな. # 十進数を使ってるつもりなら頭に "0" なんか付けるんじゃねーぞ. Vim # には8進数だと思われちまうからな. んで,":echo" コマンドの出力は10進数になるからな.だから例えば :echo 0x7f 036 ってやったら 127 30 って表示される. そんで,数値はマイナス記号で負の値になるぞ.8進数でも16進数でも一緒な. さらにマイナス記号は引き算にもなるぞ. :echo 0x7f -036 ってやったら 97 って表示される.上の例と比べて見とけや. ちなみに式に含まれてる空白は無視されるぞ.ま,各々を分割して読みやすく するために空白入れるのはいい事だけどな.例えば負の数と間違わんよーに マイナス記号と後に続く数字の間にスペース入れるとかそーゆー事な. :echo 0x7f - 036 って事.
10 名前:ヘッポコ訳者 ◆xBY/hgW2 mailto:sage [01/12/17 22:19] とりあえず help の Vim Script とかゆーところをボチボチ ウソ日本語訳でもかまそーかなと. 全角スペースでインデントしてあるのは良く分かんねーところ だから適当にツッコミよろしく. 今日はここまで.
11 名前:KoRoN@Vim%Chalice ◆ALICEsdk mailto:koron@tka.att.ne.jp [01/12/17 22:39] >>10 お疲れ様です。折角なのでもうちょっと入門用の情報を。 5.7のeval.txt(リファレンスマニュアルのほう。ちなみに>>7-9 は6.0で追加された ユーザマニュアルの翻訳ですね)は日本語訳が次のURLにあるので参考にしてくださ い。6.0による主な仕様の追加はスクリプトローカルな名前(s:で始まる名前)と関数 群なので、まずは5.7リファレンスマニュアルと>>7-9 (ユーザマニュアル)の日本語訳 を読んで理解することから始めるのが吉でしょう。 ixeris.bios.ics.saitama-u.ac.jp/~noiz/gvim/text/eval.txt # 本当は自分で訳すのが一番身に付くんですけど、既にあるショートカットは利用し # たほうが近道ですよね。
12 名前:1 mailto:sage [01/12/17 23:51] :echo 1 2 1 2 :echo 1 -2 -1 なんで - をつけると演算されるんだー :echo 1 +2 3 ま、そういうもんか。 :echo 1/0 2147483647 あ、0で割れた!
13 名前:名無しさん@お腹いっぱい。 mailto:sage [01/12/18 00:26] >>10 ヘッポコ訳者 さん それ英語でよんだけど、もう一度勉強させてもらいます。サンクス >>KoRoNさん eval.txt も参考にさせていただきます。 いいスレ
14 名前:ヘッポコ訳者 ◆xBY/hgW2 mailto:sage [01/12/18 00:41] 口調が v(^.^)v みたいでウザいとかそーゆーレスを期待(?) してたんだが・・・ # まぁヤツほどアレぢゃないけど > 1 echo 1 "-2" とかってやらんとダメみたいね.
15 名前:ヘッポコ訳者 ◆xBY/hgW2 mailto:sage [01/12/18 18:40] 41.2 変数 変数名は ASCII 文字と数字とアンダースコアのみで作ってくれよ. でも,数字から始めるのはダメだからな. counter _aap3 very_long_variable_name_with_dashes FuncLength LENGTH ってな感じであれば OK. "foo+bar" とか "6var" なんつーのはダメだからな. んで,こーやって宣言した変数はグローバル扱いになるぞ.その時に宣言さ れてる変数を見たい時は :let ってやれば全部ダーッと表示されるぜぃ.グローバル変数はどこでも使える 変数ってヤツね.んだから, "count" っつー変数がある script ファイルの中 で使われてたら,他のファイルからでもその "count" は使えるって事. これってとにかく混乱するし,最悪の問題にブチ当たる事もあるんだよねぇ. そんなわけで,変数の頭に "s:" を付けるとその script ファイル内のみで しか使えない変数になるからこれをやると混乱を避けられるぞ.たとえば, :let s:count = 1 :while s:count < 5 : source other.vim : let s:count = s:count + 1 :endwhile ってコードが,あるscript ファイルにあったとすると, "s:count" はファ イルローカルの変数になるから,"other.vim" とかっていう別の script ファ イルを読んじゃったりしても,この変数が変更されちゃったりする心配はご 無用ってワケさ.もしその "other.vim" って script ファイルが "s:count" って変数を使っていたって大丈夫,それは名前は一緒かもしんないけど, "other.vim" の中だけでしか使われない全く別の変数なんだ.もっと詳しく 知りたければ |script-variable| の頁でも見てくれや. ちなみにもっと色々な種類の変数があるんで,詳しくは|internal-variables| を見てくれ.まぁ良く使うのだけ簡単に並べとくと, b:name バッファローカルな変数 w:name ウィンドウローカルな変数 g:name (関数内で宣言されてても)グローバルな変数 v:name Vim で最初っから用意されてる変数 ってなぐらいかな.
16 名前:ヘッポコ訳者 ◆xBY/hgW2 mailto:sage [01/12/18 18:45] とりあえず今はこんだけ. 夜暇が出来たら続きを出すカモ. ところでウィンドウローカルって何だ? っつーか Vim でのウィンドウって何だべさ? 文脈からするとバッファとは当然違うんだよな・・・ バッファが表示されてる時のみ有効とかそんな感じ?全然違う? help window ってやってもとんちんかんなのしか出て来ない・・・ # 何故ヲレの文章は階段状になっているのだろう・・・・・・・・・・・・
17 名前:KoRoN@Vim%Chalice mailto:koron@tka.att.ne.jp [01/12/18 19:19] >>16 一つのファイル(バッファ)を編集中に:spすると分かれるのがVimのウィンドウです。 それぞれのウィンドウで:echo winnr()すると異なる番号が帰ってきます。
18 名前:ヘッポコ訳者 ◆xBY/hgW2 mailto:sage [01/12/18 19:57] >>KoRoN 殿 あー,なるほど.そーゆー事ですか.そっかそっか. いつもウィンドウ分割(ってこの言葉使ってるぢゃん(藁) する時って 複数のファイル開く時 ばっかりだから気付かなかったでござるよ. なるほど,なるほど.ウィンドウサイズとかに使うんですな. お教えを賜わりましてありがとう存じ奉りまする.
19 名前:ヘッポコ訳者 ◆xBY/hgW2 mailto:sage [01/12/18 21:32] <<<変数の削除>>> 変数はメモリを食ってて,":let" コマンドで一覧を見る事が出来るぜぃ. で,変数を削除したい時には ":unlet" コマンドを使うべし. :unlet s:count こんな感じ.この場合はファイルローカルな変数 "s:count" を削除して メモリを解放するってわけだ.変数が存在すんのかしねぇのか分からん けど,無い時でもエラーメッセージが出るのはウザいから嫌って場合は "!" を後にくっつければいいだけ. :unlet! s:count つまりこーゆー事ね.んで, script が終了した後でも,ローカル変数が自 動的に削除されるって事は無くって,次にその script が読み込まれた時に, 前に使った時と同じままの値になるからな.まぁつまり, :if !exists("s:call_count") : let s:call_count = 0 :endif :let s:call_count = s:call_count + 1 :echo "called" s:call_count "times" こんな事が出来るってわけだ."exists()" 関数は変数が定義されてるかどーか を調べる関数な.引数には調べたい変数の名前(の文字列)を与えてやりゃー いい.変数そのものを与えちゃダメだぞ.もし, :if !exists(s:call_count) なんてやっちまったら s:call_count という変数に「格納されてる値」が調 べたい変数の名前として適用されちまうからな.これはやりたい事とは違う だろ. 感嘆符 "!" は値を反転(否定)するぞ.つまり値が真だったら偽にするし,値が 偽だったんなら真にするってわけだ.まぁつまり"not"って読めゃいいんだよ. んだから, "if !exists()" っつーのは "if not exists()" ってわけ. Vim で真っつったらゼロ以外の事だぞ.んでもってゼロだけが偽な.
20 名前:名無しさん@お腹いっぱい。 mailto:sage [01/12/18 22:27] :let で全変数が見れるんかー。デバッグ時に便利そう。 :let hoge だと hoge だけの値が表示されると。 表示に # がついていたら数値らしい。 :let hoge=123 :let hoge hoge #123 :let hoge="123" :let hoge hoge 123
21 名前:ヘッポコ訳者 ◆xBY/hgW2 mailto:sage [01/12/19 21:23] <<<文字列変数と定数>>> 今んとこまだ変数には数字しか使ってねーんだけど,文字列も使えるんだ ぜぃ. Vim で使える変数ってのは数字と文字列しか無ぇんだよ.どっちの型に なるのかは ":let" で変数に代入する毎に,その場その場で決まるからな. 文字列を変数にブチ込みたい時は文字列定数を使うんだぞ.まぁ文字列定数っつっても 二種類あって,一個はダブルクウォートで括るやつで, :let name = "giko" :echo name giko ってな感じな.んで,文字列中にダブルクウォートそのものを含みたい時は ダブルクウォートの前にバックスラッシュを置くべし.つまり, :let name = "\"mona\"" :echo name "mona" こーゆー事.んで,バックスラッシュがメンドい場合は文字列をシングルク ウォートで括ればよし. :let name = '"KoRoN"' :echo name "KoRoN" んで,シングルクウォートに挟まれた文字列は全部そのまんま文字通り扱わ れるぞ.って事はシングルクウォートその物を含む事は出来ないってことだ. もちろんバックスラッシュもそのまんま扱われるから,直後の文字を変換す る為には使えねーからな. ダブルクウォートに挟まれた文字列は特殊文字(special characters)が使え るぞ.まーちっとばかり例を挙げてやると, \t <Tab> \n <NL>, 改行 \r <CR>, <Enter> (復帰) \e <Esc> \b <BS>, バックスペース \" " \\ \, バックスラッシュ \<Esc> <Esc> \<C-W> CTRL-W 最後の二つはただの例だぞ. "\<name>" ってやったら "name" っつー特殊キー として扱われるって事な. 文字列中の特殊文字の全リストは |expr-quote| にあるぞ.
22 名前:KoRoN@Vim%Chalice mailto:koron@tka.att.ne.jp [01/12/20 16:55] >>21 うわ。気づかなかったけど何気に > :let name = "\"mona\"" > :let name = '"KoRoN"' とかなってるし!!。見過ごしてた(゜Д゜)
23 名前:名無しさん@Vim%Chalice [01/12/20 17:42] vimメーラに期待age
24 名前:ヘッポコ訳者 ◆xBY/hgW2 mailto:sage [01/12/20 22:47] >> KoRoN 殿 見つかってしまいましたか(藁 まぁ敬意を込めてのお遊びなんでお許しを.他意はありませぬ. 今日は忙しいから訳無し.スマソ.
25 名前:ヘッポコ訳者 ◆xBY/hgW2 mailto:sage [01/12/22 00:32] 41.3 式 (Expressions) Vimは大胆かつシンプルな式の扱いが出来るよーになってるぜぃ.定義について は |expression-syntax| を見ろや.まーとりあえず一般的な事だけここでは 教えといてやろう. これまでに言ってきた数字や文字列,変数っつーのはそれ自体で式になって るぞ.んだから,式が要求されるところにはいつでも数字や文字列や変数が 使えるってわけだ.他の式の中で使われる基本的なものっつったら, $NAME 環境変数 &name オプション @r レジスタ ってな感じかな. 例) :echo "The value of 'tabstop' is" &ts :echo "Your home directory is" $HOME :if @a > 5 &option っつー形は,オプションをまずどっかに保存しといて,それからそのオプ ションを新しい値に設定した後に何かしてから,先に保存しておいた値を元に戻す 時なんかに使われるぞ. 例) :let save_ic = &ic :set noic :/The Start/,$delete :let &ic = save_ic
26 名前:ヘッポコ訳者 ◆xBY/hgW2 mailto:sage [01/12/22 00:33] 今日はこれだけ. 忘年会シーズンは酔っぱらってる時はやらない方がいいカモ・・・
27 名前:名無しさん@お腹いっぱい。 [01/12/22 02:20] Vim6スクリプトでアウトラインプロセッサを作る事は出来ますか? 行編集の vi の系列だから、そういうのは得意そうな気がするのですが、 如何でしょう? もし既に在るならば、素の vi から乗り換えたいな。
28 名前:名無しさん@お腹いっぱい。 [01/12/22 02:48] vimのコマンドにエイリアスみたいのをつけたいんだけど。 例えば、 :aiueo ってやったら :se ts=2 sw=2 sts=2 et のかわりになるみたいな。 あと、よくvimでかかれたテキストファイルに vim:se ts=2 sw=2 sts=2 et とかあるけどあれって意味あるの?
29 名前:名無しさん@お腹いっぱい。 [01/12/22 05:51] >>28 その書き方は知らない。 C++とかJavaのソースなんかでは // vi:ts=4 sw=4 number: とか書いたりはするけど(これはちゃんと効く)
30 名前:KoRoN@Vim%Chalice ◆ALICEsdk mailto:koron@tka.att.ne.jp [01/12/22 08:46] ここはスクリプトの勉強スレなので一連(>>27-28 )の質問がココにふさわしいかは疑 問ですが、折角ですから答えられる部分は答えてしまいましょう。 ■ ◆Vim6 2スレ pc.2ch.net/test/read.cgi/unix/1006246205/l50 >>27 完全なアウトラインプロセッサとは言えないのですが、folding(折畳み)機能を使え ばスクリプトを駆使しなくてもそれに近いことが実現可能です。foldingというのは テキスト中の指定された範囲を折畳んで隠す機能です。例えばプログラミングであれ ば特定のブロックを隠したり、関数の実装を隠したりできます。またちょっと毛色は 違いますがテンプレートコンパイラを利用する方法も考えられるかもしれません。 ■ テンプレートコンパイラの紹介 www.kaoriya.net/bbs/bbs.cgi?article=1238&bbs=bbs >>28 :help commandしてみて下さい。自分で任意のコマンドを定義することができます。 但しコマンド名は英大文字で始まる必要があります。 例: command! Aiueo set ts=2 sw=2 sts=2 et > あと、よくvimでかかれたテキストファイルに > vim:se ts=2 sw=2 sts=2 et > とかあるけどあれって意味あるの? もちろんあります。modelineといって(詳細は:help modelineを参照)これが書かれた ファイルを開いた時に、これらのオプションが自動的に設定されます。スクリプトが 実行されるわけではないので注意してください。modelineを書ける範囲はファイルの 先頭と末尾のそれぞれ5行(この5行はオプション'modelines'により変更可能)です。 例: *.cの先頭に /* vim:set ts=8 tw=4 sw=4 tw=0: */ と書く もちろんファイルタイプに拠らず*.txtでもなんでも書いてあれば有効になります。
31 名前:名無しさん@お腹いっぱい。 mailto:sage [01/12/22 13:57] modeline と fold ってけっこう組み合わせて使うよね。 KoRoN さんのサイトのソースなんか参考になるかもね。
32 名前:名無しさん@お腹いっぱい。 [01/12/22 20:42] うわ、マジココイイわ。そしてマジコココイイわ。要するにイイ。
33 名前:1 [01/12/22 23:11] ほんとに初めてVimスクリプトをお勉強しょうとおもーとる人の為に書いとくけんな。 スクリプト読んどって解らん命令出てきたら何でもその上で K を入力じゃ 親切なマニュアルが飛び出てくるけん。んで閉じるのは Ctrl+wc 英語じゃわけわからんとかいう場合はこっち ixeris.bios.ics.saitama-u.ac.jp/~noiz/gvim/ から日本語化してくれとるマニュアルを落として runtime/doc にコピーしときゃーええ。 それにしても日本語化を進めてくれとる人達には大感謝じゃなぁ。 # 酔っていると方言になります。
34 名前:ヘッポコ訳者 ◆xBY/hgW2 mailto:sage [01/12/22 23:18] <<<演算>>> んで,まぁ上で挙げたよーな要素が結合とか出来たら面白い事が出来るでしょ. まずは数値の演算から行ってみよー!! a + b 加算 a - b 減算 a * b 積算 a / b 除算 a % b 剰余 まぁ優先順位は普通の算数と同じだぞ.例を挙げると, :echo 10 + 5 * 2 20 って事な(足し算よりかけ算の方が優先度が高い). んでジョーシキ通り,括弧を使えば優先度は変えられるぞ.つまり, :echo (10 + 5) * 2 30 って事ね. 文字列は "." で結合出来るぜぃ.だから, :echo "Vim" . "Manse-" VimManse- ってなもんよ. ":echo" コマンドは複数の引数を受け取ると,それぞれをスペースで区切っ て表示するんだけど,上の例は全部引数は一個の式だったからスペースで区 切られて表示する事は無いんだ. C 言語のパクリなんだけど,3項演算子 a ? b : c も式として使えるぞ.もし "a" が真だったら "b" が使われて,そうでなかっ たら "c" が使われる.つまり, :let i = 4 :echo i > 5 ? "i is big" : "i is small" i is small ってな感じで使えるわけだ.んで,3つの各パートは必ず最初に評価されるから な.つまり, (a) ? (b) : (c) ってなってると思えばいいわけよ.
35 名前:ヘッポコ訳者 ◆xBY/hgW2 mailto:sage [01/12/22 23:20] KoRoN 殿や mattn 殿に続けぇ〜!!!! #マダミチハトオイナ・・・ 今日もこんだけ.なんかアンマリススマナイナ
36 名前:名無しさん@お腹いっぱい。 mailto:sage [01/12/23 01:10] >>33 >日本語化してくれとるマニュアルを落として runtime/doc にコピーしときゃーええ。 日本語のヘルプすごく助かるけど、Version 6.0 で追加された項目が見れなくなっちゃうんだよね。 ウィンドウの縦分割について調べるときにはまった。
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 名前:1 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の設定を変更した方が 早いかも知れません。