3

Emacs バッファ内のポイント現在位置から、そのポイントを含む最も外側のリスト/s-expression を取得するにはどうすればよいですか?
私が達成したいことを説明するために、いくつかの例に従います。

例 1:

(defun xpto(arg)
  (+ 2 4)[point])

出力 1:

(defun xpto(arg)
      (+ 2 4))

例 2:

(defun [point]xpto(arg)
  (+ 2 4))

出力 2:

(defun xpto(arg)
      (+ 2 4))

例 3:

(defun xpto(arg)
  (+ 2 4))[point]

出力 3:

NIL

上記の動作を実現する Emacs が提供する「既製品」の機能はありますか?
そうでない場合は、それを達成するためのより簡単な方法を教えてもらえますか?

更新 #1

提案されたように、次のアプローチを試しました。

;; Gets the outermost brackets based on point position
(defun get-outermost-brackets()
  (interactive)
  (car (last (nth 9 (syntax-ppss)))))


;; Assigns that function to a key
(global-set-key [(control p)] 'get-outermost-brackets)

ただし、CTRL + PI を押した後、ポイントがどこにあっても出力が得られません。
私は何を間違っていますか?

4

2 に答える 2

4

あなたが探しているのは、sexp の開始位置と終了位置を把握するために使用できるパーサー状態parse-partial-sexp(10 要素のリスト!)を返す関数です。

もう一つの便利な機能はscan-sexps.

更新#1:

あなたの関数get-outermost-bracketsは、バッファの有用な部分ではなく、最も外側の開いた括弧の位置を返します。その値はとにかくエコー領域に表示されません。

更新#2:

これにより、囲んでいる SENSP がエコー領域と*Messages*バッファに送信されます。

(defun get-enclosing-sexp (&optional pos)
  (interactive)
  (message "%s" (save-excursion
                  (goto-char (car (last (nth 9 (syntax-ppss)))))
                  (read (current-buffer)))))

message単に表示するのではなく、関数から SEXP を返したい場合はドロップします。

私のミリオンはどこ?

于 2013-10-14T23:12:44.733 に答える