vim - conjunto de avanço automático para preencher o espaço à esquerda por um espaço ou uma tabulação

StackOverflow https://stackoverflow.com/questions/5878009

  •  28-10-2019
  •  | 
  •  

Pergunta

Parece que se nós activar 'ai', o vim irá preencher o espaço com tabstop.Eu posso fazer isso, preencha com apenas espaço com 'et'.Eu não gosto de um arquivo C misturado com o espaço e tabstop.

Meu vimrc:

set ts=4 et
set ai
set hlsearch
syntax on
filetype plugin indent on
autocmd FileType make setlocal noexpandtab

No entanto, em alguns condição de eu não precisar de entrada tabstop quando eu bato o " TAB " do teclado, por exemplo, em makefile e alguns outros.O 'autocmd FileType' comando não é bom:Eu não posso adicionar cada tipo de arquivo vimrc.

O que eu quero é simples:

  1. autoindent para preencher líder de área com espaço;
  2. quando bater " TAB " do teclado, tabstop de entrada, não de espaço (para não 'et')

Como fazer isso?

Foi útil?

Solução

inoremap <expr> <tab> ((getline('.')[:col('.')-2]=~'\S')?("\<C-v>\t"):(repeat(' ', &ts-((virtcol('.')-1)%&ts))))

Ele faz o mesmo que a resposta do @Lynch se eu ler corretamente.

Você também pode usar <C-v><Tab>: isso irá inserir <Tab> sem invocar nenhum mapeamento e ignora expandtab, a menos que você remapeado <C-v> ou <C-v><Tab> por algum motivo.

Se você deseja apenas inserir a guia, faça

inoremap <Tab> <C-v><Tab>

Ele irá ignorar a configuração da tabela de expansão.

Outras dicas

Eu fiz isso usando uma função.Eu testei, mas talvez em algum caso particular, você terá que corrigir alguns bugs.Tente adicionar isso ao seu vimrc:

set et

function! Inserttab()
    let insert = ""
    let line = getline('.')
    let pos = getpos('.')[2]
    let before = ""
    let after = line
    if pos != 1
        let before = line[ 0: pos - 1]  
        let after = line[pos : strlen(line) ]
    endif
    if pos != 1 && substitute(before, "[ \t]", "", "g") != "" 
         let insert = "\t"
    else
         let insert = "    "
    endif
    let line = before . insert . after 
    call setline('.', line)
    call cursor(line('.'), strlen(before . insert))
endfunction

inoremap <tab> <esc>:call Inserttab()<CR>a

Basicamente ele faz remapear sua chave em modo visual para a função Inserttab().Observe também que, se você alterar o ts para algo diferente do que 4 ele ainda vai saída de 4 espaços em vez de dois, porque o valor é codificado.

Também não estou muito familiarizado com o vim scripts, mas eu acho que todas as variáveis utilizadas será global, que é uma coisa ruim.

Eu esqueci de mencionar que para "ver" espaços em branco que você pode usar set list.Você desabilitar esta com set nolist.Também no modo normal você pode usar ga para ver informações sobre o caráter de seu cursor.

Editar Eu sei que você pode querer inserir um guia de beginin da linha.Meu script inserir espaço no início e guia em qualquer outro lugar.

Se você realmente quer um guia cada vez que você bater a tecla tab, você pode simplesmente usar esse:

set et

function! Inserttab()
    let insert = ""
    let line = getline('.')
    let pos = getpos('.')[2]
    let before = ""
    let after = line
    if pos != 1
        let before = line[ 0: pos - 1]  
        let after = line[pos : strlen(line) ]
    endif
    let insert = "\t"
    let line = before . insert . after 
    call setline('.', line)
    call cursor(line('.'), strlen(before . insert))
endfunction

inoremap <tab> <esc>:call Inserttab()<CR>a

Mas eu não vejo o ponto, com essa versão que você nunca vai ser capaz de avançar manualmente a partir do modo de inserção.

Uma maneira de fazer isso é

  1. : defina sw= 4 (ou o que quiser)
  2. : definir ts= 46 (ou algum número grande)

Então o recuo automático não inserirá tabulações a menos que você alcance 46 espaços, caso em que você pode colocar um número maior.

Arraste sobre isso apenas se outra pessoa estiver usando guias, então você terá que redefinir ts para concordar com o arquivo que está editando.Por outro lado, isso tornará as guias imediatamente óbvias, o que também pode ser desejável.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top