Xamarin.MacでNSTextViewのスマートクォートを無効化する

提供: MonoBook
ナビゲーションに移動 検索に移動

概要[編集 | ソースを編集]

NSTextViewのスマートクォートを無効化したい。

Xamarin.Macで開発している社内アプリの設定画面に、アプリ起動時に実行するAppleScriptを入力する欄をNSTextViewで作ったわけだが、ここにクォートを入力するとスマートクオートが発動して実行できないAppleScriptに勝手に置き換えられてしまう不具合が発生した。

たとえば以下のようなAppleScriptのダブルクォート部分がダメになる。

tell application "Safari"
    activate
end tell

解決策:OSレベルで無効化する[編集 | ソースを編集]

スマートクォートはMac OS Xに標準搭載されているビッグなお世話なゴミ機能であり、OSレベルで根本から止めるのであれば以下の手順になる。

  • システム環境設定
  • キーボード
  • ユーザ辞書
  • スマート引用符とスマートダッシュを使用 (このチェックをはずす)

これにより全ての文字入力でビッグなお世話なスマートクォートが動かなくなって幸せになれる。

解決策:NSTextView単位で無効化する[編集 | ソースを編集]

OSレベルでの解決方法が確実なのだろうが今から社内にある500台くらいのMacに設定して回るとか正気の沙汰とは思えないので自動アップデートを搭載したアプリ単位で解決したい。

XIBファイルを開きNSTextViewの設定項目を眺めているとスマートクォート関連の設定があったわけだが、なぜかこのチェックを付けても外しても無効化できない。古いMac OS Xでは動くようだが最近のやつはダメなようだ。

上記と似たようなことをプログラムから叩いてやると最近のMac OS X (Yosemite)でも無効化できた。なぜかは知らん。たぶんこの方法はMonoMacでも行けると思うが試してはいない。

    public partial class PreferenceWindowController : MonoMac.AppKit.NSWindowController
    {
        public override void WindowDidLoad()
        {
            base.WindowDidLoad();

            // disable Smart Quotes 
            // よくわからんのでAutomaticで始まるプロパティ全部にfalseを設定してみた
            _nsTextView.AutomaticDashSubstitutionEnabled = false;
            _nsTextView.AutomaticDataDetectionEnabled = false;
            _nsTextView.AutomaticLinkDetectionEnabled = false;
            _nsTextView.AutomaticQuoteSubstitutionEnabled = false;
            _nsTextView.AutomaticSpellingCorrectionEnabled = false;
            _nsTextView.AutomaticTextReplacementEnabled = false;
            _nsTextView.EnabledTextCheckingTypes = 0;
        }
    }

関連項目[編集 | ソースを編集]

参考文献[編集 | ソースを編集]