文法ハイライトを指定する
    Top > Linux > Vim
    任意の言語の文法ハイライトを適用する
    常に適用する  ~/.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は以下のようになる.ついでに他の属性指定用ワードも入れておいた.
    References
    syntax - Vim日本語ドキュメント + https://vim-jp.org/vimdoc-ja/syntax.html#syntax-loading vimで構文のハイライトを自作する - Qiita + https://qiita.com/kimurap/items/7058c9fe29f51932b196 Vim – シンタックスハイライトの設定を自作して追加する方法 | Howpon[ハウポン] + https://howpon.com/22135 vimで設定可能な色の種類を一覧で確認する方法 - Qiita + https://qiita.com/omega999/items/15031eece4256eb500e7 VimLで色指定する数値の一覧 | Inhale n' Exhale + https://h2plus.biz/hiromitsu/entry/674 256 Colors - Cheat Sheet - Xterm, HEX, RGB, HSL | DITig + https://www.ditig.com/publications/256-colors-cheat-sheet vim正規表現リファレンス #Vim - Qiita + https://qiita.com/kawaz/items/d0708a4ab08e572f38f3