Pourquoi \ ra newline pour Vim?

255

De la question Comment remplacer un caractère pour une nouvelle ligne dans Vim? . Vous devez utiliser \ r lors du remplacement de texte pour une nouvelle ligne, comme ceci

:%s/%/\r/g

Mais lorsque vous remplacez la fin des lignes et les sauts de ligne pour un personnage, vous pouvez le faire comme:

:%s/\n/%/g 

Quelle section du manuel documente ces comportements et quel est le raisonnement derrière eux?

Vinko Vrsalovic
la source
1
À quoi sert la %recherche et le remplacement?
qed
7
@qed: par défaut :s, n'appliquera la substitution qu'à la ligne actuelle. :%sle fait adresser le dossier entier. Plus .
c24w
3
+ c24w Je pense qu'il fait référence au '%' entre les barres obliques, le premier exemple le '%' étant dans l'emplacement de recherche, et dans l'emplacement de remplacement dans le deuxième exemple, mais @qed pour répondre à votre question, ces '% sont assortis littéralement.
RastaJedi

Réponses:

156

À partir de documents Vim sur les modèles :

\r correspond à <CR>

\n correspond à une fin de ligne - Lors de la correspondance dans une chaîne au lieu du texte tampon, un caractère de nouvelle ligne littéral est mis en correspondance.

pjz
la source
41
Pour moi, le point de confusion est que \ r et \ n signifient différentes choses lorsqu'elles sont utilisées: le modèle de recherche et le modèle de remplacement.
dlamblin
3
@dlamblin Yup! Voir ma réponse :)
Expiation limitée
208

Depuis http://vim.wikia.com/wiki/Search_and_replace :

Lors de la recherche

...

\nest une nouvelle ligne, \rest CR(retour chariot = Ctrl-M=^M )

Lors du remplacement

...

\rest une nouvelle ligne, \nest un octet nul ( 0x00).

Expiation limitée
la source
6
Cette réponse m'a le plus aidé. Aussi, pour plus d'informations, :h :s%en particulier le dernier paragraphe. (via :h :s)
dipnlik
114

Un autre aspect à cela est que \0, qui est traditionnellement NULL, est pris s//\0/pour signifier "le motif assorti entier". (Qui, soit dit en passant, est redondant et plus long que &).

  • Vous ne pouvez donc pas \0direNULL , donc vous utilisez\n
  • Donc, vous ne pouvez pas \nvouloir dire \n, alors vous utilisez \r.
  • Vous ne pouvez donc pas \rvouloir dire \r, mais je ne sais pas qui voudrait ajouter ce caractère à dessein.

—☈

rking
la source
1
Bon point! Il s'agit donc d'un hack autour de \ 0 - référence arrière au 0-ème groupe imbriqué - expression rationnelle entière. C'est une très bonne réponse, mais cela me déçoit, que je ne puisse pas utiliser \ r en remplacement ... (ce qui signifie: insérer # (13), par exemple dans un fichier "normal" (== Unix EOLs).
Tomasz Gandor
3
OK, la réponse se trouve dans les documents Vim. Échappez simplement \ ^ M ou \ <CR>, avec une barre oblique inverse normale. Agréable. ----- <CR> scinder la ligne en deux à ce stade (Tapez le <CR> comme CTRL-V <Entrée>) s <CR> \ r idem -------- s / \ r \ < CR> insérer un retour chariot (CTRL-M) (Tapez le <CR> comme CTRL-V <Entrée>) s / \ <CR>
Tomasz Gandor
16
"Un autre aspect"? Tu es trop modeste! Expliquer précisément_pourquoi_ cela se produit donne une réponse supérieure à toutes celles qui disent simplement comment contourner ce problème. +1
underscore_d
C'est vraiment un très bon aperçu de la raison pour laquelle la \nrecherche et le remplacement de modèles ont des significations différentes. Réponse fantastique.
ZeroKnight
47

:help NL-used-for-Nul

Détail technique:

<Nul>les caractères du fichier sont stockés comme <NL>en mémoire. À l'écran, ils sont représentés par " ^@". La traduction se fait lors de la lecture et de l'écriture des fichiers. Pour faire correspondre un <Nul>avec un modèle de recherche, vous pouvez simplement entrer CTRL- @ ou " CTRL-V 000". C'est probablement ce que vous attendez. En interne, le caractère est remplacé par un <NL>dans le modèle de recherche. Ce qui est inhabituel, c'est que taper CTRL-V CTRL-J insère également un <NL>, donc recherche également un <Nul> dans le fichier. {Vi ne peut pas du tout gérer les <Nul>caractères du fichier}


Aristote Pagaltzis
la source
10

Tout d'abord, ouvrez :h :spour voir la section "4.2 Substitute" de la documentation sur "Change". Voici ce que la commande accepte:

:[range]s[ubstitute]/{pattern}/{string}/[flags] [count]

Notez la description patternetstring

Pour le {pattern}voir |pattern|.
{string}peut être une chaîne littérale ou quelque chose de
spécial; voir |sub-replace-special|.

Alors maintenant, vous savez que le modèle de recherche et les modèles de remplacement suivent des règles différentes. Si vous suivez le lien vers|pattern| , il vous amène à la section qui explique l'ensemble des modèles d'expression régulière utilisés dans Vim.

Pendant ce temps, |sub-replace-special|vous amène à la sous-section de "4.2 Substitut", qui contient les modèles de substitution, parmi lesquels:\r saut de ligne / fractionnement.

(Le raccourci vers cette partie du manuel est :h :s%)

syockit
la source