From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED!not-for-mail From: =?UTF-8?Q?Cl=c3=a9ment_Pit-Claudel?= Newsgroups: gmane.emacs.devel Subject: Re: Variable-width font indentation Date: Wed, 7 Mar 2018 17:13:09 -0500 Message-ID: <50a23cc7-9404-0fdb-32fa-08d77782cbc9@gmail.com> References: <87inaiss6l.fsf@web.de> <6FCF6ACA-4F29-4B6B-BE9D-D7130C6E9495@gnu.org> <87fu5moe4c.fsf@web.de> <877eqyocro.fsf@web.de> <83zi3uz4nb.fsf@gnu.org> <0b1dd3fa-e0b0-ed20-a256-dd92d1c1826f@dancol.org> <8bc3c4c7-dfc7-987a-95e7-bd309e2326c6@cs.ucla.edu> <03118DC0-39DA-4AB5-980E-A33809B9A5EE@raeburn.org> <83vaeas8uz.fsf@gnu.org> <83lgf6s3aa.fsf@gnu.org> <8b94336f-1bb4-84ab-263b-af5ba40bfca4@cs.ucla.edu> <673d6612-f0d4-5d34-c6ee-a276dbba3068@cs.ucla.edu> <087fdedd-a7c5-f7f6-f3a5-b1700fb6e516@gmail.com> NNTP-Posting-Host: blaine.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Trace: blaine.gmane.org 1520460702 20614 195.159.176.226 (7 Mar 2018 22:11:42 GMT) X-Complaints-To: usenet@blaine.gmane.org NNTP-Posting-Date: Wed, 7 Mar 2018 22:11:42 +0000 (UTC) User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.6.0 To: Paul Eggert , emacs-devel@gnu.org Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Wed Mar 07 23:11:38 2018 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 1ethHI-0001ed-0u for ged-emacs-devel@m.gmane.org; Wed, 07 Mar 2018 23:11:16 +0100 Original-Received: from localhost ([::1]:35820 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ethJK-0003BK-Cs for ged-emacs-devel@m.gmane.org; Wed, 07 Mar 2018 17:13:22 -0500 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:42202) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ethJD-0003At-S2 for emacs-devel@gnu.org; Wed, 07 Mar 2018 17:13:16 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ethJA-0005TW-NJ for emacs-devel@gnu.org; Wed, 07 Mar 2018 17:13:15 -0500 Original-Received: from mail-it0-x22d.google.com ([2607:f8b0:4001:c0b::22d]:39210) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1ethJA-0005TD-Hc for emacs-devel@gnu.org; Wed, 07 Mar 2018 17:13:12 -0500 Original-Received: by mail-it0-x22d.google.com with SMTP id l187so5382726ith.4 for ; Wed, 07 Mar 2018 14:13:12 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=subject:to:references:from:message-id:date:user-agent:mime-version :in-reply-to:content-language:content-transfer-encoding; bh=XZ8+EiWfBmt8nppNUSxBzIH5NEDcMb9aWGbnglVoMWU=; b=C+B3+YFDY/LdbSIEek+nlxS3VF6ayVy8TQ+cRGw/H5niLpg2kKeT9g75o3dQUPGp0N 3ROZyWhlacnwPJ8fEodVxJGoOm1jFrUEDkCAI+UaOSIoseJZm4otcWO4Wczsil77JKoz JAojR7RQ9SZ4HOfCpyIlcfRPihq6fLftApGJP8OdPwsryzgK12SWkAhnhx1mqJxhMKVn eqw8i4Pwn/YFH2BSbPjPSGI5LIZ8awGCwhrsT9f5MBF4Mg4qwrlRHyvUAadSdiYGghbT 83aAJnMKJlTfYHTxggiEQLb+cT98jzc5bwE7oiefEnnC4h8RTuxewBtSj3VPV4f9UcPN cN1w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=XZ8+EiWfBmt8nppNUSxBzIH5NEDcMb9aWGbnglVoMWU=; b=r6cpcPoK5by/hov6QCimWUPX2xNj4P5ayBsynqL32X9/4VOGPA4ofPFoBElfQtCZGZ /lpnenKVXDqTFm9OiXHUhE+alcswJccO3veYi+JJJQkFVoJxZUgFnqawCm/GMBUUpaxW thDdQfMcwHLxA6pvIjlBWpavTu0taFpVHpKX/nQ+b+myhf3NkSXfUgfdz3+M5gelCtUg Nw2ZoaxdPlWVXXbSywsxZiqpnf3h/Dke0mJW5WJazMLL/DTIzyuLxJwB2ZX04k1vXmZL Q8yjJ+SdtSoB6nT28lQHHqc1+EwWYRttxTjhbrnK7CENtVCgBzAE2q/8BiyYmpLPBSpS KETw== X-Gm-Message-State: AElRT7E/r0q9JaTHSsIgp/YhywZFiTmxfcIrm4QIhiam5bVGbgQy8rFV tyxr44gkf56gOE7Rnie+sYFL6GlN X-Google-Smtp-Source: AG47ELvLyfUNS25pmt8Da+XTaV/bC8vROjOWr9KjKdUt/aJG2BUrfx31CcGl6zYQ74Tc0c0A4XM5kw== X-Received: by 10.36.68.19 with SMTP id o19mr25654089ita.137.1520460791335; Wed, 07 Mar 2018 14:13:11 -0800 (PST) Original-Received: from [18.26.2.123] (26-2-123.dynamic.csail.mit.edu. [18.26.2.123]) by smtp.gmail.com with ESMTPSA id y128sm7813918itb.39.2018.03.07.14.13.10 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 07 Mar 2018 14:13:10 -0800 (PST) In-Reply-To: <087fdedd-a7c5-f7f6-f3a5-b1700fb6e516@gmail.com> Content-Language: en-GB X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4001:c0b::22d 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:223488 On 2018-03-05 20:40, Clément Pit-Claudel wrote: > On 2018-03-05 20:30, Paul Eggert wrote: >> On 03/05/2018 05:06 PM, Clément Pit-Claudel wrote: >>> In variable-pitch mode, each new indentation level has a >>> slightly-different width, instead of a regular progression of 4 >>> spaces (in Python) and 2 spaces (in Elisp) at each level. >> >> That's fine. Although it's only a small thing, to me it's even a >> small plus, as having every indent level be the same number of pixels >> unnaturally focuses the reader on a distracting regularity that is >> not intrinsic to the code. > > I've been playing with this a bit more; until now, I'd mostly stopped at my previous objection. > > The following code gives a preview of what the algorithm that we've been discussing produces: [...] This version is a bit faster, and it uses 'display (space …) instead of ghost strings: (defun ~/variable-pitch-indent () (interactive) (save-excursion (let ((spine []) (prev-bol nil) (prev-eol nil)) (goto-char (point-min)) (while (not (eobp)) (let ((bol (point))) (back-to-indentation) (unless (eolp) (let* ((indentation-amount (current-column)) (trunc-spine-to (min (length spine) indentation-amount))) (setq spine (seq-subseq spine 0 trunc-spine-to)) ;; Extend spine based on previous line (when (and prev-bol (< (length spine) indentation-amount)) (let ((beg (+ prev-bol (length spine))) (end (min prev-eol (+ prev-bol indentation-amount)))) (setq spine (vconcat spine (~/measure-px-widths beg end))))) (setq prev-bol bol prev-eol (point-at-eol)))) (dotimes (idx (min (length spine) (- (point) bol))) (let ((w (aref spine idx))) (put-text-property (+ bol idx) (+ bol idx 1) 'display `(space :width (,w))))) (forward-line 1)))))) … but it doesn't work with tabs.