Como preencher automaticamente nomes de classes CSS que incluem um caractere de menos?

8

Estou tendo a seguinte estrutura de classes CSS

.mAIcon
.mAIcon-reject
.mAIcon-edit
.mAIcon-accept
.event

e assim por diante.

Dentro dos meus arquivos HTML, quero preencher automaticamente esses nomes de classe.

Mas quando eu digito

<span class="mAIcon mA|">

e quero completar automaticamente o resto, a única coisa que recebo é

<span class="mAIcon mAIcon|">

Para obter o que realmente quero, preciso digitar um extra -e, por exemplo, ee usar o preenchimento automático novamente. Mas então eu recebo tudo o que começa com uma e, até a classe event. Isso é realmente irritante e torna o preenchimento automático bastante inútil nesse caso.

Eu uso a conclusão de palavra-chave genérica do Vim com o i_CTRL-Ncomando e não tenho nenhum plug-in de conclusão adicional instalado.

É possível incluir a -detecção de nomes de classe CSS para o preenchimento automático?

Raphael Ahrens
fonte
Você diz "preenchimento automático", isso significa que você está usando o YouCompleteMe, o neocomplete ou algo semelhante? Nesse caso, isso deve ser mencionado na sua pergunta. Caso contrário, você deve estar emitindo algum tipo de comando de conclusão, como <c-x><c-n>, que também deve ser especificado na sua pergunta.
Karl Yngve Lervåg
@ KarlYngveLervåg obrigado pelo seu comentário. Por favor, dê uma olhada na minha edição.
Raphael Ahrens
1
Sua edição confirmou minha suspeita. Primeiro, o preenchimento automático do IMHO deve ser automático e, como tal, o problema que você está descrevendo não é o de preenchimento automático, mas apenas o de conclusão. Para o preenchimento automático no Vim, recomendo que você verifique neocomplete ou YouCompleteMe. Segundo, você está usando a conclusão genérica de KEYWORD do Vim. Uma palavra-chave é definida pela opção 'iskeyword'e, embora as palavras-chave sejam usadas também para outros comandos (efeitos colaterais), essa ainda é a maneira correta de alcançar o que você deseja sem usar outros tipos de conclusão (automática).
Karl Yngve Lervåg
@ KarlYngveLervåg Primeiro, desculpe-me pelo mal-entendido. Mas eu pensei que o preenchimento automático era o termo certo. Segundo, você poderia me indicar algo que resolva meu problema de conclusão? Até onde eu vejo o YouCompleteMe e o neocomplete não alteram o comportamento de conclusão da conclusão padrão, eles adicionam apenas mais "automático", o que eu não preciso. Eu realmente pensei que isso seria possível com o Vim.
Raphael Ahrens
1
Posso estar errado, mas a conclusão da tag pode funcionar nesse caso. Pessoalmente, não desenvolvo muito a web e, portanto, não estou familiarizado com o Vim para html / css / ..., mas acho que ctagsdeve ser capaz de gerar tags para o seu projeto. Em seguida, você pode concluir a marcação com i_CTRL-X_CTRL-]. No entanto, vejo nos documentos que a conclusão de tags também usa a iskeywordopção, portanto, posso estar errado. De qualquer forma, você provavelmente quer ler :h ins-completion.
Karl Yngve Lervåg

Respostas:

10

Sim, você pode definir quais caracteres são considerados parte das palavras-chave com a 'iskeyword'opção:

setlocal iskeyword+=-

Você pode adicionar o seguinte snippet ao seu vimrcpara restringir essa opção aos arquivos CSS e HTML:

augroup css
    autocmd!
    autocmd FileType css,html setlocal iskeyword+=-
augroup END
romainl
fonte
5
Observe que a modificação iskeywordtem muitos efeitos colaterais. Por exemplo dwno some-textagora irá excluir some-text, em vez de apenas some. Não necessariamente uma coisa ruim, mas algo para estar ciente.
Martin Tournoij
Mhh, isso só parece funcionar dentro de um arquivo CSS, assim que eu alterno para um buffer diferente (por exemplo, um arquivo HTML), ele só completa as palavras sem o sinal de menos.
Raphael Ahrens
@RaphaelAhrens, veja minha edição.
Romainl
@romainl Eu realmente aprecio sua resposta rápida. Sinto muito, mas não posso aceitar esta resposta, pois ela não será dimensionada com mais tipos de arquivos e, além disso, tem os efeitos colaterais mencionados por Carpetsmoker. Espero que entenda.
Raphael Ahrens
1
Eu uso isso, mas aciono jse coffeearquivos também. Porque me vejo completando aulas de CSS frequentemente em Javascript e raramente tenho código que executa subtração sem espaço. No código que eu edito, diff = foo - bar;é mais comum quediff=foo-bar;
joeytwiddle 4/15
1

Resolvi o problema escrevendo um pequeno script python que cria um arquivo de tags. O script procura classes CSS e imprime uma linha de tag para cada classe.

No momento, eu corro o script manualmente com

css_tags $file >> tags

que adiciona os arquivos ao arquivo de tags. Isso funciona, pois a conclusão da tag não é limitada pela iskeywordconfiguração.

Aqui está o conteúdo do script, que também está disponível no GitHub .

#!/usr/bin/env python3

import argparse
import re

parser = argparse.ArgumentParser(description='CSStags.')
parser.add_argument('css_file', type=argparse.FileType('r'))


def create_tag(tag_name, filename, line):
    """
    Create a ctag line for the CSS class
    """
    print('%s\t%s\t/^%s$/;"\tc' % (tag_name, filename, line))


def main():
    args = parser.parse_args()

    class_regex = re.compile('^\.([\w-]+)\s*{')

    for line in args.css_file:
        class_match = class_regex.match(line)
        if class_match:
            create_tag(class_match.group(1), args.css_file.name, class_match.group(0))


if __name__ == '__main__':
    main()
Raphael Ahrens
fonte