Notepad++の行の折り返し（ワードラップ）をワード単位から文字単位に変更する

以前は好きだった[Notepad++](https://notepad-plus-plus.org/)も最近はLinuxでも使える[Visual Studio Code](https://code.visualstudio.com/)が気に入って少し疎遠気味。疎遠気味になった理由のひとつがワードラップ（行の折り返し）。でもそれが変更できれば気持が変わるかも、そんな思いで変更を試みたときのメモです。※ソースコードの変更及びコンパイルを伴います。

（2017/4/25）以下のように変更しました。変更理由はVisual Studio Community 2017の使い方がよく分からなかったこととx64に私の使いたいプラグインがなかったこと等々です。身勝手ですみません。

- 環境をVisual Studio CommunityからExpress 2015に変更
- x64からx86（win32）に変更
- 対象のNotepad++のバージョンを7.3.3に変更

##ワードラップってそんなに違うの？
試しにrubyドキュメントの
>オブジェクトとは
Ruby で扱える全ての値はオブジェクトです。 Ruby のオブジェクトに対して可能な操作はメソッド呼び出しのみです。 あるオブジェクトが反応できるメソッドは、 そのオブジェクトが所属するクラスによって一意に決定します。 所属するクラスはオブジェクト生成時に決まり、その後は特異クラスの導入以外、所属クラスが変わることはありません。 またオブジェクトは、特定のクラスに対比して、その「インスタンス」とも呼ばれます。

をNotepad++で表示すると以下のような感じになります。
![notepad-pp.jpg](https://qiita-image-store.s3.amazonaws.com/0/128670/505f2352-3475-f906-2ff6-9eb67f62a4af.jpeg)

メモ帳やVS Codeで同じ文章を書くとこんな感じです。
![notepad.jpg](https://qiita-image-store.s3.amazonaws.com/0/128670/df5bf7c6-04d2-f718-1ff6-5208abc7fbda.jpeg)

比較してみるとその差は明らかです。Notepad++はタブや半角スペースを単語の区切りとして処理（＝ワード単位）をしているのに対して、メモ帳やVS Codeはそうでないことが分かります。

## 事前準備
### ソースコードのダウンロード
[GitHub](https://github.com/notepad-plus-plus/notepad-plus-plus)からNotepad++ソースコードを取得します。gitをインストールしていない場合は「Clone or Download」をクリックし「Download ZIP」をクリックすることでzip形式でまるごとダウンロードする事もできます。

### 開発環境のダウンロード
開発環境はVisual Studio Express 2015を使います。

まず[Visual Studio Express 2015](https://www.visualstudio.com/ja/post-download-vs/?sku=xdesk)からVisual Studio Express 2015をダウンロードしインストールします。

つづけて[Windows Driver Kit Version 7.1.0](https://www.microsoft.com/en-us/download/details.aspx?id=11800)をダウンロードしインストールします。このWindows Driver KitはATLライブラリのためにインストールしています。別の方法でATLのヘッダファイルやライブラリをインストールしている場合はインストールする必要はないと思います。

###プロジェクトプロパティの変更
Windows DrivWindows Driver Kiter Kitのパスの追加と警告の設定を行います。

PowerEditor\visual.net\notepadPlus.vs2015.vcxproj を開きプロジェクトのプロパティを以下のように変更します。

- 画面一番上のConfigurationを「Unicode Debug」から「Unicode Release」に変更し、Platformを「x64」から「Win32」に変更します。
- C/C++ → General の中のAdditional Include Directoriesに「C:\WinDDK\7600.16385.1\inc\atl71」を追加します。
- C/C++ → General の中のTreat Warnings As Errorsを「Yes（/WX）」から「No（/WX-）」に変更します。
- Linker → General の中のAdditional Library Directoriesに「C:\WinDDK\7600.16385.1\lib\ATL\i386」を追加します。


##ソースコードの変更
ソースコードを眺めてみたところNotepad++で使用しているライブラリscintillaには行の折り返しモードとして「なし」「単語単位」「文字単位」の３つが用意されていて、Notepad++はそのうちの「なし」と「単語単位」を使っているようです。

今回は単純に「単語単位」を「文字単位」に変更してしまいたいと思います。本当は「なし」「単語単位」「文字単位」から選べるようにするといいのかもしれませんが使わない＆変更が大変そうということで…

変更するファイルは２つです。私の知っている限りでv4からv7まででexecute(SCI_SETWRAPMODE, willBeWrapped)あたりの記述は変わっていませんので、多少バージョンが変わっても同じような変更で対応できるんじゃないかなと勝手に思っています。

###ScintillaEditView.h

```diff:PowerEditor\src\ScitillaComponent\ScintillaEditView.h
@@ -391 +391 @@ public:
-        execute(SCI_SETWRAPMODE, willBeWrapped);
+        execute(SCI_SETWRAPMODE, (WPARAM)(willBeWrapped ? SC_WRAP_CHAR : SC_WRAP_NONE));
@@ -395 +395 @@ public:
-        return (execute(SCI_GETWRAPMODE) == SC_WRAP_WORD);
+        return (execute(SCI_GETWRAPMODE) != SC_WRAP_NONE);
```

###resource.h
このままだとオリジナルと区別がつかなくなってしまいますので、バージョン表記をちょっと変更します。「cw」はCHAR WRAPという事で…雑ですみません。

```diff:PowerEditor\src\resource.h
@@ -30 +30 @@
-#define NOTEPAD_PLUS_VERSION TEXT("Notepad++ v7.3.3")
+#define NOTEPAD_PLUS_VERSION TEXT("Notepad++ v7.3.3cw")
@@ -34 +34 @@
-#define VERSION_VALUE TEXT("7.33\0")
+#define VERSION_VALUE TEXT("7.33cw\0")
```

##コンパイル
「Build」メニューから「Configuration Manager」を選びActive solution configurationを「Unicode Release」、Active solution platformを「x86」に変更し、「Build」メニューから「Build Solution」を選びコンパイルします。

先ほどオプションでTreat Warnings As ErrorsをNoしたこともあり警告はでまくるものの「PowerEditor\bin」フォルダに「notepad++.exe」が作成されます。

##インストール＆テスト
何となく怪しい結果になったのでとりあえずテストするために「C:\Program Files\Notepad++\」フォルダの「notepad++.exe」を適当にリネームし先ほど作成した「notepad++.exe」をコピーします。

notepad++.exeを起動して、先ほどと同じ文章を書いてみます。

![notepad-pp-cw.jpg](https://qiita-image-store.s3.amazonaws.com/0/128670/41b031e9-e99a-c35b-487a-e8c82eb06499.jpeg)

なかなか良い感じです。本当なら他におかしいところがないかチェックしてOKならデプロイと行きたいところなんですが、チェックをさぼり続けて今日の時点でもデプロイまで至っていません。個人的に使うだけなので…と開き直ってしまっているところもありますので、いつになることやら…という感じです。