Bagaimana cara Autocomplete nama kelas CSS yang menyertakan karakter minus?

8

Saya memiliki struktur kelas CSS berikut

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

dan seterusnya.

Di dalam file HTML saya, saya ingin melengkapi nama kelas ini secara otomatis.

Tapi saat saya mengetik

<span class="mAIcon mA|">

dan saya ingin menyelesaikan sisanya secara otomatis satu-satunya yang saya dapatkan adalah

<span class="mAIcon mAIcon|">

Untuk mendapatkan apa yang benar-benar saya inginkan, saya harus mengetik ekstra -dan misalnya edan menggunakan pelengkapan otomatis lagi. Tapi kemudian saya mendapatkan semua yang dimulai dengan e, bahkan kelas event. Ini benar-benar menjengkelkan dan membuat pelengkapan otomatis agak tidak berguna dalam kasus ini.

Saya menggunakan penyelesaian kata kunci umum Vim dengan i_CTRL-Nperintah dan saya tidak memiliki plugins penyelesaian tambahan yang diinstal.

Apakah mungkin untuk menyertakan -ke deteksi nama kelas CSS untuk pelengkapan otomatis?

Raphael Ahrens
sumber
Anda mengatakan "autocomplete", apakah ini berarti Anda menggunakan YouCompleteMe, neocomplete, atau yang serupa? Jika demikian, ini harus disebutkan dalam pertanyaan Anda. Jika tidak, maka Anda harus mengeluarkan semacam perintah penyelesaian, seperti <c-x><c-n>, yang juga harus ditentukan dalam pertanyaan Anda.
Karl Yngve Lervåg
@ KarlYngveLervåg terima kasih atas komentar Anda. Silakan lihat edit saya.
Raphael Ahrens
1
Hasil edit Anda mengonfirmasi kecurigaan saya. Pertama, pelengkapan otomatis IMHO harus otomatis, dan karena itu masalah yang Anda gambarkan bukan dengan pelengkapan otomatis, tetapi hanya dengan penyelesaian. Untuk pelengkapan otomatis di Vim, saya sarankan Anda melihat neocomplete atau YouCompleteMe. Kedua, Anda menggunakan penyelesaian KEYWORD generik Vim. Kata kunci ditentukan oleh opsi 'iskeyword', dan meskipun kata kunci digunakan juga untuk perintah lain (efek samping), ini masih merupakan cara yang benar untuk mencapai apa yang Anda inginkan tanpa menggunakan jenis penyelesaian (otomatis) lainnya.
Karl Yngve Lervåg
@ KarlYngveLervåg Pertama, saya minta maaf atas kesalahpahaman ini. Tapi saya pikir pelengkapan otomatis adalah istilah yang tepat. Kedua, bisakah Anda mengarahkan saya ke sesuatu yang menyelesaikan masalah penyelesaian saya? Sejauh yang saya bisa lihat YouCompleteMe dan neocomplete tidak mengubah perilaku penyelesaian dari penyelesaian standar, mereka hanya menambahkan lebih banyak "otomatis", yang saya tidak butuhkan. Saya benar-benar berpikir ini akan mungkin dengan Vim.
Raphael Ahrens
1
Saya mungkin salah, tetapi penyelesaian tag mungkin berfungsi dalam kasus ini. Secara pribadi saya tidak melakukan banyak pengembangan web, jadi saya tidak terlalu mengenal Vim untuk html / css / ..., tapi saya pikir itu ctagsharus bisa menghasilkan tag untuk proyek Anda. Kemudian Anda dapat melakukan penyelesaian tag dengan i_CTRL-X_CTRL-]. Namun, saya melihat di dokumen bahwa penyelesaian tag juga menggunakan iskeywordopsi, jadi saya mungkin salah. Bagaimanapun, Anda mungkin ingin membaca :h ins-completion.
Karl Yngve Lervåg

Jawaban:

10

Ya, Anda dapat menentukan karakter apa yang dianggap bagian dari kata kunci dengan 'iskeyword'opsi:

setlocal iskeyword+=-

Anda dapat menambahkan cuplikan berikut untuk Anda vimrcuntuk membatasi opsi itu untuk file CSS dan HTML:

augroup css
    autocmd!
    autocmd FileType css,html setlocal iskeyword+=-
augroup END
romainl
sumber
5
Perhatikan bahwa memodifikasi iskeywordmemiliki banyak efek samping. Misalnya dwpada some-textsekarang akan dihapus some-text, bukan hanya some. Bukan berarti hal yang buruk, tetapi sesuatu yang harus diperhatikan.
Martin Tournoij
Mhh ini sepertinya hanya berfungsi di dalam file CSS, segera setelah saya beralih ke buffer yang berbeda (misalnya file HTML) hanya menyelesaikan kata-kata tanpa tanda minus.
Raphael Ahrens
@RaphaelAhrens, lihat edit saya.
romainl
@romainl Saya sangat menghargai jawaban cepat Anda. Tapi saya minta maaf, saya tidak dapat menerima jawaban ini karena tidak akan menskala dengan lebih banyak jenis file dan selain itu memiliki efek samping yang disebutkan oleh Carpetsmoker. Saya harap Anda mengerti.
Raphael Ahrens
1
Saya menggunakan ini tetapi saya memicu jsdan coffeefile juga. Karena saya sering menyelesaikan kelas CSS dalam Javascript, dan saya jarang memiliki kode yang melakukan pengurangan tanpa spasi. Dalam kode yang saya edit, diff = foo - bar;lebih umum daripadadiff=foo-bar;
joeytwiddle
1

Saya memecahkan masalah dengan menulis skrip python kecil yang membuat file tag. Script mencari kelas CSS dan mencetak garis tag untuk setiap kelas.

Saat ini saya menjalankan skrip dengan tangan

css_tags $file >> tags

yang menambahkan file ke file tag. Ini berfungsi karena penyelesaian tag tidak dibatasi oleh iskeywordpengaturan.

Berikut adalah isi skrip yang juga tersedia di 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
sumber