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: Sun, 19 Jul 2020 12:17:24 -0400 Message-ID: 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> <214EBF50-8BEE-4935-9DE9-526E82F7D85C@gmail.com> <838sfhi6hm.fsf@gnu.org> <3A15EC3E-78EC-40BA-8841-47B3F9749092@gmail.com> <83sgdnh80n.fsf@gnu.org> <641EB401-D146-4EF0-AE92-994822C665AE@gmail.com> Mime-Version: 1.0 (Mac OS X Mail 13.4 \(3608.80.23.2.2\)) Content-Type: multipart/mixed; boundary="Apple-Mail=_9500F856-C938-4153-83E1-17585DFD9962" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="20822"; 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 Sun Jul 19 18:18:01 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 1jxC0m-0005HM-IG for ged-emacs-devel@m.gmane-mx.org; Sun, 19 Jul 2020 18:18:00 +0200 Original-Received: from localhost ([::1]:38648 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jxC0l-0005R2-Kb for ged-emacs-devel@m.gmane-mx.org; Sun, 19 Jul 2020 12:17:59 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:57294) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jxC0G-00050h-2j for emacs-devel@gnu.org; Sun, 19 Jul 2020 12:17:28 -0400 Original-Received: from mail-qk1-x732.google.com ([2607:f8b0:4864:20::732]:38350) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1jxC0E-000238-Ge; Sun, 19 Jul 2020 12:17:27 -0400 Original-Received: by mail-qk1-x732.google.com with SMTP id e13so13165944qkg.5; Sun, 19 Jul 2020 09:17:25 -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=pyBwUS+46fMQzirvApDsYoYyevQ091LNkYZfCdLwtW8=; b=ZZssvRgLnbDcCayce7C+bQ37lpHyVbRHZIq6h9d+73+dT5eKlmjeIzhj0C8v6vlPu0 4HOJ6jgd665ysl8eISPMFCH/x0t6+2cqsi2sDPjyj/wPjdmCNpnaYyYL2ZDqkulpRhXH 1CTT0EMrWYEkJrR4NqqdWc5e0rddPwYPbKL2R65LOJ93gKMVuLD/7ZxekBFl/z4oT9r3 ysKOs0/OiYjChGaayPZxms7jUS9y4Oe1+Hfx8Dz7wqlGxMB+X9qsH1BAFl3yFgEkXAqb Fk+ynKFk6ltfNAT1TqjzBePPsosbd8+qVfy2d90hwS4FCVb0Cw/PVkh4osGM1f/Z9014 HbGA== 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=pyBwUS+46fMQzirvApDsYoYyevQ091LNkYZfCdLwtW8=; b=mWgfAp8ofMFGsG3LA2Fm/VdIPvhmQZTgpXsn9r53b7hIScvGPCq5Kh6oxxvKp3wQ6I 9SeZHgx8swqbOz/nxXw7FErooO7xv7NeaX58HFEUrc/zp5XGitbR9awcaZSrhX3tC+AY P35sukFiTWmLTte/rve8oj74sX3/8YsaXVJOMLqsoNOvN1wcenqHxaw2W/AagNIOYt67 VlW0ym1mskCljb3GzYFgTin2IyP+TmwXpHODeQoohhe7HQ4+vGz6Ye2nNL5zhky0COx7 wsRf/Qh0n6+fdAAfWVYI4KdKUpLkiZ/nkwVFpJUAucs/WMNtag8IWnv1QH7APRqiaxyJ YpTg== X-Gm-Message-State: AOAM532EnqPDAMcKHt3xu01gNUHVQaLXHVHNGpQW/FabjzTOJr7O0WML LO9gW1tKk2TjVlc3R68HYj/nZvqt2dqDBA== X-Google-Smtp-Source: ABdhPJzf5Mp+MJFj68I3fod7Y9/Swg3k5AViwdpveMJWBnPbTWd7U8cOCFuHVxmq5DWYgBU0bVrqVQ== X-Received: by 2002:a37:7147:: with SMTP id m68mr16630562qkc.469.1595175445186; Sun, 19 Jul 2020 09:17:25 -0700 (PDT) Original-Received: from ?IPv6:2601:98a:4200:9210:b1a4:698a:a830:29b1? ([2601:98a:4200:9210:b1a4:698a:a830:29b1]) by smtp.gmail.com with ESMTPSA id z60sm16841531qtc.30.2020.07.19.09.17.24 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Sun, 19 Jul 2020 09:17:24 -0700 (PDT) In-Reply-To: <641EB401-D146-4EF0-AE92-994822C665AE@gmail.com> X-Mailer: Apple Mail (2.3608.80.23.2.2) Received-SPF: pass client-ip=2607:f8b0:4864:20::732; envelope-from=casouri@gmail.com; helo=mail-qk1-x732.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:253109 Archived-At: --Apple-Mail=_9500F856-C938-4153-83E1-17585DFD9962 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=us-ascii (And here is the new patch, sorry) Yuan --Apple-Mail=_9500F856-C938-4153-83E1-17585DFD9962 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=2045978ed9703ea7e0d4a94c06ba77786795e671a8=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=0ANote=20about=20the=20change=20= around=20line=209257=20and=2023372:=0A=0ABefore,=20the=20test=20for=20= whitespace=20checks=20for=20can_wrap_before=20and=0Acan_wrap_after=20= simutaniously.=20=20Now=20we=20separate=20these=20two=20checks,=20and=0A= the=20logic=20needs=20to=20change=20a=20little=20bit.=20=20However,=20= when=20we=20don't=20enable=0Athe=20new=20wrapping=20feature,=20= 'can_wrap_after'=20is=20equivalent=20to=0A'IT_DISPLAYING_WHITESPACE'=20= and=20'can_wrap_before'=20is=20equivalent=20to=0A= '!IT_DISPLAYING_WHITESPACE'.=20=20And=20the=20new=20logic=20is=20= equivalent=20with=20the=0Aold=20one=20in=20that=20case.=0A=0AOld=20= logic:=0A=0A=20=20=20=20if=20(whitespace)=20/*=20Which=20means=20can=20= wrap=20after=20&&=20can't=20wrap=0A=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20before.=20=20*/=0A=20=20=20=20=20=20= may_wrap=20=3D=20true;=0A=0A=20=20=20=20else=20if=20(may_wrap)=20/*=20= aka=20(!whitespace=20&&=20may_wrap)=0A=20=20=20=20=20=20(set=20wrap=20= point)=20=20*=20aka=20(can't=20wrap=20after=20&&=20can=20wrap=20before=0A= =20=20=20=20=20=20may_wrap=20=3D=20false=20=20*=20=20=20=20=20=20&&=20= may_wrap)=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*/=0A=0ANew=20logic:=0A=0A=20=20=20=20if=20(can_wrap_after)=0A=20= =20=20=20=20=20next_may_wrap=20=3D=20true=0A=20=20=20=20else=0A=20=20=20=20= =20=20next_may_wrap=20=3D=20false;=0A=0A=20=20=20=20if=20(may_wrap=20&&=20= can_wrap_before)=0A=20=20=20=20=20=20(set=20wrap=20point)=0A=0A=20=20=20=20= /*=20Update=20may_wrap.=20=20*/=0A=20=20=20=20may_wrap=20=3D=20= next_may_wrap;=0A=0A*=20src/xdisp.c=20(it_char_has_category,=20= char_can_wrap_before,=0Achar_can_wrap_after):=20New=20functions.=0A= (move_it_in_display_line_to,=20display_line):=20Replace=0A= 'IT_DISPLAYING_WHITESPACE'=20with=20either=20'char_can_wrap_before'=20or=0A= 'char_can_wrap_after'.=0A(cjk-word-wrap):=20New=20variable.=0A---=0A=20= src/xdisp.c=20|=20182=20= +++++++++++++++++++++++++++++++++++++++++-----------=0A=201=20file=20= changed,=20144=20insertions(+),=2038=20deletions(-)=0A=0Adiff=20--git=20= a/src/xdisp.c=20b/src/xdisp.c=0Aindex=20cf15f579b5..be0f6e6a75=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,77=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=20They=20are=20defined=20by=0A+=20=20=20= kinsoku.el.=20=20*/=0A+#define=20NOT_AT_EOL=20'<'=0A+#define=20= NOT_AT_BOL=20'>'=0A+#define=20LINE_BREAKABLE=20'|'=0A+=0A+static=20bool=20= it_char_has_category(struct=20it=20*it,=20int=20cat)=0A+{=0A+=20=20int=20= ch=20=3D=200;=0A+=20=20if=20(it->what=20=3D=3D=20IT_CHARACTER)=0A+=20=20=20= =20ch=20=3D=20it->c;=0A+=20=20else=20if=20(STRINGP=20(it->string))=0A+=20= =20=20=20ch=20=3D=20SREF=20(it->string,=20IT_STRING_BYTEPOS=20(*it));=0A= +=20=20else=20if=20(it->s)=0A+=20=20=20=20ch=20=3D=20it->s[IT_BYTEPOS=20= (*it)];=0A+=20=20else=20if=20(IT_BYTEPOS=20(*it)=20<=20ZV_BYTE)=0A+=20=20= =20=20ch=20=3D=20*BYTE_POS_ADDR=20(IT_BYTEPOS=20(*it));=0A+=0A+=20=20if=20= (ch=20=3D=3D=200)=0A+=20=20=20=20return=20false;=0A+=20=20else=0A+=20=20=20= =20return=20CHAR_HAS_CATEGORY=20(ch,=20cat);=0A+}=0A+=0A+/*=20Return=20= true=20if=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.=0A+=20=20= =20=20=20Because=20in=20RTL=20paragraph,=20each=20glyph=20is=20prepended=20= to=20the=20last=0A+=20=20=20=20=20one,=20effectively=20drawing=20right=20= to=20left.=20=20*/=0A+=20=20int=20not_at_bol;=0A+=20=20if=20= (it->glyph_row=20&&=20it->glyph_row->reversed_p)=0A+=20=20=20=20= not_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/*=20You=20cannot=20wrap=20before=20a=20space=20= or=20tab=20because=20that=20way=20you'll=0A+=20=20=20=20=20have=20space=20= and=20tab=20at=20the=20beginning=20of=20next=20line.=20=20*/=0A+=20=20= return=20(!IT_DISPLAYING_WHITESPACE=20(it)=0A+=09=20=20/*=20Can=20be=20= at=20BOL.=20=20*/=0A+=09=20=20&&=20!it_char_has_category=20(it,=20= not_at_bol));=0A+}=0A+=0A+/*=20Return=20true=20if=20the=20current=20= character=20allows=20wrapping=20after=20it.=20=20=20*/=0A+static=20bool=20= char_can_wrap_after=20(struct=20it=20*it)=0A+{=0A+=20=20if=20= (!Vcjk_word_wrap)=0A+=20=20=20=20return=20IT_DISPLAYING_WHITESPACE=20= (it);=0A+=0A+=20=20/*=20For=20CJK=20(LTR)=20text=20in=20RTL=20paragraph,=20= EOL=20and=20BOL=20are=20flipped.=0A+=20=20=20=20=20Because=20in=20RTL=20= paragraph,=20each=20glyph=20is=20prepended=20to=20the=20last=0A+=20=20=20= =20=20one,=20effectively=20drawing=20right=20to=20left.=20=20*/=0A+=20=20= int=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+=09=20=20/*=20Can=20break=20= after=20&&=20can=20be=20at=20EOL.=20=20*/=0A+=09=20=20||=20= (it_char_has_category=20(it,=20LINE_BREAKABLE)=0A+=09=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+9257,20=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=20bool=20next_may_wrap=20=3D=20may_wrap;=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20/*=20Can=20we=20wrap=20after=20this=20character?=20=20= */=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20if=20= (char_can_wrap_after=20(it))=0A+=09=09next_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=20next_may_wrap=20=3D=20false;=0A+=09=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=20= have=20reached=20a=20glyph=20that=20follows=20one=20or=20more=0A-=09=09=20= =20=20=20=20whitespace=20characters.=20=20If=20the=20position=20is=0A-=09= =09=20=20=20=20=20already=20found,=20we=20are=20done.=20=20*/=0A+=09=09=20= =20=20=20=20whitespace=20characters=20or=20a=20character=20that=20allows=0A= +=09=09=20=20=20=20=20wrapping=20after=20it.=20=20If=20this=20character=20= allows=0A+=09=09=20=20=20=20=20wrapping=20before=20it,=20save=20this=20= position=20as=20a=0A+=09=09=20=20=20=20=20wrapping=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+9285,10=20@@=20#define=20IT_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=20= wrap=20here.=20=20*/=0A=20=09=09=20=20SAVE_IT=20(wrap_it,=20*it,=20= wrap_data);=0A-=09=09=20=20may_wrap=20=3D=20false;=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20next_may_wrap=20=3D=20false;=0A=20=09=09= }=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20/*=20Update=20may_wrap=20= for=20the=20next=20iteration.=20=20*/=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20may_wrap=20=3D=20next_may_wrap;=0A=20=09=20=20=20=20}=0A=20=09}=0A= =20=0A@@=20-9335,10=20+9416,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+=09=09=09= =09=20wrap=20after=20it,=20but=20the=20current=0A+=09=09=09=09=20= character=20says=20we=20can't=20wrap=20before=0A+=09=09=09=09=20it,=20= then=20we=20can't=20wrap=20here.=20=20*/=0A=20=09=09=09=20=20=20=20=20=20= if=20(it->line_wrap=20=3D=3D=20WORD_WRAP=0A=20=09=09=09=09=20=20&&=20= wrap_it.sp=20>=3D=200=0A=20=09=09=09=09=20=20&&=20may_wrap=0A@@=20= -9350,7=20+9431,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+9510,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+23372,14=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=20bool=20next_may_wrap=20=3D=20may_wrap;=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20/*=20Can=20we=20wrap=20after=20this=20character?=20=20= */=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20if=20= (char_can_wrap_after=20(it))=0A+=09=09next_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=20next_may_wrap=20=3D=20false;=0A+=09=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=20x;=0A@@=20= -23308,8=20+23393,9=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=20= wrap_row_max_pos=20=3D=20max_pos;=0A=20=09=09=20=20wrap_row_max_bpos=20=3D= =20max_bpos;=0A-=09=09=20=20may_wrap=20=3D=20false;=0A=20=09=09}=0A+=09=20= =20=20=20=20=20/*=20Update=20may_wrap=20for=20the=20next=20iteration.=20=20= */=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20may_wrap=20=3D=20= next_may_wrap;=0A=20=09=20=20=20=20}=0A=20=09}=0A=20=0A@@=20-23433,14=20= +23519,18=20@@=20#define=20RECORD_MAX_MIN_POS(IT)=09=09=09=09=09\=0A=20=09= =09=09=20=20/*=20If=20line-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= +23558,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+34687,19=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=20also=20wrap=20after=20all=20CJK=20characters.=0A= +Normally=20when=20word-wrapping=20is=20on,=20Emacs=20only=20breaks=20= line=20after=0A+whitespace=20characters.=20=20When=20this=20option=20is=20= turned=20on,=20Emacs=20also=0A+breaks=20line=20after=20CJK=20characters=20= (more=20accurately,=20characters=20that=0A+have=20"|"=20category=20= defined=20in=20characters.el).=0A+=0A+If=20kinsoku.el=20is=20loaded,=20= Emacs=20also=20respects=20kinsoku=20rules=20when=0A+breaking=20lines.=20=20= That=20means=20some=20characters=20don't=20appear=20at=20the=0A= +beginning=20of=20a=20line=20(e.g.,=20FULLWIDTH=20COMMA),=20and=20some=20= don't=20appear=20at=0A+the=20end=20of=20a=20line=20(e.g.,=20LEFT=20= DOUBLE=20ANGLE=20BRACKET).=20=20*/);=0A+=20=20Vcjk_word_wrap=20=3D=20= false;=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=_9500F856-C938-4153-83E1-17585DFD9962--