From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED!not-for-mail From: John Yates Newsgroups: gmane.emacs.devel Subject: Re: mode-line size and position indicator Date: Thu, 24 Aug 2017 15:26:54 -0400 Message-ID: References: <83mv6o9a7m.fsf@gnu.org> NNTP-Posting-Host: blaine.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset="UTF-8" X-Trace: blaine.gmane.org 1503603347 10095 195.159.176.226 (24 Aug 2017 19:35:47 GMT) X-Complaints-To: usenet@blaine.gmane.org NNTP-Posting-Date: Thu, 24 Aug 2017 19:35:47 +0000 (UTC) Cc: Nick Helm , Emacs developers To: Eli Zaretskii Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Thu Aug 24 21:35:40 2017 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 1dkxud-0001sD-TU for ged-emacs-devel@m.gmane.org; Thu, 24 Aug 2017 21:35:32 +0200 Original-Received: from localhost ([::1]:50137 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dkxuk-0007hG-M2 for ged-emacs-devel@m.gmane.org; Thu, 24 Aug 2017 15:35:38 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:51809) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dkxmO-000130-Tj for emacs-devel@gnu.org; Thu, 24 Aug 2017 15:27:02 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dkxmN-0003j7-HR for emacs-devel@gnu.org; Thu, 24 Aug 2017 15:27:00 -0400 Original-Received: from mail-ua0-x232.google.com ([2607:f8b0:400c:c08::232]:34575) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dkxmL-0003hB-En; Thu, 24 Aug 2017 15:26:57 -0400 Original-Received: by mail-ua0-x232.google.com with SMTP id j46so1500149uag.1; Thu, 24 Aug 2017 12:26:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:sender:in-reply-to:references:from:date:message-id :subject:to:cc; bh=9YPxx+nT2cnmSJMWujEVXN5WuRNQN3XyFBs8ZjjRZXQ=; b=cf9aJKOc5XnmltdZPVJg9Vr8dVCQk6pua9iIwfwXCGYVz9dvBU8h6HWF1s1Ur2LLGG ZHSpn6szoikLGzynHionT0PGQeN0gtfJ4+YqUu9Nh9OuVXUi56jRz3tXXMPaiPZZE+Rj b74J44zTj4qzKkxtc8b2tCP6ZiHRzgP2KcxFSn67Kg1S1rKEXluPeDpq4+AOm39w2zMP 1jrmYmBuHY8R1fcnwLv1T/qfnaB2wS8dkddfVYIF8EoQQhdFamUNbc+hjlrw2KJCUVix 0Vpt7ey+ei1OZd0lwppg6EQGYtqRyOcMOgtSV4Fxu61OFDd4RvLSIt0zYMhgHMR+ws4z 2VgQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:sender:in-reply-to:references:from :date:message-id:subject:to:cc; bh=9YPxx+nT2cnmSJMWujEVXN5WuRNQN3XyFBs8ZjjRZXQ=; b=g/5NAEtYAMgiIFYEwusas2UI5smb9v5Hx7cNeGPBM27RAyI71xqzWpR3Lkfti5Gcyz cpRpwqSs5oOBb9eRkv5E+2G+z3Iy49oCr8crzfy98BzvX8gJmB+AM16lhdWtKIP5TCJJ 3f2Q7cehJ+hT18rMav6FH3xwT4XoTZ5UFcz77/23vljADjlpL4AiZSUbqWAdeGC7cdPi NFVqwAEwyJvccLShsvyLhuCzVLwh9YjwEkTaIy7Y3N2HhIfRPE+fMxM/+4I/1vJPKn6/ RN5du0k7AO7L0mkdrJ2gcm44eHzHhZTr9mHCOVWVM4pm+3U9JraMOgxghsWxdNqjTn3J JgNQ== X-Gm-Message-State: AHYfb5gUXsWoDFOQjE1F23xkCTeh2FpyxuvgVh5sIRzfiVDixfU5rUkC 4XzRpaM6NH2r0QFBP2mCAl92gCnyLd1C X-Received: by 10.176.26.155 with SMTP id j27mr4342735uai.45.1503602815176; Thu, 24 Aug 2017 12:26:55 -0700 (PDT) Original-Received: by 10.31.158.202 with HTTP; Thu, 24 Aug 2017 12:26:54 -0700 (PDT) In-Reply-To: <83mv6o9a7m.fsf@gnu.org> X-Google-Sender-Auth: 56Dcn-_dnRKUJaGMwDao-GcovCE X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:400c:c08::232 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:217785 Archived-At: On Thu, Aug 24, 2017 at 12:55 PM, Eli Zaretskii wrote: > > Looks good, although there's a fundamental problem with putting on the > mode line an indicator that must use a significant part of the screen > estate to be useful: the mode line is pretty crowded these days, even > in the default configuration. After a futile effort at IBM to obtain an FSF copyright assignment I have given up and been too lazy to restart the effort with my new employer. Hence my .emacs (https://github.com/jsyjr/MyConfiguration.git ) is in the public domain. A couple months back I posted a mode-line widget that I have been using for some number of years. The relevant code is appended at the end of this message. Notable behavior: * Overlays proportional view of window in buffer onto line/column widget * Supports the same mouse menu behavior as the original widget * Highlights left edge square bracket if BOB is visible * Highlights right edge square bracket if EOB is visible * Hysteresis to minimize mode-line jitter This solution does not use any more mode-line real estate than the current line/column widget. . . . > I wonder whether it would have made sense to reuse the code we have > for computing the scroll-bar thumb. I am an inexperienced elisp hacker so I doubt that there is anything particularly useful or novel in my code. As the comments mention I was much inspired by past email discussions. The hardest part I found was the logic corresponding to Eli's scroll-bar thumb logic. I would love it if emacs offered essentially this functionality OOTB. /john ;;{{{ mode-line position-widget ;; Use a fancy widget to display buffer position on the mode line. ;; ------------------------------------------------------------------- ;; ;; Initial inspiration from an email thread between David Engster's and ;; Drew Adams: ;; ;; http://lists.gnu.org/archive/html/emacs-devel/2010-03/msg00523.html ;; http://permalink.gmane.org/gmane.emacs.devel/122038 ;; ;; Further learnings from Lennart Borgman's sml-modeline.el ;; https://www.emacswiki.org/emacs/sml-modeline.el ;; ;; TODO: Change color if cursor exceeds limit column (defvar buffer-max-column-visited 1 "Accumulate max column visited to prevent mode-line jitter.") (make-variable-buffer-local 'buffer-max-column-visited) (defun my/position-widget () (let* ((c-n-m column-number-mode) (l-n-m line-number-mode) (wbeg (window-start)) (wend (window-end))) (save-restriction (widen) (let* ((eob-line (line-number-at-pos (point-max))) (wbeg-line (line-number-at-pos wbeg)) (wend-line (line-number-at-pos wend)) (widget (concat ;; Leading [ (if (= wbeg-line 1) #("[" 0 1 (face mode-line-highlight-bold)) "[") ;; Body (if (not (or l-n-m c-n-m)) (replace-regexp-in-string "%" "%%" (format-mode-line '(-3 "%P"))) (let* ((wlines (1+ (- wend-line wbeg-line))) (expanded (format-mode-line (concat (cond ((not l-n-m) "") ((> 10 eob-line) "%1l") ((> 100 eob-line) "%2l") ((> 1000 eob-line) "%3l") ((> 10000 eob-line) "%4l") ((> 100000 eob-line) "%5l") ((> 1000000 eob-line) "%6l") (t "%7l")) (if (and l-n-m c-n-m) #("," 0 1 (face bold)) "") (cond ((not c-n-m) "") (t (let* ((max-col (max (current-column) buffer-max-column-visited)) (field (cond ((> 10 max-col) 3) ((> 100 max-col) 4) ((> 1000 max-col) 5) (t 6))) (cur-col (current-column)) (digits (cond ((> 10 cur-col) 1) ((> 100 cur-col) 2) ((> 1000 cur-col) 3) (t 4)))) (setq buffer-max-column-visited max-col) (substring "%c " 0 (- field digits)))))))) (len (length expanded)) (hilen (max 1 ; at least one column (min len ; no more than full string (round (/ (* wlines len) (float eob-line)))))) (lpad (round (/ (* wbeg-line (- len hilen)) (float (- eob-line wlines -2))))) (rpad (+ lpad hilen))) (put-text-property lpad rpad 'face 'mode-line-highlight expanded) expanded)) ;; Trailing ] (if (= wend-line eob-line) #("]" 0 1 (face mode-line-highlight-bold)) "]")))) (propertize widget 'help-echo "Buffer position widget\nmouse-1: Line and Column Mode Menu" 'mouse-face 'mode-line-highlight 'local-map '(keymap (mode-line keymap (down-mouse-1 keymap (line-number-mode menu-item "Global Line Number Mode" line-number-mode :help "Toggle line number display" :button (:toggle . line-number-mode)) (column-number-mode menu-item "Global Column Number Mode" column-number-mode :help "Toggle column number display" :button (:toggle . column-number-mode)) "Control Line and Column Display Globally")))))))) (my/custom-set-variables '(mode-line-position '(:eval (my/position-widget)) t) ) ;;}}}