まえがき
vim触り始めていろいろあそんでみた。pluginとかあるみたいだけど、使わないでみた。本格的に触り始めて3日ぐらい。
動機
予約語とかは新しいものがでれば、増えていくので、そこを動的に取り入れていけぬかとおもってしまったので。
でぃれくとり構成
dictフォルダ配下に各言語のdictファイル置いてみる。envフォルダには定数的ななにかを。funcフォルダはできしだいいれていいく。initは雰囲気できってみた。syntaxフォルダには各言語ごときる。(←ゆくゆくは動的に造り替えられるようにいじりたい。ファイル無駄に作りたくない。めんど。今回はsqlしかないので、sql.vimとしました。funcフォルダに定義したfunctionをsyn.vimでcallしてsyntax formatを各言語ごとに当てたい。)plugフォルダはプラグインを。動作確認はa.sqlで。いつもどおり、雰囲気です。言語間でコメントとか予約語とかは演算子とかは異なると思われるので、そういうのをdictに集約したい予定。まぁ、sqlしかほとんど触れていないですけど。
[oracle@centos .vim]$ pwd
/home/oracle/.vim
[oracle@centos .vim]$ tree
.
├── a.sql
├── dict
│ └── sql
│ └── kwd.dict
├── env
│ └── chr_cnst.vim
├── func
│ └── syn.vim
├── init
│ ├── buf.vim--バッファ
│ ├── chr.vim--文字
│ ├── cmd.vim--コマンド
│ ├── cpp.vim--こぴぺ
│ ├── edt.vim--編集
│ ├── fop.vim--ファイル操作
│ ├── map.vim--キーバインド
│ ├── mcr.vim--まくろ
│ ├── mod.vim--モード
│ ├── mvc.vim--列移動
│ ├── mvr.vim--行移動
│ ├── rep.vim--置換
│ ├── rgt.vim--レジスタ
│ ├── src.vim--検索
│ ├── vis.vim--見た目
│ ├── wdc.vim--単語補完
│ └── win.vim--ウィンドウ
├── plug
└── syntax
└── sql.vim
7 directories, 22 files
~/.vimrcの設定
こうかけば、読み込むらしい。vimscriptを。配下の奴ぜんぶ。
[oracle@centos .vim]$ vi ~/.vimrc
runtime! init/*.vim
runtime! plug/*.vim
~/.vim/env/chr_cnst.vimの設定
sigqとhypnは今回つかってない。変数名は一意になるようにする。しないと怒ってくれる。
[oracle@centos .vim]$ vi env/chr_cnst.vim
let g:spe = ' '
let g:sigq = ''''
let g:hypn = '-'
~/.vim/dict/sql/kwd.dictの設定
V$RESERVED_WORDSで管理していたんだね。はじめて知った。あとでみよう。
[oracle@centos .vim]$ vi dict/sql/kwd.dict
ACCESS
ADD
ALL
*
*
*
WHENEVER
WHERE
WITH
~/.vim/func/syn.vimの設定
引数に言語指定して、動的にやってやろうとしたけど、うまくいっていないので、、割愛。むずい。なまえはfmt_syn(lang)みたいな感じ。
~/.vim/init/vis.vimの設定
set syntax=sqlとsyntax enableを忘れなければいいかな。
[oracle@centos .vim]$ vi init/vis.vim
syntax enable
set number
set showmatch
set matchtime=1
set cursorline
set cursorcolumn
hi cursorline term=reverse cterm=reverse ctermfg=238 ctermbg=227
hi cursorcolumn term=reverse cterm=reverse ctermfg=238 ctermbg=227
hi normal ctermfg=yellow ctermbg=black
hi Keyword ctermfg=darkcyan ctermbg=black
hi Number ctermfg=green ctermbg=black
hi Comment ctermfg=grey ctermbg=black
hi String ctermfg=red ctermbg=black
set syntax=sql
~/.vim/syntax/sql.vimの設定
時間は意味わかんないくらいかかったけど、なんとかできた。作っててたのしかった!
[oracle@centos .vim]$ vi syntax/sql.vim
"たぶん、メタ文字あーだこーだ的な奴。
syn case ignore
"envフォルダ配下読み込み、定義した変数を読み込めるようにする。
if filereadable(expand('~/.vim/env/*cnst*'))
source ~/.vim/env/*cnst*
endif
"一時的にコマンド作成しているイメージ。argsはsource targetの関係。たぶん。
command -nargs=* HiLink hi def link <args>
″slient指定しないと、標準出力がうるさい。systemはshellコマンドcallできる。シングルクォは重ねるとシングルクォになる。
silent let s:sqlkwd = system(' perl -pe ''s/\n/ /g'' ~/.vim/dict/sql/kwd.dict ')
"即時実行。plsqlみたい。文字列で受け取ればなんでもできそうだな。
execute 'syn' . g:spe . 'keyword' . g:spe . 'sqlkwd' . g:spe . s:sqlkwd
"ここらへんはこぴぺ。matchはregexp。regionはstart,end,skip指定できるぽい。matchもregionもcontainsできるぽい。
syn region sqlstr start=+"+ skip=+\\\\\|\\"+ end=+"+
syn region sqlstr start=+'+ skip=+\\\\\|\\'+ end=+'+
syn match sqlnum "-\=\<\d*\.\=[0-9_]\>"
syn region sqlcmt start="/\*" end="\*/" contains=sqltd
syn match sqlcmt "--.*$" contains=sqltd
syn keyword sqltd contained TODO
"一時コマンドでインターフェースの型にフォーマット。ここで、フォーマットした型にvis.vimで色指定するといい感じ。
HiLink sqlkwd Keyword
HiLink sqlstr String
HiLink sqlnum Number
HiLink sqlcmt Comment
"一時コマンド削除
delcommand HiLink
"ファイル名と値は同じにする。ゆくゆくはsynとかにリネームしたい。
let b:current_syntax = "sql"
結果
センスはともかく、色は狙いどおりついた。
あとがき
vimscriptたのしいなー。functionとかもいろいろつくってみよう。
以上、ありがとうございました。