From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED.ciao.gmane.org!not-for-mail From: John Shahid Newsgroups: gmane.emacs.devel Subject: Re: Feedback on getting rid of `term-suppress-hard-newline' Date: Mon, 21 Jan 2019 15:32:32 -0500 Message-ID: <87lg3d3g70.fsf@gmail.com> References: <87efanc576.fsf@gmail.com> <87sgxsr8p0.fsf@gmail.com> <871s56sw98.fsf@gmail.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Injection-Info: ciao.gmane.org; posting-host="ciao.gmane.org:195.159.176.228"; logging-data="16467"; mail-complaints-to="usenet@ciao.gmane.org" User-Agent: mu4e 1.1.0; emacs 27.0.50 To: emacs-devel@gnu.org Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Mon Jan 21 21:42:21 2019 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1glgOi-0004Co-41 for ged-emacs-devel@m.gmane.org; Mon, 21 Jan 2019 21:42:20 +0100 Original-Received: from localhost ([127.0.0.1]:59740 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1glgOh-0001Xc-0N for ged-emacs-devel@m.gmane.org; Mon, 21 Jan 2019 15:42:19 -0500 Original-Received: from eggs.gnu.org ([209.51.188.92]:58908) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1glgFR-0002aA-Jr for emacs-devel@gnu.org; Mon, 21 Jan 2019 15:32:47 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1glgFP-0008EK-V5 for emacs-devel@gnu.org; Mon, 21 Jan 2019 15:32:45 -0500 Original-Received: from mail-qt1-x836.google.com ([2607:f8b0:4864:20::836]:42287) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1glgFO-0008Ac-9R for emacs-devel@gnu.org; Mon, 21 Jan 2019 15:32:42 -0500 Original-Received: by mail-qt1-x836.google.com with SMTP id d19so24971018qtq.9 for ; Mon, 21 Jan 2019 12:32:37 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=references:user-agent:from:to:subject:message-id:in-reply-to:date :mime-version; bh=HBFUDGT8VDKuJ+vI/M+kHko9mKAdeG1FNs9GH27BLr8=; b=UE2wsxvZH2hyTDdGY1m9sNpSrgmfIhL6qKAR3y+eHDXVW/5v9/VYcCZCm395TpyMKV G9nHScnFvWz/eJ+wV0fofuIbRw0rMk0gsA/iXhLUPH1q5kBdOB00VnCdZpTaG5A919FV EHSUM9GLQnhbtcIdYw8KD+sKPWHA8t9RUuExoCgvbGF2NSRCIdAU9qCAgOAGNAxWUH3k HRQJ2HNFduHexWax+ej3R7JU6YH8jgPjSsAXeUqtaT1Ja6ym3PpMfvT9/mD18xgGCgyE k0J+fKncj7SCM2b+sMgLxprmTWh1TeKlDr5IAeyjFMKWkrTI9DNIMnsaF0qr0hYFgX4F zJMQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:references:user-agent:from:to:subject:message-id :in-reply-to:date:mime-version; bh=HBFUDGT8VDKuJ+vI/M+kHko9mKAdeG1FNs9GH27BLr8=; b=mjk1ADxitu/Ism9eaz2/ByT+LEGqYEI651aFH+N626L/vAXBUQ+NtjBnMql4ON1HSV g0KCXjbcVFeKDcWnmh8ChYjjYojCE337hD4ISy22KDxBMFsihXbcmVbUyYRQvVZ+s4Qu UWPqG9W22GEnofO0uDqrphAVSaNFttWURgD17zX0uQwAvQBtZ2HvdMUXv/Vi2Ly0yeCb aT5c2kSvVbqVyMeHAbdk/tE/tgd8Dyq/9cRbS5EtlJWThO+DhrYNaZgHEoGW/k6kSgNi 6ivZ+xGhsbLjzPX7lbH4L+h7XCoXhRmfX19+BIOmRoIij/hzSTt4ttieGm46jBl26ciE sHTg== X-Gm-Message-State: AJcUukcvhHLoUNtF/r6l0CPxK3TqFG7k9LONFu0FpUwTKJwiITVPqs7J t+rB1Isfb8WloSQDN1ajwWWT9JjAVTM= X-Google-Smtp-Source: ALg8bN5JOQL2onr3ttyENl7mn3DuxS0zL+61OKRpQcTcOZW6ZfhZW0ZM9AchEaBZqarvHN9lwOa6wA== X-Received: by 2002:ac8:4284:: with SMTP id o4mr11964390qtl.389.1548102755963; Mon, 21 Jan 2019 12:32:35 -0800 (PST) Original-Received: from amun (cpe-104-162-85-46.nyc.res.rr.com. [104.162.85.46]) by smtp.gmail.com with ESMTPSA id 20sm74971931qtp.54.2019.01.21.12.32.34 for (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 21 Jan 2019 12:32:34 -0800 (PST) In-reply-to: X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::836 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:232576 Archived-At: --=-=-= Content-Type: text/plain Stefan Monnier writes: >> I changed the property name to 'term-line-wrap'. > > Thanks, > >>>>> + (let (buffer-read-only) >>>>> + (delete-char 1)))) >>> Never let-bind `buffer-read-only`: let-bind `inhibit-read-only` >>> instead. >> Done. I am curious to know why I shouldn't let-bind 'buffer-read-only' ? > > Various minor reasons: > - it also allows modifying text with `read-only` text-property. > - It allows the wrapped code to change read-only-mode if it wants/needs to, > whereas let-binding buffer-read-only means that if the wrapped code > changes read-only-mode, we'll silently undo this change at the end. > - `buffer-read-only` is a variable to *set* or *unset* rather than > to let-bind temporarily. Using inhibit-read-only clarifies that you > just want to temporarily override the read-only-ness rather than to > change the read-only-mode. > Depending on the situation, different things matter more. > Here it likely doesn't make much of a difference in practice, but the > normal style is to bind inhibit-read-only: that's what it's for. That makes sense. Thanks for the detailed answer. > >> One more question, should I deprecate 'term-suppress-hard-newline' as >> part of this changeset ? > > I think it should mark it as obsolete, yes. Awesome. I made the change and attached the latest patch. FYI, I also went removed all usages of that variable. JS --=-=-= Content-Type: text/x-patch Content-Disposition: inline; filename=0001-Adjust-line-wrapping-on-window-resize-and-killing-te.patch >From f4a9e0f4968fa253da40eaf7f6fd84fa52c650b5 Mon Sep 17 00:00:00 2001 From: John Shahid Date: Sun, 20 Jan 2019 19:08:17 -0500 Subject: [PATCH] Adjust line wrapping on window resize and killing text * lisp/term.el (term-mode): Advice filter-buffer-substring-function to remove line wrapping from killed text. (term-reset-size): Add or remove line wrapping depending on the new terminal width. (term-suppress-hard-newline): Mark obsolete. (term-emulate-terminal): Remove usage of 'term-suppress-hard-newline' (term-unwrap-line): --- lisp/term.el | 77 +++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 61 insertions(+), 16 deletions(-) diff --git a/lisp/term.el b/lisp/term.el index f49777f94c..e9ed4a688f 100644 --- a/lisp/term.el +++ b/lisp/term.el @@ -545,6 +545,9 @@ term-suppress-hard-newline :version "24.4" :type 'boolean :group 'term) +(make-obsolete-variable 'term-suppress-hard-newline nil + "term removes newlines used for wrapping on resize and when text is copied" + "27.1") ;; Where gud-display-frame should put the debugging arrow. This is ;; set by the marker-filter, which scans the debugger's output for @@ -1116,6 +1119,9 @@ term-mode (set (make-local-variable 'font-lock-defaults) '(nil t)) + (add-function :filter-return + (local 'filter-buffer-substring-function) + 'term--filter-buffer-substring) (add-function :filter-return (local 'window-adjust-process-window-size-function) (lambda (size) @@ -1132,9 +1138,33 @@ term-mode (setq term-input-ring (make-ring term-input-ring-size))) (term-update-mode-line)) +(defun term--insert-fake-newline (&optional count) + (let ((old-point (point))) + (term-insert-char ?\n count) + (put-text-property old-point (point) 'term-line-wrap t))) + +(defun term--remove-fake-newlines () + (goto-char (point-min)) + (let (fake-newline) + (while (setq fake-newline (next-single-property-change (point) + 'term-line-wrap)) + (goto-char fake-newline) + (let ((inhibit-read-only t)) + (delete-char 1))))) + +(defun term--filter-buffer-substring (content) + (with-temp-buffer + (insert content) + (term--remove-fake-newlines) + (buffer-string))) + (defun term-reset-size (height width) (when (or (/= height term-height) (/= width term-width)) + ;; Delete all newlines used for wrapping + (when (/= width term-width) + (save-excursion + (term--remove-fake-newlines))) (let ((point (point))) (setq term-height height) (setq term-width width) @@ -1147,7 +1177,19 @@ term-reset-size (setq term-start-line-column nil) (setq term-current-row nil) (setq term-current-column nil) - (goto-char point)))) + (goto-char point)) + (save-excursion + ;; Add newlines to wrap long lines that are currently displayed + (forward-line (- (term-current-row))) + (beginning-of-line) + (while (not (eobp)) + (let* ((eol (save-excursion (end-of-line) (current-column)))) + (when (> eol width) + (move-to-column width) + (let ((inhibit-read-only t)) + (term--insert-fake-newline))) + (unless (eobp) + (forward-char))))))) ;; Recursive routine used to check if any string in term-kill-echo-list ;; matches part of the buffer before point. @@ -2895,20 +2937,20 @@ term-emulate-terminal (let ((old-column (term-horizontal-column)) (old-point (point)) columns) - (unless term-suppress-hard-newline - (while (> (+ (length decoded-substring) old-column) - term-width) - (insert (substring decoded-substring 0 - (- term-width old-column))) - ;; Since we've enough text to fill the whole line, - ;; delete previous text regardless of - ;; `term-insert-mode's value. - (delete-region (point) (line-end-position)) - (term-down 1 t) - (term-move-columns (- (term-current-column))) - (setq decoded-substring - (substring decoded-substring (- term-width old-column))) - (setq old-column 0))) + (while (> (+ (length decoded-substring) old-column) + term-width) + (insert (substring decoded-substring 0 + (- term-width old-column))) + ;; Since we've enough text to fill the whole line, + ;; delete previous text regardless of + ;; `term-insert-mode's value. + (delete-region (point) (line-end-position)) + (term-down 1 t) + (term-move-columns (- (term-current-column))) + (put-text-property (1- (point)) (point) 'term-line-wrap t) + (setq decoded-substring + (substring decoded-substring (- term-width old-column))) + (setq old-column 0)) (insert decoded-substring) (setq term-current-column (current-column) columns (- term-current-column old-column)) @@ -3719,7 +3761,10 @@ term-down ;; if the line above point wraps around, add a ?\n to undo the wrapping. ;; FIXME: Probably should be called more than it is. (defun term-unwrap-line () - (when (not (bolp)) (insert-before-markers ?\n))) + (when (not (bolp)) + (let ((old-point (point))) + (insert-before-markers ?\n) + (put-text-property old-point (point) 'term-line-wrap t)))) (defun term-erase-in-line (kind) (when (= kind 1) ;; erase left of point -- 2.20.1 --=-=-=--