メモの日々


2016年12月13日(火) [長年日記]

[vim] Vim 8でフォントを綺麗に表示する

Vim 8で追加されたWindows での DirectX サポート機能を試したら、フォントが綺麗に表示されるようになったのでメモ。

VimはKaoriYaで配布されているもののGUI版を使う。バージョンは8.0.82。

renderoptionsオプションの設定

renderoptionsオプションを設定すると、テキストレンダリングにDirectXを使えるようになる。renderoptionsオプションはパラメータが色々あって難しいのだけれど、

:set renderoptions=type:directx,renmode:5

と設定することでまあ満足な表示になった。

が、この設定だけだと駄目で、以下の設定も行った。

UTF-8化

renderoptionsのヘルプのdirectxの項に

MS-Windows の Vista 以降のバージョンで 'encoding' が "utf-8" である必要がある。

とある通り、エンコーディングをUTF-8に設定する必要がある。KaoriYa版のデフォルトのエンコーディングはcp932になっているようだけれど、 switches\catalog にある utf-8.vim を switches\enabled に移動すればエンコーディングをutf-8に変更できる。

ここまでで、renderoptions未指定だと

画像の説明

という感じだったのが、renderoptionsを上記のように設定すると

画像の説明

という感じになる。下が綺麗かは微妙だけれど、字が太くなった!

guifontオプションの指定

GVimのデフォルトのフォントはMSゴシックのようだが、これをConsolasを使うようにしたい。Consolasには和文用にMSゴシックをリンクする設定を別途行っている(フォントのリンクについての説明は割愛)。

フォントはguifontオプションで設定する。cXXやqXXは何を設定すべきかわからないので未指定とし、

:set guifont=Consolas:h12

と設定すると、

画像の説明

となった。日本語の表示が崩れてしまう。

guifontwideオプションの指定

GVimにはguifontwideというオプションもあるのでこれを指定してみる。

:set guifontwide=MS_Gothic:h12

| と設定すると、

画像の説明

となった。うん、これでいいのではないだろうか。

IME動作時の表示が変

未解決の問題があって、漢字変換中に表示される文字の見栄えが確定後の見栄えと違ってしまって違和感がある。

画像の説明

見栄えは妥協したとしても文字幅が変わっちゃうのは困るよなあ。

追記

KaoriYaさんに解説記事が出ていたのでメモ。


2016年12月27日(火) [長年日記]

[c++] C++で型名とメンバ関数名を同じにしてみる

型名と変数名を同じにしたときの話を以前にメモしたが、型名とメンバ関数名を同じにしたときのGCCの挙動もメモ。型名を小文字で書いていると変数や関数や名前空間名との衝突が起こりがち。

サンプルコード

#include <iostream>

namespace ns {
  struct value {
    int v;
  };

  struct holder {
    value val;
    const value& value() const { return val; }
  };
}

int main() {
  ns::holder h{ns::value{100}};
  std::cout << h.value().v << std::endl;
}

このコードはclang 3.8だとコンパイルできるが、g++ 6.1では次のコンパイルエラーになる。

prog.cc:10:46: error: declaration of 'const ns::value& ns::holder::value() const' [-fpermissive]
     const value& value() const { return val; }
                                              ^
prog.cc:4:10: error: changes meaning of 'value' from 'struct ns::value' [-fpermissive]
   struct value {
          ^~~~~

名前空間名を補うとg++でもコンパイルできるようになる

次のように名前空間名を補って struct value を使うんだという意思を示すとg++でもコンパイルできる。

@@ -6,8 +6,8 @@
   };

   struct holder {
-    value val;
-    const value& value() const { return val; }
+    ns::value val;
+    const ns::value& value() const { return val; }
   };
 }

メンバ関数value()の宣言だけでなく、メンバ変数valの型にも名前空間名を補わないとコンパイルエラーになるのが分かりにくい。