Loading ...
Sorry, an error occurred while loading the content.

Re: replacing with a newline

Expand Messages
  • A.J.Mechelynck
    ... It won t, because adding a n or a ^J in the middle of a line gets translated into a NUL -- always. It has for as long as Vim has existed and maybe
    Message 1 of 5 , Jan 28, 2007
    • 0 Attachment
      jose isaias cabrera wrote:
      >
      > "A.J.Mechelynck" wrote,
      >
      >
      >> Bill McCarthy wrote:
      >>> On Sat 27-Jan-07 11:15pm -0600, you wrote:
      >>>
      >>>> Ok, here is a question: Why not keep it the same, \n? Any
      >>>> reasoning behind
      >>>> it?
      >>>
      >>> That could be a way to do it, but that choice wasn't made.
      >>> Perhaps someone else could explain why \n means end-of-line
      >>> in the pattern, but nul in the substitution, while \r means
      >>> ^M in the pattern, but end-of-line in the substitution? And
      >>> why not a \x representation for nul in the pattern - instead
      >>> of needing to do a ^@?
      >>>
      >>> [Note: ^M is created with ctrl-v following by <enter> and
      >>> ^@ is created by ctrl-v followed by 000.]
      >>>
      >>
      >> IIUC, NULs are replaced by LF everywhere in Vim memory, because a NUL
      >> terminates a C string while a LF is the only ASCII character
      >> guaranteed not to exist (in Unix 'fileformat') in the middle of a line
      >> (as opposed to at its end). So if lines are stored as C strings,
      >> substituting NUL for LF and vice-versa allows representing everything.
      >> (Mac 'fileformat' may required some fancy footwork; Dos 'fileformat'
      >> is handled by treating either CR+LF or LF as a linebreak on input, and
      >> writing all linebreaks as CR+LF on output.)
      >>
      >> Why not use the same character in "replace by" as in "search for" is
      >> harder to explain, though. Maybe part of it is for historical
      >> "compatibility" reasons, but it doesn't explain why that choice was
      >> made by whoever made it. It may have something to do with the fact
      >> that hitting <Enter> at the keyboard generates a CR but is stored (in
      >> memory) as a line break then (on file, if in Unix 'fileformat') as a LF.
      >
      > One of the things I love about vim is that it makes sense. And I don't
      > have to learn or memorize much when things make sense, I just follow the
      > logic. But this question, "how do I replace with a newline", I have
      > asked about 5 times now. Why? Because I remember most things with vim
      > since working with vim makes sense. But this \n vs. \r makes no sense
      > to me and I keep forgetting.
      >
      > Perhaps, on the next big release, this command would be possible,
      >
      > :%s/,/\n/g
      >
      > and have commas be replaced by newline.
      >
      > Just a thought...
      >
      > Thanks for all the replies.
      >
      > josé
      >

      It won't, because adding a "\n" or a ^J in the middle of a line gets
      translated into a NUL -- always. It has for as long as Vim has existed and
      maybe longer, and you know Bram's standing on upward compatibility (IMHO,
      rightly so). It's just one of those "Vim quirks" -- one of the few exceptions
      to the systematic rules -- that to count linebreaks by replacing them with
      themselves you have to use

      :[range]s/\n/\r/

      It is documented, BTW: under
      :help /\n
      :help s<CR>
      including the few lines below the latter
      ...and maybe also elsewhere.


      Best regards,
      Tony.
    Your message has been successfully submitted and would be delivered to recipients shortly.