47

関数内の文字列として現在のリージョンの内容にアクセスしたい。例えば:

(concat "stringa" (get-region-as-string) "stringb")

ありがとう

エド

4

3 に答える 3

77

starblue が言う(buffer-substring (mark) (point))ように、マークが設定されている場合、領域の内容を返します。文字列プロパティが必要ない場合は、'buffer-substring-no-propertiesバリアントを使用できます。

ただし、対話型コマンドを作成している場合は、フォームを使用してリージョンのエンドポイントを取得するより良い方法があります(interactive "r")。からの例を次に示しsimple.elます。

(defun count-lines-region (開始終了)
  「領域内の行数と文字数を出力します。」
  (インタラクティブな "r")
  (メッセージ「リージョンには %d 行、%d 文字があります」
       (count-lines start end) (- end start)))

Lisp コードから呼び出された場合、(interactive ...)フォームは無視されるため、この関数を使用して、適切な引数を渡すことにより、リージョンだけでなく、バ​​ッファーの任意の部分の行をカウントできます: たとえば、(count-lines-region (point-min) (point-max))狭められた部分の行をカウントするバッファの。ただし、対話的に呼び出されると、(interactive ...)フォームが評価され、"r"コードはポイントとマークを 2 つの数値引数として、小さい方から順に指定します。

Emacs Lisp マニュアルのセクション21.2.1 Using Interactiveおよび21.2.2 Code Characters for interactiveを参照してください。

于 2009-03-03T10:51:18.153 に答える
62

buffer-substring一緒に、region-beginningそれregion-endを行うことができます。

于 2009-03-03T10:23:15.333 に答える
5

Lisp コードのリージョンの内容を kill-ring、X クリップボード、またはレジスタなどのユーザーがアクセス可能なデータ構造にコピーしたい場合、Emacs Lisp のマニュアルfilter-buffer-substringでは単純に の代わりにを使用することを推奨していますbuffer-substring。コピーする前に、関数は というリスト変数からフィルター関数を適用しますfilter-buffer-substring-functions。この機能はバージョン 22.3 で追加されました

于 2014-03-03T05:39:35.257 に答える