Ctags: Ctag universal menyisipkan karakter `utf-8` yang tidak valid untuk file tertentu

Dibuat pada 30 Jul 2018  ·  7Komentar  ·  Sumber: universal-ctags/ctags

(
Terima kasih sudah menghubungi kami.

Jika Anda melaporkan masalah dengan keluaran penguraian, harap isi
pola berikut. Seperti yang dapat dilakukan oleh konfigurasi CTag khusus Anda
mempengaruhi hasil, harap selalu gunakan --options=NONE sebagai yang pertama
opsi saat menjalankan ctags .

Jika tidak, hapus template dan tulis masalah Anda dari awal.
Contoh dapat membantu pengembang memahami masalah Anda dengan lebih baik.

Gunakan antarmuka web GitHub dan notasi penurunan harga.
Menggunakan hasil email, rendering teks rusak yang membuat
para pengembang menjadi gila.
)


Nama pengurai:

Baris perintah yang Anda gunakan untuk menjalankan ctags:

$ ctags -R

Saya tidak memiliki konfigurasi khusus di .ctags atau di mana pun. Ini adalah VM baru tempat pengujian ini dijalankan.

Isi file input: https://github.com/pallets/jinja/blob/master/jinja2/_identifier.py

Keluaran tag yang Anda tidak puas dengan:

Universal-ctags menyisipkan karakter utf-8 tidak valid dalam keadaan tertentu.

Output tag yang Anda harapkan:

Output tag yang diharapkan dengan semua karakter utf-8 valid.

Versi ctag:

$ ctags --version
Universal Ctags 0.0.0(3522685), Copyright (C) 2015 Universal Ctags Team
Universal Ctags is derived from Exuberant Ctags.
Ctags 5.8, Copyright (C) 1996-2009 Darren Hiebert
  Compiled: July 27 1018, 23:16:36
  URL: https://ctags.io/
  Optional compiled features: +wildcards, +regex, +iconv, +option-directory, +xpath

Bagaimana Anda mendapatkan biner ctags:

(
Biner ctags dibangun di atas ubuntu-16.04 VM tanpa modifikasi selain menginstal pustaka yang diperlukan seperti automate , autoreconf untuk mengompilasi ctags dan pustaka yang diperlukan untuk mengompilasi vim berdasarkan https://github.com/Valloric/YouCompleteMe/wiki/Building-Vim-from-source#a-for-a-debian-like-linux-distribution-like-ubuntu-type
)

@lilydjwg menunjukkan kepada saya bahwa ctags memasukkan karakter utf-8 tidak valid meskipun file yang digunakan untuk menghasilkan tag memiliki semua karakter utf-8 valid di sini:
https://github.com/vim/vim/issues/3213#issuecomment -406961075

Versi kompilasi dari ctags bekerja dengan baik secara umum.

Baru-baru ini ditemukan, bahwa ternyata ctags memiliki bug yang menyebabkan
Execuberant ctags diinstal oleh sudo apt-get install ctags di Ubuntu
16.04 tidak memasukkan karakter utf-8 tidak valid, tetapi jika saya kompilasi
Universal-ctags dari sumber dan menginstalnya berdasarkan instruksi di sini:
https://github.com/universal-ctags/ctags/blob/master/docs/autotools.rst , itu
akan memasukkan karakter utf-8 tidak valid. Berikut buktinya:

Dengan exuberant-ctags diinstal hanya menggunakan sudo apt-get install ctags :

2018-07-29_19-03-44

Dengan Universal-ctags dikompilasi dari sumber (komit terbaru) pada posting ini,
dikompilasi dengan instruksi dari sini:
https://github.com/universal-ctags/ctags/blob/master/docs/autotools.rst :

2018-07-29_19-10-22

Ini menyebabkan banyak masalah di vim, karena jika karakter utf-8 tidak valid adalah
diteruskan ke vim.eval , vim.eval rusak dan ini menyebabkan tidak ada tag yang dikembalikan pada
semua. Saat ini, hanya ada satu cara untuk mentransfer data yang terdapat dalam viml
variabel ke ruang python-name , menggunakan vim.eval . Jadi, plugin lain di
vim atau di mana akan memiliki masalah serupa juga. @ludovicchabant untuk
contoh harus mem-posting file tag-nya untuk menghentikan masalah seperti itu:
https://ludovic.chabant.com/devblog/2017/02/25/aaa-gamedev-with-vim/

Dia juga harus mengubah ctrl-py-matcher untuk mengetahui masalah ini.
https://github.com/ludovicchabant/ctrlp-py-matcher/blob/2f6947480203b734b069e5d9f69ba440db6b4698/autoload/pymatcher.py#L22

Ada beberapa file lain yang saya lihat memiliki masalah serupa, tetapi saya
baru saja menyediakan satu di sini untuk mempersempit masalah.

Dugaan saya adalah ini adalah bug, dan saya tidak berharap ctags akan melakukan ini dengan
desain. Bisakah ini diperbaiki, karena ini dulu berfungsi dengan baik di Ctags Exuberant
di mana Universal-ctags didasarkan?

Ref: https://github.com/vim/vim/issues/3213#issuecomment -408727629

Semua 7 komentar

Kedengarannya seperti #1275 bagi saya: opsi pattern-length-limit yang baru memotong pada posisi byte yang berubah-ubah, yang kebetulan berada di tengah urutan karakter. Lihat #163, #640 dan #1018.

Sesuatu seperti https://github.com/universal-ctags/ctags/issues/1275#issuecomment -274489859 mungkin harus diterapkan untuk memperbaikinya.

@alphaCTzo7G lihat #1807, apakah itu memperbaikinya dengan benar untuk Anda?

@b4n , terima kasih atas respon cepatnya...

Pada file yang saya posting di sini _identifier.py , menggunakan komit #1805, ctags tidak lagi menyisipkan karakter/potongan yang tidak valid di lokasi yang berubah-ubah.

Saya akan mencoba PR ini pada sistem saya yang sebenarnya selama beberapa hari ke depan untuk melihat apakah itu berfungsi untuk seluruh repositori saya atau memancarkan kesalahan lain

Karena ctrlp dan ctrlp-py-matcher adalah plugin yang sangat populer, akan sangat bagus jika #1807 digabungkan sehingga vim dan pengguna editor teks lainnya dapat menggunakan ctrlp dan ctrlp-py-matcher tanpa harus khawatir tentang masalah ini.

Ada file lain yang saya temukan menyebabkan masalah, dengan vim.eval , dan berisi karakter utf-8 tidak valid seperti yang ditentukan oleh grep -axv '.*' misc.html ( misc.html di https:/ /github.com/alphaCTzo7G/test). Apa yang saya perhatikan adalah bahwa ctags akan memasukkan karakter utf-8 valid ke dalam file tag dari misc.html .

Apakah masuk akal jika ctags mendeteksi karakter yang tidak valid dalam file dan menggantinya dengan sesuatu seperti yang disarankan @tonymec di sini? (ganti urutan yang tidak valid dengan satu atau lebih contoh karakter (U+FFFD REPLACEMENT CHARACTER) yang dimaksudkan untuk tujuan tersebut.): https://github.com/vim/vim/issues/3213#issuecomment -405211243 ?

IIUC, ctags (Ctags yang meriah, maksud saya, yang hanya merupakan salah satu program ctags yang tersedia) didistribusikan secara terpisah dari Vim (bahkan jika pembuatnya mengenal Bram dan bahkan jika mereka kadang-kadang bekerja sama untuk membuat Vim dan ctags bekerja lebih baik bersama-sama.

Dari sudut pandang ctag, adalah sah untuk memperlakukan teks program hanya sebagai string byte: terlepas dari apakah itu UTF-8, Latin1, Latin9 atau beberapa rangkaian karakter ISO 8859 lainnya, spasi adalah 0x20, tab keras adalah 0x09, jeda baris adalah 0x0A mungkin didahului oleh 0x0D, dll.; dan byte nol, yang akan menjadi 0x00, seharusnya tidak muncul dalam file teks. Ctags memperlakukan setiap program dengan cara yang sama terlepas dari pengkodean yang kompatibel dengan ASCII mana yang ditulis, dan karena itu tidak perlu peduli yang mana. Hanya untuk beberapa rangkaian karakter aneh seperti EBCDIC yang perlu memperlakukan teks sebagai non-ASCII (dalam EBCDIC, IIRC, AI adalah 0xC1-0xC9, JR adalah 0xD1-0xD9, SZ adalah 0xE2-0xE9, 0-9 adalah 0xF0-0xF9 , dan saya tidak ingat apa kode untuk spasi, tab, jeda baris, tanda hubung, garis bawah, dll.; tetapi Anda melihat bahwa dari sudut pandang ASCII itu benar-benar aneh).

IMHO, dalam kasus ctag, prinsip lama yang baik berlaku: sampah masuk, sampah keluar.

Salam,
Toni.

@tonymec .. masuk akal.. Saya menyadari bahwa mungkin ada program pembuatan tag lain, tetapi universal-ctags adalah yang paling populer, dan di antara orang-orang yang menggunakan universal-ctags tebakan saya adalah sebagian besar adalah vim pengguna.

Jadi saya ingin tahu apakah 2 ini dapat berfungsi atau Anda memiliki ide lain tentang cara menangani file yang memiliki karakter utf-8 ilegal?

  1. Saya juga memperhatikan bahwa ctags memiliki opsi ini +iconv , yang memungkinkan penggunaan libiconv . Ketika digunakan pada baris perintah iconv dapat menghapus karakter ilegal utf8 . Jadi saya bertanya-tanya apakah saya melewati --input-enconding=utf-8 dan --output-encoding=utf-8 , maka semua karakter utf-8 ilegal akan diubah menjadi karakter utf-8 legal.

Ini dijelaskan di bagian 1.3.4 dari https://media.readthedocs.org/pdf/ctags/latest/ctags.pdf :

Two new options have been introduced (--input-encoding=IN and --output-encoding=OUT). Using the encoding specified with these options ctags converts input from IN to OUT. ctags uses the converted strings when writing the pattern parts of each tag line. As a result the tags output is encoded in OUT encoding. In addition OUT is specified at the top the tags file as the value for the TAG_FILE_ENCODING pseudo tag. The default value of OUT is UTF-8. NOTE: Converted input is NOT passed to language parsers. The parsers still deal with input as a byte sequence. With --input-encoding-<LANG>=IN, you can specify a specific input encoding for LANG. It overrides the global default value given with --input-encoding

  1. serahkan pada editor untuk menangani karakter ilegal utf8 . Dalam hal ini, vim.eval harus diperbaiki atau harus ada fungsi vimL yang dapat mengurai dan menghapus karakter utf-8 ilegal sebelum meneruskannya ke vim.eval ..

@alphaCTzo7G Saya setuju dengan @tonymec dan kesimpulannya.

Sayangnya, banyak masalah dalam mengenali penyandian yang tepat -- dan saya bersikeras pada yang benar, karena mudah untuk menemukan penyandian di mana input akan valid secara teknis, katakanlah sebagian besar jika tidak semua penyandian 8bit akan, tetapi mengetahui apakah itu benar satu rumit atau tidak mungkin: katakanlah, bagaimana seseorang bisa yakin antara misalnya ISO 8859-1 dan 8859-15? Solusi termasuk heuristik kompleks tentang frekuensi penggunaan dan konteks; atau ide yang lebih naif yang berlaku untuk beberapa bahasa seperti HTML akan mengekstraksi pernyataan penyandian di dalam file, tetapi itu juga bisa salah.

Selain itu, ctag berada dalam posisi yang sulit di sini: banyak, jika bukan sebagian besar, konsumen tidak menangani penyandian, dan tag yang dihasilkan harus cocok pada tingkat byte. Misalnya, menangkap pola tag atau bahkan nama tidak akan mengonversi penyandian untuk Anda, jadi tag harus cocok dengan file pada tingkat byte. Itu mudah ketika semua yang kita harus pedulikan adalah ASCII, tapi kita tidak seberuntung itu lagi… UTF-8 tidak diadopsi cukup awal.
Ini juga berlaku untuk ide penggantian dengan karakter pengganti: apa yang dapat dilakukan konsumen dengan karakter pengganti seperti itu? Setidaknya harus menanganinya dengan cara tertentu.

Namun, jika Anda senang mengganti UTF-8 yang tidak valid dengan U+FFFD atau menghapusnya, mungkin Anda dapat dengan mudah memposting output ctags?

@b4n , hargai komentar Anda. Saya sebenarnya kebanyakan berurusan dengan file yang disandikan utf-8 dan memiliki utf-8 dikodekan untuk file yang saya buat. Sayangnya, seperti yang Anda sebutkan, saya menggunakan perpustakaan yang terkadang memiliki penyandian yang terkadang berubah-ubah.

Saya menggunakan vim-gutentags , dan itu menyediakan fungsionalitas pasca-pemrosesan. Meskipun saya dapat secara manual mem-posting file tag untuk menghasilkan semua file dalam karakter utf-8 , ketika saya mencoba menggunakan fungsi post-processing dalam vim-gutentags , itu tidak berhasil . Jadi saya pikir mungkin lebih baik untuk mencari solusi yang lebih kuat.. tetapi jika itu tidak ada, saya harus memeriksanya lagi..

Untuk mendeteksi penyandian file, tidak bisakah Anda menggunakan pustaka yang mendasari di balik salah satu opsi ini: https://stackoverflow.com/questions/805418/how-to-find-encoding-of-a-file-in-unix -via-skrip

seperti enca , file , uchardet , enguess ? Ini semua adalah utilitas baris perintah.. tetapi harus ada beberapa perpustakaan di suatu tempat yang dapat digunakan secara internal oleh ctags mungkin. Dugaan saya adalah karena jumlah penyandian, seperti yang Anda sebutkan, mungkin tidak akan pernah mungkin untuk memprediksi penyandian dengan sempurna, tetapi solusi sederhana yang mencakup sebagian besar mungkin lebih baik daripada tidak sama sekali..

Saya akan mencoba --input-encoding (and/or --input-encoding-<LANG>) and --output-encoding options .. Tidak yakin apakah itu akan bekerja sepanjang waktu, karena sangat mungkin bahwa file tertentu akan memiliki penyandian yang berbeda dalam repositori yang sama, kecuali ctags mengetahui pengkodean yang benar secara individual dan meludahkannya dalam format yang diinginkan.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

lvc picture lvc  ·  3Komentar

jayceekay picture jayceekay  ·  13Komentar

jespinal picture jespinal  ·  8Komentar

lvc picture lvc  ·  8Komentar

masatake picture masatake  ·  18Komentar