From mboxrd@z Thu Jan  1 00:00:00 1970
Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail
From: Yuan Fu <casouri@gmail.com>
Newsgroups: gmane.emacs.devel
Subject: Re: Propose to add setup-wizard.el to ELPA
Date: Sun, 9 Jan 2022 14:54:37 -0800
Message-ID: <64131FC6-A19E-41B5-B636-CD6544140E59@gmail.com>
References: <897ED591-43BC-4029-912A-917E5E9F6930@gmail.com>
 <87czlarhff.fsf@yahoo.com> <5D13C3C0-C4EB-4769-9685-25122DC9B8DC@gmail.com>
 <875yr2rfd1.fsf@yahoo.com> <369E183D-87EC-45AB-8352-9A780006561E@gmail.com>
 <87zgoeps3f.fsf@yahoo.com> <A1AD7B58-F5AC-4CC6-985B-3F7346C91B92@gmail.com>
 <87zgoeo91m.fsf@yahoo.com> <YdgPwol4KK9YpQK0@protected.localdomain>
 <83ee5j68z9.fsf@gnu.org>
Mime-Version: 1.0 (Mac OS X Mail 15.0 \(3693.40.0.1.81\))
Content-Type: multipart/mixed;
 boundary="Apple-Mail=_8FB4727F-8C68-4BAA-9D69-A04D85048E68"
Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214";
	logging-data="10148"; mail-complaints-to="usenet@ciao.gmane.io"
Cc: Po Lu <luangruo@yahoo.com>, Jean Louis <bugs@gnu.support>,
 emacs-devel@gnu.org
To: Eli Zaretskii <eliz@gnu.org>
Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Sun Jan 09 23:56:16 2022
Return-path: <emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org>
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 <emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org>)
	id 1n6h6l-0002Us-4I
	for ged-emacs-devel@m.gmane-mx.org; Sun, 09 Jan 2022 23:56:15 +0100
Original-Received: from localhost ([::1]:46876 helo=lists1p.gnu.org)
	by lists.gnu.org with esmtp (Exim 4.90_1)
	(envelope-from <emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org>)
	id 1n6h6j-0007MQ-NC
	for ged-emacs-devel@m.gmane-mx.org; Sun, 09 Jan 2022 17:56:13 -0500
Original-Received: from eggs.gnu.org ([209.51.188.92]:57124)
 by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.90_1) (envelope-from <casouri@gmail.com>) id 1n6h5H-0006MS-EE
 for emacs-devel@gnu.org; Sun, 09 Jan 2022 17:54:43 -0500
Original-Received: from [2607:f8b0:4864:20::52f] (port=45626
 helo=mail-pg1-x52f.google.com)
 by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.90_1) (envelope-from <casouri@gmail.com>)
 id 1n6h5F-0002eU-OL; Sun, 09 Jan 2022 17:54:43 -0500
Original-Received: by mail-pg1-x52f.google.com with SMTP id f5so9639217pgk.12;
 Sun, 09 Jan 2022 14:54:40 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112;
 h=from:message-id:mime-version:subject:date:in-reply-to:cc:to
 :references; bh=KpuxBrdaQukxKM91Q3JIBaD40Sohs9YYyfA0AUQ+rLA=;
 b=XLbHxheREFjZFnsE4l9RJdpaBT+vYvMwSpSkRPuFjMtR6gWbL5a5gOKTJPLW+qFJSg
 w3XIzyOJULtw1PcZHq7DwnbMAwlIT+vTWaUKJZL4q/soqKh1EyB5HRqqXntR/zSkAvOZ
 /CAOP4fPBFib1tlQEZI9KZ22B3SKpxk/LMf6Y6LkNAOBLIxQDJxWD+9QB5u3yOTlp//8
 jJEXC1JcHY4ucqyi1TEza5+4xtoyBzJXdAWSgzJt6CsL4OKVNLO9Jh799Pb89GDv9aEM
 J+tN17OW11NnNDfIPM7eDWSQide6T2XYDApsih8+U1iHe0264YjYzPj/y5xCU/hbhLCt
 3CsA==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20210112;
 h=x-gm-message-state:from:message-id:mime-version:subject:date
 :in-reply-to:cc:to:references;
 bh=KpuxBrdaQukxKM91Q3JIBaD40Sohs9YYyfA0AUQ+rLA=;
 b=E/PifmkrKY82lEtmKzFahzjwVxFcXk2jyyWrbOcPHHz5SMN2JlDeh+CIIMe2TAdTEe
 C0LyjpSMBh3IyHppbTG9ODcBXIftTVRAirQ1oZdXmKOC/QGVY9BEq+0GggTS/YmcT90J
 TX7AcD3E76mLOOOCm68w2UF/t9QQhNKB77X96Adivvekad4vGV3A+Q2KPbkzLPnIDYGq
 7cO95howerf4Cy96ZBApDVkCYzrn+Jaj5rvBnVBSYZHLeOidKokaxivRnda7whqtvwBM
 uY/4r98tSgECWe6uG03BjN9ABbomDjnRqNRkMy3L7R6G8dc6ZRKeyRlQlHaRRhMpX3r+
 1gnQ==
X-Gm-Message-State: AOAM530rh/QSQUo3NLdL2+FPkfipp5BsV0UVFANPu/qkdofVqwxOBNcm
 0GWkhc/ZP6qwu5XX4RmGEin9KGV3qpg=
X-Google-Smtp-Source: ABdhPJxHW/yMs/1Vvu8xy3g2TOhbEhhWcBHXwM02Ditmawo9rY7yF4/mbaKk+gnWqrxd3j55zaVFvg==
X-Received: by 2002:a05:6a00:2189:b0:4bc:3def:b662 with SMTP id
 h9-20020a056a00218900b004bc3defb662mr48984668pfi.5.1641768879328; 
 Sun, 09 Jan 2022 14:54:39 -0800 (PST)
Original-Received: from smtpclient.apple ([2600:1700:2ec7:8c90:9c7:fb82:7899:9cb5])
 by smtp.gmail.com with ESMTPSA id c19sm4603320pfl.118.2022.01.09.14.54.38
 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128);
 Sun, 09 Jan 2022 14:54:38 -0800 (PST)
In-Reply-To: <83ee5j68z9.fsf@gnu.org>
X-Mailer: Apple Mail (2.3693.40.0.1.81)
X-Host-Lookup-Failed: Reverse DNS lookup failed for 2607:f8b0:4864:20::52f
 (failed)
Received-SPF: pass client-ip=2607:f8b0:4864:20::52f;
 envelope-from=casouri@gmail.com; helo=mail-pg1-x52f.google.com
X-Spam_score_int: -12
X-Spam_score: -1.3
X-Spam_bar: -
X-Spam_report: (-1.3 / 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, RDNS_NONE=0.793, SPF_HELO_NONE=0.001,
 SPF_PASS=-0.001 autolearn=no autolearn_force=no
X-Spam_action: no action
X-BeenThere: emacs-devel@gnu.org
X-Mailman-Version: 2.1.29
Precedence: list
List-Id: "Emacs development discussions." <emacs-devel.gnu.org>
List-Unsubscribe: <https://lists.gnu.org/mailman/options/emacs-devel>,
 <mailto:emacs-devel-request@gnu.org?subject=unsubscribe>
List-Archive: <https://lists.gnu.org/archive/html/emacs-devel>
List-Post: <mailto:emacs-devel@gnu.org>
List-Help: <mailto:emacs-devel-request@gnu.org?subject=help>
List-Subscribe: <https://lists.gnu.org/mailman/listinfo/emacs-devel>,
 <mailto:emacs-devel-request@gnu.org?subject=subscribe>
Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org
Original-Sender: "Emacs-devel"
 <emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org>
Xref: news.gmane.io gmane.emacs.devel:284511
Archived-At: <http://permalink.gmane.org/gmane.emacs.devel/284511>


--Apple-Mail=_8FB4727F-8C68-4BAA-9D69-A04D85048E68
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain;
	charset=utf-8

Ok, I retro-fitted setup-wizard.el to use custom. It works, but more =
black-boxy and IMO not very pretty. I don=E2=80=99t know if I like it.

Yuan


--Apple-Mail=_8FB4727F-8C68-4BAA-9D69-A04D85048E68
Content-Disposition: attachment;
	filename=setup-wizard.el
Content-Type: application/octet-stream;
	x-unix-mode=0644;
	name="setup-wizard.el"
Content-Transfer-Encoding: quoted-printable

;;;=20setup-wizard.el=20---=20Setup=20wizard=20=20-*-=20lexical-binding:=20=
t;=20-*-=0A=0A;;=20Copyright=20(C)=202019-2020=20Free=20Software=20=
Foundation,=20Inc.=0A=0A;;=20Author:=20Yuan=20Fu=20<casouri@gmail.com>=0A=
;;=20Maintainer:=20Yuan=20Fu=20<casouri@gmail.com>=0A;;=20URL:=20=
https://github.com/casouri/setup-wizard=0A;;=20Version:=201.0.0=0A;;=20=
Keywords:=20convenience=0A;;=20Package-Requires:=20((emacs=20"26.0"))=0A=0A=
;;=20This=20file=20is=20part=20of=20GNU=20Emacs.=0A=0A;;=20GNU=20Emacs=20=
is=20free=20software:=20you=20can=20redistribute=20it=20and/or=20modify=0A=
;;=20it=20under=20the=20terms=20of=20the=20GNU=20General=20Public=20=
License=20as=20published=20by=0A;;=20the=20Free=20Software=20Foundation,=20=
either=20version=203=20of=20the=20License,=20or=0A;;=20(at=20your=20=
option)=20any=20later=20version.=0A=0A;;=20GNU=20Emacs=20is=20=
distributed=20in=20the=20hope=20that=20it=20will=20be=20useful,=0A;;=20=
but=20WITHOUT=20ANY=20WARRANTY;=20without=20even=20the=20implied=20=
warranty=20of=0A;;=20MERCHANTABILITY=20or=20FITNESS=20FOR=20A=20=
PARTICULAR=20PURPOSE.=20=20See=20the=0A;;=20GNU=20General=20Public=20=
License=20for=20more=20details.=0A=0A;;=20You=20should=20have=20received=20=
a=20copy=20of=20the=20GNU=20General=20Public=20License=0A;;=20along=20=
with=20GNU=20Emacs.=20=20If=20not,=20see=20=
<https://www.gnu.org/licenses/>.=0A=0A;;;=20Commentary:=0A;;=0A;;=20This=20=
package=20provides=20a=20setup=20wizard=20that=20takes=20a=20user=20=
through=20an=0A;;=20interactive=20interface,=20in=20which=20he=20or=20=
she=20can=20configure=20key=0A;;=20bindings=20schemes,=20UI=20elements,=20=
Fonts,=20packages,=20etc.=0A=0A;;;=20Code:=0A=0A(require=20'widget)=0A=
(require=20'wid-edit)=0A(require=20'pcase)=0A(require=20'seq)=0A(require=20=
'cl-lib)=0A=0A;;;=20Widgets=0A=0A(define-widget=20=
'setup-wizard-number-field=20'editable-field=0A=20=20"Editable=20field=20=
but=20for=20numbers."=0A=20=20:valid-regexp=0A=20=20(rx=20(seq=20(?=20=
(or=20"-"=20"+"))=0A=20=20=20=20=20=20=20=20=20=20=20(*=20digit)=20(?=20=
".")=20(*=20digit)=0A=20=20=20=20=20=20=20=20=20=20=20(?=20(seq=20"e"=20=
(+=20digit)))))=0A=20=20:value-to-internal=0A=20=20(lambda=20(widget=20=
val)=0A=20=20=20=20(number-to-string=20val))=0A=20=20:value-get=0A=20=20=
(lambda=20(widget)=0A=20=20=20=20(string-to-number=20=
(widget-field-value-get=20widget))))=0A=0A;;;=20Custom=0A=0A(defvar=20=
setup-wizard-super-copy-paste-mode-map=0A=20=20(make-sparse-keymap)=0A=20=
=20"Keymap=20for=20=E2=80=98setup-wizard-super-copy-paste-mode=E2=80=99.")=
=0A=0A(define-minor-mode=20setup-wizard-super-copy-paste-mode=0A=20=20=
"Use=20super=20as=20the=20modifier=20for=20cut,=20copy=20and=20paste."=0A=
=20=20:global=20t=0A=20=20:group=20'setup-wizard=0A=20=20(if=20=
setup-wizard-super-copy-paste-mode=0A=20=20=20=20=20=20(progn=0A=20=20=20=
=20=20=20=20=20(keymap-global-set=20"s-c"=20#'kill-ring-save)=0A=20=20=20=
=20=20=20=20=20(keymap-global-set=20"s-x"=20#'kill-region)=0A=20=20=20=20=
=20=20=20=20(keymap-global-set=20"s-v"=20#'yank))=0A=20=20=20=20;;=20=
Global=20map=20doesn=E2=80=99t=20have=20a=20parent,=20but=20using=20=
REMOVE=20is=0A=20=20=20=20;;=20semantically=20correct=20(see=20=
=E2=80=98keymap-unset=E2=80=99=20for=20REMOVE).=0A=20=20=20=20=
(keymap-global-unset=20"s-c"=20t)=0A=20=20=20=20(keymap-global-unset=20=
"s-x"=20t)=0A=20=20=20=20(keymap-global-unset=20"s-v"=20t)))=0A=0A=
(define-minor-mode=20setup-wizard-linear-undo-mode=0A=20=20"Use=20linear=20=
undo=20system."=0A=20=20:global=20t=0A=20=20:group=20'setup-wizard=0A=20=20=
(if=20setup-wizard-linear-undo-mode=0A=20=20=20=20=20=20(global-set-key=20=
[remap=20undo]=20#'undo-only)=0A=20=20=20=20(global-unset-key=20[remap=20=
undo])))=0A=0A(defun=20setup-wizard--set-magic-variable=20(symbol=20=
value)=0A=20=20"Magically=20make=20VALUE=20of=20the=20magic=20variable=20=
SYMBOL=20take=20effect.=0AIf=20VALUE=20is=20nil,=20do=20nothing."=0A=20=20=
(when=20value=0A=20=20=20=20(pcase=20symbol=0A=20=20=20=20=20=20;;=20=
Theme.=0A=20=20=20=20=20=20('setup-wizard-theme-magic=0A=20=20=20=20=20=20=
=20;;=20Don=E2=80=99t=20disable=20other=20themes,=20just=20load=20the=20=
theme.=0A=20=20=20=20=20=20=20(when=20(not=20(eq=20value=20'default))=0A=20=
=20=20=20=20=20=20=20=20(load-theme=20value)))=0A=20=20=20=20=20=20;;=20=
Font.=0A=20=20=20=20=20=20('setup-wizard-font-magic=0A=20=20=20=20=20=20=20=
(set-face-attribute=20'default=20nil=20:family=20value))=0A=20=20=20=20=20=
=20('setup-wizard-variable-font-magic=0A=20=20=20=20=20=20=20=
(set-face-attribute=20'variable-pitch=20nil=20:family=20value))=0A=20=20=20=
=20=20=20('setup-wizard-cjk-font=0A=20=20=20=20=20=20=20(dolist=20=
(charset=20'(kana=20han=20cjk-misc))=0A=20=20=20=20=20=20=20=20=20=
(set-fontset-font=20t=20charset=20(font-spec=20:family=20value))))=0A=20=20=
=20=20=20=20('setup-wizard-font-size-magic=0A=20=20=20=20=20=20=20(when=20=
(>=20value=200)=0A=20=20=20=20=20=20=20=20=20(set-face-attribute=0A=20=20=
=20=20=20=20=20=20=20=20'variable-pitch=20nil=20:height=20(*=2010=20=
value)))))))=0A=0A(defgroup=20setup-wizard=20nil=0A=20=20"A=20wizard=20=
that=20helps=20you=20setup=20Emacs."=0A=20=20:group=20'convenience)=0A=0A=
(defcustom=20setup-wizard-theme-magic=20nil=0A=20=20"A=20magic=20=
variable=20that=20sets=20themes."=0A=20=20:type=20'string=0A=20=20:set=20=
#'setup-wizard--set-magic-variable)=0A=0A;;=20Why=20not=20use=20custom=20=
faces?=20=20Custom=20faces=20requires=20you=20to=20define=20the=0A;;=20=
whole=20face,=20which=20isn=E2=80=99t=20what=20we=20want=20to=20do=20=
here.=0A(defcustom=20setup-wizard-font-magic=20nil=0A=20=20"A=20magic=20=
variable=20that=20sets=20the=20default=20font."=0A=20=20:type=20'string=0A=
=20=20:set=20#'setup-wizard--set-magic-variable)=0A=0A(defcustom=20=
setup-wizard-variable-font-magic=20nil=0A=20=20"A=20magic=20variable=20=
that=20sets=20the=20variable=20font."=0A=20=20:type=20'string=0A=20=20=
:set=20#'setup-wizard--set-magic-variable)=0A=0A(defcustom=20=
setup-wizard-cjk-font-magic=20nil=0A=20=20"A=20magic=20variable=20that=20=
sets=20the=20CJK=20font."=0A=20=20:type=20'string=0A=20=20:set=20=
#'setup-wizard--set-magic-variable)=0A=0A(defcustom=20=
setup-wizard-font-size-magic=20nil=0A=20=20"A=20magic=20variable=20that=20=
sets=20the=20font=20size."=0A=20=20:type=20'integer=0A=20=20:set=20=
#'setup-wizard--set-magic-variable)=0A=0A(defun=20=
setup-wizard--save-option=0A=20=20=20=20(symbol=20exp=20&optional=20now=20=
request=20comment)=0A=20=20"Save=20custom=20option=20SYMBOL=20to=20EXP=20=
with=20NOW,=20REQUEST=20and=20COMMENT.=0AIf=20EXP=20is=20nil,=20this=20=
function=20is=20a=20no-op."=0A=20=20(custom-set-variables=20`(,symbol=20=
',exp=20,now=20,request=20,comment))=0A=20=20=
(setup-wizard--set-magic-variable=20symbol=20exp))=0A=0A;;;=20Pages=0A=0A=
(defun=20setup-wizard--char-displayable-p=20(char)=0A=20=20"Return=20=
non-nil=20if=20we=20can=20display=20CHAR."=0A=20=20;;=20Per=20manual,=20=
=E2=80=98char-displayable-p=E2=80=99=20may=20return=20non-nil=20even=20=
when=0A=20=20;;=20there=20is=20no=20font=20available,=20since=20it=20=
also=20checks=20whether=20the=0A=20=20;;=20coding=20system=20for=20the=20=
text=20terminal=20can=20encode=20the=20character.=0A=20=20;;=0A=20=20;;=20=
=20=20=20=20ASCII=20characters=20are=20always=20displayable.=0A=20=20=
(cond=20((<=20char=20128)=0A=20=20=20=20=20=20=20=20=20t)=0A=20=20=20=20=20=
=20=20=20;;=20Maybe=20there's=20a=20font=20for=20it,=20but=20we=20can't=20=
put=20it=20in=20the=0A=20=20=20=20=20=20=20=20;;=20buffer.=0A=20=20=20=20=
=20=20=20=20((not=20enable-multibyte-characters)=0A=20=20=20=20=20=20=20=20=
=20nil)=0A=20=20=20=20=20=20=20=20(t=20(when-let=20((font-glyph=20=
(internal-char-font=20nil=20char)))=0A=20=20=20=20=20=20=20=20=20=20=20=20=
=20(if=20(consp=20font-glyph)=0A=09=09=20=20=20=20=20=20=20=20=20;;=20On=20=
a=20window=20system,=20a=20character=20is=20displayable=0A=09=09=20=20=20=
=20=20=20=20=20=20;;=20if=20a=20font=20for=20that=20character=20is=20in=20=
the=20default=0A=09=09=20=20=20=20=20=20=20=20=20;;=20face=20of=20the=20=
currently=20selected=20frame.=0A=09=09=20=20=20=20=20=20=20=20=20(car=20=
font-glyph)=0A=09=09=20=20=20=20=20=20=20;;=20On=20a=20text=20terminal=20=
supporting=20glyph=20codes,=20CHAR=20is=0A=09=09=20=20=20=20=20=20=20;;=20=
displayable=20if=20its=20glyph=20code=20is=20nonnegative.=0A=09=09=20=20=20=
=20=20=20=20(<=3D=200=20font-glyph))))))=0A=0A(defun=20=
setup-wizard--insert=20(&rest=20args)=0A=20=20"Insert=20ARGS=20and=20=
replace=20emojis=20if=20they=20can=E2=80=99t=20be=20displayed."=0A=20=20=
(widget-insert=0A=20=20=20(mapconcat=20(lambda=20(text)=0A=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20(if=20(and=20=
(setup-wizard--char-displayable-p=20?=F0=9F=A7=99)=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=
(setup-wizard--char-displayable-p=20?=F0=9F=A7=9A))=0A=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20text=0A=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20(string-replace=0A=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20"=F0=9F=A7=9A"=20"Fairy"=0A=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20(string-replace=0A=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20"=F0=9F=A7=99"=20"Wizard"=20=
text))))=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20args)))=0A=0A;;;;=20=
Themes=0A=0A(defvar=20setup-wizard--c-demo=0A=20=20"=20=20=20=20#include=20=
<stdlib.h>=0A=0A=20=20=20=20struct=20point=0A=20=20=20=20{=0A=20=20=20=20=
=20=20x:=20int;=0A=20=20=20=20=20=20y:=20int;=0A=20=20=20=20};=0A=0A=20=20=
=20=20int=20main(int=20arg,=20int*=20argv)=0A=20=20=20=20{=0A=20=20=20=20=
=20=20int=20x=20=3D=20-1;=0A=20=20=20=20=20=20int=20y=20=3D=202;=0A=20=20=
=20=20=20=20void=20*buf=20=3D=20malloc(sizeof(uin32_t));=0A=20=20=20=20=20=
=20return=20add(x,=20y)=20-=203;=0A=20=20=20=20}=0A"=0A=20=20"Demo=20C=20=
code.")=0A=0A(defun=20setup-wizard--theme-page=20()=0A=20=20"Theme=20=
configuration=20page."=0A=20=20(setup-wizard--insert=0A=20=20=20"=F0=9F=A7=
=9A:=20Heya!=20You=20are=20here=20for=20help=20setting=20up=20your=20=
Emacs,=20right?=0AWizard=20will=20be=20here=20when=20you=20read=20to=20=
the=20next=20line.=0A=0A=F0=9F=A7=99:=20Emacs=20comes=20with=20a=20=
couple=20of=20themes=20built-in,=20which=20are=20shown=0Abelow.=20You=20=
can=20browse=20for=20more=20themes=20online=20or=20in=20the=20package=0A=
manager.=0A=0A=F0=9F=A7=9A:=20Here=20are=20the=20built-in=20themes!=0A=0A=
Theme=20preview:\n\n")=0A=20=20;;=20Insert=20a=20C=20demo.=0A=20=20=
(widget-insert=0A=20=20=20(with-temp-buffer=0A=20=20=20=20=20(insert=20=
setup-wizard--c-demo)=0A=20=20=20=20=20(c-mode)=0A=20=20=20=20=20=
(font-lock-fontify-region=20(point-min)=20(point-max))=0A=20=20=20=20=20=
(buffer-string)))=0A=20=20(widget-insert=20"\n")=0A=20=20;;=20Insert=20=
theme=20selection=20menu.=0A=20=20(apply=20#'widget-create=20=
'radio-button-choice=0A=20=20=20=20=20=20=20=20=20:follow-link=20t=0A=20=20=
=20=20=20=20=20=20=20:value=20"default"=0A=20=20=20=20=20=20=20=20=20;;=20=
Enable=20the=20theme=20when=20the=20user=20selects=20it.=0A=20=20=20=20=20=
=20=20=20=20:notify=20(lambda=20(widget=20&rest=20_)=0A=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20;;=20First=20disable=20other=20=
themes.=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
(dolist=20(theme=20custom-enabled-themes)=0A=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20(disable-theme=20theme))=0A=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20;;=20Enable=20the=20theme.=0A=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(let*=20((theme=20=
(intern=20(widget-value=20widget))))=0A=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20(setup-wizard--save-option=0A=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
'setup-wizard-theme-magic=20theme)))=0A=20=20=20=20=20=20=20=20=20(cons=20=
'(item=20"default")=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
(cl-loop=20for=20theme=20in=20(custom-available-themes)=0A=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20collect=20=
`(item=20,(symbol-name=20theme)))))=0A=20=20(setup-wizard--insert=20=
"\n=F0=9F=A7=9A:=20Want=20to=20")=0A=20=20(widget-create=0A=20=20=20=
'push-button=0A=20=20=20:notify=20(lambda=20(&rest=20_)=0A=20=20=20=20=20=
=20=20=20=20=20=20=20=20(package-refresh-contents)=0A=20=20=20=20=20=20=20=
=20=20=20=20=20=20(list-packages=20t)=0A=20=20=20=20=20=20=20=20=20=20=20=
=20=20(goto-char=20(point-min))=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=
(let=20((inhibit-read-only=20t))=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20(keep-lines=20"-theme")))=0A=20=20=20:value=20"browse=20the=20=
package=20manager=20for=20themes")=0A=20=20(widget-insert=20"?\n"))=0A=0A=
;;;;=20Key=20binding=0A=0A(defun=20setup-wizard--keybinding-page=20()=0A=20=
=20"Keybinding=20page."=0A=20=20(setup-wizard--insert=20"=F0=9F=A7=99:=20=
This=20is=20the=20notation=20for=20modifiers=20in=20Emacs:=0A=0A=20=20=20=
=20C=20(control)=20=20=20Ctrl=0A=20=20=20=20M=20(meta)=20=20=20=20=20=20=
Alt/Option=0A=20=20=20=20s=20(super)=20=20=20=20=20Windows/Command=0A=20=20=
=20=20S=20(shift)=20=20=20=20=20Shift=0A=0A=F0=9F=A7=9A:=20Which=20=
binding=20scheme=20do=20you=20like?\n\n")=0A=20=20(widget-create=20=
'radio-button-choice=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
:follow-link=20t=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
:value=20"Default"=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
:notify=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(lambda=20=
(widget=20&rest=20_)=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20(cua-mode=20-1)=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20(setup-wizard-super-copy-paste-mode=20-1)=0A=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20(pcase=20(widget-value=20widget)=0A=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20("Alternative"=0A=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
(setup-wizard--save-option=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20'cua-mode=20t=20nil=20nil=0A=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20"This=20enables=20the=20=
Alternative=20binding=20scheme"))=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20("Utilize=20the=20super=20key"=0A=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
(setup-wizard--save-option=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20'setup-wizard-super-copy-paste-mode=20t))))=0A=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20'(item=20:value=20=
"Default"=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:format=20"%v\n\n%d\n"=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:doc=20"=20=20=20=20M-w=20=20=20=20=20=20=
=20=20=20=20=20Copy=0A=20=20=20=20C-w=20=20=20=20=20=20=20=20=20=20=20=
Cut=0A=20=20=20=20C-y=20=20=20=20=20=20=20=20=20=20=20Paste")=0A=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20'(item=20:value=20=
"Alternative"=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:format=20"%v\n\n%d\n"=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:doc=20"=20=20=20=20C-c=20=20=20=20=
=20=20=20=20=20=20=20Copy=0A=20=20=20=20C-x=20=20=20=20=20=20=20=20=20=20=
=20Cut=0A=20=20=20=20C-v=20=20=20=20=20=20=20=20=20=20=20Paste")=0A=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20'(item=20:value=20"Utilize=20=
the=20super=20key"=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:format=20"%v\n\n%d\n"=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:doc=20"=20=20=20=20s-c=20=20=20=
=20=20=20=20=20=20=20=20Copy=0A=20=20=20=20s-x=20=20=20=20=20=20=20=20=20=
=20=20Cut=0A=20=20=20=20s-v=20=20=20=20=20=20=20=20=20=20=20Paste"))=0A=20=
=20(setup-wizard--insert=0A=20=20=20"\n=F0=9F=A7=99:=20In=20the=20=
alternative=20binding=20scheme,=20the=20binding=20for=20copy=0Aand=20cut=20=
only=20take=20effect=20when=20some=20text=20is=20selected.=20So=20when=0A=
nothing=20is=20selected,=20they=20are=20still=20normal=20prefix=20=
keys.\n"))=0A=0A;;;;=20UI=20features=0A=0A(defun=20=
setup-wizard--ui-features-page=20()=0A=20=20"UI=20features=20page."=0A=20=
=20(setup-wizard--insert=20"=F0=9F=A7=9A:=20What=20UI=20elements=20do=20=
you=20like?\n\n")=0A=20=20;;=20Line=20numbers.=0A=20=20(widget-create=20=
'checkbox=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20:notify=0A=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(lambda=20(widget=20=
&rest=20_)=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
(let=20((val=20(widget-value=20widget)))=0A=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20(setup-wizard--save-option=0A=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
'global-display-line-numbers-mode=20val)))=0A=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20:value=20global-display-line-numbers-mode)=0A=20=20=
(widget-insert=20"=20Line=20numbers.\n")=0A=20=20;;=20Thin=20cursor.=0A=20=
=20(widget-create=20'checkbox=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20:notify=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
(lambda=20(widget=20&rest=20_)=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20(let=20((val=20(widget-value=20widget)))=0A=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
(setup-wizard--save-option=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20'cursor-type=20(if=20val=20'bar=20t))))=0A=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20:value=20(eq=20cursor-type=20=
'bar))=0A=20=20(widget-insert=20"=20Thin=20cursor=20bar.\n")=0A=20=20;;=20=
Blink=20cursor.=0A=20=20(widget-create=20'checkbox=0A=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20:notify=0A=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20(lambda=20(widget=20&rest=20_)=0A=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20(let=20((val=20(widget-value=20=
widget)))=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
(setup-wizard--save-option=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20'blink-cursor-mode=20val)))=0A=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20:value=20blink-cursor-mode)=0A=20=20=
(widget-insert=20"=20Blink=20cursor.\n")=0A=20=20;;=20=E2=80=98hl-line=E2=80=
=99.=0A=20=20(widget-create=20'checkbox=0A=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20:notify=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20(lambda=20(widget=20&rest=20_)=0A=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20(let=20((val=20(widget-value=20widget)))=0A=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
(setup-wizard--save-option=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20'global-hl-line-mode=20val)))=0A=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20:value=20global-hl-line-mode)=0A=20=20=
(widget-insert=20"=20Highlight=20current=20line.\n")=0A=20=20;;=20Tool=20=
bar.=0A=20=20(widget-create=20'checkbox=0A=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20:notify=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20(lambda=20(widget=20&rest=20_)=0A=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20(let=20((val=20(widget-value=20widget)))=0A=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
(setup-wizard--save-option=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20'tool-bar-mode=20val)))=0A=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20:value=20tool-bar-mode)=0A=20=20(widget-insert=20=
"=20Tool=20bar.\n")=0A=20=20;;=20Menu=20bar.=0A=20=20(widget-create=20=
'checkbox=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20:notify=0A=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(lambda=20(widget=20=
&rest=20_)=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
(let=20((val=20(widget-value=20widget)))=0A=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20(setup-wizard--save-option=0A=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20'menu-bar-mode=20=
val)))=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20:value=20=
menu-bar-mode)=0A=20=20(widget-insert=20"=20Menu=20bar.\n")=0A=20=20;;=20=
Scroll=20bar.=0A=20=20(widget-create=20'checkbox=0A=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20:notify=0A=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20(lambda=20(widget=20&rest=20_)=0A=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20(let=20((val=20(widget-value=20widget)))=0A=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
(setup-wizard--save-option=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20'scroll-bar-mode=20val)))=0A=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20:value=20scroll-bar-mode)=0A=20=20=
(widget-insert=20"=20Scroll=20bar.\n")=0A=20=20;;=20Tab=20width=0A=20=20=
(let=20((width=20(widget-create=20'setup-wizard-number-field=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:size=202=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:value=20tab-width=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=
:format=20"%v=20Tab=20width=20")))=0A=20=20=20=20(widget-create=20=
'push-button=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
:value=20"Apply"=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20:notify=20(lambda=20(&rest=20_)=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(let=20((val=20=
(widget-value=20width)))=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(unless=20(eq=20val=200)=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(setup-wizard--save-option=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'tab-width=20val)))))=0A=20=20=20=20(widget-insert=20"\n"))=0A=0A=20=20=
;;=20Font.=0A=20=20(widget-insert=20"\n")=0A=20=20(let*=20(default-font=0A=
=20=20=20=20=20=20=20=20=20variable-font=0A=20=20=20=20=20=20=20=20=20=
cjk-font=0A=20=20=20=20=20=20=20=20=20font-size=0A=20=20=20=20=20=20=20=20=
=20action=0A=20=20=20=20=20=20=20=20=20(phrase=20"The=20quick=20brown=20=
fox=20jumps=20over=20the=20lazy=20dog.\n"))=0A=20=20=20=20(widget-insert=20=
"Font=20preview:\n\n")=0A=20=20=20=20(widget-insert=20"=20=20=20=20"=20=
phrase)=0A=20=20=20=20(widget-insert=20"=20=20=20=20"=20(propertize=20=
phrase=20'face=20'variable-pitch))=0A=20=20=20=20(widget-insert=20"=20=20=
=20=20=
=E5=A4=A7=E6=BC=A0=E5=AD=A4=E7=83=9F=E7=9B=B4=EF=BC=8C=E9=95=BF=E6=B2=B3=E8=
=90=BD=E6=97=A5=E5=9C=86=E3=80=82=E5=B0=84=E3=81=AF=E6=AD=A3=E3=81=97=E3=81=
=8D=E3=82=92=E5=B7=B1=E3=81=AB=E6=B1=82=E3=82=80=E3=80=82\n\n")=0A=20=20=20=
=20(setq=20default-font=0A=20=20=20=20=20=20=20=20=20=20(widget-create=20=
'editable-field=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:size=2020=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:value=20""=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:format=20"Default=20=
font:=20%v=20\n"))=0A=20=20=20=20(setq=20variable-font=0A=20=20=20=20=20=20=
=20=20=20=20(widget-create=20'editable-field=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:size=2020=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:value=20=
""=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:format=20"Variable-pitch=20font:=20%v=20\n"))=0A=20=20=20=20(setq=20=
cjk-font=0A=20=20=20=20=20=20=20=20=20=20(widget-create=20=
'editable-field=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:size=2020=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:value=20""=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:format=20"CJK=20font:=20=
%v=20\n"))=0A=20=20=20=20(setq=20font-size=0A=20=20=20=20=20=20=20=20=20=20=
(widget-create=20'setup-wizard-number-field=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:size=202=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:value=200=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=
:format=20"Font=20size:=20%v=20\n\n"))=0A=20=20=20=20(setq=20action=0A=20=
=20=20=20=20=20=20=20=20=20(lambda=20(&rest=20_)=0A=20=20=20=20=20=20=20=20=
=20=20=20=20(let*=20((default-font=20(widget-value=20default-font))=0A=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(variable-font=20=
(widget-value=20variable-font))=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20(cjk-font=20(widget-value=20cjk-font))=0A=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20(font-size=20(widget-value=20=
font-size)))=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20(unless=20=
(equal=20default-font=20"")=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20(setup-wizard--save-option=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20'setup-wizard-font-magic=20default-font))=0A=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20(unless=20(equal=20variable-font=20"")=0A=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20(setup-wizard--save-option=0A=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
'setup-wizard-variable-font-magic=20variable-font))=0A=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20(unless=20(equal=20cjk-font=20"")=0A=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20(setup-wizard--save-option=0A=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20'setup-wizard-cjk-font-magic=20=
cjk-font))=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20(unless=20(<=3D=20=
font-size=200)=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
(setup-wizard--save-option=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20'setup-wizard-font-size-magic=20font-size)))))=0A=20=20=20=20=
(widget-create=20'push-button=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20:value=20"Apply=20font=20settings"=0A=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20:notify=20action)=0A=20=20=20=20=
(widget-insert=20"\n")))=0A=0A;;;;=20Undo=0A=0A(defun=20=
setup-wizard--undo-page=20()=0A=20=20"Undo=20page."=0A=20=20=
(setup-wizard--insert=0A=20=20=20"=F0=9F=A7=99:=20Emacs=20has=20a=20=
powerful=20(but=20probably=20unintuitive)=20undo=20system,=0Awhere=20=
undo=20operations=20themselves=20are=20recorded=20in=20the=20undo=0A=
history,=20and=20redo=20is=20done=20by=20undoing=20an=20previous=20undo=20=
operation.=0A=0A=F0=9F=A7=9A:=20Which=20undo=20system=20do=20you=20=
like?\n\n")=0A=20=20(widget-create=20'radio-button-choice=0A=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20:value=20"Default"=0A=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20:follow-lint=20t=0A=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20:notify=20(lambda=20(widget=20&rest=20_)=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(let=20((val=20(widget-value=20widget)))=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(pcase=20=
val=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("Linear"=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=
(setup-wizard--save-option=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=
'setup-wizard-linear-undo-mode=20t))=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("Default"=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(setup-wizard--save-option=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=
'setup-wizard-linear-undo-mode=20nil)))))=0A=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20'(item=20:value=20"Default"=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:format=20"%v\n\n%d\n"=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=
:doc=20"=20=20=20=20One=20undo=20rules=20them=20all")=0A=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20'(item=20:value=20"Linear"=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:format=20=
"%v\n\n%d\n"=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:doc=20"=20=20=20=20Undo=20and=20redo")))=0A=0A;;;;=20Extra=20=
package=0A=0A(defun=20setup-wizard--package-activate=20(package)=0A=20=20=
"Install=20and=20activate=20PACKAGE."=0A=20=20(require=20'package)=0A=20=20=
(unless=20(package-installed-p=20package)=0A=20=20=20=20(package-install=20=
package))=0A=20=20(package-activate=20package)=0A=20=20(require=20=
package))=0A=0A(defun=20setup-wizard--package-page=20()=0A=20=20"Extra=20=
package=20page."=0A=20=20(setup-wizard--insert=0A=20=20=20"=F0=9F=A7=99:=20=
Here=20are=20some=20packages=20that=20I=20always=20install:=0A=0A(=F0=9F=A7=
=9A:=20They=20will=20be=20automatically=20installed=20from=20Internet.=20=
That=0Amight=20take=20a=20while!)\n\n")=0A=20=20;;=20Ivy.=0A=20=20=
(widget-create=20'checkbox=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20:notify=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
(lambda=20(widget=20&rest=20_)=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20(let=20((val=20(widget-value=20widget)))=0A=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
(setup-wizard--package-activate=20'ivy)=0A=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20(setup-wizard--package-activate=20=
'counsel)=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
(custom-set-variables=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20`(enable-recursive-minibuffers=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,val=20nil=20nil=20=
"Recommended=20by=20Wizard=20for=20ivy.")=0A=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20`(ivy-use-selectable-prompt=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,val=20=
nil=20nil=20"Recommended=20by=20Wizard=20for=20ivy")=0A=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
`(ivy-use-virtual-buffers=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,val=20nil=20nil=20"Recommended=20by=20Wizard=20=
for=20ivy"))=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20(setup-wizard--save-option=20'ivy-mode=20val)=0A=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20(setup-wizard--save-option=0A=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
'counsel-mode=20val=20nil=20nil=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20"Recommended=20by=20Wizard=20for=20ivy")))=0A=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20:value=20=
(bound-and-true-p=20ivy-mode))=0A=20=20(widget-insert=0A=20=20=20"=20=
Ivy:=20A=20completion=20package=20that=20makes=20typing=20file=20names,=20=
buffer=0Anames,=20commands,=20etc=20so=20much=20easier.\n")=0A=20=20;;=20=
Company=0A=20=20(widget-create=20'checkbox=0A=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20:notify=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20(lambda=20(widget=20&rest=20_)=0A=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20(let=20((val=20(widget-value=20widget)))=0A=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
(setup-wizard--package-activate=20'company)=0A=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20(setup-wizard--save-option=20=
'company-mode=20val)))=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20:value=20(bound-and-true-p=20company-mode))=0A=20=20(widget-insert=0A=20=
=20=20"=20Company:=20Popup=20completion=20menu=20when=20writing=20=
programs.\n")=0A=20=20(setup-wizard--insert=0A=20=20=20"=F0=9F=A7=99:=20=
Here=20are=20some=20built-in=20packages=20that=20I=20always=20=
enable:\n\n")=0A=20=20;;=20Electric-pair.=0A=20=20(widget-create=20=
'checkbox=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20:notify=0A=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(lambda=20(widget=20=
&rest=20_)=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
(let=20((val=20(widget-value=20widget)))=0A=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20(setup-wizard--save-option=0A=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
'electric-pair-mode=20val)))=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20:value=20electric-pair-mode)=0A=20=20(widget-insert=0A=20=20=20=
"=20Electric-pair-mode:=20Automatically=20closes=20parenthesis\n")=0A=20=20=
(setup-wizard--insert=20"\n=F0=9F=A7=99:=20...\n\n")=0A=20=20=
(setup-wizard--insert=20"=F0=9F=A7=99:=20I=20don=E2=80=99t=20use=20many=20=
packages.\n"))=0A=0A;;;=20The=20wizard=20framework=0A=0A(defun=20=
setup-wizard--with-boilerplate=0A=20=20=20=20(setup-fn=20&optional=20=
page-list=20finish-fn)=0A=20=20"Call=20page=20setup=20function=20=
SETUP-FN=20with=20widget=20boilerplate.=0APAGE-LIST=20is=20a=20list=20of=20=
setup=20function=20for=20pages=20to=20show=20in=20a=0Aseries.=20=
FINISH-FN=20is=20called=20when=20user=20clicks=20the=20finish=20button.=0A=
If=20PAGE-LIST=20or=20FINISH-FN=20are=20nil,=20don=E2=80=99t=20insert=20=
navigation=0Abuttons."=0A=20=20(kill-all-local-variables)=0A=20=20(let=20=
((inhibit-read-only=20t))=0A=20=20=20=20(erase-buffer))=0A=20=20=
(remove-overlays)=0A=20=20(funcall=20setup-fn)=0A=20=20(widget-insert=20=
"\n")=0A=20=20(when=20(and=20page-list=20finish-fn)=0A=20=20=20=20=
(setup-wizard--insert-step-buttons=20setup-fn=20page-list=20finish-fn))=0A=
=20=20(use-local-map=20widget-keymap)=0A=20=20(widget-setup)=0A=20=20=
(goto-char=20(point-min))=0A=20=20(local-set-key=20(kbd=20"q")=20=
#'setup-wizard--quit))=0A=0A(defun=20setup-wizard--quit=20(&rest=20_)=0A=20=
=20"Quite=20the=20wizard."=0A=20=20(interactive)=0A=20=20(kill-buffer)=0A=
=20=20(message=20(with-temp-buffer=0A=20=20=20=20=20=20=20=20=20=20=20=20=
=20(setup-wizard--insert=20"=F0=9F=A7=9A:=20See=20ya!")=0A=20=20=20=20=20=
=20=20=20=20=20=20=20=20(buffer-string))))=0A=0A(defun=20=
setup-wizard--insert-step-buttons=20(page=20page-list=20finish-fn)=0A=20=20=
"Insert=20buttons=20that=20go=20to=20previous=20and=20next=20page=20of=20=
PAGE.=0APAGE-LIST=20is=20a=20list=20of=20setup=20function=20for=20pages=20=
to=20show=20in=20a=20series.=0AInsert=20a=20Button=20that=20calls=20=
FINISH-FN=20at=20the=20last=20page."=0A=20=20(let*=20((idx=20=
(seq-position=20page-list=20page))=0A=20=20=20=20=20=20=20=20=20=
(previous-page=20(if=20(eq=20idx=200)=20nil=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(nth=20(1-=20idx)=20=
page-list)))=0A=20=20=20=20=20=20=20=20=20(next-page=20(nth=20(1+=20idx)=20=
page-list)))=0A=20=20=20=20(setup-wizard--insert=0A=20=20=20=20=20=
(format=20"=F0=9F=A7=9A:=20We=20are=20at=20step=20%s/%s,=20what=E2=80=99s=20=
next?=20"=0A=20=20=20=20=20=20=20=20=20=20=20=20=20(1+=20idx)=20(length=20=
page-list)))=0A=20=20=20=20(when=20previous-page=0A=20=20=20=20=20=20=
(widget-create=0A=20=20=20=20=20=20=20'push-button=0A=20=20=20=20=20=20=20=
:notify=20(lambda=20(&rest=20_)=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20(setup-wizard--with-boilerplate=0A=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20previous-page=20page-list=20finish-fn))=0A=20=20=
=20=20=20=20=20:value=20"Back"))=0A=20=20=20=20(widget-insert=20"=20")=0A=
=20=20=20=20(if=20next-page=0A=20=20=20=20=20=20=20=20(widget-create=0A=20=
=20=20=20=20=20=20=20=20'push-button=0A=20=20=20=20=20=20=20=20=20=
:notify=20(lambda=20(&rest=20_)=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20(setup-wizard--with-boilerplate=0A=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20next-page=20page-list=20=
finish-fn))=0A=20=20=20=20=20=20=20=20=20:value=20"Next")=0A=20=20=20=20=20=
=20(widget-create=0A=20=20=20=20=20=20=20'push-button=0A=20=20=20=20=20=20=
=20:notify=20(lambda=20(&rest=20_)=20(funcall=20finish-fn))=0A=20=20=20=20=
=20=20=20:value=20"Finish"))=0A=20=20=20=20(widget-insert=20"=20")=0A=20=20=
=20=20(widget-create=0A=20=20=20=20=20'push-button=0A=20=20=20=20=20=
:value=20"Quit"=0A=20=20=20=20=20:notify=20#'setup-wizard--quit)=0A=20=20=
=20=20(widget-insert=20"\n")))=0A=0A(defun=20setup-wizard--finish=20()=0A=
=20=20"The=20default=20finish=20function.=0AConstructs=20the=20config=20=
and=20display=20them."=0A=20=20(setup-wizard--with-boilerplate=0A=20=20=20=
(lambda=20()=0A=20=20=20=20=20(custom-save-all)=0A=20=20=20=20=20=
(setup-wizard--insert=0A=20=20=20=20=20=20"=F0=9F=A7=9A:=20All=20done!=20=
Enjoy=20Emacs!\n"))))=0A=0A(defvar=20setup-wizard--pages=20=
'(setup-wizard--theme-page=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=
setup-wizard--keybinding-page=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=
setup-wizard--ui-features-page=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=20setup-wizard--undo-page=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=20setup-wizard--package-page)=0A=20=20"A=20list=20of=20page=20=
functions.")=0A=0A(defun=20setup-wizard=20()=0A=20=20"Run=20the=20setup=20=
wizard."=0A=20=20(interactive)=0A=20=20(switch-to-buffer=20=
(get-buffer-create=20"*mage=20tower*"))=0A=20=20(let=20((page-list=20=
setup-wizard--pages))=0A=20=20=20=20(setup-wizard--with-boilerplate=0A=20=
=20=20=20=20(car=20page-list)=20page-list=0A=20=20=20=20=20=
#'setup-wizard--finish)))=0A=0A;;;=20Backport=0A=0A(unless=20(fboundp=20=
'undo--last-change-was-undo-p)=0A=20=20(defun=20=
undo--last-change-was-undo-p=20(undo-list)=0A=20=20=20=20(while=20(and=20=
(consp=20undo-list)=20(eq=20(car=20undo-list)=20nil))=0A=20=20=20=20=20=20=
(setq=20undo-list=20(cdr=20undo-list)))=0A=20=20=20=20(gethash=20=
undo-list=20undo-equiv-table)))=0A=0A(unless=20(fboundp=20'undo-redo)=0A=20=
=20(defun=20undo-redo=20(&optional=20arg)=0A=20=20=20=20"Undo=20the=20=
last=20ARG=20undos."=0A=20=20=20=20(interactive=20"*p")=0A=20=20=20=20=
(cond=0A=20=20=20=20=20((not=20(undo--last-change-was-undo-p=20=
buffer-undo-list))=0A=20=20=20=20=20=20(user-error=20"No=20undo=20to=20=
undo"))=0A=20=20=20=20=20(t=0A=20=20=20=20=20=20(let*=20((ul=20=
buffer-undo-list)=0A=20=20=20=20=20=20=20=20=20=20=20=20=20(new-ul=0A=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20(let=20((undo-in-progress=20t))=0A=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(while=20(and=20(consp=20=
ul)=20(eq=20(car=20ul)=20nil))=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20(setq=20ul=20(cdr=20ul)))=0A=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20(primitive-undo=20arg=20ul)))=0A=20=20=20=20=20=20=20=20=20=
=20=20=20=20(new-pul=20(undo--last-change-was-undo-p=20new-ul)))=0A=20=20=
=20=20=20=20=20=20(message=20"Redo%s"=20(if=20undo-in-region=20"=20in=20=
region"=20""))=0A=20=20=20=20=20=20=20=20(setq=20this-command=20'undo)=0A=
=20=20=20=20=20=20=20=20(setq=20pending-undo-list=20new-pul)=0A=20=20=20=20=
=20=20=20=20(setq=20buffer-undo-list=20new-ul))))))=0A=0A(unless=20=
(fboundp=20'undo-only)=0A=20=20(defun=20undo-only=20(&optional=20arg)=0A=20=
=20=20=20"Undo=20some=20previous=20changes.=0ARepeat=20this=20command=20=
to=20undo=20more=20changes.=0AA=20numeric=20ARG=20serves=20as=20a=20=
repeat=20count.=0AContrary=20to=20`undo',=20this=20will=20not=20redo=20a=20=
previous=20undo."=0A=20=20=20=20(interactive=20"*p")=0A=20=20=20=20(let=20=
((undo-no-redo=20t))=20(undo=20arg))))=0A=0A(provide=20'setup-wizard)=0A=0A=
;;;=20setup-wizard.el=20ends=20here=0A=0A;;=20Local=20Variables:=0A;;=20=
sentence-end-double-space:=20t=0A;;=20End:=0A=

--Apple-Mail=_8FB4727F-8C68-4BAA-9D69-A04D85048E68--