4

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>

...但是无论我是否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>
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,例如<C-l>and g<C-l>,但这在插入模式下不起作用。在您的情况下,通过一些额外的逻辑,您可以<C-l>在同一位置进行第二次更改,将先前插入的内容更改->=>,以便获得第一个替代 via<C-l>和第二个 via <C-l><C-l>

于 2012-04-27T06:34:26.517 回答