Cara mengubah rendering teks yang tidak mencolok?


12

Saya sedang menulis ekstensi emacs untuk digunakan dengan pengenalan ucapan, dan saya mencari bantuan dengan fitur tertentu. Beberapa kata yang dikenal secara konsisten oleh pengenal ucapan (Naga) - tidak masalah berapa kali Anda melatihnya, ia hanya akan payah dalam mengenali kata-kata tertentu. Pada saat yang sama biasanya ketika Anda sedang menulis tentang suatu topik atau ketika coding Anda akan menggunakan banyak kata yang sama berulang-ulang.

Jadi saya telah menulis mode yang menggunakan overlay untuk mengubah bagaimana kata-kata disajikan dalam buffer. Dibutuhkan huruf acak dalam kata, menggarisbawahi dalam warna acak, dan menempatkan tanda diakritik acak (aksen, umlaut, dll.) Di atasnya. Berikut screenshot (Anda mungkin perlu memperbesar untuk melihat tanda / garis bawah):

masukkan deskripsi gambar di sini

Kemudian Anda dapat mengatakan, "rambut ungu" dan itu akan mencari kata dengan garis bawah ungu di bawah 'a' dengan tanda diakritik yang terlihat seperti rambut dan ketik kata itu untuk Anda. Jadi dalam screenshot di atas mengatakan itu akan menyebabkan emacs mengetik "regexp-quote" untuk Anda.

Idenya adalah ini memungkinkan Anda merujuk ke kata apa pun yang telah Anda gunakan yang ada di layar menggunakan serangkaian kata terbatas yang secara konsisten baik dikenali oleh pengenal.

Ini bekerja cukup baik, kecuali kadang-kadang ada tabrakan. Untuk membuatnya jadi saya bisa belajar untuk secara konsisten merujuk pada kata-kata dengan cara yang sama saya menggunakan byte dari md5 hash dari kata, bukannya (random)atau memiliki algoritma menetapkan perubahan sehingga tabrakan dihindari. Saya hanya menemukan 6 warna yang mudah dibedakan (sulit ketika garis bawahnya hanya satu karakter lebar dan satu piksel tebal) dan 3 tanda diakritik mudah dibedakan (mudah untuk membedakan satu sama lain dan juga tidak dapat dibedakan dengan garis bawah di atas) garis atau tumpang tindih dengan garis bawah), terlihat di bagian atas sumber di atas.

Saya perlu lebih banyak cara untuk mengubah rendering untuk mengurangi frekuensi tabrakan. Idealnya, render modifikasi akan:

  • Tidak akan menggelegar dari sisa teks. Ini membuat saya mengabaikan misalnya properti video terbalik.
  • Tidak mudah dikacaukan dengan perubahan lain. Overline mudah dikira sebagai underline pada baris sebelumnya. Banyak tanda diakritik terlihat serupa kecuali ukuran font Anda tidak praktis besar.
  • Dekat dengan tempat di mana perubahan lainnya berada. Saat ini begitu mata saya menemukan karakter penargetan semua informasi ada di sana, penanda, garis bawah, dan surat itu.
  • Bekerja dengan baik dengan font lebar tetap (diperlukan untuk pengkodean) yang dengan benar membuat tanda diakritik (saya harus beralih ke DejaVu Sans Mono dari Consolas untuk membuat tanda-tanda itu dirender dengan benar)
  • Bekerja pada huruf alfabet latin. Ada tanda menggabungkan Arab misalnya, tetapi mereka tidak menggabungkan pada karakter alfabet latin.
  • Tidak mengubah warna huruf, karena itu sudah digunakan untuk penyorotan sintaksis.
  • Sebenarnya bisa dilakukan di emacs dengan emacs lisp;)

Mungkin ada karakter unicode khusus yang mengendalikan rendering yang bisa disalahgunakan untuk membuka kemungkinan baru? Atau cara untuk mengentalkan garis bawah sehingga aku bisa dengan mudah membedakan lebih banyak warna? Atau fitur emacs tidak jelas lainnya yang memungkinkan Anda membuat tanda di atas karakter selain unicode?


Bukan jawaban langsung untuk pertanyaan Anda, tetapi mungkin beberapa ide menggunakan overlay untuk memberikan penampilan karakter baru. Satu ide adalah untuk menggabungkan / menyatukan dua lapisan - memaksa mereka untuk masuk ke ruang yang sama dengan karakter biasa - misalnya, karakter pertama adalah garis tipis dengan warna yang ditambahkan (char-to-string ?\uFEFF)dan yang lainnya adalah karakter target yang dikurangi dalam ukuran sehingga mereka berdua cocok. Gagasan lain adalah dengan menggunakan pemogokan vertikal (tersedia dalam beberapa font, tetapi tidak semua) mirip dengan apa yang digunakan di perpustakaan vline.el emacswiki.org/emacs/VlineMode
hukum

@lawlist: Gagasan unicode line itu menarik, itu akan membuat saya melakukan 'sampingan'. Apakah Anda tahu bagaimana cara mengurangi ukuran karakter berikut? Saya mungkin dapat menghasilkan gambar untuk digunakan dengan properti tampilan tetapi AFAICT tidak ada cara untuk membuat emacs untuk membuat teks menjadi gambar, jadi saya harus membuat gambar di luar emacs.
Joseph Garvin

Komentar ini menggantikan komentar sebelumnya (yang saya hapus), dan kode di tautan berikut telah diperbarui juga - itu berisi tiga contoh (salah satunya identik dengan jawaban yang saya posting di bawah di utas saat ini): stackoverflow .com / pertanyaan / 23744237 / ...
lawlist

Jawaban:


4

Kemungkinan lain adalah untuk menampilkan nomor baris dan mengucapkan nomor baris sebelum kata, atau, karena melihat ke atas untuk mendapatkan nomor baris yang tepat akan menyusahkan, Anda dapat meminta pencarian algoritma dalam + atau - 5 atau 10 baris dari angka yang Anda mengatakan.

Atau mungkin mendeklarasikan wilayah atau fungsi tempat Anda bekerja dan semua pencarian hanya terlihat di sana. Saya kira itu akan membatasi tabrakan.

Anda juga bisa membuat simbol unicode setelah atau sebelum kata dengan warna tertentu untuk membuatnya menonjol. Dan juga kotak atau garis bawahi kata dengan warna lain. Dengan cara ini Anda bisa memiliki 6 warna kata * 6 warna simbol * N kemungkinan simbol. Anda mungkin dapat menemukan 10 simbol yang baik dan memiliki 360 kombinasi. Misalnya Anda bisa mengatakan "bintang kuning biru" untuk merujuk pada kata kucing di sini.

masukkan deskripsi gambar di sini

Jika bintang terlalu menggelegar, Anda bisa berpasangan: kotak, dan dua yang berbeda: garis bawah.

Jadi, Anda bisa merujuk ke pohon kata di sini menggunakan "biru kuning merah" yang akan memberi Anda 216 kombinasi untuk digunakan.

masukkan deskripsi gambar di sini


1
Saya menunggu beberapa saat untuk melihat apakah ada yang akan menemukan trik lain, tapi saya mungkin akan menggunakan warna garis bawah ganda karena menambahkan simbol dapat menghilangkan lekukan. Diterima, terima kasih.
Joseph Garvin

2

Pernahkah Anda mendengar tentang ace-jump-mode ?

Itu tidak memenuhi salah satu persyaratan yang Anda tentukan, tetapi sepertinya sangat cocok dengan apa yang Anda coba capai. Itu akan memungkinkan pengguna untuk menentukan kata apa pun dengan hanya mengucapkan 2 atau 3 kata.

Anda dapat menentukan serangkaian karakter yang ditawarkan kepada Anda, sehingga Anda dapat menghindari konsonan yang sulit dibedakan. Maka penggunaannya bisa saja mengatakan "memperbaiki A sembilan" , dan memperbaiki kata ke-9 yang dimulai dengan a.


Lihat komentar saya di posting tmalsburg mengapa ace-jump-mode tidak berhasil.
Joseph Garvin

1

Pertanyaan menarik. Saya yakin Anda akan mendapatkan beberapa saran menarik.

Satu saran kecil yang muncul pada saya adalah menggunakan warna dan gaya yang berbeda untuk menggarisbawahi. Lihat Elisp manual, simpul Face Attributestentang atribut :underlinedan yang :colordan :stylekomponen.

Anda juga dapat bereksperimen dengan atribut :boxdan lebar serta gaya garis yang berbeda untuk itu, tetapi itu mungkin terlalu menggelikan.


1

Saya akan menjawab dengan mengusulkan cara alternatif untuk memilih kata target. Sorot setengah dari kata-kata (dipilih secara acak). Pengguna mengatakan "ya" jika kata target disorot dan "tidak" sebaliknya. Jika pengguna mengatakan "ya", ambil semua kata yang disorot dan sorot secara acak setengah dari mereka. Jika pengguna mengatakan "tidak", sorot secara acak setengah dari kata-kata yang tidak disorot. Sekali lagi pengguna menunjukkan apakah kata target disorot dengan mengatakan "ya" atau "tidak". Ulangi itu sampai hanya kata target yang disorot.

Beberapa manfaat dari pendekatan ini:

  • Ini berfungsi, tidak peduli berapa banyak kata yang Anda miliki di layar.
  • Anda tidak perlu warna mewah, font, atau simbol. Tampilan monokrom sudah cukup.
  • Beban kognitif sangat rendah karena mudah untuk mengetahui apakah suatu kata disorot atau tidak.

Kekurangan: Anda harus mengatakan "ya" dan "tidak" terlalu sering. Namun, ini diperbaiki oleh variasi ide berikut: jangan menyorot kata-kata tetapi menggunakan warna untuk mereka. Anda mengatakan Anda memiliki 6 warna yang mudah dibedakan. Ini berarti bahwa jika Anda memiliki 100 kata di layar, memilih kata target membutuhkan penamaan rata-rata 2,6 warna. Jika ada 1000 kata, Anda harus memberi nama 3,9 warna rata-rata.


1
Sayangnya jumlah kata yang diucapkan adalah metrik yang menyesatkan. Masalah dengan gaya solusi ini adalah mengandung persepsi / tindakan perjalanan pulang pergi. Saya harus melihat warnanya, kemudian bereaksi, lalu melihat, bereaksi, melihat. Mengucapkan 3 kata tanpa harus berhenti untuk mencari di antara masing-masing adalah harus lebih cepat dalam praktek daripada solusi di mana Anda melakukannya, terutama dengan Naga memiliki latensi yang buruk. Jika round trip ini bukan masalah, saya hanya akan menggunakan ace-jump-mode. Dengan tanda diakritik saya dapat melihat layar sekali dan mengetahui seluruh string dari apa yang perlu saya katakan tanpa harus berhenti sejenak agar Dragon bereaksi setelah setiap kata.
Joseph Garvin

1

Berikut ini adalah contoh menggunakan overlay dengan gambar xpm untuk versi Emacs grafis yang mendukung format gambar xpm. Lebar 11 piksel; 20 piksel tinggi; dan memiliki jumlah 4 warna yang ditentukan pengguna. Saya menggunakan Mac yang menjalankan Snow Leopard 10.6.8 dan jenis huruf yang saya sukai ketika menggunakan Emacs adalah -*-Courier-normal-normal-normal-*-18-*-*-*-m-0-iso10646-1- frame-char-widthadalah 11 dan frame-char-heightadalah 20. Saya telah menambahkan garis kuning vertikal tipis di sebelah kiri huruf kapital "A" sebagai contoh cara menggambar gambar kustom. Substitusi karakter pada titik dapat dibuat secara programatik menggunakan (char-after (point))dan mengambil nomor itu - yang dalam hal ini adalah 65 untuk huruf kapital "A" - dan mengganti variabel yang sesuai - misalnya, (cond ((eq (char-after (point)) 65) cap-ltr-a-xpm) . . .- dan menggunakan variabel itu dalam penempatan hamparan - misalnya,(overlay-put (make-overlay (point) (1+ (point))) 'display cap-ltr-a-xpm). Ini bekerja dengan sangat baik untuk buffer terpotong dan juga dengan bungkus kata karena displayproperti overlay pada karakter di tengah kata tidak menyebabkan bungkus kata berpikir bahwa bagian pertama dari kata tersebut berada di akhir baris sebelumnya. . Tentu saja, perlu waktu untuk membuat pustaka khusus gambar xpm favorit.

ImageMagick mampu menghasilkan xpm semi-akurat dari karakter tertentu berdasarkan keluarga font dan ukuran tertentu, tapi itu tidak setepat yang saya harapkan - di sini adalah tautan ke petunjuk untuk menggunakan utilitas eksternal itu: https: / /stackoverflow.com/a/14168154/2112489 Singkatnya, pengguna harus siap untuk menghabiskan waktu menyesuaikan gambar xpm sesuai dengan keinginannya.

(defun xpm-example ()
(interactive)
"Doc-string"
  (let* (
      (cap-ltr-a-xpm `(image :type xpm :mask nil :ascent center :data
        "/* XPM */
        static char * letters_xpm[] = {
        /* columns rows colors chars-per-pixel */
        /* columns = 1 pixel in width -- see also (frame-char-width) */
        /* rows = 1 pixel in height -- see also (frame-char-height) */
        \"11 20 4 1\",
        \". c #000000\",
        \"+ c #FF0000\",
        \"@ c #7F0000\",
        \"% c yellow\",
        \"%..........\",
        \"%....++....\",
        \"%....++....\",
        \"%..++..++..\",
        \"%..++..++..\",
        \"%++......++\",
        \"%++......++\",
        \"%++......++\",
        \"%++......++\",
        \"%++......++\",
        \"%++......++\",
        \"%++++++++++\",
        \"%++++++++++\",
        \"%++......++\",
        \"%++......++\",
        \"%++......++\",
        \"%++......++\",
        \"%++......++\",
        \"%++......++\",
        \"%..........\"};"))  )
    (overlay-put (make-overlay (point) (1+ (point))) 'display cap-ltr-a-xpm)))

@wasamasa - terima kasih - Saya menghapus pernyataan yang salah tentang bitmap XBM.
hukum
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.