繁体   English   中英

在vim中使用v:count映射

[英]Mapping with v:count in vim

我想将<cc>映射为在众所周知的<cc>快捷方式上进行一些改进的副本 如果可能的话,我也想为其使用通用映射。 我听说了v:count ,我想知道a是否可以在这里使用它。

" Copy word under cursor 
inoremap <silent> <c-c> <esc>m`viw"+y``a
nnoremap <silent> <c-c>      m`viw"+y``

" Copy selection
vnoremap          <c-c> "+y

" Copy word under cursor in register [count]
inoremap <silent> 1<c-c> <esc>m`viw"1y``a
inoremap <silent> 2<c-c> <esc>m`viw"2y``a
inoremap <silent> 3<c-c> <esc>m`viw"3y``a
[...]
inoremap <silent> 7<c-c> <esc>m`viw"7y``a
inoremap <silent> 8<c-c> <esc>m`viw"8y``a
inoremap <silent> 9<c-c> <esc>m`viw"9y``a

nnoremap <silent> 1<c-c>      m`viw"1y``
nnoremap <silent> 2<c-c>      m`viw"2y``
nnoremap <silent> 3<c-c>      m`viw"3y``
[...]
nnoremap <silent> 8<c-c>      m`viw"8y``
nnoremap <silent> 9<c-c>      m`viw"9y``

问题是,我可以使用这种东西吗?我该怎么做?

nnoremap <silent> <c-c>      m`viw"{v:count}y``

编辑:

在您的帮助下,我做到了,但仍然有一些问题。 例如,当我执行3时,它将粘贴“ e”寄存器的内容3次。 如何避免呢?

nnoremap <expr> <C-c> MyYank()
inoremap <expr> <C-c> MyYank()
vnoremap <expr> <C-c> MyYank()

nnoremap <expr> <C-v> MyPaste('n')

" Not using numbered registers because they get rotated due to quote_number
" Instead. A indexed string is used to map <count> to a letter
let s:mapping = 'qwertzuiop'

fu! MyYank(...)    
    " Get the register to yank in
    let l:count = v:count > len(s:mapping) ? 0 : v:count
    let l:regs = l:count ? s:mapping[l:count - 1] : '+'

    " Action depends on the current mode
    let l:currentmode = a:0 > 0 ? a:1 : mode()
    if l:currentmode == 'n'
        return 'm`viw"' . l:regs . 'y``'
    elseif l:currentmode == 'i'
        return "\e" . 'm`viw"' . l:regs . 'y``a'
    elseif l:currentmode == 'v'
        return '"' . l:regs . 'y'
    endif
endfu

fu! MyPaste(...)   
    " Get the register to yank in
    let l:count = v:count > len(l:mapping) ? 0 : v:count
    let l:regs = l:count ? l:mapping[l:count - 1] : '+'

    " Action depends on the current mode
    let l:currentmode = a:0 > 0 ? a:1 : mode()
    if l:currentmode == 'n'
        return '"' . l:regs . 'P'
    elseif l:currentmode == 'i'
        return "\e" . 'm`viw"' . l:regs . 'y``a'
    elseif l:currentmode == 'v'
        return '"' . l:regs . 'y'
    endif
endfu   

您可以使用:help :map-expr来做到这一点:

" Copy word under cursor in register [count]
nnoremap <expr> <silent> <c-c>      'm`viw"' . (v:count ? v:count : '"') . 'y``'

但是,就像@FDinoff一样,我会要求您重新考虑拉动编号寄存器的方法。 如果你返工你原来的<Cc>映射(使用:map-exprv:register ),你已经可以抽出到任意的寄存器(用前缀"{reg}仍然默认到剪贴板那些。 :imaps与输入数字时,计数将导致明显的延迟。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM