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: Gather a list of confusions beginner tend to have Date: Thu, 10 Sep 2020 19:20:34 -0400 Message-ID: <8620B5CD-CA92-46BF-80A8-DBE7052F4CA6@gmail.com> References: <875z8ortot.fsf@gkayaalp.com> <83lfhjkq0r.fsf@gnu.org> Mime-Version: 1.0 (Mac OS X Mail 13.4 \(3608.120.23.2.1\)) Content-Type: multipart/mixed; boundary="Apple-Mail=_937DC1A3-41CE-4006-9C44-B6136EA58F39" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="31502"; mail-complaints-to="usenet@ciao.gmane.io" Cc: =?utf-8?Q?G=C3=B6ktu=C4=9F_Kayaalp?= , emacs-devel To: Eli Zaretskii Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Fri Sep 11 01:21:16 2020 Return-path: Envelope-to: ged-emacs-devel@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1kGVsS-00083f-DC for ged-emacs-devel@m.gmane-mx.org; Fri, 11 Sep 2020 01:21:16 +0200 Original-Received: from localhost ([::1]:37560 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kGVsR-0002ej-Dt for ged-emacs-devel@m.gmane-mx.org; Thu, 10 Sep 2020 19:21:15 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:42022) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kGVrr-0001x0-SN for emacs-devel@gnu.org; Thu, 10 Sep 2020 19:20:39 -0400 Original-Received: from mail-qt1-x829.google.com ([2607:f8b0:4864:20::829]:44659) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1kGVrp-0001vt-VE; Thu, 10 Sep 2020 19:20:39 -0400 Original-Received: by mail-qt1-x829.google.com with SMTP id e7so6302040qtj.11; Thu, 10 Sep 2020 16:20:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:message-id:mime-version:subject:date:in-reply-to:cc:to :references; bh=7bxxGKdV7hzXyDDrtvHcU/TwjShqBsA7qtgzMCfjZtY=; b=kVLVl3U/cBe7rf0uHzPTUk9S5rY03gro4K0gl/4lyJA8KmrlyMzLKfamPRYBO2u9h2 wHmzrfehUNhFqAkfIIC2Loj1jRrQs2eDm9cWv7lb+R4J0F8nhpPN2nByPUP9DVAqmLLE k+/BGFUnrX6RtxcS0JgTwfkAc8GjYDBYMS3JsnbO8g1vA4NE/QCHvNkfuxr3yy1mw0eb OICykiUKx/ButcBz82iecqB369hUCVrB4yitTnZByFWMRxqVSvYckZr7y7uMoIUu/EYe LvXBEKLfBRoUub8dhWeTtjgBcETuJTOSGc5AcbgacwnH0AOxnzG9yI1juD0K0VpXBHGJ 7UiQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:message-id:mime-version:subject:date :in-reply-to:cc:to:references; bh=7bxxGKdV7hzXyDDrtvHcU/TwjShqBsA7qtgzMCfjZtY=; b=rmOxujCr8eXsHL4rcFO2xpz4oZ7yrtgiS64iiubJ6LbNFjGo6J1ungOJAd7cYikUtE uaNUN6rDZJjboDcv62ALGdEO2k+TAhFzmJrwBI5Yj4H6xntSeYMocYir8X2tqAW7J1ms hwkhoDgJkdRZAEHr252f7E/ilmpXM16s2I2gLFQEIULGmroa0LUpfjnWK4ZoBzQbdE25 pWS/73EX6BKiiyVRwPGpQyvOjgLx8ajZlhXm9B2DRq7D8ICrkw/p8zfml+QBc1cVunhD TGKZlQWjkiSjzYdkUPX1rfyJTum3JHCSxf5i9C0usq1/OZDEWHCRLb3QeI47kslibdOY lV1g== X-Gm-Message-State: AOAM532xUnIglEx7cV3D9UM1Pz55BN8FA0fg69vzD4OKV44qBTB0efZL euXYJJKAqp6Z4J9NXGgy6+Idzu/oBybXnWtQ X-Google-Smtp-Source: ABdhPJy8MBLcZiZixcAdSQwUmSreSKRUI7286Zy6On5SoJdgOwBy7rOCGteEMGyDdJQlm+bOoUsXvQ== X-Received: by 2002:ac8:72d3:: with SMTP id o19mr10446402qtp.190.1599780035675; Thu, 10 Sep 2020 16:20:35 -0700 (PDT) Original-Received: from ?IPv6:2601:98a:4200:9210:2079:6e36:6ee4:49e3? ([2601:98a:4200:9210:2079:6e36:6ee4:49e3]) by smtp.gmail.com with ESMTPSA id z3sm637072qkj.0.2020.09.10.16.20.34 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 10 Sep 2020 16:20:35 -0700 (PDT) In-Reply-To: <83lfhjkq0r.fsf@gnu.org> X-Mailer: Apple Mail (2.3608.120.23.2.1) Received-SPF: pass client-ip=2607:f8b0:4864:20::829; envelope-from=casouri@gmail.com; helo=mail-qt1-x829.google.com X-detected-operating-system: by eggs.gnu.org: No matching host in p0f cache. That's all we know. X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Original-Sender: "Emacs-devel" Xref: news.gmane.io gmane.emacs.devel:255065 Archived-At: --Apple-Mail=_937DC1A3-41CE-4006-9C44-B6136EA58F39 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=utf-8 >=20 > I don't think this scales. Emacs has thousands of options, I'm > guessing hundreds of them are important for the audience you have in > mind. You will get a huge set of many options that people with > "TL;DR" state of mind will never be able to review, let alone decide > what is for them. I think there are a few configurations that a beginner would want to = change right after he starts Emacs, usually very basic settings. If you = think it=E2=80=99s a good idea, I can go to reddit and ask what people = missed when then started using Emacs for the first few minutes.=20 FWIW, here is a demo of the guide: https://youtu.be/0qMskTAR2aw The demo inserts some configurations into ~/.emacs.d/init.el after = completion. >=20 > The grouping of the options must be based on some "themes" or similar, > to be useful. The challenge is, of course, to come up with a useful > list of such "themes", and then decide which options should each theme > enable. Others has described the out-of-the-box experience of doom Emacs, it = seems to me that such job is better done by a =E2=80=9Cdistribution=E2=80=9D= of Emacs than by vanilla Emacs. OTHO, vanilla Emacs could add a tiny = guide like I proposed to more or less improve the life for those who = started Emacs without reading any tutorial on the internet. Yuan --Apple-Mail=_937DC1A3-41CE-4006-9C44-B6136EA58F39 Content-Disposition: attachment; filename=beginner-guide.el Content-Type: application/octet-stream; x-unix-mode=0644; name="beginner-guide.el" Content-Transfer-Encoding: quoted-printable ;;;=20beginner-guide.el=20---=20Beginner=20guide=20for=20Emacs=20=20=20=20= =20=20-*-=20lexical-binding:=20t;=20-*-=0A=0A;;=20Author:=20Yuan=20Fu=20= =0A=0A;;;=20This=20file=20is=20NOT=20part=20of=20GNU=20= Emacs=0A=0A;;;=20Commentary:=0A;;=0A=0A;;;=20Code:=0A;;=0A=0A(require=20= 'widget)=0A=0A(eval-when-compile=0A=20=20(require=20'wid-edit))=0A=0A= (defvar=20beginner-guide--config-intro=0A=20=20";;=20Below=20is=20the=20= configuration=20generated=20by=20the=20beginner=20guide:\n"=0A=20=20= "First=20line=20of=20the=20beginner=20guide=20configuration=20in=20= init.el.")=0A=0A(defvar=20beginner-guide--config-outro=0A=20=20";;=20The=20= configuration=20generated=20by=20the=20beginner=20guide=20ends=20= here.\n"=0A=20=20"Last=20line=20of=20the=20beginner=20guide=20= configuration=20in=20init.el.")=0A=0A(defun=20= beginner-guide--write-config=20(form-list)=0A=20=20"Create=20= ~/.emacs.d/init.el=20and=20write=20FORM-LIST=20into=20it."=0A=20=20= (mkdir=20"~/.emacs.d"=20'no-error)=0A=20=20(let=20((init-file=20= (expand-file-name=20"init.el"=20user-emacs-directory)))=0A=20=20=20=20= (with-current-buffer=20(find-file-noselect=20init-file=20t)=0A=20=20=20=20= =20=20(goto-char=20(point-min))=0A=20=20=20=20=20=20(when=20= (search-forward=20beginner-guide--config-intro=20nil=20t)=0A=20=20=20=20=20= =20=20=20(let=20((beg=20(match-beginning=200)))=0A=20=20=20=20=20=20=20=20= =20=20(when=20(search-forward=20beginner-guide--config-outro=20nil=20t)=0A= =20=20=20=20=20=20=20=20=20=20=20=20(delete-region=20beg=20(point))=0A=20= =20=20=20=20=20=20=20=20=20=20=20(save-buffer))))=0A=20=20=20=20=20=20= (goto-char=20(point-max))=0A=20=20=20=20=20=20(insert=20"\n"=20= beginner-guide--config-intro)=0A=20=20=20=20=20=20(dolist=20(form=20= form-list)=0A=20=20=20=20=20=20=20=20(prin1=20form=20(current-buffer))=0A= =20=20=20=20=20=20=20=20(insert=20"\n"))=0A=20=20=20=20=20=20(insert=20= beginner-guide--config-outro)=0A=20=20=20=20=20=20(save-buffer))))=0A=0A= (defvar=20beginner-guide--config=20nil=0A=20=20"An=20alist=20of=20= configurations=20that=20the=20user=20set=20in=20each=20page.")=0A=0A= (defsubst=20beginner-guide--save-option=20(option=20value)=0A=20=20"Save=20= OPTION=E2=80=99s=20VALUE=20in=20=E2=80=98beginner-guide--config=E2=80=99."= =0A=20=20(setf=20(alist-get=20option=20beginner-guide--config)=20value))=0A= =0A=0A;;;=20Pages=0A=0A;;;;=20Theme=0A=0A(defvar=20= beginner-guide--c-demo=0A=20=20"int=20add=20(int=20x,=20int=20y)=0A{=0A=20= =20return=20x=20+=20y;=0A}=0A=0Aint=20main(int=20arg,=20int*=20argv)=0A{=0A= =20=20int=20x=20=3D=201;=0A=20=20int=20y=20=3D=202;=0A=20=20return=20= add(x,=20y)=20-=203;=0A}=0A"=0A=20=20"Demo=20C=20code.")=0A=0A(defun=20= beginner-guide--theme-page=20()=0A=20=20"Theme=20configuration=20page."=0A= =20=20(let=20((inhibit-read-only=20t))=0A=20=20=20=20(erase-buffer))=0A=20= =20(remove-overlays)=0A=20=20(widget-insert=20"Set=20UI=20theme:\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=20beginner-guide--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=20theme=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;;=20Enable=20the=20theme=20when=20= the=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(mapc=20#'disable-theme=20custom-enabled-themes)=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;;=20Load=20theme.=0A=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20(unless=20(eq=20theme=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(load-theme=20= theme))=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= ;;=20Set=20config.=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20(beginner-guide--save-option=20'theme=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=20= collect=20`(item=20,(symbol-name=20theme)))))=0A=20=20(use-local-map=20= widget-keymap)=0A=20=20(widget-setup))=0A=0A;;;;=20Keybinding=0A=0A= (defun=20beginner-guide--keybinding-page=20()=0A=20=20"Keybinding=20= page."=0A=20=20(widget-insert=20"Keybinding=20notation:=0A=0A=20=20=20=20= C=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=0ASet=20keybinding=20style=20= for=20copy/paste:=0A=0AWe=20encourage=20you=20to=20learn=20the=20default=20= binding,=20because=20the=20alternative=0Abinding=20conflicts=20with=20= many=20parts=20of=20Emacs=20and=20make=20the=20experience=0Aworse=20in=20= the=20long=20run.\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=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(beginner-guide--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= 'keybinding=20(widget-value=20widget)))=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=20= C-y=20=20=20=20=20=20=20=20=20=20=20Paste=0A=20=20=20=20C-w=20=20=20=20=20= =20=20=20=20=20=20Cut=0A=20=20=20=20C-s=20=20=20=20=20=20=20=20=20=20=20= Search=0A=20=20=20=20C-x=20C-s=20=20=20=20=20=20=20Save")=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-v=20=20=20=20=20=20=20=20=20=20=20Paste=0A=20=20= =20=20C-x=20=20=20=20=20=20=20=20=20=20=20Cut=0A=20=20=20=20C-f=20=20=20=20= =20=20=20=20=20=20=20Search=0A=20=20=20=20C-s=20=20=20=20=20=20=20=20=20=20= =20Save")))=0A=0A;;;;=20UI=20features=0A=0A(defun=20= beginner-guide--ui-features-page=20()=0A=20=20"UI=20features=20page."=0A=20= =20(widget-insert=20"Set=20some=20UI=20options:\n\n")=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=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= (global-display-line-numbers-mode=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(if=20val=201=20-1))=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(beginner-guide--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'line-number=20= val)))=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20:value=20= nil)=0A=20=20(widget-insert=20"=20Enable=20line=20numbers.\n")=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=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(setq-default=20cursor-type=0A=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(if=20val=20'bar=20= t))=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(beginner-guide--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= 'thin-cursor=20val)))=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= :value=20nil)=0A=20=20(widget-insert=20"=20Use=20thin=20cursor=20= bar.\n")=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=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(tool-bar-mode=20= (if=20val=20-1=201))=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(beginner-guide--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'disable-tool-bar=20val)))=0A=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20:value=20nil)=0A=20=20(widget-insert=20"=20Disable=20tool=20= bar.\n")=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=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= (scroll-bar-mode=20(if=20val=20-1=201))=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= (beginner-guide--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'disable-scroll-bar=20= val)))=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20:value=20= nil)=0A=20=20(widget-insert=20"=20Disable=20scroll=20bar.\n"))=0A=0A;;;;=20= Undo=0A=0A(defun=20beginner-guide--undo-page=20()=0A=20=20"Undo=20page."=0A= =20=20(widget-insert=0A=20=20=20"Emacs=20has=20a=20powerful=20(but=20= possibly=20unintuitive)=20undo=20system,=20where=0Aundo=20operations=20= themselves=20are=20recorded=20in=20the=20undo=20history,=20and=20redo=0A= is=20done=20by=20undoing=20an=20previous=20undo=20operation.=0A=0ASet=20= undo=20style:\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(beginner-guide--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= 'undo-style=20(widget-value=20widget)))=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=20C-/=20=20=20=20=20=20=20=20=20=20=20Undo")=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=20C-/=20=20=20=20=20=20=20=20=20= =20=20Undo=0A=20=20=20=20C-?=20=20=20=20=20=20=20=20=20=20=20Redo")=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"linear=20with=20alternative=20binding\n\n%d"=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-z=20=20=20=20=20=20=20=20=20=20=20Undo=0A=20=20=20=20= C-S-z=20=20=20=20=20=20=20=20=20Redo")))=0A=0A;;;;=20Guide=0A=0A(defun=20= beginner-guide--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=20Customize=20boilerplate.=0APAGE-LIST=20is=20a=20list=20= of=20setup=20function=20for=20pages=20to=20show=20in=20a=20series.=0A= FINISH-FN=20is=20called=20when=20user=20clicks=20the=20finish=20button."=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\n")=0A=20=20(beginner-guide--insert-step-buttons=20setup-fn=20= page-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=0A(defun=20= beginner-guide--insert-step-buttons=20(page=20page-list=20finish-fn)=0A=20= =20"Insert=20buttons=20that=20go=20to=20previous=20and=20next=20page=20= of=20PAGE.=0APAGE-LIST=20is=20a=20list=20of=20setup=20function=20for=20= pages=20to=20show=20in=20a=20series.=0AInsert=20a=20Button=20that=20= calls=20FINISH-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(widget-insert=20(format=20"%s/%s=20"=20(1+=20= idx)=20(length=20page-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(beginner-guide--with-boilerplate=0A=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20previous-page=20page-list=20= finish-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(beginner-guide--with-boilerplate=0A=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20next-page=20= page-list=20finish-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= "\n")))=0A=0A(defun=20beginner-guide--generate-config=20(config-alist)=0A= =20=20"Generate=20configuration=20code=20from=20CONFIG-ALIST."=0A=20=20= (cl-loop=20for=20option=20in=20'(theme=20keybinding=20line-number=20= thin-cursor=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=20disable-tool-bar=20scroll-bar=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=20undo-style)=0A=20=20=20=20=20=20=20=20=20=20=20= append=0A=20=20=20=20=20=20=20=20=20=20=20(let=20((value=20(alist-get=20= option=20config-alist)))=0A=20=20=20=20=20=20=20=20=20=20=20=20=20(pcase=20= (list=20option=20value)=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (`(theme=20,theme)=20(unless=20(eq=20theme=20'default))=0A=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20`((load-theme=20',theme)))=0A=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20('(keybinding=20"alternative")=0A=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20'((global-set-key=20(kbd=20"C-c")=20= #'kill-ring-save)=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (global-set-key=20(kbd=20"C-v")=20#'yank)=0A=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20(global-set-key=20(kbd=20"C-x")=20#'kill-region)=0A= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(global-set-key=20= (kbd=20"C-f")=20#'isearch-forward)=0A=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20(global-set-key=20(kbd=20"C-s")=20#'save-buffer)))=0A=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20('(line-number=20t)=0A=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20= '((global-display-line-numbers-mode)))=0A=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20('(thin-cursor=20t)=0A=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20'((setq-default=20cursor-type=20'bar)))=0A=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20('(disable-tool-bar=20t)=0A=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20'((tool-bar-mode=20-1)))=0A=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20('(disable-scroll-bar=20t)=0A=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20'((scroll-bar-mode=20-1)))=0A=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20('(undo-style=20"linear")=0A=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20'((global-set-key=20(kbd=20"C-/")=20#'undo-only)=0A= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(global-set-key=20= (kbd=20"C-?")=20#'undo-redo)))=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20('(undo-style=20"alternative")=0A=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20'((global-set-key=20(kbd=20"C-z")=20#'undo-only)=0A=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20(global-set-key=20(kbd=20"C-S-z")=20= #'undo-redo)))=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20))))=0A=0A= (defun=20beginner-guide=20()=0A=20=20"Run=20the=20beginner=20guide."=0A=20= =20(interactive)=0A=20=20(switch-to-buffer=20(get-buffer-create=20= "*beginner=20guide*"))=0A=20=20(setq=20beginner-guide--config=20nil)=0A=20= =20(let=20((page-list=20'(beginner-guide--theme-page=0A=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= beginner-guide--keybinding-page=0A=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20beginner-guide--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= beginner-guide--undo-page)))=0A=20=20=20=20= (beginner-guide--with-boilerplate=0A=20=20=20=20=20(car=20page-list)=20= page-list=0A=20=20=20=20=20(lambda=20()=0A=20=20=20=20=20=20=20= (kill-buffer)=0A=20=20=20=20=20=20=20(with-temp-file=20"~/tmp/init.el"=0A= =20=20=20=20=20=20=20=20=20(let=20((form-list=20= (beginner-guide--generate-config=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=20beginner-guide--config)))=0A=20= =20=20=20=20=20=20=20=20=20=20(mapc=20#'eval=20form-list)=0A=20=20=20=20=20= =20=20=20=20=20=20(beginner-guide--write-config=20form-list)))))))=0A=0A= (provide=20'beginner-guide)=0A=0A;;;=20beginner-guide.el=20ends=20here=0A= --Apple-Mail=_937DC1A3-41CE-4006-9C44-B6136EA58F39 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=us-ascii --Apple-Mail=_937DC1A3-41CE-4006-9C44-B6136EA58F39--