vim - conjunto de avanço automático para preencher o espaço à esquerda por um espaço ou uma tabulação
-
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:
- autoindent para preencher líder de área com espaço;
- quando bater " TAB " do teclado, tabstop de entrada, não de espaço (para não 'et')
Como fazer isso?
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 é
- : defina sw= 4 (ou o que quiser)
- : 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.