GNU bug report logs - #78561
[PATCH] Add semantic linefeed support for paragraph filling

Please note: This is a static page, with minimal formatting, updated once a day.
Click here to see this page with the latest information and nicer formatting.

Package: emacs; Reported by: Roi Martin <jroi.martin@HIDDEN>; Keywords: patch; Done: Eli Zaretskii <eliz@HIDDEN>; Maintainer for emacs is bug-gnu-emacs@HIDDEN.

Message received at 78561-done <at> debbugs.gnu.org:


Received: (at 78561-done) by debbugs.gnu.org; 14 Jun 2025 13:43:57 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Sat Jun 14 09:43:57 2025
Received: from localhost ([127.0.0.1]:37551 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1uQRAp-0001pT-HY
	for submit <at> debbugs.gnu.org; Sat, 14 Jun 2025 09:43:57 -0400
Received: from eggs.gnu.org ([2001:470:142:3::10]:57438)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.84_2) (envelope-from <eliz@HIDDEN>) id 1uQRAY-0001nM-P4
 for 78561-done <at> debbugs.gnu.org; Sat, 14 Jun 2025 09:43:40 -0400
Received: from fencepost.gnu.org ([2001:470:142:3::e])
 by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.90_1) (envelope-from <eliz@HIDDEN>)
 id 1uQRAS-0003Dq-03; Sat, 14 Jun 2025 09:43:32 -0400
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org;
 s=fencepost-gnu-org; h=References:Subject:In-Reply-To:To:From:Date:
 mime-version; bh=Zq647+xfIK2/LWNXhgO6Gmt8HWxf0taLEIsy7iHZF0M=; b=qcI7tbY0SPfO
 FxSmdZ5Qs4oqnXy0aKaaBPr3iPp5bP61bvSIkTKdmBw2SFoVuL5lQNNe/hRDRXHGbnQ0HxV4Uaeza
 gJQSVeLOudDg0QABIpNUn8Q98cDQ/qKRL8sHeYkAz5xtXIeZQbncwiU8Oi2N7anAIpXMe3HJ+w6QJ
 pK5vZNKoZgTvfKb86OExtDWhGM7OKkIxc/1M4iPrRspUbxbRKs5s9x7KRqLIGx0BhHxxrNYDME6yY
 qjOqCc3HzQfrOHSsRDN6hUStW7mOnjWaH5pSCqjWS8rX8rJWBIRnHRH+NqkKE7emrOphrodJyTxos
 CXmU5B7UiOJTkpQ9L1qqeg==;
Date: Sat, 14 Jun 2025 16:43:19 +0300
Message-Id: <868qlusako.fsf@HIDDEN>
From: Eli Zaretskii <eliz@HIDDEN>
To: Roi Martin <jroi.martin@HIDDEN>
In-Reply-To: <87bjr5b9xe.fsf@HIDDEN> (message from Roi Martin on Tue, 03
 Jun 2025 08:45:17 +0200)
Subject: Re: bug#78561: [PATCH] Add semantic linefeed support for paragraph
 filling
References: <87jz67tzrp.fsf@HIDDEN>
 <jwvr00fqt10.fsf-monnier+emacs@HIDDEN> <87frgs4jfh.fsf@HIDDEN>
 <jwvmsazpdai.fsf-monnier+emacs@HIDDEN> <87bjrehx8d.fsf@HIDDEN>
 <jwvmsayni12.fsf-monnier+emacs@HIDDEN> <875xhkivul.fsf@HIDDEN>
 <jwvy0ucy93e.fsf-monnier+emacs@HIDDEN> <86o6v8qd7m.fsf@HIDDEN>
 <87tt4yqomv.fsf@HIDDEN> <jwvtt4ynez6.fsf-monnier+emacs@HIDDEN>
 <87bjr5b9xe.fsf@HIDDEN>
X-Spam-Score: -2.3 (--)
X-Debbugs-Envelope-To: 78561-done
Cc: mbork@HIDDEN, monnier@HIDDEN, 78561-done <at> debbugs.gnu.org,
 rms@HIDDEN
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -3.3 (---)

> From: Roi Martin <jroi.martin@HIDDEN>
> Cc: Eli Zaretskii <eliz@HIDDEN>, rms@HIDDEN, 78561 <at> debbugs.gnu.org,
>  mbork@HIDDEN
> Date: Tue, 03 Jun 2025 08:45:17 +0200
> 
> Stefan Monnier <monnier@HIDDEN> writes:
> 
> > Side comment, tho: it would be good to get rid of the `with-restriction`
> > so that the code can see the surrounding text.  In the past such
> > restrictions in `fill.el` have posed problems for example when we want
> > to refill code in a way that obeys indentation rules or that
> > needs to distinguish filling within strings vs filling within comments.
> 
> The latest version is far from perfect but works well for the most
> common use cases.  The included tests can given you an idea of the
> current state.  Are you OK with tackling the `with-restriction'
> improvement in a future patch?

Thanks, I've now installed this on the master branch, and I'm
therefore closing the bug.




Notification sent to Roi Martin <jroi.martin@HIDDEN>:
bug acknowledged by developer. Full text available.
Reply sent to Eli Zaretskii <eliz@HIDDEN>:
You have taken responsibility. Full text available.

Message received at 78561 <at> debbugs.gnu.org:


Received: (at 78561) by debbugs.gnu.org; 3 Jun 2025 17:25:05 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Tue Jun 03 13:25:05 2025
Received: from localhost ([127.0.0.1]:41128 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1uMVNp-00066q-BG
	for submit <at> debbugs.gnu.org; Tue, 03 Jun 2025 13:25:05 -0400
Received: from mailscanner.iro.umontreal.ca ([132.204.25.50]:62523)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.84_2) (envelope-from <monnier@HIDDEN>)
 id 1uMVNm-00065c-Sm
 for 78561 <at> debbugs.gnu.org; Tue, 03 Jun 2025 13:25:03 -0400
Received: from pmg3.iro.umontreal.ca (localhost [127.0.0.1])
 by pmg3.iro.umontreal.ca (Proxmox) with ESMTP id 569A344239A;
 Tue,  3 Jun 2025 13:24:55 -0400 (EDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=iro.umontreal.ca;
 s=mail; t=1748971494;
 bh=fp7opKaFrbkXBQAS3FNNb/4QbxlW8NyFO8AertIWP9E=;
 h=From:To:Cc:Subject:In-Reply-To:References:Date:From;
 b=fmK1lX1y0mtIhgXlLy9nFy9EA3yexSQnwwHQ9XOFFVUyViPzDlBftUCJwQ7dyeWVa
 oCQt+dEglaFEFpYIcLz0veKWbxhEduauvZnlp4BOXBzULRB2cb+AYay8Kw5GeiEJOr
 O9v5zSlg4WwnfaaZotRWlGDJBqfz+vco2A/tbchbwpU2HA9OAPlwhmmwzLmIg0DoDj
 8sKNYHg6AetiDdKdhH2ymIE/V8V4Ef0Gyf4hq7Xu5phTUUJZ/gpmzk9KJkpLHw0VGm
 3pNnPi+/uuCMBHNrWxCOaqmSQ1N8wQdkvtjlwbyKV5+LNZ2bIO8THLAf711gijs/NC
 ivx36HdO4M6OQ==
Received: from mail01.iro.umontreal.ca (unknown [172.31.2.1])
 by pmg3.iro.umontreal.ca (Proxmox) with ESMTP id 82021441857;
 Tue,  3 Jun 2025 13:24:54 -0400 (EDT)
Received: from lechazo (lechon.iro.umontreal.ca [132.204.27.242])
 by mail01.iro.umontreal.ca (Postfix) with ESMTPSA id 6F3C012058A;
 Tue,  3 Jun 2025 13:24:54 -0400 (EDT)
From: Stefan Monnier <monnier@HIDDEN>
To: Roi Martin <jroi.martin@HIDDEN>
Subject: Re: bug#78561: [PATCH] Add semantic linefeed support for paragraph
 filling
In-Reply-To: <87bjr5b9xe.fsf@HIDDEN>
Message-ID: <jwvo6v4hh5w.fsf-monnier+emacs@HIDDEN>
References: <87jz67tzrp.fsf@HIDDEN> <jwvr00fqt10.fsf-monnier+emacs@HIDDEN>
 <87frgs4jfh.fsf@HIDDEN> <jwvmsazpdai.fsf-monnier+emacs@HIDDEN>
 <87bjrehx8d.fsf@HIDDEN> <jwvmsayni12.fsf-monnier+emacs@HIDDEN>
 <875xhkivul.fsf@HIDDEN> <jwvy0ucy93e.fsf-monnier+emacs@HIDDEN>
 <86o6v8qd7m.fsf@HIDDEN> <87tt4yqomv.fsf@HIDDEN>
 <jwvtt4ynez6.fsf-monnier+emacs@HIDDEN> <87bjr5b9xe.fsf@HIDDEN>
Date: Tue, 03 Jun 2025 13:24:54 -0400
User-Agent: Gnus/5.13 (Gnus v5.13)
MIME-Version: 1.0
Content-Type: text/plain
X-SPAM-INFO: Spam detection results:  0
 ALL_TRUSTED                -1 Passed through trusted hosts only via SMTP
 AWL 0.161 Adjusted score from AWL reputation of From: address
 BAYES_00                 -1.9 Bayes spam probability is 0 to 1%
 DKIM_SIGNED               0.1 Message has a DKIM or DK signature,
 not necessarily valid
 DKIM_VALID -0.1 Message has at least one valid DKIM or DK signature
 DKIM_VALID_AU -0.1 Message has a valid DKIM or DK signature from author's
 domain
 DKIM_VALID_EF -0.1 Message has a valid DKIM or DK signature from envelope-from
 domain
X-SPAM-LEVEL: 
X-Spam-Score: -2.3 (--)
X-Debbugs-Envelope-To: 78561
Cc: Eli Zaretskii <eliz@HIDDEN>, mbork@HIDDEN, rms@HIDDEN,
 78561 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -3.3 (---)

>  Are you OK with tackling the `with-restriction'
> improvement in a future patch?

Yes.


        Stefan





Information forwarded to bug-gnu-emacs@HIDDEN:
bug#78561; Package emacs. Full text available.

Message received at 78561 <at> debbugs.gnu.org:


Received: (at 78561) by debbugs.gnu.org; 3 Jun 2025 06:45:34 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Tue Jun 03 02:45:34 2025
Received: from localhost ([127.0.0.1]:59370 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1uMLOv-0004tD-LM
	for submit <at> debbugs.gnu.org; Tue, 03 Jun 2025 02:45:34 -0400
Received: from mail-wm1-x329.google.com ([2a00:1450:4864:20::329]:58454)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.84_2) (envelope-from <jroi.martin@HIDDEN>)
 id 1uMLOs-0004rc-4y
 for 78561 <at> debbugs.gnu.org; Tue, 03 Jun 2025 02:45:31 -0400
Received: by mail-wm1-x329.google.com with SMTP id
 5b1f17b1804b1-442f9043f56so31143015e9.0
 for <78561 <at> debbugs.gnu.org>; Mon, 02 Jun 2025 23:45:30 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1748933124; x=1749537924; darn=debbugs.gnu.org;
 h=mime-version:message-id:date:references:in-reply-to:subject:cc:to
 :from:from:to:cc:subject:date:message-id:reply-to;
 bh=wxeMZQendUGYwC0ErOXla8pwOMeLchK2GyuZrCySLeY=;
 b=ivG6REHsc/mmYFcCsdUcHtv6QLKYsNNouUXdQsTRoQvSUn5ZPiMusTC6WWKtOD1x6V
 dM9GbSqI11Lrpoe0a1XgvxO6AEhyu4mT1hU1JyatGUX2ucd6NwqGoQnMtv2dCFRUzFH6
 G4jxd84X6MJdt8uxg50b5euTLU3yogK1RP5kpKsNCQQlT/834XNlGgUrTQmVGwcclJQg
 TvTYTVkyuUD425bmt0Sl+c4oR1z91JKjJscPXMhKdOq+N9Z5X0cikBxU80tHNXqAbr+u
 GXnBFhrL4i8K+EF3Yd8BxFoG+QQkdqQjpoqMTLY4rm0Ir7zjU0p2XVednx7mwz02Z2to
 Zppw==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1748933124; x=1749537924;
 h=mime-version:message-id:date:references:in-reply-to:subject:cc:to
 :from:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to;
 bh=wxeMZQendUGYwC0ErOXla8pwOMeLchK2GyuZrCySLeY=;
 b=xRC8GX4uAbiqZDnjuTSqOAZi3iP3GZ65zo3+HT3VDLiJDHl7lMwLOlJfOc6zyPIOoD
 cZGAvuDwJOP377oyYQg3vlnRZJCZk6VO3YHRl8sbmwbxXoO56didoA4baRCdZouygbbh
 P/rYXdOWn92W488b/SVZg9hh59ul9/SDD7XDTiQf5VKwgRA32OwLIsTFP+44H9fvTeg9
 s4jcdQstpobxs+MSn3ComkkPGqz/wW+HWVOXQoMtpeHvQ+/O0SzI0LwUBnAWfZvqgrpV
 jpCQUCPnqYDbOxaq35UfecSaRINkz1mTdgHNwls6q9L+tiUDh+DhzRFAtEikoa7Qd9BM
 wqqg==
X-Forwarded-Encrypted: i=1;
 AJvYcCX8OWucBwFftYqHcW5Fps1ag43H66rloOiCZ20NDmuGxH3rrrIRMnnqIp2q+JQcNch5g2SrlQ==@debbugs.gnu.org
X-Gm-Message-State: AOJu0Yz7iglbMpWMXhaq5EDto/Ld+ryVlTWirwy+POjFbMFSmKbG8HcY
 lGDsjEijxY5y3Bx2S9af5es3DjQukAOe4YACfEsP9J+R5vxs1nMXHVK/
X-Gm-Gg: ASbGnctRqgVtzN4fNEVypYMHJewS1kFpKU3p9rg+h6TKa18mfVjKLhNDzJZs0PxqVek
 lQBwvzVZdmf/ksZGAVmVQW9FMKW8n7YAEtMqyg2gN8HUcy2GTJw4Gd6wy0nUsQNjr5S1HWhbpKf
 jBFdkqhHyb9hTXwSwbKi3up4AIgFm9pY4J77KznJymCcElH5PyJwLGz0ztql2PtpWCMN3Hkin26
 rC0FtLB6TlCqmHjsYoMTJOo97xOK0Dc3IajLsIP/EEPJgzfD4vdnUXwDaqchfssCJRQ5+qPj9it
 lWZHwgCRzrAXEp43z91LSSTwhPMNAVQYEgCWHsa+xnMnIM9I1w==
X-Google-Smtp-Source: AGHT+IG+RfRKpfs9ptvwwu1H93yozKPeH3KDV8DxyhjuMZAplTZC3JZ7vVsqIRnKmIQzjhQHWdipkA==
X-Received: by 2002:a05:6000:4282:b0:3a4:ec23:dba7 with SMTP id
 ffacd0b85a97d-3a4fe394766mr8747534f8f.31.1748933123687; 
 Mon, 02 Jun 2025 23:45:23 -0700 (PDT)
Received: from localhost ([84.79.192.255]) by smtp.gmail.com with ESMTPSA id
 ffacd0b85a97d-3a4efe5b79asm16875453f8f.2.2025.06.02.23.45.23
 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);
 Mon, 02 Jun 2025 23:45:23 -0700 (PDT)
From: Roi Martin <jroi.martin@HIDDEN>
To: Stefan Monnier <monnier@HIDDEN>
Subject: Re: bug#78561: [PATCH] Add semantic linefeed support for paragraph
 filling
In-Reply-To: <jwvtt4ynez6.fsf-monnier+emacs@HIDDEN>
References: <87jz67tzrp.fsf@HIDDEN>
 <jwvr00fqt10.fsf-monnier+emacs@HIDDEN> <87frgs4jfh.fsf@HIDDEN>
 <jwvmsazpdai.fsf-monnier+emacs@HIDDEN> <87bjrehx8d.fsf@HIDDEN>
 <jwvmsayni12.fsf-monnier+emacs@HIDDEN> <875xhkivul.fsf@HIDDEN>
 <jwvy0ucy93e.fsf-monnier+emacs@HIDDEN> <86o6v8qd7m.fsf@HIDDEN>
 <87tt4yqomv.fsf@HIDDEN> <jwvtt4ynez6.fsf-monnier+emacs@HIDDEN>
Date: Tue, 03 Jun 2025 08:45:17 +0200
Message-ID: <87bjr5b9xe.fsf@HIDDEN>
MIME-Version: 1.0
Content-Type: text/plain
X-Spam-Score: 0.0 (/)
X-Debbugs-Envelope-To: 78561
Cc: Eli Zaretskii <eliz@HIDDEN>, mbork@HIDDEN, rms@HIDDEN,
 78561 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.0 (-)

Stefan Monnier <monnier@HIDDEN> writes:

> Side comment, tho: it would be good to get rid of the `with-restriction`
> so that the code can see the surrounding text.  In the past such
> restrictions in `fill.el` have posed problems for example when we want
> to refill code in a way that obeys indentation rules or that
> needs to distinguish filling within strings vs filling within comments.

The latest version is far from perfect but works well for the most
common use cases.  The included tests can given you an idea of the
current state.  Are you OK with tackling the `with-restriction'
improvement in a future patch?


        Roi




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#78561; Package emacs. Full text available.

Message received at 78561 <at> debbugs.gnu.org:


Received: (at 78561) by debbugs.gnu.org; 2 Jun 2025 19:13:16 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Mon Jun 02 15:13:16 2025
Received: from localhost ([127.0.0.1]:55047 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1uMAax-0004Ce-Hz
	for submit <at> debbugs.gnu.org; Mon, 02 Jun 2025 15:13:15 -0400
Received: from mailscanner.iro.umontreal.ca ([132.204.25.50]:14709)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.84_2) (envelope-from <monnier@HIDDEN>)
 id 1uMAau-0004CF-F1
 for 78561 <at> debbugs.gnu.org; Mon, 02 Jun 2025 15:13:12 -0400
Received: from pmg1.iro.umontreal.ca (localhost.localdomain [127.0.0.1])
 by pmg1.iro.umontreal.ca (Proxmox) with ESMTP id EE0F010013E;
 Mon,  2 Jun 2025 15:13:06 -0400 (EDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=iro.umontreal.ca;
 s=mail; t=1748891585;
 bh=Ir4t9Lv8qlBiauf38XrxdUO66L2uXFNJG09Ja/FZDno=;
 h=From:To:Cc:Subject:In-Reply-To:References:Date:From;
 b=h2K3FeAl0XZOSZ5tiO/1+1Pcfq/cniRCT11jLw0bS6k9EQiUHlShb8W+1DUyiG32l
 blFbfElfNc+gmtCIpF+4IbTV+6jtrgo10cfIc4/C/arco8BOywNEZCyTPd8Tvjrdqs
 kHnxaYvDPyKDLJKMpUNyoQGyXmpAOZMw1ccl281XSQzPgIYTLsNHvntzCfMSamojMD
 xjSGew4JkhhyOsQQIBtRP+Q6Uzfm5LUtO8aYiCCxH/5HYsPE9GG0fe+n95JjXQxJ0Y
 PLrk5yrE60VoDM73JLy1PDZi+Z/uzGrbCuLLBUgqrKiVZ0JaJNhXWdARGBv7l9dqWZ
 E2N1RSGZ6TMjQ==
Received: from mail01.iro.umontreal.ca (unknown [172.31.2.1])
 by pmg1.iro.umontreal.ca (Proxmox) with ESMTP id E7FA510006B;
 Mon,  2 Jun 2025 15:13:05 -0400 (EDT)
Received: from alfajor (modemcable005.21-80-70.mc.videotron.ca [70.80.21.5])
 by mail01.iro.umontreal.ca (Postfix) with ESMTPSA id AD2DE12024D;
 Mon,  2 Jun 2025 15:13:05 -0400 (EDT)
From: Stefan Monnier <monnier@HIDDEN>
To: Roi Martin <jroi.martin@HIDDEN>
Subject: Re: bug#78561: [PATCH] Add semantic linefeed support for paragraph
 filling
In-Reply-To: <87tt4yqomv.fsf@HIDDEN>
Message-ID: <jwvtt4ynez6.fsf-monnier+emacs@HIDDEN>
References: <87jz67tzrp.fsf@HIDDEN> <jwvr00fqt10.fsf-monnier+emacs@HIDDEN>
 <87frgs4jfh.fsf@HIDDEN> <jwvmsazpdai.fsf-monnier+emacs@HIDDEN>
 <87bjrehx8d.fsf@HIDDEN> <jwvmsayni12.fsf-monnier+emacs@HIDDEN>
 <875xhkivul.fsf@HIDDEN> <jwvy0ucy93e.fsf-monnier+emacs@HIDDEN>
 <86o6v8qd7m.fsf@HIDDEN> <87tt4yqomv.fsf@HIDDEN>
Date: Mon, 02 Jun 2025 15:13:05 -0400
User-Agent: Gnus/5.13 (Gnus v5.13)
MIME-Version: 1.0
Content-Type: text/plain
X-SPAM-INFO: Spam detection results:  0
 ALL_TRUSTED                -1 Passed through trusted hosts only via SMTP
 AWL -0.267 Adjusted score from AWL reputation of From: address
 BAYES_00                 -1.9 Bayes spam probability is 0 to 1%
 DKIM_SIGNED               0.1 Message has a DKIM or DK signature,
 not necessarily valid
 DKIM_VALID -0.1 Message has at least one valid DKIM or DK signature
 DKIM_VALID_AU -0.1 Message has a valid DKIM or DK signature from author's
 domain
 DKIM_VALID_EF -0.1 Message has a valid DKIM or DK signature from envelope-from
 domain
X-SPAM-LEVEL: 
X-Spam-Score: -2.3 (--)
X-Debbugs-Envelope-To: 78561
Cc: Eli Zaretskii <eliz@HIDDEN>, mbork@HIDDEN, rms@HIDDEN,
 78561 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -3.3 (---)

> RMS replied to me with a review, where he mentioned that this feature
> would be more convenient if it were a minor mode.  Eli, Stefan, what do
> you think?  If it makes sense, we can add it in a future patch.

Yes, it goes in the same direction of my TODO of adding more hooks to
control various aspects of filling.  (One of) Those hooks should make it
easy to write such a minor mode.

> I've attached a new version of the patch.  It includes the following
> changes compared to the previous version:

LGTM.

Side comment, tho: it would be good to get rid of the `with-restriction`
so that the code can see the surrounding text.  In the past such
restrictions in `fill.el` have posed problems for example when we want
to refill code in a way that obeys indentation rules or that
needs to distinguish filling within strings vs filling within comments.


        Stefan





Information forwarded to bug-gnu-emacs@HIDDEN:
bug#78561; Package emacs. Full text available.

Message received at 78561 <at> debbugs.gnu.org:


Received: (at 78561) by debbugs.gnu.org; 2 Jun 2025 13:06:35 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Mon Jun 02 09:06:35 2025
Received: from localhost ([127.0.0.1]:50227 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1uM4s4-0006LG-C3
	for submit <at> debbugs.gnu.org; Mon, 02 Jun 2025 09:06:35 -0400
Received: from mail-wr1-x429.google.com ([2a00:1450:4864:20::429]:61755)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.84_2) (envelope-from <jroi.martin@HIDDEN>)
 id 1uM4rz-0006KR-79
 for 78561 <at> debbugs.gnu.org; Mon, 02 Jun 2025 09:06:30 -0400
Received: by mail-wr1-x429.google.com with SMTP id
 ffacd0b85a97d-3a503d9ef59so1048354f8f.3
 for <78561 <at> debbugs.gnu.org>; Mon, 02 Jun 2025 06:06:27 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1748869581; x=1749474381; darn=debbugs.gnu.org;
 h=mime-version:message-id:date:references:in-reply-to:subject:cc:to
 :from:from:to:cc:subject:date:message-id:reply-to;
 bh=OuTzJxuVXyokCjZIopmyduZHcqW3Aej8WBZA4PAzNU0=;
 b=Uq5Av/EYJ+A38ZKKcfq9LR0/f5ot1pegJCLT0WW4ywSZPdnbAyr+j2Sr+g5INQFbjF
 DZ89PPJxTLB79PZsgz7oF2hf41j88TUUquGQzUaaz40u49+aaqCAEPCd6Xq19C5ZmkTX
 zwS68qRH/CBPqrcy0v3Oc11kgpU1+j8RHg6YnkGd0u2y86r1d0D/l4OMEQgEirVxrpku
 uiFrdOrZj3ZDF0FXtQPY0+POsP/tTI+ajgcFuNuCxw5x2nIdZ1KCq7zA9ou2JObUwEO2
 9xAQOxF7fOmk/vn3kkMT1pHIyCfIs3nmNfHQcuSM46ltscooZwTgA5figjJXwuzNyknM
 qa0w==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1748869581; x=1749474381;
 h=mime-version:message-id:date:references:in-reply-to:subject:cc:to
 :from:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to;
 bh=OuTzJxuVXyokCjZIopmyduZHcqW3Aej8WBZA4PAzNU0=;
 b=mL1cZnc65CQiTXwiaIvM4KfkNWdGtE1hNhiLN1XLNLDmKEr/gmhDoF8BRrGHDVfHAx
 iu2ytsuAGmlGHbFF6nAOLx0iMTO2vb+yCDoB34UAYIf9nMnZZ0f0e0N+UiS4pJDRys3l
 1WEzpVhIoWfB9HoO6qGqTPUtQA9yptLuFjI0mDBsBa+wmYZQCh1unBc5xkfV2sivZi5m
 mJtN3ADLkrHjI2EgWuJmuGpHRgfGvatx/RVg89KrxxJi/NjIgH4xabbBcBn4SwTrgySc
 ah0QvmftdkeU62It5ityvQx4UWjN+05KniGOQ5HFU/RHgG+deUeyGuvfLvm3q8V7g7Ih
 3eJA==
X-Gm-Message-State: AOJu0Yzzjc5wtoK2Y16R2+TK0ZIa15fHEjZS3RR0Wf5is3wX+X42JXwA
 2DJRe447owYtGJheJA91d9oCt8zNLyjIMBO/9aJJ83m0zBWMeHJO/V5R
X-Gm-Gg: ASbGnctgWUfT9D3l8ev6b1ojg4i9Ei4xezNDJRX7prR2Lbep+a2AuDZQSiHzAIB7fUx
 tAVKfcWszPkeoE4nFRXuqa/ZdFG7lTbvv9+TltwXJ8Vk+OFINR8Kn98skHLUG/cvAyLaFIP+Oo2
 vALH1/VnUENpz5yyjJxOGXNo1EZoWrW6uuw7RnSe3Yl5r3Bf+sCuBxmTtFWQ6qZf85ymq5fIfAy
 r7hTtJ4iyZS+ucGHgkV6yAVHAaioGoZE9KrxXBY/YEn8lwdawzDB0S9IuMBzlMP4Uq+GX7POe34
 Pi6l5otGPkPK0aygjl8DhYQuYDdKxMGg+ya04gtaclFrMIjIWQ==
X-Google-Smtp-Source: AGHT+IFyNnw5Tbj+dUIIbzVre9TXU7GwtDkP7q+30qIDZp6tHPYIeGHPV8WU5CqO5bLjdz33M4EDiQ==
X-Received: by 2002:a05:6000:248a:b0:3a4:e706:530f with SMTP id
 ffacd0b85a97d-3a4fe398991mr6559134f8f.42.1748869580467; 
 Mon, 02 Jun 2025 06:06:20 -0700 (PDT)
Received: from localhost ([84.79.192.255]) by smtp.gmail.com with ESMTPSA id
 ffacd0b85a97d-3a4f00972b5sm14943698f8f.76.2025.06.02.06.06.19
 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);
 Mon, 02 Jun 2025 06:06:19 -0700 (PDT)
From: Roi Martin <jroi.martin@HIDDEN>
To: Eli Zaretskii <eliz@HIDDEN>, Stefan Monnier <monnier@HIDDEN>,
 rms@HIDDEN
Subject: Re: bug#78561: [PATCH] Add semantic linefeed support for paragraph
 filling
In-Reply-To: <86o6v8qd7m.fsf@HIDDEN>
References: <87jz67tzrp.fsf@HIDDEN>
 <jwvr00fqt10.fsf-monnier+emacs@HIDDEN> <87frgs4jfh.fsf@HIDDEN>
 <jwvmsazpdai.fsf-monnier+emacs@HIDDEN> <87bjrehx8d.fsf@HIDDEN>
 <jwvmsayni12.fsf-monnier+emacs@HIDDEN> <875xhkivul.fsf@HIDDEN>
 <jwvy0ucy93e.fsf-monnier+emacs@HIDDEN> <86o6v8qd7m.fsf@HIDDEN>
Date: Mon, 02 Jun 2025 15:06:16 +0200
Message-ID: <87tt4yqomv.fsf@HIDDEN>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="=-=-="
X-Spam-Score: 0.0 (/)
X-Debbugs-Envelope-To: 78561
Cc: mbork@HIDDEN, 78561 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.0 (-)

--=-=-=
Content-Type: text/plain

Eli Zaretskii <eliz@HIDDEN> writes:

> It's okay, but please make sure there are two spaces between
> sentences, not one.  There are quite a few cases in the patch where
> this is not so.

Fixed in doc strings.  The rest of cases correspond to test data where
we want to verify that `sentence-end-double-space' is respected.

> Also, the commit log message should mention the bug number.

Fixed.

RMS replied to me with a review, where he mentioned that this feature
would be more convenient if it were a minor mode.  Eli, Stefan, what do
you think?  If it makes sense, we can add it in a future patch.

Also, with regard to the paragraph:

  For more details about semantic linefeeds, see `https://sembr.org/' and
  `https://rhodesmill.org/brandon/2012/one-sentence-per-line/'."

He raised the following concern:

> This sort of information doesn't belong in an Emacs doc string.
> If some of it isimportant for using this feature right, we
> should state the point in this and other doc strings, or in
> the Emacs Manual,  That way we can propagate it and update it.

> If information is "if you'd like to know more", not necessary for peopke
> to read to know how to use the feature, then we can refer to it on a web page.
> But we need to have reason to be confident that page will exist for many
> years, serving the same purpose, in a way we would not be ashamed to link to.
> 
> Otherwise, depending on it is asking for trouble.
> 
> How much material is importaht to link to for this purpose?

As I previously said, I think it should be fine to add a short
explanation in the doc string or in the manual instead of linking with
external sites that are subject to change or be deleted in the future.

I've attached a new version of the patch.  It includes the following
changes compared to the previous version:

- Separate sentences in doc strings using two spaces.
- Add bug number to commit log message.
- Slightly reword doc strings, following a suggestion from RMS.
- Add test to check that it is possible to "revert" semlf-filling by
  refilling the paragraph, following a suggestion from RMS.

        Roi


--=-=-=
Content-Type: text/x-patch
Content-Disposition: attachment;
 filename=0001-Add-semantic-linefeed-support-for-paragraph-filling.patch

From db5067064d89ea16b2313622be3e6bb32e9293f4 Mon Sep 17 00:00:00 2001
From: Roi Martin <jroi.martin@HIDDEN>
Date: Fri, 21 Mar 2025 14:22:46 +0100
Subject: [PATCH] Add semantic linefeed support for paragraph filling

* lisp/textmodes/fill.el (fill-region-as-paragraph-semlf): Add function
to fill a region using semantic linefeeds as if it were a single
paragraph.
(fill-paragraph-semlf): Add function to fill paragraph using semantic
linefeeds.
* test/lisp/textmodes/fill-tests.el
(fill-test-fill-region-as-paragraph-semlf)
(fill-test-fill-paragraph-semlf)
(fill-test-fill-paragraph-semlf-fill-paragraph-function)
(fill-test-fill-paragraph-semlf-justify)
(fill-test-fill-paragraph-semlf-sentence-end-double-space)
(fill-test-fill-paragraph-semlf-fill-column)
(fill-test-fill-paragraph-semlf-punctuation-marks)
(fill-test-fill-paragraph-semlf-twice)
(fill-test-fill-paragraph-semlf-fill-prefix)
(fill-test-fill-paragraph-semlf-indented-block)
(fill-test-fill-paragraph-semlf-revert)
(fill-test-fill-paragraph-semlf-emacs-lisp-mode)
(fill-test-fill-paragraph-semlf-c-mode)
(fill-test-fill-paragraph-semlf-org-mode)
(fill-test-fill-paragraph-semlf-markdown-mode): Add tests.
* test/lisp/textmodes/fill-resources/semlf-c-mode.erts:
* test/lisp/textmodes/fill-resources/semlf-emacs-lisp-mode.erts:
* test/lisp/textmodes/fill-resources/semlf-fill-column.erts:
* test/lisp/textmodes/fill-resources/semlf-fill-paragraph-function.erts:
* test/lisp/textmodes/fill-resources/semlf-fill-prefix.erts:
* test/lisp/textmodes/fill-resources/semlf-fill-region-as-paragraph.erts:
* test/lisp/textmodes/fill-resources/semlf-indented-block.erts:
* test/lisp/textmodes/fill-resources/semlf-justify.erts:
* test/lisp/textmodes/fill-resources/semlf-markdown-mode.erts:
* test/lisp/textmodes/fill-resources/semlf-org-mode.erts:
* test/lisp/textmodes/fill-resources/semlf-punctuation-marks.erts:
* test/lisp/textmodes/fill-resources/semlf-revert.erts:
* test/lisp/textmodes/fill-resources/semlf-sentence-end-double-space.erts:
* test/lisp/textmodes/fill-resources/semlf-twice.erts:
* test/lisp/textmodes/fill-resources/semlf.erts: Add test data.  (Bug#78561)
---
 lisp/textmodes/fill.el                        |  92 +++++++++
 .../fill-resources/semlf-c-mode.erts          | 183 ++++++++++++++++++
 .../fill-resources/semlf-emacs-lisp-mode.erts |  87 +++++++++
 .../fill-resources/semlf-fill-column.erts     |  15 ++
 .../semlf-fill-paragraph-function.erts        |  12 ++
 .../fill-resources/semlf-fill-prefix.erts     |  35 ++++
 .../semlf-fill-region-as-paragraph.erts       |  37 ++++
 .../fill-resources/semlf-indented-block.erts  |  31 +++
 .../fill-resources/semlf-justify.erts         |  12 ++
 .../fill-resources/semlf-markdown-mode.erts   | 129 ++++++++++++
 .../fill-resources/semlf-org-mode.erts        | 122 ++++++++++++
 .../semlf-punctuation-marks.erts              |  13 ++
 .../fill-resources/semlf-revert.erts          |  11 ++
 .../semlf-sentence-end-double-space.erts      |  13 ++
 .../textmodes/fill-resources/semlf-twice.erts |  12 ++
 test/lisp/textmodes/fill-resources/semlf.erts |  88 +++++++++
 test/lisp/textmodes/fill-tests.el             | 112 +++++++++++
 17 files changed, 1004 insertions(+)
 create mode 100644 test/lisp/textmodes/fill-resources/semlf-c-mode.erts
 create mode 100644 test/lisp/textmodes/fill-resources/semlf-emacs-lisp-mode.erts
 create mode 100644 test/lisp/textmodes/fill-resources/semlf-fill-column.erts
 create mode 100644 test/lisp/textmodes/fill-resources/semlf-fill-paragraph-function.erts
 create mode 100644 test/lisp/textmodes/fill-resources/semlf-fill-prefix.erts
 create mode 100644 test/lisp/textmodes/fill-resources/semlf-fill-region-as-paragraph.erts
 create mode 100644 test/lisp/textmodes/fill-resources/semlf-indented-block.erts
 create mode 100644 test/lisp/textmodes/fill-resources/semlf-justify.erts
 create mode 100644 test/lisp/textmodes/fill-resources/semlf-markdown-mode.erts
 create mode 100644 test/lisp/textmodes/fill-resources/semlf-org-mode.erts
 create mode 100644 test/lisp/textmodes/fill-resources/semlf-punctuation-marks.erts
 create mode 100644 test/lisp/textmodes/fill-resources/semlf-revert.erts
 create mode 100644 test/lisp/textmodes/fill-resources/semlf-sentence-end-double-space.erts
 create mode 100644 test/lisp/textmodes/fill-resources/semlf-twice.erts
 create mode 100644 test/lisp/textmodes/fill-resources/semlf.erts

diff --git a/lisp/textmodes/fill.el b/lisp/textmodes/fill.el
index e38d030734fb..386a88bda3a8 100644
--- a/lisp/textmodes/fill.el
+++ b/lisp/textmodes/fill.el
@@ -1583,4 +1583,96 @@ fill-individual-paragraphs-citation
 	"")
     string))
 
+(defun fill-region-as-paragraph-semlf (from to &optional justify
+                                            nosqueeze squeeze-after)
+  "Fill the region using semantic linefeeds as if it were a single paragraph.
+This command removes any paragraph breaks in the region and extra
+newlines at the end, and fills lines within the region.  Text is
+refilled putting a newline character after each sentence, calling
+`forward-sentence' to find the ends of sentences.  If
+`sentence-end-double-space' is non-nil, period followed by one space is
+not the end of a sentence.
+
+If JUSTIFY is non-nil (interactively, with prefix argument), justify as
+well.  If NOSQUEEZE is non-nil, do not to make spaces between words
+canonical before filling.  SQUEEZE-AFTER, if non-nil, should be a buffer
+position; it means canonicalize spaces only starting from that position.
+See `canonically-space-region' for the meaning of canonicalization of
+spaces.  The variable `fill-column' controls the width for filling.
+
+Return the `fill-prefix' used for filling.
+
+For more details about semantic linefeeds, see `fill-paragraph-semlf'."
+  (interactive (progn
+		 (barf-if-buffer-read-only)
+		 (list (region-beginning)
+                       (region-end)
+		       (if current-prefix-arg 'full))))
+  (unless (memq justify '(t nil none full center left right))
+    (setq justify 'full))
+
+  (let ((from (min from to))
+        (to (max from to))
+        pfx)
+    (goto-char from)
+    (with-restriction (line-beginning-position) to
+      (let ((fill-column (point-max)))
+        (setq pfx (or (save-excursion
+                        (fill-region-as-paragraph (point)
+                                                  (point-max)
+                                                  nil
+                                                  nosqueeze
+                                                  squeeze-after))
+                      "")))
+      (while (not (eobp))
+        (let ((fill-prefix pfx))
+	  (fill-region-as-paragraph (point)
+				    (progn (forward-sentence) (point))
+				    justify
+                                    nosqueeze
+                                    squeeze-after))
+        (when (and (> (point) (line-beginning-position))
+		   (< (point) (line-end-position)))
+	  (delete-horizontal-space)
+	  (insert "\n")
+	  (insert pfx))))
+    (unless (eobp) (forward-char 1))
+    pfx))
+
+(defun fill-paragraph-semlf (&optional justify)
+  "Fill paragraph at or after point using semantic linefeeds.
+Refill text putting a newline character after each sentence, calling
+`forward-sentence' to find the ends of sentences.  If
+`sentence-end-double-space' is non-nil, period followed by one space is
+not the end of a sentence.
+
+If JUSTIFY is non-nil (interactively, with prefix argument), justify as
+well.  The variable `fill-column' controls the width for filling.
+
+Return the `fill-prefix' used for filling.
+
+You can use this function as the value of `fill-paragraph-function', so
+`fill-paragraph' and other filling commands will use it.
+
+For more details about semantic linefeeds, see `https://sembr.org/' and
+`https://rhodesmill.org/brandon/2012/one-sentence-per-line/'."
+  (interactive (progn
+		 (barf-if-buffer-read-only)
+		 (list (if current-prefix-arg 'full))))
+  (unless (memq justify '(t nil none full center left right))
+    (setq justify 'full))
+
+  (save-excursion
+    (let ((to (progn
+		(fill-forward-paragraph 1)
+		(backward-word)
+		(end-of-line)
+		(point)))
+	  (from (progn
+		  (fill-forward-paragraph -1)
+		  (forward-word)
+		  (beginning-of-line)
+		  (point))))
+      (fill-region-as-paragraph-semlf from to justify))))
+
 ;;; fill.el ends here
diff --git a/test/lisp/textmodes/fill-resources/semlf-c-mode.erts b/test/lisp/textmodes/fill-resources/semlf-c-mode.erts
new file mode 100644
index 000000000000..a28eb68cfc6a
--- /dev/null
+++ b/test/lisp/textmodes/fill-resources/semlf-c-mode.erts
@@ -0,0 +1,183 @@
+Point-Char: |
+
+Name: c-mode - single-line
+
+=-=
+// Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+// eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+// ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+// Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+// eiusmod tempor.
+// Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+// veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
+
+Name: c-mode - single-line - fill-prefix - marker
+
+=-=
+// - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+// - Aliquip ex ea commodo consequat.  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
+// - Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+=-=
+// - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+// - eiusmod tempor.
+// - Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+// - veniam, quis nostrud exercitation ullamco laboris nisi ut.
+// - Aliquip ex ea commodo consequat.
+// - Duis aute irure dolor in reprehenderit in voluptate velit esse
+// - cillum dolore eu fugiat nulla pariatur.
+// - Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+// - officia deserunt mollit anim id est laborum.
+=-=-=
+
+Name: c-mode - single-line - fill-prefix - whitespace
+
+=-=
+// - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+//   Aliquip ex ea commodo consequat.  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
+//   Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+=-=
+// - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+//   eiusmod tempor.
+//   Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+//   veniam, quis nostrud exercitation ullamco laboris nisi ut.
+//   Aliquip ex ea commodo consequat.
+//   Duis aute irure dolor in reprehenderit in voluptate velit esse
+//   cillum dolore eu fugiat nulla pariatur.
+//   Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+//   officia deserunt mollit anim id est laborum.
+=-=-=
+
+Name: c-mode - single-line - indented block
+
+=-=
+// Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+// eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut
+// enim ad minim veniam, quis nostrud exercitation ullamco laboris
+// nisi ut.
+//
+// 	|Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed
+// 	do eiusmod tempor.  Incididunt ut labore et dolore magna
+// 	aliqua. Ut enim ad minim veniam, quis nostrud exercitation
+// 	ullamco laboris nisi ut.
+//
+// Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+// eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut
+// enim ad minim veniam, quis nostrud exercitation ullamco laboris
+// nisi ut.
+=-=
+// Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+// eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut
+// enim ad minim veniam, quis nostrud exercitation ullamco laboris
+// nisi ut.
+//
+// 	Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed
+// 	do eiusmod tempor.
+// 	Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+// 	veniam, quis nostrud exercitation ullamco laboris nisi ut.
+//
+// Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+// eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut
+// enim ad minim veniam, quis nostrud exercitation ullamco laboris
+// nisi ut.
+=-=-=
+
+Name: c-mode - multi-line
+
+=-=
+/*
+ * Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+ * eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ * ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+ */
+=-=
+/*
+ * Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+ * eiusmod tempor.
+ * Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+ * veniam, quis nostrud exercitation ullamco laboris nisi ut.
+ */
+=-=-=
+
+Name: c-mode - multi-line - fill-prefix - marker
+
+=-=
+/*
+ * - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+ * - Aliquip ex ea commodo consequat.  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
+ * - Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ */
+=-=
+/*
+ * - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+ * - eiusmod tempor.
+ * - Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+ * - veniam, quis nostrud exercitation ullamco laboris nisi ut.
+ * - Aliquip ex ea commodo consequat.
+ * - Duis aute irure dolor in reprehenderit in voluptate velit esse
+ * - cillum dolore eu fugiat nulla pariatur.
+ * - Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+ * - officia deserunt mollit anim id est laborum.
+ */
+=-=-=
+
+Name: c-mode - multi-line - fill-prefix - whitespace
+
+=-=
+/*
+ * - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+ *   Aliquip ex ea commodo consequat.  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
+ *   Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ */
+=-=
+/*
+ * - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+ *   eiusmod tempor.
+ *   Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+ *   veniam, quis nostrud exercitation ullamco laboris nisi ut.
+ *   Aliquip ex ea commodo consequat.
+ *   Duis aute irure dolor in reprehenderit in voluptate velit esse
+ *   cillum dolore eu fugiat nulla pariatur.
+ *   Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+ *   officia deserunt mollit anim id est laborum.
+ */
+=-=-=
+
+Name: c-mode - multi-line - indented block
+
+=-=
+/*
+ * Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+ * eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut
+ * enim ad minim veniam, quis nostrud exercitation ullamco laboris
+ * nisi ut.
+ *
+ * 	|Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed
+ * 	do eiusmod tempor.  Incididunt ut labore et dolore magna
+ * 	aliqua. Ut enim ad minim veniam, quis nostrud exercitation
+ * 	ullamco laboris nisi ut.
+ *
+ * Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+ * eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut
+ * enim ad minim veniam, quis nostrud exercitation ullamco laboris
+ * nisi ut.
+ */
+=-=
+/*
+ * Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+ * eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut
+ * enim ad minim veniam, quis nostrud exercitation ullamco laboris
+ * nisi ut.
+ *
+ * 	Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed
+ * 	do eiusmod tempor.
+ * 	Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+ * 	veniam, quis nostrud exercitation ullamco laboris nisi ut.
+ *
+ * Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+ * eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut
+ * enim ad minim veniam, quis nostrud exercitation ullamco laboris
+ * nisi ut.
+ */
+=-=-=
diff --git a/test/lisp/textmodes/fill-resources/semlf-emacs-lisp-mode.erts b/test/lisp/textmodes/fill-resources/semlf-emacs-lisp-mode.erts
new file mode 100644
index 000000000000..fe71ee32c1aa
--- /dev/null
+++ b/test/lisp/textmodes/fill-resources/semlf-emacs-lisp-mode.erts
@@ -0,0 +1,87 @@
+Point-Char: |
+
+Name: emacs-lisp-mode
+
+=-=
+;; Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+;; eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+;; ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+;; Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+;; eiusmod tempor.
+;; Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+;; veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
+
+Name: emacs-lisp-mode - fill-prefix - marker
+
+=-=
+;; - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+;; - Aliquip ex ea commodo consequat.  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
+;; - Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+=-=
+;; - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+;; - eiusmod tempor.
+;; - Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+;; - veniam, quis nostrud exercitation ullamco laboris nisi ut.
+;; - Aliquip ex ea commodo consequat.
+;; - Duis aute irure dolor in reprehenderit in voluptate velit esse
+;; - cillum dolore eu fugiat nulla pariatur.
+;; - Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+;; - officia deserunt mollit anim id est laborum.
+=-=-=
+
+Name: emacs-lisp-mode - fill-prefix - whitespace
+
+=-=
+;; - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+;;   Aliquip ex ea commodo consequat.  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
+;;   Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+=-=
+;; - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+;;   eiusmod tempor.
+;;   Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+;;   veniam, quis nostrud exercitation ullamco laboris nisi ut.
+;;   Aliquip ex ea commodo consequat.
+;;   Duis aute irure dolor in reprehenderit in voluptate velit esse
+;;   cillum dolore eu fugiat nulla pariatur.
+;;   Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+;;   officia deserunt mollit anim id est laborum.
+=-=-=
+
+Name: emacs-lisp-mode - indented block
+
+The `fill-forward-paragraph' function jumps to the beginning/end of
+the comment.
+
+=-=
+;; Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+;; eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut
+;; enim ad minim veniam, quis nostrud exercitation ullamco laboris
+;; nisi ut.
+
+;; 	|Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed
+;; 	do eiusmod tempor.  Incididunt ut labore et dolore magna
+;; 	aliqua. Ut enim ad minim veniam, quis nostrud exercitation
+;; 	ullamco laboris nisi ut.
+
+;; Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+;; eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut
+;; enim ad minim veniam, quis nostrud exercitation ullamco laboris
+;; nisi ut.
+=-=
+;; Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+;; eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut
+;; enim ad minim veniam, quis nostrud exercitation ullamco laboris
+;; nisi ut.
+
+;; 	Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed
+;; 	do eiusmod tempor.
+;; 	Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+;; 	veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+;; Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+;; eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut
+;; enim ad minim veniam, quis nostrud exercitation ullamco laboris
+;; nisi ut.
+=-=-=
diff --git a/test/lisp/textmodes/fill-resources/semlf-fill-column.erts b/test/lisp/textmodes/fill-resources/semlf-fill-column.erts
new file mode 100644
index 000000000000..20db7b1f9c5b
--- /dev/null
+++ b/test/lisp/textmodes/fill-resources/semlf-fill-column.erts
@@ -0,0 +1,15 @@
+Name: fill-column
+
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+Lorem ipsum dolor sit amet,
+consectetur adipiscing elit, sed do
+eiusmod tempor.
+Incididunt ut labore et dolore
+magna aliqua. Ut enim ad minim
+veniam, quis nostrud exercitation
+ullamco laboris nisi ut.
+=-=-=
diff --git a/test/lisp/textmodes/fill-resources/semlf-fill-paragraph-function.erts b/test/lisp/textmodes/fill-resources/semlf-fill-paragraph-function.erts
new file mode 100644
index 000000000000..467e7401cf50
--- /dev/null
+++ b/test/lisp/textmodes/fill-resources/semlf-fill-paragraph-function.erts
@@ -0,0 +1,12 @@
+Name: fill-paragraph-function
+
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.
+Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
+quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
diff --git a/test/lisp/textmodes/fill-resources/semlf-fill-prefix.erts b/test/lisp/textmodes/fill-resources/semlf-fill-prefix.erts
new file mode 100644
index 000000000000..e067eff69701
--- /dev/null
+++ b/test/lisp/textmodes/fill-resources/semlf-fill-prefix.erts
@@ -0,0 +1,35 @@
+Name: fill-prefix - marker
+
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+- Aliquip ex ea commodo consequat.  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
+- Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+- eiusmod tempor.
+- Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+- veniam, quis nostrud exercitation ullamco laboris nisi ut.
+- Aliquip ex ea commodo consequat.
+- Duis aute irure dolor in reprehenderit in voluptate velit esse
+- cillum dolore eu fugiat nulla pariatur.
+- Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+- officia deserunt mollit anim id est laborum.
+=-=-=
+
+Name: fill-prefix - whitespace
+
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+  Aliquip ex ea commodo consequat.  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
+  Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+  eiusmod tempor.
+  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+  veniam, quis nostrud exercitation ullamco laboris nisi ut.
+  Aliquip ex ea commodo consequat.
+  Duis aute irure dolor in reprehenderit in voluptate velit esse
+  cillum dolore eu fugiat nulla pariatur.
+  Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+  officia deserunt mollit anim id est laborum.
+=-=-=
diff --git a/test/lisp/textmodes/fill-resources/semlf-fill-region-as-paragraph.erts b/test/lisp/textmodes/fill-resources/semlf-fill-region-as-paragraph.erts
new file mode 100644
index 000000000000..114eaa46fc3c
--- /dev/null
+++ b/test/lisp/textmodes/fill-resources/semlf-fill-region-as-paragraph.erts
@@ -0,0 +1,37 @@
+Point-Char: |
+
+Name: fill-region-as-paragraph-semlf
+
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, s|ed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed
+do eiusmod tempor.
+Incididunt ut labore et dolore
+magna aliqua. Ut enim ad minim
+veniam, quis nostrud exercitation
+ullamco laboris nisi ut.
+Lorem ipsum dolor sit amet,
+consectetur adipiscing elit, sed do
+eiusmod tempor.
+Incididunt ut labore et dolore
+magna aliqua. Ut enim ad minim
+veniam, quis nostrud exercitation
+ullamco laboris nisi ut.
+Lorem ipsum dolor sit amet,
+consectetur adipiscing elit, sed do
+eiusmod tempor.
+Incididunt ut labore et dolore
+magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
diff --git a/test/lisp/textmodes/fill-resources/semlf-indented-block.erts b/test/lisp/textmodes/fill-resources/semlf-indented-block.erts
new file mode 100644
index 000000000000..e483567c6ab3
--- /dev/null
+++ b/test/lisp/textmodes/fill-resources/semlf-indented-block.erts
@@ -0,0 +1,31 @@
+Point-Char: |
+
+Name: indented block
+
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+	|Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed
+	do eiusmod tempor.  Incididunt ut labore et dolore magna
+	aliqua. Ut enim ad minim veniam, quis nostrud exercitation
+	ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+	Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed
+	do eiusmod tempor.
+	Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+	veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
diff --git a/test/lisp/textmodes/fill-resources/semlf-justify.erts b/test/lisp/textmodes/fill-resources/semlf-justify.erts
new file mode 100644
index 000000000000..3a951b7ce424
--- /dev/null
+++ b/test/lisp/textmodes/fill-resources/semlf-justify.erts
@@ -0,0 +1,12 @@
+Name: justify
+
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+Lorem  ipsum  dolor sit  amet,  consectetur  adipiscing elit,  sed  do
+eiusmod tempor.
+Incididunt ut labore et dolore magna  aliqua. Ut enim ad minim veniam,
+quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
diff --git a/test/lisp/textmodes/fill-resources/semlf-markdown-mode.erts b/test/lisp/textmodes/fill-resources/semlf-markdown-mode.erts
new file mode 100644
index 000000000000..7257708c245d
--- /dev/null
+++ b/test/lisp/textmodes/fill-resources/semlf-markdown-mode.erts
@@ -0,0 +1,129 @@
+Point-Char: |
+
+Name: markdown-mode
+
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.
+Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
+quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
+
+Name: markdown-mode - list - one single-line item
+
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+  eiusmod tempor.
+  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+  veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
+
+Name: markdown-mode - list - multiple single-line items
+
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+- Aliquip ex ea commodo consequat.  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
+- Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+  eiusmod tempor.
+  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+  veniam, quis nostrud exercitation ullamco laboris nisi ut.
+- Aliquip ex ea commodo consequat.  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
+- Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+=-=-=
+
+Name: markdown-mode - list - one multi-line item
+
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+  eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut
+  enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi
+  ut.
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+  eiusmod tempor.
+  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+  veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
+
+Name: markdown-mode - list - multiple multi-line items
+
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+  eiusmod tempor.  Incididunt ut labore et dolore magn a aliqua. Ut
+  enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi
+  ut.
+- Aliquip ex ea commodo consequat.  Duis aute irure dolor in
+  reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
+  pariatur.
+- Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+  officia deserunt mollit anim id est laborum.
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+  eiusmod tempor.
+  Incididunt ut labore et dolore magn a aliqua. Ut enim ad minim
+  veniam, quis nostrud exercitation ullamco laboris nisi ut.
+- Aliquip ex ea commodo consequat.  Duis aute irure dolor in
+  reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
+  pariatur.
+- Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+  officia deserunt mollit anim id est laborum.
+=-=-=
+
+Name: markdown-mode - list - short sentence in multi-line item
+
+=-=
+- Lorem ipsum dolor.  Sit amet, consectetur adipiscing elit, sed do
+  eiusmod tempor.  Incididunt ut labore et dolore magn a aliqua. Ut
+  enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi
+  ut.
+=-=
+- Lorem ipsum dolor.
+  Sit amet, consectetur adipiscing elit, sed do eiusmod tempor.
+  Incididunt ut labore et dolore magn a aliqua. Ut enim ad minim
+  veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
+
+Name: markdown-mode - indented block
+Skip: t
+
+TODO - In `markdown-mode', the `fill-forward-paragraph' function
+ignores code blocks.  We should reach out to the `markdown-mode'
+maintainer(s) to understand the reason for this and possibly suggest a
+change to this behavior.  This works as expected in
+`markdown-ts-mode'.
+
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+	|Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed
+	do eiusmod tempor.  Incididunt ut labore et dolore magna
+	aliqua. Ut enim ad minim veniam, quis nostrud exercitation
+	ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+	Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed
+	do eiusmod tempor.
+	Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+	veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
diff --git a/test/lisp/textmodes/fill-resources/semlf-org-mode.erts b/test/lisp/textmodes/fill-resources/semlf-org-mode.erts
new file mode 100644
index 000000000000..81dd4841de94
--- /dev/null
+++ b/test/lisp/textmodes/fill-resources/semlf-org-mode.erts
@@ -0,0 +1,122 @@
+Point-Char: |
+
+Name: org-mode
+
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.
+Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
+quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
+
+Name: org-mode - list - one single-line item
+
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+  eiusmod tempor.
+  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+  veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
+
+Name: org-mode - list - multiple single-line items
+
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+- Aliquip ex ea commodo consequat.  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
+- Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+  eiusmod tempor.
+  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+  veniam, quis nostrud exercitation ullamco laboris nisi ut.
+- Aliquip ex ea commodo consequat.  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
+- Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+=-=-=
+
+Name: org-mode - list - one multi-line item
+
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+  eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut
+  enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi
+  ut.
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+  eiusmod tempor.
+  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+  veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
+
+Name: org-mode - list - multiple multi-line items
+
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+  eiusmod tempor.  Incididunt ut labore et dolore magn a aliqua. Ut
+  enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi
+  ut.
+- Aliquip ex ea commodo consequat.  Duis aute irure dolor in
+  reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
+  pariatur.
+- Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+  officia deserunt mollit anim id est laborum.
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+  eiusmod tempor.
+  Incididunt ut labore et dolore magn a aliqua. Ut enim ad minim
+  veniam, quis nostrud exercitation ullamco laboris nisi ut.
+- Aliquip ex ea commodo consequat.  Duis aute irure dolor in
+  reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
+  pariatur.
+- Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+  officia deserunt mollit anim id est laborum.
+=-=-=
+
+Name: org-mode - list - short sentence in multi-line item
+
+=-=
+- Lorem ipsum dolor.  Sit amet, consectetur adipiscing elit, sed do
+  eiusmod tempor.  Incididunt ut labore et dolore magn a aliqua. Ut
+  enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi
+  ut.
+=-=
+- Lorem ipsum dolor.
+  Sit amet, consectetur adipiscing elit, sed do eiusmod tempor.
+  Incididunt ut labore et dolore magn a aliqua. Ut enim ad minim
+  veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
+
+Name: org-mode - indented block
+
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+	|Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed
+	do eiusmod tempor.  Incididunt ut labore et dolore magna
+	aliqua. Ut enim ad minim veniam, quis nostrud exercitation
+	ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+	Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed
+	do eiusmod tempor.
+	Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+	veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
diff --git a/test/lisp/textmodes/fill-resources/semlf-punctuation-marks.erts b/test/lisp/textmodes/fill-resources/semlf-punctuation-marks.erts
new file mode 100644
index 000000000000..5346216e9f9c
--- /dev/null
+++ b/test/lisp/textmodes/fill-resources/semlf-punctuation-marks.erts
@@ -0,0 +1,13 @@
+Name: punctuation marks
+
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua!  Ut enim
+ad minim veniam?  Quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.
+Incididunt ut labore et dolore magna aliqua!
+Ut enim ad minim veniam?
+Quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
diff --git a/test/lisp/textmodes/fill-resources/semlf-revert.erts b/test/lisp/textmodes/fill-resources/semlf-revert.erts
new file mode 100644
index 000000000000..d3efca50de6d
--- /dev/null
+++ b/test/lisp/textmodes/fill-resources/semlf-revert.erts
@@ -0,0 +1,11 @@
+Name: revert
+
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
diff --git a/test/lisp/textmodes/fill-resources/semlf-sentence-end-double-space.erts b/test/lisp/textmodes/fill-resources/semlf-sentence-end-double-space.erts
new file mode 100644
index 000000000000..a01beed0f665
--- /dev/null
+++ b/test/lisp/textmodes/fill-resources/semlf-sentence-end-double-space.erts
@@ -0,0 +1,13 @@
+Name: sentence-end-double-space
+
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.
+Incididunt ut labore et dolore magna aliqua.
+Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris
+nisi ut.
+=-=-=
diff --git a/test/lisp/textmodes/fill-resources/semlf-twice.erts b/test/lisp/textmodes/fill-resources/semlf-twice.erts
new file mode 100644
index 000000000000..862dda6e27eb
--- /dev/null
+++ b/test/lisp/textmodes/fill-resources/semlf-twice.erts
@@ -0,0 +1,12 @@
+Name: fill twice
+
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.
+Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
+quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
diff --git a/test/lisp/textmodes/fill-resources/semlf.erts b/test/lisp/textmodes/fill-resources/semlf.erts
new file mode 100644
index 000000000000..f3e331cd9381
--- /dev/null
+++ b/test/lisp/textmodes/fill-resources/semlf.erts
@@ -0,0 +1,88 @@
+Point-Char: |
+
+Name: beginning of buffer
+
+=-=
+|Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.
+Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
+quis nostrud exercitation ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
+
+Name: second paragraph
+
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+|Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.
+Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
+quis nostrud exercitation ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
+
+Name: end of buffer
+
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.|
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.
+Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
+quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
diff --git a/test/lisp/textmodes/fill-tests.el b/test/lisp/textmodes/fill-tests.el
index 6e079973100e..8fbd9919bad0 100644
--- a/test/lisp/textmodes/fill-tests.el
+++ b/test/lisp/textmodes/fill-tests.el
@@ -28,6 +28,7 @@
 ;;; Code:
 
 (require 'ert)
+(require 'ert-x)
 
 (ert-deftest fill-test-no-fill-polish-nobreak-p nil
   "Tests of the `fill-polish-nobreak-p' function."
@@ -121,6 +122,117 @@ test-fill-haskell
   ;; w
 ")))
 
+
+(ert-deftest fill-test-fill-region-as-paragraph-semlf ()
+  "Test the `fill-region-as-paragraph-semlf' function."
+  (ert-test-erts-file (ert-resource-file "semlf-fill-region-as-paragraph.erts")
+                      (lambda ()
+			(setq-local fill-column 35)
+			(fill-region-as-paragraph-semlf
+                         (point)
+                         (progn
+                           (goto-char (point-max))
+                           (forward-line -1)
+                           (beginning-of-line)
+                           (point))))))
+
+(ert-deftest fill-test-fill-paragraph-semlf ()
+  "Test the `fill-paragraph-semlf' function."
+  (ert-test-erts-file (ert-resource-file "semlf.erts")
+                      (lambda ()
+			(fill-paragraph-semlf))))
+
+(ert-deftest fill-test-fill-paragraph-semlf-fill-paragraph-function ()
+  "Test `fill-paragraph-semlf' as `fill-paragraph-function'."
+  (ert-test-erts-file (ert-resource-file "semlf-fill-paragraph-function.erts")
+                      (lambda ()
+			(setq-local fill-paragraph-function #'fill-paragraph-semlf)
+			(fill-paragraph))))
+
+(ert-deftest fill-test-fill-paragraph-semlf-justify ()
+  "Test the JUSTIFY parameter of the `fill-paragraph-semlf' function."
+  (ert-test-erts-file (ert-resource-file "semlf-justify.erts")
+                      (lambda ()
+			(fill-paragraph-semlf 'justify))))
+
+(ert-deftest fill-test-fill-paragraph-semlf-sentence-end-double-space ()
+  "Test the `fill-paragraph-semlf' function with `sentence-end-double-space'."
+  (ert-test-erts-file (ert-resource-file "semlf-sentence-end-double-space.erts")
+                      (lambda ()
+			(setq-local sentence-end-double-space nil)
+			(fill-paragraph-semlf))))
+
+(ert-deftest fill-test-fill-paragraph-semlf-fill-column ()
+  "Test the `fill-paragraph-semlf' function with `fill-column'."
+  (ert-test-erts-file (ert-resource-file "semlf-fill-column.erts")
+                      (lambda ()
+			(setq-local fill-column 35)
+			(fill-paragraph-semlf))))
+
+(ert-deftest fill-test-fill-paragraph-semlf-punctuation-marks ()
+  "Test the `fill-paragraph-semlf' function with different punctuation marks."
+  (ert-test-erts-file (ert-resource-file "semlf-punctuation-marks.erts")
+                      (lambda ()
+			(fill-paragraph-semlf))))
+
+(ert-deftest fill-test-fill-paragraph-semlf-twice ()
+  "Test to run the `fill-paragraph-semlf' function twice."
+  (ert-test-erts-file (ert-resource-file "semlf-twice.erts")
+                      (lambda ()
+			(goto-char (point-min))
+			(fill-paragraph-semlf)
+			(goto-char (point-min))
+			(fill-paragraph-semlf))))
+
+(ert-deftest fill-test-fill-paragraph-semlf-fill-prefix ()
+  "Test the `fill-paragraph-semlf' function with different fill prefixes."
+  (ert-test-erts-file (ert-resource-file "semlf-fill-prefix.erts")
+                      (lambda ()
+			(fill-paragraph-semlf))))
+
+(ert-deftest fill-test-fill-paragraph-semlf-indented-block ()
+  "Test the `fill-paragraph-semlf' function with an indented block."
+  (ert-test-erts-file (ert-resource-file "semlf-indented-block.erts")
+                      (lambda ()
+			(fill-paragraph-semlf))))
+
+(ert-deftest fill-test-fill-paragraph-semlf-revert ()
+  "Test that the `fill-paragraph-semlf' function can be reverted."
+  (ert-test-erts-file (ert-resource-file "semlf-revert.erts")
+                      (lambda ()
+                        (fill-paragraph)
+			(fill-paragraph-semlf)
+                        (fill-paragraph))))
+
+(ert-deftest fill-test-fill-paragraph-semlf-emacs-lisp-mode ()
+  "Test the `fill-paragraph-semlf' function with `emacs-lisp-mode'."
+  (ert-test-erts-file (ert-resource-file "semlf-emacs-lisp-mode.erts")
+                      (lambda ()
+			(emacs-lisp-mode)
+			(fill-paragraph-semlf))))
+
+(ert-deftest fill-test-fill-paragraph-semlf-c-mode ()
+  "Test the `fill-paragraph-semlf' function with `c-mode'."
+  (ert-test-erts-file (ert-resource-file "semlf-c-mode.erts")
+                      (lambda ()
+			(c-mode)
+			(fill-paragraph-semlf))))
+
+(ert-deftest fill-test-fill-paragraph-semlf-org-mode ()
+  "Test the `fill-paragraph-semlf' function with `org-mode'."
+  (ert-test-erts-file (ert-resource-file "semlf-org-mode.erts")
+                      (lambda ()
+			(org-mode)
+			(fill-paragraph-semlf))))
+
+(ert-deftest fill-test-fill-paragraph-semlf-markdown-mode ()
+  "Test the `fill-paragraph-semlf' function with `markdown-mode'."
+  (skip-unless (functionp 'markdown-mode))
+  (ert-test-erts-file (ert-resource-file "semlf-markdown-mode.erts")
+                      (lambda ()
+			(markdown-mode)
+			(fill-paragraph-semlf))))
+
 (provide 'fill-tests)
 
 ;;; fill-tests.el ends here
-- 
2.49.0


--=-=-=--




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#78561; Package emacs. Full text available.

Message received at 78561 <at> debbugs.gnu.org:


Received: (at 78561) by debbugs.gnu.org; 1 Jun 2025 04:48:45 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Sun Jun 01 00:48:45 2025
Received: from localhost ([127.0.0.1]:35119 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1uLacm-0002v7-0K
	for submit <at> debbugs.gnu.org; Sun, 01 Jun 2025 00:48:45 -0400
Received: from eggs.gnu.org ([2001:470:142:3::10]:59734)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.84_2) (envelope-from <eliz@HIDDEN>) id 1uLach-0002tT-A2
 for 78561 <at> debbugs.gnu.org; Sun, 01 Jun 2025 00:48:40 -0400
Received: from fencepost.gnu.org ([2001:470:142:3::e])
 by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.90_1) (envelope-from <eliz@HIDDEN>)
 id 1uLaca-00022c-O4; Sun, 01 Jun 2025 00:48:32 -0400
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org;
 s=fencepost-gnu-org; h=References:Subject:In-Reply-To:To:From:Date:
 mime-version; bh=9vm/Pg8C9eNwgBht4wIO8WbVPAzPZPNocNc8k2Qjhb0=; b=JzmAW7LAoCWH
 gryiXY3v9FgVWb5nsly+RYQ4NZQzvok3j47NP8TRToINd85XBauU4G8jsLj7ihItZC1nwKRB4VRcM
 U7ClbZuFRm162r3Ll40pStnfgzjT+N+nmmDtNHyC+9Ixi5qvvICcPyNdNNmHXn6vDFl3+Z9tF39i1
 xWgmmOHt4eWRqxGnWgVp2lvYUMN5g8Qle+HVVloVd7YB4VAPTDbdv/13o6alQPaAYChN+X+9fLk1q
 ATu1Z7N1SJHyGrNX9UDE+w0L8lITn8BCAFKPb5murL5rwwxAf+Qgbc1X7C4okpN4lXvxHfboRq/fH
 lEP9sXLr4S9Nswr4pxWPcA==;
Date: Sun, 01 Jun 2025 07:48:29 +0300
Message-Id: <86o6v8qd7m.fsf@HIDDEN>
From: Eli Zaretskii <eliz@HIDDEN>
To: Stefan Monnier <monnier@HIDDEN>
In-Reply-To: <jwvy0ucy93e.fsf-monnier+emacs@HIDDEN> (message from Stefan
 Monnier on Sat, 31 May 2025 13:39:52 -0400)
Subject: Re: bug#78561: [PATCH] Add semantic linefeed support for paragraph
 filling
References: <87jz67tzrp.fsf@HIDDEN> <jwvr00fqt10.fsf-monnier+emacs@HIDDEN>
 <87frgs4jfh.fsf@HIDDEN> <jwvmsazpdai.fsf-monnier+emacs@HIDDEN>
 <87bjrehx8d.fsf@HIDDEN> <jwvmsayni12.fsf-monnier+emacs@HIDDEN>
 <875xhkivul.fsf@HIDDEN> <jwvy0ucy93e.fsf-monnier+emacs@HIDDEN>
X-Spam-Score: -2.3 (--)
X-Debbugs-Envelope-To: 78561
Cc: mbork@HIDDEN, jroi.martin@HIDDEN, 78561 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -3.3 (---)

> From: Stefan Monnier <monnier@HIDDEN>
> Cc: Eli Zaretskii <eliz@HIDDEN>,  78561 <at> debbugs.gnu.org,  Marcin Borkowski
>  <mbork@HIDDEN>
> Date: Sat, 31 May 2025 13:39:52 -0400
> 
> >> I recommend you first finish the current patch and take on that
> >> plan afterwards.
> >> What I'm asking is a fairly small refactoring of the code you sent,
> >> I think.
> >
> > Please, find attached a new version of the patch.
> 
> Looks good to me.  Eli?

It's okay, but please make sure there are two spaces between
sentences, not one.  There are quite a few cases in the patch where
this is not so.

Also, the commit log message should mention the bug number.

Thanks.




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#78561; Package emacs. Full text available.

Message received at 78561 <at> debbugs.gnu.org:


Received: (at 78561) by debbugs.gnu.org; 31 May 2025 17:40:12 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Sat May 31 13:40:12 2025
Received: from localhost ([127.0.0.1]:59580 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1uLQBm-0000Im-Bm
	for submit <at> debbugs.gnu.org; Sat, 31 May 2025 13:40:11 -0400
Received: from mailscanner.iro.umontreal.ca ([132.204.25.50]:30884)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.84_2) (envelope-from <monnier@HIDDEN>)
 id 1uLQBh-0000Gv-Fu
 for 78561 <at> debbugs.gnu.org; Sat, 31 May 2025 13:40:08 -0400
Received: from pmg3.iro.umontreal.ca (localhost [127.0.0.1])
 by pmg3.iro.umontreal.ca (Proxmox) with ESMTP id 1FC7F440871;
 Sat, 31 May 2025 13:39:59 -0400 (EDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=iro.umontreal.ca;
 s=mail; t=1748713194;
 bh=m7ULPBB1HXO7dm2u8BJOx5MPICkaaDDvEAzJc6hB0Ko=;
 h=From:To:Cc:Subject:In-Reply-To:References:Date:From;
 b=KJvPrl9/CGf7vpMmLHZlkseb6iy7YpokqcaLlfmdy094XYIi0pEVsnB7IsmZ8p3Um
 /W4CsMWy8cgSTTD6uaujjy8X4eWY1lJ37EeCoUiR4U6/+MgIWX8QyoAdnqyFvMETe3
 WkY6ij43g7hYb90N78OG9SURqYudckWAw5Fxzl+LGXHIz7fQkY+ytnQI4XV2Ver3Yk
 ntiZstpfJCUjxYWIn/tp5opKtYaigzrY0UwfxqTG9ckq4RYMM1RpWu17oX5beiENt8
 Z7SQj0wIUdD75dAEcckVe/bFa6dPKX0OoW8UTdV6ofwYYZ1jlhDHZQ6bbsFIDs8gCc
 c/zxfCOwF3NVQ==
Received: from mail01.iro.umontreal.ca (unknown [172.31.2.1])
 by pmg3.iro.umontreal.ca (Proxmox) with ESMTP id F0005440BA2;
 Sat, 31 May 2025 13:39:53 -0400 (EDT)
Received: from alfajor (unknown [104.247.225.139])
 by mail01.iro.umontreal.ca (Postfix) with ESMTPSA id 9FC2A12023A;
 Sat, 31 May 2025 13:39:53 -0400 (EDT)
From: Stefan Monnier <monnier@HIDDEN>
To: Roi Martin <jroi.martin@HIDDEN>
Subject: Re: bug#78561: [PATCH] Add semantic linefeed support for paragraph
 filling
In-Reply-To: <875xhkivul.fsf@HIDDEN>
Message-ID: <jwvy0ucy93e.fsf-monnier+emacs@HIDDEN>
References: <87jz67tzrp.fsf@HIDDEN> <jwvr00fqt10.fsf-monnier+emacs@HIDDEN>
 <87frgs4jfh.fsf@HIDDEN> <jwvmsazpdai.fsf-monnier+emacs@HIDDEN>
 <87bjrehx8d.fsf@HIDDEN> <jwvmsayni12.fsf-monnier+emacs@HIDDEN>
 <875xhkivul.fsf@HIDDEN>
Date: Sat, 31 May 2025 13:39:52 -0400
User-Agent: Gnus/5.13 (Gnus v5.13)
MIME-Version: 1.0
Content-Type: text/plain
X-SPAM-INFO: Spam detection results:  0
 ALL_TRUSTED                -1 Passed through trusted hosts only via SMTP
 AWL -0.350 Adjusted score from AWL reputation of From: address
 BAYES_00                 -1.9 Bayes spam probability is 0 to 1%
 DKIM_SIGNED               0.1 Message has a DKIM or DK signature,
 not necessarily valid
 DKIM_VALID -0.1 Message has at least one valid DKIM or DK signature
 DKIM_VALID_AU -0.1 Message has a valid DKIM or DK signature from author's
 domain
 DKIM_VALID_EF -0.1 Message has a valid DKIM or DK signature from envelope-from
 domain
X-SPAM-LEVEL: 
X-Spam-Score: -2.3 (--)
X-Debbugs-Envelope-To: 78561
Cc: Eli Zaretskii <eliz@HIDDEN>, Marcin Borkowski <mbork@HIDDEN>,
 78561 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -3.3 (---)

>> I recommend you first finish the current patch and take on that
>> plan afterwards.
>> What I'm asking is a fairly small refactoring of the code you sent,
>> I think.
>
> Please, find attached a new version of the patch.

Looks good to me.  Eli?

> - Remove the mention about using `fill-paragraph-semlf' as
>   `fill-paragraph-function' from docs, given that the long term plan is
>   to obsolete this.

Well, it's been in my TODO for ages, so maybe we shouldn't assume this
long term plan will materialize soon.


        Stefan





Information forwarded to bug-gnu-emacs@HIDDEN:
bug#78561; Package emacs. Full text available.

Message received at 78561 <at> debbugs.gnu.org:


Received: (at 78561) by debbugs.gnu.org; 28 May 2025 15:44:26 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Wed May 28 11:44:26 2025
Received: from localhost ([127.0.0.1]:55122 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1uKIx2-0000oY-Oo
	for submit <at> debbugs.gnu.org; Wed, 28 May 2025 11:44:26 -0400
Received: from mail-wm1-x32d.google.com ([2a00:1450:4864:20::32d]:46265)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.84_2) (envelope-from <jroi.martin@HIDDEN>)
 id 1uKIwv-0000nf-Ni
 for 78561 <at> debbugs.gnu.org; Wed, 28 May 2025 11:44:17 -0400
Received: by mail-wm1-x32d.google.com with SMTP id
 5b1f17b1804b1-441d1ed82dbso85975e9.0
 for <78561 <at> debbugs.gnu.org>; Wed, 28 May 2025 08:44:13 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1748447047; x=1749051847; darn=debbugs.gnu.org;
 h=mime-version:message-id:date:references:in-reply-to:subject:cc:to
 :from:from:to:cc:subject:date:message-id:reply-to;
 bh=73Et3ZcBCNJOJEO8wMmvemEOZEOTwjoj/G2W+6yYo5s=;
 b=LR5CApVxFXkAvNDfiJZEFBiaFV1iOFYlXJHqBEqs0RKqU3PwthgdWf9qu0wEe90gBB
 bQsr0rwEMkp1eQCQOImkfGEOsZAsFyLYZaBUeoPQIErJuDUvxGHvGkFT9qNIPhMedJWY
 wMzAtfjpFwD9I68mOHcWMNGtZz/A8me+oEgEN8UTpuP7CQ7JEyrxlWoLgWMq0lZq3zHe
 rQY2y7y/DoqNS9ZEkYjJsNrY7gKtWrOnIMRte7fDnH6a0e8uITyo9ephXeVbnamQta3x
 RDh7DG6Ua/lwadP70WLEVgrmhCrUF3G4eJe3xg2gAwg/Sb+7oRcy9s2o2jBtNQLZukkB
 +56w==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1748447047; x=1749051847;
 h=mime-version:message-id:date:references:in-reply-to:subject:cc:to
 :from:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to;
 bh=73Et3ZcBCNJOJEO8wMmvemEOZEOTwjoj/G2W+6yYo5s=;
 b=enaEK93X6SdeirWritl9VZlYQONgo3psWe+F8LFfxh0C+mrrqdtD3Ol7WBkIOwk0NA
 +GEAEirvgan8GJuNTVORee4aZ6YvwrbJr7u1twJvjT0EgSmuvkBlQ2ME7jj7wWnTFXhE
 KVKhb4zYUYzh73vBRtFA+a6tfvRwknPSDY8LYvnI8tIDvcMK9Pk2Se5eIOGyG2uEobww
 9wV4mj9Ug+nuEEPsH2F1j1qRjwYkaJsrpu+oFynz2oFpQ70V2oGsT6XwS4Gg7PD1HLpo
 Z8i8UmFDLYl+p/W6tW1Pp5digclZ1xjJX83G+480bRMEVFGoMrI48nRNkMt/7YySIlQA
 2MOw==
X-Forwarded-Encrypted: i=1;
 AJvYcCWeRG+f8TULVqofsrp+BHd6J1OYfoTrFp4oR5XH36NqWrbqw0l+MimFcbfpxrm7N1orKTwu+w==@debbugs.gnu.org
X-Gm-Message-State: AOJu0Yy6xhkJUff70ga2ZFPi0G2t0KzghsuZaIgqxLWpCQvpG6H/yXYk
 o6BriQkn5A5PV1LiAyzHgRa4jTBVE7KTth0mLufV3wHONZqnYbi9n6hm
X-Gm-Gg: ASbGncvE3paDOTDbKTnp1f1LAXOl0wRrnu2npjj1CyRuF7sopZbV0JeTg21JvmJQs5G
 wD9lptcwCmEM/IdlfRwJ+BdPx/XYkHFl/P+VAvd7aJt4tab6OtKjlG2glQEBqjfcFY/t/BaM98q
 OlXUsE+PXHB5YVNNiCrQPkInHSLA6/mHasg8zVgG6otb2wI54uTWPUjsRr2ebqTT9EGqsACRl9H
 SilqBv1QZWUpITIoPmnNojjK4TrnrCUi2R1m+ESae7z1AlAn6Sjj43l+ln/2t7b7QshFCVnNxoL
 VxZGGi7snPxgBPxHoIFG4495pnzlTKUR3O3zdC0xesT3K7WB7g==
X-Google-Smtp-Source: AGHT+IEc59yzkBSG9Ve6HAH4KhzeZULSOEDpiyMjzNoduZbDMlxcRTgbEjg+2uGxy0jHWq3F1KJo+g==
X-Received: by 2002:a05:600c:6297:b0:43c:fc04:6d35 with SMTP id
 5b1f17b1804b1-44c91ad6b51mr184676975e9.4.1748447046822; 
 Wed, 28 May 2025 08:44:06 -0700 (PDT)
Received: from localhost ([84.79.192.255]) by smtp.gmail.com with ESMTPSA id
 5b1f17b1804b1-450064add8bsm25955795e9.17.2025.05.28.08.44.05
 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);
 Wed, 28 May 2025 08:44:06 -0700 (PDT)
From: Roi Martin <jroi.martin@HIDDEN>
To: Stefan Monnier <monnier@HIDDEN>
Subject: Re: bug#78561: [PATCH] Add semantic linefeed support for paragraph
 filling
In-Reply-To: <jwvmsayni12.fsf-monnier+emacs@HIDDEN>
References: <87jz67tzrp.fsf@HIDDEN>
 <jwvr00fqt10.fsf-monnier+emacs@HIDDEN> <87frgs4jfh.fsf@HIDDEN>
 <jwvmsazpdai.fsf-monnier+emacs@HIDDEN> <87bjrehx8d.fsf@HIDDEN>
 <jwvmsayni12.fsf-monnier+emacs@HIDDEN>
Date: Wed, 28 May 2025 17:44:02 +0200
Message-ID: <875xhkivul.fsf@HIDDEN>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="=-=-="
X-Spam-Score: 0.0 (/)
X-Debbugs-Envelope-To: 78561
Cc: Eli Zaretskii <eliz@HIDDEN>, Marcin Borkowski <mbork@HIDDEN>,
 78561 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.0 (-)

--=-=-=
Content-Type: text/plain

Stefan Monnier <monnier@HIDDEN> writes:

> I recommend you first finish the current patch and take on that
> plan afterwards.
> What I'm asking is a fairly small refactoring of the code you sent,
> I think.

Please, find attached a new version of the patch.

It contains the following changes:

- Add a new function named `fill-region-as-paragraph-semlf', which fills
  a region using semantic linefeeds as if it were a single paragraph.
  Its behavior is analogous to `fill-region-as-paragraph'.
- Update the `fill-paragraph-semlf' function to use
  `fill-region-as-paragraph-semlf' internally.
- Remove the mention about using `fill-paragraph-semlf' as
  `fill-paragraph-function' from docs, given that the long term plan is
  to obsolete this.
- Add test for `fill-region-as-paragraph-semlf'.

Thanks a lot for all the explanations.  I hope this new version is
closer to what you had in mind.

        Roi


--=-=-=
Content-Type: text/x-patch
Content-Disposition: attachment;
 filename=0001-Add-semantic-linefeed-support-for-paragraph-filling.patch

From 92538223e4808a46d47de57be4e85b3773f1fc8b Mon Sep 17 00:00:00 2001
From: Roi Martin <jroi.martin@HIDDEN>
Date: Fri, 21 Mar 2025 14:22:46 +0100
Subject: [PATCH] Add semantic linefeed support for paragraph filling

* lisp/textmodes/fill.el (fill-region-as-paragraph-semlf): Add function
to fill a region using semantic linefeeds as if it were a single
paragraph.
(fill-paragraph-semlf): Add function to fill paragraph using semantic
linefeeds.
* test/lisp/textmodes/fill-tests.el
(fill-test-fill-region-as-paragraph-semlf)
(fill-test-fill-paragraph-semlf)
(fill-test-fill-paragraph-semlf-fill-paragraph-function)
(fill-test-fill-paragraph-semlf-justify)
(fill-test-fill-paragraph-semlf-sentence-end-double-space)
(fill-test-fill-paragraph-semlf-fill-column)
(fill-test-fill-paragraph-semlf-punctuation-marks)
(fill-test-fill-paragraph-semlf-twice)
(fill-test-fill-paragraph-semlf-fill-prefix)
(fill-test-fill-paragraph-semlf-indented-block)
(fill-test-fill-paragraph-semlf-emacs-lisp-mode)
(fill-test-fill-paragraph-semlf-c-mode)
(fill-test-fill-paragraph-semlf-org-mode)
(fill-test-fill-paragraph-semlf-markdown-mode): Add tests.
* test/lisp/textmodes/fill-resources/semlf-c-mode.erts:
* test/lisp/textmodes/fill-resources/semlf-emacs-lisp-mode.erts:
* test/lisp/textmodes/fill-resources/semlf-fill-column.erts:
* test/lisp/textmodes/fill-resources/semlf-fill-paragraph-function.erts:
* test/lisp/textmodes/fill-resources/semlf-fill-prefix.erts:
* test/lisp/textmodes/fill-resources/semlf-fill-region-as-paragraph.erts:
* test/lisp/textmodes/fill-resources/semlf-indented-block.erts:
* test/lisp/textmodes/fill-resources/semlf-justify.erts:
* test/lisp/textmodes/fill-resources/semlf-markdown-mode.erts:
* test/lisp/textmodes/fill-resources/semlf-org-mode.erts:
* test/lisp/textmodes/fill-resources/semlf-punctuation-marks.erts:
* test/lisp/textmodes/fill-resources/semlf-sentence-end-double-space.erts:
* test/lisp/textmodes/fill-resources/semlf-twice.erts:
* test/lisp/textmodes/fill-resources/semlf.erts: Add test data.
---
 lisp/textmodes/fill.el                        |  92 +++++++++
 .../fill-resources/semlf-c-mode.erts          | 183 ++++++++++++++++++
 .../fill-resources/semlf-emacs-lisp-mode.erts |  87 +++++++++
 .../fill-resources/semlf-fill-column.erts     |  15 ++
 .../semlf-fill-paragraph-function.erts        |  12 ++
 .../fill-resources/semlf-fill-prefix.erts     |  35 ++++
 .../semlf-fill-region-as-paragraph.erts       |  37 ++++
 .../fill-resources/semlf-indented-block.erts  |  31 +++
 .../fill-resources/semlf-justify.erts         |  12 ++
 .../fill-resources/semlf-markdown-mode.erts   | 129 ++++++++++++
 .../fill-resources/semlf-org-mode.erts        | 122 ++++++++++++
 .../semlf-punctuation-marks.erts              |  13 ++
 .../semlf-sentence-end-double-space.erts      |  13 ++
 .../textmodes/fill-resources/semlf-twice.erts |  12 ++
 test/lisp/textmodes/fill-resources/semlf.erts |  88 +++++++++
 test/lisp/textmodes/fill-tests.el             | 104 ++++++++++
 16 files changed, 985 insertions(+)
 create mode 100644 test/lisp/textmodes/fill-resources/semlf-c-mode.erts
 create mode 100644 test/lisp/textmodes/fill-resources/semlf-emacs-lisp-mode.erts
 create mode 100644 test/lisp/textmodes/fill-resources/semlf-fill-column.erts
 create mode 100644 test/lisp/textmodes/fill-resources/semlf-fill-paragraph-function.erts
 create mode 100644 test/lisp/textmodes/fill-resources/semlf-fill-prefix.erts
 create mode 100644 test/lisp/textmodes/fill-resources/semlf-fill-region-as-paragraph.erts
 create mode 100644 test/lisp/textmodes/fill-resources/semlf-indented-block.erts
 create mode 100644 test/lisp/textmodes/fill-resources/semlf-justify.erts
 create mode 100644 test/lisp/textmodes/fill-resources/semlf-markdown-mode.erts
 create mode 100644 test/lisp/textmodes/fill-resources/semlf-org-mode.erts
 create mode 100644 test/lisp/textmodes/fill-resources/semlf-punctuation-marks.erts
 create mode 100644 test/lisp/textmodes/fill-resources/semlf-sentence-end-double-space.erts
 create mode 100644 test/lisp/textmodes/fill-resources/semlf-twice.erts
 create mode 100644 test/lisp/textmodes/fill-resources/semlf.erts

diff --git a/lisp/textmodes/fill.el b/lisp/textmodes/fill.el
index e38d030734fb..b457b01d6917 100644
--- a/lisp/textmodes/fill.el
+++ b/lisp/textmodes/fill.el
@@ -1583,4 +1583,96 @@ fill-individual-paragraphs-citation
 	"")
     string))
 
+(defun fill-region-as-paragraph-semlf (from to &optional justify
+                                            nosqueeze squeeze-after)
+  "Fill the region using semantic linefeeds as if it were a single paragraph.
+This command removes any paragraph breaks in the region and extra
+newlines at the end, and fills lines within the region. It leaves point
+at the beginning of the line following the region.
+
+If JUSTIFY is non-nil (interactively, with prefix argument), justify as
+well.  If NOSQUEEZE is non-nil, do not to make spaces between words
+canonical before filling.  SQUEEZE-AFTER, if non-nil, should be a buffer
+position; it means canonicalize spaces only starting from that position.
+See `canonically-space-region' for the meaning of canonicalization of
+spaces.
+
+Return the `fill-prefix' used for filling.
+
+If `sentence-end-double-space' is non-nil, then period followed by one
+space does not end a sentence, so don't break a line there.
+The variable `fill-column' controls the width for filling.
+
+For more details about semantic linefeeds, see `fill-paragraph-semlf'."
+  (interactive (progn
+		 (barf-if-buffer-read-only)
+		 (list (region-beginning)
+                       (region-end)
+		       (if current-prefix-arg 'full))))
+  (unless (memq justify '(t nil none full center left right))
+    (setq justify 'full))
+
+  (let ((from (min from to))
+        (to (max from to))
+        pfx)
+    (goto-char from)
+    (with-restriction (line-beginning-position) to
+      (let ((fill-column (point-max)))
+        (setq pfx (or (save-excursion
+                        (fill-region-as-paragraph (point)
+                                                  (point-max)
+                                                  nil
+                                                  nosqueeze
+                                                  squeeze-after))
+                      "")))
+      (while (not (eobp))
+        (let ((fill-prefix pfx))
+	  (fill-region-as-paragraph (point)
+				    (progn (forward-sentence) (point))
+				    justify
+                                    nosqueeze
+                                    squeeze-after))
+        (when (and (> (point) (line-beginning-position))
+		   (< (point) (line-end-position)))
+	  (delete-horizontal-space)
+	  (insert "\n")
+	  (insert pfx))))
+    (unless (eobp) (forward-char 1))
+    pfx))
+
+(defun fill-paragraph-semlf (&optional justify)
+  "Fill paragraph at or after point using semantic linefeeds.
+This command ensures that a newline character follows every sentence.
+If a sentence is not followed by a newline character, one is inserted.
+The task of deciding what is considered a sentence is delegated to the
+`forward-sentence' function.
+
+If JUSTIFY is non-nil (interactively, with prefix argument), justify as
+well.  If `sentence-end-double-space' is non-nil, then period followed
+by one space does not end a sentence, so don't break a line there.
+The variable `fill-column' controls the width for filling.
+
+Return the `fill-prefix' used for filling.
+
+For more details about semantic linefeeds, see `https://sembr.org/' and
+`https://rhodesmill.org/brandon/2012/one-sentence-per-line/'."
+  (interactive (progn
+		 (barf-if-buffer-read-only)
+		 (list (if current-prefix-arg 'full))))
+  (unless (memq justify '(t nil none full center left right))
+    (setq justify 'full))
+
+  (save-excursion
+    (let ((to (progn
+		(fill-forward-paragraph 1)
+		(backward-word)
+		(end-of-line)
+		(point)))
+	  (from (progn
+		  (fill-forward-paragraph -1)
+		  (forward-word)
+		  (beginning-of-line)
+		  (point))))
+      (fill-region-as-paragraph-semlf from to justify))))
+
 ;;; fill.el ends here
diff --git a/test/lisp/textmodes/fill-resources/semlf-c-mode.erts b/test/lisp/textmodes/fill-resources/semlf-c-mode.erts
new file mode 100644
index 000000000000..a28eb68cfc6a
--- /dev/null
+++ b/test/lisp/textmodes/fill-resources/semlf-c-mode.erts
@@ -0,0 +1,183 @@
+Point-Char: |
+
+Name: c-mode - single-line
+
+=-=
+// Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+// eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+// ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+// Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+// eiusmod tempor.
+// Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+// veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
+
+Name: c-mode - single-line - fill-prefix - marker
+
+=-=
+// - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+// - Aliquip ex ea commodo consequat.  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
+// - Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+=-=
+// - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+// - eiusmod tempor.
+// - Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+// - veniam, quis nostrud exercitation ullamco laboris nisi ut.
+// - Aliquip ex ea commodo consequat.
+// - Duis aute irure dolor in reprehenderit in voluptate velit esse
+// - cillum dolore eu fugiat nulla pariatur.
+// - Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+// - officia deserunt mollit anim id est laborum.
+=-=-=
+
+Name: c-mode - single-line - fill-prefix - whitespace
+
+=-=
+// - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+//   Aliquip ex ea commodo consequat.  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
+//   Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+=-=
+// - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+//   eiusmod tempor.
+//   Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+//   veniam, quis nostrud exercitation ullamco laboris nisi ut.
+//   Aliquip ex ea commodo consequat.
+//   Duis aute irure dolor in reprehenderit in voluptate velit esse
+//   cillum dolore eu fugiat nulla pariatur.
+//   Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+//   officia deserunt mollit anim id est laborum.
+=-=-=
+
+Name: c-mode - single-line - indented block
+
+=-=
+// Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+// eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut
+// enim ad minim veniam, quis nostrud exercitation ullamco laboris
+// nisi ut.
+//
+// 	|Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed
+// 	do eiusmod tempor.  Incididunt ut labore et dolore magna
+// 	aliqua. Ut enim ad minim veniam, quis nostrud exercitation
+// 	ullamco laboris nisi ut.
+//
+// Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+// eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut
+// enim ad minim veniam, quis nostrud exercitation ullamco laboris
+// nisi ut.
+=-=
+// Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+// eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut
+// enim ad minim veniam, quis nostrud exercitation ullamco laboris
+// nisi ut.
+//
+// 	Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed
+// 	do eiusmod tempor.
+// 	Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+// 	veniam, quis nostrud exercitation ullamco laboris nisi ut.
+//
+// Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+// eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut
+// enim ad minim veniam, quis nostrud exercitation ullamco laboris
+// nisi ut.
+=-=-=
+
+Name: c-mode - multi-line
+
+=-=
+/*
+ * Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+ * eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ * ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+ */
+=-=
+/*
+ * Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+ * eiusmod tempor.
+ * Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+ * veniam, quis nostrud exercitation ullamco laboris nisi ut.
+ */
+=-=-=
+
+Name: c-mode - multi-line - fill-prefix - marker
+
+=-=
+/*
+ * - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+ * - Aliquip ex ea commodo consequat.  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
+ * - Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ */
+=-=
+/*
+ * - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+ * - eiusmod tempor.
+ * - Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+ * - veniam, quis nostrud exercitation ullamco laboris nisi ut.
+ * - Aliquip ex ea commodo consequat.
+ * - Duis aute irure dolor in reprehenderit in voluptate velit esse
+ * - cillum dolore eu fugiat nulla pariatur.
+ * - Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+ * - officia deserunt mollit anim id est laborum.
+ */
+=-=-=
+
+Name: c-mode - multi-line - fill-prefix - whitespace
+
+=-=
+/*
+ * - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+ *   Aliquip ex ea commodo consequat.  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
+ *   Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ */
+=-=
+/*
+ * - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+ *   eiusmod tempor.
+ *   Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+ *   veniam, quis nostrud exercitation ullamco laboris nisi ut.
+ *   Aliquip ex ea commodo consequat.
+ *   Duis aute irure dolor in reprehenderit in voluptate velit esse
+ *   cillum dolore eu fugiat nulla pariatur.
+ *   Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+ *   officia deserunt mollit anim id est laborum.
+ */
+=-=-=
+
+Name: c-mode - multi-line - indented block
+
+=-=
+/*
+ * Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+ * eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut
+ * enim ad minim veniam, quis nostrud exercitation ullamco laboris
+ * nisi ut.
+ *
+ * 	|Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed
+ * 	do eiusmod tempor.  Incididunt ut labore et dolore magna
+ * 	aliqua. Ut enim ad minim veniam, quis nostrud exercitation
+ * 	ullamco laboris nisi ut.
+ *
+ * Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+ * eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut
+ * enim ad minim veniam, quis nostrud exercitation ullamco laboris
+ * nisi ut.
+ */
+=-=
+/*
+ * Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+ * eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut
+ * enim ad minim veniam, quis nostrud exercitation ullamco laboris
+ * nisi ut.
+ *
+ * 	Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed
+ * 	do eiusmod tempor.
+ * 	Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+ * 	veniam, quis nostrud exercitation ullamco laboris nisi ut.
+ *
+ * Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+ * eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut
+ * enim ad minim veniam, quis nostrud exercitation ullamco laboris
+ * nisi ut.
+ */
+=-=-=
diff --git a/test/lisp/textmodes/fill-resources/semlf-emacs-lisp-mode.erts b/test/lisp/textmodes/fill-resources/semlf-emacs-lisp-mode.erts
new file mode 100644
index 000000000000..fe71ee32c1aa
--- /dev/null
+++ b/test/lisp/textmodes/fill-resources/semlf-emacs-lisp-mode.erts
@@ -0,0 +1,87 @@
+Point-Char: |
+
+Name: emacs-lisp-mode
+
+=-=
+;; Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+;; eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+;; ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+;; Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+;; eiusmod tempor.
+;; Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+;; veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
+
+Name: emacs-lisp-mode - fill-prefix - marker
+
+=-=
+;; - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+;; - Aliquip ex ea commodo consequat.  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
+;; - Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+=-=
+;; - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+;; - eiusmod tempor.
+;; - Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+;; - veniam, quis nostrud exercitation ullamco laboris nisi ut.
+;; - Aliquip ex ea commodo consequat.
+;; - Duis aute irure dolor in reprehenderit in voluptate velit esse
+;; - cillum dolore eu fugiat nulla pariatur.
+;; - Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+;; - officia deserunt mollit anim id est laborum.
+=-=-=
+
+Name: emacs-lisp-mode - fill-prefix - whitespace
+
+=-=
+;; - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+;;   Aliquip ex ea commodo consequat.  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
+;;   Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+=-=
+;; - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+;;   eiusmod tempor.
+;;   Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+;;   veniam, quis nostrud exercitation ullamco laboris nisi ut.
+;;   Aliquip ex ea commodo consequat.
+;;   Duis aute irure dolor in reprehenderit in voluptate velit esse
+;;   cillum dolore eu fugiat nulla pariatur.
+;;   Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+;;   officia deserunt mollit anim id est laborum.
+=-=-=
+
+Name: emacs-lisp-mode - indented block
+
+The `fill-forward-paragraph' function jumps to the beginning/end of
+the comment.
+
+=-=
+;; Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+;; eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut
+;; enim ad minim veniam, quis nostrud exercitation ullamco laboris
+;; nisi ut.
+
+;; 	|Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed
+;; 	do eiusmod tempor.  Incididunt ut labore et dolore magna
+;; 	aliqua. Ut enim ad minim veniam, quis nostrud exercitation
+;; 	ullamco laboris nisi ut.
+
+;; Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+;; eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut
+;; enim ad minim veniam, quis nostrud exercitation ullamco laboris
+;; nisi ut.
+=-=
+;; Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+;; eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut
+;; enim ad minim veniam, quis nostrud exercitation ullamco laboris
+;; nisi ut.
+
+;; 	Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed
+;; 	do eiusmod tempor.
+;; 	Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+;; 	veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+;; Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+;; eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut
+;; enim ad minim veniam, quis nostrud exercitation ullamco laboris
+;; nisi ut.
+=-=-=
diff --git a/test/lisp/textmodes/fill-resources/semlf-fill-column.erts b/test/lisp/textmodes/fill-resources/semlf-fill-column.erts
new file mode 100644
index 000000000000..20db7b1f9c5b
--- /dev/null
+++ b/test/lisp/textmodes/fill-resources/semlf-fill-column.erts
@@ -0,0 +1,15 @@
+Name: fill-column
+
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+Lorem ipsum dolor sit amet,
+consectetur adipiscing elit, sed do
+eiusmod tempor.
+Incididunt ut labore et dolore
+magna aliqua. Ut enim ad minim
+veniam, quis nostrud exercitation
+ullamco laboris nisi ut.
+=-=-=
diff --git a/test/lisp/textmodes/fill-resources/semlf-fill-paragraph-function.erts b/test/lisp/textmodes/fill-resources/semlf-fill-paragraph-function.erts
new file mode 100644
index 000000000000..467e7401cf50
--- /dev/null
+++ b/test/lisp/textmodes/fill-resources/semlf-fill-paragraph-function.erts
@@ -0,0 +1,12 @@
+Name: fill-paragraph-function
+
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.
+Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
+quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
diff --git a/test/lisp/textmodes/fill-resources/semlf-fill-prefix.erts b/test/lisp/textmodes/fill-resources/semlf-fill-prefix.erts
new file mode 100644
index 000000000000..e067eff69701
--- /dev/null
+++ b/test/lisp/textmodes/fill-resources/semlf-fill-prefix.erts
@@ -0,0 +1,35 @@
+Name: fill-prefix - marker
+
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+- Aliquip ex ea commodo consequat.  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
+- Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+- eiusmod tempor.
+- Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+- veniam, quis nostrud exercitation ullamco laboris nisi ut.
+- Aliquip ex ea commodo consequat.
+- Duis aute irure dolor in reprehenderit in voluptate velit esse
+- cillum dolore eu fugiat nulla pariatur.
+- Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+- officia deserunt mollit anim id est laborum.
+=-=-=
+
+Name: fill-prefix - whitespace
+
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+  Aliquip ex ea commodo consequat.  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
+  Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+  eiusmod tempor.
+  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+  veniam, quis nostrud exercitation ullamco laboris nisi ut.
+  Aliquip ex ea commodo consequat.
+  Duis aute irure dolor in reprehenderit in voluptate velit esse
+  cillum dolore eu fugiat nulla pariatur.
+  Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+  officia deserunt mollit anim id est laborum.
+=-=-=
diff --git a/test/lisp/textmodes/fill-resources/semlf-fill-region-as-paragraph.erts b/test/lisp/textmodes/fill-resources/semlf-fill-region-as-paragraph.erts
new file mode 100644
index 000000000000..114eaa46fc3c
--- /dev/null
+++ b/test/lisp/textmodes/fill-resources/semlf-fill-region-as-paragraph.erts
@@ -0,0 +1,37 @@
+Point-Char: |
+
+Name: fill-region-as-paragraph-semlf
+
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, s|ed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed
+do eiusmod tempor.
+Incididunt ut labore et dolore
+magna aliqua. Ut enim ad minim
+veniam, quis nostrud exercitation
+ullamco laboris nisi ut.
+Lorem ipsum dolor sit amet,
+consectetur adipiscing elit, sed do
+eiusmod tempor.
+Incididunt ut labore et dolore
+magna aliqua. Ut enim ad minim
+veniam, quis nostrud exercitation
+ullamco laboris nisi ut.
+Lorem ipsum dolor sit amet,
+consectetur adipiscing elit, sed do
+eiusmod tempor.
+Incididunt ut labore et dolore
+magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
diff --git a/test/lisp/textmodes/fill-resources/semlf-indented-block.erts b/test/lisp/textmodes/fill-resources/semlf-indented-block.erts
new file mode 100644
index 000000000000..e483567c6ab3
--- /dev/null
+++ b/test/lisp/textmodes/fill-resources/semlf-indented-block.erts
@@ -0,0 +1,31 @@
+Point-Char: |
+
+Name: indented block
+
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+	|Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed
+	do eiusmod tempor.  Incididunt ut labore et dolore magna
+	aliqua. Ut enim ad minim veniam, quis nostrud exercitation
+	ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+	Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed
+	do eiusmod tempor.
+	Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+	veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
diff --git a/test/lisp/textmodes/fill-resources/semlf-justify.erts b/test/lisp/textmodes/fill-resources/semlf-justify.erts
new file mode 100644
index 000000000000..3a951b7ce424
--- /dev/null
+++ b/test/lisp/textmodes/fill-resources/semlf-justify.erts
@@ -0,0 +1,12 @@
+Name: justify
+
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+Lorem  ipsum  dolor sit  amet,  consectetur  adipiscing elit,  sed  do
+eiusmod tempor.
+Incididunt ut labore et dolore magna  aliqua. Ut enim ad minim veniam,
+quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
diff --git a/test/lisp/textmodes/fill-resources/semlf-markdown-mode.erts b/test/lisp/textmodes/fill-resources/semlf-markdown-mode.erts
new file mode 100644
index 000000000000..7257708c245d
--- /dev/null
+++ b/test/lisp/textmodes/fill-resources/semlf-markdown-mode.erts
@@ -0,0 +1,129 @@
+Point-Char: |
+
+Name: markdown-mode
+
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.
+Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
+quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
+
+Name: markdown-mode - list - one single-line item
+
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+  eiusmod tempor.
+  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+  veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
+
+Name: markdown-mode - list - multiple single-line items
+
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+- Aliquip ex ea commodo consequat.  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
+- Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+  eiusmod tempor.
+  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+  veniam, quis nostrud exercitation ullamco laboris nisi ut.
+- Aliquip ex ea commodo consequat.  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
+- Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+=-=-=
+
+Name: markdown-mode - list - one multi-line item
+
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+  eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut
+  enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi
+  ut.
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+  eiusmod tempor.
+  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+  veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
+
+Name: markdown-mode - list - multiple multi-line items
+
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+  eiusmod tempor.  Incididunt ut labore et dolore magn a aliqua. Ut
+  enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi
+  ut.
+- Aliquip ex ea commodo consequat.  Duis aute irure dolor in
+  reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
+  pariatur.
+- Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+  officia deserunt mollit anim id est laborum.
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+  eiusmod tempor.
+  Incididunt ut labore et dolore magn a aliqua. Ut enim ad minim
+  veniam, quis nostrud exercitation ullamco laboris nisi ut.
+- Aliquip ex ea commodo consequat.  Duis aute irure dolor in
+  reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
+  pariatur.
+- Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+  officia deserunt mollit anim id est laborum.
+=-=-=
+
+Name: markdown-mode - list - short sentence in multi-line item
+
+=-=
+- Lorem ipsum dolor.  Sit amet, consectetur adipiscing elit, sed do
+  eiusmod tempor.  Incididunt ut labore et dolore magn a aliqua. Ut
+  enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi
+  ut.
+=-=
+- Lorem ipsum dolor.
+  Sit amet, consectetur adipiscing elit, sed do eiusmod tempor.
+  Incididunt ut labore et dolore magn a aliqua. Ut enim ad minim
+  veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
+
+Name: markdown-mode - indented block
+Skip: t
+
+TODO - In `markdown-mode', the `fill-forward-paragraph' function
+ignores code blocks.  We should reach out to the `markdown-mode'
+maintainer(s) to understand the reason for this and possibly suggest a
+change to this behavior.  This works as expected in
+`markdown-ts-mode'.
+
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+	|Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed
+	do eiusmod tempor.  Incididunt ut labore et dolore magna
+	aliqua. Ut enim ad minim veniam, quis nostrud exercitation
+	ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+	Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed
+	do eiusmod tempor.
+	Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+	veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
diff --git a/test/lisp/textmodes/fill-resources/semlf-org-mode.erts b/test/lisp/textmodes/fill-resources/semlf-org-mode.erts
new file mode 100644
index 000000000000..81dd4841de94
--- /dev/null
+++ b/test/lisp/textmodes/fill-resources/semlf-org-mode.erts
@@ -0,0 +1,122 @@
+Point-Char: |
+
+Name: org-mode
+
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.
+Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
+quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
+
+Name: org-mode - list - one single-line item
+
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+  eiusmod tempor.
+  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+  veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
+
+Name: org-mode - list - multiple single-line items
+
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+- Aliquip ex ea commodo consequat.  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
+- Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+  eiusmod tempor.
+  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+  veniam, quis nostrud exercitation ullamco laboris nisi ut.
+- Aliquip ex ea commodo consequat.  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
+- Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+=-=-=
+
+Name: org-mode - list - one multi-line item
+
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+  eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut
+  enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi
+  ut.
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+  eiusmod tempor.
+  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+  veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
+
+Name: org-mode - list - multiple multi-line items
+
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+  eiusmod tempor.  Incididunt ut labore et dolore magn a aliqua. Ut
+  enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi
+  ut.
+- Aliquip ex ea commodo consequat.  Duis aute irure dolor in
+  reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
+  pariatur.
+- Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+  officia deserunt mollit anim id est laborum.
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+  eiusmod tempor.
+  Incididunt ut labore et dolore magn a aliqua. Ut enim ad minim
+  veniam, quis nostrud exercitation ullamco laboris nisi ut.
+- Aliquip ex ea commodo consequat.  Duis aute irure dolor in
+  reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
+  pariatur.
+- Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+  officia deserunt mollit anim id est laborum.
+=-=-=
+
+Name: org-mode - list - short sentence in multi-line item
+
+=-=
+- Lorem ipsum dolor.  Sit amet, consectetur adipiscing elit, sed do
+  eiusmod tempor.  Incididunt ut labore et dolore magn a aliqua. Ut
+  enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi
+  ut.
+=-=
+- Lorem ipsum dolor.
+  Sit amet, consectetur adipiscing elit, sed do eiusmod tempor.
+  Incididunt ut labore et dolore magn a aliqua. Ut enim ad minim
+  veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
+
+Name: org-mode - indented block
+
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+	|Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed
+	do eiusmod tempor.  Incididunt ut labore et dolore magna
+	aliqua. Ut enim ad minim veniam, quis nostrud exercitation
+	ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+	Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed
+	do eiusmod tempor.
+	Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+	veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
diff --git a/test/lisp/textmodes/fill-resources/semlf-punctuation-marks.erts b/test/lisp/textmodes/fill-resources/semlf-punctuation-marks.erts
new file mode 100644
index 000000000000..5346216e9f9c
--- /dev/null
+++ b/test/lisp/textmodes/fill-resources/semlf-punctuation-marks.erts
@@ -0,0 +1,13 @@
+Name: punctuation marks
+
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua!  Ut enim
+ad minim veniam?  Quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.
+Incididunt ut labore et dolore magna aliqua!
+Ut enim ad minim veniam?
+Quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
diff --git a/test/lisp/textmodes/fill-resources/semlf-sentence-end-double-space.erts b/test/lisp/textmodes/fill-resources/semlf-sentence-end-double-space.erts
new file mode 100644
index 000000000000..a01beed0f665
--- /dev/null
+++ b/test/lisp/textmodes/fill-resources/semlf-sentence-end-double-space.erts
@@ -0,0 +1,13 @@
+Name: sentence-end-double-space
+
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.
+Incididunt ut labore et dolore magna aliqua.
+Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris
+nisi ut.
+=-=-=
diff --git a/test/lisp/textmodes/fill-resources/semlf-twice.erts b/test/lisp/textmodes/fill-resources/semlf-twice.erts
new file mode 100644
index 000000000000..862dda6e27eb
--- /dev/null
+++ b/test/lisp/textmodes/fill-resources/semlf-twice.erts
@@ -0,0 +1,12 @@
+Name: fill twice
+
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.
+Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
+quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
diff --git a/test/lisp/textmodes/fill-resources/semlf.erts b/test/lisp/textmodes/fill-resources/semlf.erts
new file mode 100644
index 000000000000..f3e331cd9381
--- /dev/null
+++ b/test/lisp/textmodes/fill-resources/semlf.erts
@@ -0,0 +1,88 @@
+Point-Char: |
+
+Name: beginning of buffer
+
+=-=
+|Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.
+Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
+quis nostrud exercitation ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
+
+Name: second paragraph
+
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+|Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.
+Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
+quis nostrud exercitation ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
+
+Name: end of buffer
+
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.|
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.
+Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
+quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
diff --git a/test/lisp/textmodes/fill-tests.el b/test/lisp/textmodes/fill-tests.el
index 6e079973100e..1448965c9d46 100644
--- a/test/lisp/textmodes/fill-tests.el
+++ b/test/lisp/textmodes/fill-tests.el
@@ -28,6 +28,7 @@
 ;;; Code:
 
 (require 'ert)
+(require 'ert-x)
 
 (ert-deftest fill-test-no-fill-polish-nobreak-p nil
   "Tests of the `fill-polish-nobreak-p' function."
@@ -121,6 +122,109 @@ test-fill-haskell
   ;; w
 ")))
 
+
+(ert-deftest fill-test-fill-region-as-paragraph-semlf ()
+  "Test the `fill-region-as-paragraph-semlf' function."
+  (ert-test-erts-file (ert-resource-file "semlf-fill-region-as-paragraph.erts")
+                      (lambda ()
+			(setq-local fill-column 35)
+			(fill-region-as-paragraph-semlf
+                         (point)
+                         (progn
+                           (goto-char (point-max))
+                           (forward-line -1)
+                           (beginning-of-line)
+                           (point))))))
+
+(ert-deftest fill-test-fill-paragraph-semlf ()
+  "Test the `fill-paragraph-semlf' function."
+  (ert-test-erts-file (ert-resource-file "semlf.erts")
+                      (lambda ()
+			(fill-paragraph-semlf))))
+
+(ert-deftest fill-test-fill-paragraph-semlf-fill-paragraph-function ()
+  "Test `fill-paragraph-semlf' as `fill-paragraph-function'."
+  (ert-test-erts-file (ert-resource-file "semlf-fill-paragraph-function.erts")
+                      (lambda ()
+			(setq-local fill-paragraph-function #'fill-paragraph-semlf)
+			(fill-paragraph))))
+
+(ert-deftest fill-test-fill-paragraph-semlf-justify ()
+  "Test the JUSTIFY parameter of the `fill-paragraph-semlf' function."
+  (ert-test-erts-file (ert-resource-file "semlf-justify.erts")
+                      (lambda ()
+			(fill-paragraph-semlf 'justify))))
+
+(ert-deftest fill-test-fill-paragraph-semlf-sentence-end-double-space ()
+  "Test the `fill-paragraph-semlf' function with `sentence-end-double-space'."
+  (ert-test-erts-file (ert-resource-file "semlf-sentence-end-double-space.erts")
+                      (lambda ()
+			(setq-local sentence-end-double-space nil)
+			(fill-paragraph-semlf))))
+
+(ert-deftest fill-test-fill-paragraph-semlf-fill-column ()
+  "Test the `fill-paragraph-semlf' function with `fill-column'."
+  (ert-test-erts-file (ert-resource-file "semlf-fill-column.erts")
+                      (lambda ()
+			(setq-local fill-column 35)
+			(fill-paragraph-semlf))))
+
+(ert-deftest fill-test-fill-paragraph-semlf-punctuation-marks ()
+  "Test the `fill-paragraph-semlf' function with different punctuation marks."
+  (ert-test-erts-file (ert-resource-file "semlf-punctuation-marks.erts")
+                      (lambda ()
+			(fill-paragraph-semlf))))
+
+(ert-deftest fill-test-fill-paragraph-semlf-twice ()
+  "Test to run the `fill-paragraph-semlf' function twice."
+  (ert-test-erts-file (ert-resource-file "semlf-twice.erts")
+                      (lambda ()
+			(goto-char (point-min))
+			(fill-paragraph-semlf)
+			(goto-char (point-min))
+			(fill-paragraph-semlf))))
+
+(ert-deftest fill-test-fill-paragraph-semlf-fill-prefix ()
+  "Test the `fill-paragraph-semlf' function with different fill prefixes."
+  (ert-test-erts-file (ert-resource-file "semlf-fill-prefix.erts")
+                      (lambda ()
+			(fill-paragraph-semlf))))
+
+(ert-deftest fill-test-fill-paragraph-semlf-indented-block ()
+  "Test the `fill-paragraph-semlf' function with an indented block."
+  (ert-test-erts-file (ert-resource-file "semlf-indented-block.erts")
+                      (lambda ()
+			(fill-paragraph-semlf))))
+
+(ert-deftest fill-test-fill-paragraph-semlf-emacs-lisp-mode ()
+  "Test the `fill-paragraph-semlf' function with `emacs-lisp-mode'."
+  (ert-test-erts-file (ert-resource-file "semlf-emacs-lisp-mode.erts")
+                      (lambda ()
+			(emacs-lisp-mode)
+			(fill-paragraph-semlf))))
+
+(ert-deftest fill-test-fill-paragraph-semlf-c-mode ()
+  "Test the `fill-paragraph-semlf' function with `c-mode'."
+  (ert-test-erts-file (ert-resource-file "semlf-c-mode.erts")
+                      (lambda ()
+			(c-mode)
+			(fill-paragraph-semlf))))
+
+(ert-deftest fill-test-fill-paragraph-semlf-org-mode ()
+  "Test the `fill-paragraph-semlf' function with `org-mode'."
+  (ert-test-erts-file (ert-resource-file "semlf-org-mode.erts")
+                      (lambda ()
+			(org-mode)
+			(fill-paragraph-semlf))))
+
+(ert-deftest fill-test-fill-paragraph-semlf-markdown-mode ()
+  "Test the `fill-paragraph-semlf' function with `markdown-mode'."
+  (skip-unless (functionp 'markdown-mode))
+  (ert-test-erts-file (ert-resource-file "semlf-markdown-mode.erts")
+                      (lambda ()
+			(markdown-mode)
+			(fill-paragraph-semlf))))
+
 (provide 'fill-tests)
 
 ;;; fill-tests.el ends here
-- 
2.49.0


--=-=-=--




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#78561; Package emacs. Full text available.

Message received at 78561 <at> debbugs.gnu.org:


Received: (at 78561) by debbugs.gnu.org; 27 May 2025 16:36:23 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Tue May 27 12:36:23 2025
Received: from localhost ([127.0.0.1]:43108 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1uJxHr-0007vZ-Ga
	for submit <at> debbugs.gnu.org; Tue, 27 May 2025 12:36:23 -0400
Received: from mailscanner.iro.umontreal.ca ([132.204.25.50]:10489)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.84_2) (envelope-from <monnier@HIDDEN>)
 id 1uJxHn-0007uo-OE
 for 78561 <at> debbugs.gnu.org; Tue, 27 May 2025 12:36:20 -0400
Received: from pmg3.iro.umontreal.ca (localhost [127.0.0.1])
 by pmg3.iro.umontreal.ca (Proxmox) with ESMTP id CB715441485;
 Tue, 27 May 2025 12:36:12 -0400 (EDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=iro.umontreal.ca;
 s=mail; t=1748363771;
 bh=PHlXLK7t+I5XgTtttLfYgyL17+Ztm2nG6cE76l5lun0=;
 h=From:To:Cc:Subject:In-Reply-To:References:Date:From;
 b=SnOu3tRAo0HVlaYlBHGIDWznDXiN0dErYHvsqrlzNWe/9fyRXEyf7qrSM/JHvtM91
 t54pnSKLIqRLlgOcBTujhYTXoTwACBOVULnNO1WqLW1ftoB+aSuO7Q7Y61qonQNPiu
 VKcYjpaaFC5Wht9Af/0ukXP+f9AH/uYxcOhLkPD31A/YOYKYmf7F6Yp1Kvu79KGTh7
 DP+C2VhL8J8Jw+gjr8vvmPZZf9lqLBypZNxkzYw89k9QhtmhRRLKp7Orj4w7U7RgDQ
 BHu/So3Bfgr2N+Ea+EpyLyBBta8fJKzO4oCCuDvu+0jlHuqg9LR1pHprael2oBP8b9
 GPUlLeXtRlVXQ==
Received: from mail01.iro.umontreal.ca (unknown [172.31.2.1])
 by pmg3.iro.umontreal.ca (Proxmox) with ESMTP id 9627744098F;
 Tue, 27 May 2025 12:36:11 -0400 (EDT)
Received: from lechazo (lechon.iro.umontreal.ca [132.204.27.242])
 by mail01.iro.umontreal.ca (Postfix) with ESMTPSA id 880B5120495;
 Tue, 27 May 2025 12:36:11 -0400 (EDT)
From: Stefan Monnier <monnier@HIDDEN>
To: Roi Martin <jroi.martin@HIDDEN>
Subject: Re: bug#78561: [PATCH] Add semantic linefeed support for paragraph
 filling
In-Reply-To: <87bjrehx8d.fsf@HIDDEN>
Message-ID: <jwvmsayni12.fsf-monnier+emacs@HIDDEN>
References: <87jz67tzrp.fsf@HIDDEN> <jwvr00fqt10.fsf-monnier+emacs@HIDDEN>
 <87frgs4jfh.fsf@HIDDEN> <jwvmsazpdai.fsf-monnier+emacs@HIDDEN>
 <87bjrehx8d.fsf@HIDDEN>
Date: Tue, 27 May 2025 12:36:10 -0400
User-Agent: Gnus/5.13 (Gnus v5.13)
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable
X-SPAM-INFO: Spam detection results:  0
 ALL_TRUSTED                -1 Passed through trusted hosts only via SMTP
 AWL 0.162 Adjusted score from AWL reputation of From: address
 BAYES_00                 -1.9 Bayes spam probability is 0 to 1%
 DKIM_SIGNED               0.1 Message has a DKIM or DK signature,
 not necessarily valid
 DKIM_VALID -0.1 Message has at least one valid DKIM or DK signature
 DKIM_VALID_AU -0.1 Message has a valid DKIM or DK signature from author's
 domain
 DKIM_VALID_EF -0.1 Message has a valid DKIM or DK signature from envelope-from
 domain
X-SPAM-LEVEL: 
X-Spam-Score: -2.3 (--)
X-Debbugs-Envelope-To: 78561
Cc: Eli Zaretskii <eliz@HIDDEN>, Marcin Borkowski <mbork@HIDDEN>,
 78561 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -3.3 (---)

>> Yes, I've had this in my TODO for many years.  =F0=9F=99=81
> I'll try to implement it :)

For some definition of "it".

>>> So, do we really want a specific `fill-region-semlf' function?
>> Actually, I think I want a `fill-region-as-paragraph-semlf'.
>> And maybe then some way to tell the `fill.el` code to use that instead
>> of the default `fill-region-as-paragraph`.
> OK, so here is my plan:

That plan has a much larger scope than semantic linefeed, so
I recommend you first finish the current patch and take on that
plan afterwards.
What I'm asking is a fairly small refactoring of the code you sent,
I think.

> First, I'll give a closer look to all the "fill" functions that Emacs
> currently provides to understand how every thing fits together and what
> is and what is not already supported.

Sounds good.  I can give you a quick summary of what I know.
`fill-paragraph-function`s usually serve as either:

- Some way for the major mode to teach the fill code how to stay within
  a major-mode-specific notion of paragraph (e.g. fill within comments
  or within strings).  This use has made somewhat obsolete by
  `fill-paragraph-forward-function` but it's still pretty common.

- Some way for the major mode to teach the fill code about special
  line-wrapping conventions (e.g. add a trailing \ on the previous line
  to fill C strings, add a leading SPC or TAB to fill rfc822 headers,
  ..) or to fine tune (adaptive-)fill-prefix.

- Actually change where we break lines for example to fill code in
  a "smart" way (like `smie-auto-fill` does).

- It can also be used to prevent filling in some parts
  (e.g. titles/headlines).

> Then, I'll send a new patch to support applying a
> `fill-paragraph-function' on a region "as-paragraph" (similar to the
> behavior of `fill-region-as-paragraph') and "per-paragraph" (similar to
> executing `fill-paragraph' for each paragraph within the region).

I think in general these are impossible because we don't know what the
`fill-paragraph-function` actually does.  My TODO is instead to provide
different hooks for the above different uses (some hooks already exist
such as `comment-line-break-function` but often they need to be
generalized) to try and make `fill-paragraph-function` effectively
obsolete (without necessarily marking it officially as obsolete).


        Stefan





Information forwarded to bug-gnu-emacs@HIDDEN:
bug#78561; Package emacs. Full text available.

Message received at 78561 <at> debbugs.gnu.org:


Received: (at 78561) by debbugs.gnu.org; 27 May 2025 15:47:34 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Tue May 27 11:47:34 2025
Received: from localhost ([127.0.0.1]:42722 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1uJwWb-0004Dk-1t
	for submit <at> debbugs.gnu.org; Tue, 27 May 2025 11:47:34 -0400
Received: from mail-wr1-x42c.google.com ([2a00:1450:4864:20::42c]:59522)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.84_2) (envelope-from <jroi.martin@HIDDEN>)
 id 1uJwWV-0004D1-M4
 for 78561 <at> debbugs.gnu.org; Tue, 27 May 2025 11:47:31 -0400
Received: by mail-wr1-x42c.google.com with SMTP id
 ffacd0b85a97d-3a361b8a66cso2348350f8f.2
 for <78561 <at> debbugs.gnu.org>; Tue, 27 May 2025 08:47:27 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1748360839; x=1748965639; darn=debbugs.gnu.org;
 h=content-transfer-encoding:mime-version:message-id:date:references
 :in-reply-to:subject:cc:to:from:from:to:cc:subject:date:message-id
 :reply-to; bh=jS4kvaGruoas+80TdZ4QzuvjtrATkwcUof+JSXGY82s=;
 b=fXYl+PFA9O0rWKTurMUvTuitLfUbzcXaT+4OAkcgZf1182mSy6i33n1i8t4cAzD5QU
 vc4irRytQd56sapnC7Fal3Em2BqzCbY1qqxhFgjsM99dSo5HBp21am9jHOP0M2UAJoej
 aME6mt9F5Ub9EerJJeZMV/trwNGNj8U2oy2CTsZlzztmIO1Z+NUyutEFjvgMam8R78aC
 qpT+D/YC//6JrTeAXHl8qMFIjUW2HJxVfDy4Sn/8HPrpLSbe7UtjUsKsA//2TvvxG2bE
 iIJphTKYBAy1HPqTYMLgQy+pHzc5GiRSxRQ/OKV7TrbjsYr5QfduVRkHru5iwyl+ayg5
 fbNQ==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1748360839; x=1748965639;
 h=content-transfer-encoding:mime-version:message-id:date:references
 :in-reply-to:subject:cc:to:from:x-gm-message-state:from:to:cc
 :subject:date:message-id:reply-to;
 bh=jS4kvaGruoas+80TdZ4QzuvjtrATkwcUof+JSXGY82s=;
 b=RR7JyhkGAPQ+SL45Oi2BClZQZGfWqtRe0v+3/mg4hx1l5G52akELSCtsmF8DLhl4X5
 WRTK/+g6fmeUnEdBsiuciJovJR3LmAOEUE1lU0QcrmefUvq0sJ74GS2b8TPom1H6khLf
 viwzEuoF3XDS+ZNG0MjVBFDr7bSKaShks1+CkWZzPFKE2YUBQxe1vEvctPhLN6z0fmAm
 dWWCGatXnweRsgLnuSmUwYws5Ugf4wCAQPI81uWO8HPozYxOeVAo07sa28ZcFd3AsyV5
 YQSdfIlkXO5kU6gtfPtyfayw0ZeOGzhrYVTntLd+v1hOe+26R0p/xWQeGIH6qk2oSoYM
 IRog==
X-Forwarded-Encrypted: i=1;
 AJvYcCWgUOjc9tUyjjiPj28y7Pl/+yCoZcy+W4wGBROtaKVWoHUqc1uM+WBGMuh8sJH7Y+TOxLA9ZA==@debbugs.gnu.org
X-Gm-Message-State: AOJu0YyyMYtmxHKKvKIF4QIabZ8J2BQwQB60q/lRvvCGDOHRENc4FcR6
 l0D/Fj76XA5alaVdGqf1rLrdE7lIr/8gXO6YX1P7voYhVoSipEtdkoVO
X-Gm-Gg: ASbGncsrS8zpLBh3upfQkGz+IN9xsj/842Pjq/slxsRf9NaBohrIfzThd8z5C1fPjEb
 t2WyxlRRz4VacWgv4TNCraYA8htW4iVus63OArQvndaKpqfCFYA3MoEQzQb9z6RhhgXCt0E9F2H
 49NhUgxUpWGlQaAo3b+yJTNPaaNs+widoiZbmMwQdocbI9HFM2OWKsUsSKsGgCooJf1xBJw5Q6b
 C2vRYGicCf0Z8MZpDMhHfptMztevhtQErhHQg6Og2VnlVN0mU8AJM2iq9yFdoXS4ARXhGKGj+E8
 ojdUoAUHQlxjzREaJey0VFldqdUJMNi9RCz1BK+OBE5zBMpUOw==
X-Google-Smtp-Source: AGHT+IEGNOK0mUt1T1WfWtWU+RejdIoExLutF0eNoTGmnP3hgijV52hlSf5N2PoPErVIxW8zZ0id4Q==
X-Received: by 2002:a05:6000:40ce:b0:3a4:dd02:f48a with SMTP id
 ffacd0b85a97d-3a4dd02f535mr5103446f8f.11.1748360838733; 
 Tue, 27 May 2025 08:47:18 -0700 (PDT)
Received: from localhost ([84.79.192.255]) by smtp.gmail.com with ESMTPSA id
 ffacd0b85a97d-3a4d2a7a317sm8594418f8f.24.2025.05.27.08.47.18
 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);
 Tue, 27 May 2025 08:47:18 -0700 (PDT)
From: Roi Martin <jroi.martin@HIDDEN>
To: Stefan Monnier <monnier@HIDDEN>
Subject: Re: bug#78561: [PATCH] Add semantic linefeed support for paragraph
 filling
In-Reply-To: <jwvmsazpdai.fsf-monnier+emacs@HIDDEN>
References: <87jz67tzrp.fsf@HIDDEN>
 <jwvr00fqt10.fsf-monnier+emacs@HIDDEN> <87frgs4jfh.fsf@HIDDEN>
 <jwvmsazpdai.fsf-monnier+emacs@HIDDEN>
Date: Tue, 27 May 2025 17:47:14 +0200
Message-ID: <87bjrehx8d.fsf@HIDDEN>
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
X-Spam-Score: 0.0 (/)
X-Debbugs-Envelope-To: 78561
Cc: Eli Zaretskii <eliz@HIDDEN>, Marcin Borkowski <mbork@HIDDEN>,
 78561 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.0 (-)

Stefan Monnier <monnier@HIDDEN> writes:

>>> Please try and separate it into a `fill-region-semlf` function and then
>>> another one which applies it to a paragraph, so that it can also be used
>>> to fill a specific user-specified region (or the whole buffer).
>> I'm not sure about this one.  The idea is that `fill-paragraph-semlf'
>> can be assigned as a value for `fill-paragraph-function' (I also
>> included a mention to this in the doc string) or it can be called
>> directly.  The thing is that `fill-paragraph' docs say:
>
> Sadly, we don't currently have anything like a `fill-region-function`,
> but that's "a bug, not a feature", so we should write new code such that
> this misfeature is easier rather than harder to fix in the future.
>
>> I agree that it would be useful to apply `fill-paragraph-semlf' on
>> a region or the whole buffer.  But, the same could be said about any
>> other `fill-paragraph-function'.
>
> Yes, I've had this in my TODO for many years.  🙁

I'll try to implement it :)

>> So, do we really want a specific `fill-region-semlf' function?
>
> Actually, I think I want a `fill-region-as-paragraph-semlf'.
> And maybe then some way to tell the `fill.el` code to use that instead
> of the default `fill-region-as-paragraph`.

OK, so here is my plan:

First, I'll give a closer look to all the "fill" functions that Emacs
currently provides to understand how every thing fits together and what
is and what is not already supported.

Then, I'll send a new patch to support applying a
`fill-paragraph-function' on a region "as-paragraph" (similar to the
behavior of `fill-region-as-paragraph') and "per-paragraph" (similar to
executing `fill-paragraph' for each paragraph within the region).

Finally, if needed, I can update this patch.

Does it make sense?




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#78561; Package emacs. Full text available.

Message received at 78561 <at> debbugs.gnu.org:


Received: (at 78561) by debbugs.gnu.org; 26 May 2025 16:21:25 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Mon May 26 12:21:25 2025
Received: from localhost ([127.0.0.1]:58606 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1uJaZp-0004HF-3Q
	for submit <at> debbugs.gnu.org; Mon, 26 May 2025 12:21:25 -0400
Received: from mailscanner.iro.umontreal.ca ([132.204.25.50]:8451)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.84_2) (envelope-from <monnier@HIDDEN>)
 id 1uJaZn-0004Gs-6D
 for 78561 <at> debbugs.gnu.org; Mon, 26 May 2025 12:21:23 -0400
Received: from pmg1.iro.umontreal.ca (localhost.localdomain [127.0.0.1])
 by pmg1.iro.umontreal.ca (Proxmox) with ESMTP id 418C8100C6C;
 Mon, 26 May 2025 12:21:17 -0400 (EDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=iro.umontreal.ca;
 s=mail; t=1748276476;
 bh=o8AfXoAY1ASeeY3lNXkNfoqCplrE70IkgiDp9/+n4P4=;
 h=From:To:Cc:Subject:In-Reply-To:References:Date:From;
 b=R7GGaIIpylOo+I2U6w9zbqTkZxxIc/Y6pa6MDKex4dzqlFx6JLoe5g7PcMbDrYjud
 gzWl4zlq3Hdahx/8LHHhOv500yRwqxzETt70QDC7rX3g6gbGAkBhgBxaX24w6W5Ffi
 KQ+hu9PdmycV5MyTj30qIqsAo/OVmWTN0lVvosa9SvNQ/OyNcA92DkTEkyEL/HpD8v
 dw6GmF0UBz5c/K3S7CHBdrJm3s6SBt7MPTtRU1k/wtxTyiljUD5n+H9isCWP5dQkI5
 omvBZxUbodu1pseor2hARPKDgL+MAMjPs2+6lYzUmNcZHipQFgn3rIjKVQGf3cx4cF
 6thvUUxTruWJw==
Received: from mail01.iro.umontreal.ca (unknown [172.31.2.1])
 by pmg1.iro.umontreal.ca (Proxmox) with ESMTP id 4CDC81003A7;
 Mon, 26 May 2025 12:21:16 -0400 (EDT)
Received: from lechazo (lechon.iro.umontreal.ca [132.204.27.242])
 by mail01.iro.umontreal.ca (Postfix) with ESMTPSA id 3430812065C;
 Mon, 26 May 2025 12:21:16 -0400 (EDT)
From: Stefan Monnier <monnier@HIDDEN>
To: Roi Martin <jroi.martin@HIDDEN>
Subject: Re: bug#78561: [PATCH] Add semantic linefeed support for paragraph
 filling
In-Reply-To: <87frgs4jfh.fsf@HIDDEN>
Message-ID: <jwvmsazpdai.fsf-monnier+emacs@HIDDEN>
References: <87jz67tzrp.fsf@HIDDEN> <jwvr00fqt10.fsf-monnier+emacs@HIDDEN>
 <87frgs4jfh.fsf@HIDDEN>
Date: Mon, 26 May 2025 12:21:15 -0400
User-Agent: Gnus/5.13 (Gnus v5.13)
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable
X-SPAM-INFO: Spam detection results:  0
 ALL_TRUSTED                -1 Passed through trusted hosts only via SMTP
 AWL 0.073 Adjusted score from AWL reputation of From: address
 BAYES_00                 -1.9 Bayes spam probability is 0 to 1%
 DKIM_SIGNED               0.1 Message has a DKIM or DK signature,
 not necessarily valid
 DKIM_VALID -0.1 Message has at least one valid DKIM or DK signature
 DKIM_VALID_AU -0.1 Message has a valid DKIM or DK signature from author's
 domain
 DKIM_VALID_EF -0.1 Message has a valid DKIM or DK signature from envelope-from
 domain
X-SPAM-LEVEL: 
X-Spam-Score: -2.3 (--)
X-Debbugs-Envelope-To: 78561
Cc: Eli Zaretskii <eliz@HIDDEN>, Marcin Borkowski <mbork@HIDDEN>,
 78561 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -3.3 (---)

>> Please try and separate it into a `fill-region-semlf` function and then
>> another one which applies it to a paragraph, so that it can also be used
>> to fill a specific user-specified region (or the whole buffer).
> I'm not sure about this one.  The idea is that `fill-paragraph-semlf'
> can be assigned as a value for `fill-paragraph-function' (I also
> included a mention to this in the doc string) or it can be called
> directly.  The thing is that `fill-paragraph' docs say:

Sadly, we don't currently have anything like a `fill-region-function`,
but that's "a bug, not a feature", so we should write new code such that
this misfeature is easier rather than harder to fix in the future.

> I agree that it would be useful to apply `fill-paragraph-semlf' on
> a region or the whole buffer.  But, the same could be said about any
> other `fill-paragraph-function'.

Yes, I've had this in my TODO for many years.  =F0=9F=99=81

> So, do we really want a specific `fill-region-semlf' function?

Actually, I think I want a `fill-region-as-paragraph-semlf'.
And maybe then some way to tell the `fill.el` code to use that instead
of the default `fill-region-as-paragraph`.


        Stefan





Information forwarded to bug-gnu-emacs@HIDDEN:
bug#78561; Package emacs. Full text available.

Message received at 78561 <at> debbugs.gnu.org:


Received: (at 78561) by debbugs.gnu.org; 25 May 2025 18:47:21 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Sun May 25 14:47:21 2025
Received: from localhost ([127.0.0.1]:48569 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1uJGNS-0005XW-53
	for submit <at> debbugs.gnu.org; Sun, 25 May 2025 14:47:21 -0400
Received: from mail-wr1-x42e.google.com ([2a00:1450:4864:20::42e]:56635)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.84_2) (envelope-from <jroi.martin@HIDDEN>)
 id 1uJGNM-0005Wi-Cf
 for 78561 <at> debbugs.gnu.org; Sun, 25 May 2025 14:47:16 -0400
Received: by mail-wr1-x42e.google.com with SMTP id
 ffacd0b85a97d-3a4d877dfb3so368332f8f.1
 for <78561 <at> debbugs.gnu.org>; Sun, 25 May 2025 11:47:12 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1748198826; x=1748803626; darn=debbugs.gnu.org;
 h=mime-version:message-id:date:references:in-reply-to:subject:cc:to
 :from:from:to:cc:subject:date:message-id:reply-to;
 bh=ibFQPPnAeaxgTD845cIwyo1dnwwP146ml1u7cW+8A5g=;
 b=YhIck9LJbRWwZt2gT1JGeLE9WooSzMM6xeFTMGBJiNeOulckAsfd1PGIsD+XswdAtg
 LroZ1PNg1FaRC+Oe6ijCpKY+C/yxgf3iiD7Un7Q9pLn53e84P8eDa3PGUhpB/G5e4eJ7
 rRS+u/6WIsOMdtSiuhp8NSrzaGA+J+b8nlVRf4qVRsOn8ofaHy1UGMQNBpiZpB/CrRGJ
 CbNBdvDYTF4fbi5B207xhSvvtscHB0P4nAjOG7dMFKhNnxyOk9rpLEsf4yvVC/b7W/ZO
 g7Y3Shx/Ov7nm9K0OJtTPf3AO9ePP+Dn+iLceQdkze6Jl+69/SGmXZasgdndPgWbqyJG
 ITYQ==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1748198826; x=1748803626;
 h=mime-version:message-id:date:references:in-reply-to:subject:cc:to
 :from:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to;
 bh=ibFQPPnAeaxgTD845cIwyo1dnwwP146ml1u7cW+8A5g=;
 b=nBhcD8CtWxPE10XkrNkULbzaqqpODXDinH+BCtOyEGC+MNR3do1baJxgX+sDxsh6ON
 roNIwc/1dJEuAejVjhBmWX3TK3QxvrWGBTGVLOU8Casc2AryKwcoCrfr8eOamFva0JYN
 SxyaGZZ+PEPGxQTC9oVuUQkTOGTeqVB+S6+gnG/0wvdiqXnThX5GiJRPnobXa515DPTN
 mQBu4LLN5ldLNQtN0EXdAxvNth5dyUUEqs5PnsgMlLweOfpRcyE053/4TDbqjawxW6e4
 mrcJk6y6lYqCTwRNkQMawtvXCrXDw1fSz+Ay+H7mAVvt5eoRuQuu659qtXUHZOncHShr
 gCJw==
X-Gm-Message-State: AOJu0YzkmYhHv8xPcM4uyuRATeaFUYFRLOvvztF51du1QWbKB6mn69kZ
 W1nAH4fRQXqRfDFISq7EQzpQcqhXWuvQ8Vvx6SSYZfhTzWneWsC1J7Yh
X-Gm-Gg: ASbGnctvE+j4063uupqbAU8sPByfP9Gg0SWGIFWjGtTSE6LpjLhz/gNPZmR9QkegHfR
 wasbdvGj8VwwISvjfkvpFKPcOnPk8eQmgX24FeTh4VR9G90fy17BCQFhXtKC1DRCv9kzDWriS0p
 x94/EfgnLLnHfiOeluESjwV1vFmArgdh4H5qbSBfLaeQx+cbQ3VXKphvCpeRtdDZTzdDocepZF8
 xvx2MBfCEM1NIEAIKcyxEBnQSBTHPdW4CDUr5z/SnV6eQqt9P42HmX2wJFwK8RWihwmrOXhWRn6
 t+AWJAZY+BtbwOeEiQig6U1vqlC4B5jPnEEBFej0Zs3z5Gf99Q==
X-Google-Smtp-Source: AGHT+IEtRwMFegIyM4Z2bC9BuSsIqz+vBtOJFYI9xCWEYdJ052htQqVVWRtL4N6PkLeHqRoqXUzFtg==
X-Received: by 2002:a05:6000:3103:b0:3a3:64d2:ced0 with SMTP id
 ffacd0b85a97d-3a4cb49e6e4mr3809761f8f.53.1748198825937; 
 Sun, 25 May 2025 11:47:05 -0700 (PDT)
Received: from localhost ([84.79.192.255]) by smtp.gmail.com with ESMTPSA id
 5b1f17b1804b1-447f73d4aa2sm219222405e9.21.2025.05.25.11.47.05
 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);
 Sun, 25 May 2025 11:47:05 -0700 (PDT)
From: Roi Martin <jroi.martin@HIDDEN>
To: Stefan Monnier <monnier@HIDDEN>, Eli Zaretskii <eliz@HIDDEN>
Subject: Re: bug#78561: [PATCH] Add semantic linefeed support for paragraph
 filling
In-Reply-To: <jwvr00fqt10.fsf-monnier+emacs@HIDDEN>
References: <87jz67tzrp.fsf@HIDDEN> <jwvr00fqt10.fsf-monnier+emacs@HIDDEN>
Date: Sun, 25 May 2025 20:46:58 +0200
Message-ID: <87frgs4jfh.fsf@HIDDEN>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="=-=-="
X-Spam-Score: 0.0 (/)
X-Debbugs-Envelope-To: 78561
Cc: Marcin Borkowski <mbork@HIDDEN>, 78561 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.0 (-)

--=-=-=
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit

Stefan Monnier <monnier@HIDDEN> writes:

>> Given that this is a first version, I have not added any reference to
>> the manuals.  If you think it makes sense, please let me know and I'll
>> modify the patch accordingly.
>
> Maybe a short version of the explanation you give below would be good to
> have in the manual (tho Eli suggests a URL instead, so maybe that's
> good enough?).
>
>> +(defun fill-paragraph-semlf (&optional justify)
>> +  "Fill paragraph at or after point using semantic linefeeds.
>> +
>> +This function ensures that a newline character follows every
>> +sentence, as punctuated by a period (.), exclamation mark (!), or
>> +question mark (?).
>
> This seems inaccurate: it just uses whichever definition of sentence is
> used by `forward-sentence`, so it may ignore some of those chars or pay
> attention to others.

I have updated the patch with a more precise definition.  Also, I added
links to the sources I referenced for semantic linefeeds.

>> +If JUSTIFY is non-nil (interactively, with prefix argument), justify as
>> +well.  If `sentence-end-double-space' is non-nil, then period followed
>> +by one space does not end a sentence, so don't break a line there.  The
>> +variable `fill-column' controls the width for filling."
>
> I'd move the "The" to the last line.  🙂

Fixed :)

>> +  (interactive "P")
>> +  (save-excursion
>> +    (let ((end (progn
>> +		 (fill-forward-paragraph 1)
>> +		 (backward-word)
>> +		 (end-of-line)
>> +		 (point)))
>> +	  (start (progn
>> +		   (fill-forward-paragraph -1)
>> +		   (forward-word)
>> +		   (beginning-of-line)
>> +		   (point)))
>> +	  pfx)
>> +      (with-restriction start end
>> +	(let ((fill-column (point-max)))
>> +	  (setq pfx (or (fill-region-as-paragraph (point-min) (point-max)) "")))
>> +	(goto-char (point-min))
>> +	(while (not (eobp))
>> +	  (let ((fill-prefix pfx))
>> +	    (fill-region-as-paragraph (point)
>> +				      (progn (forward-sentence) (point))
>> +				      justify))
>> +	  (when (and (> (point) (line-beginning-position))
>> +		     (< (point) (line-end-position)))
>> +	    (delete-horizontal-space)
>> +	    (newline)
>> +	    (insert pfx))))))
>> +  t)
>
> Please try and separate it into a `fill-region-semlf` function and then
> another one which applies it to a paragraph, so that it can also be used
> to fill a specific user-specified region (or the whole buffer).

I'm not sure about this one.  The idea is that `fill-paragraph-semlf'
can be assigned as a value for `fill-paragraph-function' (I also
included a mention to this in the doc string) or it ca be called
directly.  The thing is that `fill-paragraph' docs say:

  The REGION argument is non-nil if called interactively; in that
  case, if Transient Mark mode is enabled and the mark is active,
  call `fill-region' to fill each of the paragraphs in the active
  region, instead of just filling the current paragraph.

And `fill-paragraph-function' docs say:

  Note: This only affects ‘fill-paragraph’ and not ‘fill-region’
  nor ‘auto-fill-mode’

So, if I'm not wrong, filling regions and paragraphs is different in the
current design.

I agree that it would be useful to apply `fill-paragraph-semlf' on a
region or the whole buffer.  But, the same could be said about any other
`fill-paragraph-function'.  So, do we really want a specific
`fill-region-semlf' function?

I attach a new version of the patch.

Thanks!


--=-=-=
Content-Type: text/x-patch
Content-Disposition: attachment;
 filename=0001-Add-semantic-linefeed-support-for-paragraph-filling.patch

From 9b8a28910a3da271afe32377926fd6cc2a9356ff Mon Sep 17 00:00:00 2001
From: Roi Martin <jroi.martin@HIDDEN>
Date: Fri, 21 Mar 2025 14:22:46 +0100
Subject: [PATCH] Add semantic linefeed support for paragraph filling

* lisp/textmodes/fill.el (fill-paragraph-semlf): Add function to fill
paragraph using semantic linefeeds.
* test/lisp/textmodes/fill-tests.el (fill-test-fill-paragraph-semlf)
(fill-test-fill-paragraph-semlf-fill-paragraph-function)
(fill-test-fill-paragraph-semlf-justify)
(fill-test-fill-paragraph-semlf-sentence-end-double-space)
(fill-test-fill-paragraph-semlf-fill-column)
(fill-test-fill-paragraph-semlf-punctuation-marks)
(fill-test-fill-paragraph-semlf-twice)
(fill-test-fill-paragraph-semlf-fill-prefix)
(fill-test-fill-paragraph-semlf-indented-block)
(fill-test-fill-paragraph-semlf-emacs-lisp-mode)
(fill-test-fill-paragraph-semlf-c-mode)
(fill-test-fill-paragraph-semlf-org-mode)
(fill-test-fill-paragraph-semlf-markdown-mode): Add tests.
* test/lisp/textmodes/fill-resources/semlf-c-mode.erts:
* test/lisp/textmodes/fill-resources/semlf-emacs-lisp-mode.erts:
* test/lisp/textmodes/fill-resources/semlf-fill-column.erts:
* test/lisp/textmodes/fill-resources/semlf-fill-paragraph-function.erts:
* test/lisp/textmodes/fill-resources/semlf-fill-prefix.erts:
* test/lisp/textmodes/fill-resources/semlf-indented-block.erts:
* test/lisp/textmodes/fill-resources/semlf-justify.erts:
* test/lisp/textmodes/fill-resources/semlf-markdown-mode.erts:
* test/lisp/textmodes/fill-resources/semlf-org-mode.erts:
* test/lisp/textmodes/fill-resources/semlf-punctuation-marks.erts:
* test/lisp/textmodes/fill-resources/semlf-sentence-end-double-space.erts:
* test/lisp/textmodes/fill-resources/semlf-twice.erts:
* test/lisp/textmodes/fill-resources/semlf.erts: Add test data.
---
 lisp/textmodes/fill.el                        |  47 +++++
 .../fill-resources/semlf-c-mode.erts          | 183 ++++++++++++++++++
 .../fill-resources/semlf-emacs-lisp-mode.erts |  87 +++++++++
 .../fill-resources/semlf-fill-column.erts     |  15 ++
 .../semlf-fill-paragraph-function.erts        |  12 ++
 .../fill-resources/semlf-fill-prefix.erts     |  35 ++++
 .../fill-resources/semlf-indented-block.erts  |  31 +++
 .../fill-resources/semlf-justify.erts         |  12 ++
 .../fill-resources/semlf-markdown-mode.erts   | 129 ++++++++++++
 .../fill-resources/semlf-org-mode.erts        | 122 ++++++++++++
 .../semlf-punctuation-marks.erts              |  13 ++
 .../semlf-sentence-end-double-space.erts      |  13 ++
 .../textmodes/fill-resources/semlf-twice.erts |  12 ++
 test/lisp/textmodes/fill-resources/semlf.erts |  88 +++++++++
 test/lisp/textmodes/fill-tests.el             |  90 +++++++++
 15 files changed, 889 insertions(+)
 create mode 100644 test/lisp/textmodes/fill-resources/semlf-c-mode.erts
 create mode 100644 test/lisp/textmodes/fill-resources/semlf-emacs-lisp-mode.erts
 create mode 100644 test/lisp/textmodes/fill-resources/semlf-fill-column.erts
 create mode 100644 test/lisp/textmodes/fill-resources/semlf-fill-paragraph-function.erts
 create mode 100644 test/lisp/textmodes/fill-resources/semlf-fill-prefix.erts
 create mode 100644 test/lisp/textmodes/fill-resources/semlf-indented-block.erts
 create mode 100644 test/lisp/textmodes/fill-resources/semlf-justify.erts
 create mode 100644 test/lisp/textmodes/fill-resources/semlf-markdown-mode.erts
 create mode 100644 test/lisp/textmodes/fill-resources/semlf-org-mode.erts
 create mode 100644 test/lisp/textmodes/fill-resources/semlf-punctuation-marks.erts
 create mode 100644 test/lisp/textmodes/fill-resources/semlf-sentence-end-double-space.erts
 create mode 100644 test/lisp/textmodes/fill-resources/semlf-twice.erts
 create mode 100644 test/lisp/textmodes/fill-resources/semlf.erts

diff --git a/lisp/textmodes/fill.el b/lisp/textmodes/fill.el
index e38d030734fb..b6b413f88b2d 100644
--- a/lisp/textmodes/fill.el
+++ b/lisp/textmodes/fill.el
@@ -1583,4 +1583,51 @@ fill-individual-paragraphs-citation
 	"")
     string))
 
+(defun fill-paragraph-semlf (&optional justify)
+  "Fill paragraph at or after point using semantic linefeeds.
+
+This function ensures that a newline character follows every sentence.
+If a sentence is not followed by a newline character, one is inserted.
+The task of deciding what is considered a sentence is delegated to the
+`forward-sentence' function.
+
+If JUSTIFY is non-nil (interactively, with prefix argument), justify as
+well.  If `sentence-end-double-space' is non-nil, then period followed
+by one space does not end a sentence, so don't break a line there.
+The variable `fill-column' controls the width for filling.
+
+This function can be assigned as a value for `fill-paragraph-function',
+allowing `fill-paragraph' to utilize it.
+
+For more details about semantic linefeeds, see `https://sembr.org/' and
+`https://rhodesmill.org/brandon/2012/one-sentence-per-line/'."
+  (interactive "P")
+  (save-excursion
+    (let ((end (progn
+		 (fill-forward-paragraph 1)
+		 (backward-word)
+		 (end-of-line)
+		 (point)))
+	  (start (progn
+		   (fill-forward-paragraph -1)
+		   (forward-word)
+		   (beginning-of-line)
+		   (point)))
+	  pfx)
+      (with-restriction start end
+	(let ((fill-column (point-max)))
+	  (setq pfx (or (fill-region-as-paragraph (point-min) (point-max)) "")))
+	(goto-char (point-min))
+	(while (not (eobp))
+	  (let ((fill-prefix pfx))
+	    (fill-region-as-paragraph (point)
+				      (progn (forward-sentence) (point))
+				      justify))
+	  (when (and (> (point) (line-beginning-position))
+		     (< (point) (line-end-position)))
+	    (delete-horizontal-space)
+	    (insert "\n")
+	    (insert pfx))))))
+  t)
+
 ;;; fill.el ends here
diff --git a/test/lisp/textmodes/fill-resources/semlf-c-mode.erts b/test/lisp/textmodes/fill-resources/semlf-c-mode.erts
new file mode 100644
index 000000000000..a28eb68cfc6a
--- /dev/null
+++ b/test/lisp/textmodes/fill-resources/semlf-c-mode.erts
@@ -0,0 +1,183 @@
+Point-Char: |
+
+Name: c-mode - single-line
+
+=-=
+// Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+// eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+// ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+// Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+// eiusmod tempor.
+// Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+// veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
+
+Name: c-mode - single-line - fill-prefix - marker
+
+=-=
+// - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+// - Aliquip ex ea commodo consequat.  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
+// - Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+=-=
+// - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+// - eiusmod tempor.
+// - Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+// - veniam, quis nostrud exercitation ullamco laboris nisi ut.
+// - Aliquip ex ea commodo consequat.
+// - Duis aute irure dolor in reprehenderit in voluptate velit esse
+// - cillum dolore eu fugiat nulla pariatur.
+// - Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+// - officia deserunt mollit anim id est laborum.
+=-=-=
+
+Name: c-mode - single-line - fill-prefix - whitespace
+
+=-=
+// - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+//   Aliquip ex ea commodo consequat.  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
+//   Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+=-=
+// - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+//   eiusmod tempor.
+//   Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+//   veniam, quis nostrud exercitation ullamco laboris nisi ut.
+//   Aliquip ex ea commodo consequat.
+//   Duis aute irure dolor in reprehenderit in voluptate velit esse
+//   cillum dolore eu fugiat nulla pariatur.
+//   Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+//   officia deserunt mollit anim id est laborum.
+=-=-=
+
+Name: c-mode - single-line - indented block
+
+=-=
+// Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+// eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut
+// enim ad minim veniam, quis nostrud exercitation ullamco laboris
+// nisi ut.
+//
+// 	|Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed
+// 	do eiusmod tempor.  Incididunt ut labore et dolore magna
+// 	aliqua. Ut enim ad minim veniam, quis nostrud exercitation
+// 	ullamco laboris nisi ut.
+//
+// Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+// eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut
+// enim ad minim veniam, quis nostrud exercitation ullamco laboris
+// nisi ut.
+=-=
+// Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+// eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut
+// enim ad minim veniam, quis nostrud exercitation ullamco laboris
+// nisi ut.
+//
+// 	Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed
+// 	do eiusmod tempor.
+// 	Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+// 	veniam, quis nostrud exercitation ullamco laboris nisi ut.
+//
+// Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+// eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut
+// enim ad minim veniam, quis nostrud exercitation ullamco laboris
+// nisi ut.
+=-=-=
+
+Name: c-mode - multi-line
+
+=-=
+/*
+ * Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+ * eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ * ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+ */
+=-=
+/*
+ * Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+ * eiusmod tempor.
+ * Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+ * veniam, quis nostrud exercitation ullamco laboris nisi ut.
+ */
+=-=-=
+
+Name: c-mode - multi-line - fill-prefix - marker
+
+=-=
+/*
+ * - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+ * - Aliquip ex ea commodo consequat.  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
+ * - Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ */
+=-=
+/*
+ * - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+ * - eiusmod tempor.
+ * - Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+ * - veniam, quis nostrud exercitation ullamco laboris nisi ut.
+ * - Aliquip ex ea commodo consequat.
+ * - Duis aute irure dolor in reprehenderit in voluptate velit esse
+ * - cillum dolore eu fugiat nulla pariatur.
+ * - Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+ * - officia deserunt mollit anim id est laborum.
+ */
+=-=-=
+
+Name: c-mode - multi-line - fill-prefix - whitespace
+
+=-=
+/*
+ * - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+ *   Aliquip ex ea commodo consequat.  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
+ *   Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ */
+=-=
+/*
+ * - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+ *   eiusmod tempor.
+ *   Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+ *   veniam, quis nostrud exercitation ullamco laboris nisi ut.
+ *   Aliquip ex ea commodo consequat.
+ *   Duis aute irure dolor in reprehenderit in voluptate velit esse
+ *   cillum dolore eu fugiat nulla pariatur.
+ *   Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+ *   officia deserunt mollit anim id est laborum.
+ */
+=-=-=
+
+Name: c-mode - multi-line - indented block
+
+=-=
+/*
+ * Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+ * eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut
+ * enim ad minim veniam, quis nostrud exercitation ullamco laboris
+ * nisi ut.
+ *
+ * 	|Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed
+ * 	do eiusmod tempor.  Incididunt ut labore et dolore magna
+ * 	aliqua. Ut enim ad minim veniam, quis nostrud exercitation
+ * 	ullamco laboris nisi ut.
+ *
+ * Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+ * eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut
+ * enim ad minim veniam, quis nostrud exercitation ullamco laboris
+ * nisi ut.
+ */
+=-=
+/*
+ * Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+ * eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut
+ * enim ad minim veniam, quis nostrud exercitation ullamco laboris
+ * nisi ut.
+ *
+ * 	Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed
+ * 	do eiusmod tempor.
+ * 	Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+ * 	veniam, quis nostrud exercitation ullamco laboris nisi ut.
+ *
+ * Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+ * eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut
+ * enim ad minim veniam, quis nostrud exercitation ullamco laboris
+ * nisi ut.
+ */
+=-=-=
diff --git a/test/lisp/textmodes/fill-resources/semlf-emacs-lisp-mode.erts b/test/lisp/textmodes/fill-resources/semlf-emacs-lisp-mode.erts
new file mode 100644
index 000000000000..fe71ee32c1aa
--- /dev/null
+++ b/test/lisp/textmodes/fill-resources/semlf-emacs-lisp-mode.erts
@@ -0,0 +1,87 @@
+Point-Char: |
+
+Name: emacs-lisp-mode
+
+=-=
+;; Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+;; eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+;; ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+;; Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+;; eiusmod tempor.
+;; Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+;; veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
+
+Name: emacs-lisp-mode - fill-prefix - marker
+
+=-=
+;; - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+;; - Aliquip ex ea commodo consequat.  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
+;; - Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+=-=
+;; - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+;; - eiusmod tempor.
+;; - Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+;; - veniam, quis nostrud exercitation ullamco laboris nisi ut.
+;; - Aliquip ex ea commodo consequat.
+;; - Duis aute irure dolor in reprehenderit in voluptate velit esse
+;; - cillum dolore eu fugiat nulla pariatur.
+;; - Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+;; - officia deserunt mollit anim id est laborum.
+=-=-=
+
+Name: emacs-lisp-mode - fill-prefix - whitespace
+
+=-=
+;; - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+;;   Aliquip ex ea commodo consequat.  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
+;;   Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+=-=
+;; - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+;;   eiusmod tempor.
+;;   Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+;;   veniam, quis nostrud exercitation ullamco laboris nisi ut.
+;;   Aliquip ex ea commodo consequat.
+;;   Duis aute irure dolor in reprehenderit in voluptate velit esse
+;;   cillum dolore eu fugiat nulla pariatur.
+;;   Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+;;   officia deserunt mollit anim id est laborum.
+=-=-=
+
+Name: emacs-lisp-mode - indented block
+
+The `fill-forward-paragraph' function jumps to the beginning/end of
+the comment.
+
+=-=
+;; Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+;; eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut
+;; enim ad minim veniam, quis nostrud exercitation ullamco laboris
+;; nisi ut.
+
+;; 	|Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed
+;; 	do eiusmod tempor.  Incididunt ut labore et dolore magna
+;; 	aliqua. Ut enim ad minim veniam, quis nostrud exercitation
+;; 	ullamco laboris nisi ut.
+
+;; Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+;; eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut
+;; enim ad minim veniam, quis nostrud exercitation ullamco laboris
+;; nisi ut.
+=-=
+;; Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+;; eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut
+;; enim ad minim veniam, quis nostrud exercitation ullamco laboris
+;; nisi ut.
+
+;; 	Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed
+;; 	do eiusmod tempor.
+;; 	Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+;; 	veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+;; Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+;; eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut
+;; enim ad minim veniam, quis nostrud exercitation ullamco laboris
+;; nisi ut.
+=-=-=
diff --git a/test/lisp/textmodes/fill-resources/semlf-fill-column.erts b/test/lisp/textmodes/fill-resources/semlf-fill-column.erts
new file mode 100644
index 000000000000..20db7b1f9c5b
--- /dev/null
+++ b/test/lisp/textmodes/fill-resources/semlf-fill-column.erts
@@ -0,0 +1,15 @@
+Name: fill-column
+
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+Lorem ipsum dolor sit amet,
+consectetur adipiscing elit, sed do
+eiusmod tempor.
+Incididunt ut labore et dolore
+magna aliqua. Ut enim ad minim
+veniam, quis nostrud exercitation
+ullamco laboris nisi ut.
+=-=-=
diff --git a/test/lisp/textmodes/fill-resources/semlf-fill-paragraph-function.erts b/test/lisp/textmodes/fill-resources/semlf-fill-paragraph-function.erts
new file mode 100644
index 000000000000..467e7401cf50
--- /dev/null
+++ b/test/lisp/textmodes/fill-resources/semlf-fill-paragraph-function.erts
@@ -0,0 +1,12 @@
+Name: fill-paragraph-function
+
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.
+Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
+quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
diff --git a/test/lisp/textmodes/fill-resources/semlf-fill-prefix.erts b/test/lisp/textmodes/fill-resources/semlf-fill-prefix.erts
new file mode 100644
index 000000000000..e067eff69701
--- /dev/null
+++ b/test/lisp/textmodes/fill-resources/semlf-fill-prefix.erts
@@ -0,0 +1,35 @@
+Name: fill-prefix - marker
+
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+- Aliquip ex ea commodo consequat.  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
+- Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+- eiusmod tempor.
+- Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+- veniam, quis nostrud exercitation ullamco laboris nisi ut.
+- Aliquip ex ea commodo consequat.
+- Duis aute irure dolor in reprehenderit in voluptate velit esse
+- cillum dolore eu fugiat nulla pariatur.
+- Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+- officia deserunt mollit anim id est laborum.
+=-=-=
+
+Name: fill-prefix - whitespace
+
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+  Aliquip ex ea commodo consequat.  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
+  Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+  eiusmod tempor.
+  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+  veniam, quis nostrud exercitation ullamco laboris nisi ut.
+  Aliquip ex ea commodo consequat.
+  Duis aute irure dolor in reprehenderit in voluptate velit esse
+  cillum dolore eu fugiat nulla pariatur.
+  Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+  officia deserunt mollit anim id est laborum.
+=-=-=
diff --git a/test/lisp/textmodes/fill-resources/semlf-indented-block.erts b/test/lisp/textmodes/fill-resources/semlf-indented-block.erts
new file mode 100644
index 000000000000..e483567c6ab3
--- /dev/null
+++ b/test/lisp/textmodes/fill-resources/semlf-indented-block.erts
@@ -0,0 +1,31 @@
+Point-Char: |
+
+Name: indented block
+
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+	|Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed
+	do eiusmod tempor.  Incididunt ut labore et dolore magna
+	aliqua. Ut enim ad minim veniam, quis nostrud exercitation
+	ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+	Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed
+	do eiusmod tempor.
+	Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+	veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
diff --git a/test/lisp/textmodes/fill-resources/semlf-justify.erts b/test/lisp/textmodes/fill-resources/semlf-justify.erts
new file mode 100644
index 000000000000..3a951b7ce424
--- /dev/null
+++ b/test/lisp/textmodes/fill-resources/semlf-justify.erts
@@ -0,0 +1,12 @@
+Name: justify
+
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+Lorem  ipsum  dolor sit  amet,  consectetur  adipiscing elit,  sed  do
+eiusmod tempor.
+Incididunt ut labore et dolore magna  aliqua. Ut enim ad minim veniam,
+quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
diff --git a/test/lisp/textmodes/fill-resources/semlf-markdown-mode.erts b/test/lisp/textmodes/fill-resources/semlf-markdown-mode.erts
new file mode 100644
index 000000000000..7257708c245d
--- /dev/null
+++ b/test/lisp/textmodes/fill-resources/semlf-markdown-mode.erts
@@ -0,0 +1,129 @@
+Point-Char: |
+
+Name: markdown-mode
+
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.
+Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
+quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
+
+Name: markdown-mode - list - one single-line item
+
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+  eiusmod tempor.
+  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+  veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
+
+Name: markdown-mode - list - multiple single-line items
+
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+- Aliquip ex ea commodo consequat.  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
+- Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+  eiusmod tempor.
+  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+  veniam, quis nostrud exercitation ullamco laboris nisi ut.
+- Aliquip ex ea commodo consequat.  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
+- Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+=-=-=
+
+Name: markdown-mode - list - one multi-line item
+
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+  eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut
+  enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi
+  ut.
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+  eiusmod tempor.
+  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+  veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
+
+Name: markdown-mode - list - multiple multi-line items
+
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+  eiusmod tempor.  Incididunt ut labore et dolore magn a aliqua. Ut
+  enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi
+  ut.
+- Aliquip ex ea commodo consequat.  Duis aute irure dolor in
+  reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
+  pariatur.
+- Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+  officia deserunt mollit anim id est laborum.
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+  eiusmod tempor.
+  Incididunt ut labore et dolore magn a aliqua. Ut enim ad minim
+  veniam, quis nostrud exercitation ullamco laboris nisi ut.
+- Aliquip ex ea commodo consequat.  Duis aute irure dolor in
+  reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
+  pariatur.
+- Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+  officia deserunt mollit anim id est laborum.
+=-=-=
+
+Name: markdown-mode - list - short sentence in multi-line item
+
+=-=
+- Lorem ipsum dolor.  Sit amet, consectetur adipiscing elit, sed do
+  eiusmod tempor.  Incididunt ut labore et dolore magn a aliqua. Ut
+  enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi
+  ut.
+=-=
+- Lorem ipsum dolor.
+  Sit amet, consectetur adipiscing elit, sed do eiusmod tempor.
+  Incididunt ut labore et dolore magn a aliqua. Ut enim ad minim
+  veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
+
+Name: markdown-mode - indented block
+Skip: t
+
+TODO - In `markdown-mode', the `fill-forward-paragraph' function
+ignores code blocks.  We should reach out to the `markdown-mode'
+maintainer(s) to understand the reason for this and possibly suggest a
+change to this behavior.  This works as expected in
+`markdown-ts-mode'.
+
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+	|Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed
+	do eiusmod tempor.  Incididunt ut labore et dolore magna
+	aliqua. Ut enim ad minim veniam, quis nostrud exercitation
+	ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+	Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed
+	do eiusmod tempor.
+	Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+	veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
diff --git a/test/lisp/textmodes/fill-resources/semlf-org-mode.erts b/test/lisp/textmodes/fill-resources/semlf-org-mode.erts
new file mode 100644
index 000000000000..81dd4841de94
--- /dev/null
+++ b/test/lisp/textmodes/fill-resources/semlf-org-mode.erts
@@ -0,0 +1,122 @@
+Point-Char: |
+
+Name: org-mode
+
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.
+Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
+quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
+
+Name: org-mode - list - one single-line item
+
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+  eiusmod tempor.
+  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+  veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
+
+Name: org-mode - list - multiple single-line items
+
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+- Aliquip ex ea commodo consequat.  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
+- Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+  eiusmod tempor.
+  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+  veniam, quis nostrud exercitation ullamco laboris nisi ut.
+- Aliquip ex ea commodo consequat.  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
+- Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+=-=-=
+
+Name: org-mode - list - one multi-line item
+
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+  eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut
+  enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi
+  ut.
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+  eiusmod tempor.
+  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+  veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
+
+Name: org-mode - list - multiple multi-line items
+
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+  eiusmod tempor.  Incididunt ut labore et dolore magn a aliqua. Ut
+  enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi
+  ut.
+- Aliquip ex ea commodo consequat.  Duis aute irure dolor in
+  reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
+  pariatur.
+- Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+  officia deserunt mollit anim id est laborum.
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+  eiusmod tempor.
+  Incididunt ut labore et dolore magn a aliqua. Ut enim ad minim
+  veniam, quis nostrud exercitation ullamco laboris nisi ut.
+- Aliquip ex ea commodo consequat.  Duis aute irure dolor in
+  reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
+  pariatur.
+- Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+  officia deserunt mollit anim id est laborum.
+=-=-=
+
+Name: org-mode - list - short sentence in multi-line item
+
+=-=
+- Lorem ipsum dolor.  Sit amet, consectetur adipiscing elit, sed do
+  eiusmod tempor.  Incididunt ut labore et dolore magn a aliqua. Ut
+  enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi
+  ut.
+=-=
+- Lorem ipsum dolor.
+  Sit amet, consectetur adipiscing elit, sed do eiusmod tempor.
+  Incididunt ut labore et dolore magn a aliqua. Ut enim ad minim
+  veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
+
+Name: org-mode - indented block
+
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+	|Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed
+	do eiusmod tempor.  Incididunt ut labore et dolore magna
+	aliqua. Ut enim ad minim veniam, quis nostrud exercitation
+	ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+	Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed
+	do eiusmod tempor.
+	Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+	veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
diff --git a/test/lisp/textmodes/fill-resources/semlf-punctuation-marks.erts b/test/lisp/textmodes/fill-resources/semlf-punctuation-marks.erts
new file mode 100644
index 000000000000..5346216e9f9c
--- /dev/null
+++ b/test/lisp/textmodes/fill-resources/semlf-punctuation-marks.erts
@@ -0,0 +1,13 @@
+Name: punctuation marks
+
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua!  Ut enim
+ad minim veniam?  Quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.
+Incididunt ut labore et dolore magna aliqua!
+Ut enim ad minim veniam?
+Quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
diff --git a/test/lisp/textmodes/fill-resources/semlf-sentence-end-double-space.erts b/test/lisp/textmodes/fill-resources/semlf-sentence-end-double-space.erts
new file mode 100644
index 000000000000..a01beed0f665
--- /dev/null
+++ b/test/lisp/textmodes/fill-resources/semlf-sentence-end-double-space.erts
@@ -0,0 +1,13 @@
+Name: sentence-end-double-space
+
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.
+Incididunt ut labore et dolore magna aliqua.
+Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris
+nisi ut.
+=-=-=
diff --git a/test/lisp/textmodes/fill-resources/semlf-twice.erts b/test/lisp/textmodes/fill-resources/semlf-twice.erts
new file mode 100644
index 000000000000..862dda6e27eb
--- /dev/null
+++ b/test/lisp/textmodes/fill-resources/semlf-twice.erts
@@ -0,0 +1,12 @@
+Name: fill twice
+
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.
+Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
+quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
diff --git a/test/lisp/textmodes/fill-resources/semlf.erts b/test/lisp/textmodes/fill-resources/semlf.erts
new file mode 100644
index 000000000000..f3e331cd9381
--- /dev/null
+++ b/test/lisp/textmodes/fill-resources/semlf.erts
@@ -0,0 +1,88 @@
+Point-Char: |
+
+Name: beginning of buffer
+
+=-=
+|Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.
+Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
+quis nostrud exercitation ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
+
+Name: second paragraph
+
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+|Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.
+Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
+quis nostrud exercitation ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
+
+Name: end of buffer
+
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.|
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.
+Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
+quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
diff --git a/test/lisp/textmodes/fill-tests.el b/test/lisp/textmodes/fill-tests.el
index 6e079973100e..afd17c52dcd5 100644
--- a/test/lisp/textmodes/fill-tests.el
+++ b/test/lisp/textmodes/fill-tests.el
@@ -28,6 +28,7 @@
 ;;; Code:
 
 (require 'ert)
+(require 'ert-x)
 
 (ert-deftest fill-test-no-fill-polish-nobreak-p nil
   "Tests of the `fill-polish-nobreak-p' function."
@@ -121,6 +122,95 @@ test-fill-haskell
   ;; w
 ")))
 
+(ert-deftest fill-test-fill-paragraph-semlf ()
+  "Test the `fill-paragraph-semlf' function."
+  (ert-test-erts-file (ert-resource-file "semlf.erts")
+                      (lambda ()
+			(fill-paragraph-semlf))))
+
+(ert-deftest fill-test-fill-paragraph-semlf-fill-paragraph-function ()
+  "Test `fill-paragraph-semlf' as `fill-paragraph-function'."
+  (ert-test-erts-file (ert-resource-file "semlf-fill-paragraph-function.erts")
+                      (lambda ()
+			(setq-local fill-paragraph-function #'fill-paragraph-semlf)
+			(fill-paragraph))))
+
+(ert-deftest fill-test-fill-paragraph-semlf-justify ()
+  "Test the JUSTIFY parameter of the `fill-paragraph-semlf' function."
+  (ert-test-erts-file (ert-resource-file "semlf-justify.erts")
+                      (lambda ()
+			(fill-paragraph-semlf 'justify))))
+
+(ert-deftest fill-test-fill-paragraph-semlf-sentence-end-double-space ()
+  "Test the `fill-paragraph-semlf' function with `sentence-end-double-space'."
+  (ert-test-erts-file (ert-resource-file "semlf-sentence-end-double-space.erts")
+                      (lambda ()
+			(setq-local sentence-end-double-space nil)
+			(fill-paragraph-semlf))))
+
+(ert-deftest fill-test-fill-paragraph-semlf-fill-column ()
+  "Test the `fill-paragraph-semlf' function with `fill-column'."
+  (ert-test-erts-file (ert-resource-file "semlf-fill-column.erts")
+                      (lambda ()
+			(setq-local fill-column 35)
+			(fill-paragraph-semlf))))
+
+(ert-deftest fill-test-fill-paragraph-semlf-punctuation-marks ()
+  "Test the `fill-paragraph-semlf' function with different punctuation marks."
+  (ert-test-erts-file (ert-resource-file "semlf-punctuation-marks.erts")
+                      (lambda ()
+			(fill-paragraph-semlf))))
+
+(ert-deftest fill-test-fill-paragraph-semlf-twice ()
+  "Test to run the `fill-paragraph-semlf' function twice."
+  (ert-test-erts-file (ert-resource-file "semlf-twice.erts")
+                      (lambda ()
+			(goto-char (point-min))
+			(fill-paragraph-semlf)
+			(goto-char (point-min))
+			(fill-paragraph-semlf))))
+
+(ert-deftest fill-test-fill-paragraph-semlf-fill-prefix ()
+  "Test the `fill-paragraph-semlf' function with different fill prefixes."
+  (ert-test-erts-file (ert-resource-file "semlf-fill-prefix.erts")
+                      (lambda ()
+			(fill-paragraph-semlf))))
+
+(ert-deftest fill-test-fill-paragraph-semlf-indented-block ()
+  "Test the `fill-paragraph-semlf' function with an indented block."
+  (ert-test-erts-file (ert-resource-file "semlf-indented-block.erts")
+                      (lambda ()
+			(fill-paragraph-semlf))))
+
+(ert-deftest fill-test-fill-paragraph-semlf-emacs-lisp-mode ()
+  "Test the `fill-paragraph-semlf' function with `emacs-lisp-mode'."
+  (ert-test-erts-file (ert-resource-file "semlf-emacs-lisp-mode.erts")
+                      (lambda ()
+			(emacs-lisp-mode)
+			(fill-paragraph-semlf))))
+
+(ert-deftest fill-test-fill-paragraph-semlf-c-mode ()
+  "Test the `fill-paragraph-semlf' function with `c-mode'."
+  (ert-test-erts-file (ert-resource-file "semlf-c-mode.erts")
+                      (lambda ()
+			(c-mode)
+			(fill-paragraph-semlf))))
+
+(ert-deftest fill-test-fill-paragraph-semlf-org-mode ()
+  "Test the `fill-paragraph-semlf' function with `org-mode'."
+  (ert-test-erts-file (ert-resource-file "semlf-org-mode.erts")
+                      (lambda ()
+			(org-mode)
+			(fill-paragraph-semlf))))
+
+(ert-deftest fill-test-fill-paragraph-semlf-markdown-mode ()
+  "Test the `fill-paragraph-semlf' function with `markdown-mode'."
+  (skip-unless (functionp 'markdown-mode))
+  (ert-test-erts-file (ert-resource-file "semlf-markdown-mode.erts")
+                      (lambda ()
+			(markdown-mode)
+			(fill-paragraph-semlf))))
+
 (provide 'fill-tests)
 
 ;;; fill-tests.el ends here
-- 
2.49.0


--=-=-=--




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#78561; Package emacs. Full text available.

Message received at 78561 <at> debbugs.gnu.org:


Received: (at 78561) by debbugs.gnu.org; 24 May 2025 13:38:59 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Sat May 24 09:38:59 2025
Received: from localhost ([127.0.0.1]:59178 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1uIp5W-0007dG-3D
	for submit <at> debbugs.gnu.org; Sat, 24 May 2025 09:38:59 -0400
Received: from mail-wm1-x32c.google.com ([2a00:1450:4864:20::32c]:54291)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.84_2) (envelope-from <jroi.martin@HIDDEN>)
 id 1uIp5S-0007ca-4B
 for 78561 <at> debbugs.gnu.org; Sat, 24 May 2025 09:38:55 -0400
Received: by mail-wm1-x32c.google.com with SMTP id
 5b1f17b1804b1-43edecbfb46so6159225e9.0
 for <78561 <at> debbugs.gnu.org>; Sat, 24 May 2025 06:38:54 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1748093928; x=1748698728; darn=debbugs.gnu.org;
 h=mime-version:message-id:date:references:in-reply-to:subject:cc:to
 :from:from:to:cc:subject:date:message-id:reply-to;
 bh=Jei9RgntfFW1KMM19Dv1vnPgqSCMfTqeAQJ8Lla+amo=;
 b=cNiG8ED4/CsTaL8Jhv3JaqdndCeSslOWIKnlIFNYevf1mLymu41biUBCLBIs5wIpma
 pDtq2uMhRrYNM/K92Zdp8lIG0QhTzw8N9f12uMPaJN2uonWAm0cbSusUNwGgQWEN28hG
 0JoaSPzrzdEVE2VkheSL6Myb68UYuM5vd2ybHYsGSIbqADd1kdfEel+rOCZTUJ0NPj3U
 kbcsOGfeuGiRdQK34Vgzl8C3fVNvO5CKOzB5+24wnpdZkwP5CTKCxQLEAo7mWzAPijI7
 XLFBFS3MIJBF/jepfaE/Fknu1kv/6A6ZLzJzZ/5O40KGCJuxKLvFft7AbS0NfH88qleE
 I52Q==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1748093928; x=1748698728;
 h=mime-version:message-id:date:references:in-reply-to:subject:cc:to
 :from:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to;
 bh=Jei9RgntfFW1KMM19Dv1vnPgqSCMfTqeAQJ8Lla+amo=;
 b=Ihqa/uUvUzYfyyQrrhNHuGwNCdbjJn0YTGJ7VD0OWp9GN4lGThluShdv1sYxKAdgU4
 KbgADJz0vy4AOttg4zGM9vCXGZgDHRcCXQnjmVWkjB6QADNq8bQNKbhT1uZUWqv27OaU
 6Wj53h2i4n68jGgk/FJ+SaRTm4la113J/lQ9xFdocLJ60gRk2XmdXIFOfti9mxaTX/pU
 j/dgKgcnZjWoBa0JjVw4E5w7m/yPZo7zT8OlXM8o61GZtya2cwTdNF8cmxIu9b6hohnj
 BkeMsIaG9pvxCxcYvxC96Wkz0DJ/IXm0s9Bga21t9How3XH9mGDlt1kT6yoiqlQoqPBE
 D6lg==
X-Gm-Message-State: AOJu0Yxli3rxmMCqcYuGIuKGDc8+36b6zwu4jOMsmRkb3HbLpLnogQMH
 WRpOKbTXRA1/PP7yqul0WRdmCHyQR7rACY9B6Lk9hbCC0LI5ixPMzOpu
X-Gm-Gg: ASbGncuKwSOJREqtiLicfv2BtwYEeitcCn69n5oqIkEzCOUyzo6DSxFt1hYO+mpBrfU
 t5Su34+j8OKsaDeky6sbgXA30Sgid+QjDh8P2IojlsUQ4Zv9GpeuxiUmXYFqyBo/gV/CXCsHwnR
 IEBi2zab+Ms1XcMVGcH6lE5NzXbvH7fA1UxBznYbvbpeZMmJLihAjkWigZaktw2aHBJdxTAIQx6
 SLAVGPuxq+OcHMKmSHi7elqc/9giWvRUwIhd1eaYrNGW6MLrnGvmACZ2xKgVHfEKJHRHwC/1GQc
 JHlzySnSUx14ETPjeL/NJqBz0woQpPP7HewC5u7Y0j3rxqjVgQ==
X-Google-Smtp-Source: AGHT+IFPw2TGeRcgaqgEhTwJreIorLvM087smP0viDcMK6WYSjCKtT4KC8xNAC8kAlvkR95JBwpdng==
X-Received: by 2002:a05:600c:620a:b0:43d:b3:f95 with SMTP id
 5b1f17b1804b1-44c94c28b8fmr20716505e9.28.1748093927467; 
 Sat, 24 May 2025 06:38:47 -0700 (PDT)
Received: from localhost ([84.79.192.255]) by smtp.gmail.com with ESMTPSA id
 5b1f17b1804b1-447f18251c7sm177882785e9.3.2025.05.24.06.38.46
 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);
 Sat, 24 May 2025 06:38:47 -0700 (PDT)
From: Roi Martin <jroi.martin@HIDDEN>
To: Eli Zaretskii <eliz@HIDDEN>
Subject: Re: bug#78561: [PATCH] Add semantic linefeed support for paragraph
 filling
In-Reply-To: <864ixa17s8.fsf@HIDDEN>
References: <87jz67tzrp.fsf@HIDDEN> <86ldqn4m54.fsf@HIDDEN>
 <87msb2432u.fsf@HIDDEN> <864ixa17s8.fsf@HIDDEN>
Date: Sat, 24 May 2025 15:38:40 +0200
Message-ID: <87jz663z8f.fsf@HIDDEN>
MIME-Version: 1.0
Content-Type: text/plain
X-Spam-Score: 0.0 (/)
X-Debbugs-Envelope-To: 78561
Cc: mbork@HIDDEN, monnier@HIDDEN, 78561 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.0 (-)

Eli Zaretskii <eliz@HIDDEN> writes:

>> From: Roi Martin <jroi.martin@HIDDEN>
>> Cc: 78561 <at> debbugs.gnu.org, mbork@HIDDEN, monnier@HIDDEN
>> Date: Sat, 24 May 2025 14:15:37 +0200
>> 
>> Eli Zaretskii <eliz@HIDDEN> writes:
>> 
>> > This explanation of what is "semantic linefeeds" is a good starting
>> > point, but it is not enough.  For starters, "ensures" hints but
>> > doesn't say explicitly that if there's no newline there, it is
>> > inserted.  Also, I think a URL to at least one site explaining what
>> > "semantic linefeeds" are should be in the doc string.
>> 
>> I would prefer to avoid depending on external URLs to explain the
>> concept.
>
> Since the concept came from outside, why not?
>
>> I'd link to an external reference if, for instance, this
>> feature was backed by an standard located in a well-known site
>> (e.g. IETF RFCs).  In this case, the concept is quite simple and I agree
>> with Stefan in that we can provide our own interpretation in the manual
>> and link to the Info node from the doc string.
>
> There's no contradiction: we could describe this in our documentation
> and also mention the external references.  We do that, for example,
> for Unicode-related features.

OK.  I'll update the patch accordingly.

>> >> +	  (when (and (> (point) (line-beginning-position))
>> >> +		     (< (point) (line-end-position)))
>> >> +	    (delete-horizontal-space)
>> >> +	    (newline)
>> >
>> > Are you sure 'newline' is the right function to call here?  It doesn't
>> > just insert the newline character, at least not in all the cases.
>> > Perhaps inserting a literal newline character is better?
>> 
>> The reason behind using 'newline' is to support documents that follow
>> other conventions to represent newlines (e.g. '\r\n' or '\r').  Does it
>> make sense?  Is this the right approach?
>
> In Emacs, there's only one "newline convention", the one that uses the
> newline (LFD) character.  The different en d-of-line conventions are
> supported during I/O: we "encode" newlines as CR-LF pair for Windows,
> for example, when saving buffers to files, and "decode" CR-LF back
> into a single newline when reading files into buffers.

Got it.  Thanks a lot for the explanation.  That simplifies things a
lot.

> By contrast, the 'newline' function does other things, in addition to
> inserting the newline character; see its documentation for the
> details.  It seems to me that some of those additional actions is not
> something this feature will want, because this feature is _only_ about
> where to break text into physical lines.

You are right.  I replaced it with

  (insert "\n")

Thanks!




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#78561; Package emacs. Full text available.

Message received at 78561 <at> debbugs.gnu.org:


Received: (at 78561) by debbugs.gnu.org; 24 May 2025 13:02:27 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Sat May 24 09:02:27 2025
Received: from localhost ([127.0.0.1]:58898 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1uIoWB-0004oe-Ah
	for submit <at> debbugs.gnu.org; Sat, 24 May 2025 09:02:27 -0400
Received: from eggs.gnu.org ([2001:470:142:3::10]:52060)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.84_2) (envelope-from <eliz@HIDDEN>) id 1uIoW8-0004o8-Mf
 for 78561 <at> debbugs.gnu.org; Sat, 24 May 2025 09:02:25 -0400
Received: from fencepost.gnu.org ([2001:470:142:3::e])
 by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.90_1) (envelope-from <eliz@HIDDEN>)
 id 1uIoW1-00056p-Tp; Sat, 24 May 2025 09:02:17 -0400
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org;
 s=fencepost-gnu-org; h=References:Subject:In-Reply-To:To:From:Date:
 mime-version; bh=h+yNJTGgcmjl+0l15x2AirHrSAlrlRZAIope8fXB/MQ=; b=K39UFKWebYJ/
 ZH1FvXSw/59mesZXx2iCnXBGaLYDYNk5KPvvkj+8C4Mk+Mg7VmvRckArZDd+RX2g+8kU11ovlwtGN
 8f/O/vOpPO93DW0IUHLGE5a6eIG0+ZMZke+UuSN1JE8CqR5BIjOnm1sspvLhFdhBuuA95tNqK+NzZ
 qIBQdYZycRcIfpR7uCJO3x1VidvvesSZX8hV/OU4NNAsVXcmc8GQCMuCDWXoJA90GVE3vg4rHZFyO
 PNG3gDgKLvZZydO/sHjrqe82bg1w7YKRL5OPHDOaVLJFz5GRuwNLgRiGNibp8xRJoBHWOc5YtGur7
 zCySXd9lJPowPr7U7PsS8Q==;
Date: Sat, 24 May 2025 16:02:15 +0300
Message-Id: <864ixa17s8.fsf@HIDDEN>
From: Eli Zaretskii <eliz@HIDDEN>
To: Roi Martin <jroi.martin@HIDDEN>
In-Reply-To: <87msb2432u.fsf@HIDDEN> (message from Roi Martin on Sat, 24
 May 2025 14:15:37 +0200)
Subject: Re: bug#78561: [PATCH] Add semantic linefeed support for paragraph
 filling
References: <87jz67tzrp.fsf@HIDDEN> <86ldqn4m54.fsf@HIDDEN>
 <87msb2432u.fsf@HIDDEN>
X-Spam-Score: -2.3 (--)
X-Debbugs-Envelope-To: 78561
Cc: mbork@HIDDEN, monnier@HIDDEN, 78561 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -3.3 (---)

> From: Roi Martin <jroi.martin@HIDDEN>
> Cc: 78561 <at> debbugs.gnu.org, mbork@HIDDEN, monnier@HIDDEN
> Date: Sat, 24 May 2025 14:15:37 +0200
> 
> Eli Zaretskii <eliz@HIDDEN> writes:
> 
> > This explanation of what is "semantic linefeeds" is a good starting
> > point, but it is not enough.  For starters, "ensures" hints but
> > doesn't say explicitly that if there's no newline there, it is
> > inserted.  Also, I think a URL to at least one site explaining what
> > "semantic linefeeds" are should be in the doc string.
> 
> I would prefer to avoid depending on external URLs to explain the
> concept.

Since the concept came from outside, why not?

> I'd link to an external reference if, for instance, this
> feature was backed by an standard located in a well-known site
> (e.g. IETF RFCs).  In this case, the concept is quite simple and I agree
> with Stefan in that we can provide our own interpretation in the manual
> and link to the Info node from the doc string.

There's no contradiction: we could describe this in our documentation
and also mention the external references.  We do that, for example,
for Unicode-related features.

> >> +	  (when (and (> (point) (line-beginning-position))
> >> +		     (< (point) (line-end-position)))
> >> +	    (delete-horizontal-space)
> >> +	    (newline)
> >
> > Are you sure 'newline' is the right function to call here?  It doesn't
> > just insert the newline character, at least not in all the cases.
> > Perhaps inserting a literal newline character is better?
> 
> The reason behind using 'newline' is to support documents that follow
> other conventions to represent newlines (e.g. '\r\n' or '\r').  Does it
> make sense?  Is this the right approach?

In Emacs, there's only one "newline convention", the one that uses the
newline (LFD) character.  The different en d-of-line conventions are
supported during I/O: we "encode" newlines as CR-LF pair for Windows,
for example, when saving buffers to files, and "decode" CR-LF back
into a single newline when reading files into buffers.

By contrast, the 'newline' function does other things, in addition to
inserting the newline character; see its documentation for the
details.  It seems to me that some of those additional actions is not
something this feature will want, because this feature is _only_ about
where to break text into physical lines.




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#78561; Package emacs. Full text available.

Message received at 78561 <at> debbugs.gnu.org:


Received: (at 78561) by debbugs.gnu.org; 24 May 2025 12:15:53 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Sat May 24 08:15:53 2025
Received: from localhost ([127.0.0.1]:58567 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1uInn6-0001Cg-A9
	for submit <at> debbugs.gnu.org; Sat, 24 May 2025 08:15:52 -0400
Received: from mail-wm1-x32d.google.com ([2a00:1450:4864:20::32d]:51505)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.84_2) (envelope-from <jroi.martin@HIDDEN>)
 id 1uInn3-0001CB-OR
 for 78561 <at> debbugs.gnu.org; Sat, 24 May 2025 08:15:50 -0400
Received: by mail-wm1-x32d.google.com with SMTP id
 5b1f17b1804b1-442e9c00bf4so4017545e9.3
 for <78561 <at> debbugs.gnu.org>; Sat, 24 May 2025 05:15:49 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1748088943; x=1748693743; darn=debbugs.gnu.org;
 h=mime-version:message-id:date:references:in-reply-to:subject:cc:to
 :from:from:to:cc:subject:date:message-id:reply-to;
 bh=4wL6depUM5YYutY6Z1jvAXcvu6dI5wWkUuZIzQptSkE=;
 b=F4UA47TMapVc+18XqPGWUuNt5W2BLZLYGB9Stbq4910wNbz8m9necO9V2rkL/UZQET
 +zdE2B2fweX/UzR8yHjJ9+tp+gVilA/V5RSU1FzLYegfseeAH/gy7lvNBnurE//Zj+ju
 MRCeYhqAidxZQziDlOS/l1dWNGDjocFmw0mqwoazeqi6aeJ+Xg5E5Zm82W+xjo/5Bzd+
 Yy2FBnHzNCM1odCb9PcLSqXF/QbBR2gJuPtN+RAkg72aMOmynDPnKN1WtvG/qB3SRQOZ
 0QHe0GBEahmrua00yjUjbz8yTK9c70IcoJD08r6uhvsnS/O8ZSKFLmW10TsfGQyvBLFm
 oc0g==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1748088943; x=1748693743;
 h=mime-version:message-id:date:references:in-reply-to:subject:cc:to
 :from:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to;
 bh=4wL6depUM5YYutY6Z1jvAXcvu6dI5wWkUuZIzQptSkE=;
 b=qCXyISCKZH5BnxkwkDchjDPHIcSguSHZt3701MMhm5NIp/hWF34K+5+S0rDzPdNALw
 qUsovewkN24TPyGVTBCMR88Adm8fyhZiWfsGPyTCtmcCvZufNNY7W7BSIgm8wFqUBy4Q
 SJSr9kldo06C6uFi+E6lxK2u83NToNA1ScxEXCtA3bs+VsJgRneSvQBvEUAFySrnwq0S
 5MqyvegqVhH7mna8PE8Uu0LRs1dU0Mvnef+XMGtZ4X8uTuM7u2BaGqbCtRNA2bPkIOLs
 e1EpbAYy3NAbKejFOUEC5CF1+MFyTr9U1zzMlTMW/pXsmJs8uIF0Sm7+rPyHUmbPdfp1
 tN8w==
X-Gm-Message-State: AOJu0YwS493p9tOmotX1IkE8KEwrMp/kdvfCvCVuMQgkcqkcrzcfCODN
 nDW7/nmBOVDR4IJjcnYvn0pUP1lxIEVDgWctVLFEANcDk+X69lTrkWmt
X-Gm-Gg: ASbGnct9de6E8u1MbcPmThnEEnAhbON4MVnyvWR7oEK5CAXCh1VZ/rV9IyqFZyvTi/A
 Twj/POYUtwwfaXFkCfVG1+WJ1cNbJjT3whTnnnHRiNAbgYXsjEDp65AxC2J/OwGxVgFYv+Iw5tt
 R+YQQffuTXtThKqWAGbyiuEUv51jpUN4pOwvqqZnncSr5BxX6wXUMZ/Kr/y88vNamogoTa8JcXQ
 CXxzV5KRE+aSDvfXhp3xnt24tS8pBnESfdfIBK4MdnwnyYmWMVNyzri5kfG8CcQyv7oo1eT00NS
 Kg03Zy2L4ur4VBAtDohhmN3OehadJEBB/nUNBuPFQ4nRC7T3p0A1h4w7gcyu
X-Google-Smtp-Source: AGHT+IFnNDqjMAI64si92n72fBMOwPHud4O4gwPcqBWLaXb7vpNHVt7JU9ZZ2V2B29vrG/cAQEt8VA==
X-Received: by 2002:a05:600c:138f:b0:43d:fa5d:9315 with SMTP id
 5b1f17b1804b1-44c94c2d54emr20925575e9.33.1748088943066; 
 Sat, 24 May 2025 05:15:43 -0700 (PDT)
Received: from localhost ([84.79.192.255]) by smtp.gmail.com with ESMTPSA id
 5b1f17b1804b1-447f3dd99absm172802105e9.37.2025.05.24.05.15.42
 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);
 Sat, 24 May 2025 05:15:42 -0700 (PDT)
From: Roi Martin <jroi.martin@HIDDEN>
To: Eli Zaretskii <eliz@HIDDEN>
Subject: Re: bug#78561: [PATCH] Add semantic linefeed support for paragraph
 filling
In-Reply-To: <86ldqn4m54.fsf@HIDDEN>
References: <87jz67tzrp.fsf@HIDDEN> <86ldqn4m54.fsf@HIDDEN>
Date: Sat, 24 May 2025 14:15:37 +0200
Message-ID: <87msb2432u.fsf@HIDDEN>
MIME-Version: 1.0
Content-Type: text/plain
X-Spam-Score: 0.0 (/)
X-Debbugs-Envelope-To: 78561
Cc: mbork@HIDDEN, monnier@HIDDEN, 78561 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.0 (-)

Eli Zaretskii <eliz@HIDDEN> writes:

>> +(defun fill-paragraph-semlf (&optional justify)
>> +  "Fill paragraph at or after point using semantic linefeeds.
>> +
>> +This function ensures that a newline character follows every
>> +sentence, as punctuated by a period (.), exclamation mark (!), or
>> +question mark (?).
>
> This explanation of what is "semantic linefeeds" is a good starting
> point, but it is not enough.  For starters, "ensures" hints but
> doesn't say explicitly that if there's no newline there, it is
> inserted.  Also, I think a URL to at least one site explaining what
> "semantic linefeeds" are should be in the doc string.

I would prefer to avoid depending on external URLs to explain the
concept.  I'd link to an external reference if, for instance, this
feature was backed by an standard located in a well-known site
(e.g. IETF RFCs).  In this case, the concept is quite simple and I agree
with Stefan in that we can provide our own interpretation in the manual
and link to the Info node from the doc string.  If you prefer to avoid
changing the manual until this is well tested, then we can provide a
more detailed explanation in the doc string itself.  What do you think?

>> +	  (when (and (> (point) (line-beginning-position))
>> +		     (< (point) (line-end-position)))
>> +	    (delete-horizontal-space)
>> +	    (newline)
>
> Are you sure 'newline' is the right function to call here?  It doesn't
> just insert the newline character, at least not in all the cases.
> Perhaps inserting a literal newline character is better?

The reason behind using 'newline' is to support documents that follow
other conventions to represent newlines (e.g. '\r\n' or '\r').  Does it
make sense?  Is this the right approach?




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#78561; Package emacs. Full text available.

Message received at 78561 <at> debbugs.gnu.org:


Received: (at 78561) by debbugs.gnu.org; 23 May 2025 15:05:03 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Fri May 23 11:05:03 2025
Received: from localhost ([127.0.0.1]:49126 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1uITxH-0003M8-0L
	for submit <at> debbugs.gnu.org; Fri, 23 May 2025 11:05:03 -0400
Received: from mailscanner.iro.umontreal.ca ([132.204.25.50]:5707)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.84_2) (envelope-from <monnier@HIDDEN>)
 id 1uITxA-0003LE-1X
 for 78561 <at> debbugs.gnu.org; Fri, 23 May 2025 11:04:56 -0400
Received: from pmg2.iro.umontreal.ca (localhost.localdomain [127.0.0.1])
 by pmg2.iro.umontreal.ca (Proxmox) with ESMTP id 4BD17808F6;
 Fri, 23 May 2025 11:04:50 -0400 (EDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=iro.umontreal.ca;
 s=mail; t=1748012689;
 bh=4fYUJbc6WRM9wdXyLiLuQkpg+tKpC6CbwznpF8cVR7Y=;
 h=From:To:Cc:Subject:In-Reply-To:References:Date:From;
 b=I/v8ouY9xBB9OsJZ8iwkgGZrL7IPqZTFZm1m3vlk4/O/fQMaMcqe+vDbYcJtHKTh0
 IUk1an+jGcyWRHSLFEURj3MvamlWb2/CAXD41z4+JDJaIeH26VO+7eBVfKZbHY4c31
 P+V1kWqAFxUrfTQ7ku/4UYLbAGIdIbnF4yd3gqpTaYJ8Qxs9aymy+ffWEXswI3S7iM
 EjTkCS/NURa/p8J+m/5Hz6Ii4CRnQeEQajtutpoGWenfAEnAKk7LsGZq+437sOlQo6
 P8zTSb+Mu4IDbUb0KkQgW1P57Zy2a8oMPgqmRKBdmkihnwbkDSJZ5y+3muSy+NwkN2
 D6YxcEr7t8IKg==
Received: from mail01.iro.umontreal.ca (unknown [172.31.2.1])
 by pmg2.iro.umontreal.ca (Proxmox) with ESMTP id 527918053B;
 Fri, 23 May 2025 11:04:49 -0400 (EDT)
Received: from lechazo (lechon.iro.umontreal.ca [132.204.27.242])
 by mail01.iro.umontreal.ca (Postfix) with ESMTPSA id 399C512041A;
 Fri, 23 May 2025 11:04:49 -0400 (EDT)
From: Stefan Monnier <monnier@HIDDEN>
To: Roi Martin <jroi.martin@HIDDEN>
Subject: Re: bug#78561: [PATCH] Add semantic linefeed support for paragraph
 filling
In-Reply-To: <87jz67tzrp.fsf@HIDDEN>
Message-ID: <jwvr00fqt10.fsf-monnier+emacs@HIDDEN>
References: <87jz67tzrp.fsf@HIDDEN>
Date: Fri, 23 May 2025 11:04:48 -0400
User-Agent: Gnus/5.13 (Gnus v5.13)
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable
X-SPAM-INFO: Spam detection results:  0
 ALL_TRUSTED                -1 Passed through trusted hosts only via SMTP
 AWL 0.169 Adjusted score from AWL reputation of From: address
 BAYES_00                 -1.9 Bayes spam probability is 0 to 1%
 DKIM_SIGNED               0.1 Message has a DKIM or DK signature,
 not necessarily valid
 DKIM_VALID -0.1 Message has at least one valid DKIM or DK signature
 DKIM_VALID_AU -0.1 Message has a valid DKIM or DK signature from author's
 domain
 DKIM_VALID_EF -0.1 Message has a valid DKIM or DK signature from envelope-from
 domain
X-SPAM-LEVEL: 
X-Spam-Score: -2.3 (--)
X-Debbugs-Envelope-To: 78561
Cc: Marcin Borkowski <mbork@HIDDEN>, 78561 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -3.3 (---)

> Given that this is a first version, I have not added any reference to
> the manuals.  If you think it makes sense, please let me know and I'll
> modify the patch accordingly.

Maybe a short version of the explanation you give below would be good to
have in the manual (tho Eli suggests a URL instead, so maybe that's
good enough?).

> +(defun fill-paragraph-semlf (&optional justify)
> +  "Fill paragraph at or after point using semantic linefeeds.
> +
> +This function ensures that a newline character follows every
> +sentence, as punctuated by a period (.), exclamation mark (!), or
> +question mark (?).

This seems inaccurate: it just uses whichever definition of sentence is
used by `forward-sentence`, so it may ignore some of those chars or pay
attention to others.

> +If JUSTIFY is non-nil (interactively, with prefix argument), justify as
> +well.  If `sentence-end-double-space' is non-nil, then period followed
> +by one space does not end a sentence, so don't break a line there.  The
> +variable `fill-column' controls the width for filling."

I'd move the "The" to the last line.  =F0=9F=99=82

> +  (interactive "P")
> +  (save-excursion
> +    (let ((end (progn
> +		 (fill-forward-paragraph 1)
> +		 (backward-word)
> +		 (end-of-line)
> +		 (point)))
> +	  (start (progn
> +		   (fill-forward-paragraph -1)
> +		   (forward-word)
> +		   (beginning-of-line)
> +		   (point)))
> +	  pfx)
> +      (with-restriction start end
> +	(let ((fill-column (point-max)))
> +	  (setq pfx (or (fill-region-as-paragraph (point-min) (point-max)) "")))
> +	(goto-char (point-min))
> +	(while (not (eobp))
> +	  (let ((fill-prefix pfx))
> +	    (fill-region-as-paragraph (point)
> +				      (progn (forward-sentence) (point))
> +				      justify))
> +	  (when (and (> (point) (line-beginning-position))
> +		     (< (point) (line-end-position)))
> +	    (delete-horizontal-space)
> +	    (newline)
> +	    (insert pfx))))))
> +  t)

Please try and separate it into a `fill-region-semlf` function and then
another one which applies it to a paragraph, so that it can also be used
to fill a specific user-specified region (or the whole buffer).


        Stefan





Information forwarded to bug-gnu-emacs@HIDDEN:
bug#78561; Package emacs. Full text available.

Message received at 78561 <at> debbugs.gnu.org:


Received: (at 78561) by debbugs.gnu.org; 23 May 2025 11:11:54 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Fri May 23 07:11:54 2025
Received: from localhost ([127.0.0.1]:46015 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1uIQJa-0005Vo-6t
	for submit <at> debbugs.gnu.org; Fri, 23 May 2025 07:11:54 -0400
Received: from eggs.gnu.org ([2001:470:142:3::10]:37606)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.84_2) (envelope-from <eliz@HIDDEN>) id 1uIQJV-0005VV-Nm
 for 78561 <at> debbugs.gnu.org; Fri, 23 May 2025 07:11:47 -0400
Received: from fencepost.gnu.org ([2001:470:142:3::e])
 by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.90_1) (envelope-from <eliz@HIDDEN>)
 id 1uIQJP-0000aJ-1w; Fri, 23 May 2025 07:11:39 -0400
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org;
 s=fencepost-gnu-org; h=References:Subject:In-Reply-To:To:From:Date:
 mime-version; bh=FoL1TLkdB2QqpAUn7sGXGxqGWRuC2RTpuREVMclz/co=; b=SOBOdWQwllxf
 b0DQYTfGrCC2sPqoy2qtRJuK6rm18EMrAxdzcJX7gHF8umy5YPB3zB5oyRvi5xYyKdb1AL6r9dkl0
 ZMTLwGCX7n8IyQb/B8h4i12L50iyiakO/AfLw5dJQ0oEZ2XamCcg0RFA80Z4ofisn3KGwJDxQMQ6c
 RrR37ZPXP+6hrZeq27/1/zoY6ZDke7O+baez2FH4vflstp9HW+lj1Ogjlynl78MwO9ZvuIvwhzf9D
 r70P60+It+iXVnRNIYgYkhLVSFfJ3aKuk1ik3ax2WGVUXUI4VHRdX6PE5OB6pI9PMVfRy0w+/g9ll
 LbWtP7Ma7zf3m3F22cRqYA==;
Date: Fri, 23 May 2025 14:11:35 +0300
Message-Id: <86ldqn4m54.fsf@HIDDEN>
From: Eli Zaretskii <eliz@HIDDEN>
To: Roi Martin <jroi.martin@HIDDEN>
In-Reply-To: <87jz67tzrp.fsf@HIDDEN> (message from Roi Martin on Fri, 23
 May 2025 11:58:02 +0200)
Subject: Re: bug#78561: [PATCH] Add semantic linefeed support for paragraph
 filling
References: <87jz67tzrp.fsf@HIDDEN>
X-Spam-Score: -1.6 (-)
X-Debbugs-Envelope-To: 78561
Cc: mbork@HIDDEN, 78561 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.3 (/)

> Cc: Marcin Borkowski <mbork@HIDDEN>
> From: Roi Martin <jroi.martin@HIDDEN>
> Date: Fri, 23 May 2025 11:58:02 +0200
> 
> This patch adds semantic linefeed support for paragraph filling.  The
> functionality has been discussed in the emacs-devel mailing list in the
> following threads:
> 
> - Fill paragraph using semantic linefeeds: https://lists.gnu.org/archive/html/emacs-devel/2025-03/msg00035.html
> - [GNU ELPA] New package: semlf: https://lists.gnu.org/archive/html/emacs-devel/2025-03/msg00702.html
> 
> In the second thread we agreed on sending a patch to core instead of
> adding a new package to GNU ELPA.
> 
> Given that this is a first version, I have not added any reference to
> the manuals.  If you think it makes sense, please let me know and I'll
> modify the patch accordingly.
> 
> What follows is a detailed explanation of the term semantic linefeeds,
> so we have all the information in one single place.
> 
> The term "semantic linefeeds" or "semantic line breaks" refers to a set
> of conventions for using insensitive vertical whitespace to structure
> prose along semantic boundaries.
> 
> The concept was first introduced by Brian Kernighan in "UNIX for
> Beginners" [1] in October 1974.
> 
>   Hints for Preparing Documents
>   
>   Most documents go through several versions (always more than you
>   expected) before they are finally finished.  Accordingly, you should
>   do whatever possible to make the job of changing them easy.
>   
>   First, when you do the purely mechanical operations of typing, type so
>   subsequent editing will be easy.  Start each sentence on a new line.
>   Make lines short, and break lines at natural places, such as after
>   commas and semicolons, rather than randomly.  Since most people change
>   documents by rewriting phrases and adding, deleting and rearranging
>   sentences, these precautions simplify any editing you have to do
>   later.
> 
> Semantic linefeeds are usually used with markup languages that are not
> sensitive to newlines when exported to a different format (e.g. Org,
> Texinfo, Markdown).
> 
> Let's say that we have the following paragraph in an Org document:
> 
>   Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod
>   tempor.  Incididunt ut labore et dolore magna aliqua.  Ut enim ad minim
>   veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea
>   commodo consequat.
> 
> After filling the paragraph using semantic linefeeds, the result is:
> 
>   Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod
>   tempor.
>   Incididunt ut labore et dolore magna aliqua.
>   Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi
>   ut aliquip ex ea commodo consequat.
> 
> However, when exported, in both cases the result is:
> 
>   Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod
>   tempor.  Incididunt ut labore et dolore magna aliqua.  Ut enim ad minim
>   veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea
>   commodo consequat.
> 
> So, what are the benefits?
> 
> One of the greatest benefits is that semantic linefeeds are "diff
> friendly".
> 
> For example,
> 
>   -Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod
>   -tempor.  Incididunt ut labore et dolore magna aliqua.  Ut enim ad minim
>   -veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea
>   -commodo consequat.
>   +Lorem ipsum dolor sit amet, XXXXX consectetur adipiscing elit, sed do
>   +eiusmod tempor.  Incididunt ut labore et dolore magna aliqua.  Ut enim
>   +ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
>   +aliquip ex ea commodo consequat.
> 
> Versus,
> 
>   -Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod
>   -tempor.
>   +Lorem ipsum dolor sit amet, XXXXX consectetur adipiscing elit, sed do
>   +eiusmod tempor.
>    Incididunt ut labore et dolore magna aliqua.
>    Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi
>    ut aliquip ex ea commodo consequat.
> 
> Semantic linefeeds make easier to spot that the word "XXXXX" was added
> in the first line.
> 
> Also, they are convenient during code reviews.  Shorter diffs and
> separating "ideas" with newlines allow to be more accurate when adding
> comments.
> 
> The site "Semantic Line Breaks" [2] by Mattt and the blog post "Semantic
> Linefeeds" [3] by Brandon Rhodes are both excellent references.
> 
> [1] https://web.archive.org/web/20130108163017if_/http://miffy.tom-yam.or.jp:80/2238/ref/beg.pdf
> [2] https://sembr.org/
> [3] https://rhodesmill.org/brandon/2012/one-sentence-per-line/

Thanks.

> +(defun fill-paragraph-semlf (&optional justify)
> +  "Fill paragraph at or after point using semantic linefeeds.
> +
> +This function ensures that a newline character follows every
> +sentence, as punctuated by a period (.), exclamation mark (!), or
> +question mark (?).

This explanation of what is "semantic linefeeds" is a good starting
point, but it is not enough.  For starters, "ensures" hints but
doesn't say explicitly that if there's no newline there, it is
inserted.  Also, I think a URL to at least one site explaining what
"semantic linefeeds" are should be in the doc string.

> +	  (when (and (> (point) (line-beginning-position))
> +		     (< (point) (line-end-position)))
> +	    (delete-horizontal-space)
> +	    (newline)

Are you sure 'newline' is the right function to call here?  It doesn't
just insert the newline character, at least not in all the cases.
Perhaps inserting a literal newline character is better?




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#78561; Package emacs. Full text available.

Message received at submit <at> debbugs.gnu.org:


Received: (at submit) by debbugs.gnu.org; 23 May 2025 09:58:30 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Fri May 23 05:58:30 2025
Received: from localhost ([127.0.0.1]:45802 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1uIPAZ-0001n6-QS
	for submit <at> debbugs.gnu.org; Fri, 23 May 2025 05:58:30 -0400
Received: from lists.gnu.org ([2001:470:142::17]:51364)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.84_2) (envelope-from <jroi.martin@HIDDEN>)
 id 1uIPAT-0001mh-Ur
 for submit <at> debbugs.gnu.org; Fri, 23 May 2025 05:58:25 -0400
Received: from eggs.gnu.org ([2001:470:142:3::10])
 by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.90_1) (envelope-from <jroi.martin@HIDDEN>)
 id 1uIPAO-0006wH-1A
 for bug-gnu-emacs@HIDDEN; Fri, 23 May 2025 05:58:16 -0400
Received: from mail-wm1-x330.google.com ([2a00:1450:4864:20::330])
 by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.90_1) (envelope-from <jroi.martin@HIDDEN>)
 id 1uIPAI-0008JZ-IO
 for bug-gnu-emacs@HIDDEN; Fri, 23 May 2025 05:58:15 -0400
Received: by mail-wm1-x330.google.com with SMTP id
 5b1f17b1804b1-442ccf0e1b3so110918915e9.3
 for <bug-gnu-emacs@HIDDEN>; Fri, 23 May 2025 02:58:10 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1747994289; x=1748599089; darn=gnu.org;
 h=mime-version:message-id:date:subject:to:from:from:to:cc:subject
 :date:message-id:reply-to;
 bh=tV8Afgj1RHH7Wkie9fiOeLvOGYbh1s9V6ZTd6UchsTo=;
 b=NRcUd4KhqwFHSfZmoSv/oVxwRqZhD8U07l7FFkfndSFdlNTFC9+x1pOXJKLJXoKumu
 iNCW69KSA495W7WlZXq5KKzNpEi4qQ8ZTzoAmeCXR6+cnJTRSQyhWzRaoRAAJNz2HUzX
 V9MRUuRekV2pqKtiVdEVOJo9Fs4FZUBQX/MTlwktCgZ8y9rBW4Y8M9zDAWTESgpP/spX
 gTyZmwerAkqc7MQzHziMT1BdhwBV11tHLZ7fyoeAu6gYMWc30ExWH3lL6MfjhuRy9AMB
 hEOCvMB6tsuaBitzdt+rLt46n3X6T8pFwDBAK7/xApWZHSMUe535hCz0eKlaThBYOaFW
 wFBA==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1747994289; x=1748599089;
 h=mime-version:message-id:date:subject:to:from:x-gm-message-state
 :from:to:cc:subject:date:message-id:reply-to;
 bh=tV8Afgj1RHH7Wkie9fiOeLvOGYbh1s9V6ZTd6UchsTo=;
 b=Y9iRwRNDQ2xgl8+18eSkyprec2wvfJfc8fbfHGUEU/UgpTnWylB56xYS7rMUc3VUTn
 7m1im4zJgBKZtNWtnjrVM4u/m8OovRwntJp5JKnu+2+kjL+4npxsE0gSGm8TFHbaoT83
 GkTM9PCQ2wJyFm/MoAlDhYpziIHWFGl1H2+brvVTgdUHQgK2bV3F9o6YTPnd4uuKRnhw
 hbE83JE/rdOE/2V7aH1RwFnGN13ECEB+h1WaTvp2e1xCUTgVPyKhkNRgOXtcYPGFm2kG
 mkHpwiikglOpApMt8tcF5Wy6Dp+wMIt3cyP6y33uWPGLMUZ3KBA9RCTNY1eaqBScaXjs
 NXpw==
X-Gm-Message-State: AOJu0YwdCb4wvKRFwsm2AbbD0QnKLqZJaCFd6b9wsK0WohDoGRSrFqbK
 iHs/nk6CiAMrnLfurbsLXZsAIpcNvEPq5YheFKS7w5DU67XXpGSb9qF14YX+bg==
X-Gm-Gg: ASbGncsftz67TrX3uqnPSxguJVZSYZtRRZHoNqwSvs/P689z/PC7vsr8+iy6gS9vLX3
 4iiGfQbF1x2tyquliT20mm7zCC7v04IyOx3FhDj4N0+89ILTcjRE+jsMs1Uh9oKA2QT2CUN8UNE
 pBXBssi5UxGfsklk3VM+Nxl6VldIBvyAGTFqDTUTKTjcrw7uBPMjdj3goPgwrJqfGvFiIwaHrEl
 chkfKGBOqy4uyOExOBPcAEuFY9BlqApuXQ3u1KNyFyOOrTn6pPEKqsq5ds0zFmcYijD+jOnus6P
 qNxKNvxtU9nSBbWsDh+btDohlbriP1V+xPtL8MLoKHWI+/QjJA==
X-Google-Smtp-Source: AGHT+IEGnz4MnmNI14hA1Qdgf3iikFvX9xB9d2OQNmDsOrpkYaP7yAKJKEVlDqUWwySAm958FGDoMQ==
X-Received: by 2002:a05:6000:2f87:b0:3a0:b84c:52b4 with SMTP id
 ffacd0b85a97d-3a4c20eea8amr2414044f8f.10.1747994288615; 
 Fri, 23 May 2025 02:58:08 -0700 (PDT)
Received: from localhost ([84.79.192.255]) by smtp.gmail.com with ESMTPSA id
 ffacd0b85a97d-3a362997dc8sm24192274f8f.46.2025.05.23.02.58.07
 for <bug-gnu-emacs@HIDDEN>
 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);
 Fri, 23 May 2025 02:58:07 -0700 (PDT)
From: Roi Martin <jroi.martin@HIDDEN>
To: bug-gnu-emacs@HIDDEN
Subject: [PATCH] Add semantic linefeed support for paragraph filling
X-Debbugs-Cc: Marcin Borkowski <mbork@HIDDEN>
Date: Fri, 23 May 2025 11:58:02 +0200
Message-ID: <87jz67tzrp.fsf@HIDDEN>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="=-=-="
Received-SPF: pass client-ip=2a00:1450:4864:20::330;
 envelope-from=jroi.martin@HIDDEN; helo=mail-wm1-x330.google.com
X-Spam_score_int: -19
X-Spam_score: -2.0
X-Spam_bar: --
X-Spam_report: (-2.0 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1,
 DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001,
 RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001,
 URIBL_SBL_A=0.1 autolearn=ham autolearn_force=no
X-Spam_action: no action
X-Spam-Score: 1.7 (+)
X-Spam-Report: Spam detection software, running on the system "debbugs.gnu.org",
 has NOT identified this incoming email as spam.  The original
 message has been attached to this so you can view it or label
 similar future email.  If you have any questions, see
 the administrator of that system for details.
 Content preview:  Tags: patch This patch adds semantic linefeed support for
 paragraph filling. The functionality has been discussed in the emacs-devel
 mailing list in the following threads: - Fill paragraph using semantic
 linefeeds:
 https://lists.gnu.org/archive/html/emacs-devel/2025-03/msg00035.html - [GNU
 ELPA] New package: semlf:
 https://lists.gnu.org/archive/html/emacs-devel/2025-03/ [...] 
 Content analysis details:   (1.7 points, 10.0 required)
 pts rule name              description
 ---- ---------------------- --------------------------------------------------
 0.1 URIBL_SBL_A Contains URL's A record listed in the Spamhaus SBL
 blocklist [URIs: web.archive.org]
 0.6 URIBL_SBL Contains an URL's NS IP listed in the Spamhaus SBL
 blocklist [URIs: web.archive.org]
 0.0 FREEMAIL_FROM          Sender email is commonly abused enduser mail
 provider (jroi.martin[at]gmail.com)
 -0.0 SPF_HELO_PASS          SPF: HELO matches SPF record
 1.0 SPF_SOFTFAIL           SPF: sender does not match SPF record (softfail)
 -0.0 RCVD_IN_DNSWL_NONE     RBL: Sender listed at https://www.dnswl.org/,
 no trust [2001:470:142:0:0:0:0:17 listed in] [list.dnswl.org]
X-Debbugs-Envelope-To: submit
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: 0.7 (/)

--=-=-=
Content-Type: text/plain

Tags: patch

This patch adds semantic linefeed support for paragraph filling.  The
functionality has been discussed in the emacs-devel mailing list in the
following threads:

- Fill paragraph using semantic linefeeds: https://lists.gnu.org/archive/html/emacs-devel/2025-03/msg00035.html
- [GNU ELPA] New package: semlf: https://lists.gnu.org/archive/html/emacs-devel/2025-03/msg00702.html

In the second thread we agreed on sending a patch to core instead of
adding a new package to GNU ELPA.

Given that this is a first version, I have not added any reference to
the manuals.  If you think it makes sense, please let me know and I'll
modify the patch accordingly.

What follows is a detailed explanation of the term semantic linefeeds,
so we have all the information in one single place.

The term "semantic linefeeds" or "semantic line breaks" refers to a set
of conventions for using insensitive vertical whitespace to structure
prose along semantic boundaries.

The concept was first introduced by Brian Kernighan in "UNIX for
Beginners" [1] in October 1974.

  Hints for Preparing Documents
  
  Most documents go through several versions (always more than you
  expected) before they are finally finished.  Accordingly, you should
  do whatever possible to make the job of changing them easy.
  
  First, when you do the purely mechanical operations of typing, type so
  subsequent editing will be easy.  Start each sentence on a new line.
  Make lines short, and break lines at natural places, such as after
  commas and semicolons, rather than randomly.  Since most people change
  documents by rewriting phrases and adding, deleting and rearranging
  sentences, these precautions simplify any editing you have to do
  later.

Semantic linefeeds are usually used with markup languages that are not
sensitive to newlines when exported to a different format (e.g. Org,
Texinfo, Markdown).

Let's say that we have the following paragraph in an Org document:

  Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod
  tempor.  Incididunt ut labore et dolore magna aliqua.  Ut enim ad minim
  veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea
  commodo consequat.

After filling the paragraph using semantic linefeeds, the result is:

  Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod
  tempor.
  Incididunt ut labore et dolore magna aliqua.
  Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi
  ut aliquip ex ea commodo consequat.

However, when exported, in both cases the result is:

  Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod
  tempor.  Incididunt ut labore et dolore magna aliqua.  Ut enim ad minim
  veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea
  commodo consequat.

So, what are the benefits?

One of the greatest benefits is that semantic linefeeds are "diff
friendly".

For example,

  -Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod
  -tempor.  Incididunt ut labore et dolore magna aliqua.  Ut enim ad minim
  -veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea
  -commodo consequat.
  +Lorem ipsum dolor sit amet, XXXXX consectetur adipiscing elit, sed do
  +eiusmod tempor.  Incididunt ut labore et dolore magna aliqua.  Ut enim
  +ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
  +aliquip ex ea commodo consequat.

Versus,

  -Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod
  -tempor.
  +Lorem ipsum dolor sit amet, XXXXX consectetur adipiscing elit, sed do
  +eiusmod tempor.
   Incididunt ut labore et dolore magna aliqua.
   Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi
   ut aliquip ex ea commodo consequat.

Semantic linefeeds make easier to spot that the word "XXXXX" was added
in the first line.

Also, they are convenient during code reviews.  Shorter diffs and
separating "ideas" with newlines allow to be more accurate when adding
comments.

The site "Semantic Line Breaks" [2] by Mattt and the blog post "Semantic
Linefeeds" [3] by Brandon Rhodes are both excellent references.

[1] https://web.archive.org/web/20130108163017if_/http://miffy.tom-yam.or.jp:80/2238/ref/beg.pdf
[2] https://sembr.org/
[3] https://rhodesmill.org/brandon/2012/one-sentence-per-line/


--=-=-=
Content-Type: text/patch
Content-Disposition: attachment;
 filename=0001-Add-semantic-linefeed-support-for-paragraph-filling.patch

From 8faa17e5ddc8156a6f9f18965bb34e477d5d8b1d Mon Sep 17 00:00:00 2001
From: Roi Martin <jroi.martin@HIDDEN>
Date: Fri, 21 Mar 2025 14:22:46 +0100
Subject: [PATCH] Add semantic linefeed support for paragraph filling

* lisp/textmodes/fill.el (fill-paragraph-semlf): Add function to fill
paragraph using semantic linefeeds.
* test/lisp/textmodes/fill-tests.el (fill-test-fill-paragraph-semlf)
(fill-test-fill-paragraph-semlf-fill-paragraph-function)
(fill-test-fill-paragraph-semlf-justify)
(fill-test-fill-paragraph-semlf-sentence-end-double-space)
(fill-test-fill-paragraph-semlf-fill-column)
(fill-test-fill-paragraph-semlf-punctuation-marks)
(fill-test-fill-paragraph-semlf-twice)
(fill-test-fill-paragraph-semlf-fill-prefix)
(fill-test-fill-paragraph-semlf-indented-block)
(fill-test-fill-paragraph-semlf-emacs-lisp-mode)
(fill-test-fill-paragraph-semlf-c-mode)
(fill-test-fill-paragraph-semlf-org-mode)
(fill-test-fill-paragraph-semlf-markdown-mode): Add tests.
* test/lisp/textmodes/fill-resources/semlf-c-mode.erts:
* test/lisp/textmodes/fill-resources/semlf-emacs-lisp-mode.erts:
* test/lisp/textmodes/fill-resources/semlf-fill-column.erts:
* test/lisp/textmodes/fill-resources/semlf-fill-paragraph-function.erts:
* test/lisp/textmodes/fill-resources/semlf-fill-prefix.erts:
* test/lisp/textmodes/fill-resources/semlf-indented-block.erts:
* test/lisp/textmodes/fill-resources/semlf-justify.erts:
* test/lisp/textmodes/fill-resources/semlf-markdown-mode.erts:
* test/lisp/textmodes/fill-resources/semlf-org-mode.erts:
* test/lisp/textmodes/fill-resources/semlf-punctuation-marks.erts:
* test/lisp/textmodes/fill-resources/semlf-sentence-end-double-space.erts:
* test/lisp/textmodes/fill-resources/semlf-twice.erts:
* test/lisp/textmodes/fill-resources/semlf.erts: Add test data.
---
 lisp/textmodes/fill.el                        |  40 ++++
 .../fill-resources/semlf-c-mode.erts          | 183 ++++++++++++++++++
 .../fill-resources/semlf-emacs-lisp-mode.erts |  87 +++++++++
 .../fill-resources/semlf-fill-column.erts     |  15 ++
 .../semlf-fill-paragraph-function.erts        |  12 ++
 .../fill-resources/semlf-fill-prefix.erts     |  35 ++++
 .../fill-resources/semlf-indented-block.erts  |  31 +++
 .../fill-resources/semlf-justify.erts         |  12 ++
 .../fill-resources/semlf-markdown-mode.erts   | 129 ++++++++++++
 .../fill-resources/semlf-org-mode.erts        | 122 ++++++++++++
 .../semlf-punctuation-marks.erts              |  13 ++
 .../semlf-sentence-end-double-space.erts      |  13 ++
 .../textmodes/fill-resources/semlf-twice.erts |  12 ++
 test/lisp/textmodes/fill-resources/semlf.erts |  88 +++++++++
 test/lisp/textmodes/fill-tests.el             |  90 +++++++++
 15 files changed, 882 insertions(+)
 create mode 100644 test/lisp/textmodes/fill-resources/semlf-c-mode.erts
 create mode 100644 test/lisp/textmodes/fill-resources/semlf-emacs-lisp-mode.erts
 create mode 100644 test/lisp/textmodes/fill-resources/semlf-fill-column.erts
 create mode 100644 test/lisp/textmodes/fill-resources/semlf-fill-paragraph-function.erts
 create mode 100644 test/lisp/textmodes/fill-resources/semlf-fill-prefix.erts
 create mode 100644 test/lisp/textmodes/fill-resources/semlf-indented-block.erts
 create mode 100644 test/lisp/textmodes/fill-resources/semlf-justify.erts
 create mode 100644 test/lisp/textmodes/fill-resources/semlf-markdown-mode.erts
 create mode 100644 test/lisp/textmodes/fill-resources/semlf-org-mode.erts
 create mode 100644 test/lisp/textmodes/fill-resources/semlf-punctuation-marks.erts
 create mode 100644 test/lisp/textmodes/fill-resources/semlf-sentence-end-double-space.erts
 create mode 100644 test/lisp/textmodes/fill-resources/semlf-twice.erts
 create mode 100644 test/lisp/textmodes/fill-resources/semlf.erts

diff --git a/lisp/textmodes/fill.el b/lisp/textmodes/fill.el
index e38d030734fb..676c1657b666 100644
--- a/lisp/textmodes/fill.el
+++ b/lisp/textmodes/fill.el
@@ -1583,4 +1583,44 @@ fill-individual-paragraphs-citation
 	"")
     string))
 
+(defun fill-paragraph-semlf (&optional justify)
+  "Fill paragraph at or after point using semantic linefeeds.
+
+This function ensures that a newline character follows every
+sentence, as punctuated by a period (.), exclamation mark (!), or
+question mark (?).
+
+If JUSTIFY is non-nil (interactively, with prefix argument), justify as
+well.  If `sentence-end-double-space' is non-nil, then period followed
+by one space does not end a sentence, so don't break a line there.  The
+variable `fill-column' controls the width for filling."
+  (interactive "P")
+  (save-excursion
+    (let ((end (progn
+		 (fill-forward-paragraph 1)
+		 (backward-word)
+		 (end-of-line)
+		 (point)))
+	  (start (progn
+		   (fill-forward-paragraph -1)
+		   (forward-word)
+		   (beginning-of-line)
+		   (point)))
+	  pfx)
+      (with-restriction start end
+	(let ((fill-column (point-max)))
+	  (setq pfx (or (fill-region-as-paragraph (point-min) (point-max)) "")))
+	(goto-char (point-min))
+	(while (not (eobp))
+	  (let ((fill-prefix pfx))
+	    (fill-region-as-paragraph (point)
+				      (progn (forward-sentence) (point))
+				      justify))
+	  (when (and (> (point) (line-beginning-position))
+		     (< (point) (line-end-position)))
+	    (delete-horizontal-space)
+	    (newline)
+	    (insert pfx))))))
+  t)
+
 ;;; fill.el ends here
diff --git a/test/lisp/textmodes/fill-resources/semlf-c-mode.erts b/test/lisp/textmodes/fill-resources/semlf-c-mode.erts
new file mode 100644
index 000000000000..a28eb68cfc6a
--- /dev/null
+++ b/test/lisp/textmodes/fill-resources/semlf-c-mode.erts
@@ -0,0 +1,183 @@
+Point-Char: |
+
+Name: c-mode - single-line
+
+=-=
+// Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+// eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+// ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+// Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+// eiusmod tempor.
+// Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+// veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
+
+Name: c-mode - single-line - fill-prefix - marker
+
+=-=
+// - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+// - Aliquip ex ea commodo consequat.  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
+// - Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+=-=
+// - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+// - eiusmod tempor.
+// - Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+// - veniam, quis nostrud exercitation ullamco laboris nisi ut.
+// - Aliquip ex ea commodo consequat.
+// - Duis aute irure dolor in reprehenderit in voluptate velit esse
+// - cillum dolore eu fugiat nulla pariatur.
+// - Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+// - officia deserunt mollit anim id est laborum.
+=-=-=
+
+Name: c-mode - single-line - fill-prefix - whitespace
+
+=-=
+// - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+//   Aliquip ex ea commodo consequat.  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
+//   Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+=-=
+// - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+//   eiusmod tempor.
+//   Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+//   veniam, quis nostrud exercitation ullamco laboris nisi ut.
+//   Aliquip ex ea commodo consequat.
+//   Duis aute irure dolor in reprehenderit in voluptate velit esse
+//   cillum dolore eu fugiat nulla pariatur.
+//   Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+//   officia deserunt mollit anim id est laborum.
+=-=-=
+
+Name: c-mode - single-line - indented block
+
+=-=
+// Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+// eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut
+// enim ad minim veniam, quis nostrud exercitation ullamco laboris
+// nisi ut.
+//
+// 	|Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed
+// 	do eiusmod tempor.  Incididunt ut labore et dolore magna
+// 	aliqua. Ut enim ad minim veniam, quis nostrud exercitation
+// 	ullamco laboris nisi ut.
+//
+// Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+// eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut
+// enim ad minim veniam, quis nostrud exercitation ullamco laboris
+// nisi ut.
+=-=
+// Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+// eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut
+// enim ad minim veniam, quis nostrud exercitation ullamco laboris
+// nisi ut.
+//
+// 	Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed
+// 	do eiusmod tempor.
+// 	Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+// 	veniam, quis nostrud exercitation ullamco laboris nisi ut.
+//
+// Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+// eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut
+// enim ad minim veniam, quis nostrud exercitation ullamco laboris
+// nisi ut.
+=-=-=
+
+Name: c-mode - multi-line
+
+=-=
+/*
+ * Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+ * eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ * ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+ */
+=-=
+/*
+ * Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+ * eiusmod tempor.
+ * Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+ * veniam, quis nostrud exercitation ullamco laboris nisi ut.
+ */
+=-=-=
+
+Name: c-mode - multi-line - fill-prefix - marker
+
+=-=
+/*
+ * - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+ * - Aliquip ex ea commodo consequat.  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
+ * - Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ */
+=-=
+/*
+ * - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+ * - eiusmod tempor.
+ * - Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+ * - veniam, quis nostrud exercitation ullamco laboris nisi ut.
+ * - Aliquip ex ea commodo consequat.
+ * - Duis aute irure dolor in reprehenderit in voluptate velit esse
+ * - cillum dolore eu fugiat nulla pariatur.
+ * - Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+ * - officia deserunt mollit anim id est laborum.
+ */
+=-=-=
+
+Name: c-mode - multi-line - fill-prefix - whitespace
+
+=-=
+/*
+ * - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+ *   Aliquip ex ea commodo consequat.  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
+ *   Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ */
+=-=
+/*
+ * - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+ *   eiusmod tempor.
+ *   Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+ *   veniam, quis nostrud exercitation ullamco laboris nisi ut.
+ *   Aliquip ex ea commodo consequat.
+ *   Duis aute irure dolor in reprehenderit in voluptate velit esse
+ *   cillum dolore eu fugiat nulla pariatur.
+ *   Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+ *   officia deserunt mollit anim id est laborum.
+ */
+=-=-=
+
+Name: c-mode - multi-line - indented block
+
+=-=
+/*
+ * Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+ * eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut
+ * enim ad minim veniam, quis nostrud exercitation ullamco laboris
+ * nisi ut.
+ *
+ * 	|Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed
+ * 	do eiusmod tempor.  Incididunt ut labore et dolore magna
+ * 	aliqua. Ut enim ad minim veniam, quis nostrud exercitation
+ * 	ullamco laboris nisi ut.
+ *
+ * Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+ * eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut
+ * enim ad minim veniam, quis nostrud exercitation ullamco laboris
+ * nisi ut.
+ */
+=-=
+/*
+ * Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+ * eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut
+ * enim ad minim veniam, quis nostrud exercitation ullamco laboris
+ * nisi ut.
+ *
+ * 	Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed
+ * 	do eiusmod tempor.
+ * 	Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+ * 	veniam, quis nostrud exercitation ullamco laboris nisi ut.
+ *
+ * Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+ * eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut
+ * enim ad minim veniam, quis nostrud exercitation ullamco laboris
+ * nisi ut.
+ */
+=-=-=
diff --git a/test/lisp/textmodes/fill-resources/semlf-emacs-lisp-mode.erts b/test/lisp/textmodes/fill-resources/semlf-emacs-lisp-mode.erts
new file mode 100644
index 000000000000..fe71ee32c1aa
--- /dev/null
+++ b/test/lisp/textmodes/fill-resources/semlf-emacs-lisp-mode.erts
@@ -0,0 +1,87 @@
+Point-Char: |
+
+Name: emacs-lisp-mode
+
+=-=
+;; Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+;; eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+;; ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+;; Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+;; eiusmod tempor.
+;; Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+;; veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
+
+Name: emacs-lisp-mode - fill-prefix - marker
+
+=-=
+;; - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+;; - Aliquip ex ea commodo consequat.  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
+;; - Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+=-=
+;; - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+;; - eiusmod tempor.
+;; - Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+;; - veniam, quis nostrud exercitation ullamco laboris nisi ut.
+;; - Aliquip ex ea commodo consequat.
+;; - Duis aute irure dolor in reprehenderit in voluptate velit esse
+;; - cillum dolore eu fugiat nulla pariatur.
+;; - Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+;; - officia deserunt mollit anim id est laborum.
+=-=-=
+
+Name: emacs-lisp-mode - fill-prefix - whitespace
+
+=-=
+;; - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+;;   Aliquip ex ea commodo consequat.  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
+;;   Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+=-=
+;; - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+;;   eiusmod tempor.
+;;   Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+;;   veniam, quis nostrud exercitation ullamco laboris nisi ut.
+;;   Aliquip ex ea commodo consequat.
+;;   Duis aute irure dolor in reprehenderit in voluptate velit esse
+;;   cillum dolore eu fugiat nulla pariatur.
+;;   Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+;;   officia deserunt mollit anim id est laborum.
+=-=-=
+
+Name: emacs-lisp-mode - indented block
+
+The `fill-forward-paragraph' function jumps to the beginning/end of
+the comment.
+
+=-=
+;; Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+;; eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut
+;; enim ad minim veniam, quis nostrud exercitation ullamco laboris
+;; nisi ut.
+
+;; 	|Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed
+;; 	do eiusmod tempor.  Incididunt ut labore et dolore magna
+;; 	aliqua. Ut enim ad minim veniam, quis nostrud exercitation
+;; 	ullamco laboris nisi ut.
+
+;; Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+;; eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut
+;; enim ad minim veniam, quis nostrud exercitation ullamco laboris
+;; nisi ut.
+=-=
+;; Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+;; eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut
+;; enim ad minim veniam, quis nostrud exercitation ullamco laboris
+;; nisi ut.
+
+;; 	Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed
+;; 	do eiusmod tempor.
+;; 	Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+;; 	veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+;; Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+;; eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut
+;; enim ad minim veniam, quis nostrud exercitation ullamco laboris
+;; nisi ut.
+=-=-=
diff --git a/test/lisp/textmodes/fill-resources/semlf-fill-column.erts b/test/lisp/textmodes/fill-resources/semlf-fill-column.erts
new file mode 100644
index 000000000000..20db7b1f9c5b
--- /dev/null
+++ b/test/lisp/textmodes/fill-resources/semlf-fill-column.erts
@@ -0,0 +1,15 @@
+Name: fill-column
+
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+Lorem ipsum dolor sit amet,
+consectetur adipiscing elit, sed do
+eiusmod tempor.
+Incididunt ut labore et dolore
+magna aliqua. Ut enim ad minim
+veniam, quis nostrud exercitation
+ullamco laboris nisi ut.
+=-=-=
diff --git a/test/lisp/textmodes/fill-resources/semlf-fill-paragraph-function.erts b/test/lisp/textmodes/fill-resources/semlf-fill-paragraph-function.erts
new file mode 100644
index 000000000000..467e7401cf50
--- /dev/null
+++ b/test/lisp/textmodes/fill-resources/semlf-fill-paragraph-function.erts
@@ -0,0 +1,12 @@
+Name: fill-paragraph-function
+
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.
+Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
+quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
diff --git a/test/lisp/textmodes/fill-resources/semlf-fill-prefix.erts b/test/lisp/textmodes/fill-resources/semlf-fill-prefix.erts
new file mode 100644
index 000000000000..e067eff69701
--- /dev/null
+++ b/test/lisp/textmodes/fill-resources/semlf-fill-prefix.erts
@@ -0,0 +1,35 @@
+Name: fill-prefix - marker
+
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+- Aliquip ex ea commodo consequat.  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
+- Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+- eiusmod tempor.
+- Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+- veniam, quis nostrud exercitation ullamco laboris nisi ut.
+- Aliquip ex ea commodo consequat.
+- Duis aute irure dolor in reprehenderit in voluptate velit esse
+- cillum dolore eu fugiat nulla pariatur.
+- Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+- officia deserunt mollit anim id est laborum.
+=-=-=
+
+Name: fill-prefix - whitespace
+
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+  Aliquip ex ea commodo consequat.  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
+  Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+  eiusmod tempor.
+  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+  veniam, quis nostrud exercitation ullamco laboris nisi ut.
+  Aliquip ex ea commodo consequat.
+  Duis aute irure dolor in reprehenderit in voluptate velit esse
+  cillum dolore eu fugiat nulla pariatur.
+  Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+  officia deserunt mollit anim id est laborum.
+=-=-=
diff --git a/test/lisp/textmodes/fill-resources/semlf-indented-block.erts b/test/lisp/textmodes/fill-resources/semlf-indented-block.erts
new file mode 100644
index 000000000000..e483567c6ab3
--- /dev/null
+++ b/test/lisp/textmodes/fill-resources/semlf-indented-block.erts
@@ -0,0 +1,31 @@
+Point-Char: |
+
+Name: indented block
+
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+	|Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed
+	do eiusmod tempor.  Incididunt ut labore et dolore magna
+	aliqua. Ut enim ad minim veniam, quis nostrud exercitation
+	ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+	Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed
+	do eiusmod tempor.
+	Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+	veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
diff --git a/test/lisp/textmodes/fill-resources/semlf-justify.erts b/test/lisp/textmodes/fill-resources/semlf-justify.erts
new file mode 100644
index 000000000000..3a951b7ce424
--- /dev/null
+++ b/test/lisp/textmodes/fill-resources/semlf-justify.erts
@@ -0,0 +1,12 @@
+Name: justify
+
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+Lorem  ipsum  dolor sit  amet,  consectetur  adipiscing elit,  sed  do
+eiusmod tempor.
+Incididunt ut labore et dolore magna  aliqua. Ut enim ad minim veniam,
+quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
diff --git a/test/lisp/textmodes/fill-resources/semlf-markdown-mode.erts b/test/lisp/textmodes/fill-resources/semlf-markdown-mode.erts
new file mode 100644
index 000000000000..7257708c245d
--- /dev/null
+++ b/test/lisp/textmodes/fill-resources/semlf-markdown-mode.erts
@@ -0,0 +1,129 @@
+Point-Char: |
+
+Name: markdown-mode
+
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.
+Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
+quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
+
+Name: markdown-mode - list - one single-line item
+
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+  eiusmod tempor.
+  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+  veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
+
+Name: markdown-mode - list - multiple single-line items
+
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+- Aliquip ex ea commodo consequat.  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
+- Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+  eiusmod tempor.
+  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+  veniam, quis nostrud exercitation ullamco laboris nisi ut.
+- Aliquip ex ea commodo consequat.  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
+- Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+=-=-=
+
+Name: markdown-mode - list - one multi-line item
+
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+  eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut
+  enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi
+  ut.
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+  eiusmod tempor.
+  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+  veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
+
+Name: markdown-mode - list - multiple multi-line items
+
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+  eiusmod tempor.  Incididunt ut labore et dolore magn a aliqua. Ut
+  enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi
+  ut.
+- Aliquip ex ea commodo consequat.  Duis aute irure dolor in
+  reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
+  pariatur.
+- Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+  officia deserunt mollit anim id est laborum.
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+  eiusmod tempor.
+  Incididunt ut labore et dolore magn a aliqua. Ut enim ad minim
+  veniam, quis nostrud exercitation ullamco laboris nisi ut.
+- Aliquip ex ea commodo consequat.  Duis aute irure dolor in
+  reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
+  pariatur.
+- Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+  officia deserunt mollit anim id est laborum.
+=-=-=
+
+Name: markdown-mode - list - short sentence in multi-line item
+
+=-=
+- Lorem ipsum dolor.  Sit amet, consectetur adipiscing elit, sed do
+  eiusmod tempor.  Incididunt ut labore et dolore magn a aliqua. Ut
+  enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi
+  ut.
+=-=
+- Lorem ipsum dolor.
+  Sit amet, consectetur adipiscing elit, sed do eiusmod tempor.
+  Incididunt ut labore et dolore magn a aliqua. Ut enim ad minim
+  veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
+
+Name: markdown-mode - indented block
+Skip: t
+
+TODO - In `markdown-mode', the `fill-forward-paragraph' function
+ignores code blocks.  We should reach out to the `markdown-mode'
+maintainer(s) to understand the reason for this and possibly suggest a
+change to this behavior.  This works as expected in
+`markdown-ts-mode'.
+
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+	|Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed
+	do eiusmod tempor.  Incididunt ut labore et dolore magna
+	aliqua. Ut enim ad minim veniam, quis nostrud exercitation
+	ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+	Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed
+	do eiusmod tempor.
+	Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+	veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
diff --git a/test/lisp/textmodes/fill-resources/semlf-org-mode.erts b/test/lisp/textmodes/fill-resources/semlf-org-mode.erts
new file mode 100644
index 000000000000..81dd4841de94
--- /dev/null
+++ b/test/lisp/textmodes/fill-resources/semlf-org-mode.erts
@@ -0,0 +1,122 @@
+Point-Char: |
+
+Name: org-mode
+
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.
+Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
+quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
+
+Name: org-mode - list - one single-line item
+
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+  eiusmod tempor.
+  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+  veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
+
+Name: org-mode - list - multiple single-line items
+
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+- Aliquip ex ea commodo consequat.  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
+- Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+  eiusmod tempor.
+  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+  veniam, quis nostrud exercitation ullamco laboris nisi ut.
+- Aliquip ex ea commodo consequat.  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
+- Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+=-=-=
+
+Name: org-mode - list - one multi-line item
+
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+  eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut
+  enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi
+  ut.
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+  eiusmod tempor.
+  Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+  veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
+
+Name: org-mode - list - multiple multi-line items
+
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+  eiusmod tempor.  Incididunt ut labore et dolore magn a aliqua. Ut
+  enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi
+  ut.
+- Aliquip ex ea commodo consequat.  Duis aute irure dolor in
+  reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
+  pariatur.
+- Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+  officia deserunt mollit anim id est laborum.
+=-=
+- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+  eiusmod tempor.
+  Incididunt ut labore et dolore magn a aliqua. Ut enim ad minim
+  veniam, quis nostrud exercitation ullamco laboris nisi ut.
+- Aliquip ex ea commodo consequat.  Duis aute irure dolor in
+  reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
+  pariatur.
+- Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
+  officia deserunt mollit anim id est laborum.
+=-=-=
+
+Name: org-mode - list - short sentence in multi-line item
+
+=-=
+- Lorem ipsum dolor.  Sit amet, consectetur adipiscing elit, sed do
+  eiusmod tempor.  Incididunt ut labore et dolore magn a aliqua. Ut
+  enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi
+  ut.
+=-=
+- Lorem ipsum dolor.
+  Sit amet, consectetur adipiscing elit, sed do eiusmod tempor.
+  Incididunt ut labore et dolore magn a aliqua. Ut enim ad minim
+  veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
+
+Name: org-mode - indented block
+
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+	|Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed
+	do eiusmod tempor.  Incididunt ut labore et dolore magna
+	aliqua. Ut enim ad minim veniam, quis nostrud exercitation
+	ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+	Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed
+	do eiusmod tempor.
+	Incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+	veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
diff --git a/test/lisp/textmodes/fill-resources/semlf-punctuation-marks.erts b/test/lisp/textmodes/fill-resources/semlf-punctuation-marks.erts
new file mode 100644
index 000000000000..5346216e9f9c
--- /dev/null
+++ b/test/lisp/textmodes/fill-resources/semlf-punctuation-marks.erts
@@ -0,0 +1,13 @@
+Name: punctuation marks
+
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua!  Ut enim
+ad minim veniam?  Quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.
+Incididunt ut labore et dolore magna aliqua!
+Ut enim ad minim veniam?
+Quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
diff --git a/test/lisp/textmodes/fill-resources/semlf-sentence-end-double-space.erts b/test/lisp/textmodes/fill-resources/semlf-sentence-end-double-space.erts
new file mode 100644
index 000000000000..a01beed0f665
--- /dev/null
+++ b/test/lisp/textmodes/fill-resources/semlf-sentence-end-double-space.erts
@@ -0,0 +1,13 @@
+Name: sentence-end-double-space
+
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.
+Incididunt ut labore et dolore magna aliqua.
+Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris
+nisi ut.
+=-=-=
diff --git a/test/lisp/textmodes/fill-resources/semlf-twice.erts b/test/lisp/textmodes/fill-resources/semlf-twice.erts
new file mode 100644
index 000000000000..862dda6e27eb
--- /dev/null
+++ b/test/lisp/textmodes/fill-resources/semlf-twice.erts
@@ -0,0 +1,12 @@
+Name: fill twice
+
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.
+Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
+quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
diff --git a/test/lisp/textmodes/fill-resources/semlf.erts b/test/lisp/textmodes/fill-resources/semlf.erts
new file mode 100644
index 000000000000..f3e331cd9381
--- /dev/null
+++ b/test/lisp/textmodes/fill-resources/semlf.erts
@@ -0,0 +1,88 @@
+Point-Char: |
+
+Name: beginning of buffer
+
+=-=
+|Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.
+Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
+quis nostrud exercitation ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
+
+Name: second paragraph
+
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+|Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.
+Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
+quis nostrud exercitation ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
+
+Name: end of buffer
+
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.|
+=-=
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.  Incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
+eiusmod tempor.
+Incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
+quis nostrud exercitation ullamco laboris nisi ut.
+=-=-=
diff --git a/test/lisp/textmodes/fill-tests.el b/test/lisp/textmodes/fill-tests.el
index 6e079973100e..afd17c52dcd5 100644
--- a/test/lisp/textmodes/fill-tests.el
+++ b/test/lisp/textmodes/fill-tests.el
@@ -28,6 +28,7 @@
 ;;; Code:
 
 (require 'ert)
+(require 'ert-x)
 
 (ert-deftest fill-test-no-fill-polish-nobreak-p nil
   "Tests of the `fill-polish-nobreak-p' function."
@@ -121,6 +122,95 @@ test-fill-haskell
   ;; w
 ")))
 
+(ert-deftest fill-test-fill-paragraph-semlf ()
+  "Test the `fill-paragraph-semlf' function."
+  (ert-test-erts-file (ert-resource-file "semlf.erts")
+                      (lambda ()
+			(fill-paragraph-semlf))))
+
+(ert-deftest fill-test-fill-paragraph-semlf-fill-paragraph-function ()
+  "Test `fill-paragraph-semlf' as `fill-paragraph-function'."
+  (ert-test-erts-file (ert-resource-file "semlf-fill-paragraph-function.erts")
+                      (lambda ()
+			(setq-local fill-paragraph-function #'fill-paragraph-semlf)
+			(fill-paragraph))))
+
+(ert-deftest fill-test-fill-paragraph-semlf-justify ()
+  "Test the JUSTIFY parameter of the `fill-paragraph-semlf' function."
+  (ert-test-erts-file (ert-resource-file "semlf-justify.erts")
+                      (lambda ()
+			(fill-paragraph-semlf 'justify))))
+
+(ert-deftest fill-test-fill-paragraph-semlf-sentence-end-double-space ()
+  "Test the `fill-paragraph-semlf' function with `sentence-end-double-space'."
+  (ert-test-erts-file (ert-resource-file "semlf-sentence-end-double-space.erts")
+                      (lambda ()
+			(setq-local sentence-end-double-space nil)
+			(fill-paragraph-semlf))))
+
+(ert-deftest fill-test-fill-paragraph-semlf-fill-column ()
+  "Test the `fill-paragraph-semlf' function with `fill-column'."
+  (ert-test-erts-file (ert-resource-file "semlf-fill-column.erts")
+                      (lambda ()
+			(setq-local fill-column 35)
+			(fill-paragraph-semlf))))
+
+(ert-deftest fill-test-fill-paragraph-semlf-punctuation-marks ()
+  "Test the `fill-paragraph-semlf' function with different punctuation marks."
+  (ert-test-erts-file (ert-resource-file "semlf-punctuation-marks.erts")
+                      (lambda ()
+			(fill-paragraph-semlf))))
+
+(ert-deftest fill-test-fill-paragraph-semlf-twice ()
+  "Test to run the `fill-paragraph-semlf' function twice."
+  (ert-test-erts-file (ert-resource-file "semlf-twice.erts")
+                      (lambda ()
+			(goto-char (point-min))
+			(fill-paragraph-semlf)
+			(goto-char (point-min))
+			(fill-paragraph-semlf))))
+
+(ert-deftest fill-test-fill-paragraph-semlf-fill-prefix ()
+  "Test the `fill-paragraph-semlf' function with different fill prefixes."
+  (ert-test-erts-file (ert-resource-file "semlf-fill-prefix.erts")
+                      (lambda ()
+			(fill-paragraph-semlf))))
+
+(ert-deftest fill-test-fill-paragraph-semlf-indented-block ()
+  "Test the `fill-paragraph-semlf' function with an indented block."
+  (ert-test-erts-file (ert-resource-file "semlf-indented-block.erts")
+                      (lambda ()
+			(fill-paragraph-semlf))))
+
+(ert-deftest fill-test-fill-paragraph-semlf-emacs-lisp-mode ()
+  "Test the `fill-paragraph-semlf' function with `emacs-lisp-mode'."
+  (ert-test-erts-file (ert-resource-file "semlf-emacs-lisp-mode.erts")
+                      (lambda ()
+			(emacs-lisp-mode)
+			(fill-paragraph-semlf))))
+
+(ert-deftest fill-test-fill-paragraph-semlf-c-mode ()
+  "Test the `fill-paragraph-semlf' function with `c-mode'."
+  (ert-test-erts-file (ert-resource-file "semlf-c-mode.erts")
+                      (lambda ()
+			(c-mode)
+			(fill-paragraph-semlf))))
+
+(ert-deftest fill-test-fill-paragraph-semlf-org-mode ()
+  "Test the `fill-paragraph-semlf' function with `org-mode'."
+  (ert-test-erts-file (ert-resource-file "semlf-org-mode.erts")
+                      (lambda ()
+			(org-mode)
+			(fill-paragraph-semlf))))
+
+(ert-deftest fill-test-fill-paragraph-semlf-markdown-mode ()
+  "Test the `fill-paragraph-semlf' function with `markdown-mode'."
+  (skip-unless (functionp 'markdown-mode))
+  (ert-test-erts-file (ert-resource-file "semlf-markdown-mode.erts")
+                      (lambda ()
+			(markdown-mode)
+			(fill-paragraph-semlf))))
+
 (provide 'fill-tests)
 
 ;;; fill-tests.el ends here
-- 
2.49.0


--=-=-=--




Acknowledgement sent to Roi Martin <jroi.martin@HIDDEN>:
New bug report received and forwarded. Copy sent to mbork@HIDDEN, bug-gnu-emacs@HIDDEN. Full text available.
Report forwarded to mbork@HIDDEN, bug-gnu-emacs@HIDDEN:
bug#78561; Package emacs. Full text available.
Please note: This is a static page, with minimal formatting, updated once a day.
Click here to see this page with the latest information and nicer formatting.
Last modified: Sat, 14 Jun 2025 13:45:03 UTC

GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997 nCipher Corporation Ltd, 1994-97 Ian Jackson.