プログラムで文字列を歩き、テキストのプロパティを追加する方法

私はこれらのような文字列を収集する関数を持っています:

  • 例1::イベント:lawlist:HIGH:その他:

  • 例2::LOW:

  • 例3::MEDIUM:task:george:

文字列をさまざまなサブコンポーネントに分割し、各コンポーネントにテキストプロパティを追加し、新しい文字列を再構築するスニペットの怪物を作成しました。

Q:  Is there a more sophisticated way to do this project?

(let* (
    new-list
    (string ":event:lawlist:HIGH:misc:")
    (lst (delete "" (split-string string ":")))
    (separator (propertize ":" 'face '(:foreground "cyan"))) )
  (dolist (e lst)
    (put-text-property 0 (length e) 'face
      (cond
        ((string= e "event")
          '(:foreground "red"))
        ((string= e "lawlist")
          '(:foreground "blue"))
        ((string= e "HIGH")
          '(:foreground "yellow"))
        (t
          'default))
      e)
    (push e new-list))
  (concat separator (mapconcat 'identity (reverse new-list) separator) separator))
2
あなたは文脈(プロジェクト)を表示/記述しないので、この質問はあまりにも広範に見えます。たとえば、バッファ内のテキストを操作できるときに文字列を操作していますか?
追加された 著者 Ryan Eastabrook,
あなたは org-mode タグを装飾していますか?これに org-tag-faces を使用できますか?
追加された 著者 Fernando Barrocal,
文字列を一時バッファに挿入し、区切り文字を検索してプロパティを追加し、バッファの内容を文字列として取得します。
追加された 著者 ICodeForCoffee,
@Drew - カスタムのバージョンの org-mode で使用されるアウトラインの特定の要素を抽出するために、およそ23のコンポーネントの正規表現を使用するカスタム関数があります。ここでは、使用している正規表現と関数の古いバージョンへのリンクがあります。 stackoverflow.com/a/20960301/2112489 この特定のプロジェクトのバッファではなく、文字列を操作する方が好きです。一般的な方法は(re-search-forward ...)を使用することですが、このプロジェクトは異なります。
追加された 著者 lawlist,
@erickstokes - はい、(org-font-lock-add-tag-faces(point-max))は最終目標を達成する手段です(ただし、この質問に対する答えはありません) 。 @Drewが示唆しているように、バッファ上で動作します。文字列で動作する org-mode の例は見つかりませんでした。私のスニペットは機能しますが、それほど魅力的ではありません。文字列を区切り文字で歩いたり、テキストプロパティを追加するための正規表現を使用することはできません。そのような機能がすでに存在していないのであれば、私はむしろ驚くだろう。
追加された 著者 lawlist,

1 答え

以下は、上の質問で説明した代わりの(ただし同様の)方法で、文字列をウォーク(ループスルー)してテキストプロパティを追加します。

(defun walk-string+add-face (str)
  (loop with start = 0
        with regexp = "[a-zA-Z0-9]+"
        with substring = nil
        with result = nil
        with separator = (propertize ":" 'face '(:foreground "cyan"))
        while (string-match regexp str start)
        do (setq substring (match-string 0 str))
        do (put-text-property 0 (length substring) 'face
             (cond
               ((string= substring "event")
                 '(:foreground "red"))
               ((string= substring "lawlist")
                 '(:foreground "blue"))
               ((string= substring "HIGH")
                 '(:foreground "yellow"))
               (t
                 'default))
             substring)
        do (push substring result)
        do (setq start (match-end 0))
        finally return
          (concat
            separator
            (mapconcat 'identity (reverse result) separator)
            separator)))

The usage is as follows: (walk-string+add-face ":event:lawlist:HIGH:misc:")

3
追加された