Up: 目次   [Index]


MzScheme インターフェイス

*if_mzsch.txt*  For Vim バージョン 8.1.  Last change: 2019 Jul 21


                  VIMリファレンスマニュアル    by Sergey Khorev

Vim の 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|

{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. コマンド

:[range]mz[scheme] {stmt}

MzScheme のステートメント {stmt} を實行します。

:[range]mz[scheme] << [endmarker]
{script}
{endmarker}

MzScheme のスクリプト {script} を實行します。

Note:
このコマンドは MzScheme 用の機能を含めてコンパイルされてゐないときは機能しません。エラーを抑制するには |script-here| を參照してください。

{script} 以降の {endmarker} の前には空白を入れることはできません。

"<<" の後の [endmarker] を省略した場合は |:append| や |:insert| コマンドのやうにドット ’.’ で {script} を閉ぢます。

:[range]mzf[ile] {file}

{file} 內の MzScheme スクリプトを實行します。

これらのコマンドは、本質的には同じことを行ひます - つまり、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))

本マニュアル中、以降のすべての例は、このプリフィックスを使つてゐます。

サンドボックス |sandbox| の中で實行されてゐるときは、ファイルシステムへのアクセスや Vim インターフェイスプロシージャの實行は制限されてゐます。

2. 例

: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 インターフェイスはスレッドをサポートしてゐます。これは OS のスレッドとは獨立してをり、よつてスケジューリングが必要になります。オプション ’mzquantum’ によつて、Vim がどれだけの時閒閒隔で MzScheme スレッドに切り替へるかが決定されます。

Note:
コンソール版 Vim のスレッドスケジューリングは GUI 版よりやや信賴性が低くなります。

4. MzScheme から VIM にアクセスする

’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)

Scheme コマンドに渡された範圍の終了行を取得

(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| と同じになる。

バッファ

(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 を返す。

ウィンドウ

(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 函數

相互接續を容易にするために |mzeval()| 函數が提供されてゐます。この函數は MzScheme の式を評價してその結果を Vim script の値に變換したものを返します。

6. 函數參照を使ふ

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. 動的ローディング

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 のセットアップ

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

Up: 目次   [Index]