Pregunta

Estoy escribiendo un archivo de configuración y necesito definir si el proceso espera un archivo de formato de Windows o un archivo de formato Unix. Tengo una copia del archivo esperado. ¿Hay alguna forma de verificar si usa \ n o \ r \ n sin salir de emacs?

¿Fue útil?

Solución

Si dice (DOS) en la línea de modo cuando abre el archivo en Unix, las terminaciones de línea son de estilo Windows. Si dice (Unix) cuando abre el archivo en Windows, los finales de línea son de estilo Unix.

Del manual de Emacs 22.2 (Nodo: Línea de modo):

  

Si el archivo del búfer usa   línea de retorno de carro, el colon   cambios en una barra invertida ('\') o   '(DOS)', dependiendo del funcionamiento   sistema. Si el archivo usa solo   retorno de carro, el indicador de colon   cambios a una barra diagonal hacia adelante   ('/') o '(Mac)'. En algunos sistemas,   Emacs muestra '(Unix)' en lugar de   dos puntos para los archivos que utilizan la nueva línea como   el separador de línea.

Aquí hay una función que & # 8211; Creo que & # 8211; muestra cómo verificar desde elisp qué Emacs ha determinado que es el tipo de terminación de línea. Si parece excesivamente complicado, tal vez lo sea.

(defun describe-eol ()
  (interactive)
  (let ((eol-type (coding-system-eol-type buffer-file-coding-system)))
    (when (vectorp eol-type)
      (setq eol-type (coding-system-eol-type (aref eol-type 0))))
    (message "Line endings are of type: %s"
             (case eol-type
               (0 "Unix") (1 "DOS") (2 "Mac") (t "Unknown")))))

Otros consejos

Si vas en modo hexl (modo M-x hexl), deberías ver los bytes de terminación de línea.

Abra el archivo en emacs usando find-file-literal. Si las líneas tienen símbolos ^ M al final, se espera un archivo de texto con formato de Windows.

La siguiente función Elisp devolverá nil si no aparecen los terminadores " \ r \ n " en un archivo (de lo contrario, devuelve el punto de la primera aparición). Puede ponerlo en su .emacs y llamarlo con M-x check-eol .

(defun check-eol (FILE)
  (interactive "fFile: ")
  (set-buffer (generate-new-buffer "*check-eol*"))
  (insert-file-contents-literally FILE)
  (let ((point (search-forward "\r\n")))
    (kill-buffer nil)
    point))
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top