From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Yuan Fu Newsgroups: gmane.emacs.devel Subject: Re: Line wrap reconsidered Date: Mon, 13 Jul 2020 15:46:16 -0400 Message-ID: <214EBF50-8BEE-4935-9DE9-526E82F7D85C@gmail.com> References: <92FF4412-04FB-4521-B6CE-52B08526E4E5@gmail.com> <878shfsq35.fsf@gnus.org> <83imgivjak.fsf@gnu.org> <83lfletr03.fsf@gnu.org> <4895C6EE-5E1F-44BF-93C1-CC5F7C096F73@gmail.com> <9766BA3D-B8F9-456B-9F59-60D21B86E390@gmail.com> <83sgfls2ul.fsf@gnu.org> <83v9kgq6jy.fsf@gnu.org> <5E75D1E2-8BFF-45DA-A643-40DBD5784508@gmail.com> <83r1v3qlel.fsf@gnu.org> <83blm6lzj3.fsf@gnu.org> <83pnakj8fs.fsf@gnu.org> <83k10sj60l.fsf@gnu.org> <0B30F8C8-9B8F-4FCB-B9FB-1B5A0E993CDB@gmail.com> <838sgjzij2.fsf@gnu.org> <83sgerxmbs.fsf@gnu.org> <83bllfx80g.fsf@gnu.org> <2F9680C4-11D8-4092-A485-2590AAF62CC9@gmail.com> <837dw2ykeb.fsf@gnu.org> <43C485E7-A9E7-448A-B1EC-9085F83670E9@gmail.com> <83365woafv.fsf@gnu.org> Mime-Version: 1.0 (Mac OS X Mail 13.4 \(3608.80.23.2.2\)) Content-Type: multipart/mixed; boundary="Apple-Mail=_24B0C976-E6BA-4C8E-A228-431021CD9916" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="19171"; mail-complaints-to="usenet@ciao.gmane.io" Cc: Lars Ingebrigtsen , emacs-devel@gnu.org To: Eli Zaretskii Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Mon Jul 13 21:47:10 2020 Return-path: Envelope-to: ged-emacs-devel@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1jv4Pu-0004qF-8S for ged-emacs-devel@m.gmane-mx.org; Mon, 13 Jul 2020 21:47:10 +0200 Original-Received: from localhost ([::1]:48884 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jv4Pt-0007pH-BK for ged-emacs-devel@m.gmane-mx.org; Mon, 13 Jul 2020 15:47:09 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:51358) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jv4P8-0006wQ-SF for emacs-devel@gnu.org; Mon, 13 Jul 2020 15:46:22 -0400 Original-Received: from mail-qt1-x831.google.com ([2607:f8b0:4864:20::831]:44411) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1jv4P6-0002ON-3G; Mon, 13 Jul 2020 15:46:22 -0400 Original-Received: by mail-qt1-x831.google.com with SMTP id j10so10946925qtq.11; Mon, 13 Jul 2020 12:46:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:message-id:mime-version:subject:date:in-reply-to:cc:to :references; bh=XD+nNC4Mbp7GwDAc2jpK/iwZG7sAZgHtwO1INcLcgU8=; b=hl4RWg+8kKdLLw2pGfauEC5hPVy4+9+tIKtB4IBl4fRDEMYA+yrv/LMQOxr3Guy0iI MqWe4c9hiyX8d+W/3VlXoKmva8F1wwFW97818lQaQEegtY9zezmwwB6EngrQDZkLXNTB BlTzF7xYKVWJwzo50nEeEvdxUDLe0gzm6ZnlyFNL2Kvxt+3F7WaBR02GYlxvnTOjCeXZ F4afrBVKjuW2iUId1KUQYIRGdemEbqJ+qZEdO9QI+RfWYOvwTYI+g1I45nHV4rBlkwzY RC74DoCgcrHTU+lV93ST5JmvjnbnWCDuMkCRzfa+3+CUvUm2Q1j8vrSTaPfRUZsuJKCt ObHQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:message-id:mime-version:subject:date :in-reply-to:cc:to:references; bh=XD+nNC4Mbp7GwDAc2jpK/iwZG7sAZgHtwO1INcLcgU8=; b=MI6mrkLZHsoSmv6XsRlReOeL2qZVSp/fhcZ1Ksmyl3hSkXQUQq0DKVSA/C3vw4zLIb CdD2Jk23tUdtnXUHtyNV6Xkdo1Wnt9AQI7gtD9K8NA6H3i2O4AOW1BN41vCsGHLx26Km hymFJikM9YlFlUEKkgjJmRhJIZvp1Cgf5SVC39Y8wpHN4HkHDt6Bab9xNeTSo9r9X2Em miNNsOTdCt096G+Cj2sS+XHstO+Hr2es+u9+y79hTGrsBu6shqd4XE/TKOsURRGr2alz Nl70SPBQS8A9aMHC6x2m6eYKTi/aOiODbxS3ClgmHbhKP0M10ot9AcdPXFpA3MdtAxPL clJw== X-Gm-Message-State: AOAM533hSzCUY8miAgnYy/ndzzTIsYOtJGtaRDjiddgYCtWDjblZiDFQ pC/iCibt878UW75KtYi4+fcn3ekpi3dDmw== X-Google-Smtp-Source: ABdhPJw2e5MIDDSDLT05P+6rbeelA/eg3GTEVYqIYnfICMd38uW0eFtJshnMSAQm8Q2nhrHFXOztFg== X-Received: by 2002:aed:252c:: with SMTP id v41mr1066678qtc.234.1594669577929; Mon, 13 Jul 2020 12:46:17 -0700 (PDT) Original-Received: from ?IPv6:2601:98a:4200:9210:10bb:28cf:6b95:b288? ([2601:98a:4200:9210:10bb:28cf:6b95:b288]) by smtp.gmail.com with ESMTPSA id j203sm19246254qke.13.2020.07.13.12.46.16 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Mon, 13 Jul 2020 12:46:17 -0700 (PDT) In-Reply-To: X-Mailer: Apple Mail (2.3608.80.23.2.2) Received-SPF: pass client-ip=2607:f8b0:4864:20::831; envelope-from=casouri@gmail.com; helo=mail-qt1-x831.google.com X-detected-operating-system: by eggs.gnu.org: No matching host in p0f cache. That's all we know. X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 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 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Original-Sender: "Emacs-devel" Xref: news.gmane.io gmane.emacs.devel:252924 Archived-At: --Apple-Mail=_24B0C976-E6BA-4C8E-A228-431021CD9916 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=utf-8 I finally figured it out. The problem seems to be the use of the macro = IT_CHAR_HAS_CATEGORY, which is modeled after IT_DISPLAYING_WHITESPACE. = IT_CHAR_HAS_CATEGORY uses a series of ||. I changed it to a function = that uses if =E2=80=A6 else if =E2=80=A6 else (which IMO should be the = correct way to implement it anyway), and the problem went away. Please have a look at the patch and see if it=E2=80=99s ok. If you think = it=E2=80=99s good I can then update NEWS and the manual and submit a bug = report. wrap.txt is the file I used to test word wrapping. To enable the = full feature, set cjk-word-wrap to t and load kinsoku.el. Yuan --Apple-Mail=_24B0C976-E6BA-4C8E-A228-431021CD9916 Content-Disposition: attachment; filename=word-wrap.patch Content-Type: application/octet-stream; x-unix-mode=0644; name="word-wrap.patch" Content-Transfer-Encoding: quoted-printable =46rom=205df09de567796f62472c601afe92df5179f54911=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20Yuan=20Fu=20=0ADate:=20Tue,=20= 26=20May=202020=2022:47:27=20-0400=0ASubject:=20[PATCH]=20Improve=20word=20= wrapping=20for=20CJK=20characters=0A=0A*=20src/xdisp.c=20= (it_char_has_category,=20char_can_wrap_before,=0Achar_can_wrap_after):=20= New=20function.=0A(move_it_in_display_line_to,=20display_line):=20= Replace=0AIT_DISPLAYING_WHITESPACE=20with=20char_can_wrap_before=20and=0A= char_can_wrap_after.=0A(cjk-word-wrap):=20New=20variable.=0A---=0A=20= src/xdisp.c=20|=20169=20= ++++++++++++++++++++++++++++++++++++++++------------=0A=201=20file=20= changed,=20130=20insertions(+),=2039=20deletions(-)=0A=0Adiff=20--git=20= a/src/xdisp.c=20b/src/xdisp.c=0Aindex=20cf15f579b5..3372a8aaa5=20100644=0A= ---=20a/src/xdisp.c=0A+++=20b/src/xdisp.c=0A@@=20-447,6=20+447,7=20@@=20= Copyright=20(C)=201985-1988,=201993-1995,=201997-2020=20Free=20Software=20= Foundation,=0A=20#include=20"termchar.h"=0A=20#include=20"dispextern.h"=0A= =20#include=20"character.h"=0A+#include=20"category.h"=0A=20#include=20= "buffer.h"=0A=20#include=20"charset.h"=0A=20#include=20"indent.h"=0A@@=20= -508,6=20+509,69=20@@=20#define=20IT_DISPLAYING_WHITESPACE(it)=09=09=09=09= =09\=0A=20=09=20=20=20&&=20(*BYTE_POS_ADDR=20(IT_BYTEPOS=20(*it))=20=3D=3D= =20'=20'=09=09=09\=0A=20=09=20=20=20=20=20=20=20||=20*BYTE_POS_ADDR=20= (IT_BYTEPOS=20(*it))=20=3D=3D=20'\t'))))=0A=20=0A+/*=20These=20are=20the=20= category=20sets=20we=20use.=20=20*/=0A+#define=20NOT_AT_EOL=2060=20/*=20= <=20*/=0A+#define=20NOT_AT_BOL=2062=20/*=20>=20*/=0A+#define=20= LINE_BREAKABLE=20124=20/*=20|=20*/=0A+=0A+static=20bool=20= it_char_has_category(struct=20it=20*it,=20int=20cat)=0A+{=0A+=20=20if=20= (it->what=20=3D=3D=20IT_CHARACTER)=0A+=20=20=20=20return=20= CHAR_HAS_CATEGORY=20(it->c,=20cat);=0A+=20=20else=20if=20(STRINGP=20= (it->string))=0A+=20=20=20=20return=20CHAR_HAS_CATEGORY=20(SREF=20= (it->string,=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20IT_STRING_BYTEPOS=20= (*it)),=20cat);=0A+=20=20else=20if=20(it->s)=0A+=20=20=20=20return=20= CHAR_HAS_CATEGORY=20(it->s[IT_BYTEPOS=20(*it)],=20cat);=0A+=20=20else=20= if=20(IT_BYTEPOS=20(*it)=20<=20ZV_BYTE)=0A+=20=20=20=20return=20= CHAR_HAS_CATEGORY=20(*BYTE_POS_ADDR=20(IT_BYTEPOS=20(*it)),=20cat);=0A+=20= =20else=0A+=20=20=20=20return=20false;=0A+}=0A+=0A+/*=20Return=20true=20= if=20the=20current=20character=20allows=20wrapping=20before=20it.=20=20=20= */=0A+static=20bool=20char_can_wrap_before=20(struct=20it=20*it)=0A+{=0A= +=20=20if=20(!Vcjk_word_wrap)=0A+=20=20=20=20return=20= !IT_DISPLAYING_WHITESPACE=20(it);=0A+=0A+=20=20/*=20For=20CJK=20(LTR)=20= text=20in=20RTL=20paragraph,=20EOL=20and=20BOL=20are=20flipped.=20=20*/=0A= +=20=20int=20not_at_bol;=0A+=20=20if=20(it->glyph_row=20&&=20= it->glyph_row->reversed_p)=0A+=20=20=20=20not_at_bol=20=3D=20NOT_AT_EOL;=0A= +=20=20else=0A+=20=20=20=20not_at_bol=20=3D=20NOT_AT_BOL;=0A+=20=20/*=20= You=20cannot=20wrap=20before=20a=20space=20or=20tab=20because=20that=20= way=20you'll=0A+=20=20=20=20=20have=20space=20and=20tab=20at=20the=20= beginning=20of=20next=20line.=20=20*/=0A+=20=20return=20= (!IT_DISPLAYING_WHITESPACE=20(it)=0A+=20=20=20=20=20=20=20=20=20=20//=20= Can=20be=20at=20BOL.=0A+=20=20=20=20=20=20=20=20=20=20&&=20= !it_char_has_category=20(it,=20not_at_bol));=0A+}=0A+=0A+/*=20Return=20= true=20if=20the=20current=20character=20allows=20wrapping=20after=20it.=20= =20=20*/=0A+static=20bool=20char_can_wrap_after=20(struct=20it=20*it)=0A= +{=0A+=20=20if=20(!Vcjk_word_wrap)=0A+=20=20=20=20return=20= IT_DISPLAYING_WHITESPACE=20(it);=0A+=0A+=20=20/*=20For=20CJK=20(LTR)=20= text=20in=20RTL=20paragraph,=20EOL=20and=20BOL=20are=20flipped.=20=20*/=0A= +=20=20int=20not_at_eol;=0A+=20=20if=20(it->glyph_row=20&&=20= it->glyph_row->reversed_p)=0A+=20=20=20=20not_at_eol=20=3D=20NOT_AT_BOL;=0A= +=20=20else=0A+=20=20=20=20not_at_eol=20=3D=20NOT_AT_EOL;=0A+=0A+=20=20= return=20(IT_DISPLAYING_WHITESPACE=20(it)=0A+=20=20=20=20=20=20=20=20=20=20= //=20Can=20break=20after=20&&=20can=20be=20at=20EOL.=0A+=20=20=20=20=20=20= =20=20=20=20=20=20||=20(it_char_has_category=20(it,=20LINE_BREAKABLE)=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20&&=20= !it_char_has_category=20(it,=20not_at_eol)));=0A+}=0A+=0A+#undef=20= IT_DISPLAYING_WHITESPACE=0A+#undef=20NOT_AT_EOL=0A+#undef=20NOT_AT_BOL=0A= +#undef=20LINE_BREAKABLE=0A+=0A=20/*=20If=20all=20the=20conditions=20= needed=20to=20print=20the=20fill=20column=20indicator=20are=0A=20=20=20=20= met,=20return=20the=20(nonnegative)=20column=20number,=20else=20return=20= a=20negative=0A=20=20=20=20value.=20=20*/=0A@@=20-9185,13=20+9249,14=20= @@=20#define=20IT_RESET_X_ASCENT_DESCENT(IT)=09=09=09\=0A=20=09{=0A=20=09= =20=20if=20(it->line_wrap=20=3D=3D=20WORD_WRAP=20&&=20it->area=20=3D=3D=20= TEXT_AREA)=0A=20=09=20=20=20=20{=0A-=09=20=20=20=20=20=20if=20= (IT_DISPLAYING_WHITESPACE=20(it))=0A-=09=09may_wrap=20=3D=20true;=0A-=09=20= =20=20=20=20=20else=20if=20(may_wrap)=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20/*=20Can=20we=20wrap=20here?=20*/=0A+=09=20=20=20=20=20=20if=20= (may_wrap=20&&=20char_can_wrap_before=20(it))=0A=20=09=09{=0A=20=09=09=20= =20/*=20We=20have=20reached=20a=20glyph=20that=20follows=20one=20or=20= more=0A-=09=09=20=20=20=20=20whitespace=20characters.=20=20If=20the=20= position=20is=0A-=09=09=20=20=20=20=20already=20found,=20we=20are=20= done.=20=20*/=0A+=09=09=20=20=20=20=20whitespace=20characters=20or=20a=20= character=20that=20allows=0A+=09=09=20=20=20=20=20wrapping=20after=20it.=20= =20If=20this=20character=20allows=0A+=09=09=20=20=20=20=20wrapping=20= before=20it,=20save=20this=20position=20as=20a=0A+=09=09=20=20=20=20=20= wrapping=20point.=20=20*/=0A=20=09=09=20=20if=20(atpos_it.sp=20>=3D=200)=0A= =20=09=09=20=20=20=20{=0A=20=09=09=20=20=20=20=20=20RESTORE_IT=20(it,=20= &atpos_it,=20atpos_data);=0A@@=20-9206,8=20+9271,17=20@@=20#define=20= IT_RESET_X_ASCENT_DESCENT(IT)=09=09=09\=0A=20=09=09=20=20=20=20}=0A=20=09= =09=20=20/*=20Otherwise,=20we=20can=20wrap=20here.=20=20*/=0A=20=09=09=20= =20SAVE_IT=20(wrap_it,=20*it,=20wrap_data);=0A-=09=09=20=20may_wrap=20=3D=20= false;=0A=20=09=09}=0A+=09=20=20=20=20=20=20/*=20This=20has=20to=20run=20= after=20the=20previous=20block=20because=20the=0A+=09=09=20previous=20= block=20consumes=20`may_wrap'=20and=20this=20block=0A+=09=09=20sets=20= it,=20but=20the=20value=20set=20by=20this=20block=20is=20intended=0A+=09=09= =20for=20the=20_next_=20character/iteration.=20=20*/=0A+=09=20=20=20=20=20= =20if=20(char_can_wrap_after=20(it))=0A+=09=09/*=20may_wrap=20basically=20= means=20"previous=20char=20allows=0A+=09=09=20=20=20wrapping=20after=20= it".=20=20*/=0A+=09=09may_wrap=20=3D=20true;=0A+=09=20=20=20=20=20=20= else=0A+=09=09may_wrap=20=3D=20false;=0A=20=09=20=20=20=20}=0A=20=09}=0A=20= =0A@@=20-9335,10=20+9409,10=20@@=20#define=20= IT_RESET_X_ASCENT_DESCENT(IT)=09=09=09\=0A=20=09=09=09=20=20=20=20{=0A=20= =09=09=09=20=20=20=20=20=20bool=20can_wrap=20=3D=20true;=0A=20=0A-=09=09=09= =20=20=20=20=20=20/*=20If=20we=20are=20at=20a=20whitespace=20character=0A= -=09=09=09=09=20that=20barely=20fits=20on=20this=20screen=20line,=0A-=09=09= =09=09=20but=20the=20next=20character=20is=20also=0A-=09=09=09=09=20= whitespace,=20we=20cannot=20wrap=20here.=20=20*/=0A+=09=09=09=20=20=20=20= =20=20/*=20If=20the=20previous=20character=20says=20we=20can=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20wrap=20after=20it,=20but=20the=20current=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20character=20says=20we=20can't=20wrap=20before=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20it,=20then=20we=20can't=20wrap=20here.=20=20*/=0A=20=09=09=09=20= =20=20=20=20=20if=20(it->line_wrap=20=3D=3D=20WORD_WRAP=0A=20=09=09=09=09= =20=20&&=20wrap_it.sp=20>=3D=200=0A=20=09=09=09=09=20=20&&=20may_wrap=0A= @@=20-9350,7=20+9424,7=20@@=20#define=20IT_RESET_X_ASCENT_DESCENT(IT)=09=09= =09\=0A=20=09=09=09=09=20=20SAVE_IT=20(tem_it,=20*it,=20tem_data);=0A=20=09= =09=09=09=20=20set_iterator_to_next=20(it,=20true);=0A=20=09=09=09=09=20=20= if=20(get_next_display_element=20(it)=0A-=09=09=09=09=20=20=20=20=20=20= &&=20IT_DISPLAYING_WHITESPACE=20(it))=0A+=09=09=09=09=20=20=20=20=20=20= &&=20!char_can_wrap_before=20(it))=0A=20=09=09=09=09=20=20=20=20can_wrap=20= =3D=20false;=0A=20=09=09=09=09=20=20RESTORE_IT=20(it,=20&tem_it,=20= tem_data);=0A=20=09=09=09=09}=0A@@=20-9429,19=20+9503,18=20@@=20#define=20= IT_RESET_X_ASCENT_DESCENT(IT)=09=09=09\=0A=20=09=09=20=20else=0A=20=09=09= =20=20=20=20IT_RESET_X_ASCENT_DESCENT=20(it);=0A=20=0A-=09=09=20=20/*=20= If=20the=20screen=20line=20ends=20with=20whitespace,=20and=20we=0A-=09=09= =20=20=20=20=20are=20under=20word-wrap,=20don't=20use=20wrap_it:=20it=20= is=20no=0A-=09=09=20=20=20=20=20longer=20relevant,=20but=20we=20won't=20= have=20an=20opportunity=0A-=09=09=20=20=20=20=20to=20update=20it,=20= since=20we=20are=20done=20with=20this=20screen=0A-=09=09=20=20=20=20=20= line.=20=20*/=0A+=09=09=20=20/*=20If=20the=20screen=20line=20ends=20with=20= whitespace=20(or=0A+=09=09=20=20=20=20=20wrap-able=20character),=20and=20= we=20are=20under=20word-wrap,=0A+=09=09=20=20=20=20=20don't=20use=20= wrap_it:=20it=20is=20no=20longer=20relevant,=20but=0A+=09=09=20=20=20=20=20= we=20won't=20have=20an=20opportunity=20to=20update=20it,=20since=0A+=09=09= =20=20=20=20=20we=20are=20done=20with=20this=20screen=20line.=20=20*/=0A=20= =09=09=20=20if=20(may_wrap=20&&=20IT_OVERFLOW_NEWLINE_INTO_FRINGE=20(it)=0A= =20=09=09=20=20=20=20=20=20/*=20If=20the=20character=20after=20the=20one=20= which=20set=20the=0A-=09=09=09=20may_wrap=20flag=20is=20also=20= whitespace,=20we=20can't=0A-=09=09=09=20wrap=20here,=20since=20the=20= screen=20line=20cannot=20be=0A-=09=09=09=20wrapped=20in=20the=20middle=20= of=20whitespace.=0A-=09=09=09=20Therefore,=20wrap_it=20_is_=20relevant=20= in=20that=0A-=09=09=09=20case.=20=20*/=0A-=09=09=20=20=20=20=20=20&&=20= !(moved_forward=20&&=20IT_DISPLAYING_WHITESPACE=20(it)))=0A+=09=09=09=20= may_wrap=20flag=20says=20we=20can't=20wrap=20before=20it,=0A+=09=09=09=20= we=20can't=20wrap=20here.=20=20Therefore,=20wrap_it=0A+=09=09=09=20= (previously=20found=20wrap-point)=20_is_=20relevant=0A+=09=09=09=20in=20= that=20case.=20=20*/=0A+=09=09=20=20=20=20=20=20&&=20!(moved_forward=20= &&=20char_can_wrap_before=20(it)))=0A=20=09=09=20=20=20=20{=0A=20=09=09=20= =20=20=20=20=20/*=20If=20we've=20found=20TO_X,=20go=20back=20there,=20as=20= we=20now=0A=20=09=09=09=20know=20the=20last=20word=20fits=20on=20this=20= screen=20line.=20=20*/=0A@@=20-23292,9=20+23365,8=20@@=20#define=20= RECORD_MAX_MIN_POS(IT)=09=09=09=09=09\=0A=20=0A=20=09=20=20if=20= (it->line_wrap=20=3D=3D=20WORD_WRAP=20&&=20it->area=20=3D=3D=20= TEXT_AREA)=0A=20=09=20=20=20=20{=0A-=09=20=20=20=20=20=20if=20= (IT_DISPLAYING_WHITESPACE=20(it))=0A-=09=09may_wrap=20=3D=20true;=0A-=09=20= =20=20=20=20=20else=20if=20(may_wrap)=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20/*=20Can=20we=20wrap=20here?=20*/=0A+=09=20=20=20=20=20=20if=20= (may_wrap=20&&=20char_can_wrap_before=20(it))=0A=20=09=09{=0A=20=09=09=20= =20SAVE_IT=20(wrap_it,=20*it,=20wrap_data);=0A=20=09=09=20=20wrap_x=20=3D=20= x;=0A@@=20-23308,9=20+23380,13=20@@=20#define=20RECORD_MAX_MIN_POS(IT)=09= =09=09=09=09\=0A=20=09=09=20=20wrap_row_min_bpos=20=3D=20min_bpos;=0A=20=09= =09=20=20wrap_row_max_pos=20=3D=20max_pos;=0A=20=09=09=20=20= wrap_row_max_bpos=20=3D=20max_bpos;=0A-=09=09=20=20may_wrap=20=3D=20= false;=0A=20=09=09}=0A-=09=20=20=20=20}=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20/*=20This=20has=20to=20run=20after=20the=20previous=20block.=20= =20*/=0A+=09=20=20=20=20=20=20if=20(char_can_wrap_after=20(it))=0A+=09=09= may_wrap=20=3D=20true;=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20else=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20may_wrap=20=3D=20false;=0A= +=20=20=20=20=20=20=20=20=20=20=20=20}=0A=20=09}=0A=20=0A=20=20=20=20=20=20= =20PRODUCE_GLYPHS=20(it);=0A@@=20-23433,14=20+23509,18=20@@=20#define=20= RECORD_MAX_MIN_POS(IT)=09=09=09=09=09\=0A=20=09=09=09=20=20/*=20If=20= line-wrap=20is=20on,=20check=20if=20a=20previous=0A=20=09=09=09=20=20=20=20= =20wrap=20point=20was=20found.=20=20*/=0A=20=09=09=09=20=20if=20= (!IT_OVERFLOW_NEWLINE_INTO_FRINGE=20(it)=0A-=09=09=09=20=20=20=20=20=20= &&=20wrap_row_used=20>=200=0A+=09=09=09=20=20=20=20=20=20&&=20= wrap_row_used=20>=200=20/*=20Found.=20=20*/=0A=20=09=09=09=20=20=20=20=20= =20/*=20Even=20if=20there=20is=20a=20previous=20wrap=0A=20=09=09=09=09=20= point,=20continue=20the=20line=20here=20as=0A=20=09=09=09=09=20usual,=20= if=20(i)=20the=20previous=20character=0A-=09=09=09=09=20was=20a=20space=20= or=20tab=20AND=20(ii)=20the=0A-=09=09=09=09=20current=20character=20is=20= not.=20=20*/=0A-=09=09=09=20=20=20=20=20=20&&=20(!may_wrap=0A-=09=09=09=09= =20=20||=20IT_DISPLAYING_WHITESPACE=20(it)))=0A+=09=09=09=09=20allows=20= wrapping=20after=20it,=20AND=20(ii)=0A+=09=09=09=09=20the=20current=20= character=20allows=20wrapping=0A+=09=09=09=09=20before=20it.=20=20= Because=20this=20is=20a=20valid=0A+=09=09=09=09=20break=20point,=20we=20= can=20just=20continue=20to=0A+=09=09=09=09=20the=20next=20line=20at=20= here,=20there=20is=20no=0A+=09=09=09=09=20need=20to=20wrap=20early=20at=20= the=20previous=0A+=09=09=09=09=20wrap=20point.=20=20*/=0A+=09=09=09=20=20= =20=20=20=20&&=20(!may_wrap=20||=20!char_can_wrap_before=20(it)))=0A=20=09= =09=09=20=20=20=20goto=20back_to_wrap;=0A=20=0A=20=09=09=09=20=20/*=20= Record=20the=20maximum=20and=20minimum=20buffer=0A@@=20-23468,13=20= +23548,16=20@@=20#define=20RECORD_MAX_MIN_POS(IT)=09=09=09=09=09\=0A=20=09= =09=09=20=20=20=20=20=20/*=20If=20line-wrap=20is=20on,=20check=20if=20a=0A= =20=09=09=09=09=20previous=20wrap=20point=20was=20found.=20=20*/=0A=20=09= =09=09=20=20=20=20=20=20else=20if=20(wrap_row_used=20>=200=0A-=09=09=09=09= =20=20=20=20=20=20=20/*=20Even=20if=20there=20is=20a=20previous=20wrap=0A= -=09=09=09=09=09=20=20point,=20continue=20the=20line=20here=20as=0A-=09=09= =09=09=09=20=20usual,=20if=20(i)=20the=20previous=20character=0A-=09=09=09= =09=09=20=20was=20a=20space=20or=20tab=20AND=20(ii)=20the=0A-=09=09=09=09= =09=20=20current=20character=20is=20not.=20=20*/=0A-=09=09=09=09=20=20=20= =20=20=20=20&&=20(!may_wrap=0A-=09=09=09=09=09=20=20=20||=20= IT_DISPLAYING_WHITESPACE=20(it)))=0A+=09=09=09=09=20=20=20=20=20=20=20/*=20= Even=20if=20there=20is=20a=20previous=0A+=09=09=09=09=09=20=20wrap=20= point,=20continue=20the=0A+=09=09=09=09=09=20=20line=20here=20as=20= usual,=20if=20(i)=0A+=09=09=09=09=09=20=20the=20previous=20character=20= was=20a=0A+=09=09=09=09=09=20=20space=20or=20tab=20AND=20(ii)=20the=0A+=09= =09=09=09=09=20=20current=20character=20is=20not,=0A+=09=09=09=09=09=20=20= AND=20(iii)=20the=20current=0A+=09=09=09=09=09=20=20character=20allows=20= wrapping=0A+=09=09=09=09=09=20=20before=20it.=20=20*/=0A+=09=09=09=09=20=20= =20=20=20=20=20&&=20(!may_wrap=20||=20!char_can_wrap_before=20(it)))=0A=20= =09=09=09=09goto=20back_to_wrap;=0A=20=0A=20=09=09=09=20=20=20=20}=0A@@=20= -34594,6=20+34677,14=20@@=20syms_of_xdisp=20(void)=0A=20If=20`word-wrap'=20= is=20enabled,=20you=20might=20want=20to=20reduce=20this.=20=20*/);=0A=20=20= =20Vtruncate_partial_width_windows=20=3D=20make_fixnum=20(50);=0A=20=0A+=20= =20DEFVAR_BOOL("cjk-word-wrap",=20Vcjk_word_wrap,=0A+=20=20=20=20doc:=20= /*=20=20Non-nil=20means=20wrap=20after=20CJK=20chracters.=0A+Normally=20= when=20word-wrappping=20is=20on,=20Emacs=20only=20breaks=20line=20after=0A= +whitespace=20chracters.=20=20When=20this=20option=20is=20turned=20on,=20= Emacs=20also=0A+breaks=20line=20after=20CJK=20characters.=20=20If=20= kinsoku.el=20is=20loaded,=20Emacs=20also=0A+respects=20kinsoku=20when=20= breaking=20lines.=20=20*/);=0A+=20=20Vcjk_word_wrap=20=3D=20false;=0A+=0A= =20=20=20DEFVAR_LISP=20("line-number-display-limit",=20= Vline_number_display_limit,=0A=20=20=20=20=20doc:=20/*=20Maximum=20= buffer=20size=20for=20which=20line=20number=20should=20be=20displayed.=0A= =20If=20the=20buffer=20is=20bigger=20than=20this,=20the=20line=20number=20= does=20not=20appear=0A--=20=0A2.27.0=0A=0A= --Apple-Mail=_24B0C976-E6BA-4C8E-A228-431021CD9916 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=us-ascii --Apple-Mail=_24B0C976-E6BA-4C8E-A228-431021CD9916 Content-Disposition: attachment; filename=wrap.txt Content-Type: text/plain; x-unix-mode=0644; name="wrap.txt" Content-Transfer-Encoding: base64 UlRMIGluIFJUTAoK2KfZhNir2LnZhNioINin2YTYqNmG2Yog2KfZhNiz2LHZiti5INmK2YLZgdiy INmB2YjZgiDYp9mE2YPZhNioINin2YTZg9iz2YjZhC7Yp9mE2KvYudmE2Kgg2KfZhNio2YbZiiDY p9mE2LPYsdmK2Lkg2YrZgtmB2LIg2YHZiNmCINin2YTZg9mE2Kgg2KfZhNmD2LPZiNmELtin2YTY q9i52YTYqCDYp9mE2KjZhtmKINin2YTYs9ix2YrYuSDZitmC2LIg2YHZiNmCINin2YQg44CK2KfZ hNmD2LPZiCAg2YQu2KfZhNir2LnZhCDjgIsg2Kgg2KfZhNmD2LPZiNmELtin2YTYq9i52YTYqCDY p9mE2KjZhtmKINin2YTYs9ix2YrYuSDZitmC2YHYsgoKTFJUIGluIExSVAoK5Lit5paH5Lit5paH 5Lit5paH5Lit5paH5Lit5paH5Lit5paH5Lit5paH5Lit5paH5Lit5paH5Lit5paH5Lit5paH5Lit 5paH5Lit5paH5Lit5paH77yM5Lit5paH44CK5Lit5paH5Lit5paH44CL5Lit5paH5Lit5paH5Lit 5paH5Lit5paH5Lit5paH5Lit5Lit5paH5Lit5paH5Lit5paH5Lit5paH5Lit5Lit5paH5Lit5paH 5Lit5paH5Lit5paH5Lit5paHCgpMUlQgaW4gUlRMCgrXkNeR15LXkyDXlNeV15bXl9eY15nXm9ea INec157XoNefIOaIkeS7iuWkqeeci+S6huacrOS5pu+8jOaEn+inieaMuuacieaEj+aAne+8jOWQ jeWtl+aYr+OAiumSoumTgeaYr+aAjuagt+eCvOaIkOeahOOAiwoKUlRMIGluIExSVAoK5oiR5LuK 5aSp55yL5LqG5pys5Lmm77yM5oSf6KeJ5oy65pyJ5oSP5oCd77yM5ZCN5a2X5pivINeU15XXlteX 15jXmdeb15og15TXldeW15fXmNeZ15vXmiDXlNeV15bXl9eY15nXm9ea44CK15DXkdeSINeT15TX ldeW15fXmNeZ15vXmiDXlNeV15bXl9eY15nXm9eaINec157XoNef44CLINeU15XXlteX15jXmdeb 15og15TXldeW15fXmNeZ15vXmiDXlNeV15bXl9eY15nXm9eaCg== --Apple-Mail=_24B0C976-E6BA-4C8E-A228-431021CD9916 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=us-ascii --Apple-Mail=_24B0C976-E6BA-4C8E-A228-431021CD9916--