Emacs で全世界の文字を表示・編集可能にする。

Emacs で、Noto Fonts を全部使い切る設定です。
ついでに、インストールされていないフォントは警告するよう、set-fontset-font にアドバイスしてみます。


```emacs-lisp
(defun set-fontset-font:around (set-fontset-font name target font-spec &optional frame add)
  "Warn if specified font is not installed."
  (if (stringp font-spec) (setq font-spec (font-spec :family font-spec)))
  (if (and (fontp font-spec)
           (null (find-font font-spec)))
      (warn "set-fontset-font: font %s is not found." (font-get font-spec :family))
    (funcall set-fontset-font name target font-spec frame add)))

(advice-add 'set-fontset-font :around #'set-fontset-font:around)

(defun reset-default-fontset ()
  "Reset current fontset."
  (interactive)
  ;; reset all settings in default fontset
  (if (find-font (font-spec :family "Noto Sans"))
      (set-fontset-font t '(0 . #x3fffff) "Noto Sans"))
  ;; multiple platform
  (set-fontset-font t 'latin "Noto Sans")
  (set-fontset-font t 'greek "Noto Sans")
  (set-fontset-font t 'phonetic "Noto Sans")
  (set-fontset-font t 'coptic "Noto Sans Coptic")
  (set-fontset-font t 'coptic "Noto Sans Symbols2" nil 'append)
  (set-fontset-font t 'cyrillic "Noto Sans")
  (set-fontset-font t 'armenian "Noto Sans Armenian")
  (set-fontset-font t 'hebrew "Noto Sans Hebrew")
  (set-fontset-font t 'arabic "Noto Sans Arabic")
  (set-fontset-font t 'syriac "Noto Sans Syriac")
  (set-fontset-font t 'thaana "Noto Sans Thaana")
  (set-fontset-font t 'nko "Noto Sans N'Ko")
  (set-fontset-font t 'samaritan "Noto Sans Samaritan")
  (set-fontset-font t 'mandaic "Noto Sans Mandaic")
  (set-fontset-font t 'devanagari "Noto Sans Devanagari")
  (set-fontset-font t 'bengali "Noto Sans Bengali")
  (set-fontset-font t 'gurmukhi "Noto Sans Gurmukhi")
  (set-fontset-font t 'gujarati "Noto Sans Gujarati")
  (set-fontset-font t 'oriya "Noto Sans Oriya")
  (set-fontset-font t 'tamil "Noto Sans Tamil")
  (set-fontset-font t 'tamil "Noto Sans Tamil Supplement" nil 'append)
  (set-fontset-font t 'telugu "Noto Sans Telugu")
  (set-fontset-font t 'kannada "Noto Sans Kannada")
  (set-fontset-font t 'malayalam "Noto Sans Malayalam")
  (set-fontset-font t 'sinhala "Noto Sans Sinhala")
  (set-fontset-font t 'thai "Noto Sans Thai")
  (set-fontset-font t 'lao "Noto Sans Lao")
  (set-fontset-font t 'tibetan "Noto Sans Tibetan")
  (set-fontset-font t 'burmese "Noto Sans Myanmar")
  (set-fontset-font t 'georgian "Noto Sans Georgian")
  (set-fontset-font t 'hangul "Noto Sans CJK KR")
  (set-fontset-font t 'ethiopic "Noto Sans Ethiopic")
  (set-fontset-font t 'cherokee "Noto Sans Cherokee")
  (set-fontset-font t 'canadian-aboriginal "Noto Sans Canadian Aboriginal")
  (set-fontset-font t 'ogham "Noto Sans Ogham")
  (set-fontset-font t 'runic "Noto Sans Runic")
  (set-fontset-font t 'tagalog "Noto Sans Tagalog")
  (set-fontset-font t 'hanunoo "Noto Sans Hanunoo")
  (set-fontset-font t 'buhid "Noto Sans Buhid")
  (set-fontset-font t 'tagbanwa "Noto Sans Tagbanwa")
  (set-fontset-font t 'khmer "Noto Sans Khmer")
  (set-fontset-font t 'mongolian "Noto Sans Mongolian")
  (set-fontset-font t 'limbu "Noto Sans Limbu")
  (set-fontset-font t 'tai-le "Noto Sans Tai Le")
  (set-fontset-font t 'tai-lue "Noto Sans NewTaiLue")
  (set-fontset-font t 'buginese "Noto Sans Buginese")
  (set-fontset-font t 'tai-tham "Noto Sans Tai Tham")
  (set-fontset-font t 'balinese "Noto Sans Balinese")
  (set-fontset-font t 'sundanese "Noto Sans Sundanese")
  (set-fontset-font t 'vedic "Noto Sans Devanagari")
  (set-fontset-font t 'symbol "Noto Sans CJK JP")
  (set-fontset-font t 'symbol "Noto Sans Symbols2" nil 'append)
  (set-fontset-font t 'symbol "Noto Sans" nil 'append)
  (set-fontset-font t 'symbol "Noto Sans Math" nil 'append)
  (set-fontset-font t 'symbol "Noto Emoji" nil 'append)
  (set-fontset-font t 'symbol "Noto Sans Symbols" nil 'append)
  (set-fontset-font t 'braille "Noto Sans Symbols2")
  (set-fontset-font t 'batak "Noto Sans Batak")
  (set-fontset-font t 'lepcha "Noto Sans Lepcha")
  (set-fontset-font t 'ol-chiki "Noto Sans Ol Chiki")
  (set-fontset-font t 'glagolitic "Noto Sans Glagolitic")
  (set-fontset-font t 'tifinagh "Noto Sans Tifinagh")
  (set-fontset-font t 'han "Noto Sans CJK JP")
  (set-fontset-font t 'ideographic-description "Noto Sans CJK JP")
  (set-fontset-font t 'cjk-misc "Noto Sans CJK JP")
  (set-fontset-font t 'kana "Noto Sans CJK JP")
  (set-fontset-font t 'bopomofo "Noto Sans CJK TC")
  (set-fontset-font t 'kanbun "Noto Sans CJK JP")
  (set-fontset-font t 'yi "Noto Sans Yi")
  (set-fontset-font t 'lisu "Noto Sans Lisu")
  (set-fontset-font t 'vai "Noto Sans Vai")
  (set-fontset-font t 'bamum "Noto Sans Bamum")
  (set-fontset-font t 'syloti-nagri "Noto Sans Syloti Nagri")
  (set-fontset-font t 'north-indic-number "Noto Sans Devanagari")
  (set-fontset-font t 'phags-pa "Noto Sans Phags Pa")
  (set-fontset-font t 'saurashtra "Noto Sans Saurashtra")
  (set-fontset-font t 'kayah-li "Noto Sans Kayah Li")
  (set-fontset-font t 'rejang "Noto Sans Rejang")
  (set-fontset-font t 'javanese "Noto Sans Javanese")
  (set-fontset-font t 'cham "Noto Sans Cham")
  (set-fontset-font t 'tai-viet "Noto Sans Tai Viet")
  (set-fontset-font t 'meetei-mayek "Noto Sans Meetei Mayek")
  (set-fontset-font t 'vertical-form "Noto Sans CJK JP")
  ;; (set-fontset-font t '(#xfe50 . #xfe6b) "Noto Sans CJK JP") ; symbol
  (set-fontset-font t '(#xfff9 . #xfffb) "Noto Sans Symbols2") ; nil
  (set-fontset-font t 'linear-b "Noto Sans Linear B")
  (set-fontset-font t 'aegean-number "Noto Sans Linear B")
  (set-fontset-font t 'ancient-greek-number "Noto Sans Symbols2")
  (set-fontset-font t 'ancient-symbol "Noto Sans Symbols2")
  (set-fontset-font t 'phaistos-disc "Noto Sans Symbols2")
  (set-fontset-font t 'lycian "Noto Sans Lycian")
  (set-fontset-font t 'carian "Noto Sans Carian")
  (set-fontset-font t 'old-italic "Noto Sans Old Italic")
  (set-fontset-font t 'gothic "Noto Sans Gothic")
  (set-fontset-font t 'old-permic "Noto Sans Old Permic")
  (set-fontset-font t 'ugaritic "Noto Sans Ugaritic")
  (set-fontset-font t 'old-persian "Noto Sans OldPersian")
  (set-fontset-font t 'deseret "Noto Sans Deseret")
  (set-fontset-font t 'shavian "Noto Sans Shavian")
  (set-fontset-font t 'osmanya "Noto Sans Osmanya")
  (set-fontset-font t 'osage "Noto Sans Osage")
  (set-fontset-font t 'elbasan "Noto Sans Elbasan")
  (set-fontset-font t 'caucasian-albanian "Noto Sans CaucAlban")
  (set-fontset-font t 'linear-a "Noto Sans Linear A")
  (set-fontset-font t 'cypriot-syllabary "Noto Sans Cypriot")
  (set-fontset-font t 'aramaic "Noto Sans ImpAramaic")
  (set-fontset-font t 'palmyrene "Noto Sans Palmyrene")
  (set-fontset-font t 'nabataean "Noto Sans Nabataean")
  (set-fontset-font t 'hatran "Noto Sans Hatran")
  (set-fontset-font t 'phoenician "Noto Sans Phoenician")
  (set-fontset-font t 'lydian "Noto Sans Lydian")
  (set-fontset-font t 'meroitic "Noto Sans Meroitic")
  (set-fontset-font t 'kharoshthi "Noto Sans Kharoshthi")
  (set-fontset-font t 'old-south-arabian "Noto Sans OldSouArab")
  (set-fontset-font t 'old-north-arabian "Noto Sans OldNorArab")
  (set-fontset-font t 'manichaean "Noto Sans Manichaean")
  (set-fontset-font t 'avestan "Noto Sans Avestan")
  (set-fontset-font t 'inscriptional-parthian "Noto Sans Inscriptional Parthian")
  (set-fontset-font t 'inscriptional-pahlavi "Noto Sans Inscriptional Pahlavi")
  (set-fontset-font t 'psalter-pahlavi "Noto Sans PsaPahlavi")
  (set-fontset-font t 'old-turkic "Noto Sans Old Turkic")
  (set-fontset-font t 'old-hungarian "Noto Sans OldHung")
  (set-fontset-font t 'hanifi-rohingya "Noto Sans HanifiRohg")
  (set-fontset-font t 'rumi-number "Noto Sans Symbols2")
  (set-fontset-font t 'old-sogdian "Noto Sans OldSogdian")
  (set-fontset-font t 'sogdian "Noto Sans Sogdian")
  (set-fontset-font t 'elymaic "Noto Sans Elymaic")
  (set-fontset-font t 'brahmi "Noto Sans Brahmi")
  (set-fontset-font t 'kaithi "Noto Sans Kaithi")
  (set-fontset-font t 'sora-sompeng "Noto Sans SoraSomp")
  (set-fontset-font t 'chakma "Noto Sans Chakma")
  (set-fontset-font t 'mahajani "Noto Sans Mahajani")
  (set-fontset-font t 'sharada "Noto Sans Sharada")
  (set-fontset-font t 'sinhala-archaic-number "Noto Sans Sinhala")
  (set-fontset-font t 'khojki "Noto Sans Khojki")
  (set-fontset-font t 'multani "Noto Sans Multani")
  (set-fontset-font t 'khudawadi "Noto Sans Khudawadi")
  (set-fontset-font t 'grantha "Noto Sans Grantha")
  (set-fontset-font t 'newa "Noto Sans Newa")
  (set-fontset-font t 'tirhuta "Noto Sans Tirhuta")
  (set-fontset-font t 'siddham "Noto Sans Siddham")
  (set-fontset-font t 'modi "Noto Sans Modi")
  (set-fontset-font t 'takri "Noto Sans Takri")
  (set-fontset-font t 'ahom "Noto Serif Ahom")
  (set-fontset-font t 'dogra "Noto Serif Dogra")
  (set-fontset-font t 'warang-citi "Noto Sans WarangCiti")
  (set-fontset-font t 'zanabazar-square "Noto Sans Zanabazar")
  (set-fontset-font t 'soyombo "Noto Sans Soyombo")
  (set-fontset-font t 'pau-cin-hau "Noto Sans PauCinHau")
  (set-fontset-font t 'bhaiksuki "Noto Sans Bhaiksuki")
  (set-fontset-font t 'marchen "Noto Sans Marchen")
  (set-fontset-font t 'masaram-gondi "Noto Sans Masaram Gondi")
  (set-fontset-font t 'gunjala-gondi "Noto Sans Gunjala Gondi")
  (set-fontset-font t 'cuneiform "Noto Sans Cuneiform")
  (set-fontset-font t 'cuneiform-numbers-and-punctuation "Noto Sans Cuneiform")
  (set-fontset-font t 'egyptian "Noto Sans EgyptHiero")
  (set-fontset-font t 'anatolian "Noto Sans AnatoHiero")
  (set-fontset-font t 'mro "Noto Sans Mro")
  (set-fontset-font t 'bassa-vah "Noto Sans Bassa Vah")
  (set-fontset-font t 'pahawh-hmong "Noto Sans Pahawh Hmong")
  (set-fontset-font t 'miao "Noto Sans Miao")
  (set-fontset-font t 'tangut "Noto Serif Tangut")
  (set-fontset-font t 'tangut-components "Noto Serif Tangut")
  (set-fontset-font t '(#x16fe0 . #x16fe0) "Noto Serif Tangut")
  (set-fontset-font t 'duployan-shorthand "Noto Sans Duployan")
  (set-fontset-font t 'byzantine-musical-symbol "Noto Music")
  (set-fontset-font t 'musical-symbol "Noto Music")
  (set-fontset-font t 'ancient-greek-musical-notation "Noto Music")
  (set-fontset-font t 'mayan-numeral "Noto Sans Mayan Numerals")
  (set-fontset-font t 'tai-xuan-jing-symbol "Noto Sans Symbols2")
  (set-fontset-font t 'counting-rod-numeral "Noto Sans Symbols2")
  (set-fontset-font t 'mathematical "Noto Sans Math")
  (set-fontset-font t 'wancho "Noto Sans Wancho")
  (set-fontset-font t 'mende-kikakui "Noto Sans Mende Kikakui")
  (set-fontset-font t 'adlam "Noto Sans Adlam")
  (set-fontset-font t 'indic-siyaq-number "Noto Sans Indic Siyaq Numbers")
  (set-fontset-font t '(#x1ee00 . #x1eeff) "Noto Sans Math") ; arabic
  (set-fontset-font t 'mahjong-tile "Noto Sans Symbols2")
  (set-fontset-font t 'domino-tile "Noto Sans Symbols2")
  (set-fontset-font t 'playing-cards "Noto Sans Symbols2")
  ;; non Noto fonts
  (set-fontset-font t 'kana "UniHentaiKana" nil 'append)
  (set-fontset-font t 'latin "Iosevka" nil 'append)
  (set-fontset-font t 'symbol "Iosevka" nil 'append)
  ;; Nerd Font (defined thru -#xfd46)
  (set-fontset-font t '( #xe000 .  #xf136) "Inconsolata Nerd Font")
  ;;
  (when (eq window-system 'w32)
    (set-fontset-font t 'bengali    "Nirmala UI" nil 'prepend)
    (set-fontset-font t 'gurmukhi   "Nirmala UI" nil 'prepend)
    (set-fontset-font t 'gujarati   "Nirmala UI" nil 'prepend)
    (set-fontset-font t 'telugu     "Nirmala UI" nil 'prepend)
    (set-fontset-font t 'kannada    "Nirmala UI" nil 'prepend)
    (set-fontset-font t 'malayalam  "Nirmala UI" nil 'prepend)
    (set-fontset-font t 'vedic      "Nirmala UI" nil 'prepend)
    (set-fontset-font t 'devanagari "Nirmala UI" nil 'prepend)
    (set-fontset-font t 'brahmi     "Segoe UI Historic" nil 'prepend)
    (set-fontset-font t 'georgian   "Segoe UI" nil 'prepend)
    (set-fontset-font t '( #x0300 .  #x1cff) "Arial" nil 'append) 
    (set-fontset-font t '( #x2000 .  #x27bf) "Segoe UI Symbol" nil 'append)
    (set-fontset-font t '( #x2e00 .  #xdfff) "花園明朝 A Regular" nil 'append)
    (set-fontset-font t '( #xfe0e .  #xfe0f) "Segoe UI Emoji")
    (set-fontset-font t '( #xf137 .  #xf69d) "花園明朝 A Regular")
    (set-fontset-font t '(#x1b000 . #x1b000) "Meiryo UI")
    (set-fontset-font t '(#x1f300 . #x1f9ff) "Segoe UI Emoji" nil 'append)
    (set-fontset-font t '(#x1fa70 . #x1fbff) "Segoe UI Emoji" nil 'append)
    (set-fontset-font t '(#x1f900 . #x1f9e0) "Segoe UI Emoji" nil 'append)
    (set-fontset-font t '(#x20000 . #x2a6ff) "花園明朝 B Regular")
    (set-fontset-font t '(#x2a700 . #x2fffd) "花園明朝 C Regular"))
  (when (not (eq system-type 'windows-nt))
    (set-fontset-font t '( #x2e00 .  #xdfff) "Hanazono Mincho A Regular" nil 'append)
    (set-fontset-font t '( #xf137 .  #xf69d) "Hanazono Mincho A Regular")
    (set-fontset-font t '(#x20000 . #x2a6ff) "Hanazono Mincho B Regular")
    (set-fontset-font t '(#x2a700 . #x2fffd) "Hanazono Mincho C Regular")
    ))
```

【追記】
- Unicode は、連続符号領域をブロックとして定義しており、Emacs Lisp でも、これに準じた文字符号ブロック名シンボルを、set-fontset-font 関数の第二引数に指定できます。
- しかしながら、歴史的経緯により、同じ符号化集合やデザインの文字、そして１つのフォントがカバーする文字が、複数の異なるブロックに跨がることがあります。
- Noto Fonts は、Google が中心となって作成している、全世界の文字をカバーする　（NO　TOfu)　ことを目的としたフォント群ですが、上記の事情により、必ずしも各フォントは各ブロックと対応しません。
- 本設定は、可能な限りUnicodeで定義されている文字を、Notoフォントファミリーでカバーできるよう、 set-fontset-font 関数で設定したものです。
- Noto 以外の部分、特にラテン文字と日本語に使う文字については、各人が好みで自分のフォントを指定してください。