1

2 つの位置 (その間の文字列) の間にテキストを保存できるようにしたいのですが、どこに保存するのが便利かわかりません。おそらく、ローカルに、またはグローバルに (letまたはsetq)。答えはおそらくそこにあるのですが、私はそれを見つけることができませんでした。

例:

逆方向に検索するために、テキストをシンボルに保存したいと思います。(ポイント) から最初の空白文字までの領域としましょう。

これを行う以前の方法は (kill-ring-save) を使用していましたが、これが悪い習慣であることはわかっています。

(ここ)から(message "hello")(ポイント)

これを行うためのより良い手法と、どこかにある文字列を保存する最良の方法の両方に興味があります(point)

4

2 に答える 2

2

通常の飾り気のない答えは、を使用することletです。あなたが信じているように思われることに反して、それはグローバルストレージを割り当てません。実際、それは正反対です。

(let ((myvalue "temporary string"))
  (message myvalue) )
=> "temporary string"

myvalue
=> Lisp error: (void-variable myvalue)

また、関数の実行中にのみ値が設定される変数を使用して、関数を簡単に作成できます。このinteractiveフォームを使用すると、ポイントとマークの値を簡単に取得できます。

(defun mysearch (point mark)
  (interactive "r")
  (let ((str (buffer-substring-no-properties point mark))
    (message "your search for %s can commence ..." str) ) )

一般的なイディオムは、save-excursionポイントを別の場所に移動し、元の場所と最終的な場所の間の領域を取得して、それを使って何かを行うために使用することです。を終了するsave-excursionと、カーソルの位置(およびその他のいくつかのもの)が以前の状態に戻ります。

(defun mysearch ()
  (interactive)
  (save-excursion
    (let ((here (point)) str)
      (forward-word -1)
      (setq str (buffer-substring-no-properties (point) here))
      (message "your search for %s can commence ..." str) ) ) )

おそらくあなたもhttp://ergoemacs.org/emacs/elisp_idioms.htmlを見たいと思うでしょう

関数の呼び出し間で値を保持する必要がある場合、一般的に行うことは、defvar@philsが提案するような変数を使用することです。共通の接頭辞を持ついくつかの変数は、自分用に別のモジュールを作成する必要があるように聞こえます。名前空間のフットプリントが少ない柔軟なソリューションの場合は、独自のソリューションを作成しますobarray(そして、ある種の第一人者のステータスを達成します)。http://www.gnu.org/software/emacs/manual/html_node/elisp/Creating-Symbols.html#Definition%20of%20mapatomsも参照してください。

于 2013-01-21T20:30:21.287 に答える
1

必要なのが一時的なローカル スコープだけである場合は、間違いなくlet.

それ以外の場合は、通常は変数を定義します (変数に名前を付けるときは、elisp には名前空間がないことに注意してください。そのため、特定のライブラリ内のすべてのシンボル名に対して確実に一意のプレフィックスを実用的に使用することをお勧めします)。

(defvar SYMBOL &optional INITVALUE DOCSTRING)

INITVALUE 引数を省略した場合、変数は最初はバインドされませんが、一度使用すると変数が動的バインディングを使用するようになります。

次にsetq、必要に応じて変数を指定します。

編集:
2 点間のバッファーの内容を取得するには、次のいずれかを使用します。

  • (buffer-substring START END)
  • (buffer-substring-no-properties START END)

テキスト プロパティを保持するかどうかによって異なります。

于 2013-01-20T11:03:26.510 に答える