determinare il terminatore di linea in Emacs
-
04-07-2019 - |
Domanda
Sto scrivendo un file di configurazione e devo definire se il processo prevede un file in formato Windows o un file in formato unix. Ho una copia del file previsto: esiste un modo per verificare se utilizza \ n o \ r \ n senza uscire da emacs?
Soluzione
Se si dice (DOS) sulla modeline quando si apre il file su Unix, le terminazioni di riga sono in stile Windows. Se viene visualizzato (Unix) quando si apre il file su Windows, le terminazioni di riga sono in stile Unix.
Dal manuale di Emacs 22.2 (Nodo: Line Mode):
Se il file del buffer utilizza avanzamento riga di ritorno a capo, i due punti cambia in una barra rovesciata ('\') o '(DOS)', a seconda del funzionamento sistema. Se il file utilizza solo ritorno a capo, l'indicatore dei due punti cambia in una barra ('/') o '(Mac)'. Su alcuni sistemi, Emacs visualizza '(Unix)' invece di due punti per i file che utilizzano newline come il separatore di riga.
Ecco una funzione che & # 8211; Penso & # 8211; mostra come controllare da elisp ciò che Emacs ha determinato essere il tipo di terminazioni di linea. Se sembra eccessivamente complicato, forse lo è.
(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")))))
Altri suggerimenti
Se vai in modalità hexl (M-x hexl-mode), dovresti vedere i byte di terminazione della linea.
Apri il file in emacs usando find-file-letteralmente. Se le linee hanno i simboli ^ M alla fine, si aspetta un file di testo in formato Windows.
La seguente funzione Elisp restituirà nil
se nessun terminatore " \ r \ n "
appare in un file (altrimenti restituisce il punto della prima occorrenza). Puoi inserirlo nel tuo .emacs
e chiamarlo 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))