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

47068Re: Defining new visual-mode motions?

Expand Messages
  • Joseph Barker
    Jun 1, 2007
    • 0 Attachment
      On Friday 01 June 2007 13:11:50 you wrote:
      > Joseph Barker schrieb:
      > > Hello, all.
      > >
      > > I was recently helping someone out with a vim script
      > > (camelcasemotion.vim) which adds additional motion commands (they treat
      > > camel-cased words (WordsLikeThis) as separate words, rather than as a
      > > single word). This is easy enough to do in normal and operator-pending
      > > mode. It seems to be very complicated to do this in visual mode, though
      > > -- calling a function (or anything that lets you move the cursor) seems
      > > to force you to leave visual mode (i.e., doing `vmap ,w :<C-U>call
      > > MoveCursor()` will move the cursor to the right place, but you're no
      > > longer in visual mode).
      > >
      > > My approach to this was to call the movement function, set a mark,
      > > select the previous visual block (with gv) and then jump to the mark
      > > that was previously set. The mapping that I created to deal with this
      > > is the following:
      > >
      > > vmap <silent> ,w @="\33:\25call
      > > <SID>CamelCaseMotion('w',1,'v')"<CR><CR>m`gvg``
      > >
      > > This seems somewhat inelegant, and also clobbers a mark to be able to
      > > accomplish its magic. Is there an easier way to accomplish the same
      > > thing? It seems like there should be, but I was unable to figure one
      > > out.
      > The following is possible:
      > function VisualMove()
      > normal! gv
      > call search('\u')
      > " visual mode still on
      > endfunction
      > vmap ,w :<c-u>call VisualMove()<cr>

      That works perfectly, although I have no idea why. Can you explain? I would
      think that calling `normal! gv` would have no effect, since that should
      reselect the current selection. But for some reason it allows you to call
      search() while staying in visual mode, which makes no sense to me. Perhaps
      I'm not looking at the right place in the documentation.

      Thanks for that.

    • Show all 8 messages in this topic