この節では、Lispプログラムがバッファ内のテキストの任意の部分を文字列に変換できる関数について説明します。
この関数は、現在のバッファにおいて位置 start と end
で定義される領域のテキストのコピーを含む文字列を返します。引数がバッファのアクセス可能な範囲内の位置でない場合、buffer-substring は args-out-of-range エラーを示します。
以下は、Font-Lockモードが有効になっていないことを想定した例です:
---------- Buffer: foo ---------- This is the contents of buffer foo ---------- Buffer: foo ----------
(buffer-substring 1 10)
⇒ "This is t"
(buffer-substring (point-max) 10)
⇒ "he contents of buffer foo\n"
コピー対象のテキストにテキストプロパティが設定されている場合、それらは所属する文字とともに文字列にコピーされます。テキストプロパティを参照してください。ただし、バッファ内のオーバーレイ(オーバーレイを参照)およびそのプロパティは無視され、コピーされません。
例えば、Font-Lockモードが有効になっている場合、次のような結果が得られることがあります。
(buffer-substring 1 10)
⇒ #("This is t" 0 1 (fontified t) 1 9 (fontified t))
これは buffer-substring
と同様ですが、テキストプロパティはコピーせず、文字そのもののみをコピーします。テキストプロパティ を参照してください。
この関数は、現在のバッファのアクセス可能な全領域の内容を文字列として返します。コピー対象のテキストにテキストプロパティが設定されている場合、それらは対応する文字とともに文字列にコピーされます。
生成された文字列を別の場所にコピーした際、双方向テキストの並べ替えによって見た目が変わってしまわないようにしたい場合は、buffer-substring-with-bidi-context 関数を使用してください(buffer-substring-with-bidi-context
を参照)。
この関数は、変数 filter-buffer-substring-function
で指定された関数を用いて start と end
の間のバッファテキストをフィルタリングし、その結果を返します。 start と end で指定されるバッファ位置の順序は問題にならないはずです。というのも、この関数は kill 関数(キル用の関数
を参照)に渡されるテキストの抽出に頻繁に用いられるからです。
デフォルトのフィルタ関数は、廃止されたラッパーフック filter-buffer-substring-functions
を参照します(この廃止された機能の詳細については、マクロ with-wrapper-hook
のドキュメント文字列を参照してください)。これが nil
の場合、バッファ内の変更されていないテキスト、すなわち buffer-substring
が返す内容を返します。
delete が nil でない場合、関数は
delete-and-extract-region と同様に、start と end の間のテキストをコピーした後に削除します。
Lispコードでは、キルリング、Xクリップボード、レジスタといったユーザーアクセス可能なデータ構造にコピーする際、buffer-substring、buffer-substring-no-properties、またはdelete-and-extract-regionの代わりにこの関数を使用する必要があります。メジャーモードおよびマイナーモードでは、バッファからコピーされる際にfilter-buffer-substring-functionを変更して、こうしたテキストを改変することができます。
この変数の値は、filter-buffer-substring
が実際の処理を行う際に呼び出す関数です。この関数は filter-buffer-substring
と同じ3つの引数を受け取り、それらを当該関数のドキュメントに従って扱う必要があります。また、フィルタリング済みのテキストを返し(必要に応じて元のテキストを削除し)ます。なお、テキストを破棄する目的で抽出するというプロトコルに準拠するため、バッファ位置の指定順序にかかわらず、start および end
の引数を処理しなければならない点に注意してください。
以下の2つの変数は filter-buffer-substring-function
によって廃止されますが、後方互換性のために引き続きサポートされています。
この廃止された変数はラッパーフックであり、そのメンバは fun、start、end、delete の4つの引数を受け取る関数である必要があります。fun
は3つの引数(start、end、delete)を受け取り、文字列を返す関数です。いずれの場合も、start、end、delete の引数は filter-buffer-substring の引数と同じです。
最初のフック関数には、filter-buffer-substring のデフォルト動作と同等の
fun が渡されます。つまり、start と end
の間のバッファ部分文字列を返し、必要に応じてバッファから元のテキストを削除します。ほとんどの場合、フック関数は fun を1回呼び出し、その結果に対して独自の処理を行います。次のフック関数にはこれと同等の fun が渡され、以降も同様です。実際の戻り値は、すべてのフック関数が順次実行された結果となります。
この関数は、point またはその近傍にあるシンボル(または単語)を文字列として返します。戻り値にテキストプロパティは含まれません。
オプション引数 really-word が nil
以外の場合は単語を、そうでない場合は記号(単語文字と記号構成文字の両方を含む)を検索します。
オプション引数 strict が nil
以外の場合、point は記号または単語内、あるいはその隣接位置にある必要があります。そこに記号や単語が存在しない場合、関数は nil を返します。それ以外の場合は、同一行上の近くにある記号や単語でも許容されます。
ポイントの周囲または隣接する thing を文字列として返します。
引数 thing は、構文実体の種類を指定する記号です。候補としては、symbol、list、sexp、defun、filename、existing-filename、url、word、sentence、whitespace、line、page、string などが挙げられます。
オプション引数 no-properties が nil
以外の場合、この関数は戻り値からテキストプロパティを削除します。
---------- Buffer: foo ----------
Gentlemen may cry ``Pea∗ce! Peace!,''
but there is no peace.
---------- Buffer: foo ----------
(thing-at-point 'word)
⇒ "Peace"
(thing-at-point 'line)
⇒ "Gentlemen may cry ``Peace! Peace!,''\n"
(thing-at-point 'whitespace)
⇒ nil
この変数により、ユーザーやモードはthing-at-pointの動作を微調整できます。これはthingと、その値を返す関数(引数なしで呼び出されるもの)の関連付けリストです。thingのエントリは、nil以外の結果が返されるまで順次評価されます。
例えば、メジャーモードでは次のように記述できます。
(setq-local thing-at-point-provider-alist
(append thing-at-point-provider-alist
'((url . my-mode--url-at-point))))
いずれのプロバイダーも nil 以外のレスポンスを返さない場合、thing は標準的な方法で算出されます。