déterminer le terminateur de ligne dans Emacs
-
04-07-2019 - |
Question
J'écris un fichier de configuration et je dois définir si le processus attend un fichier au format Windows ou un fichier au format Unix. J'ai une copie du fichier attendu. Puis-je vérifier si elle utilise \ n ou \ r \ n sans quitter emacs?
La solution
Si le fichier (DOS) est indiqué sur le modèle lorsque vous ouvrez le fichier sous Unix, les fins de ligne sont de style Windows. Si le fichier indique (Unix) à l’ouverture du fichier sous Windows, les fins de ligne sont de style Unix.
À partir du manuel Emacs 22.2 (Node: Mode Line):
Si le fichier du tampon utilise retour à la ligne, les deux points passe à une barre oblique inversée ('\') ou '(DOS)', en fonction de l'opération système. Si le fichier utilise seulement retour de chariot, l'indicateur de deux points passe soit à une barre oblique ('/') ou '(Mac)'. Sur certains systèmes, Emacs affiche '(Unix)' au lieu de deux points pour les fichiers qui utilisent newline comme le séparateur de ligne.
Voici une fonction qui & # 8211; Je pense & # 8211; montre comment vérifier depuis elisp ce qu'Emacs a déterminé être le type de fin de ligne. Si cela semble excessivement compliqué, peut-être que oui.
(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")))))
Autres conseils
Si vous passez en mode hexl (mode M-x hexl), vous devriez voir les octets de fin de ligne.
Ouvrez le fichier dans emacs en utilisant find-file-literally. Si les lignes comportent des symboles ^ M à la fin, un fichier texte au format Windows est attendu.
La fonction Elisp suivante renvoie nil
si aucun terminateur "\ r \ n"
n'apparaît dans un fichier (sinon, il renvoie le point de la première occurrence). Vous pouvez le mettre dans votre .emacs
et l'appeler avec 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))