On Wed, Sep 14, 2011 at 4:49 PM, Benjamin Fritz <[email protected]>wrote:

> On Tue, Sep 13, 2011 at 2:06 PM, Benjamin R. Haskell <[email protected]>
> wrote:
> >
> > ^M == \r CR carriage return
> > ^J == \n LF line feed
> >
> > So, I think it's what's described at:
> >
> > :help CR-used-for-NL
> > or
> > :help sub-replace-special
> >
> > Maybe not the right explanation(s)... but I think it's the same reason:
> >
> > \n sometimes means <NUL>, sometimes <NL>
> > \r sometimes means <NL>, sometimes <CR>
> >
>
> Possibly. But these help sections seem to apply to search/replace, not
> register manipulation.
>
> This should work, in my opinion:
>
> :let @a='<C-R><C-R>a'
>
> It doesn't. First of all, theres the ^J->^M conversion. Then, it adds
> an additional ^J character at the end to make the register linewise,
> even though it is already linewise.
>
> I think something is wrong here.
>
> I also kind of expected searching for the yanked text to work, but
> that makes...slightly more sense. I found that searching with ^J
> characters doesn't work either, you need to use \n (entered with
> <C-V><C-J> and displayed as ^@).
>

I agree - it would be really useful to be able to search for the contents of
a register. I've identified 3 problem characters that get in the way:

* \ must be escaped (use \\ to match a single \)
* / must be escaped when searching forwards
* ? must be escaped when searching backwards
* newline characters require special treatment (as discussed in this thread)

My Vimscript skills aren't up to much, so I posted this question on
StackOverflow:

    http://stackoverflow.com/questions/7400743

Based on Andrew Radev's suggestion, I came up with this little snippet:

cnoremap <c-x> <c-r>=<SID>PasteEscaped()<cr>
function! s:PasteEscaped()
  echo "\\".getcmdline()."\""
  let char = getchar()
  if char == "\<esc>"
    return ''
  else
    let register_content = getreg(nr2char(char))
    let escaped_register = escape(register_content, '\'.getcmdtype())
    return substitute(escaped_register, '\n', '\\n', 'g')
  endif
endfunction

Suppose that I want to search for a string that I've yanked into the 'a'
register. If I do

    /<c-r>a<CR>

Then I'll run into problems if the 'a' register contains any of the
characters mentioned above. This snippet of code allows me to do this
instead:

    /<c-x>a<CR>

The <c-x> mapping does all of the escaping necessary to make \, /, ? and
newline characters 'safe' in the context of a search prompt.

Please try it out, and let me know if you find any problems in my code.

Drew

-- 
You received this message from the "vim_use" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

Reply via email to