7

文字列の先頭と kill-region をマークする必要はなく、引用符で囲まれた文字列内の任意の場所にポイントを配置してショートカットを押すだけで、ソース ファイル内の引用符で囲まれた文字列を削除したいと考えています。

私はこれのためにelispで関数を書き込もうとしましたが、ポイントが引用符で囲まれた文字列内にあるかどうかを判断し、引用符で囲まれた文字列の境界を見つけるために、ファイルを最初からポイントまで解析する必要があることがわかりました( \") を処理します...

しかし、ファイルは既に font-lock によって解析されています。これで、引用符で囲まれた文字列の中にいるかどうかを確認できます。

(defun inside-quoted-string? ()
  (interactive)
  (print (find 'font-lock-doc-face (text-properties-at (point)))))

しかし、どうすれば文字列の境界を取得できますか? font-lock はそれを青色で強調表示するので認識していますが、どうすれば取得できますか?

編集:答えてくれてありがとう。私はまさに私が望んでいたことを行うこのコードを思いつきました - 領域を選択したり、コードの先頭に移動したりせずにコードを移動します。

(defun kill-at-point ()
  "Kill the quoted string or the list that includes the point"
  (interactive)
  (let ((p (nth 8 (syntax-ppss))))
    (if (eq (char-after p) ?\")
    (progn 
      (goto-char p)
      (kill-sexp))
      (progn
    (up-list)
    (let ((beg (point)))
      (backward-list)
      (kill-region beg (point)))))))
(global-set-key (kbd "C-,") 'kill-at-point)

それを改善するための提案は大歓迎です。

4

3 に答える 3

5

font-lock に頼るのではなく、基礎となるパーサーのデータを使用できます。ポイントの前後の文字列の開始 (存在する場合) は、として利用できます(nth 8 (syntax-ppss))。次に、 を使用(forward-sexp 1)して文字列を飛び越えて、文字列の終わりを見つけることができます。

于 2012-07-04T16:10:29.320 に答える
3

previous-property-changeとを使用して、プロパティの境界を見つけることができますnext-property-change。例えば:

(defun kill-by-property (arg)
  (interactive "d")
  (kill-region
    (previous-property-change arg nil (point-min))
    (next-property-change arg nil (point-max))))
于 2012-07-04T15:25:40.570 に答える
1

を使用するというステファンの提案に基づいて構築するとsyntax-ppss、次のようにしてうまくいくはずです

(defun kill-string ()
  (interactive)
  (let ((string-start (nth 8 (syntax-ppss))))
    (goto-char string-start)
    (kill-sexp)))

を使用(nth 8 (syntax-ppss))して文字列の先頭を検索し、そこにジャンプしてから、ビルトインを使用してkill-sexpポイント (この場合は削除したい文字列) の s 式を削除します。あなたの側で地域計算を行う必要はまったくありません。

于 2012-07-05T13:52:09.543 に答える