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

74089Re: Mapping of keysequences...

Expand Messages
  • A.J.Mechelynck
    Oct 1, 2006
    • 0 Attachment
      Meino Christian Cramer wrote:
      > From: "A.J.Mechelynck" <antoine.mechelynck@...>
      > Subject: Re: Mapping of keysequences...
      > Date: Sun, 01 Oct 2006 19:44:39 +0200
      >
      >> Meino Christian Cramer wrote:
      >> [...]
      >>> Hi Tony !
      >>>
      >>> nice to read you again! And thank you very much for your
      >>> help,help,help... :) <- BIG smiley!
      >>>
      >>> Slowly and surely I get my TeX macro working...
      >>>
      >>> What I have now is the following:
      >>>
      >>> inoremap <C-C><C-F>b {\bf #}<ESC>?#<CR>c/}<CR>
      >>> inoremap <C-C><C-F>i {\it #}<ESC>?#<CR>c/}<CR>
      >>> inoremap <C-C><C-F>s {\sl #}<ESC>?#<CR>c/}<CR>
      >>>
      >>> which "works". A last wish I would have is: After 'c'hanging the '#'
      >>> to what I really want to typeset I will press <ESC> to leave
      >>> 'c'hanging and insert mode. But my cursor still is inside of the {}....
      >>>
      >>> Is it possible to let the macros recognize the pressing of '<ESC>'
      >>> and then jump behind the '}' and may be entering 'i'nsert mode again?
      >>>
      >>> Or may be I need a completly different implementation of those macros
      >>> for that?
      >>>
      >>> I often feel, that I am not thinking vim-y enough. ;o)
      >>>
      >>> Thanks a lot for all your help!
      >>>
      >>> Keep hacking!
      >>> mcc
      >>>
      >>>
      >> The {rhs} (right-hand side) of a mapping is exactly the sequence of keys as
      >> you would hit them to accomplish the desired action. In Insert mode you can
      >> move the cursor using <Left> <Right> etc., so instead of <Esc>?#<CR> you can
      >> use <Left><Left>. This means that you can leave out the # in the first place,
      >> and just use one <Left> to place the cursor before the }. You then remain in
      >> Insert mode to insert whatever you want through the keyboard after the mapping
      >> has finished:
      >>
      >> :imap <C-C><C-F>b {\bf }<Left>
      >>
      >> etc.
      >>
      >> If you want the _next_ use of <Esc> to move the cursor after the } then it
      >> becomes more intricate: you will need to use a function as {rhs} to return the
      >> required string and remap <Esc> as a side-effect; but "what you remap <Esc>
      >> to" must not only do the required cursor move but also unmap itself. In this
      >> case I don't think the game is worth the candle, especially if {\bf } {\it }
      >> {\sl } etc. can be nested. It may be simpler to just hit <Right> to go past
      >> the right-bracket when you want to close the "{\bf " or similar.
      >>
      >> Another possibility is to simply yank these strings (without the closing
      >> brace) into some registers (which will be saved in your viminfo so you do this
      >> only once, at the command-line):
      >>
      >> :let @b = '{\bf '
      >> :let @i = '{\it '
      >> :let @s = '{\sl '
      >>
      >> (Note the _single_ quotes.) Then, in Insert mode, <C-R>b will insert
      >> {\bf<Space> and similarly for the other two (even after you close and reopen
      >> Vim, without the need to reenter them). Hit } to close the (bold?) text area.
      >>
      >>
      >> Best regards,
      >> Tony.
      >>
      >
      > Hi Tony,
      >
      > as I said...I am currently not thinking vim-y enough ... :)))))))
      >
      > With "<Left>" it is so much easier to achieve the wanted effect than
      > jumping betwen the modes and inserting things only for the purpose of
      > replaceing them with something different...
      >
      > And the register-trick with @b,@f,@s is even more simpler!
      >
      > One last question:
      > Will it hurt or eat up my system resources :) when I insert the 'let'
      > commands into my .vimrc?

      well, it will just (after the first time) place into your registers what is
      already there because your viminfo automatically saves it from session to
      session. The "resources" it "eats up" are, I suppose, a few bytes of vimrc
      disk space and a few milliseconds of startup time ;-). Nothing much to worry
      about.

      > This is to avoid haveing "one part" of a macro in .vimrc and the
      > other one in .viminfo....not to confuse myself right in the beginning
      > of learning of vim if not needed.
      >
      > Thank you very much, Tony !
      >
      > Keep hacking!
      > mcc
      >
      >
      >
      >

      And if you put these three values in the registers, you don't need anything
      for this in the vimrc -- there is no "other part". Ctrl-R letter (in Insert
      mode) directly invokes the corresponding register. Similarly Ctrl-R + (the
      system clipboard), Ctrl-R / (the latest search pattern), etc.

      There are several ways to invoke each register:

      "x in Normal mode commands (y, d, p etc.)
      @x in expressions and in :let, :redir, etc.
      x in the argument to :yank, :put etc.
      "x" in the first argument to setreg() etc.
      <C-R>x in Insert/Replace and Command-line modes

      In all these cases, the register is the same if the letter is the same. And if
      you ever forget what is in your registers, there is always the ":reg[isters]"
      command.


      Best regards,
      Tony.
    • Show all 15 messages in this topic