2010-09-30 3 views
6

donc je suis code de changement dePourquoi Vim utilise Windows n pour la recherche?

foo() 
{ 

à

foo() { 

et je constate que le modèle de recherche m'a obligé à chercher \n, mais quand j'ai essayé de le remplacer par \n j'ai eu le ^@ caractère, et je devais remplacer à la place avec \r.

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

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

+0

Vous pensez que ce étrange? La façon dont j'ai utilisé pour résoudre le problème de retour chariot/saut de ligne lors du déplacement entre Unix et Windows est de faire ':% s/^ V^M/^ V^M/g' –

+1

@Paul Je me sens comme ceci est un apparenté problème. Comme l'affichage d'une chose, la recherche contre une autre chose et l'écriture d'un tiers. – tzenes

Répondre

14

la syntaxe de la partie de recherche et de pièces de rechange sont arbitrairement différents. Certains des mêmes codes sont réutilisés pour signifier différentes choses. Oui, c'est déroutant.

| How to type   | In search, means:  | In replacement, means: 
---------------------------------------------------------------------------- 
\n | \n     | End-of-line    | <Nul> 0x0 
^@ | CTRL-V CTRL-J  | <Nul> 0x0    | <Nul> 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és comme faisant partie de « retour à la ligne », alors oui ... vous pouvez toujours revenir à vos fichiers santé mentale et la force de tous les retours chariot affichés par l'ouverture d'un fichier et faire:

:e ++ff=unix 

de même en cas de remplacement, « briser la ligne ici » fait des choses différentes en fonction de votre plate-forme. Il pourrait insérer 0xA ou 0xD 0xA etc.

Dans le cas où ce n'est pas tout déjà assez mauvais:

Technical detail:    *NL-used-for-Nul* 
<Nul> characters in the file are stored as <NL> in memory. In the display 
they are shown as "^@". The translation is done when reading and writing 
files. To match a <Nul> with a search pattern you can just enter [email protected] or 
"CTRL-V 000". This is probably just what you expect. Internally the 
character is replaced with a <NL> in the search pattern. What is unusual is 
that typing CTRL-V CTRL-J also inserts a <NL>, thus also searches for a <Nul> 
in the file. {Vi cannot handle <Nul> characters in the file at all} 

         *CR-used-for-NL* 
When 'fileformat' is "mac", <NL> characters in the file are stored as <CR> 
characters internally. In the text they are shown as "^J". Otherwise this 
works similar to the usage of <NL> for a <Nul>. 

When working with expression evaluation, a <NL> character in the pattern 
matches a <NL> in the string. The use of "\n" (backslash n) to match a <NL> 
doesn't work there, it only works to match text in the buffer. 

À moins traiter littérale 0x0 ou 0xD caractères, il est agood une règle de pouce pour toujours coller avec \n pour la recherche et \r pour le remplacement, comme vous l'avez probablement compris.

Voir aussi:

:h /\n 
:h /\r 
:h s/\n 
:h s/\r 
:h s/\<CR> 
1

Je pense que votre problème est dû au fait que les systèmes d'exploitation de type Unix comme Linux utilisent la nouvelle ligne (alias « saut de ligne ») (0x0A) comme marqueur de fin de ligne, mais Windows utilise le retour chariot + newline (0x0D 0x0A). vim essaie de faire une sorte de mapping pour faire ressembler la fin de ligne à deux octets de Windows à une seule "fin de ligne".

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

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

^V signifie maintenir la touche de commande et appuyez sur V, et de même ^M signifie maintenir la touche de commande et appuyez sur M.

+0

Je connais les différences dans les nouvelles lignes; Ce qui m'intéresse, c'est pourquoi Vim semble masquer partiellement cela, et quelles règles il utilise pour le faire. – tzenes

Questions connexes