font-lock – Resaltando variables de shell entre comillas

Pregunta:

En vim, el siguiente documento hará que $PWD en las líneas 2 y 3 se coloreen de dos formas diferentes:

#/bin/sh
echo "Current Directory: $PWD"
echo 'Current Directory: $PWD'

La primera instancia de $PWD tendrá un color diferente del resto de la cadena en la que se encuentra. Esto da una clara indicación visual de que la variable se expandirá, en lugar de tratarse como texto literal. Por el contrario, la segunda instancia de $PWD tendrá el mismo color que el resto de la cadena, porque las comillas simples hacen que se trate como texto literal.

¿Existe algún modo emacs existente que proporcione este tipo de "conciencia de cotización de shell"?

Respuesta:

El siguiente código usa una regla de bloqueo de fuente con una función en lugar de una expresión regular, la función busca apariciones de $VAR pero solo cuando están dentro de una cadena entre comillas dobles. La función (syntax-ppss) se usa para determinar esto.

La regla de bloqueo de fuente usa la prepend para agregarse a sí misma encima del resaltado de cadena existente. (Tenga en cuenta que muchos paquetes usan t para esto. Desafortunadamente, esto sobrescribe todos los aspectos del resaltado existente. Por ejemplo, usar prepend retendrá un color de fondo de cadena (si hay uno) mientras reemplaza el color de primer plano.)

(defun sh-script-extra-font-lock-is-in-double-quoted-string ()
  "Non-nil if point in inside a double-quoted string."
  (let ((state (syntax-ppss)))
    (eq (nth 3 state) ?\")))

(defun sh-script-extra-font-lock-match-var-in-double-quoted-string (limit)
  "Search for variables in double-quoted strings."
  (let (res)
    (while
        (and (setq res
                   (re-search-forward
                    "\\$\\({#?\\)?\\([[:alpha:]_][[:alnum:]_]*\\|[-#?@!]\\)"
                    limit t))
             (not (sh-script-extra-font-lock-is-in-double-quoted-string))))
    res))

(defvar sh-script-extra-font-lock-keywords
  '((sh-script-extra-font-lock-match-var-in-double-quoted-string
     (2 font-lock-variable-name-face prepend))))

(defun sh-script-extra-font-lock-activate ()
  (interactive)
  (font-lock-add-keywords nil sh-script-extra-font-lock-keywords)
  (if (fboundp 'font-lock-flush)
      (font-lock-flush)
    (when font-lock-mode
      (with-no-warnings
        (font-lock-fontify-buffer)))))

Puede llamar a use this agregando la última función a un gancho adecuado, por ejemplo:

(add-hook 'sh-mode-hook 'sh-script-extra-font-lock-activate)

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım