常に適用する
~/.vimrcに次のように書く.
BufNewFile: ファイルを新規作成したときに適用する
BufRead: 既存のファイルを開いたときに適用する
こうすると「a.fuga」などのファイルが常時
Fortranのソースコードとして認識されるようになる.
一時的に適用する
Vim中で
set syntax=syntax-nameを実行する.
例
a.pyで次のように書いてみる.
*.pyというファイルは
Pythonのソースコードとして認識され,それに従ってハイライトされる.
ここで
set syntax=fortranを実行すると,このファイルは
Fortranのソースコードとして認識されるようになる.一度ファイルを閉じると元に戻る.
設定ファイルを作成する
次のようにディレクトリを作成し,設定ファイルを作成・編集する.詳細は
+
syntax - Vim日本語ドキュメント
特定の単語をハイライトする
keywordだと単語として区切られているもの(前後が空白だったり括弧やカンマ等の記号で区切られていて独立した単語となっていもの)のみが対象となる.例えば
syntax keyword fortranVariableAttribute in
とした場合,
integer, intent(in) :: n
は括弧内の
"in"だけがハイライトされ,
"integer"や
"intent"に含まれる
"in"はハイライトされない.
matchでは正規表現が使えて色々柔軟に定義できる.
+
vim正規表現リファレンス #Vim - Qiita
構文グループの色を設定する
色を指定する場合:
指定できる色名は
vim中で
を実行すれば確認できる.
+
vimで設定可能な色の種類を一覧で確認する方法 - Qiita
色番号と色の一覧
+
VimLで色指定する数値の一覧 | Inhale n' Exhale
+
256 Colors - Cheat Sheet - Xterm, HEX, RGB, HSL | DITig
構文グループをリンクする場合:
リンク先の構文グループは自分で決めたグループ名.例えば自分の場合は
Fortranの変数の属性のハイライトを調整したかったので
fortranVariableAttributeとした.これに
fortranTypeの配色を設定したい場合は
highlight link fortranVariableAttribute fortranType
とする.
Vimで定義されているハイライト名は,
Vim上で
:highlightと入力すると確認できる.
+
Vim – シンタックスハイライトの設定を自作して追加する方法 | Howpon[ハウポン]
例: Fortranの配色調整
PaperColorは
Fortranの色の設定が色々おかしいので調整する.ただサーバーによってきちんとハイライト出来ている場合もあるので,他の設定ファイルが影響していたりする可能性もある.よく分からん.
直したいのは
(1)
fortranVariableAttributeというグループが
PaperColorで定義されていない
ハイライトの色を指定
highlight fortranVariableAttribute ctermfg=169
または定義されているグループにリンク
highlight link fortranVariableAttribute fortranStructure
今回は
PaperColor.vimで用意されているものにしっくり来るものが無かったのでハイライトの色を指定した.
数字は
8ビットカラーと呼ばれる
256の色に割り振られているもの.
(2) "real"単体だとちゃんと型として認識されてピンク色になるが,"real(8)"などとすると関数として認識されて青色になってしまう
syntax match fortranType /^\s*real\%(\s*(\s*.\+\s*)\s*\\(::\\)\{,1}\s*\a\+\)\@=/
syntax match fortranType /^\s*real\%(\s*(\s*.\+\s*)\s*\\(,\s*\a\+\s*\\)\+::\s*\a\+\)\@=/
"real"が行頭にあるとき,ほとんどの場合は宣言部のものであるが,文中の改行によって実行部の中でも行頭に来る場合があるため,これで区別するのは難しい.改行コードや否定後読みなどで指定することもできるが,今回は宣言部に現れる
realの宣言文を正規表現で網羅する方法を取る.
ただ,宣言部は地味に自由度が高くて一度に全て指定するのが難しかったので,パターンに分けて指定する.
Case 1. 属性が無い
これらはいずれも文法的に正解である.
まず,宣言部なので行頭にある.
realの前には半角スペースが任意の数ある.
^: 行頭
\s: 半角スペース
*: 直前の
1文字または
1つの文字グループの
0回以上の繰り返し
けっこうどこにでも空白が入れられる.
\s*
直後に特定のパターンが来る
realを指定したいので,肯定先読みを用いる.
foo\%(bar\)\@=: 肯定先読み.直後に
barがある
fooにマッチする.
次に
realの右に来るパターン,上の
barにあたる部分を指定する.
括弧の中はアルファベット,数字,括弧などが入る可能性があり,文法的な制約も色々あるが,面倒なので改行以外の任意の文字列ということにする.
\.: 改行以外の全ての文字
\+: 直前の
1文字または
1つの文字グループの
1回以上の繰り返し
"::"はひと固まりの文字列として扱いたいので括弧で挟む.
\\(abc\\):
abcという文字列をひとつの文字グループとする.
"::"はあっても無くても良い,つまり
0回以上
1回以下の繰り返しが該当する.
\{,m}:
0回以上
m回以下の繰り返し
"::"の右側(これが無い場合は右括弧の右側)は変数であり,必ずアルファベットから始まるので,アルファベットの
1回以上の繰り返しを指定する.
\a: アルファベット(A-Za-z)
以上より
syntax match fortranType /^\s*real\%(\s*(\s*.\+\s*)\s*\\(::\\)\{,1}\s*\a\+\)\@=/
Case 2. 属性がある
属性は
",allocatable"でワンセットで,これが
1回以上繰り返される.空白も単語の中でなければ自由に入れられる.
\\(,\s*\a\+\s*\\)\+
また属性のあとには
"::"が必要.
属性が無い場合のものを少し変えればよい.
syntax match fortranType /^\s*real\%(\s*(\s*.\+\s*)\s*\\(,\s*\a\+\s*\\)\+::\s*\a\+\)\@=/
(3)
8バイト整数は
1_8などと書くが,こうすると定数ではなく通常の文字列として認識されてしまう
syntax match fortranConstant /\d\+_\d\+/
syntax match Normal /\%(\\(\a\|_\)\)\@1<=\d\+_\d\+/
整数
n個 + アンダーバー + 整数
m個 の文字列を定数の色にしたい.
(例) 1_8
ただしその直前にアルファベットやアンダーバーがあるものは変数や手続きの名前になりうるのでデフォルトの色にしたい.
(例) a_2_3 (この
"2_3"を定数の色にならないようにしたい)
否定後読み,つまり「直前に
xxがない
yyにマッチする」という判定を使うのが良さそうだが,これは高コストらしいので,通常のマッチングと肯定後読みを組み合わせることにする.
まず整数
n個 + アンダーバー + 整数
m個 の文字列は
/\d\+_\d\+/
\d: [0-9] (
0~
9の数字)
\+: 直前の
1文字の
1回以上の繰り返し
次に,これの直前にアルファベットまたはアンダーバーがあるもの
/\%(\\(\a\|_\)\)\@1<=\d\+_\d\+/
\%(hoge\)\@<=fuga: 直前に
hogeがある
fugaにマッチする
ここでは
hogeが
\\(\a\|_\)\に,
fugaが先の
\d\+_\d\+に相当する.
\\(xx\|yy\):
xxまたは
yy
\a: [A-Za-z] (アルファベット)
アンダーバーは単に文字列としてのアンダーバー
(4) "parameter"など一部の属性情報が濃い青色になってしまう.属性の色である明るい青色にしたい
(5) 授受属性
(intent)の
"in", "out"が関数と同じ濃い青色になってしまう.変数の属性の色である明るい青色にしたい
(6) "allocate"などがピンク色になる.位置づけとしては
"call"や
"read"と同じだと思うのでそれらと同じ色にしたい
(7) "interface"は関数と同じ濃い青色,"module procedure"はピンク色になる.色のギャップがすごいので調整したい
(8) 同じく
pure functionで用いる
"pure"がピンク色で
"function"の色とのギャップがすごい
これらは
keywordでそれぞれ色グループを指定してやれば良い.
"end interface"は
keywordで指定すると別々の単語と認識されるので
matchを使う.
syntax keyword fortranVariableAttribute parameter
syntax keyword fortranVariableAttribute in
syntax keyword fortranVariableAttribute out
syntax keyword fortranCall allocate
syntax keyword fortranType interface
syntax match fortranType /end interface/
syntax keyword fortranUnitHeader pure
(9) オーバーロードした演算子に色を付けたい
syntax match fortranOperator /\.\a\+\./
新たに定義した演算子は通常の文字列として扱われ,パッと見たときの見やすさが落ちるので,元々定義されている演算子と同じ色を付ける.
新たに定義する演算子は,
.mul.のように,
.eq.等と同じ形でピリオドでアルファベットの文字列を挟む形を取る.
ピリオドは正規表現において改行以外の全ての文字とマッチする特殊文字なのでエスケープする.
\.: 普通の文字としてのピリオド
あとは先ほども出てきた表現
\a: [A-Za-z]
\+:
1回以上の繰り返し
欲を言えば組み込み関数と同じ名前の変数が通常の変数と同じ色になるようにしたいが,流石に面倒くさいのでやめておく.
以上をまとめると
fortran.vimは以下のようになる.ついでに他の属性指定用ワードも入れておいた.