Pregunta:
Estoy tratando de reemplazar Microsoft Word (estremecimiento) para este proceso específico. El proceso no es específico para el correo electrónico o el correo tradicional, pero es similar. El proceso es que tengo un archivo de plantilla con variables que extraigo de una hoja de cálculo. Puedo "paginar" las variables. Estoy tratando de replicar esto en emacs. Después de buscar, encontré algunos casos de personas que lograron esto, pero no hay detalles sobre cómo. Gracias.
Voy a tratar de explicar más según lo solicitado. Necesito un documento de plantilla que tenga variables que cambien por página, como una combinación de correspondencia ( https://en.wikipedia.org/wiki/Mail_merge ). Mi caso de uso no es imprimirlos, por lo que no es necesario. En realidad, esto es para automatizar la creación de cientos de configuraciones de enrutadores. Gracias de nuevo por todas las respuestas.
Ejemplo:
nombre de hostname-variable
nombre de hostname-variable
!
nombre de username-variable
nombre de username-variable
contraseña 0 password-variable
!
sin plataforma de servicio
marcas de tiempo del servicio debug datetime msec
Y así…
En Microsoft Word, hace referencia a una hoja de cálculo de Excel para las variables. Pero estaría bien hacer referencia a los datos de otras formas. CSV, tabla, etc.
| Hostname-variable |username-variable | password-variable |
|-------------------+------------------+-------------------|
| Hostname1 |Username1 | password1 |
| Hostname2 |Username2 | password2 |
| Hostname3 |Username3 | password3 |
|-------------------+------------------+-------------------|
La "Página 1" se vería así:
nombre de host Hostname1
!
nombre de Username1
Nombre de Username1
contraseña 0 password1
!
sin plataforma de servicio
marcas de tiempo del servicio debug datetime msec
Y así…
"Página 2" se vería así
nombre de host Hostname2
!
nombre de Username2
Nombre de Username2
contraseña 0 password2
!
sin plataforma de servicio
marcas de tiempo del servicio debug datetime msec
Y así…
"Página 3" se vería así
nombre de host Hostname3
!
nombre de Username3
Nombre de Username3
contraseña 0 password3
!
sin plataforma de servicio
marcas de tiempo del servicio debug datetime msec
Y así…
Respuesta:
Prueba esto
Crear una tabla con nombre
#+NAME: my-data
| Hostname-variable |username-variable | password-variable |
|-------------------+------------------+-------------------|
| Hostname1 |Username1 | password1 |
| Hostname2 |Username2 | password2 |
| Hostname3 |Username3 | password3 |
Crear bloque de código de plantilla, por ejemplo, ruby
Nota: Para este ejemplo, elegí ruby pero no se requiere ruby .
Te animo a que uses tu idioma favorito para escribir la plantilla.
#+NAME: simple-template-ruby
#+BEGIN_SRC ruby :var data=my-data() :results replace
data.map{|d|
template = <<-MYFORM
hostname #{d[0]}
!
username #{d[1]} password 0 #{d[2]}
!
no service pad
service timestamps debug datetime msec
MYFORM
template
}.join("\n")
#+END_SRC
Ejecute el bloque de código usando Cc
CC
dentro del bloque de código o en línea #+CALL:
#+NAME: Mail-Merge-Results
#+CALL: simple-template-ruby()
A continuación se muestran los resultados de la combinación de correspondencia:
#+RESULTS: Mail-Merge-Results
hostname Hostname1
!
username Username1 password 0 password1
!
no service pad
service timestamps debug datetime msec
hostname Hostname2
!
username Username2 password 0 password2
!
no service pad
service timestamps debug datetime msec
hostname Hostname3
!
username Username3 password 0 password3
!
no service pad
service timestamps debug datetime msec
Este código fue probado usando
GNU Emacs 24.4.1 (x86_64-apple-darwin14.0.0, NS apple-appkit-1343.14)
of 2014-12-25
org-mode version: 8.3.1
A continuación se muestran los pasos adicionales necesarios para generar archivos separados, por ejemplo, Hostname1.txt, Hostname2.txt y Hostname3.txt
Agregar bloque de código de escape a la plantilla
-
Aviso comas
,
se utilizan para escapar de la sintaxis en modo org dentro de la plantilla,#+begin_src
y,#+end_src
-
Tenga en cuenta que
sh
se usa en este ejemplo, pero podría ser cualquier idioma configurado, por ejemplo,ruby
-
Evite la ejecución accidental agregando
:eval never
al bloque de código de escape. -
Configure el nombre del archivo usando
:tangle #{d[0]}.txt
A continuación se muestra el bloque de código actualizado
#+NAME: tangled-template-ruby
#+BEGIN_SRC ruby :var data=my-data() :results replace
data.map{|d|
template = <<-MYFORM
,#+begin_src sh :eval never :tangle #{d[0]}.txt
hostname #{d[0]}
!
username #{d[1]} password 0 #{d[2]}
!
no service pad
service timestamps debug datetime msec
,#+end_src
MYFORM
template
}.join("\n")
#+END_SRC
Agregar :results drawer replace
encabezados a #+CALL:
línea #+CALL:
declaración
#+NAME: Mail-Merge-Results-into-Files
#+CALL: tangled-template-ruby() :results drawer replace
Use Cc
Cc
en inline #+CALL:
declaración para generar results
dentro de un drawer
#+RESULTS: Mail-Merge-Results-into-Files
:RESULTS:
#+begin_src sh :eval never :tangle Hostname1.txt
hostname Hostname1
!
username Username1 password 0 password1
!
no service pad
service timestamps debug datetime msec
#+end_src
#+begin_src sh :eval never :tangle Hostname2.txt
hostname Hostname2
!
username Username2 password 0 password2
!
no service pad
service timestamps debug datetime msec
#+end_src
#+begin_src sh :eval never :tangle Hostname3.txt
hostname Hostname3
!
username Username3 password 0 password3
!
no service pad
service timestamps debug datetime msec
#+end_src
:END:
Utilice Cc
Cv
t
para tangle
los nuevos bloques de código en archivos separados
También debería ver un mensaje similar a este
Tangled 3 code blocks from your-file.org
Se probó código adicional usando
GNU Emacs 24.4.1 (x86_64-unknown-cygwin)
of 2014-11-14
org-mode version: 8.2.10