映射在vim shift键(mapping the shift key in vim)

2019-09-16 19:00发布

映射在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>

...但它只是触发第二映射我是否有足够的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>

Answer 1:

由于该键盘输入是内部处理的方式,今天这个不幸是不可能的,即使是在GVIM。 这是已知的痛点,并在vim_dev各种讨论和#vim IRC频道的主题。

有些人(最重要的是保LeoNerd埃文斯)要解决这个问题(即使控制台Vim的支持此终端),并已飘来各种建议,CP。 http://groups.google.com/group/vim_dev/browse_thread/thread/626e83fa4588b32a/bfbcb22f37a8a1f8

但截至今日,没有补丁或志愿者还没有出面,但很多人表示有这个在未来的Vim的8个主要版本的愿望。

我通常解决此通过启动与我的交替的映射g ,例如<Cl>g<Cl> ,但不会在插入模式工作。 在你的情况下,额外的逻辑的一点点,你可以做一个第二<Cl>在同一位置改变先前插入->=>让你通过得到的第一个替代<Cl> ,并通过第二<Cl><Cl>



文章来源: mapping the shift key in vim