EmacsとModernFortran

だらだら何か書く.

実行環境
Ubuntu20.04 on VirtualBox 6.1.14

## [GNU Emacs](https://www.gnu.org/software/emacs/)
テキストエディタ. Emacs Lispで拡張すれば色々できる. Vimやモダンなテキストエディタ(VSCodeとかAtom)と同等の力を持っているはず. (正直, VSCodeとかAtomでできることはEmacsやVimでもできそう.)

## Fortran
古かったり新しかったりする. 最近は色々な活動が活発らしい.

## Emacsで何ができるか?
テキストハイライティングとか`lsp-mode`とか.

### 標準で入っているモード
F77用の`fortran-mode`とF90用の`f90-mode`が標準で入っている. 拡張子が`.f`, `.for`の場合は`fortran-mode`, `.f90`, `f95`, `.f03`, `.f08`の場合は`f90-mode`. `auto-mode-alist`を弄れば任意の拡張子でモードをオンにできる. 詳しくはhttps://www.emacswiki.org/emacs/AutoModeAlist .

```f90-setting.el
(add-to-list 'auto-mode-alist '("\\.cuf\\'" . f90-mode))
(add-to-list 'auto-mode-alist '("\\.f1[58]\\'" . f90-mode))
```

(大文字小文字を区別しないみたい?)

- `fortran-mode`
固定形式の72文字以降を赤くしてくれたり, Tabキーで自動で8文字の所までインデントできたり, `fortran-column-ruler`を呼べばものさしが表示されたりする. 下のプログラムはちゃんとコンパイルできる.

![fortran-mode_VirtualBox_Ubuntu20.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2296800/b7233315-d68d-0425-6e35-f3e45e4a85f8.png)

- `f90-mode`
では`do`や`function`や`subroutine`の`end`のところでTabを押すと`end (do|function|subroutine) name`が自動で挿入されるので便利. (挿入されないように設定することもできる. `M-x customize`で`f90`と検索すると色々な変数が出てくるので`F90 Smart End Names`のところの`Toggle`ボタンを押して`nil`にして`STATE`ボタンでセーブすれば良い. 他にもインデントの深さを変えられる.)

```do.f90
infty:do
end ! <- ここでTabを押すと...
```

```do.f90
infty:do
end do infty ! <- 自動で挿入される.
```

### ビルトインじゃないパッケージ
[MELPA](https://melpa.org)でfortranで検索しても[fortpy](https://github.com/rosenbrockc/fortpy)くらいしかない?
プログラミング自体に役に立つパッケージはかなりある.

- [yasnippet](https://github.com/joaotavora/yasnippet)
    - ユーザ定義のスニペットでTabを押して展開できる. 例えば, 以下のスニペットを登録しておけば`usei`と打ってTabを押すと展開される. ([こちらの記事](https://qiita.com/implicit_none/items/6b5c3a65cddc6ecd8e52)と同じことができる.)

```
# key: usei
# name: usei
# --
use, intrinsic :: iso_fortran_env
```

![usei_before_VirtualBox_Ubuntu20.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2296800/571aa410-1507-278a-3ad1-6d27a593a236.png)


- [flycheck](https://www.flycheck.org/en/latest/)
    - コンパイラを走らせて`Warning`や`Error`箇所に波線を引いてくれる. (Fortranの場合, `*.mod`ファイルが勝手に生成されるけど...) `M-x` `customize`から`fortran`と入力して`flycheck-gfortran-args`やInclude Pathを弄るとCプリプロセッサやMPIに対応できるかも.
- 自動補完
    - autocompleteとかcompany, ivy, etc...
- [magit](https://magit.vc/)
    - gitを簡単に使える.

### Language Server Protocol([LSP](https://emacs-lsp.github.io/lsp-mode/))
IDE-likeなエクスペリエンスを提供してくれるらしい. 
とにかく, Fortranでは`lsp-mode`パッケージと`pip`の`fortls`があれば使うことができる. Ubuntu20.04では`apt`でも`fortls`を入手可能. ちゃんと`fortls`のある場所にPATHを通しておく. `lsp-ui`パッケージを使えばもっと色々できるみたい. 
https://emacs-lsp.github.io/lsp-mode/tutorials/how-to-turn-off/
例. 下の画像では, カーソルをルーチンに置くとコメントと引数が表示されている. `emacs`で変数を設定すると出るっぽい.

```setting.el
(setq lsp-ui-doc-enable           t
      lsp-ui-doc-show-with-mouse  t  ; tでマウスを乗せると何か出る.
      lsp-ui-doc-show-with-cursor t) ; tでカーソル(下の黒い豆腐)を乗せると何か出る.
```

![lsp_hover_VirtualBox_Ubuntu20.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2296800/ba0769e2-d154-f0f5-6813-67cc53b9847b.png)

## Fortranのツール

### [fprettify](https://github.com/pseewald/fprettify)
自動整形ツール. 使い方は[こちらの記事](https://qiita.com/implicit_none/items/73431eb73d5ec88802e3)とか.
手前味噌だけれども, Emacs用の[fprettify.el](https://github.com/osada-yum/fprettify.el)を作った. 一応動く.

### [fypp](https://github.com/aradi/fypp)
Cプリプロセッサよりも強力?なプリプロセッサ.
[こちらの記事](https://qiita.com/implicit_none/items/47680973fb98d85d6cbb)
拡張子は特に定まっていないっぽい? (`.fpp`[fypp](https://github.com/aradi/fypp), `.fypp` [stdlib](https://github.com/fortran-lang/stdlib), `.fy90` [先ほどの記事](https://qiita.com/implicit_none/items/47680973fb98d85d6cbb))
とにかく, `auto-mode-alist`に追加すれば`f90-mode`のシンタックスハイライトを使える.

```f90-setting.el
(add-to-list 'auto-mode-alist '("\\.f\\(y90\\|y?pp\\)\\'" . f90-mode))
```

## 結論
- 標準でも簡単なコードになら十分使えると思う.
- プログラミング用のパッケージをインストールすれば更に便利になる.
- LSPはいろいろできそう.

# リファレンス
## Emacs側

https://www.gnu.org/software/emacs/

https://www.emacswiki.org/emacs/AutoModeAlist

https://melpa.org

https://github.com/rosenbrockc/fortpy

https://github.com/joaotavora/yasnippet

https://www.flycheck.org/en/latest/

https://magit.vc/

https://emacs-lsp.github.io/lsp-mode/

https://emacs-lsp.github.io/lsp-mode/tutorials/how-to-turn-off/

https://github.com/osada-yum/fprettify.el

## Fortran側

https://github.com/pseewald/fprettify

https://github.com/aradi/fypp

https://github.com/fortran-lang/stdlib

https://qiita.com/implicit_none/items/47680973fb98d85d6cbb

https://qiita.com/implicit_none/items/47680973fb98d85d6cbb

https://qiita.com/implicit_none/items/6b5c3a65cddc6ecd8e52