4

ShiftVIM でキーをマッピングするときに問題が発生しています。+が+ Ctrl+Lとは異なる動作をしたいCtrlShiftL

だから私はこれを持っています

" for insert mode remap <c-l> to:
" Insert a hash rocket  for ruby
" Insert a -> for php
" for coffee the shift key decides

function! SmartHash(...)
  let shift = a:0 > 0
  let ruby = &ft == 'ruby'
  let php = &ft == 'php'
  let coffee = &ft == 'coffee'

  if php
    return "\->"
  end

  if coffee
    return shift ? "\ =>\n" : "\ ->\n"
  end

  if ruby
    return "\ => "
  end

  return ""

endfunction

imap <c-l> <c-r>=SmartHash()<cr>
imap <C-S-L> <c-r>=SmartHash(1)<cr>

...しかし、Shiftキーを押したかどうかに関係なく、2番目のマッピングをトリガーしているだけです。

受け入れられた回答に基づいて更新

" for insert mode remap <c-l> to:
" Insert a hash rocket  for ruby
" Insert a -> for php and coffeescript
" double tapping does alternate symbol for php and coffescript
function! SmartHash(...)
  let alt = a:0 > 0
  let ruby = &ft == 'ruby'
  let php = &ft == 'php'
  let coffee = &ft == 'coffee'

  if php || coffee
    return alt ? "\ =>\n" : "\ ->\n"
  end

  if ruby
    return "\ => "
  end

  return ""

endfunction

imap <c-l> <c-r>=SmartHash()<cr>
imap <c-l><c-l> <c-r>=SmartHash(1)<cr>
4

1 に答える 1

8

キーボード入力が内部で処理される方法が原因で、GVIM であっても、残念ながら現在これを行うことはできません。これは既知の問題点であり、vim_dev および #vim IRC チャネルでさまざまな議論の対象となっています。

何人かの人々 (主に Paul LeoNerd Evans) はそれを修正したいと考えており (これをサポートする端末のコンソール Vim でさえも)、さまざまな提案、cp. http://groups.google.com/group/vim_dev/browse_thread/thread/626e83fa4588b32a/bfbcb22f37a8a1f8

しかし、今日現在、パッチやボランティアはまだ出されていませんが、将来の Vim 8 メジャー リリースでこれを提供したいという希望を多くの人が表明しています。

g私は通常、代替マッピングを、eg<C-l>およびで開始することによってこれを回避しg<C-l>ますが、挿入モードでは機能しません。あなたの場合、少し追加のロジックを使用<C-l>して、同じ位置で 2 番目を以前に挿入された に変更して->=>を介して最初の代替を取得し、 を介し<C-l>て 2 番目の代替を取得できます<C-l><C-l>

于 2012-04-27T06:34:26.517 に答える