Cómo ajustar el texto dado alrededor de la región

11

A menudo tengo una situación en la que necesito aplicar texto alrededor de una región. Para HTML y casos simples ya hay bibliotecas para esto. ¿Pero qué hay del caso general? Me gustaría que me preguntaran qué insertaré al principio y al final de la región.

nperson325681
fuente
¿Desea usarlo para insertar contenido arbitrario una vez, o un par de pares, muchas veces? En el último caso, las bibliotecas como los smartparens podrían resultar útiles y se pueden ampliar con pares personalizados. Por ejemplo, podría agregar un par <?php... ?>, y luego, cuando seleccione una región y escriba <?php(o una combinación de teclas), envuélvala en el par. Pero afaik no hay una manera fácil de usar estas bibliotecas si tiene muchos pares de una sola vez.
T. Verron
@ T.Verron: Sé que existen. Pero para esos momentos cuando hay una necesidad única de pasar por el código y marcar cosas, una función única, general y reutilizable se adapta mejor
nperson325681 el

Respuestas:

6

Busqué en Google y encontré esta publicación de John D. Cook . Él demuestra cómo construir una función interactiva simple para obtener etiquetas HTML / XML fácilmente en la región. A partir de eso modifiqué la función para preguntar dos veces.

(defun tag-word-or-region (text-begin text-end)
  "Surround current word or region with given text."
  (interactive "sStart tag: \nsEnd tag: ")
  (let (pos1 pos2 bds)
    (if (and transient-mark-mode mark-active)
        (progn
          (goto-char (region-end))
          (insert text-end)
          (goto-char (region-beginning))
          (insert text-begin))
      (progn
        (setq bds (bounds-of-thing-at-point 'symbol))
        (goto-char (cdr bds))
        (insert text-end)
        (goto-char (car bds))
        (insert text-begin)))))

Más importante aún, esta función también se puede utilizar como una herramienta auxiliar, por ejemplo, cuando desea vincular teclas para asignar algunos bits de texto específicos.

(defun tag-php ()
  (interactive)
  (tag-word-or-region "<?php " "?>"))
nperson325681
fuente
Por cierto, la forma en que esto maneja algunos casos límite no es óptima; la búsqueda de inicio puede fallar a veces y dejar ambas etiquetas al final. Podría ser evilque yo uso eso interfiere aquí. ¿Quizás una función de tipo interactive "r" funcionó de manera más robusta?
nperson325681
4

Sugeriría un enfoque diferente. Cuando hay una región, por definición pointdebe estar al principio (o al final) de la región, y markestará al final (o al principio). Lo que significa que puede ingresar el texto que desea en el punto y luego usar exchange-point-and-mark, es decir C-x C-x, para saltar al otro extremo de la región. Ingrese la segunda mitad de su envoltorio y listo.

No se le solicita explícitamente que se le solicite el texto de inserción, pero no puedo imaginar que haya una manera de lograr lo mismo con menos esfuerzo.

Tyler
fuente
Si el texto inicial y final es el mismo, me pregunto si multiple-cursorspodría modificarse algo así para insertar texto simultáneamente al principio y al final de la región activa.
glucas
Eso suena como la forma manual que los usuarios de editores menores se ven obligados a hacer de todos modos. De todos modos, leí el uso de macros como subtexto de su respuesta, debo decir. Me gusta tu estilo
nperson325681
1
@progo - Gracias :) Parece un enfoque más manual, pero en realidad usa menos pulsaciones de teclas que su alternativa. Con este enfoque, aparte del texto de ajuste, solo necesita C-x C-x. Con su respuesta, debe llamar a su función ( C-c something), y también debe presionar returndespués de cada entrada. Así que no importa lo que hagas, tienes dos teclas más. Dicho esto, no ayuda si quieres que alguien llame desde elisp.
Tyler
3

Solo por el bien de la variedad:

Otra forma de hacer esto con un texto arbitrario de inicio y fin sería usar replace-regexpen la región: emparejar .+y reemplazar con before \& after, o cualquier texto que desee usar para beforey after.

Podría escribir un comando para hacer esto, pero estoy pensando en un caso en el que en un archivo determinado desea aplicar el mismo texto de inicio / finalización en varios lugares. Puede grabar una macro o simplemente usar el historial de minibúfer para repetir en otra región.

Por supuesto, si el texto que desea ajustar puede expresarse como una expresión regular, entonces ni siquiera necesitará seleccionar una región y puede hacer un query-replace-regexpen el búfer, pero presumiblemente el texto que desea ajustar no es tan consistente.

glucas
fuente