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

47066Re: Defining new visual-mode motions?

Expand Messages
  • Yegappan Lakshmanan
    Jun 1, 2007
    • 0 Attachment
      Hi,

      On 5/31/07, Joseph Barker <jbarker@...> wrote:
      > 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.
      >

      Did you try specifying the <expr> attribute to the map command?
      Something along the lines of

      function! MoveToCursor()
      return "/\\u\\|\\<\<CR>"
      endfunction

      vnoremap <expr> ,w MoveCursor()

      The MoveCursor() function should return a sequence of keys that will
      position the cursor at the desired location.

      - Yegappan
    • Show all 8 messages in this topic