VIM: Tab como omnicomplete, mas não no início da linha

6

Eu configurei o Tab como Omnicompetion no VIM 7.3:

inoremap <Tab> <C-n>

Isso é conveniente, mas eu realmente gostaria de ter uma guia regular no início de uma linha! Existe alguma maneira de verificar se o caractere precedente é espaço em branco ou início de linha, e se sim, inserir um caractere de tabulação em vez de omnicompletar?

Obrigado!

    
por dotancohen 12.05.2012 / 16:17

2 respostas

12

Eu tenho usado isso há algum tempo:

function! InsertTabWrapper()
    let col = col('.') - 1
    if !col || getline('.')[col - 1] !~ '\k'
        return "\<tab>"
    else
        return "\<c-p>"
    endif
endfunction

inoremap <tab> <c-r>=InsertTabWrapper()<cr>

Isso permite usar a tecla tab normalmente quando o cursor está no início de uma linha ou não em uma palavra, caso contrário, ele executa a chave de conclusão do controle-p - você pode alterá-la para < c-n > para seu uso, embora eu ache < c-p > mais útil.

[Embora eu tenha modificado, a idéia original para isso provavelmente veio da lista de discussão dos usuários do Vim, mas eu não mantive nenhuma anotação sobre onde eu a consegui.]

    
por 12.05.2012 / 20:43
2

Eu posso pensar em funções um pouco complicadas que retrocedem um passo, comparam personagens e agem de acordo, mas eu prefiro abordar o antigo "o que você está realmente tentando fazer?" pergunta:

Eu sugiro que você use Ctrl + T para indentar uma linha no modo de inserção, se for tudo , você quer o botão tab para . Pessoalmente, acho semanticamente muito confuso ter uma chave dependente de posição como essa.

    
por 12.05.2012 / 16:25