From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED!not-for-mail From: Tino Calancha Newsgroups: gmane.emacs.devel Subject: Re: tabulated-list: extend truncation into next align-right col Date: Sat, 05 Nov 2016 01:53:31 +0900 Message-ID: <87fun7kwz8.fsf@gmail.com> References: <87k2cjl3cw.fsf@gmail.com> NNTP-Posting-Host: blaine.gmane.org Mime-Version: 1.0 Content-Type: text/plain X-Trace: blaine.gmane.org 1478278554 10263 195.159.176.226 (4 Nov 2016 16:55:54 GMT) X-Complaints-To: usenet@blaine.gmane.org NNTP-Posting-Date: Fri, 4 Nov 2016 16:55:54 +0000 (UTC) User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.0.50 (gnu/linux) Cc: tino.calancha@gmail.com, emacs-devel@gnu.org To: Tino Calancha Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Fri Nov 04 17:55:50 2016 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by blaine.gmane.org with esmtp (Exim 4.84_2) (envelope-from ) id 1c2hm8-0008RL-AZ for ged-emacs-devel@m.gmane.org; Fri, 04 Nov 2016 17:55:32 +0100 Original-Received: from localhost ([::1]:39964 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1c2hmB-0000b6-95 for ged-emacs-devel@m.gmane.org; Fri, 04 Nov 2016 12:55:35 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:41191) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1c2hkW-00086a-7X for emacs-devel@gnu.org; Fri, 04 Nov 2016 12:53:53 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1c2hkR-0005cD-QC for emacs-devel@gnu.org; Fri, 04 Nov 2016 12:53:52 -0400 Original-Received: from mail-pf0-x231.google.com ([2607:f8b0:400e:c00::231]:36361) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1c2hkR-0005ay-BS for emacs-devel@gnu.org; Fri, 04 Nov 2016 12:53:47 -0400 Original-Received: by mail-pf0-x231.google.com with SMTP id 189so54753716pfz.3 for ; Fri, 04 Nov 2016 09:53:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:subject:references:cc:date:in-reply-to:message-id :user-agent:mime-version; bh=dUl1qiv5Zr4dxiiHP7TOgCowezIBLDl9XwUFQxMFxJs=; b=cUf3ATb9oZ/TUsaf2ZWsdDhxutwB2amPBPRT0SF8mBIpb3pMRlLGDbhIUkuy2W/bXi UkKP5piNftB8Qac7GBJEkatsXGRtTCfuJhMp8rfAub9hben46hB1WTEhFY/ZESPyXoqy u4qwzZtz61DrV+8wkhQQOZEiPTi0BZnjZML5s7DoY5yNd3HHlY7C48EYBzJ4hPAoJ7ig d9EuXi/qUXFw5/GHMD77s5Q6Mtv9Joxm91q2HK3+pHZ5SbxHv2v1CoU+lFYY7ECHw/++ SRpJCLmaY9imFJQxwqZWVB8cFmO8+338LGtA0sMRWD/hMqeCCKtCbo8TsYJDrJucog0D 3Y3g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:subject:references:cc:date:in-reply-to :message-id:user-agent:mime-version; bh=dUl1qiv5Zr4dxiiHP7TOgCowezIBLDl9XwUFQxMFxJs=; b=nGdadQykKfu06cyROCZiy+jbiQL7Mvj3K75gwWBjmuw6vrfTZ1x4aA08ca6Kle4RGm rdSyBfCDHYgxgGXY4sfPTO6zJK+5VowpL4Brsgi9p+PpDHf6H6AuHXtwBl9dfG6TCM7j IHXmj9NhGAWiBM5jvlnMm4Yx4cWH0xEB+dWpbiE9CWt60nVIAOQeBIgvnXWHSQTSp9sP 8RI3tkEbtWi06sD2qrr6PT8CzvQdsL3YNXr1jwYy8ktMisEOwHBAMi7XyQqTH9hykgkr /UX5rJ1WWPKI9kzkF15WWotfcHt8JtTIY/aMsqHnQSxi82Cv10UMn2Wr2ifLNhvP+rQs bEMQ== X-Gm-Message-State: ABUngveUZQ1y0LNPfI+jFNl9tsUSRQhLAS0ogCA23A/B0kmn3XHTnU5MviEDGsUpeKXO3w== X-Received: by 10.98.77.1 with SMTP id a1mr28457543pfb.160.1478278425428; Fri, 04 Nov 2016 09:53:45 -0700 (PDT) Original-Received: from calancha-pc (57.92.100.220.dy.bbexcite.jp. [220.100.92.57]) by smtp.gmail.com with ESMTPSA id q28sm21653198pfj.73.2016.11.04.09.53.43 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Fri, 04 Nov 2016 09:53:44 -0700 (PDT) In-Reply-To: <87k2cjl3cw.fsf@gmail.com> (Tino Calancha's message of "Fri, 04 Nov 2016 23:35:43 +0900") X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2607:f8b0:400e:c00::231 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Original-Sender: "Emacs-devel" Xref: news.gmane.org gmane.emacs.devel:209155 Archived-At: Tino Calancha writes: > I have tested the new patch (see below) with: > > (benchmark-run-compiled 1 > (with-current-buffer "*Packages*" > (let ((inhibit-read-only t)) (erase-buffer)) > (tabulated-list-print))) Well, in previous patch i need to change (dolist (elt entries) by (while entries because i refer sometimes to the variable `entries'. This change doesn't affect previous benchmark numbers. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; >From 366cbd3db74890cfb3cab006d6403b75027d55f0 Mon Sep 17 00:00:00 2001 From: Tino Calancha Date: Sat, 5 Nov 2016 01:45:34 +0900 Subject: [PATCH] tabulated-list: extend truncation into next align-right column See discussion on: https://lists.gnu.org/archive/html/emacs-devel/2016-10/msg01101.html * lisp/emacs-lisp/tabulated-list.el (tabulated-list--near-rows): New variable. (tabulated-list-print, tabulated-list-set-col): Use it. (tabulated-list--col-local-max-widths): New defsubst. (tabulated-list-print-col): Use it. If the next column is align-right, and has some space left then don't truncate to width, use some of the available space from the next column. --- lisp/emacs-lisp/tabulated-list.el | 61 +++++++++++++++++++++++++++++++-------- 1 file changed, 49 insertions(+), 12 deletions(-) diff --git a/lisp/emacs-lisp/tabulated-list.el b/lisp/emacs-lisp/tabulated-list.el index 00b029d..cf297f1 100644 --- a/lisp/emacs-lisp/tabulated-list.el +++ b/lisp/emacs-lisp/tabulated-list.el @@ -102,6 +102,8 @@ tabulated-list-printer object identifying the entry, and COLS is a vector of column descriptors, as documented in `tabulated-list-entries'.") +(defvar tabulated-list--near-rows) + (defvar-local tabulated-list-sort-key nil "Sort key for the current Tabulated List mode buffer. If nil, no additional sorting is performed. @@ -298,6 +300,14 @@ tabulated-list--get-sorter (lambda (a b) (not (funcall sorter a b))) sorter)))) +(defsubst tabulated-list--col-local-max-widths (col) + "Return maximum entry widths at column COL around current row. +Check the current row, the previous one and the next row." + (apply #'max (mapcar (lambda (x) + (let ((nt (elt x col))) + (string-width (if (stringp nt) nt (car nt))))) + tabulated-list--near-rows))) + (defun tabulated-list-print (&optional remember-pos update) "Populate the current Tabulated List mode buffer. This sorts the `tabulated-list-entries' list if sorting is @@ -340,8 +350,14 @@ tabulated-list-print (unless tabulated-list-use-header-line (tabulated-list-print-fake-header))) ;; Finally, print the resulting list. - (dolist (elt entries) - (let ((id (car elt))) + (while entries + (let* ((elt (car entries)) + (tabulated-list--near-rows + (list + (or (tabulated-list-get-entry (point-at-bol 0)) (cadr elt)) + (cadr elt) + (or (cadr (cadr entries)) (cadr elt)))) + (id (car elt))) (and entry-id (equal entry-id id) (setq entry-id nil @@ -368,7 +384,8 @@ tabulated-list-print (t t))) (let ((old (point))) (forward-line 1) - (delete-region old (point))))))) + (delete-region old (point)))))) + (setq entries (cdr entries))) (set-buffer-modified-p nil) ;; If REMEMBER-POS was specified, move to the "old" location. (if saved-pt @@ -402,8 +419,6 @@ tabulated-list-print-col N is the column number, COL-DESC is a column descriptor (see `tabulated-list-entries'), and X is the column number at point. Return the column number after insertion." - ;; TODO: don't truncate to `width' if the next column is align-right - ;; and has some space left. (let* ((format (aref tabulated-list-format n)) (name (nth 0 format)) (width (nth 1 format)) @@ -414,12 +429,29 @@ tabulated-list-print-col (label-width (string-width label)) (help-echo (concat (car format) ": " label)) (opoint (point)) - (not-last-col (< (1+ n) (length tabulated-list-format)))) + (not-last-col (< (1+ n) (length tabulated-list-format))) + available-space) + (when not-last-col + (let* ((next-col-format (aref tabulated-list-format (1+ n))) + (next-col-right-align (plist-get (nthcdr 3 next-col-format) + :right-align)) + (next-col-width (nth 1 next-col-format))) + (setq available-space + (if (and (not right-align) + next-col-right-align) + (- + (+ width next-col-width) + (min next-col-width + (tabulated-list--col-local-max-widths (1+ n)))) + width)))) ;; Truncate labels if necessary (except last column). - (and not-last-col - (> label-width width) - (setq label (truncate-string-to-width label width nil nil t) - label-width width)) + ;; Don't truncate to `width' if the next column is align-right + ;; and has some space left, truncate to `available-space' instead. + (when (and not-last-col + (> label-width available-space) + (setq label (truncate-string-to-width + label available-space nil nil t) + label-width available-space))) (setq label (bidi-string-mark-left-to-right label)) (when (and right-align (> width label-width)) (let ((shift (- width label-width))) @@ -437,7 +469,7 @@ tabulated-list-print-col (when not-last-col (when (> pad-right 0) (insert (make-string pad-right ?\s))) (insert (propertize - (make-string (- next-x x label-width pad-right) ?\s) + (make-string (- width (min width label-width)) ?\s) 'display `(space :align-to ,next-x)))) (put-text-property opoint (point) 'tabulated-list-column-name name) next-x))) @@ -494,7 +526,12 @@ tabulated-list-set-col (when (< pos eol) (delete-region pos (next-single-property-change pos prop nil eol)) (goto-char pos) - (tabulated-list-print-col col desc (current-column)) + (let ((tabulated-list--near-rows + (list + (tabulated-list-get-entry (point-at-bol 0)) + entry + (or (tabulated-list-get-entry (point-at-bol 2)) entry)))) + (tabulated-list-print-col col desc (current-column))) (if change-entry-data (aset entry col desc)) (put-text-property pos (point) 'tabulated-list-id id) -- 2.10.1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; In GNU Emacs 26.0.50.1 (x86_64-pc-linux-gnu, GTK+ Version 3.22.2) of 2016-11-03 built on calancha-pc Repository revision: abe594c0990a4e6bc72b20b7ff06b4b0c01a682c