読者です 読者をやめる 読者になる 読者になる

この日記は私的なものであり所属会社の見解とは無関係です。 GitHub: takahashikzn

Eclipse4.6 "Neon"の新機能一覧

f:id:takahashikzn:20160621164756p:plain

毎年恒例の新バージョンリリースです。ネオン(Neon)ということで、なんだか派手になりました。 ティザーサイトによると、6/22にリリースされるとのこと。 http://www.eclipse.org/neon/


ひとつ前のリリース、4.5 "Mars"の解説はこちら。 http://takahashikzn.root42.jp/entry/2015/05/29/214749


これまではマイルストーンビルド毎の変更を追いかける形で解説していましたが、 面倒になってきたので今回からヘルプページのWhat's Newを元にします。

http://help.eclipse.org/neon/index.jsp

2016-07-19注: 記事中の画像がリンク切れになっているようです。上記URLから遷移するとなぜかJunoのヘルプページが表示されてしまうのですが、これが原因かもしれません。

2016-07-24注: 解消しました。

Eclipse本体(ワークベンチ)の新機能


SWT provides resolution-based autoscaling: SWT側で解像度を自動判定して(画像を)自動拡大

タイトル通りです。 高解像度画像が存在しない場合、画像を自動拡大するそうです。 しかも、単に拡大するのではなくベクター画像的にキレイに拡大(proportionately)してくれるとのこと。

NeonでHigh-DPI表示した例。アイコンが拡大されています。

こちらはMars(High-DPI非対応)で表示した例。


Word wrap in text editors: テキストエディタで行折り返し

行折り返しをボタン1つで切り替えられるようになりました(デフォルトでは行折り返しOFF)。 キーボードショートカットはAlt+Shift+Yです。


Commands and shortcuts to zoom in text editors: テキストエディタ上でフォントサイズ変更のコマンドとショートカットを追加

Ctrl++Ctrl+=でズームイン(フォントサイズ増加)、Ctrl--Ctrl+-でズームアウト(フォントサイズ現象)です。

この変更はその場限りの一時的なものではなく、設定画面で変更したことと同じ意味になります。つまり永続化されます。 デフォルトフォントを指定していた場合、デフォルトフォントの設定そのものが変更されます。

この機能、個人的には余計なお世話のような気がしますが…Ctrl++なんて簡単なキーバインドなので、暴発を招くだけかと。 そういうわけで、僕はキーバインドから早速解除させていただきました。 


Pinch to zoom in text editors: ピンチジェスチャーでズームイン

先程の永続的フォントサイズ変更とは別に、「一時的に」ズームしたい場合のピンチジェスチャーが使用できるようになりました。 解除するジェスチャーは「二本指で45度回転させる」だそうです。またはエディタを単に閉じて開く。

ちなみに、現在のところLinuxはサポート外だそうです。(SWTの基礎となるGTKがマルチタッチに対応してない為)


Automatic Save of dirty editors: 編集中エディタの自動セーブ

2時間分の作業がExcelのクラッシュにより失われるという悲しい事件が後を絶ちませんが、みなさんCtrl+S押してますか? 僕は手が止まるたびに押すのがクセになってます。(およそ30秒に1回)

そういう悲しい事件を少しでも減らすため、とうとうEclipseにも自動セーブが搭載されました。(デフォルトでは無効) 無操作の場合に一定時間経つと自動セーブされます。


Search in binary files: バイナリファイル検索

組み込み屋さんが使うんでしょうかね?バイナリファイル検索が搭載されました。 検索ワードに16進を打ち込むとバイナリ検索になるようです。

ただしバイナリ検索はデフォルトでOFFになっており(上画像の"Search In"の"Binary files")、以下のいずれかのファイルのみを対象とするようです。

  • テキストファイル
  • ファイルタイプ不明かつnull文字(U+0000)を含まない


Terminate and Relaunch from history: 履歴からのアプリケーション終了→再起動

履歴からEclipseからアプリケーション(TomcatJUnit、etc...)を起動する際、前回のプロセスを終了してから起動することができるようになりました。 これにより二重起動を防ぐことができます。

デフォルトではこの機能は無効になっていますが、Shiftを押しながら履歴から起動することによっても利用できるようです。

オマケ:Ctrlを押しながら起動履歴を押すとアプリケーション起動設定ダイアログを開けます。(知らなかった…ちょっと便利)


Directly start previously selected workspaces in the launcher: 最近使ったワークスーペースを直接選んで起動

Eclipse起動時にワークスペースを選択する際、最近使ったものをクリックして選べるようになりました。

パスは省略されていますが、マウスを当てるとフルパスが表示されます。 右クリックから消すこともできます。


Workspace name shown in window title by default: ワークスペース名をタイトルバーに表示

ワークスペース情報がタイトルバーに表示されるようになりました。 デフォルトではワークスペースディレクトリパスが表示されます。


Quick Access Improvement: クイックアクセスの改善

Ctrl+3のクイックアクセスで表示される候補をフィルタできるようになりました。 例えば、ビューに関係する操作だけに絞りたい場合はViews: を入力します。


Hide the window toolbars: ツールバーを隠す

クイックアクセスからツールバーの表示非表示をトグルできるようになりました。

ちなみに僕はツールバーを一切使わないので、絶対にツールバーを表示しないようにするプラグインを自作しました。 これがないと、Eclipseがクラッシュ後に再起動するとツールバーが表示される(時がある)んですよね。。


Perspective names hidden by default: パースペクティブ名は非表示に

ツールバー右上に表示されるパースペクティブ一覧ですが、名称が非表示になりました。 右クリックすれば名称が表示されます。

Neon:

Mars:


Full Screen: フルスクリーン

WindowsLinuxでもフルスクリーンがサポートされました。Webブラウザの標準キーバインドと同じくCtrl+F11で有効にできます。

OSX上ではこれまで同様にCtrl + Cmd + Fでフルスクリーンです。


Preference setting to disable the Eclipse styling (CSS base theming): CSSベースのテーマ機能をOFFにする設定

CSSベースのテーマ機能がEclipse4.2から導入されていますが、この機能をOFFにできるようになりました。 OFFにすると、Eclipseが軽くなる(かもしれない)そうです。


Selecting the text editor for unaccosiated file types: 未関連付けファイルタイプをテキストエディタで開く

未関連付けのファイルタイプを開くときのエディタ選択ルールを指定できるようになりました。


"date" template variable with custom format: ${date}変数が展開される時のフォーマットを指定可能に

コードテンプレート等を作るときに使用できるEclipseの変数のうち、${date}が展開される時のフォーマットを指定できるようになりました。


"word_selection" and "line_selection" template variable with default value: ${word_selection}と${line_selection}変数がデフォルト値を持つように

${word_selection}と${line_selection}変数にデフォルト値を指定できるようになりました。何もテキストを選択していない時に適用されます。


Import projects: プロジェクトインポートのウィザード機能

プロジェクトをEclipseワークスペースにインポートする際にウィザードを使えるようになりました。 これにより、ディレクトリまたはアーカイブからインポートするときに同一のUIで操作できます。 また、プロジェクト自動設定の精度も向上しています。

なお、プロジェクト自動設定のロジックは自作することもできるそうです。 (新たに追加された拡張ポイント org.eclipse.ui.ide.projectConfigurator で指定)


"New..." button for creating Working Sets

(特筆すべきものではないので略)


New Welcome theme 'Solstice': 新しいウェルカムテーマ「Solstice」

こんな感じになりました。


Welcome Launchbar restored: ウェルカムページのランチャーが復活

Eclipse3.xの頃にそういうものがあったらしく、それが復活しました。


Improvements in the Mac default theme: Macのデフォルトテーマ改善

OSXの他のアプリケーションと見た目が合うように調整されました。

旧:

新:


Link widget background color can be styled via CSS

リンク要素の背景がCSSでスタイル可能になりました。


Themed scroll bar enabled for editors in dark theme: ダークテーマでスクロールバーのスタイル設定が可能に

Marsまではダークテーマでダークにならない部分があって残念な感じでしたが、とうとう完全なダークテーマが達成されました。

OSネイティブのスクロールバーを廃止してSWTで自作したようです。 -Dswt.enable.themedScrollBar=falseとすればOFFにもできます。(eclipse.iniで指定)

残念ながらこの自作スクロールバー、現時点では以下の問題が残っているようです。

  • 全てのコンポーネントへ適用済みではなく、ネイティブのスクロールバーが残ることがある(例:ツリー、テーブル)
  • これまではスクロールバー非表示だった箇所でスクロールバーが表示されてしまうことがある

これらはEclipse4.7で解消する予定です。


Improved menu support on GTK3

(重要ではないので略)


Tweaking SWT's auto-scaling: SWTのHi-DPI自動スケーリングを微調整

今回のリリースで追加された自動スケーリングですが、微調整ができます。

まずGTKの場合、GTK_DPI_SCALE=1.5のようにすることで、拡大率が150%になります。(GTKの機能)

GTKおよびWindowsの場合、以下のように指定することが可能です。

  • -Dswt.autoScale=false →自動スケーリングOFF、ただしOSXでは未対応
  • -Dswt.autoScale=integer →現在の解像度に応じて100の倍数%でスケーリング(200%, 300%...)、これがデフォルト
  • -Dswt.autoScale=quarter →現在の解像度に応じて25の倍数%でスケーリング(125%, 150%...)
  • -Dswt.autoScale=exact →現在の解像度に応じて1%刻みでスケーリング
  • -Dswt.autoScale=<value>→スケーリングを指定

加えて、スケーリング方式を指定することができます。

  • -Dswt.autoScale.method=nearest最近傍補間、ギザギザした感じ、これがデフォルト
  • -Dswt.autoScale.method=smooth →スムース化、ボケた感じ、GTKのみ可


Advanced capabilities preferences are now displayed in place (no extra dialog)

(重要ではないので略)


Eclipse workspace launcher now fully functional on Wayland: EclipseランチャーがWaylandをサポート

WaylandとはX.orgの代替となるディスプレイサーバを開発することを目標としたプロジェクトです。

そのディスプレイ環境でEclipseのランチャーが起動するようになりました。


Solaris builds are now 64-bit only: Solaris向けビルドは64bitのみ

32bitソラリス上でEclipseを使う人はいないので廃止されました。


Ant 1.9.6

Eclipseの標準はAnt 1.9.6になりました。


Java9 previews: Java9プレビューに関して

そのままではJava9で起動出来ず、

-addmods java.se.ee

が必要です。

JDTの新機能

Javaエディタ


Content Assist highlights matched characters: コンテンツ・アシストでマッチ文字列がハイライトされるように

コンテンツ・アシストのポップアップで、マッチする文字列がハイライトされて判別しやすくなりました。


Substring code completion: コンテンツ・アシストが文字列の一部から補完できるように

部分文字列のマッチングで補完が効くようになりました。かなり便利。 ウザい場合は設定でOFFにもできます。


ifNotNull/ifNull templates: if(xyz == null) { ... } のようなテンプレートが追加

Optionalの登場により登場頻度が減ったお決まりのコードですが、テンプレートに追加されました。


Rename options: 識別子名変更のリファクタリングにおけるオプション指定

識別子名変更のリファクタリングで、optionsというリンクが表示されるようになりました。これを押すと詳細なオプション指定が可能なダイアログが表示されます。

実はこのダイアログ、リンクを押すまでもなくCtrl+Alt+Rをもう一度押せば表示されます。(そして、この機能自体はEclipse3.xの時代からあったはず)

インプレースモード(ダイアログを表示しないモード)は設定でOFFにすることもできます。


Javaエディタ(その他)


Clean up to remove redundant type arguments: コードクリーンアップで、冗長な型引数を除去できるように

タイトル通り。


Create new fields from method parameters: メソッド引数からフィールド宣言を生成

コード補完の一種として、メソッド引数からフィールド宣言を生成できるようになりました。

コンストラクタやセッターの引数からインスタンス変数を生成するというケースが主になるでしょう。


Search on multi-selections: 特定の要素に限定した検索

特定のクラスやメソッド等に限定して検索できるようになりました。

検索結果で表示された要素を選択して、更に検索することもできます。


Ctrl+Shift+V invokes Open from Clipboard: Ctrl+Shift+Vで「クリップボードから開く」

タイトル通り。


Adding meta-annotations while creating a new Java annotation type: アノテーションクラスを作る際にメタアノテーションを追加

アノテーションをウイザードで作成する際、お決まりの@Retention等を予め指定できるようになりました。


Grouping of referenced libraries in Project Explorer: 参照ライブラリをグルーピング

プロジェクトエクスプローラーで、参照ライブラリをツリーノード「参照ライブラリ」にぶら下げられるようになりました。


Hiding empty library containers in Project Explorer: 空のノードを非表示に

プロジェクトエクスプローラーで、空のノードを非表示にできるようになりました。


Javaコンパイラ


New problem severity level to indicate information: コンパイラの新しい警告レベル"Info"

これまではIgnore, Warning, Errorの3つの警告レベルでしたが、Infoが追加されました。

実際はこのように表示されます。


Quick fix to configure problem severity: クイックフィックスでコンパイラ警告レベルを変更可能に

頻繁に使うことはありませんが、クイックフィックスからコンパイラの警告レベル変更画面を開くことができるようになりました。


Null解析


Multiple sets of null annotations: Null解析のためのアノテーションが複数指定可能に

アノテーションベースのNull解析は、まずアノテーションを付けるところから始まります。 しかし現時点でNon-nullを表すアノテーションは統一されていません。Java標準APIだけでも

  • javax.validation.NotNull
  • javax.annotation.NonNull

と2つあります。EclipseがNull解析に力を入れ始めた頃は

  • org.eclipse.jdt.annotation.NonNull

なんてのが標準でした。

何か一つに統一されれば良いのですがそう簡単には行かないよね、というわけで。 Null解析用のアノテーションを複数指定できるようになりました。

複数指定するアノテーションには「プライマリ」と「セカンダリ」の2種類が存在します。

「セカンダリ」はコンテンツアシスト時に、本当にそのアノテーションクラスがビルドパス上に存在するか否かの検査を行わないそうです。(負荷軽減のため)

まあ、実用上はそんなに差がないと思います。


Improved null analysis with generics: ジェネリクスのNull解析の改善

ジェネリクスにおけるNull解析が改善したそうです。

改善点は次の通り。

  1. 非束縛型引数を厳し目に解析
  2. Null解析に対応していない外部ライブラリにおける非束縛型引数の扱いを改善
  3. Nullチェック用の便利クラスorg.eclipse.jdt.annotation.Checksを追加
非束縛型引数を厳し目に解析

まず一つ目ですが、非束縛型引数とは

class Foo<T> {
    T val;
}

におけるTのように、NullableとNonNullのどちらとも指定されていない型引数のことです。

この場合、非束縛型引数はNonNullであることが確定しないので警告を発するようになりました。(デフォルトはOFF)

非束縛型引数を持つクラスの作者は、Null解析の完全性を保つために以下の規約を守る必要があります。

  • TがNonNullであることを意図しているならば、インスタンス化時にNonNullな型引数を渡す必要があるし、具体的な値としてnullが来たらエラーとしなければならない
  • TがNullableであることを意図しているならば、渡された参照を使用する前にnullか否かを確認をしなければならない
Null解析に対応していない外部ライブラリにおける非束縛型引数の扱いを改善

次に二つ目ですが、例えば以下の様なクラスを考えてみます。

ListとMapのどちらもJDKのクラスで、Null解析用のアノテーションは付いていません。 従って宣言時の型引数を信じるしかありません。

List<@NonNull String> list;

// 値はNonNullということで確定でよいが、そもそもキーがあることを保証する方法がない
Map<Integer, @NonNull String> map;

@NonNull String test(int i) {
    if (i >= 0)
        // 値はNonNullなので、この式の評価結果は
        // 『NonNullなString』と『IndexOutOfBoundsException』のいずれかであることが確定
        return list.get(i);
    else
        // キーに対応する値があればNonNullなのだが、そもそもキーがあることが未保証
        // キーがなくても例外がスローされるわけではなく単にnullになる
        return map.get(i);
}

Neonでは、このようなケースで警告を発するようになりました。

この問題を解消するには、Map#get(Object)がNonNullであると指定するしか方法はありません。 そのためには、Eclipse4.5で追加された機能『Nullアノテーションの外部化』を使うことが出来ます。

詳しくは過去記事の「External annotations: Null解析用アノテーションをJarの外部から指定」を参照して下さい。


Nullチェック用の便利クラスorg.eclipse.jdt.annotation.Checksを追加

最後に三つ目ですが、Objects.requireNonNullのような便利メソッドの派生系をたくさん持っているクラスが追加されたというだけの話です。

Javadocこちら


Quick Fix to add @NonNull to local variable: クイックフィックスでローカル変数へ@NonNullアノテーションを付ける

Null解析は非常に複雑なため完璧ではありません。時にはよくわからない理由で警告を出すことがあります。

このようなケースでサクッと警告を消すために、クイックフィックスを使えるようになりました。

ただしこれで解決しないこともあり、コンパイラが次の警告を出すこともあります。


Javaコードフォーマッタ


New options in code formatter: コードフォーマッタの新オプション

コードフォーマッタにオプションが追加されました。

(1) forループ宣言部の行折り返し制御。

(2) 桁揃えのグルーピング。空白行で区切ることでグループを区別します。

(3) enumの値に付与するアノテーションを一つ毎に改行するか否か。

(4) 括弧内の改行でユーザー指定を尊重するか否か。これまでは行コメント//を末尾につけることで、行がフォーマッタにより結合されることを防いでいたのですが、そんな小細工をしなくても良くなりました。

(5) 型引数宣言の行折り返し制御。

(6) 代入演算子三項演算子の前後における行折り返し制御。


Javaデバッガ


Installing breakpoints from unrelated projects: 無関係のプロジェクトからブレークポイントをインポートしないようにする

複数のプロジェクトで、バージョンの異なる同名クラスを使うことがあります。 その場合、ブレークポイントの位置はそれぞれ異なることになります。

Neonでは、依存関係を見てバージョン毎に適切なブレークポイントを切り替えることができるようになっていますが、 この動作が邪魔な場合は設定でOFFにすることが出来ます。


JUnit


Enabled assertions for new JUnit launch configurations: JUnit起動時にデフォルトでassertは有効に

JUnit実行時にassertを有効にするか否かのオプションはありましたが、デフォルトはOFFでした。 NeonからはデフォルトONになります。

最後に

Eclipseの新機能解説を書くのはこれで6回目です。(Eclipse3.7~Eclipse4.6)

毎度毎度、「疲れるからもう今年で最後にしよう」と思うのですが... 今年のこれも、書くのに8時間は使ってますし。でも謎の義務感でやってしまいます。

「玄人はIntelliJEclipseが許されるのは小学生まで」などとディスられることが多いEclipseですが、 僕はまるでかつてのEmacsのように(過去5年ほどEmacs漬けの生活を送っていたことがある)、体に染み付いてしまったので今後も使い続けることでしょう。

では皆さま、楽しいEclipse生活を!!