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

とやればできます。*1 *2

※注意※
配列のキー名に
"-"(ハイフン) や"."をつかったらエラーになってしまうので、
気をつけて行った方がいいかもしれません。

*1:※追記※ thincaさんにご指摘を頂き、誤っていた箇所を修正致しました。ありがとうございます!

*2:※追記※ tyruさんににもコメント欄で丁寧にご指導頂きました。勉強になりました!

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

これでできるはず。

aliasで記述したコマンドに引数を渡す方法

コマンドラインからの全文検索

% find ./ -type f | xargs grep hoge

とかでできますが、非常にめんどくさい。。。


ログインシェルに alias 書いて引数取れるようにしました。
.cshrc

alias    ff "find \!:1 -type f -print| xargs grep \!:2"

これで

% ff ./ hoge

とやれば全文検索できます。

ほかにもいろいろできそう。。。