From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Michal Nazarewicz Newsgroups: gmane.emacs.bugs Subject: bug#19338: [PATCHv3 1/2] descr-text: add `describe-char-eldoc' describing character at point Date: Sun, 14 Dec 2014 21:40:47 +0100 Organization: http://mina86.com/ Message-ID: References: <1418313752-13536-1-git-send-email-mpn@google.com> <83egs2xbdy.fsf@gnu.org> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Trace: ger.gmane.org 1418589745 16269 80.91.229.3 (14 Dec 2014 20:42:25 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Sun, 14 Dec 2014 20:42:25 +0000 (UTC) Cc: 19338@debbugs.gnu.org To: Eli Zaretskii Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Sun Dec 14 21:42:19 2014 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1Y0Fze-0000Gp-M7 for geb-bug-gnu-emacs@m.gmane.org; Sun, 14 Dec 2014 21:42:18 +0100 Original-Received: from localhost ([::1]:37096 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Y0Fze-0006xv-72 for geb-bug-gnu-emacs@m.gmane.org; Sun, 14 Dec 2014 15:42:18 -0500 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:33859) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Y0FzV-0006xg-KH for bug-gnu-emacs@gnu.org; Sun, 14 Dec 2014 15:42:15 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Y0FzP-0002FI-2C for bug-gnu-emacs@gnu.org; Sun, 14 Dec 2014 15:42:09 -0500 Original-Received: from debbugs.gnu.org ([140.186.70.43]:36908) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Y0FzO-0002F5-UZ for bug-gnu-emacs@gnu.org; Sun, 14 Dec 2014 15:42:02 -0500 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.80) (envelope-from ) id 1Y0FzO-0004SX-A7 for bug-gnu-emacs@gnu.org; Sun, 14 Dec 2014 15:42:02 -0500 X-Loop: help-debbugs@gnu.org Resent-From: Michal Nazarewicz Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sun, 14 Dec 2014 20:42:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 19338 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch Original-Received: via spool by 19338-submit@debbugs.gnu.org id=B19338.141858966717074 (code B ref 19338); Sun, 14 Dec 2014 20:42:02 +0000 Original-Received: (at 19338) by debbugs.gnu.org; 14 Dec 2014 20:41:07 +0000 Original-Received: from localhost ([127.0.0.1]:46274 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1Y0FyU-0004RJ-0A for submit@debbugs.gnu.org; Sun, 14 Dec 2014 15:41:06 -0500 Original-Received: from mail-wi0-f179.google.com ([209.85.212.179]:47550) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1Y0FyQ-0004Qg-Rz for 19338@debbugs.gnu.org; Sun, 14 Dec 2014 15:41:04 -0500 Original-Received: by mail-wi0-f179.google.com with SMTP id ex7so7155216wid.12 for <19338@debbugs.gnu.org>; Sun, 14 Dec 2014 12:40:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=sender:from:to:cc:subject:in-reply-to:organization:references :user-agent:face:date:message-id:mime-version:content-type :content-transfer-encoding; bh=CN5uMogrIcAzG6+paMUC8G4iaTGZC//BUR+lnlv6uZs=; b=orphj3iMSKB2VJCkF9cUf66j8de9apolVXIbZrFrO8KA0nmo7uKvg5afamx9cze8N/ 4kfcHqa/LmSSKvn5BvqS5q8PHTKe0oQg2SfFsk3oZbru6Rlmfs3bS4pZd1U1CLPeHkkY K7sHD4y+1mXHaeX5su8050XooioezDjjIwyAKuWbxHuB2Ys2RIIqeVfFZC/1yQ7UVH9S Ao/MsnDLLzcyo+F6G5yRWKXVTgJSe2ypDbirW5uTOUT5Q2xrQ0kzywj8qwXLLEfHEFuz fMTYQqAQeLhKR1TejpA3eEJvesvNw74WRlDEHP1VEiwp7+iAEB8aS0TsO89UEcA4TXQw 1gRw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:sender:from:to:cc:subject:in-reply-to :organization:references:user-agent:face:date:message-id :mime-version:content-type:content-transfer-encoding; bh=CN5uMogrIcAzG6+paMUC8G4iaTGZC//BUR+lnlv6uZs=; b=DfJ1aLsXvqS+W5K/CUvnHEC/MoBf3ioFj20AqoAhRtYuCaODml0r8PdalUpGoJyiJ2 HwcfgEzbUPWeVqta4UFuX2eO9JCzpqj4T4nU5S3f+S0hPm13uWm7W24VZEv/NoQoCJKu 5jfwtjIl6nIy/6MRPSLxEglyppX847HOscI+JHpQStHbBnQuFSpcFOUqVaQS/BojQ2h/ LYp55L37kfpV4/MHIxtbHHZnc4JQj2ldUD0ikOlhZdlcKze3y+Y4IadayPE8pKrnPy4b Knxy8O8vqOnL0AlS4LJ6dqAnFI8yr27NDIvVVr7K+8lO209OezsolxCyOQgUyXmT4unh CEtw== X-Gm-Message-State: ALoCoQlkC9/sRmLJh4FFYaVHhcKdR29tgPk+wRvxnTtkhQoGUM0aUvZq//sFOANq0O+42ML+Bza0 X-Received: by 10.180.206.47 with SMTP id ll15mr26308592wic.34.1418589656985; Sun, 14 Dec 2014 12:40:56 -0800 (PST) Original-Received: from mpn-glaptop.roam.corp.google.com (65-224.197-178.cust.bluewin.ch. [178.197.224.65]) by mx.google.com with ESMTPSA id w10sm10468623wje.10.2014.12.14.12.40.54 for (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Sun, 14 Dec 2014 12:40:55 -0800 (PST) In-Reply-To: <83egs2xbdy.fsf@gnu.org> User-Agent: Notmuch/0.19~rc1+1~g03aea4f (http://notmuchmail.org) Emacs/25.0.50.1 (x86_64-unknown-linux-gnu) X-Face: PbkBB1w#)bOqd`iCe"Ds{e+!C7`pkC9a|f)Qo^BMQvy\q5x3?vDQJeN(DS?|-^$uMti[3D*#^_Ts"pU$jBQLq~Ud6iNwAw_r_o_4]|JO?]}P_}Nc&"p#D(ZgUb4uCNPe7~a[DbPG0T~!&c.y$Ur,=N4RT>]dNpd; KFrfMCylc}gc??'U2j,!8%xdD Face: iVBORw0KGgoAAAANSUhEUgAAADAAAAAwBAMAAAClLOS0AAAAJFBMVEWbfGlUPDDHgE57V0jUupKjgIObY0PLrom9mH4dFRK4gmjPs41MxjOgAAACQElEQVQ4jW3TMWvbQBQHcBk1xE6WyALX1069oZBMlq+ouUwpEQQ6uRjttkWP4CmBgGM0BQLBdPFZYPsyFUo6uEtKDQ7oy/U96XR2Ux8ehH/89Z6enqxBcS7Lg81jmSuujrfCZcLI/TYYvbGj+jbgFpHJ/bqQAUISj8iLyu4LuFHJTosxsucO4jSDNE0Hq3hwK/ceQ5sx97b8LcUDsILfk+ovHkOIsMbBfg43VuQ5Ln9YAGCkUdKJoXR9EclFBhixy3EGVz1K6eEkhxCAkeMMnqoAhAKwhoUJkDrCqvbecaYINlFKSRS1i12VKH1XpUd4qxL876EkMcDvHj3s5RBajHHMlA5iK32e0C7VgG0RlzFPvoYHZLRmAC0BmNcBruhkE0KsMsbEc62ZwUJDxWUdMsMhVqovoT96i/DnX/ASvz/6hbCabELLk/6FF/8PNpPCGqcZTGFcBhhAaZZDbQPaAB3+KrWWy2XgbYDNIinkdWAFcCpraDE/knwe5DBqGmgzESl1p2E4MWAz0VUPgYYzmfWb9yS4vCvgsxJriNTHoIBz5YteBvg+VGISQWUqhMiByPIPpygeDBE6elD973xWwKkEiHZAHKjhuPsFnBuArrzxtakRcISv+XMIPl4aGBUJm8Emk7qBYU8IlgNEIpiJhk/No24jHwkKTFHDWfPniR 4iw5vJaw2nzSjfq2zffcE/GDjRC2dn0J0XwPAbDL84TvaFCJEU4Oml9pRyEUhR3Cl2t01AoEjRbs0sYugp14/4X5n4pU4EHHnMAAAAAElFTkSuQmCC X-PGP: 50751FF4 X-PGP-FP: AC1F 5F5C D418 88F8 CC84 5858 2060 4012 5075 1FF4 X-Hashcash: 1:20:141214:monnier@iro.umontreal.ca::itdohZ+elAf9vqYk:000000000000000000000000000000000000014NX X-Hashcash: 1:20:141214:19338@debbugs.gnu.org::sleRYzJWjJftNceB:00000000000000000000000000000000000000007gYD X-Hashcash: 1:20:141214:eliz@gnu.org::XEvcJsbSPXPf/U5R:00000CQqD X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.15 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 140.186.70.43 X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.bugs:97336 Archived-At: * lisp/descr-text.el (describe-char-eldoc): New function returning basic Unicode codepoint information (e.g. name) about character at point. It is meant to be used as a default value of the `eldoc-documentation-function' variable. (describe-char-eldoc--format, describe-char-eldoc--truncate): New helper functions for `describe-char-eldoc' function. * tests/automated/descr-text-test.el: New file with tests for `describe-char-eldoc--truncate', `describe-char-eldoc--format', and `describe-char-eldoc'. --- etc/NEWS | 8 +++- lisp/descr-text.el | 97 +++++++++++++++++++++++++++++++++++= ++++ test/automated/descr-text-test.el | 94 +++++++++++++++++++++++++++++++++++= ++ 3 files changed, 197 insertions(+), 2 deletions(-) create mode 100644 test/automated/descr-text-test.el >> + (let ((ellipsis (and (cdr last) "=E2=80=A6"))) On Sun, Dec 14 2014, Eli Zaretskii wrote: > Btw, will this display OK on a TTY? Not all TTYs support UTF-8. It will if TTY supports UTF-8. ;) Perhaps it's not a problem on TTYs that do not because people are unlikely to open documents using Unicode on such TTYs? I used =E2=80=9C=E2=80=A6=E2=80=9D because it's a single character so it do= es not carve cut that much from the WIDTH (alternative =E2=80=9C...=E2=80=9D would be three chara= cters). In any event, changed it to =E2=80=9C...=E2=80=9D. diff --git a/etc/NEWS b/etc/NEWS index e5656fa..53dc795 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -218,8 +218,12 @@ typing RET. result of the calculation into the current buffer. =20 ** ElDoc -*** New minor mode global-eldoc-mode -*** eldoc-documentation-function now defaults to nil +*** New minor mode `global-eldoc-mode' +*** `eldoc-documentation-function' now defaults to `ignore' +*** `describe-char-eldoc' displays information about character at point, +and can be used as a default value of `eldoc-documentation-function'. It = is +useful when, for example, one needs to distinguish various spaces (e.g. ]= =C2=A0[, +]=E2=80=82[, ]=E2=80=89[, etc.) while using mono-spaced font. =20 ** eww =20 diff --git a/etc/NEWS b/etc/NEWS index e5656fa..53dc795 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -218,8 +218,12 @@ typing RET. result of the calculation into the current buffer. =20 ** ElDoc -*** New minor mode global-eldoc-mode -*** eldoc-documentation-function now defaults to nil +*** New minor mode `global-eldoc-mode' +*** `eldoc-documentation-function' now defaults to `ignore' +*** `describe-char-eldoc' displays information about character at point, +and can be used as a default value of `eldoc-documentation-function'. It = is +useful when, for example, one needs to distinguish various spaces (e.g. ]= =C2=A0[, +]=E2=80=82[, ]=E2=80=89[, etc.) while using mono-spaced font. =20 ** eww =20 diff --git a/lisp/descr-text.el b/lisp/descr-text.el index 1dc43e9..56f5866 100644 --- a/lisp/descr-text.el +++ b/lisp/descr-text.el @@ -825,6 +825,102 @@ relevant to POS." =20 (define-obsolete-function-alias 'describe-char-after 'describe-char "22.1") =20 +;;; Describe-Char-ElDoc + +(defun describe-char-eldoc--truncate (name width) + "Truncate NAME at white spaces such that it is no longer than WIDTH. + +Split NAME on white space character and return string with as +many leading words of NAME as possible without exceeding WIDTH +characters. If NAME consists of white space characters only, +return an empty string. Three dots (\"...\") are appended to +returned string if some of the words from NAME have been omitted. + +NB: Function may return string longer than WIDTH if name consists +of a single word, or it's first word is longer than WIDTH +characters." + (let ((words (split-string name))) + (if words + (let ((last words)) + (setq width (- width (length (car words)))) + (while (and (cdr last) + (<=3D (+ (length (cadr last)) (if (cddr last) 4 1)) = width)) + (setq last (cdr last)) + (setq width (- width (length (car last)) 1))) + (let ((ellipsis (and (cdr last) "..."))) + (setcdr last nil) + (concat (mapconcat 'identity words " ") ellipsis))) + ""))) + +(defun describe-char-eldoc--format (ch &optional width) + "Format a description for character CH which is no more than WIDTH chara= cters. + +Full description message has a \"U+HEX: NAME (GC: GENERAL-CATEGORY)\" +format where: +- HEX is a hexadecimal codepoint of the character (zero-padded to at + least four digits), +- NAME is name of the character. +- GC is a two-letter abbreviation of the general-category of the + character, and +- GENERAL-CATEGORY is full name of the general-category of the + character. + +If WIDTH is non-nil some elements of the description may be +omitted to accommodate the length restriction. Under certain +condition, the function may return string longer than WIDTH, see +`describe-char-eldoc--truncate'." + (let ((name (get-char-code-property ch 'name))) + (when name + (let* ((code (propertize (format "U+%04X" ch) + 'face 'font-lock-constant-face)) + (gc (get-char-code-property ch 'general-category)) + (gc-desc (char-code-property-description 'general-category gc= ))) + + (unless (or (not width) (<=3D (length name) width)) + (setq name (describe-char-eldoc--truncate name width))) + (setq name (concat (substring name 0 1) (downcase (substring name = 1)))) + (setq name (propertize name 'face 'font-lock-variable-name-face)) + + (setq gc (propertize (symbol-name gc) 'face 'font-lock-comment-fac= e)) + (when gc-desc + (setq gc-desc (propertize gc-desc 'face 'font-lock-comment-face)= )) + + (let ((lcode (length code)) + (lname (length name)) + (lgc (length gc)) + (lgc-desc (and gc-desc (length gc-desc)))) + (cond + ((and gc-desc + (or (not width) (<=3D (+ lcode lname lgc lgc-desc 7) widt= h))) + (concat code ": " name " (" gc ": " gc-desc ")")) + ((and gc-desc (<=3D (+ lcode lname lgc-desc 5) width)) + (concat code ": " name " (" gc-desc ")")) + ((or (not width) (<=3D (+ lcode lname lgc 5) width)) + (concat code ": " name " (" gc ")")) + ((<=3D (+ lname lgc 3) width) + (concat name " (" gc ")")) + (t name))))))) + +;;;###autoload +(defun describe-char-eldoc () + "Return a description of character at point for use by ElDoc mode. + +Return nil if character at point is a printable ASCII +character (i.e. codepoint between 32 and 127 inclusively). +Otherwise return a description formatted by +`describe-char-eldoc--format' function taking into account value +of `eldoc-echo-area-use-multiline-p' variable and width of +minibuffer window for width limit. + +This function is meant to be used as a value of +`eldoc-documentation-function' variable." + (let ((ch (following-char))) + (when (and (not (zerop ch)) (or (< ch 32) (> ch 127))) + (describe-char-eldoc--format + ch + (unless (eq eldoc-echo-area-use-multiline-p t) + (1- (window-width (minibuffer-window)))))))) + (provide 'descr-text) =20 ;;; descr-text.el ends here diff --git a/test/automated/descr-text-test.el b/test/automated/descr-text-= test.el new file mode 100644 index 0000000..81ae727 --- /dev/null +++ b/test/automated/descr-text-test.el @@ -0,0 +1,94 @@ +;;; descr-text-test.el --- ERT tests for descr-text.el -*- lexical-binding= : t -*- + +;; Copyright (C) 2014 Free Software Foundation, Inc. + +;; Author: Michal Nazarewicz + +;; This file is part of GNU Emacs. + +;; GNU Emacs is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; GNU Emacs is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs. If not, see . + +;;; Commentary: + +;; This package defines regression tests for the descr-text package. + +;;; Code: + +(require 'ert) +(require 'descr-text) + + +(ert-deftest descr-text-test-truncate () + "Tests describe-char-eldoc--truncate function." + (should (equal "" + (describe-char-eldoc--truncate " \t \n" 100))) + (should (equal "foo" + (describe-char-eldoc--truncate "foo" 1))) + (should (equal "foo..." + (describe-char-eldoc--truncate "foo wilma fred" 0))) + (should (equal "foo..." + (describe-char-eldoc--truncate + "foo wilma fred" (length "foo wilma")))) + (should (equal "foo wilma..." + (describe-char-eldoc--truncate + "foo wilma fred" (+ 3 (length "foo wilma"))))) + (should (equal "foo wilma..." + (describe-char-eldoc--truncate + "foo wilma fred" (1- (length "foo wilma fred"))))) + (should (equal "foo wilma fred" + (describe-char-eldoc--truncate + "foo wilma fred" (length "foo wilma fred")))) + (should (equal "foo wilma fred" + (describe-char-eldoc--truncate + " foo\t wilma \nfred\t " (length "foo wilma fred"))))) + +(ert-deftest descr-text-test-format-desc () + "Tests describe-char-eldoc--format function." + (should (equal "U+2026: Horizontal ellipsis (Po: Punctuation, Other)" + (describe-char-eldoc--format ?=E2=80=A6))) + (should (equal "U+2026: Horizontal ellipsis (Punctuation, Other)" + (describe-char-eldoc--format ?=E2=80=A6 51))) + (should (equal "U+2026: Horizontal ellipsis (Po)" + (describe-char-eldoc--format ?=E2=80=A6 40))) + (should (equal "Horizontal ellipsis (Po)" + (describe-char-eldoc--format ?=E2=80=A6 30))) + (should (equal "Horizontal ellipsis" + (describe-char-eldoc--format ?=E2=80=A6 20))) + (should (equal "Horizontal..." + (describe-char-eldoc--format ?=E2=80=A6 10)))) + +(ert-deftest descr-text-test-desc () + "Tests describe-char-eldoc function." + (with-temp-buffer + (insert "a=E2=80=A6") + (goto-char (point-min)) + (should (eq ?a (following-char))) ; make sure we are where we think we= are + ;; Function should return nil for an ASCII character. + (should (not (describe-char-eldoc))) + + (goto-char (1+ (point))) + (should (eq ?=E2=80=A6 (following-char))) + (let ((eldoc-echo-area-use-multiline-p t)) + ;; Function should return description of an Unicode character. + (should (equal "U+2026: Horizontal ellipsis (Po: Punctuation, Other)" + (describe-char-eldoc)))) + + (goto-char (point-max)) + ;; At the end of the buffer, function should return nil and not blow u= p. + (should (not (describe-char-eldoc))))) + + +(provide 'descr-text-test) + +;;; descr-text-test.el ends here --=20 2.2.0.rc0.207.ga3a616c