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: 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> <87zgoeo91m.fsf@yahoo.com> <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 , Jean Louis , emacs-devel@gnu.org To: Eli Zaretskii Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Sun Jan 09 23:56:16 2022 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 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 ) 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 ) 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 ) 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." 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:284511 Archived-At: --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=0A= ;;=20Maintainer:=20Yuan=20Fu=20=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= .=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= =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--