tabla primos numeros ejemplos divisores compuestos emacs elisp

primos - Emacs: sumando 1 a cada número compuesto de 2 dígitos dentro de una región marcada



numeros primos y compuestos del 1 al 1000 (5)

El modo de edición de columnas de Emacs es lo que necesitas.

  • Actívalo escribiendo Mx cua-mode .

  • Vaya al principio del rectángulo (deje el cursor en el carácter 3 ) y presione C-RET .

  • Vaya al final del rectángulo (deje el cursor en el carácter 7 ). Estarás operando en la región resaltada.

  • Ahora presione Mi que incrementa todos los valores en la región.

Has terminado. eliminar enlaces muertos de ImageShack

Imagina que tengo lo siguiente en un archivo de texto abierto bajo Emacs:

some 34 word 30 another 38 thing 59 to 39 say 10 here 47

y quiero convertirlo en esto, agregando 1 a cada número compuesto de 2 dígitos:

some 35 word 31 another 39 thing 60 to 40 say 11 here 48

(Este es un ejemplo corto, mi necesidad real está en una lista mucho más grande, no mi llamada)

¿Cómo puedo hacer esto desde Emacs?

No me importa llamar a algún Perl / sed / cualquier magia externa siempre que la llamada se realice directamente desde Emacs y funcione solo en la región marcada que deseo.

¿Cómo automatizarías esto de Emacs?

Creo que la respuesta en la que estoy pensando consiste en llamar a shell-command-on-region y reemplazar la región por la salida ... Pero no estoy seguro de cómo hacer esto de manera concreta.


Esto se puede resolver usando el comando query-replace-regexp (enlazado a CM-% ):

CM-% /b[0-9][0-9]/b return /,(1+ /#&)

La expresión que sigue a /, se evaluará como una expresión de Lisp, cuyo resultado se usará como cadena de reemplazo. En la expresión Lisp, /#& sería reemplazado por la cadena coincidente, interpretada como un número.

Por defecto, esto funciona en todo el documento, comenzando desde el cursor. Para tener este trabajo en la región, hay varias posibilidades:

  1. Si el modo de marca transitoria está activado, solo tiene que seleccionar la región normalmente (con el punto y la marca);
  2. Si, por algún motivo, no le gusta el modo de marca transitoria , puede usar la función de restringir a la región para restringir los cambios a una región específica: seleccione una región con el punto y la marca, Cx nn para restringir, realice una consulta de reemplazo regexp como se describe anteriormente, y finalmente Cx nw para ampliar. (Gracias a Justin Smith por esta sugerencia.)
  3. Usa el ratón para seleccionar la región.

Consulte la sección Reemplazo de Regexp del Manual de Emacs para más detalles.


Logré que funcionara de una manera diferente usando lo siguiente (mi awk -fu no es fuerte, así que probablemente pueda hacerse de una manera más simple):

C-u M-x shell-command-on-region RET awk ''$2>=0&&$2<=99 {$2++} {print}'' RET

pero perdí mi sangría en el proceso:)

Al ver todas estas respuestas, no puedo evitar tener mucho respeto por Emacs ...


Moderadamente probado; usa M-: y ejecuta el siguiente comando:

(while (re-search-forward "//<[0-9][0-9]//>" nil t) (let ((x (match-string 0))) (delete-backward-char 2) (insert (format "%d" (1+ (string-to-int x))))))


No protege contra 99-> 100.

(defun add-1-to-2-digits (b e) "add 1 to every 2 digit number in the region" (interactive "r") (goto-char b) (while (re-search-forward "//b[0-9][0-9]//b" e t) (replace-match (number-to-string (+ 1 (string-to-int (match-string 0)))))))

Ah, y opera en la región. Si desea el archivo completo, entonces reemplace b con (point-min) y nil .