如何访问vim中的映射键?

时间:2016-12-22 14:37:38

标签: vim

如果我的.vimrc中已经映射了一个密钥(原始功能),该怎么办?

在我的情况下: 我已映射,以评论当前行。但是,如果您使用f / F / t / T搜索当前行中的字符,,也会用于继续搜索。 那么,我如何在其原始功能中访问,(继续搜索)?

2 个答案:

答案 0 :(得分:1)

如果要保留原始,命令,则必须将该映射映射到不同的密钥:

:nnoremap \\ ,

或更改遮盖命令的映射。我知道这很难;最终你用完了短而可记忆的密钥,必须做出权衡: - (

最好让,密钥免于冲突,因此可以使用\c。如果已经采取了这样做,,c也可以。对于原始命令,将有一个短暂的延迟,因为Vim需要确定,是完整命令还是,c映射的第一个键。如果你走这条路,也许:nnoremap ,, ,会有所帮助。抨击,两次比等待超时更快。

编程

虽然在交互式输入时不可行,但您始终可以通过:normal!调用原始的,未映射的功能(请注意!):

:normal! ,

答案 1 :(得分:0)

这是一组映射,允许您执行原始的内置映射。它们依赖于从:help :map-expression返回的任何内容都是字面意义的(没有重新映射),因此只需要通过它传递任何命令的第一个键来跳过覆盖它的自定义映射。

"[count]["x]<Leader><BS>{cmd}
"<Leader><BS>[count]["x]{cmd}
"           Use the built-in, unmapped normal / visual /
"           operator-pending mode {cmd} instead of the mapping that
"           overrides the command.
"CTRL-G <BS>{cmd}   Use the built-in, unmapped insert / command-line mode
"           {cmd} instead of the mapping that overrides the command.
function! s:BuiltInCommand()
    let l:sequence = ''
    while 1
        let l:key = ingo#query#get#Char()
        if l:key ==# "\<Esc>"
            " Abort with beep.
            return l:key
        elseif l:key ==# '"'
            let l:sequence .= l:key
            " Query the register; we won't handle the expression register here.
            let l:key = ingo#query#get#Register("\<Esc>", '=')
            if l:key ==# "\<Esc>"
                " Abort with beep.
                return l:key
            endif
        elseif l:key !~# '\d'
            " This is the beginning of the built-in command; we're done.
            let l:sequence .= l:key
            return l:sequence
        endif
        " Keep querying for [count] numbers, registers, or the beginning of the
        " command.
        let l:sequence .= l:key
    endwhile
endfunction
noremap <expr> <Leader><BS> <SID>BuiltInCommand()
sunmap <Leader><BS>
noremap! <expr> <C-g><BS> ingo#query#get#Char()

这需要我ingo-library plugin的一些功能。例如,要使用原始,,请键入<Leader><BS>,