Pourquoi Vim sur Windows utilise-t-il \ n pour la recherche?

Donc je changeais de code de

foo() { 

à

 foo() { 

et j’ai remarqué que le motif de recherche exigeait que je recherche \n , mais quand j’ai essayé de le remplacer par \n j’ai eu le caractère ^@ et j’ai dû remplacer par \r .

Il me semble étrange que je recherche avec \n et remplace par \r , une idée de ce que cela pourrait être?

Pour référence, ma solution était :%s/\n\s*{/ {\r/g

La syntaxe de la partie de recherche et de la pièce de remplacement est arbitrairement différente. Certains des mêmes codes sont réutilisés pour signifier différentes choses. Ouais, c’est déroutant.

  | How to type | In search, means: | In replacement, means: ---------------------------------------------------------------------------- \n | \n | End-of-line |  0x0 ^@ | CTRL-V CTRL-J |  0x0 |  0x0 \r | \r | Carriage return 0xD | "Break the line here" ^M | CTRL-Enter | Carriage return 0xD | "Break the line here" \^M | \ CTRL-V CTRL-ENTER | \ + carriage return 0xD | Carriage return 0xD 

Lors de la recherche, en fonction de votre plate-forme, le 0xD peut être caché, considéré comme faisant partie de “newline”, alors oui … vous pouvez toujours renvoyer vos données et forcer tous les retours chariot en ouvrant un fichier et en effectuant:

 :e ++ff=unix 

De même, lors du remplacement, “casser la ligne ici” fait des choses différentes selon votre plate-forme. Il pourrait insérer 0xA ou 0xD 0xA etc.

Au cas où ce ne serait pas déjà assez grave:

 Technical detail: *NL-used-for-Nul*  characters in the file are stored as  in memory. In the display they are shown as "^@". The translation is done when reading and writing files. To match a  with a search pattern you can just enter CTRL-@ or "CTRL-V 000". This is probably just what you expect. Internally the character is replaced with a  in the search pattern. What is unusual is that typing CTRL-V CTRL-J also inserts a , thus also searches for a  in the file. {Vi cannot handle  characters in the file at all} *CR-used-for-NL* When 'fileformat' is "mac",  characters in the file are stored as  characters internally. In the text they are shown as "^J". Otherwise this works similar to the usage of  for a . When working with expression evaluation, a  character in the pattern matches a  in the ssortingng. The use of "\n" (backslash n) to match a  doesn't work there, it only works to match text in the buffer. 

A moins de traiter des caractères littéraux 0x0 ou 0xD , il est préférable de toujours utiliser \n pour la recherche et \r pour le remplacement, comme vous l’avez probablement deviné.

Voir également:

 :h /\n :h /\r :hs/\n :hs/\r :hs/\ 

Je pense que votre problème est dû au fait que les systèmes d’exploitation de type Unix tels que Linux utilisent la nouvelle ligne (aka “linefeed”) (0x0A) comme marqueur de fin de ligne, mais Windows utilise le retour chariot + newline (0x0D 0x0A). vim essaie de faire une sorte de mappage pour que la fin de ligne de deux octets de Windows ressemble à une seule “fin de ligne”.

Dans une note connexe, la commande suivante semble convertir un fichier de style Unix en un fichier Windows sur une machine Windows et convertir un fichier de style Windows en un Unix sur une machine Unix:

:%s/^V^M/^V^M/g

^V signifie que vous devez maintenir la touche de contrôle enfoncée et appuyer sur V, de même ^M signifie que vous devez maintenir la touche de contrôle enfoncée et appuyer sur M.