構文

Mihomo は設定ファイル形式として YAML を使用しています。ここでは設定を書く際に使用する構文ルールを、コメント、オブジェクト/配列、アンカー参照、ドメインワイルドカード、ポート範囲の書き方を中心にまとめています。

基本ルール

YAML は大文字小文字を区別し、インデントで階層関係を表します。インデントにはスペースのみを使用し、タブは使用できません。インデントのスペース数自体は重要ではなく、同じ階層の要素が左端で揃っていれば問題ありません。

エディタで「インデントが揃っていないのに揃って見える」というエラーが出た場合、多くはタブ文字が誤って混入していることが原因です。インデントの方式を確認してください。

コメント

# から行末までがコメントになります。# の前は行頭またはスペースである必要があります。そうでない場合はコメントとして認識されません(例えば URL 内の # は影響を受けません)。

config.yaml YAML
port: 7890 # http プロキシポート
socks-port: 7891
# socks プロキシポート

オブジェクトと配列

オブジェクトは key: value で表し、コロンの後にスペースを1つ入れます。YAML は JSON のスーパーセットなので、JSON スタイルの構文も直接使用できます。以下の4種類の書き方はすべて等価です:

複数行形式(最も一般的)
YAML 複数行
tun:
  enable: true
  stack: system
  auto-route: true
  auto-detect-interface: true
1行 JSON 形式
YAML 1行
tun: { enable: true, stack: system, auto-route: true, auto-detect-interface: true }

配列は - で始まる行で表します。同様に1行の JSON 形式 a: [b, c, d] にも対応しており、複数行の配列と等価です:

YAML 配列
a:
  - b
  - c
  - d

アンカーと参照

& は設定の一部にアンカーを付けるために使用し、* はそのアンカーを参照するために使用します。<< はアンカーの内容を現在のオブジェクトにマージすることを表します。複数のプロキシプロバイダーやルールプロバイダーを記述する際、共通のフィールドを1回だけ記述してアンカーで再利用することで、多くの重複コードを省けます。

config.yaml YAML
p: &p
  type: http
  interval: 3600
  health-check:
    enable: true
    url: https://www.gstatic.com/generate_204
    interval: 300

proxy-providers:
  provider1:
    <<: *p
    url: ""
    path: ./proxy_providers/provider1.yaml

  provider2:
    <<: *p
    type: file
    path: ./proxy_providers/provider2.yaml

上記は p アンカーの内容をそれぞれ provider1provider2 にコピーすることと同等です。マージ時にフィールドが重複した場合(例えば provider2type を再度記述した場合)は、自分で記述した値が優先され、アンカーによって上書きされることはありません。また p というキー名自体は mihomo における正当なフィールドではなく、単にアンカーを保持するために使われており、解析時には無視されます。

ドメインワイルドカード

ここで説明するワイルドカードは fake-ip-filternameserver-policy などのフィールド専用のもので、ルーティングルールの DOMAIN-WILDCARD とは別のもので、構文は共通していません。

ワイルドカードマッチする範囲
*1階層のサブドメインのみにマッチ*.baidu.comtieba.baidu.com にマッチしますが、123.tieba.baidu.combaidu.com にはマッチしません
+任意の階層数にマッチ(前方一致、DOMAIN-SUFFIX に類似)+.baidu.combaidu.comtieba.baidu.com123.tieba.baidu.com のすべてにマッチします
.任意の階層数にマッチしますが、裸のドメイン自体は含みません.baidu.comtieba.baidu.com にマッチしますが、baidu.com にはマッチしません

ワイルドカードを使用する際は、YAML に別の型として解析されないよう引用符で囲むことを推奨します:

config.yaml YAML
fake-ip-filter:
  - ".lan"
  - "xbox.*.microsoft.com"
  - "+.xboxlive.com"
  - localhost.ptlogin2.qq.com

ドメインリストの読み込み

一部のフィールド(fake-ip-filter など)は rule-setgeosite のセットを直接読み込むことに対応しており、書式は タイプ:セット名 です:

ここでの rule-set は behavior が domain / classical のルールプロバイダーのみ対応しています。

config.yaml YAML
fake-ip-filter:
  - "rule-set:xxx"
  - "geosite:xxx"

ポート範囲

- でポート範囲を表し、/ または , で複数のポート/ポート範囲を区切ります。混在させることもできます:

Port Range
# 114-514、810-1919 の2つの範囲と、単独の 65530 ポートにマッチ
114-514/810-1919,65530