Up: 目次   [Index]


Tcl インターフェイス

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


                  VIMリファレンスマニュアル    by Ingo Wilken

Vim への Tcl インターフェイス

1. コマンド|tcl-ex-commands|
2. Tcl コマンド|tcl-commands|
3. Tcl 變數|tcl-variables|
4. Tcl ウィンドウコマンド|tcl-window-cmds|
5. Tcl バッファコマンド|tcl-buffer-cmds|
6. その他; Tcl からの出力|tcl-misc| |tcl-output|
7. 既知のバグと問題點|tcl-bugs|
8. 例|tcl-examples|
9. 動的ローディング|tcl-dynamic|

{Vimが |+tcl| 機能付きでコンパイルされてゐる場合にのみ利用できる}

警告:
多分まだいくらかのバグが殘つてゐる。バグレポート、コメント、意見などがあつたら、<Ingo.Wilken@informatik.uni-oldenburg.de>まで送つてください。

1. コマンド

:tc[l] {cmd}

Tcl コマンド {cmd} を實行する。‘:tcl‘ コマンドが機能するか簡單にチェックするには:

:tcl puts "Hello"
:[range]tc[l] << [endmarker]
{script}
{endmarker}

Tcl スクリプト {script} を實行する。

Note:
このコマンドは Tcl の機能付きでコンパイルされてゐないと使へない。エラーを抑制するには |script-here| を參照のこと。

{script} 後の {endmarker} の前には空白を置いてはいけない。

"<<" の後に [endmarker] が省略されたときは |:append| や |:insert| のやうに ’.’ が使はれる。

この形式の |:tcl| コマンドは Vim script の中に tcl コードを埋め込むのに特に便利である。

例:

function! DefineDate()
    tcl << EOF
    proc date {} {
        return [clock format [clock seconds]]
    }
EOF
endfunction

使つてゐる Tcl のバージョンを見るには:

:tcl puts [info patchlevel]
:[range]tcld[o] {cmd}

Tcl コマンド {cmd} を、[range] 內の各行に對し、變數 "line" に各行のテキストを順にセットし、變數 "lnum" に各行番號をセットしながら實行する。"line" への設定はテキストを變更しするが、このコマンドの實行中に、行を追加したり削除したりすることはできない。{cmd} がエラーを返せば、コマンドは中斷される。[range] の標準値はファイルの全て "1,$" である。|tcl-var-line|, |tcl-var-lnum| を參照せよ。

:tclf[ile] {file}

{file} 內の Tcl スクリプトを實行する。これは、":tcl source {file}" と同じであるが、ファイル名の補完が有效である。

Note:
Tcl オブジェクト (變數のやうなもの) は、Tcl シェル內でと同樣、1 つのコマンドから次のコマンドへと引き繼がれることに注意せよ。

|sandbox| の中では Tcl コマンドは實行できない。

2. Tcl コマンド

Tcl コードからは、"::vim" 名前空閒のコマンドを介して vim の全てにアクセスできる。次のコマンドが實裝されてゐる:

::vim::beep文字通りの beep。
::vim::buffer {n}Tcl コマンドを 1 つのバッファに作る。
::vim::buffer listTcl コマンドを全てのバッファに作る。
::vim::command [-quiet] {cmd}ex コマンドを實行する。
::vim::expr {expr}Vim の式評價を使用する。
::vim::option {opt}vim のオプションを得る。
::vim::option {opt} {val}vim のオプションを設定する。
::vim::window list全てのウィンドウに Tcl コマンドを作る。

コマンド:

::vim::beep

音を鳴らす。戾り値はない。

::vim::buffer {n}
::vim::buffer exists {n}
::vim::buffer list

vim バッファへのアクセスを提供する。整數引數を伴ひ、その數に對應するバッファへのバッファコマンド (|tcl-buffer-cmds| を參照) を作り、結果としてそのバッファの名前を返す。不正なバッファ番號は、標準 Tcl エラーを返す。有效なバッファ番號を調べるには、vim の內部函數を使ふとよい:

set nbufs [::vim::expr bufnr("$")]
set isvalid [::vim::expr "bufexists($n)"]

"list" オプションは、各有效バッファに對してバッファコマンドを作り、戾り値としてコマンドバッファの名前のリストを返す。

例:

set bufs [::vim::buffer list]
foreach b $bufs { $b append end "The End!" }

"exists" オプションは、與へられた番號のバッファが存在するかを確かめる。

例:

if { [::vim::buffer exists $n] } { ::vim::command ":e #$n" }

このコマンドは、將來のバージョンで變數に置き換へられるはずである。現在のバッファについては |tcl-var-current| も參照。

::vim::command {cmd}
::vim::command -quiet {cmd}

vim の (ex モードの) コマンド {cmd} を實行する。バッファ、ウィンドウに影響する ex コマンドは、全て現在のバッファ/ウィンドウを對象とする。標準 Tcl エラーコード以外の戾り値を返すことはない。このコマンドの終了後、"::vim::current" 變數は更新される。"-quiet" フラグは、vim からの全てのエラーメッセージを抑制する。

例:

::vim::command "set ts=8"
::vim::command "%s/foo/bar/g"

ノーマルモードのコマンドの實行には、"normal" を使ふ (|:normal| を參照):

set cmd "jj"
::vim::command "normal $cmd"

|tcl-window-command| と |tcl-buffer-command| も參照。

::vim::expr {expr}

式 {expr} を、vim の內部式評價 (|expression| を參照) を使つて評價する。バッファやウィンドウプロパティに問ひ合はせする種類の式は、全て現在のバッファ/ウィンドウを對象とする。結果を文字列として返す。リスト |List| は文字列に變換される。そのとき各要素の閒に改行が插入され、連結される。

例:

set perl_available [::vim::expr has("perl")]

|tcl-window-expr| と |tcl-buffer-expr| も參照。

::vim::option {opt}
::vim::option {opt} {value}

第 2 引數なしで、vim オプションの値を問ひ合はせる。この引數を伴へば、vim オプションに {value} を設定し、以前の値を結果として返す。’バッファに固有’、’ウィンドウに固有’ と記されてゐるオプションは、全て現在のバッファ/ウィンドウを對象とする。":set" コマンドでそれらを變更してもグローバルのオプションは變更されない。眞僞値のオプションでは、{value} は "0" か "1"、あるいは "on"、"off"、"toggle" のキーワードの內のどれかでなくてはならない。オプションの一覽は、|option-summary| を參照。

例:

::vim::option ts 8

|tcl-window-option| と |tcl-buffer-option| も參照。

::vim::window {option}

vim ウィンドウへのアクセスを提供する。今のところ、"list" オプションのみが實裝されてゐる。これは各ウィンドウに對し、ウィンドウコマンドを作り (|tcl-window-cmds| を參照)、戾り値としてコマンドの名前のリストを返す。

例:

set wins [::vim::window list]
foreach w $wins { $w height 4 }

このコマンドは、將來のバージョンで變數と置き換へられるはずである。現在のウィンドウについては、|tcl-var-current| を參照。

3. Tcl 變數

::vim 名前空閒は、いくつかの變數を持つてゐる。これらは vim に Tcl インタープリターが呼び出されたときに作られ、現在の値が設定される。

::vim::current"current" オブジェクトを含む排列
::vim::lbase最初の行番號
::vim::range現在の範圍の番號を含む排列
line文字列形式での現在の行 (:tcldo のみ)
lnum現在の行番號 (:tcldo のみ)

變數:

::vim::current

これは、vim から利用可能な樣々な "current" オブジェクトへのアクセスを提供する排列である。この排列の內容は、vim の現在の設定を變更 (例、カレントバッファの削除など) する可能性のある、"::vim::command" が呼び出された後に更新される。

"buffer" 要素は、カレントバッファへのバッファコマンドの名前を持つ。これで、直接バッファコマンドを利用することができる (|tcl-buffer-cmds| を參照)。この要素は讀取り專用である。

例:

$::vim::current(buffer) insert begin "Hello world"

"window" 要素は、カレントウィンドウへのウィンドウコマンドの名前を持つ。これで、直接ウィンドウコマンドを利用することができる (|tcl-window-cmds| を參照)。この要素は讀取り專用である。

例:

$::vim::current(window) height 10
::vim::lbase

この變數は、Tcl が行番號をどのやうに扱ふかを制禦する。

これが ’1’ にセットされてゐると、行と縱列は 1 から始まる。このとき、Tcl コマンドからの行番號と vim の表現は互換性を持つ。

この變數が ’0’ にセットされた場合、Tcl では行番號、縱列は 0 から始まる。これは、バッファを Tcl のリスト、行を Tcl の文字列として扱ひ、さらにインデックスを返す標準の Tcl コマンド (例へば、"lsort" や "string first") を使ふときに役に立つ。

標準値は ’1’ である。今のところ、非 0 の値は全て ’1’ として扱はれるが、この事實に依存したスクリプトを書くべきではない。|tcl-linenumbers| も參照。

::vim::range

これは 3 つの要素、"start", "begin", "end" から成る排列である。現在の範圍の、最初と最後の行番號を持つ。"begin" は "start" と同じである。この變數は讀取り專用である。|tcl-examples| を參照。

line
lnum

このグローバル變數は、ex コマンド ":tcldo" が實行されたときのみ利用可能である。これらはテキストと現在の行の行番號を持つ。

Tcl コマンドが ":tcldo" により呼び出されて完了したとき、"line" 變數が Tcl コマンドによつて設定解除されてゐないければ、現在の行は "line" 變數の內容に設定される。"lnum" 變數は讀取り專用である。

これらの變數は、"::vim" 名前空閒に屬してゐないため、修飾なしで ":tcldo" で使ふことができる (これは將來のバージョンで變更されるはずである)。|tcl-linenumbers| も參照。

4. Tcl ウィンドウコマンド

ウィンドウコマンドは、vim のウィンドウの表現である。これらはいくつかの方法で作られる:

::vim::current(window) 變數は、現在のウィンドウのウィンドウコマンドの名前を持つ。ウィンドウコマンドは、vim ウィンドウが閉ぢられるに從つて、自動的に破毀される。

ウィンドウコマンドの名前が Tcl 變數 "win" に格納される、すなはち、"$win" がコマンドを呼び出す、と假定しよう。次のオプションが利用可能である:

$win bufferウィンドウのバッファのTclコマンドを作る。
$win command {cmd}ウィンドウのコンキクストに、ex コマンドを實行する。
$win cursor現在のカーソルの位置を得る。
$win cursor {var}排列變數により、カーソルの位置を設定する。
$win cursor {row} {col}カーソルの位置を設定する。
$win delcmd {cmd}ウィンドウが閉ぢたら、Tcl コマンドを呼出す。
$win expr {expr}ウィンドウのコンキクストに、vim の式評價を行ふ。
$win heightウィンドウの高さを報告する。
$win height {n}ウィンドウの高さを設定する。
$win option {opt} [val]ウィンドウのコンテキストに、vim のオプションを取得/設定する

オプション:

$win buffer

ウィンドウのバッファの Tcl コマンドを作成し、戾り値としてその名前を返す。名前は變數に格納されるべきである:

set buf [$win buffer]

$buf は有效な Tcl コマンドとなる。利用可能なオプションについては、|tcl-buffer-cmds| を參照。

$win cursor
$win cursor {var}
$win cursor {row} {col}

引數なしで、現在のカーソル位置を文字列として返す。これは、Tcl の排列變數へと變換することができる:

array set here [$win cursor]

このとき、"here(row)" と "here(column)" がカーソル位置を持つ。1 つの引數を伴ふと、引數は 2 つの要素 "row" と "column" を持つべき、Tcl 排列變數名と解釋される。これらはカーソルを新しい位置へセットするために使はれる。

$win cursor here	;# not $here !

2 つの引數を伴ひ、カーソルを row と colum で指定した位置へセットする:

$win cursor $here(row) $here(column)

不正な位置指定は、"catch" にて捕捉可能な標準 Tcl エラーを返す。row と column の値は、"::vim::lbase" 變數に依存する。|tcl-var-lbase| を參照。

$win delcmd {cmd}

Tcl コマンド {cmd} を、ウィンドウ破毀のコールバックとして登錄する。このコマンドはウィンドウが閉ぢられた直後に (グローバルスコープで) 實行される。複雜なコマンドは、"list" により構成するとよい:

$win delcmd [list puts vimerr "window deleted"]

|tcl-buffer-delcmd| を參照。

$win height
$win height {n}

引數なしで、ウィンドウの現在の高さを報告する。引數を伴ふと、ウィンドウの高さを {n} に設定しようと試み、戾り値として新しい高さ (これは {n} ではないかもしれない) を返す。

$win command [-quiet] {cmd}
$win expr {expr}
$win option {opt} [val]

これらは、全てがカレントウィンドウの代はりに $win で表現されるウィンドウコンテキストにおいて實行されるといふ點を除けば、"::vim::command" などに似てゐる。例へば、’local to window’ と記されたオプションの設定は、ウィンドウ $win に影響を與へる。バッファへの影響、または問ひ合はせは、全てこのウィンドウに表示されるバッファ (すなはち、"$win buffer" で表現されるバッファ) を對象とする。より詳しい情報は、|tcl-command|, |tcl-expr|, |tcl-option| を參照せよ。

例:

$win option number on

5. Tcl バッファコマンド

バッファコマンドは vim のバッファを表現する。これらはいくつかの方法で作成される:

::vim::current (バッファ) 變數は、カレントバッファへのバッファコマンドの名前を持つてゐる。バッファコマンドは vim のバッファが破毀されると、それに合はせて自動的に削除される。バッファの內容が變更されると、バッファ內の全てのマークは自動的に調整される。Tcl コマンドによるバッファ內容への變更は、vim の "undo" コマンドで元に戾すことができる (|undo| を參照)。

バッファコマンドの名前が Tcl 變數 "buf" に格納されてゐる、すなはち、"$buf" がコマンドを呼出すものと假定しよう。次のオプションが利用可能である:

$buf append {n} {str}バッファの行 {n} の後に、行を追加する。
$buf command {cmd}バッファコンテキストで ex コマンドを實行する。
$buf countバッファ內の行數を返す。
$buf delcmd {cmd}バッファが削除されたら Tcl コマンドを呼ぶ。
$buf delete {n}1 行を削除する。
$buf delete {n} {m}數行を削除する。
$buf expr {expr}バッファコンテキストで、vim の式評價をする。
$buf get {n}1 行を文字列として取得する。
$buf get {n} {m}數行をリストとして取得する。
$buf insert {n} {str}バッファに行 {n} として、行を插入する。
$buf lastバッファの最終行の行番號を返す。
$buf mark {mark}バッファマークの位置を返す。
$buf nameバッファ內のファイル名を返す。
$buf numberそのバッファの番號を返す。
$buf option {opt} [val]バッファコンテキストで vim オプションを取得/設定。
$buf set {n} {text}1 行を置換する。
$buf set {n} {m} {list}數行を置換する
$buf windowsバッファウィンドウの Tcl コマンドを作成する。

ほとんどのバッファコマンドは引數として行番號を取る。Tcl コマンドがこれらをどう扱ふかは "::vim::lbase" 變數に依つてゐる (|tcl-var-lbase| を參照)。行番號の代はりに、いくつかのキーワードを使ふこともできる: "top", "start", "begin", "first", "bottom", "end", "last" が使へる。

オプション:

$buf append {n} {str}
$buf insert {n} {str}

バッファに行を追加する。"insert" オプションを伴ふと文字列は新しい行 {n} になり、"append" オプションを伴ふと行 {n} の後に插入される。

例:

$buf insert top "ここが始まり。"
$buf append end "ここで終はり。"

バッファに行にリストを追加するには、ループを使ふとよい:

foreach line $list { $buf append $num $line ; incr num }
$buf count

バッファ內の行の總數を返す。

$buf delcmd {cmd}

Tcl コマンド {cmd} を、バッファの削除に對するコールバックとして登錄する。このコマンドは、バッファが削除された直後に (グローバルスコープで) 實行される。複雜なコマンドは "list" として構成するべきである:

$buf delcmd [list puts vimerr "buffer [$buf number] gone"]

|tcl-window-delcmd| も參照。

$buf delete {n}
$buf delete {n} {m}

バッファから行 {n}、または行 {n} から {m} までを削除する。次の例は、最終行を除く全ての行を削除する:

$buf delete first [expr [$buf last] - 1]
$buf get {n}
$buf get {n} {m}

バッファから 1 行以上を取得する。1 行の場合、戾り値は文字列である; 數行の場合には文字列のリストが返される。

例:

set topline [$buf get top]
$buf last

最終行の行番號を返す。この値は "::vim::lbase" 變數に依存する。|tcl-var-lbase| を參照。

$buf mark {mark}

名前付きマークの位置を、ウィンドウコマンドの "cursor" オプションにて表されるカーソル位置に似た文字列として返す (|tcl-window-cursor| を參照)。これは Tcl 排列變數に變換される:

array set mpos [$buf mark "a"]

"mpos(column)" と "mpos(row)" はマークの位置を保持する。マークがセットされてゐなければ、標準 Tcl エラーが返される。

$buf name

バッファ內のファイル名を返す。ファイルなしのバッファの場合、空文字列を返す。

$buf number

そのバッファの番號を返す。|:buffer| を參照。この例は、vim からバッファを削除する:

::vim::command "bdelete [$buf number]"
$buf set {n} {string}
$buf set {n} {m} {list}

バッファ內の 1 行以上を置換する。リスト (list) が置換される行以上の要素を持つてゐた場合、それらはバッファに追加される。リストの要素が少ない場合には、置換されなかつた行はバッファから削除される。

$buf windows

そのバッファに表示されてゐる各ウィンドウに對し、ウィンドウコマンドを作成し、コマンド名のリストを結果として返す。

例:

set winlist [$buf windows]
foreach win $winlist { $win height 4 }

可能なオプションについては |tcl-window-cmds| を參照。

$buf command [-quiet] {cmd}
$buf expr {expr}
$buf option {opt} [val]

これらは、カレントバッファではなく、$buf で表されるバッファコンテキストにおいて全てが實行されるといふこと以外は、"::vim::command" などと同じである。

例へば、’local to buffer’ と記されたオプションの設定は、バッファ $buf に作用する。ウィンドウへの作用、あるいは問ひ合はせは、全て vim のウィンドウリストの內でこのバッファを表示してゐる最初のウィンドウ (すなはち、"$buf windows" で最初に返されるエントリ) に對して行はれる。

より詳しい情報は |tcl-command|, |tcl-expr|, |tcl-option| を參照。

例:

if { [$buf option modified] } { $buf command "w" }

6. その他; Tcl からの出力

標準 Tcl コマンド "exit" と "catch" は、カスタムバージョンのものと置き換へられてゐる。"exit" は、現在の Tcl スクリプトを終了して vim に戾り、Tcl インタープリターを破毀する。その後、":tcl" が呼出されたときに、新しい Tcl インタープリターが作成される。"exit" は、vim を終了させることはない!

"catch" は、"exit" でのスクリプトの終了を妨げることがない點を除けば、標準のものと同じである。終了コードが 0 でないとき (exit code != 0)、Tcl スクリプトを呼出した ex コマンドはエラーを返す。

2 つの新しい I/O ストリーム、"vimout", "vimerr" が Tcl から利用可能である。これらに向けられた全ての出力は、それぞれ vim の情報メッセージとエラーメッセージとして、メッセージエリアに表示される。標準 Tcl 出力ストリーム stdout と stderr は、普通の "puts" コマンドで vim にメッセージを表示できるやう、vimout と vimerr に割當てられる。

7. 既知のバグと問題點

Tcl 內部から、("::vim::command" を介して) Tcl の ex コマンドを呼出すと、豫期できない副作用を起こす可能性がある。

このコマンドは、"::vim::command" を安全な子インタープリター內で利用可能にするため、その子インタープリターを不安定にして、標準のインタープリターと同じ能力を持つ新しいインタープリターを作る。(ネストされた :tcl* 呼び出しをブロックしたり、安全なインタープリターから新しい安全なインタープリターのみを呼出すやう保證することは簡單なことだが、それは不適切である - vim の設定により、"::vim::command" は他の多くのスクリプト言語の任意のコードを實行することができるからである。)

この新しいインタープリター內での "exit" 呼出しは、古いインタープリターには影響しない; 新しいインタープリターのみを終了し、スクリプト處理は古いインタープリターで正常に續けられる。

stdin からの入力は、今のところサポートされてゐない。

8. 例:

いくつかの小さな (そして、たぶん役に立つ) Tcl スクリプトを紹介しよう。

このスクリプトはバッファ全體の行をソートする (名前のリストとか、そのやうなものであると假定する):

set buf $::vim::current(buffer)
set lines [$buf get top bottom]
set lines [lsort -dictionary $lines]
$buf set top bottom $lines

このスクリプトは、バッファ內の行を反轉する。"::vim::lbase" と "$buf last" は、どんな行番號の設定でも機能することに注目。

set buf $::vim::current(buffer)
set t $::vim::lbase
set b [$buf last]
while { $t < $b } {
        set tl [$buf get $t]
        set bl [$buf get $b]
        $buf set $t $bl
        $buf set $b $tl
        incr t
        incr b -1
}

このスクリプトは、現在の範圍の各行に連續した番號を付け加へる:

set buf $::vim::current(buffer)
set i $::vim::range(start)
set n 1
while { $i <= $::vim::range(end) } {
        set line [$buf get $i]
        $buf set $i "$n\t$line"
        incr i ; incr n
}

同じことが、":tcldo" による 2 つの ex コマンドで、より迅速に行へる:

:tcl set n 1
:[range]tcldo set line "$n\t$line" ; incr n

このプロシージャは、各バッファでexコマンドを走らせる (Ron Aaron 氏のアイデア):

proc eachbuf { cmd } {
        foreach b [::vim::buffer list] {
                $b command $cmd
        }
}

こんな風に使ふ:

:tcl eachbuf %s/foo/bar/g

Tcl の文字列とバックスラッシュの置換には氣をつけてほしい。疑はしいときは、丸括弧で ex コマンドを括つておくとよい。

いくつかの Tcl コマンドをずつと vim で使ひたいといふなら、それらをファイル (例へば Unix マシンでは "~/.vimrc.tcl" など) に入れておき、スタートアップファイル (Unix マシンなら標準で "~/.vimrc") に以下の行を付け加へる:

if has("tcl")
        tclfile ~/.vimrc.tcl
endif

9. 動的ローディング

MS-Windows と UNIX では Tcl ライブラリを動的に讀み込むことが可能である。これを行ふと |:version| の出力に |+tcl/dyn| が含まれるやうになる。

この場合、Vim は必要なときだけ Tcl の DLL ファイルや共有ライブラリファイルを檢索する。Tcl インターフェイスを使はないときはこれらは不要なので、それらのファイルが無くても Vim を使ふことができる。

MS-Windows

Tcl インターフェイスを使ふには Tcl の DLL が檢索パス內に存在しなければならない。コンソールウィンドウで "path" とタイプすると、どのディレクトリが檢索パスとなるか表示することができる。また ’tcldll’ オプションを Tcl の DLL を指定するのに使ふこともできる。

DLL の名前は Vim をコンパイルした時の Tcl のバージョンに一致しなければならない。現在その名前は "tcl83.dll" である。これは Tcl8.3 用である。これを確かめるには、"gvim.exe" を開き、"tcl\d*.dll\c" を檢索する。

Unix

コンパイル時に DYNAMIC_TCL_DLL で指定されたファイルの代はりに ’tcldll’ オプションで使用する Tcl の共有ライブラリのファイルを指定するのに使へる。共有ライブラリのバージョンは Vim をコンパイルする時に用いた Tcl のバージョンと一致してゐなければならない。


Up: 目次   [Index]