message 関数 ¶+と同様に、message関数は可変個の引数を取ります。ユーザーにメッセージを送信する際に使用され、非常に有用であるため、ここで解説します。
エコー領域にメッセージが出力されます。例えば、以下のリストを評価することで、エコー領域にメッセージを出力できます。
(message "This message appears in the echo area!")
ダブルクォートで囲まれた文字列全体が単一の引数となり、そのまま出力されます。(なお、この例ではメッセージ自体がダブルクォートで囲まれた状態でエコーエリアに表示されます。これは、message関数が返す値が表示されるためです。ご自身で作成されるプログラムでmessageを使用する場合の多くは、テキストは副作用としてクォートなしでエコーエリアに出力されます。この例については、multiply-by-sevenの詳細を参照してください。)
ただし、引用符で囲まれた文字列の中に ‘%s’ がある場合、message 関数は ‘%s’
をそのまま出力するのではなく、文字列に続く引数を参照します。第2引数を評価し、文字列内で ‘%s’ がある位置の値を出力します。
以下の式の後にカーソルを置いて C-x C-e と入力すると、これが確認できます。
(message "The name of this buffer is: %s." (buffer-name))
Infoでは、"The name of this buffer is:
*info*."がエコーエリアに表示されます。関数buffer-nameはバッファ名を文字列として返し、関数messageがそれを%sの代わりに挿入します。
値を整数として出力するには、%sと同様に%dを使用します。例えば、echo領域にfill-columnの値を示すメッセージを出力するには、以下を評価します。
(message "The value of fill-column is %d." fill-column)
私の環境では、このリストを評価すると、エコー領域に"The value of fill-column
is 72."が表示されます5。
引用符で囲まれた文字列内に複数の ‘%s’ がある場合、最初の ‘%s’ の位置にその文字列に続く第1引数の値が、2番目の ‘%s’ の位置に第2引数の値が、というように順に出力されます。
例えば、以下を評価すると、
(message "There are %d %s in the office!"
(- fill-column 14) "pink elephants")
エコーエリアにかなり風変わりなメッセージが表示されます。私の環境では、"There are 58
pink elephants in the office!"と表示されています。
式 (- fill-column 14) が評価され、その結果得られた数値が
‘%d’ の代わりに挿入されます。また、ダブルクォートで囲まれた文字列
"pink elephants"
は単一の引数として扱われ、‘%s’
の代わりに挿入されます。(つまり、ダブルクォートで囲まれた文字列は、数値と同様にそれ自体として評価されます。)
最後に、数値の計算例を示すだけでなく、式の中で式を用いることで ‘%s’ に代入されるテキストを生成する方法も示す、やや複雑な例を挙げます。
(message "He saw %d %s"
(- fill-column 32)
(concat "red "
(substring
"The quick brown foxes jumped." 16 21)
" leaping."))
この例では、message には文字列、"He
saw %d %s"、式、(- fill-column 32)、および関数
concat で始まる式という3つの引数があります。(-
fill-column 32) の評価結果が ‘%d’
の代わりに挿入され、concat で始まる式が返す値が ‘%s’ の代わりに挿入されます。
フィル列が70の状態で式を評価すると、エコー領域にメッセージ "He saw 38 red foxes
leaping." が表示されます。