vimscriptの辞書型(ハッシュ)で動的にキーを生成する
たとえば、動的に、キーを作成して追加していきたいとき、
PHPでは
$hash = array(); $key = 'dynamic'; $value = true; //変数を用いて動的にキー、値を作成 $hash[$key] = $value;
とやりますね。
これと同様のことをvimscriptでやりますと、
" 初期化 let dic = {} let key = 'dynamic' let value = 1 execute 'let dic.' . key . '=' .value
※注意※ 配列のキー名に "-"(ハイフン) や"."をつかったらエラーになってしまうので、 気をつけて行った方がいいかもしれません。
vimscriptで関数を動的に呼び出す
たとえば、PHPなどでは動的に関数を呼び出したいときは
//dynamic() という関数を呼び出す場合 $methodName = 'dynamic'; $result = $this->$methodName();
のように記述すればよいですね。
これと同じようなにvimscriptで動的に関数を呼び出したいときは
"Dynamic() という関数を呼び出す場合 let l:fn = 'Dynamic' execute 'let l:result = ' . l:fn . '()' "execute は exe でも可
というように記述すればできます。
execute は Javascript 等でいう eval のようなものです。
vimscript 定義した関数(function)での引数の取得方法
引数の受け渡し方法で多少分からなかったのでメモ。
スクリプトファイル(.vimrc など)で以下のように書く
"引数を取得できるようにしておく command! -nargs=* TestHello call TestHello(<f-args>) function! TestHello(name,age) echo 'My name is ' . a:name . '.' echo 'I'm ' . a:age . '.' endfunction!
これでvimを開き、コマンドモードで
:TestHello yamato 80
とすると
My name is yamato.I'm 80.
となります。
vimscript 変数のスコープ一覧
vimscript を書いていて変数のスコープが気になったのでメモ
※変数名とは s:hogehoge , a:hogehoge などの s や a の部分
変数名 | 意味 | スコープ |
---|---|---|
v: | vimの定義済み変数 | vim全体 |
g: | グローバル変数 | vim全体 |
s: | スクリプトファイルローカル変数 | カレントのスクリプトファイル全体 |
l: | ファンクションローカル変数 | 記述した関数内のみ |
a: | ファンクション引数 | 記述した関数内のみ(引数を受け取る) |
w: | ウィンドウ変数 | vimウィンドウ全体 |
t: | タブ変数 | カレントのタブ全体 |
b: | バッファ変数 | カレントのバッファ全体 |
でも、vimscript書いているときは
v, g, s, l ,a の5つ位しか使わない気がする・・・
vim でタブを利用する - タブの使い方 -
たくさんのファイルを開いているとき、
split や Ctrl + o , Ctrl + i ではどうも対応しきれくなってきますね。
そこで、タブを利用しました。
vim で
:tabnew ファイル名
でタブを開けるのです。
NERDTreeを使えば、
ファイル上で t で新規タブで開けます。
タブの移動はコマンドモードで
gt
gT
なのですが、
vimrcに下記設定を追加します。
nnoremap <C-n> gt nnoremap <C-p> gT
これで、
Ctrl + n(ext) で次のタブへ
Ctrl + p(review) で前のタブへ
移動できるようになりました!
タブって便利ですね。
DBの作成 複数カラムにPRIMARYを設定する(MySql)
複数カラムをPRIMARYにする必要がでてきたので、
http://www.dbonline.jp/mysql/table/index8.html
を見てやってみた。
CREATE TABLE db_name.table_name (col_name1 data_type1 not null,col_name2 data_type2 not null,col_name3 data_type3 PRIMARY KEY(col_name1, col_name2));
これでできるはず。