在vim中映射shift键

Chr*_*ker 4 vim coffeescript

Shift在VIM中映射密钥时遇到问题.我希望Ctrl+ L的行为与Ctrl+ Shift+ 不同L

所以我有这个

" 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>
Run Code Online (Sandbox Code Playgroud)

...但它只是触发第二次映射是否Shift按下了键.

根据接受的答案更新

" 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>
Run Code Online (Sandbox Code Playgroud)

Ing*_*kat 7

由于键盘输入在内部处理的方式,不幸的是,即使在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,例如<C-l>g<C-l>,但是在插入模式下不起作用.在你的情况下,通过一些额外的逻辑,你可以<C-l>在相同的位置做一秒更改先前插入->=>,以便你获得第一个替代通过<C-l>,和第二个通过<C-l><C-l>.