2008-10-24 8 views
4

J'écris un fichier de configuration et j'ai besoin de définir si le processus attend un fichier au format Windows ou un fichier au format Unix. J'ai une copie du fichier attendu - est-il possible de vérifier s'il utilise \ n ou \ r \ n sans quitter emacs?déterminer le terminateur de ligne dans Emacs

Répondre

7

S'il est indiqué (DOS) sur le modèle lorsque vous ouvrez le fichier sous Unix, les fins de ligne sont de style Windows. Si elle indique (Unix) lorsque vous ouvrez le fichier sous Windows, les fins de ligne sont de type Unix.

De Emacs 22.2 manuel (Noeud: ligne Mode):

Si le fichier de la mémoire tampon utilise linefeed retour chariot , le côlon modifications soit une barre oblique inverse ('\') ou « (DOS) ', en fonction du système en fonctionnement. Si le fichier utilise juste carriage-return, l'indicateur de deux-points est remplacé par une barre oblique ('/') ou '(Mac)'. Sur certains systèmes, Emacs affiche '(Unix)' à la place du deux-points pour les fichiers qui utilisent la nouvelle ligne comme le séparateur de ligne.

est ici une fonction qui – je pense – montre comment vérifier de elisp ce Emacs a déterminé à être le type de fin de ligne. Si cela semble excessivement compliqué, c'est peut-être le cas.

(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"))))) 
+0

Cela suppose que vous n'exécutez pas sur Windows. Là, la modeline serait \ for \ r \ n ou (Unix) pour \ n. – cjm

+0

Sûrement le PO veut une solution programmatique et non une inspection visuelle de la modeline? –

+0

Non! Je voulais un visuel, bien que l'elsip soit agréable à avoir. – gone

0

Ouvrez le fichier dans emacs à l'aide de find-file-literally. Si les lignes ont des symboles^M à la fin, il attend un fichier texte au format Windows.

0

La fonction Elisp suivante retournera nil si aucune "\r\n" terminateurs apparaissent dans un fichier (sinon il retourne 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)) 
+0

Mais les versions modernes d'Emacs convertissent CRLF en LF lors du chargement (et du retour lors de l'enregistrement), donc vous n'aurez aucun caractère dans votre buffer. Vous devez vérifier le système de codage du tampon. – cjm

+0

Cela ne fonctionnera-t-il pas en combinaison avec find-file-literally? –

+0

Oui, ce sera le cas, mais vous n'avez pas mentionné l'utilisation de find-file-literally en premier. – cjm

2

Si vous allez dans le mode hexl-(M-x hexl-mode), vous shoul voir les octets de terminaison de ligne.

+0

WOW, merci. –