Guias para recuo, espaços para alinhamento

17

Estou tentando fazer recuo automático do vim com guias e alinhar com espaços em branco, mas, na verdade, recuo do vim com guias e preencher o alinhamento com guias + espaços em branco.

Vim faz isso:

insira a descrição da imagem aqui

(cada bloco é uma guia)

{
>--long a = 1,
>-->--..b = 2,
>-->--..c = 3;
}

Pode fazê-lo:

{
>--long a = 1,
>--.....b = 2,
>--.....c = 3;
}

Então, acho que há muitas perguntas sobre o assunto de guias e espaços, mas nenhuma delas fornece uma solução Just Works:

Na verdade eu estou usando:

set ai
set cindent
set cinoptions=(0,:0,u0,U0,g0)

Eu tentei o plug-in Smart Tab , que parece funcionar bem, mas quando tento gg=Grecebo alguns erros estranhos:

Error detected while processing function CtabRedoIndent..<SNR>12_CheckAlign:
line   11:
E108: No such variable: "b:ctab_lastalign"
Press ENTER or type command to continue
Error detected while processing function CtabRedoIndent:
line   10:
E170: Missing :endwhile

Essa discussão parece velha demais, então agora, 2015, existe uma solução oficial para lidar com isso?

tjbrn
fonte
Eu não tenho um mapeamento para isso, apenas uma idéia ... mas e se você configurar o Vim para inserir guias (da largura que desejar) quando pressionar a tecla tab, mas na verdade expandir uma guia para espaços se você digitar Shift -Aba? Isso não tornaria esse tipo de alinhamento simples?
Curinga
(PS: Há uma boa discussão sobre "Tabs vs. Spaces" no fórum "Guerras religiosas" da história em quadrinhos do xkcd . Aproveite;)
Wildcard

Respostas:

3

Fazer isso verdadeiramente automaticamente é difícil. Vim não sabe o que é "recuo" e o que é "alinhamento"; e algumas pessoas podem discordar sobre o que exatamente constitui recuo e alinhamento.

Dito isto, o plug - in Smart Tabs foi projetado para fazer o que você deseja; Eu descobri que ele funciona razoavelmente bem para arquivos C, mas tem várias advertências; ele quebra arquivos Python, por exemplo, e faz algumas inesperado (para mim, pelo menos) as coisas para arquivos C, às vezes.
Olhando a fonte, não consigo descobrir como funciona em 5 minutos e, combinado com o fato de que quebra algumas coisas, deve pedir para você prosseguir com cuidado ...

Martin Tournoij
fonte
3

O plug-in Smart Tabs que você mencionou é o melhor possível. Inicialmente, encontrei o mesmo erro que você cometeu e desistiu, mas acabei gastando alguns minutos para corrigi-lo. Tente aplicar o seguinte patch:

--- ctab.vim.orig   2016-08-11 17:05:20.767275274 +0800
+++ ctab.vim    2016-08-11 17:15:20.039286525 +0800
@@ -221,7 +221,7 @@
       if a:line == line('.')
         let b:ctab_lastalign=a:line
       else
-        unlet b:ctab_lastalign
+        unlet! b:ctab_lastalign
       endif
       set ts=50
       set sw=50

Mais tarde, descobri que alguém sugeriu uma correção semelhante na seção wiki do Smart Tabs . Infelizmente, não houve um novo lançamento.

MartinR
fonte
0

A indentação no vim é realizada simplesmente usando o seguinte script

Script para executar o recuo de um único arquivo

#!/bin/bash 
#Author: Ankit shah
#Enter file name to indent as argument
file=$1
vim $file -c "normal gg=G" -c "wq"
#Use expand command to turn tabs into spaces. Code uniform across different vim environment
expand -t 4 $file $file 
Ankit Shah
fonte
2
Esta não é uma resposta para a pergunta #
Martin Tournoij 31/01