Help us understand the problem. What is going on with this article?

vimでsqlの予約語にsyntax highlightつけてみた話

More than 1 year has passed since last update.

まえがき

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
~/.vimrc
runtime! init/*.vim
runtime! plug/*.vim

~/.vim/env/chr_cnst.vimの設定

sigqhypnは今回つかってない。変数名は一意になるようにする。しないと怒ってくれる。

[oracle@centos .vim]$ vi env/chr_cnst.vim
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
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
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
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"

結果

センスはともかく、色は狙いどおりついた。

Screenshot from 2019-04-14 19-08-32.png

あとがき

vimscriptたのしいなー。functionとかもいろいろつくってみよう。

以上、ありがとうございました。

ukijumotahaneniarukenia
sqlが大好き。(oracle) WordPressはじめました。sql oracleやそれ以外について調べたこととか記していきます。 https://github.com/ukijumotahaneniarukenia
https://ukijumotahaneniarukenia.site/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした