Coffeescript 在vim中映射shift键

Coffeescript 在vim中映射shift键,coffeescript,vim,Coffeescript,Vim,在VIM中映射Shift键时出现问题。我希望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

在VIM中映射Shift键时出现问题。我希望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>
插入模式重新映射到的“
”:
“为ruby插入一个哈希火箭
“为php插入->命令
“咖啡由换档键决定
功能!SmartHash(…)
设shift=a:0>0
让ruby=&ft=='ruby'
让php=&ft=='php'
让咖啡=&ft=‘咖啡’
如果php
返回“\->”
结束
如果咖啡
换班?\=>\n:“\->\n”
结束
如果红宝石
返回“\=>”
结束
返回“”
端功能
imap=SmartHash()
imap=SmartHash(1)
…但它只是触发第二个映射,无论我是否按下Shift键

更新基于 插入模式重新映射到的“
”:
“为ruby插入一个哈希火箭
“插入一个->用于php和coffeescript
“双击不会为php和coffescript替换符号
功能!SmartHash(…)
设alt=a:0>0
让ruby=&ft=='ruby'
让php=&ft=='php'
让咖啡=&ft=‘咖啡’
如果php | |咖啡
返回alt?\=>\n:“\->\n”
结束
如果红宝石
返回“\=>”
结束
返回“”
端功能
imap=SmartHash()
imap=SmartHash(1)

由于键盘输入是在内部处理的,不幸的是,这在今天是不可能的,即使在GVIM中也是如此。这是一个已知的痛点,也是关于vim_dev和#vim IRC通道的各种讨论的主题

一些人(最重要的是Paul LeoNerd Evans)希望解决这一问题(即使是支持这一点的终端中的console Vim),并提出了各种建议,cp

但到今天为止,还没有补丁或志愿者出现,尽管许多人表示希望在未来的Vim8主要版本中有这样的补丁或志愿者


我通常通过使用
g
启动备用映射来解决此问题,例如
g
,但这在插入模式下不起作用。在您的情况下,使用一点额外的逻辑,您可以在相同的位置进行第二次
,将先前插入的
->
更改为
=>
,这样您就可以通过
获得第一个备选方案,如果您使用基于终端的
vim
,则通过

获得第二个备选方案,
c-l
c-s-l
之间没有区别。GUI(
gvim
)可以映射这些键。这太棒了。它比我原来拥有的功能更广泛。
" 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>