¿Cómo autocompletar nombres de clase CSS que incluyen un carácter menos?

8

Tengo la siguiente estructura de clases CSS

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

y así.

Dentro de mis archivos HTML, quiero completar automáticamente estos nombres de clase.

Pero cuando escribo

<span class="mAIcon mA|">

y quiero autocompletar el resto, lo único que obtengo es

<span class="mAIcon mAIcon|">

Para obtener lo que realmente quiero, tengo que escribir un extra -y, por ejemplo, eusar el autocompletado nuevamente. Pero luego obtengo todo lo que comienza con una e, incluso la clase event. Esto es realmente molesto y hace que el autocompletado sea bastante inútil en este caso.

Utilizo la finalización de palabras clave genéricas de Vim con el i_CTRL-Ncomando y no tengo instalados complementos de finalización adicionales.

¿Es posible incluir la -detección de nombres de clase CSS para el autocompletado?

Raphael Ahrens
fuente
Dices "autocompletar", ¿significa que estás usando YouCompleteMe, neocomplete o algo similar? Si es así, esto debería mencionarse en su pregunta. De lo contrario, debe emitir algún tipo de comando de finalización, como el <c-x><c-n>que también debe especificarse en su pregunta.
Karl Yngve Lervåg
@ KarlYngveLervåg gracias por tu comentario. Por favor, eche un vistazo a mi edición.
Raphael Ahrens
1
Su edición confirmó mi sospecha. Primero, el autocompletado de la OMI debe ser automático, y como tal, el problema que está describiendo no es con el autocompletado, sino simplemente con la finalización. Para autocompletar en Vim, le recomiendo que mire neocomplete o YouCompleteMe. En segundo lugar, está utilizando la terminación de PALABRAS CLAVE genéricas de Vim. La opción define una palabra clave 'iskeyword', y aunque las palabras clave se usan también para otros comandos (efectos secundarios), esta sigue siendo la forma correcta de lograr lo que desea sin usar otros tipos de finalización (automática).
Karl Yngve Lervåg
@ KarlYngveLervåg Primero lo siento por el malentendido. Pero pensé que el autocompletado era el término correcto. En segundo lugar, ¿podría señalarme algo que resuelva mi problema de finalización? Por lo que puedo ver, YouCompleteMe y neocomplete no cambian el comportamiento de finalización estándar, solo agregan más "auto", que no necesito. Realmente pensé que esto sería posible con Vim.
Raphael Ahrens
1
Podría estar equivocado, pero la finalización de la etiqueta podría funcionar en este caso. Personalmente, no hago mucho desarrollo web, por lo que no estoy tan familiarizado con Vim para html / css / ..., pero creo que ctagsdebería ser capaz de generar etiquetas para su proyecto. Entonces puede completar la etiqueta con i_CTRL-X_CTRL-]. Sin embargo, veo en los documentos que la finalización de etiquetas también usa la iskeywordopción, por lo que podría estar equivocado. En cualquier caso, probablemente quieras leer :h ins-completion.
Karl Yngve Lervåg

Respuestas:

10

Sí, puede definir qué caracteres se consideran parte de las palabras clave con la 'iskeyword'opción:

setlocal iskeyword+=-

Puede agregar el siguiente fragmento a su vimrcpara restringir esa opción a los archivos CSS y HTML:

augroup css
    autocmd!
    autocmd FileType css,html setlocal iskeyword+=-
augroup END
romainl
fuente
55
Tenga en cuenta que la modificación iskeywordtiene muchos efectos secundarios. Por ejemplo dwen el some-textahora, se eliminarán some-text, en lugar de solamente some. No necesariamente es algo malo, sino algo a tener en cuenta.
Martin Tournoij
Mhh, esto solo parece funcionar dentro de un archivo CSS, tan pronto como cambio a un búfer diferente (por ejemplo, un archivo HTML) solo completa palabras sin el signo menos.
Raphael Ahrens
@RaphaelAhrens, mira mi edición.
romainl
@romainl Realmente aprecio tu respuesta rápida. Pero lo siento, no puedo aceptar esta respuesta, ya que no se escalará con más tipos de archivos y además tiene los efectos secundarios mencionados por Carpetsmoker. Espero que entiendas.
Raphael Ahrens
1
Yo uso esto, pero también enciendo jsy coffeearchivos. Porque me encuentro completando clases de CSS a menudo en Javascript, y rara vez tengo un código que realice sustracción sin un espacio. En el código que edito, diff = foo - bar;es más común quediff=foo-bar;
joeytwiddle
1

Resolví el problema escribiendo un pequeño script de Python que crea un archivo de etiqueta. El script busca clases CSS e imprime una línea de etiqueta para cada clase.

En este momento ejecuto el script a mano con

css_tags $file >> tags

que agrega los archivos al archivo de etiquetas. Esto funciona ya que la finalización de la etiqueta no está limitada por la iskeywordconfiguración.

Aquí está el contenido del script que también está disponible en 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
fuente