2ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

Vim6スクリプトお勉強スレ

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

2 :1:01/12/17 12:22
まずはHelloWorldから。
適当なファイル hello.vim とかに
echo "HelloWorld"
とだけ書いて :source hello.vim で実行
HelloWorld が表示されれば大成功!

3 :名無しさん@お腹いっぱい。:01/12/17 14:39
もう終わりかよ!
とりあえず
http://vim.sourceforge.net/scripts/
位書いとけ。

4 :名無しさん@Vim%Chalice:01/12/17 14:53
>>3 を見に行った。
emacs時代にこよなく愛していたlatex支援のauctexが
vim6に対応してた。
泣いた。ただただ泣いた。
さて、使ってみるか…

5 :KoRoN@Vim%Chalice ◆ALICEsdk :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 :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 :01/12/17 22:19
とりあえず help の Vim Script とかゆーところをボチボチ
ウソ日本語訳でもかまそーかなと.
全角スペースでインデントしてあるのは良く分かんねーところ
だから適当にツッコミよろしく.
今日はここまで.

11 :KoRoN@Vim%Chalice ◆ALICEsdk :01/12/17 22:39
>>10 お疲れ様です。折角なのでもうちょっと入門用の情報を。

5.7のeval.txt(リファレンスマニュアルのほう。ちなみに>>7-9は6.0で追加された
ユーザマニュアルの翻訳ですね)は日本語訳が次のURLにあるので参考にしてくださ
い。6.0による主な仕様の追加はスクリプトローカルな名前(s:で始まる名前)と関数
群なので、まずは5.7リファレンスマニュアルと>>7-9(ユーザマニュアル)の日本語訳
を読んで理解することから始めるのが吉でしょう。

 http://ixeris.bios.ics.saitama-u.ac.jp/~noiz/gvim/text/eval.txt

# 本当は自分で訳すのが一番身に付くんですけど、既にあるショートカットは利用し
# たほうが近道ですよね。

12 :1:01/12/17 23:51
:echo 1 2
1 2
:echo 1 -2
-1
なんで - をつけると演算されるんだー
:echo 1 +2
3
ま、そういうもんか。

:echo 1/0
2147483647
あ、0で割れた!

13 :名無しさん@お腹いっぱい。:01/12/18 00:26
>>10
ヘッポコ訳者 さん
それ英語でよんだけど、もう一度勉強させてもらいます。サンクス
>>KoRoNさん
eval.txt も参考にさせていただきます。

いいスレ

14 :ヘッポコ訳者 ◆xBY/hgW2 :01/12/18 00:41
口調が v(^.^)v みたいでウザいとかそーゆーレスを期待(?)
してたんだが・・・
# まぁヤツほどアレぢゃないけど

> 1
echo 1 "-2" とかってやらんとダメみたいね.

15 :ヘッポコ訳者 ◆xBY/hgW2 :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 :01/12/18 18:45
とりあえず今はこんだけ.
夜暇が出来たら続きを出すカモ.
ところでウィンドウローカルって何だ?
っつーか Vim でのウィンドウって何だべさ?
文脈からするとバッファとは当然違うんだよな・・・
バッファが表示されてる時のみ有効とかそんな感じ?全然違う?
help window ってやってもとんちんかんなのしか出て来ない・・・
# 何故ヲレの文章は階段状になっているのだろう・・・・・・・・・・・・

17 :KoRoN@Vim%Chalice:01/12/18 19:19
>>16
一つのファイル(バッファ)を編集中に:spすると分かれるのがVimのウィンドウです。
それぞれのウィンドウで:echo winnr()すると異なる番号が帰ってきます。

18 :ヘッポコ訳者 ◆xBY/hgW2 :01/12/18 19:57
>>KoRoN 殿
あー,なるほど.そーゆー事ですか.そっかそっか.
いつもウィンドウ分割(ってこの言葉使ってるぢゃん(藁) する時って
複数のファイル開く時
ばっかりだから気付かなかったでござるよ.
なるほど,なるほど.ウィンドウサイズとかに使うんですな.
お教えを賜わりましてありがとう存じ奉りまする.

19 :ヘッポコ訳者 ◆xBY/hgW2 :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 :名無しさん@お腹いっぱい。: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 :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: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 :01/12/20 22:47
>> KoRoN 殿
見つかってしまいましたか(藁
まぁ敬意を込めてのお遊びなんでお許しを.他意はありませぬ.

今日は忙しいから訳無し.スマソ.

25 :ヘッポコ訳者 ◆xBY/hgW2 :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 :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 :01/12/22 08:46
ここはスクリプトの勉強スレなので一連(>>27-28)の質問がココにふさわしいかは疑
問ですが、折角ですから答えられる部分は答えてしまいましょう。
■ ◆Vim6 2スレ
 http://pc.2ch.net/test/read.cgi/unix/1006246205/l50


>>27
完全なアウトラインプロセッサとは言えないのですが、folding(折畳み)機能を使え
ばスクリプトを駆使しなくてもそれに近いことが実現可能です。foldingというのは
テキスト中の指定された範囲を折畳んで隠す機能です。例えばプログラミングであれ
ば特定のブロックを隠したり、関数の実装を隠したりできます。またちょっと毛色は
違いますがテンプレートコンパイラを利用する方法も考えられるかもしれません。
■ テンプレートコンパイラの紹介
 http://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 :名無しさん@お腹いっぱい。: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

英語じゃわけわからんとかいう場合はこっち
http://ixeris.bios.ics.saitama-u.ac.jp/~noiz/gvim/
から日本語化してくれとるマニュアルを落として runtime/doc にコピーしときゃーええ。

それにしても日本語化を進めてくれとる人達には大感謝じゃなぁ。

# 酔っていると方言になります。

34 :ヘッポコ訳者 ◆xBY/hgW2 :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 :01/12/22 23:20
KoRoN 殿や mattn 殿に続けぇ〜!!!!
#マダミチハトオイナ・・・

今日もこんだけ.なんかアンマリススマナイナ

36 :名無しさん@お腹いっぱい。: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 :01/12/23 10:20
>>37
難しい質問です。elispはemacsのベースとして存在しているのでまったく同様に捉え
られてしまうと間違いなのですが、エディタを制御したり内部の関数を利用できると
いう表面的な意味においては同じと考えても差し支えないでしょう。lispに比べれば
表現力に相当の制約がありますが、それでもいかにもvimらしい命令体系で強力なス
クリプトになっています。

39 :ヘッポコ訳者 ◆xBY/hgW2 :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 :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 :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 :名無しさん@お腹いっぱい。:01/12/24 01:57
>>38
わざわざどうもありがとう。
>>3 のリンクを見てなんとなく感じがつかめました。

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

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

46 :45:01/12/24 03:30
スレ違いなのね
ちょっと反省

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

48 :1: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 :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 :01/12/24 23:16
今日はこれだけにしときます.
あー,ヤダヤダ.世間様は楽しんでるんだろうなァ・・・

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

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

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

54 :1:01/12/26 01:03
小さな便利機能がごちゃごちゃ入っているスクリプト集見つけた。
http://vim.sourceforge.net/scripts/download.php?src_id=409

翻訳が苦手なのでここ
http://www.excite.co.jp/world/text/
で概要を翻訳してみると、

これはVim機能のコレクションです。そのうちの多数はメーリングリストにポストさ
れた質問に応じたものです。それらはすべて合理的に短いです。したがって、あなた
が自分のVim機能を書く方法を学習しようとしていればそれらがよい例になることを
望みます。範囲コマンドおよび Mark(),Count(),GetModelines(),VarTab(),SmartBS()
などの機能のうちのいくつかをさらに有用に感じるかもしれません。

だって。これはお勉強するのにちょうどいいかも。

55 :ヘッポコ訳者 ◆xBY/hgW2 :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 :名無しさん@お腹いっぱい。: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:01/12/31 14:08
>行末移動($)して "}" を削除(x)。

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

63 :KoRoN@Vim%Chalice ◆ALICEsdk :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 :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 :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 :01/12/31 15:59
とりあえずちょっと復活.
でもなんかこの関数列挙あんま意味無いよーなあるよーな.
まぁ訳してるヲレ自身は詳細のヘルプ見たりして勉強にはなるから
いいんだけど.

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

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

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

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

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

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

70 :1:01/12/31 23:07
>>69
殺伐としてましたねぇ。んで突然「水きぼーん」の声。もうワライ堪えるのが大変。
詳しくはこちら↓今見たら、なんか元旦もやるとかいってるし(w
大晦日は殺伐と吉野家へ(集合)その7
http://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:02/01/01 22:32
なんか誤字が多いなー、牛乳飲も。

74 :ヘッポコ訳者 ◆xBY/hgW2 :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 :02/01/03 01:03
なんか訳しててあんま楽しくない個所なんで今日はここまで(苦笑)

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

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

78 :ヘッポコ訳者 ◆xBY/hgW2 :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 :02/01/03 23:32
やっとツマランところ終了.
KoRoN 殿のような方々の辛さを実感(苦笑)

80 :KoRoN@Vim%Chalice ◆ALICEsdk :02/01/03 23:49
>>79 お疲れさん!!

81 :名無しさん@お腹いっぱい。: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 :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: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 :02/01/06 04:05
>>83 ナイスですねぇ。
>  while i <= (char2nr('z') - char2nr('a'))
ここだけwhile i < strlen(markchars)としたほうが良いでしょう。

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

85 :81: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 :名無しさん@お腹いっぱい。:02/01/08 23:27
初めて見てみたけどわけわかんないっす。
「じゃあ来るな」はナシよ。

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

91 :KoRoN@Vim%Chalice ◆ALICEsdk :02/01/08 23:56
>>88 変数の有無のチェックにexists()を使う方法もあります。

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

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

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

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

94 :KoRoN@Vim%Chalice ◆ALICEsdk :02/01/09 11:06
>>93 お察しのとおりです。

95 :68: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 :名無しさん@お腹いっぱい。: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 :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 :02/01/12 03:16
>>101
あ、逆でした。>>100は'cpoptions'に"C"が含まれる時には行頭の \ が連結の意味に
ならない、といので正しいです。

103 :mattn@Vim%Chalice: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: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 :名無しさん@お腹いっぱい。:02/01/13 01:45
This script is intended to provide an easy and quick way of sending e-mail messages from within vim
http://vim.sourceforge.net/scripts/script.php?script_id=179

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

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

BlatJ
http://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とはこれのことです。
http://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 :02/01/17 23:26
まっつんさんのcalender.vim、次のように設定すると日本語暦。
 http://vim.sourceforge.net/scripts/script.php?script_id=52
 
 let g:calendar_mruler = '睦月,如月,弥生,卯月,皐月,水無月,文月,葉月,長月,神無月,霜月,師走'
 let g:calendar_wruler = '日 月 火 水 木 金 土'
これに加えて「平成14年」とか「皇紀2662年」
とかいう表記ができたらまさにパーフェクト(苦笑)

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

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

117 :KoRoN@Vim%Chalice: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 :名無しさん@お腹いっぱい。:02/01/21 03:04
>1
お疲れ様です。
# ちょっと前に、ハイライト表示の定義をしようとして出来なかったのですが
# もう一回チャレンジしようかな?

121 :mattn@Vim%Chalice: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: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 :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 :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 :02/01/23 02:46
ふぅ,お久しぶりでヤンス.
最近忙しいでヤンスよ.
まぁ暇が出来たらまたちょくちょくやるっす.
そんぢゃ.

128 :mattn@Vim%Chalice: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 :02/01/23 20:56
余談ですけど、最近のCygwinってDOS形式(但しディレクトリセパレータは/)のパスを
受け付けますよね。おかげで'shellslash'との親和性がスゴク良い。
 % ls d:/HOME/vim/vim60
とか出来ますから。

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

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

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

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

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

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

151 :名無しさん@お腹いっぱい。: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: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: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: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 :名無しさん@お腹いっぱい。: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 :02/02/06 00:27
>>160
「!」を使ってこうします。
  :exe "normal! i\<C-D>"

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

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

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

165 :160:02/02/06 00:57
http://vim.sourceforge.net/
の Recent Script Updates にあったんで試してみた

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

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

の <Leader> って何?

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

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

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

170 :167: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 :名無しさん@お腹いっぱい。:02/02/12 18:59
Tetrisに続いてSokobanなるゲームが(w まだ試してないけど。

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

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

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

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

178 :KoRoN@Vim%Chalice ◆ALICEsdk :02/02/18 00:49
>>177
See :help foldclosed() and its families.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

193 :KoRoN@Vim%Chalice ◆ALICEsdk :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 :02/02/23 03:09
>>194
25日までは死ねます。

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

197 :オコジョさん:02/03/02 02:32
ん?カラアゲ?.....どこだ?


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

"
" 現在行に URL 文字列があるとき、それを取得しOpenURLへ渡す
" URL 文字列がない場合素の <CR> を実行
"
function! s:CheckURL()
 let url = matchstr(getline("."), '\(http://[-#%&+,./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スレからお引っ越し: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 :02/03/24 13:23
最近、漫画「ヒカルの碁」の影響を受けて碁を始めたので(苦笑)、碁盤スクリプトを
作ってみました。
  http://www.kaoriya.net/dist/goban_vim-1.0.tar.bz2
:sourceして:GobanSplitで碁盤ができます。bで黒、wで白、xで石を消せます。誰か
棋譜を作成できるように拡張してみませんか?。

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

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


207 :mattn@Vim%Chalice: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 :02/04/10 13:17
>>207
let calendar_erafmt = '皇紀,660'
とかやってみました。最高です!

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

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

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

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

213 :名無しさん@お腹いっぱい。: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
http://vim.sourceforge.net/scripts/script.php?script_id=291

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

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

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

217 :名無しさん@お腹いっぱい。: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 :名無しさん@お腹いっぱい。:02/05/08 12:52
追加。
autodate.vim の副題
>Custumizable auto update time stamp tool.
Customizable

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

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

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

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

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

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

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

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

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

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

228 :名無しさん@お腹いっぱい。: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 :02/05/19 11:02
>>227 いきなりマイナスに点数がつくんですよね(^-^;;;

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

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

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

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

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

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

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

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

238 :mattn@Vim%Chalice: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 :名無しさん@お腹いっぱい。:02/05/27 12:42
>>238
当方、cygwin ですが、vimacs で m-x が使えました V(^_^)V パチパチ

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

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

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

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

244 :KoRoN@Vim%Chalice ◆ALICEsdk :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 :02/06/04 19:53
>>244 あ、動きました。失礼しました。

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

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

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

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

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

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

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

252 :名無しさん@お腹いっぱい。: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 :名無しさん@お腹いっぱい。:02/06/22 23:21
自由。

256 :KoRoN@Vim%Chalice ◆ALICEsdk :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 :02/07/29 12:11
VimでAAアニメを作るためのライブラリとサンプルアニメーションを作ってみました。

    ライブラリ: http://www.kaoriya.net/testdir/animate.vim
    サンプル1: http://www.kaoriya.net/testdir/gikozuza.vim
    サンプル2: http://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 :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 :コギャルとHな出会い:02/08/16 12:00
http://kado7.ug.to/net/


朝までから騒ぎ!!
   小中高生
 コギャル〜熟女まで
   メル友
  i/j/PC/対応

女性の子もたくさん来てね
  小中高生大歓迎です                 
全国デ−トスポット情報も有ります。
全国エステ&ネイル情報あります。

  激安携帯情報あります。

261 :名無しさん@お腹いっぱい。: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 :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 :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 :名無しさん@お腹いっぱい。:02/08/28 18:25
保守さげ

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

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

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


267 :KoRoN@Vim%Chalice ◆8XALICEsdk :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 :・・・うまく行くかな?:02/10/20 22:20
>>266
:%s/hoge11/moge^M^[:%s/hoge11/moge^M^[:%s/hoge_3_3/moge^M^[
と書いて、その行の上で、
例えば、
"aY
と入力する。

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


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

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

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

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


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

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

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



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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

289 :281:02/12/03 23:39
>>283
ありがと。

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

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

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

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

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

:help :execute

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

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

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

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

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

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

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

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

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

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

300 :300:02/12/16 13:04

300

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

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

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

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

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

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

309 :307: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 :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:03/01/01 16:59
>>301>>226氏の言うwimmanagerに付属のやつでしたか。すみませぬ。

314 :226:03/01/03 16:06
別もんですよん

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

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

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

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

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

otu-

319 :山崎渉:03/01/15 13:02
(^^)

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

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

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

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

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

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

325 :324:03/01/29 06:59
微妙に誤爆。スマソ

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


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

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


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

330 :329:03/02/10 00:48
嘘。runtimepath+=hoge だったら、hoge/plugin/ だな。

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

333 :名無しさん@Vim%Chalice: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: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 :名無しさん@お腹いっぱい。:03/02/20 19:47
| はコマンドの連結
g を前置するのはジャンプリストを変更しないようにジャンプする

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

1 get ズサーしますた。

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

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

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

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

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

354 :名無しさん@お腹いっぱい。:03/04/05 00:13
http://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 :名無しさん@お腹いっぱい。: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 :03/04/05 23:33
>>356
> 例えばバッファ内のスクリプトを保存せずに実行する方法とかあるんでしょうか?
そういうスクリプト書いちゃえばできないことはないですが、
だったら適当な名前で保存して :so% したほうが手っ取り早いです。

358 :山崎渉:03/04/17 12:00
(^^)

359 :山崎渉:03/04/20 06:18
   ∧_∧
  (  ^^ )< ぬるぽ(^^)

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


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

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

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

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

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

365 :_:03/05/15 13:01
  ∧_∧
 ( ・∀・)/< こんなのみつけたっち♪ 
http://www.hiroyuki.zansu.com/hankaku/jaz03.html
http://hiroyuki.zansu.com/hankaku/jaz10.html
http://www.hiroyuki.zansu.com/hankaku/jaz08.html
http://hiroyuki.zansu.com/hankaku/jaz09.html
http://www.hiroyuki.zansu.com/hankaku/jaz06.html
http://hiroyuki.zansu.com/hankaku/jaz05.html
http://www.hiroyuki.zansu.com/hankaku/jaz01.html
http://hiroyuki.zansu.com/hankaku/jaz02.html
http://www.hiroyuki.zansu.com/hankaku/jaz07.html
http://hiroyuki.zansu.com/hankaku/jaz04.html

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

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

369 :名無しさん@お腹いっぱい。: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: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:03/05/17 22:51
>しかし、行の最後にいるときにうまくいきません。
ほんとだ。σ(^◇^;)

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

372 :MiMi@Vim%Chalice ◆fI1wYbzaMQ :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 :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 :名無しさん@お腹いっぱい。:03/05/18 00:27
歩野?

375 :367: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 :山崎渉:03/05/22 01:54
━―━―━―━―━―━―━―━―━[JR山崎駅(^^)]━―━―━―━―━―━―━―━―━―

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

378 :あぼーん:あぼーん
あぼーん

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

nikkei.co.jpは「宿題」?

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

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

382 :あぼーん:あぼーん
あぼーん

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

お騒がせ致しました。

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

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

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

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

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

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

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

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

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

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

407 :KoRoN@Vim%Chalice ◆8XALICEsdk :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 :名無しさん@お腹いっぱい。:03/06/21 23:30
まぁそういうおまいも vi に対する理解があるとはとても
おもえんのだが。いいかげんやめたら?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

421 :KoRoN@Vim%Chalice ◆8XALICEsdk :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: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 :山崎 渉:03/07/15 11:22

 __∧_∧_
 |(  ^^ )| <寝るぽ(^^)
 |\⌒⌒⌒\
 \ |⌒⌒⌒~|         山崎渉
   ~ ̄ ̄ ̄ ̄

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

432 :331:03/08/01 22:00
>>348
s/330/331/

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

433 :331:03/08/01 22:00
>>432
誤爆。スマソ

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

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

435 :名無しさん@お腹いっぱい。:03/08/02 18:31
plugin/headline/1101com.vim~
チルダがついてますが。

436 :KoRoN@Vim%Chalice ◆8XALICEsdk :03/08/02 20:43
作ろうかなぁと考えて、結局止めたからです。

437 :名無しさん@お腹いっぱい。:03/08/06 14:08
現在編集中のバッファ(ファイル)が未保存かどうかを
取得する関数などはありませんか??

438 :名無しさん@Vim%Chalice:03/08/06 14:12
getbufvar()

439 :_:03/08/06 14:34
http://homepage.mac.com/hiroyuki44/

440 :名無しさん@お腹いっぱい。:03/08/06 14:34
:echo &modified

441 :437:03/08/06 14:58
&modifiedで状態を取得することが出来ました。
どうもありがとうございました。

442 :KoRoN@Vim%Chalice ◆8XALICEsdk :03/08/07 20:42
某スレで「foldはアウトラインとしては使いにくい」という至極納得な意見が出され
ていたので、なんとかしてみるスクリプトを書いてみました。
    http://www.kaoriya.net/testdir/folddigest.vim
foldが有効になっているテキストバッファで :call FoldDigest() を実行すると、
foldのダイジェストツリーが表示された新バッファができます。そのバッファの方で
注目したい項目の行で<CR>すると、テキストバッファの該当箇所へカーソルが飛びま
す。これで少し使いやすくなるでしょうか?。

443 :名無しさん@お腹いっぱい。:03/08/08 00:04
>>442
某スレから参りました。
はぁ、便利。

あのスレの影響で使い始めたんですけど良いエディタですね。
使っていて気持ちが良いというか、リズムがあるというか。
スクリプトはだいぶ先になると思いますがちょこちょこ勉強していこうと思います。

444 :KoRoN@Vim%Chalice ◆8XALICEsdk :03/08/08 00:19
>>443
動くようになったばかりなのでα版と考えてください。自動かそれに順ずる方法で
call FoldDigest()する仕組みとか、行がズレた時の処理とか、ウィンドウの取り回
しとか考えていますんで、もうちょっと使えるものになるでしょう。

ま、Vimに限りませんがイッペンにイロイロ覚えようとはせず、その時に必要なもの
を必要なだけ覚えていくのが良いんじゃないでしょうか。

445 :KoRoN@Vim%Chalice ◆8XALICEsdk :03/08/08 23:31
folddigest.vimをアップデートしました。
    http://www.kaoriya.net/testdir/folddigest.vim
使い方は>>442と一緒ですが…

> 行がズレた時の処理
主にコレについて修正しました。
    :let folddigest_options = "quickfix"
とすることで+quickfixを利用し、編集してズレたり消えたりしてもちゃんと飛べる
ようになります。ただし:makeや:grepと併用できなくなるので注意してください。

    :let folddigest_options = "flexnumwidth"
とすると、行番号の桁数が必要最小限になるので画面幅が狭いときには有効です。

オプションはカンマで接続して複数指定することができます。例:
    :let folddigest_options = "quickfix,flexnumwidth"
この場合、行番号は一切表示されません。スッキリです。

446 :名無しさん@お腹いっぱい。:03/08/11 05:51
>>418
うまく動かなかった・・
喋る前に消えたな・・


447 :名無しさん@お腹いっぱい。:03/08/13 13:05
>>412
ずばっと言った真実て…(激藁

448 :名無しさん@お腹いっぱい。:03/08/14 09:07
>>445
vim.sf.netではVim versionが6.0になっていましたが、6.1で試したらgetregがな
いとエラーが出ました。
http://vim.sourceforge.net/scripts/download_script.php?src_id=2230

449 :KoRoN@Vim%Chalice ◆8XALICEsdk :03/08/14 09:15
>>448
ありがとうございます。descriptionに追記しておきました。vim.orgに登録する時に
は5.0か6.0しか選べません。そのため6.2でも6.0としか表示できないのです。

450 :あぼーん:あぼーん
あぼーん

451 :名無しさん@お腹いっぱい。:03/09/16 19:42
Vine Linuxでgvim(日本語版)を使っていますが、
起動時に検索など全ての文字入力が日本語になっており、
いちいち日本語をオフにしなくてはいけません。

初期設定は日本語(IME)をオフにする方法をどなたか御存じでしょうか?

452 :名無しさん@お腹いっぱい。:03/09/16 20:08
>>451
h 'imi'
h 'ims'
スレ違い。
http://pc.2ch.net/test/read.cgi/unix/1058706125/

453 :名無しさん@お腹いっぱい。: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:03/10/12 11:50
>>454
そのスクリプトが書き込まれたのはVim6スレのPart5ですね。書かれたのはまっつんさんですが、
    http://www.kaoriya.net/testdir/orderedlist_fold.vim
ココにコピーを置いておきました。細かいところはご自分で修正してください。

456 :名無しさん@Vim%Chalice ◆8XALICEsdk :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 :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 :03/10/13 00:50
>>460 >>442を参照してください。

462 :名無しさん@お腹いっぱい。:03/10/13 11:17
>>461
あ、どもです。
ところで、>>455のfoldexpr=の後には、複数の関数つけても駄目でしょうか?


463 :KoRoN@Vim%Chalice ◆8XALICEsdk :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 :名無しさん@お腹いっぱい。: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 :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 :03/10/20 00:56
>>468 :help cursor()

470 :パパパッチ466@Vim%Chalice: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 :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:03/10/31 01:03
× clear 後にcontains付き
○ clear 後にcontained付き

474 :名無しさん@お腹いっぱい。:03/10/31 08:16
おれはそういうのはexprでやった。
http://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 :名無しさん@お腹いっぱい。:03/10/31 20:47
>>475
http://pc.2ch.net/test/read.cgi/unix/1058706125/531-533
スレ違い?

477 :475:03/10/31 22:25
>>476
アリガトン

478 :472:03/10/31 23:37
>>474
d!
vim online に tips があったんだね

479 :472: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:03/11/04 07:55
>>479
最後の
return foldlevel(v:lnum-1)      

return '='
にするとうまくいくかも。
helpにはfoldlevel(v:lnum-1)を使えって書いてあるけど、実際には
-1にしかならない。
シングルクウォートがぬけてました。
if getline(v:lnum) =~ '^class .*{$'

481 :名無しさん@お腹いっぱい。: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: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 :名無しさん@お腹いっぱい。:03/11/27 16:47
viつかいだして2年ぐらいになるし,
そろそろスクリプトも書けなあかんなぁと思ってこのスレを読んでみると,
簡単なことでも四苦八苦する様を見てemacsに移行しようかと
思ってしまった. lispは応用効くし.

484 :名無しさん@お腹いっぱい。:03/11/27 17:13
その程度の動機でemacsに移行できるならしとけ

485 :名無しさん@お腹いっぱい。:03/12/02 21:58
機能多すぎてさ。迷っちゃうわけよ。どの編集方法がもっとも最速か?少ないキータッチで実現できるか?
入力補完を使用した方が早いのか、画面ないの単語まで移動してコピって作成した方が早いのか?
迷ってるうちにマウスとキーボードでコピってるヤツの方がサクサクッと仕上げちゃってるわけよ。
編集そのものよりいかにエディタを使いこなすか?にずれちゃってるわけよ。ある程度学習すればリターン
の方が大きくなるであろうとは思うのだけれど、なかなかその道が見えてこないわけよ。半年以上はvi
使ってると思われるんだけど、いまだにその辺のエディタと対してスピード変わってねーんじゃねー?
っていう疑いをぬぐい切れぬわけよ。

486 :名無しさん@お腹いっぱい。: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 :名無しさん@お腹いっぱい。:03/12/08 17:49
初めて vim スクリプトを勉強するなら、 eval.txt と usr_41.txt のどっちの方を先に
読んだ方がいいですか?

行数が eval は 41 のほうの 3 倍もあるので、どんな感じなのかと。

489 :KoRoN@Vim%Chalice ◆8XALICEsdk :03/12/08 18:19
>>488
他のプログラミング言語に慣れているのであれば、リファレンスマニュアルである
eval.txtを必要なところだけかいつまんで読み、差分を理解するようにしたほうが近道
です。そうでないならusr_41.txtを読みながら1つ1つ順番に試した方が早く習得できる
でしょう。

490 :名無しさん@お腹いっぱい。:03/12/08 20:42
>>489
eval を斜め読みしてみます。

491 :名無しさん@お腹いっぱい。:04/02/07 15:30
このスレとか:help augroupとか色々なスクリプトとか読んでみたんだけど、
未だにaugroupが何の為にあるのか分からない。
これ使うとどんな嬉しい事があるの?

492 :名無しさん@お腹いっぱい。:04/02/07 15:38
スクリプトが自分でインスコしたautocmdだけを綺麗に消せる

493 :491:04/02/07 18:52
なるほど、そういう用途の為にあるのか。
教えてくれてどうもありがとう、>>492さん。

494 :名無しさん@お腹いっぱい。:04/02/18 09:08
vimスクリプト開発に便利なコマンドってどんなのがありますか?
とりあえず :source ってのは使えそうだけど、Emacs の
eval-last-sexp みたいな、カーソル行をコマンドとして解釈して
実行、みたいなのがあると便利なんですが。これ自体スクリプトで
書けそうだけど…。


495 :名無しさん@お腹いっぱい。:04/02/18 09:21
>>494 yy:<C-R>"

496 :493:04/02/18 11:15
>>495
おおっ、こりゃ便利です!! ありがとうございます。
ストローク数多くなるけど、^y$:<C-R>" でもイケますね。
(行末の ^M を省くため)


497 :名無しさん@お腹いっぱい。:04/02/18 11:29
お気軽スクリプト生成コマンドとしてはq:もあるね。
コマンドラインの履歴を編集してそのままスクリプトに出来る。

498 :名無しさん@お腹いっぱい。:04/02/18 13:06
ストローク数だけで言うなら Y:<C-R>"<C-H>

499 :493:04/02/19 09:16
>>497
ときどき :q と間違えて q: を押すと出てきてたのはこれだったのか…
vi初心者なもので…
これで望みどおりのことができそうです。ありがとうございます!


500 :名無しさん@お腹いっぱい。:04/02/19 09:55
そう言えば、ストローク数だけで言うなら Yq:P の方が短いな

501 :名無しさん@お腹いっぱい: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 :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 :名無しさん@お腹いっぱい:04/02/21 01:33
なるほど。ありがとうございます。
思ったような動作をするようになりました。

504 :初心者:04/02/26 07:50
platexをですね、
:platex %
なんて打ったら、コンパイルしてくれるわ
dvioutを起動してくれるわ
なんていうふうにするには
どんなスクリプトをかけばよいのですか?

505 :名無しさん@お腹いっぱい。:04/02/26 08:15
>>504
ちょっと違うが。
nnoremap <buffer> <c-m> :!platex %<cr>:sil !xdvi %<.dvi >/dev/null 2>&1 &<cr>

506 :名無しさん@お腹いっぱい。:04/03/03 09:56
IRC (;´Д`)ハァハァ

507 :名無しさん@お腹いっぱい。:04/03/07 15:29
VimIRC.vim : An IRC client script
http://vim.sourceforge.net/scripts/script.php?script_id=931


508 :名無しさん@お腹いっぱい。:04/03/08 13:50
だれか #Vim つくって...

509 :名無しさん@お腹いっぱい。:04/03/08 16:04
>>508
splitしてるでしょ。確かグローバルには#vimがあったはず。

510 :名無しさん@お腹いっぱい。:04/03/08 21:03
>>508
どこのネットワークだよ。
WIDE系?freenode?2ch?

511 :名無しさん@お腹いっぱい。:04/04/17 20:53
age

210 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.02.02 2014/06/23 Mango Mangüé ★
FOX ★ DSO(Dynamic Shared Object)