Những cách để hiển thị văn bản khác nhau?


12

Tôi đang viết một phần mở rộng emacs để sử dụng với nhận dạng giọng nói và tôi đang tìm kiếm sự trợ giúp với một tính năng cụ thể. Một số từ mà trình nhận dạng giọng nói (Rồng) nhận ra luôn kém - không quan trọng bạn luyện nó bao nhiêu lần, nó sẽ chỉ nhận ra một số từ nhất định. Đồng thời thông thường khi bạn viết về một chủ đề hoặc khi viết mã, bạn sẽ sử dụng nhiều từ giống nhau nhiều lần.

Vì vậy, tôi đã viết một chế độ sử dụng lớp phủ để thay đổi cách hiển thị các từ trong bộ đệm. Nó lấy một chữ cái ngẫu nhiên trong từ, gạch chân nó trong một màu ngẫu nhiên và đặt một dấu phụ ngẫu nhiên (dấu, âm sắc, v.v.) trên đầu của nó. Đây là một ảnh chụp màn hình (có thể bạn sẽ cần phải phóng to để xem các dấu / gạch chân):

nhập mô tả hình ảnh ở đây

Sau đó, bạn có thể nói, "tóc p màu tím" và nó sẽ tìm từ có gạch dưới màu tím dưới 'a' với dấu phụ, trông giống như tóc và gõ từ đó cho bạn. Vì vậy, trong ảnh chụp màn hình ở trên nói rằng điều đó sẽ khiến emacs gõ "regrec-quote" cho bạn.

Ý tưởng là điều này cho phép bạn tham khảo bất kỳ từ nào bạn đã sử dụng trên màn hình bằng cách sử dụng một bộ từ hữu hạn mà bộ nhận dạng luôn nhận biết tốt.

Nó hoạt động khá tốt, ngoại trừ thỉnh thoảng có một vụ va chạm. Để làm cho nó để tôi có thể học cách liên tục tham chiếu các từ giống như cách tôi đang sử dụng byte từ hàm băm md5 của từ thay vì (random)hoặc có một thuật toán gán các thay đổi để tránh va chạm. Tôi chỉ tìm thấy 6 màu dễ phân biệt (thật khó khi phần gạch chân chỉ rộng một ký tự và dày một pixel) và 3 dấu phụ dễ phân biệt (dễ phân biệt với nhau và cũng không thể nhầm lẫn với phần gạch chân ở trên dòng hoặc chồng chéo với phần gạch chân), nhìn thấy ở đầu nguồn ở trên.

Tôi cần nhiều cách hơn để thay đổi kết xuất để giảm tần suất va chạm. Lý tưởng nhất là sửa đổi kết xuất sẽ:

  • Không được chói tai từ phần còn lại của văn bản. Điều này đã khiến tôi loại bỏ, ví dụ như thuộc tính video nghịch đảo.
  • Không dễ bị nhầm lẫn với những thay đổi khác. Đường viền dễ bị nhầm với đường gạch chân trên dòng trước. Rất nhiều dấu phụ trông giống nhau trừ khi kích thước phông chữ của bạn là rất lớn.
  • Được không gian gần nơi thay đổi khác. Ngay bây giờ một khi mắt tôi tìm thấy nhân vật nhắm mục tiêu, tất cả thông tin đều ở đó, điểm đánh dấu, gạch chân và chữ cái.
  • Hoạt động độc đáo với phông chữ có chiều rộng cố định (cần để mã hóa) thể hiện chính xác các dấu phụ (tôi phải chuyển sang DejaVu Sans Mono từ Consolas để có các dấu được hiển thị chính xác)
  • Làm việc trên các chữ cái bảng chữ cái Latin. Ví dụ, có các dấu kết hợp tiếng Ả Rập, nhưng chúng không kết hợp trên các ký tự bảng chữ cái Latinh.
  • Không thay đổi màu chữ, vì nó đã được sử dụng để tô sáng cú pháp.
  • Trên thực tế có thể thực hiện được trong emacs với emacs lisp;)

Có lẽ có những ký tự unicode đặc biệt kiểm soát kết xuất có thể bị lạm dụng để mở ra những khả năng mới? Hoặc một cách để làm dày gạch chân để tôi có thể dễ dàng phân biệt nhiều màu sắc hơn? Hoặc một số tính năng emacs tối nghĩa khác cho phép bạn hiển thị dấu trên đầu các ký tự bên cạnh unicode?


Không phải là một câu trả lời trực tiếp cho câu hỏi của bạn, nhưng có lẽ một vài ý tưởng sử dụng lớp phủ để đưa ra sự xuất hiện của nhân vật mới. Một ý tưởng sẽ là ghép / kẹp hai lớp lại với nhau - buộc chúng phải nằm trong cùng một không gian như một ký tự thông thường - ví dụ: ký tự đầu tiên là một đường mỏng có thêm màu (char-to-string ?\uFEFF)và cái còn lại là ký tự đích bị giảm kích thước để cả hai phù hợp. Một ý tưởng khác là sử dụng một cú đánh thẳng đứng (có sẵn trong một số phông chữ, nhưng không phải tất cả) tương tự như những gì được sử dụng trong thư viện vline.el emacswiki.org/emacs/VlineMode
luật

@lawlist: Ý tưởng dòng unicode đó rất thú vị, nó sẽ cho phép tôi thực hiện một 'bên lề'. Bạn có biết làm thế nào để giảm kích thước của nhân vật sau không? Tôi có thể có thể tạo một hình ảnh để sử dụng với thuộc tính hiển thị nhưng AFAICT không có cách nào để emacs kết xuất văn bản thành hình ảnh, vì vậy tôi phải tạo hình ảnh bên ngoài emacs.
Joseph Garvin

Nhận xét này thay thế cho nhận xét trước đó (mà tôi đã xóa) và mã trong liên kết sau cũng đã được cập nhật - nó chứa ba ví dụ (một trong số đó giống hệt với câu trả lời mà tôi đã đăng bên dưới trong luồng hiện tại): stackoverflow .com / câu hỏi / 23744237 /
Hoài

Câu trả lời:


4

Một khả năng khác là hiển thị số dòng và nói số dòng trước từ đó, hoặc, vì nhìn qua để có được số dòng chính xác sẽ gây khó chịu, bạn có thể tìm kiếm thuật toán trong khoảng + hoặc - 5 hoặc 10 dòng số bạn Nói.

Hoặc có thể khai báo một khu vực hoặc chức năng mà bạn đang làm việc và có tất cả các tìm kiếm chỉ nhìn ở đó. Tôi đoán rằng sẽ hạn chế va chạm.

Bạn cũng có thể hiển thị các ký hiệu unicode sau hoặc trước một từ trong một màu nhất định để giúp chúng nổi bật. Và cũng hộp hoặc gạch chân từ trong màu khác. Bằng cách này, bạn có thể có 6 màu từ * 6 màu biểu tượng * Khả năng biểu tượng N. Bạn có thể có thể tìm thấy 10 biểu tượng tốt và có 360 kết hợp. Ví dụ, bạn có thể nói "ngôi sao màu vàng xanh" để chỉ từ mèo ở đây.

nhập mô tả hình ảnh ở đây

Nếu ngôi sao quá chói tai, bạn có thể ghép đôi: hộp và hai loại khác nhau: gạch chân.

Vì vậy, bạn có thể tham khảo cây từ ở đây bằng cách sử dụng "màu xanh vàng đỏ" sẽ cung cấp cho bạn 216 kết hợp để sử dụng.

nhập mô tả hình ảnh ở đây


1
Tôi đã đợi một lúc để xem liệu có ai sẽ nghĩ ra các thủ thuật khác không, nhưng có lẽ tôi sẽ đi với màu gạch chân đôi vì việc thêm các biểu tượng có thể làm thụt ra. Chấp nhận, cảm ơn.
Joseph Garvin

2

Bạn đã nghe nói về ace-jump-mode ?

Nó không đáp ứng bất kỳ yêu cầu nào bạn chỉ định, nhưng có vẻ như nó phù hợp hoàn hảo với những gì bạn đang cố gắng đạt được. Nó sẽ cho phép người dùng chỉ định bất kỳ từ nào bằng cách chỉ nói 2 hoặc 3 từ.

Bạn có thể xác định tập hợp các ký tự mà nó cung cấp cho bạn, vì vậy bạn có thể tránh các phụ âm khó phân biệt. Sau đó, việc sử dụng chỉ có thể nói "sửa lỗi A chín" và sửa từ thứ 9 bắt đầu bằng a.


Xem nhận xét của tôi trên bài đăng của tmalsburg để biết lý do tại sao chế độ ace-jump không hoạt động.
Joseph Garvin

1

Câu hỏi thú vị. Tôi cá là bạn sẽ nhận được một số gợi ý thú vị.

Một gợi ý nhỏ xảy ra với tôi là sử dụng các màu sắc và kiểu dáng khác nhau để gạch chân. Xem elisp dẫn sử dụng, nút Face Attributesvề thuộc tính :underlinevà nó :color:stylecác thành phần.

Bạn cũng có thể thử nghiệm với thuộc tính :boxvà các độ rộng và kiểu đường khác nhau cho nó, nhưng điều đó có lẽ quá chói tai.


1

Tôi sẽ trả lời bằng cách đề xuất một cách khác để chọn từ mục tiêu. Đánh dấu một nửa số từ (được chọn ngẫu nhiên). Người dùng nói "có" nếu từ đích được tô sáng và "không" nếu không. Nếu người dùng nói "có", hãy lấy tất cả các từ được tô sáng và tô sáng ngẫu nhiên một nửa trong số đó. Nếu người dùng nói "không", hãy đánh dấu ngẫu nhiên một nửa số từ không được tô sáng. Một lần nữa, người dùng cho biết liệu từ mục tiêu được tô sáng bằng cách nói "có" hoặc "không". Lặp lại điều đó cho đến khi chỉ từ mục tiêu được tô sáng.

Một số lợi ích của phương pháp này:

  • Điều này hoạt động, cho dù bạn có bao nhiêu từ trên màn hình.
  • Bạn không cần màu sắc, phông chữ hoặc biểu tượng ưa thích. Một màn hình đơn sắc là đủ.
  • Tải nhận thức rất thấp vì dễ dàng cho biết một từ được tô sáng hay không.

Nhược điểm: Bạn phải nói "có" và "không" quá thường xuyên. Tuy nhiên, điều này được khắc phục bằng biến thể sau đây của ý tưởng: không làm nổi bật các từ mà sử dụng màu sắc cho chúng. Bạn nói rằng bạn có 6 màu dễ phân biệt. Điều này có nghĩa là nếu bạn có 100 từ trên màn hình, việc chọn từ mục tiêu trung bình yêu cầu đặt tên 2,6 màu. Nếu có 1000 từ, bạn phải đặt tên trung bình 3,9 màu.


1
Thật không may số từ được nói là một số liệu sai lệch. Vấn đề với phong cách giải pháp này là nó chứa các chuyến đi vòng quanh nhận thức / hành động. Tôi phải xem màu, rồi phản ứng, rồi xem, phản ứng, thấy. Nói 3 từ mà không phải dừng lại để nhìn vào giữa mỗi từ phải nhanh hơn thực tế so với giải pháp mà bạn làm, đặc biệt là với Dragon có độ trễ kém. Nếu những chuyến đi khứ hồi này không phải là vấn đề, tôi chỉ cần sử dụng chế độ ace-jump. Với các dấu phụ, tôi có thể nhìn vào màn hình một lần và biết toàn bộ chuỗi những gì tôi cần nói mà không phải tạm dừng để Dragon phản ứng sau mỗi từ.
Joseph Garvin

1

Sau đây là một ví dụ sử dụng lớp phủ có hình ảnh xpm cho các phiên bản Emacs đồ họa hỗ trợ định dạng hình ảnh xpm. Nó rộng 11 pixel; Cao 20 pixel; và có số lượng người dùng chỉ định gồm 4 màu có thể. Tôi đang dùng Mac chạy Snow Leopard 10.6.8 và phông chữ tôi thích khi sử dụng Emacs là -*-Courier-normal-normal-normal-*-18-*-*-*-m-0-iso10646-1- frame-char-width11 và frame-char-height20. Tôi đã thêm một dòng màu vàng dọc mỏng ở bên trái của chữ in hoa "A" là một ví dụ về cách vẽ hình ảnh tùy chỉnh. Việc thay thế ký tự tại điểm có thể được lập trình bằng cách sử dụng (char-after (point))và lấy số đó - trong trường hợp này là 65 cho chữ in hoa "A" - và thay thế biến thích hợp - ví dụ: (cond ((eq (char-after (point)) 65) cap-ltr-a-xpm) . . .- và sử dụng biến đó trong vị trí lớp phủ - ví dụ:(overlay-put (make-overlay (point) (1+ (point))) 'display cap-ltr-a-xpm). Điều này hoạt động rất tốt cho cả bộ đệm bị cắt cụt và cả với tính năng bao bọc từ vì thuộc tính displaylớp phủ trên một ký tự ở giữa từ không khiến cho từ bao bọc nghĩ rằng phần đầu của từ thuộc về cuối dòng trước . Tất nhiên, sẽ mất thời gian để tạo một thư viện tùy chỉnh các hình ảnh xpm yêu thích.

ImageMagick có khả năng tạo ra một xpm bán chính xác của một ký tự cụ thể dựa trên một họ phông chữ cụ thể, nhưng nó không chính xác như tôi mong đợi - đây là liên kết đến các hướng dẫn sử dụng tiện ích bên ngoài đó: https: / /stackoverflow.com/a/14168154/2112361 Tóm lại, người dùng nên chuẩn bị dành thời gian để tùy chỉnh các hình ảnh xpm theo ý thích của mình.

(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 - cảm ơn bạn - Tôi đã xóa tuyên bố sai lầm liên quan đến bitmap XBM.
luật
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.