*ft_sql.txt* For
Vim バージョン 7.3. Last change: 2010 Jul 20
by David Fishburn
これは SQL ファイルを編集するためのファイルタイププラグインです。
Structured Query Language (SQL) はリレーショナルデータベースと対話するための文
を規定した規格です。Vim には SQL 内を移動、インデント、構文ハイライトする機能
が備わっています。
1. 移動
|sql-navigation|
1.1 Matchit
|sql-matchit|
1.2 オブジェクト単位の移動
|sql-object-motions|
1.3 SQL 独自のオブジェクト単位移動
|sql-predefined-objects|
1.4 マクロ
|sql-macros|
2. SQL の方言
|sql-dialects|
2.1 SQLSetType
|SQLSetType|
2.2 SQLGetType
|SQLGetType|
2.3 SQL 方言の既定値
|sql-type-default|
3. SQL 方言を追加する
|sql-adding-dialects|
4. SQL オムニ補完
|sql-completion|
4.1 static モード
|sql-completion-static|
4.2 dynamic モード
|sql-completion-dynamic|
4.3 SQL 補完のチュートリアル
|sql-completion-tutorial|
4.3.1 テーブル補完
|sql-completion-tables|
4.3.2 カラム補完
|sql-completion-columns|
4.3.3 プロシージャ補完
|sql-completion-procedures|
4.3.4 ビュー補完
|sql-completion-views|
4.4 補完のカスタマイズ
|sql-completion-customization|
4.5 SQL 関連のマップ
|sql-completion-maps|
4.6 他のファイルタイプのファイル内で使うには
|sql-completion-filetypes|
==============================================================================
1. 移動
*sql-navigation*
SQL ファイルタイププラグインはファイル内の移動を支援するためのオプションを多数
備えています。
1.1 Matchit
*sql-matchit*
-----------
matchit プラグイン(
http://www.vim.org/scripts/script.php?script_id=39)はたくさ
んの機能を備えており、異なる言語に対応するためにカスタマイズすることができます。
matchit プラグインはローカル変数 b:match_words を定義することで設定します。様
々なキーワードの上で % キーを押すと、それに対応する位置へカーソルを移動します。
例えばカーソルが "if" の上にあるとき % を押すと "else", "elseif", "end if" の
間を循環して移動します。
以下のキーワードがサポートされています:
1.2 オブジェクト単位で移動
*sql-object-motions*
-----------------------
Vim には既定でテキストオブジェクトを操作するキーがたくさん定義されています
|object-motions|。このファイルタイププラグインはこれらのキーの一部を SQL 用に
再定義します。
SQL ファイルを編集するとき、以下のノーマルモード
|Normal|とビジュアルモード
|Visual|のマップが定義されます:
1.3 SQL 独自のオブジェクト単位移動
*sql-predefined-objects*
-----------------------------
ほとんどのリレーショナルデータベースはテーブル、インデックス、トリガー、ストア
ドプロシージャなど様々な標準的な機能を備えています。また、ベンダごとに様々な独
自オブジェクトがあります。次のマップたちはこれらのオブジェクト間を移動するため
に作られています。お使いのデータベースによってオブジェクトのリストを調整できる
ようでなればなりません。このファイルタイププラグインは標準オブジェクトのほとん
どと、多くの追加的なオブジェクトを定義しています。これを可能な限りフレキシブル
にするために、
|vimrc| でオブジェクトのリストを上書きできるようになっています。
次のようにします:
上記のリストを対象として、以下のノーマルモード
|Normal|とビジュアルモード
|Visual|のマップが定義されています:
繰り返し ]} を押すとこれらの create 文の間を循環して移動します:
g:ftplugin_sql_objects の既定値は以下の通りです:
上記の設定は以下の場合にも対応しています:
既定では CREATE 文だけを検索します。
|vimrc| に以下を書くと、他の文も対象にする
ことができます:
このファイルタイププラグインは以下の3種類のコメントを定義しています:
コメントを対象として、以下のノーマルモード
|Normal|とビジュアルモード
|Visual|で
のマップが定義されています:
1.4 マクロ
*sql-macros*
----------
|'define'| に以下の正規表現を設定することにより、マクロ定義を見つけるための
Vim の機能に対応しています:
この正規表現は以下のようなコードに対応しています:
以下の行の "myVar1" の上にカーソルを置いて、:
以下のキーのどれかを押してみてください:
==============================================================================
2. SQL の方言
*sql-dialects* *sql-types*
*sybase* *TSQL* *Transact-SQL*
*sqlanywhere*
*oracle* *plsql* *sqlj*
*sqlserver*
*mysql* *postgresql* *psql*
*informix*
すべてのリレーショナルデータベースは SQL に対応しています。SQL の一部分はベン
ダー間で移植可能です(例: CREATE TABLE, CREATE INDEX)が、ベンダー固有の拡張が大
量にあります。Oracle は "CREATE OR REPLACE" 構文、CREATE TABLE 文でのカラム既
定値の指定、プロシージャ言語(ストアドプロシージャとトリガー)を備えています。
標準の Vim ディストリビューションには Oracle の PL/SQL に基づいた構文ハイライ
トが付属しています。SQL インデントスクリプトは Oracle と SQL Anywhere
用に動作します。ファイルタイププラグインはすべてのベンダ用に動作し、ベンダ中立
を保ちつつも拡張可能であるべきです。
現在様々なベンダに対応しています。これは構文スクリプトを通して実現しています。
残念なことに、複数の構文ルールを切り替えるには以下のどれかを作成しなければなり
ません:
1. 新しいファイルタイプ
2. 独自のオートコマンド
3. コマンド手動実行
大多数の人は1つのベンダのデータベース製品しか扱わないため、
|vimrc| で既定値を
設定しておくとよいでしょう。
2.1 SQLSetType
*sqlsettype* *SQLSetType*
--------------
複数のデータベースを扱っている人々にとっては、バッファごとまたは任意のタイミン
グでベンダのルール(インデント、構文)を切り替えられるとよいでしょう。
ftplugin/sql.vim では次のコマンドが定義されています:
このコマンドを引数なしで実行すると、インデントと構文スクリプトが既定値に戻りま
す。既定値は
|sql-type-default| を参照してください。Vi 互換モードをオフにして
いると (
|'compatible'|)、
<Tab> キーで引数を補完できます。
コマンド名とスペースをタイプした後、引数を指定するために補完を利用できます。こ
のコマンドは source したい Vim スクリプトの名前を受け取ります。
|cmdline-completion| 機能により、SQLSetType コマンドは
|'runtimepath'| から
名前に
'sql' を含む Vim スクリプトを検索します。これは名前のスペルから推測を取
り出します。以下が例です:
もっとも簡単な方法は、
<Tab> を使ってまずコマンド名(SQLSetType)を補完し、スペー
スに続いてもう一度
<Tab> を押すと利用可能な Vim スクリプトの名前のリストが表示
されます:
2.2 SQLGetType
*sqlgettype* *SQLGetType*
--------------
現在、どのSQL の方言が使われているかを調べるには、コマンド SQLGetType を使い
ます。ftplugin/sql.vim で次のコマンドが定義されています:
このコマンドを使うと、以下のような文字列がエコー表示されます:
2.3 SQL 方言の既定値
*sql-type-default*
-----------------------
すでに述べたように、Vim の既定の構文ルールは Oracle (PL/SQL) に基づいています。
これを上書きするには、次のうちどれかを
|vimrc| に書きます:
次を
|vimrc| に書くと:
次回 SQL ファイルを編集するときには以下のスクリプトが自動的に読み込まれます:
indent/sqlinformix.sql は読み込まれていないことに注意してください。Informix 用
のインデントファイルは存在しないため、既定のインデントファイルが読み込まれてい
ます。
==============================================================================
3. SQL 方言を追加する
*sql-adding-dialects*
Vim の標準ディストリビューションにスクリプトが含まれていない SQL 方言を扱うと
きは、対応するスクリプトが投稿されていないか
http://www.vim.org をチェックして
みてください。もしなければ既存のスクリプトをコピーしてカスタマイズしましょう。
詳しくは
|filetype-plugins| を参照してください。
スクリプトを識別しやすくするために、ファイル名の先頭に "sql" という接頭辞をつ
けてください。例えば SQLite データベース用のカスタマイズを作りたい場合は、以下
のファイルを作成します:
SQLSetType コマンドには変更を加える必要はありません。SQLSetType コマンドを実行
すると自動的に新しい SQL ファイルが選ばれ、読み込まれます。
==============================================================================
4. SQL オムニ補完
*sql-completion*
*omni-sql-completion*
Vim 7 にはプラグイン開発者が任意の言語用のコード補完を作るためのインターフェイ
スと関数が備わっています。Vim 7 には SQL 言語用のコード補完が含まれています。
SQL 補完プラグインには static と dynamic という2つのモードがあります。static
モードは 現在の構文強調ルールから生成されたデータをもとにポップアップを表示し
ます。dynamic モードはデータベースから直接抽出したデータをもとにポップアップ
を表示します。このデータにはテーブルのリスト、カラムのリスト、プロシージャ名な
どが含まれます。
4.1 static モード
*sql-completion-static*
---------------
static ポップアップはファイルタイプが SQL のファイルを編集しているときに、使用
中の構文ルールで定義された項目を含んで表示されます。プラグインは、表示される項
目のリストを絞り込むための様々なマップを用意しています。
既定の static マップは次の通りです:
"
<C-C>" のキーは環境によっては動作しないかもしれません。そこで、以下の行を
|.vimrc| に書くことで "
<C-C>" を他のキーに変更できます:
static マップ(構文強調グループに基づいている)は以下の形式で定義されています:
このコマンドは次のように分解できます:
'syntax' キーワードを使うのは特別な場合です。これは syntaxcomplete プラグイン
にすべての構文アイテムを抽出するよう指示します。そのためこれは Vim のどの SQL
構文ファイルに対しても有効です。これを書いている時点でこれは SQL 方言用の10
個の構文ファイルを含んでいます(上の セクション3
|sql-dialects| を参照)。
構文ファイルから抽出される項目の例を以下に示します:
4.2 dynamic モード
*sql-completion-dynamic*
----------------
dynamic モードではデータベースから直接抽出したデータを元にポップアップを表示
します。dynamic 機能を有効にするためには dbext.vim をインストールしなければな
りません(
http://vim.sourceforge.net/script.php?script_id=356)。
dynamic モードは SQL 補完プラグインのいくつかの機能から使われています。dbext
プラグインをインストールしたら dbext-tutorial の設定と使い方を読んでください。
dbext を使うと SQL 補完プラグインがテーブル、プロシージャ、ビュー、カラムのリ
ストを表示できるようになります。
これらのリストをポップアップを表示するには、インサートモードで以下のキーを使い
ます(ここで
<C-C> は CTRL キーを押しながら C キーを押すという意味です):
テーブルリスト -
<C-C>t
-
<C-X><C-O> (既定のマップはテーブルリスト)
ストアドプロシージャリスト -
<C-C>p
ビューリスト -
<C-C>v
カラムリスト -
<C-C>c
ドリルイン/アウト - テーブルリストのポップアップウィンドウを表示中
に
<Right> を押すと現在選択されているテーブル
のカラムリストの表示に切り替わります。
- カラムリストのポップアップウィンドウを表示中に
<Left> を押すとテーブルリスト表示に切り替わり
ます。
- これを使えばテーブルリストとカラムリストの表示を
素早く切り替えることができます。
-
<Right> と
<Left> のキーも
|.vimrc| により変更で
きます
SQL 補完プラグインはポップアップウィンドウに表示されるリストをキャッシュしてお
きます。これによってリストの再表示がとても高速になります。データベースに新しい
テーブルやカラムが追加されたときはプラグインのキャッシュをクリアする必要が出て
くるかもしれません。キャッシュをクリアするための既定のマップは次の通りです:
4.3 SQL 補完のチュートリアル
*sql-completion-tutorial*
----------------
このチュートリアルは SQL 補完プラグインの主な機能を一通り紹介することを意図し
て次のことが書かれています:
まず、新規バッファを作成しましょう:
static な機能
---------------
各種のリストを表示するには、単にインサートモードで次をタイプします:
<C-C>s (SQL 文を表示する)
そしてリストの中を"select"まで下に移動していきます。 探している項目をよく知っ
ている場合、例えばそれが"s"という文字で始まることを知っている場合は、その文字
を続けてタイプできます。"se"とタイプしてから(引用符はタイプしません):
<C-Space>t
を押してみてください。
"select"が選択されたところで
<Enter> を押すとその項目を確定します。次に
* fr
<C-C>a (すべての構文アイテムを表示する)
とタイプしてみてください。"from"が候補に現れるでしょう。
ストアドプロシージャを書くときには型リストが便利です。型リストはそのデータベー
スがサポートしているすべての型を含んでいます。ただしこれはお使いの構文ファイル
に依存します。SQL Anywhere 構文ファイル(sqlanywhere.vim)は以下のような場合に対
応しています :
dynamic な機能
----------------
dynamic な機能を使うにはまず dbext.vim
(
http://vim.sourceforge.net/script.php?script_id=356) をインストールしなければ
なりません。このプラグインにはチュートリアルが付属しています。SQL 補完プラグイ
ンの観点からすると、dbext の主な機能はデータベースへの接続です。dbext の接続プ
ロファイルは接続情報を定義するためのもっとも効果的なメカニズムです。一度接続が
確立されていれば、SQL 補完プラグインはポップアップを表示する際にバックグラウン
ドで dbext の機能を利用します。
dbext.vim を正しく設定したら、テストするためにコマンド :DBListTable を実行しま
す。 テーブルのリストが表示されれば dbext.vim が正常に動作しています。表示され
ない 場合は dbext.txt を読んで調べてください。
既に dbext のチュートリアルをやっていれば、
<C-C>t でテーブルのリストを表示でき
ることをご存知でしょう。dbext がテーブルリストを作成する間、少々時間がかかりま
す。リストが表示されたら
<C-W> を押してください。するとポップアップウィンドウ
と既に選択されたテーブル名の両方が消えます。
C-c>t を押すと、dbext により接続したデータベース内のテーブルのリストが表示さ
れます。
NOTE: SQL 補完ポップアップはすべてキーマップの前のプリフィックスに対応していま
す。プリフィックスを指定すると、ポップアップウィンドウの内容がその文字列で始ま
るものだけに制限されます。
SQL 補完プラグインは特定のテーブルのカラムのリストを表示することもできます。
このカラム補完は
<C-C>c で起動できます。
NOTE: 以下の例ではポップアップウィンドウの表示中に
<Right> でカラムリストを
表示しています。
カラム補完を使用している様子の例:
- もう一度
<C-C>t を押すとテーブルのリストが表示されます。
- 補完ウィンドウにリストが表示されているとき
<Right> を押すとテーブル
のリストが消え、途中まで 入力されたテーブルに含まれるカラムのリスト表
示に切り替わります(すこし時間がかかります)。
-
<Left> を押すとカラムリストからテーブルリストに切り替わります。これに
よってテーブルリストとカラムリストをとても素早く切り替えられます。
- 同じテーブルに対してもう一度
<Right> を押すと、今度はカラムリストが
キャッシュされているため時間がかからないことに気づくでしょう。キャッ
シュしているテーブルのスキーマが変更されたときは
<C-C>R を押します。す
るとSQL 補完のキャッシュがクリアされます。
-
NOTE:
<Right> と
<Left> は補完ウィンドウがアクティブな状態で動作す
るよう設計されています。補完のポップアップウィンドウがアクティブでない
場合はノーマルモードでの
<Right> と
<Left> の動作になります。
SQL 文を動的に組み立てる方法を見ていきましょう。select 文にはカラムのリストが
必要です。SQL 補完プラグインを使ってカラムのリストを組み立てる方法は 2 通りあ
ります。
1. SELECT を入力した後に
<C-c>t を押してテーブルリストを表示します。
2. リストからテーブルを選択します。
3.
<Right> を押してカラムリストを表示します。
4. リストからカラムを選択してエンターを押します。
5. "," を入力して
<C-c>c を押します。通常、カラムリストを生成するには
カーソルをテーブル名の上に置かねばなりません。プラグインはその名前
を使ってどのテーブルからカラム リストを抽出するか決定します。このス
テップではカーソルをテーブル名の上に置かずに
<C-c>c を押したため、
表示されるカラムリストは前に使ったテーブルが対象となります。そして
カラムを選択して続けます。
6. ステップ 5 を必要なだけ繰り返します。
1. SELECT と入力してから
<C-C>t を押すとテーブルのリストが表示されます。
2. カラムリストを表示したいテーブルにカーソルを合わせます。
3.
<Enter> を押してテーブルを選択します。
4.
<C-C>l を押してそのテーブル内の全カラムのカンマ区切りのリストを表示
させます。
5. ステップ 3 で選んだテーブル名に基づいてプラグインは妥当なテーブルエ
イリアスを決定します。ここでそのエイリアスを受け入れるかどうかプロ
ンプトが表示されます。OK を押してください。
6. するとテーブル名が消え、代わりにそのテーブルのカラムリスト(各カラム
名の前にエイリアスがつき、カンマ区切りになったもの)が挿入されます。
7.
<C-C>L を押すとステップ 3 と 4 を同時に実行できます。これは、リス
トの中で現在選ばれているテーブルで決定するためにマップの中に
<C-Y>
を埋め込んでいます。
select 文を書くための特別な機能があります。 次の文を書く場合を考えてください:
インサートモードで "customer" テーブルのエイリアスである最後の "c." を入力した
後、
<C-C>c または
<C-X><C-O> を押してみてください。すると customer テーブルの
カラムのリストがポップアップ表示します。これは、select 文の開始位置を見て FROM
句で指定されたテーブルのリストを探しています。この場合は文字列 "customer c"
("c" は customer テーブルのエイリアス)が発見されます。省略可能なキーワード
"AS" にも対応しています。例: "customer AS c"
テーブルリストと同様に、
<C-C>p でデータベースに登録されているストアドプロシー
ジャのリストを表示できます。
テーブルリストと同様に、
<C-C>v でデータベースに登録されているビューのリストを
表示できます。
4.4 補完のカスタマイズ
*sql-completion-customization*
----------------------------
|vimrc| でオプションをセットすることによって SQL 補完プラグインをカスタマイズ
できます:
- 既定値: この変数は定義されていない
- この変数が定義されている場合はオムニ補完用のマップが作られません。よ
り詳しくは
|sql-completion-maps| を参照。
- 既定値: a
- この設定はカンマ区切りのカラムリストを生成するときに参照されます。
既定ではカラムリストを生成するマップは
<C-C>l です。カラムリストを
生成するときに各カラムの前にエイリアスがつきます。例えば:
e.emp_id, e.emp_name。このオプションには 3 種類の値を設定できます:
エイリアスは以下の規則によって決定されます:
1. テーブル名が '_' を含んでいれば、それを区切り文字に使います
:
2. テーブル名が '_' を含んでいないが大文字・小文字が混在してい
れば、それを区切り文字に使います:
3. テーブル名が '_' を含んでいなく、大文字・小文字も混在してい
なければテーブル名の最初の文字を使います:
- 既定値:
'ignorecase' の現在値
- 有効な値は 0 または 1。
- 数文字を入力してから補完を開始すると、リストの要素がその文字列で始ま
るものだけにフィルタされます。このオプションが 0 の場合は、そのフィ
ルタが大文字・小文字を区別します。
- 既定値: dbext.vim 3.00 がインストールされていなければ 0
- 有効な値は 0 または 1。
- テーブル、プロシージャ、ビューのリストを補完するとき、dbext.vim 3.00
以上を使っていればオブジェクトのリストにその所有者名がつきます。
これらのオブジェクトを補完するとき omni_sql_include_owner が有効に
なっていればその所有者名も置き換えられます。
- 既定値:
[
'syntax','sqlKeyword','sqlFunction','sqlOption','sqlType','sqlStatement']
- sqlcomplete は他のプラグインと組み合わせて使うことができます。その方
法の概略は
|sql-completion-filetypes| で説明されています。一時的に
ファイルタイプが SQL に変更されたとき、SQL 補完プラグインはこのオプ
ションで指定されたリスト内の構文グループをキャッシュします。
4.5 SQL 関連のマップ
*sql-completion-maps*
------------
既定の SQL 関連のマップはこのドキュメントの他の節で詳しく説明しました。ここで
は簡潔な説明つきのマップのリストを示します。
static モードのマップ
-----------
以下は Vim の構文強調ルールを使って補完リストを作成するマップです。
- SQL 構文アイテムを全て表示します。
- 'sqlKeyword' と定義された構文アイテムを全て表示します。
- 'sqlFunction' と定義された構文アイテムを全て表示します。
-'sqlOption' と定義された構文アイテムを全て表示します。
- 'sqlType' と定義された構文アイテムを全て表示します。
- 'sqlStatement' と定義された構文アイテムを全て表示します。
dynamic モードのマップ
------------
以下は dbext.vim プラグインを使用して補完リストを作成するマップです。
- テーブルのリストを表示します。
- プロシージャのリストを表示します。
- ビューのリストを表示します。
- 指定テーブルのカラムのリストを表示します。
- 指定テーブルのカラムのリストをカンマ区切りで表示します。
- 指定テーブルのカラムのリストをカンマ区切りで表示します。
補完ウィンドウがアクティブなときだけ使用できます。
- 現在補完リストでカーソルが指しているテーブルのカラムリストを表示しま
す。ほとんどの Unix システムでは
<Right> を認識できないため、この
マップは Windows でのみ定義されます。同じ機能を Unix でも利用するに
は他のキーを選んで自分の vimrc で同じマップを定義してください。
- テーブルのリストを表示します。ほとんどの Unix システムでは
<Left>
を認識できないため、このマップは Windows でのみ定義されます。同じ機
能を Unix でも利用するには他のキーを選んで自分の vimrc で同じマップ
を定義してください。
- キャッシュされた項目を全て削除し、項目のリストを再生成するよう強制し
ます。
マップのカスタマイズ
--------------------
好みに応じてマップを作成できます。一般的に、これらのマップは構文強調グループを
定義します。
デフォルトで作成されるマップが好みでなかったり、そのキーがお使いのプラット
フォームでは動作しない場合、次の変数を
|vimrc| で定義してください:
ftplugin/sql.vimを直接編集することはやめてください。このファイルを変更しても、
将来アップデートしたときその変更は上書きされてしまいます。Vim は、ディストリ
ビューションに含まれているファイルを変更することなくカスタマイズを行うために
after というディレクトリ構造を備えています。マップをカスタマイズするには
after/ftplugin/sql.vim を作成します(
|after-directory|を参照)。そしてその中で
ftplugin/sql.vim に書かれているのと同じマップを、好みのキーストロークに対して
定義します。
<C-C> が選ばれたのは、それが Windows、*nix のどちらでも動作するか
らです。Windows では
<C-Space> やALT キーを使うこともできます。
4.6 他のファイルタイプのファイル内で使うには
*sql-completion-filetypes*
------------------------------
SQL を他のファイルタイプのファイル内で使う機会はよくあります。例えば Perl,
Java, PHP, Javascript はどれもデータベースと対話できます。編集中の言語の補完機
能に加えて SQL 補完も使いたいという状況はよくあります。
そんな場合は、以下のステップによって簡単に実現できます(Perlの例です):
ステップ 1
------
Perl ファイルの編集を始めます。自動的にファイルタイプが "perl" になります。デ
フォルトで、ファイルタイプ・ファイルの ftplugin/perl.vim が読み込まれます。
|ft-syntax-omni| に書かれているコマンドによって構文補完プラグインを使っている
場合は、オプション
|'omnifunc'| が "syntax#Complete" にセットされます。
<C-X><C-O> を押すと Perl の構文アイテムを含むオムニポップアップが表示されます。
ステップ 2
------
手動でファイルタイプを
'sql' にセットすると、やはり対応するファイルタイプ・
ファイルの ftplugin/sql.vim が読み込まれます。このファイルは、SQL 補完用に多数
のバッファ固有のマップを定義します(
|sql-completion-maps| を参照)。こうしてマッ
プが作成され、SQL 補完プラグインが初期化されます。全ての SQL 構文アイテムが準
備的にキャッシュされます。SQL ファイルタイプ・スクリプトは2種類の補完プラグイ
ンを使おうとしていることを検出します。
<C-C> で始まる SQL 用のマップが呼び出さ
れると、その実行中だけ
|'omnifunc'| を切り替えます。そのため、
<C-X><C-O> は (構
文補完プラグインによる) Perl 用の補完のために使用し、
<C-C> は SQL 補完機能のた
めに使用できます。
ステップ 3
------
ファイルタイプを Perl に戻すと、"perl" に関連する全ての構文要素が元通りになり
ます。
vim:tw=78:ts=8:ft=help:norl: