在vim中映射shift键

时间:2012-04-26 19:53:48

标签: coffeescript vim

在VIM中映射 Shift 键时出现问题。我希望 Ctrl + L 的行为与 Ctrl + Shift + L <不同/ p>

所以我有这个

" 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 键。

根据accepted answer

更新
" 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>

1 个答案:

答案 0 :(得分:7)

由于内部处理键盘输入的方式,遗憾的是,即使在GVIM中也是如此。这是一个众所周知的痛点,也是关于vim_dev和#vim IRC频道的各种讨论的主题。

有些人(最重要的是Paul LeoNerd Evans)希望解决这个问题(即使是支持Vim的终端中的控制台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>