EmacsでScalaのコードを編集すると次々と作成されるバックアップファイルを”sbt clean”で削除するための設定。

By | 2019年9月8日 , Last update: 2019年9月24日

はじめに

EmacsでScalaのコードを書こうと思って、neotreeとMetalsが使えるように設定すると…

  1. Metals: コード補完
  2. neotree: プロジェクト内部のディレクトリ構造のツリー表示

ができるようになります。実際に上記の設定を.emacs/init.elに追加してEmacsでScalaのコードを書いてみると、コードを書いている間のストレスはかなり軽減されます(※個人の感想です)。

あと、Windows 10 Homeでもmetals-emacsは割と普通に動きますね。

なお、画面例は以下のような感じになります。neotreeについては画面上に現れるカスタマイズはこの記事を最初に書いた時点(2019年9月)では行っていません。

しかし、上図をよーく見ていただくと、矢印の部分に同じファイル名のファイルのようなものが2個あるようにも見えます。

Emacs使いの方ならご存知か(というか、上図の赤矢印のすぐ下のpackages.scalaで微妙にネタバレしてますが…)とは思いますが、Emacsでファイルを保存機能を実行すると、編集中のファイルを保存した上で、その直前のファイルの中身をもとのファイル名に”~”を付加して新たに生成したファイルの中にバックアップファイルとして保存します。

1個や2個のファイルを対象に編集しているのであれば上記のような表示でもなんとか我慢できるのかもしれませんが、Webサイトを作る場合などでたくさんのファイルを編集する場合に、元のファイルとバックアップファイルの2個1組が上記のツリービューに大量に表示されると一覧性及び操作性が低下してしまいます。かといって、sbtのcleanタスク(以下”sbt clean”と書きます。)のデフォルトの設定ではバックアップファイルを削除したりとかする仕組みは提供されていません。

そこで、この記事ではバックアップファイルを削除するための”sbt clean”への設定の方法について書きます。

スポンサーリンク

追加する設定に求められる要件

Emacsを用いてScalaの開発プロジェクト内のいろいろなフォルダにあるたくさんのファイルを編集することによってバックアップファイルが大量に生産されてしまう状況を想定します。

下図のドラえもんのような状況です。

よって、以下のような要件が求められます。

  1. プロジェクトのルートディレクトリから再帰的にディレクトリ構造を検索してファイルの末尾に”~”がついているファイルを探し出せること。
  2. 前項で探し出したファイルがすべて削除できること。

具体的な設定の方法


スポンサーリンク

要件が定まったところで、具体的に設定をしてみます。

バックアップファイルが大量に発生すると想定されるプロジェクトのルートディレクトリのbuild.sbtに以下のコードを追加します。

上記のコードを追加することで、前節で要件として掲げた処理を行うことができるようになります。

なお、必要に応じて、設定を行うbuild.sbtファイルがあるプロジェクトのバックアップを取っておきます。

  1. build.sbtにはScalaのメソッドを書くことができますので、java.io.Fileの助けを借りてlsメソッドを定義しています。
  2. 前項で定義したlsメソッドを再帰的に呼び出すことでプロジェクト中に存在するファイルのリストが得られます。
  3. さらに、前項で得られたファイルのリストからfilterメソッドを使ってファイル名の末尾に”~”のあるものを取り出すことで得られるコレクションをsbt cleanの実行時に削除される対象となるファイルのリスト(cleanFiles)に追加できます。

実際に実行してみます。

上記のコードが追加できたところで、sbt cleanをWindowsのコマンドプロンプトから実行してみます。

実行前のScalaのプロジェクトのルートディレクトリのファイルの状況は以下の通りです。赤矢印のところにバックアップファイルがあります。

sbt cleanを実行してみます。

実行後のScalaのプロジェクトのルートディレクトリのファイルの状況は以下の通りです。バックアップファイルが消えました。

Emacsでneotreeを使ってsbt cleanを実行したプロジェクトのディレクトリ構造を確認すると…

赤い矢印付近にあったバックアップファイルが消えていますね。😀

設定が正しくできているようです。🐼

まとめ

build.sbtはビルド定義のファイルであるにもかかわらず、Scalaの関数を書くことができます。Scalaというプログラミング言語の特性上、もっと簡潔な表現が可能なのかもしれませんが、上記の設定で様子を見たいと思います。

この記事は以上です。

References / 参考文献