Mengapa * kompilasi * buffer menunjukkan karakter kontrol?

9

Saya menggunakan *compilation*buffer untuk membangun aplikasi C ++ pada Centos 5 dan Centos 6. Buffer menunjukkan build dan menyertakan referensi ke file yang merupakan bagian dari build. Namun, saya mendapatkan karakter kontrol seperti ^[muncul di output dan sulit dibaca dan emacs mendapatkan nama file yang rusak ketika Anda mengklik satu di output. Saya pikir karakter-karakter ini adalah semacam pewarnaan atau anotasi lain pada keluaran kompiler tetapi saya tidak tahu dari mana mereka berasal. Berikut adalah contoh output:

cc -c -g -I../machind -I. -DRELEASE_VERSION -g -O2 -m64 -D__BITS64 -pipe -DARCH_64 -DARCH_INTEL -DARCH_X86 -DARCH_X86_64 -DOS_LINUX -pthread -DLM_INTERNAL -DFLEXLM_KITBUILD -DFLEX_STATIC -DRELEASE_VERSION -DGPLATFORM=\\"x64_lsb\\" -DLINUX -DLSB3_0 -D__FD_SETSIZE=65535 -DGLIBC -DLINUX64 -DAMD64 -DREDHAT -DREL -DRHLINUX64 -DPLATFORM_AMD64_RHLINUX   -DNO_ACTIVATION_SUPPORT ../machind/lmcrypt.c
^[[01m^[[K../machind/lmcrypt.c:^[[m^[[K In function  ^[[01m^[[Kmain^[[m^[[K :
^[[01m^[[K../machind/lmcrypt.c:156:47:^[[m^[[K ^[[01;35m^[[Kwarning: ^[[m^[[Kcast to pointer from integer of different size [-Wint-to-pointer-cast]
     lc_set_attr(lm_job, LM_A_MAX_LICENSE_LEN, (LM_A_VAL_TYPE)max);
^[[01;32m^[[K                                               ^^[[m^[[K

Bagaimana saya bisa menyingkirkan output non-teks di buffer kompilasi saya?

WilliamKF
sumber
1
Itu terlihat seperti VT100 Color dan pemformatan lolos. Anda dapat mencoba menonaktifkan warna dengan melewati -fdiagnostics-color=neverke gcc(dengan asumsi bahwa gccadalah Anda cc)
PythonNut
Karena ansi-color-apply-on-regionbisa lambat, saya telah menulis cuplikan ini beberapa minggu yang lalu: de-ansi.el . Saya tidak bermaksud untuk menjadi sebuah paket dan karena itu memiliki dependensi pada paket key-chord dan pada mode minor sementara temp-mode.el . Anda juga harus menggunakan emacs 24.4 atau lebih baru untuk fitur notifikasi file.
Kaushal Modi

Jawaban:

14

Ini memang urutan yang lolos yang harus ditafsirkan terminal sebagai perintah untuk mengubah warna teks. Biasanya mereka tidak boleh digunakan ketika kompiler dipanggil dari Emacs (tipe terminal harus diatur ke dumb, yang seharusnya menyebabkan kompiler menahan diri dari menggunakan urutan melarikan diri apa pun). Mungkin ada sesuatu yang salah dalam konfigurasi Anda yang menyebabkan warna digunakan padahal seharusnya tidak. Tetapi Anda dapat membuat Emacs mengenali urutan pelarian dengan paket ansi-color .

Sesuatu seperti ini seharusnya membuat buffer kompilasi menangani urutan pelarian ANSI alih-alih menampilkannya sebagai string mentah.

(require 'ansi-color)
(defun my/ansi-colorize-buffer ()
  (let ((buffer-read-only nil))
    (ansi-color-apply-on-region (point-min) (point-max))))
(add-hook 'compilation-filter-hook 'my/ansi-colorize-buffer)
François Févotte
sumber
1
Sangat bermanfaat. Bekerja di Emacs 26.1.
Lalylulelo
1
Ini kembali mewarnai seluruh buffer setiap kali berjalan (dan mengakibatkan mewarnai semua teks ke warna latar depan terakhir untuk saya). Hook ini mengeset "kompilasi-filter-start" ke awal wilayah yang disisipkan dengan titik dipindahkan ke ujung. Jadi saya akan menggunakannya bukan (point-min) dan (point-max).
gt