-
Notifications
You must be signed in to change notification settings - Fork 65
/
Copy pathif_mzsch.jax
322 lines (275 loc) · 15 KB
/
if_mzsch.jax
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
*if_mzsch.txt* For Vim バージョン 8.1. Last change: 2017 Oct 08
VIMリファレンスマニュアル by Sergey Khorev
Vim の MzScheme インターフェイス *mzscheme* *MzScheme*
1. コマンド |mzscheme-commands|
2. 例 |mzscheme-examples|
3. スレッド |mzscheme-threads|
4. MzScheme から Vim にアクセスする |mzscheme-vim|
5. mzeval() Vim 関数 |mzscheme-mzeval|
6. 関数参照を使う |mzscheme-funcref|
7. 動的ローディング |mzscheme-dynamic|
8. MzSchemeのセットアップ |mzscheme-setup|
{Vi にはこれらのコマンドはありません}
MzScheme インターフェイスは、Vim が |+mzscheme| 機能付きでコンパイルされたとき
のみ利用できます。
Brent Fulgham の作業にもとづいています。
動的ローディングは Sergey Khorev によって追加されました。
MzScheme と PLT Scheme は Racket という名前になりました。詳しいことは
http://racket-lang.org を見てください。
Racket 5.x (5.3.1も含む) の futures と places は Vim から作成されたプロセスで
は機能しません。
簡単な解決法はそれらの機能を無効にした Racket を自分でビルドすることです。: >
./configure --disable-futures --disable-places --prefix=your-install-prefix
プロセスを高速化するには、--disable-gracket と --disable-docs も指定するといい
かもしれません。
==============================================================================
1. コマンド *mzscheme-commands*
*:mzscheme* *:mz*
:[range]mz[scheme] {stmt}
MzScheme のステートメント {stmt} を実行します。
{Vi にはありません}
:[range]mz[scheme] << {endmarker}
{script}
{endmarker}
MzScheme のスクリプト {script} を実行します。
Note: このコマンドは MzScheme 用の機能を含めてコンパイ
ルされていないときは機能しません。エラーを抑制するには
|script-here|を参照してください。
*:mzfile* *:mzf*
:[range]mzf[ile] {file} {file} 内の MzScheme スクリプトを実行します。
{Vi にはありません}
これらのコマンドは、本質的には同じことを行います - つまり、MzScheme のコードを、
与えられた "現在の範囲" に対して実行します。
:mzscheme の場合は、実行するコードはコマンドラインから与えます。
:mzfile の場合は、実行するコードは指定したファイルから読み込まれます。
MzScheme インターフェイスは、exn から派生した例外 exn:vim を定義します。Vim
の様々なエラーを通知するために、この例外が投げられます。
コンパイルの実行中に、その時点の MzScheme コレクションのパスが記録されます。も
し他にもパスを指定したい場合は、パラメーター 'current-library-collection-paths'
を使ってください。例: ユーザーごとのコレクションパスを追加するには: >
:mz << EOF
(current-library-collection-paths
(cons
(build-path (find-system-path 'addon-dir) (version) "collects")
(current-library-collection-paths)))
EOF
<
すべての機能は vimext モジュールを通して提供されます。
exn:vim は明示的なインポートをしなくても利用可能です。
モジュールを require するときは、MzScheme との衝突を避けるため、プリフィック
スを使うことも考えてください。例: >
:mzscheme (require (prefix vim- vimext))
<
本マニュアル中、以降のすべての例は、このプリフィックスを使っています。
*mzscheme-sandbox*
サンドボックス |sandbox| の中で実行されているときは、ファイルシステムへのア
クセスや Vim インターフェイスプロシージャの実行は制限されています。
==============================================================================
2. 例 *mzscheme-examples*
>
:mzscheme (display "Hello")
:mz (display (string-append "Using MzScheme version " (version)))
:mzscheme (require (prefix vim- vimext)) ; MzScheme < 4.x 用
:mzscheme (require (prefix-in vim- 'vimext)) ; MzScheme 4.x 用
:mzscheme (vim-set-buff-line 10 "This is line #10")
使っている MzScheme のバージョンを見るには: >
:mzscheme (display (version))
<
インラインスクリプトの例: >
function! <SID>SetFirstLine()
:mz << EOF
(display "!!!")
(require (prefix vim- vimext))
; ↑新しいバージョンでは (require (prefix-in vim- 'vimext))
(vim-set-buff-line 1 "This is line #1")
(vim-beep)
EOF
endfunction
nmap <F9> :call <SID>SetFirstLine() <CR>
<
ファイルの実行: >
:mzfile supascript.scm
<
例外制御: >
:mz << EOF
(require (prefix vim- vimext))
; ↑新しいバージョンでは (require (prefix-in vim- 'vimext))
(with-handlers
([exn:vim? (lambda (e) (display (exn-message e)))])
(vim-eval "nonsense-string"))
EOF
<
vimext モジュールの自動インスタンス化(|vimrc| に書くことができます): >
function! MzRequire()
:redir => l:mzversion
:mz (version)
:redir END
if strpart(l:mzversion, 1, 1) < "4"
" MzScheme versions < 4.x では:
:mz (require (prefix vim- vimext))
else
" それ以降のバージョンでは
:mz (require (prefix-in vim- 'vimext))
endif
endfunction
if has("mzscheme")
silent call MzRequire()
endif
<
==============================================================================
3. スレッド *mzscheme-threads*
MzScheme インターフェイスはスレッドをサポートしています。これは OS のスレッ
ドとは独立しており、よってスケジューリングが必要になります。オプション
'mzquantum' によって、Vim がどれだけの時間間隔で MzScheme スレッドに切り替え
るかが決定されます。
NOTE
コンソール版 Vim のスレッドスケジューリングは GUI 版よりやや信頼性が低くなり
ます。
==============================================================================
4. MzScheme から VIM にアクセスする *mzscheme-vim*
*mzscheme-vimext*
'vimext' モジュールは MzScheme インターフェイスで定義されたプロシージャへの
アクセスを提供します。
共通
------
(command {command-string}) Vim の Ex コマンドを実行する。
(eval {expr-string}) Vim の式を評価し、対応する MzScheme のオブ
ジェクトに変換する。リスト (|Lists|) は
Scheme のリスト、辞書 (|Dictionaries|) は
はハッシュテーブル、関数参照 (|Funcref|)
は関数になる。(|mzscheme-funcref| も参照)
NOTE: MzScheme の eval と名前が衝突してい
るので、呼び出すにはモジュール限定子を使っ
てください。
(range-start) Scheme コマンドに渡された範囲の開始行
(range-end) /終了行を取得
(beep) ビープを鳴らす
(get-option {option-name} [buffer-or-window]) Vim の(ローカルまたはグロー
バルな)オプションの値を取得する。
(set-option {string} [buffer-or-window])
Vim のオプションをセットする。{string}
はオプション設定形式(optname=optvalue や
optname+=optval など)になっていなければ
ならない。{buffer} または {window} を
指定した場合、そのバッファまたはウィンド
ウにローカルなオプションがセットされる。
{buffer-or-window} としてシンボル
'global を渡すと |:setglobal|と同じにな
る。
バッファ *mzscheme-buffer*
-------
(buff? {object}) オブジェクトがバッファであるか?
(buff-valid? {object}) オブジェクトが有効なバッファであるか?
(実際に Vim のバッファに対応しているか)
(get-buff-line {linenr} [buffer])
バッファから行を取得する
(set-buff-line {linenr} {string} [buffer])
バッファの {linenr} 行目を {string} にす
る。{string} が#fならその行は削除される。
引数 [buffer] は省略可能。省略された場合
はカレントバッファが対象となる。
(get-buff-line-list {start} {end} [buffer])
バッファ内の行のリストを取得する。{start}
と {end} は 1 から始まる。{start} 行目と
{end} 行目は含まれる。
(set-buff-line-list {start} {end} {string-list} [buffer])
バッファに行のリストをセットする。
{string-list} が #f または null の場合、
その行は削除される。リストの長さが
{end} - {start} 以下である場合、足りない分
の行は削除される。
(get-buff-name [buffer]) バッファの名前を取得する
(get-buff-num [buffer]) バッファ番号を取得する
(get-buff-size [buffer]) バッファの行数を取得する
(insert-buff-line-list {linenr} {string/string-list} [buffer])
{linenr} 行目の後ろに行を挿入する。
{linenr} が 0 の場合、バッファの先頭に挿
入される。
(curr-buff) カレントバッファ(オブジェクト)を取得する。
バッファを変更するには他の MzScheme イン
ターフェイス手続きを使う。
(buff-count) バッファの総数を取得する。
(get-next-buff [buffer]) 次のバッファを取得する
(get-prev-buff [buffer]) 前のバッファを取得する。それ以上前が存在し
ないときは #f を返す。
(open-buff {filename}) {filename} という名前で新規バッファを開く
(get-buff-by-name {buffername}) バッファ名を指定してバッファオブジェクトを
取得する。見つからなければ #f を返す。
(get-buff-by-num {buffernum}) バッファ番号を指定してバッファオブジェクト
を取得する。見つからなければ #f を返す。
ウィンドウ *mzscheme-window*
------
(win? {object}) オブジェクトはウィンドウか?
(win-valid? {object}) オブジェクトは有効なウィンドウであるか?
(実際に Vim のウィンドウに対応しているか)
(curr-win) カレントウィンドウ(オブジェクト)を取得する
(win-count) ウィンドウの個数を取得する
(get-win-num [window]) ウィンドウ番号を取得する
(get-win-by-num {windownum}) 番号を指定してウィンドウを取得する
(get-win-buffer [window]) 指定したウィンドウ内のバッファを取得する
(get-win-height [window])
(set-win-height {height} [window]) ウィンドウの高さを取得/セットする
(get-win-width [window])
(set-win-width {width} [window])ウィンドウの幅を取得/セットする
(get-win-list [buffer]) バッファを表示しているウィンドウのリスト
(get-cursor [window]) ウィンドウ内のカーソル位置をペア
(linenr . column) として取得する
(set-cursor (line . col) [window]) カーソル位置をセットする
==============================================================================
5. mzeval() Vim 関数 *mzscheme-mzeval*
相互接続を容易にするために |mzeval()| 関数が提供されています。この関数は
MzScheme の式を評価してその結果を Vim script の値に変換したものを返します。
==============================================================================
6. 関数参照を使う *mzscheme-funcref*
MzScheme インターフェイスでは関数参照 (|Funcref|) が使えます。Vim の関数を
Scheme から直接呼び出せます。例: >
function! MyAdd2(arg)
return a:arg + 2
endfunction
mz (define f2 (vim-eval "function(\"MyAdd2\")"))
mz (f2 7)
< または : >
:mz (define indent (vim-eval "function('indent')"))
" return Vim indent for line 12
:mz (indent 12)
<
==============================================================================
7. 動的ローディング *mzscheme-dynamic* *E815*
MS-Windows では MzScheme ライブラリを動的に読み込むことが可能です。これを行う
と |:version| の出力に |+mzscheme/dyn| が含まれるようになります。
この場合、Vim は必要なときだけ MzScheme の DLL ファイルを検索するようになりま
す。MzScheme インターフェイスを使わないときは DLL を必要としないので、DLL な
しで Vim を使うことができます。
NOTE: 比較的新しいバージョンの MzScheme (Racket) は scheme_main_setup によるト
ランポリンを用いた事前初期化処理を必要とします。そのために Vim は可能であれば常
に MzScheme の DLL を初期化時に読み込みます。これは Vim の起動を遅くするかもし
れません。
MzScheme インターフェイスを使うには MzScheme の DLL が検索パス内に存在しなけ
ればなりません。コンソールウィンドウで "path" とタイプすると、どのディレクト
リが検索パスとなるか表示できます。
MS-Windows では 'mzschemedll' および 'mzschemegcdll' オプションが読み込むライ
ブラリの名前として使用されます。初期値はビルド時に指定されます。
DLL のバージョンは Vim をコンパイルした時の MzScheme のバージョンと一致しなけ
ればなりません。MzScheme 209 用ならば "libmzsch209_000.dll" と
"libmzgc209_000.dll" となるでしょう。確認するには ":version" コマンドの出力
を見て、コンパイル情報から -DDYNAMIC_MZSCH_DLL="なんらか" と
-DDYNAMIC_MZGC_DLL="なんらか" を探してください。
例えば、MzScheme (Racket) が C:\Racket63 にインストールされている場合、次のよう
に環境変数を設定する必要があるかもしれません: >
PATH=%PATH%;C:\Racket63\lib
PLTCOLLECTS=C:\Racket63\collects
PLTCONFIGDIR=C:\Racket63\etc
<
==============================================================================
8. MzScheme setup *mzscheme-setup* *E895*
Vim は if_mzsch のコアモジュールとして "racket/base" (もし存在しなければ
"scheme/base" にフォールバックします) を、テストのために "r5rs" モジュールを、
そして Vim のビルド時に必要な "raco ctool" コマンドを要求します。MzScheme がそ
れらを持っていなかった場合は MzScheme の raco コマンドで次のようにインストール
できます:
>
raco pkg install scheme-lib # scheme/base module
raco pkg install r5rs-lib # r5rs module
raco pkg install cext-lib # raco ctool command
======================================================================
vim:tw=78:ts=8:sts=4:ft=help:norl: