emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

feature/android 5f389f4b634: Merge remote-tracking branch 'origin/master


From: Po Lu
Subject: feature/android 5f389f4b634: Merge remote-tracking branch 'origin/master' into feature/android
Date: Tue, 25 Apr 2023 20:49:44 -0400 (EDT)

branch: feature/android
commit 5f389f4b634c0dff4a3684e132280775f0ad3752
Merge: 9043bef65f9 d07815a7cc3
Author: Po Lu <luangruo@yahoo.com>
Commit: Po Lu <luangruo@yahoo.com>

    Merge remote-tracking branch 'origin/master' into feature/android
---
 admin/authors.el                   |    2 +-
 configure.ac                       |   50 +-
 doc/lispref/commands.texi          |   11 +
 etc/HELLO                          |    4 +-
 etc/NEWS                           |   11 +
 etc/NEWS.29                        |   22 +-
 etc/tutorials/TUTORIAL             |    2 +-
 etc/tutorials/TUTORIAL.fa          | 1169 ++++++++++++++++++++++++++++++++++++
 etc/tutorials/TUTORIAL.translators |    4 +
 leim/MISC-DIC/CTLau-b5.html        |    4 +-
 lisp/international/characters.el   |   10 +
 lisp/international/fontset.el      |    2 +
 lisp/language/cyrillic.el          |   10 +
 lisp/language/misc-lang.el         |   29 +-
 lisp/ldefs-boot.el                 |  254 ++++----
 lisp/net/eww.el                    |   28 +-
 lisp/org/ob-R.el                   |    5 +-
 lisp/org/ob-js.el                  |    5 +-
 lisp/org/oc.el                     |    4 +-
 lisp/org/org-version.el            |    2 +-
 lisp/org/org.el                    |   23 +-
 lisp/org/ox-latex.el               |    4 +-
 lisp/tab-bar.el                    |   11 +-
 lisp/tutorial.el                   |    1 +
 src/fns.c                          |   35 +-
 src/treesit.c                      |   24 +-
 26 files changed, 1537 insertions(+), 189 deletions(-)

diff --git a/admin/authors.el b/admin/authors.el
index 147282a99a2..f1c988cc776 100644
--- a/admin/authors.el
+++ b/admin/authors.el
@@ -182,7 +182,7 @@ files.")
     ("Philip Kaludercic" "Philip K\\." "Philip K")
     ("Philipp Stephani" "Philipp .*phst@google")
     ("Piotr Zieliński" "Piotr Zielinski")
-    ("Po Lu" "Po Lu Via")               ; looks like a mistake
+    ("Po Lu" "Po Lu Via" "Your Name")   ; looks like a mistake
     ("Przemysław Wojnowski" "Przemyslaw Wojnowski")
     ("R. Bernstein" "rb@dustyfeet.com")
     ("Rainer Schöpf" "Rainer Schoepf")
diff --git a/configure.ac b/configure.ac
index ff6c796e1be..253a8c3e236 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1599,7 +1599,7 @@ AC_ARG_ENABLE([gcc-warnings],
    # however, if there is also a .tarball-version file it is probably
    # just a release imported into Git for patch management.
    gl_gcc_warnings=no
-   if test -e "$srcdir"/.git && test ! -f "$srcdir"/.tarball-version; then
+   if test -d "$srcdir"/.git && test ! -f "$srcdir"/.tarball-version; then
       # Clang typically identifies itself as GCC 4.2 or something similar
       # even if it is recent enough to accept the warnings we enable.
       AS_IF([test "$emacs_cv_clang" = yes],
@@ -2734,31 +2734,23 @@ if test "${with_ns}" != no; then
      ns_appresdir=${ns_appdir}/Contents/Resources
      ns_appsrc=Cocoa/Emacs.base
      ns_fontfile=macfont.o
-  elif flags=$( (gnustep-config --objc-flags) 2>/dev/null); then
+  elif flags=`(gnustep-config --objc-flags) 2>/dev/null`; then
      NS_IMPL_GNUSTEP=yes
      NS_GNUSTEP_CONFIG=yes
      GNU_OBJC_CFLAGS="$flags"
-     LIBS_GNUSTEP=$(gnustep-config --gui-libs) || exit
+     LIBS_GNUSTEP=`gnustep-config --gui-libs || exit`
   elif test -f $GNUSTEP_CONFIG_FILE; then
      NS_IMPL_GNUSTEP=yes
      dnl FIXME sourcing this several times in subshells seems inefficient.
-     GNUSTEP_SYSTEM_HEADERS=$(
-       . $GNUSTEP_CONFIG_FILE
-       AS_ECHO(["$GNUSTEP_SYSTEM_HEADERS"])
-     )
-     GNUSTEP_SYSTEM_LIBRARIES=$(
-       . $GNUSTEP_CONFIG_FILE
-       AS_ECHO(["$GNUSTEP_SYSTEM_LIBRARIES"])
-     )
+     GNUSTEP_SYSTEM_HEADERS=`. $GNUSTEP_CONFIG_FILE \
+       && AS_ECHO(["$GNUSTEP_SYSTEM_HEADERS"])`
+     GNUSTEP_SYSTEM_LIBRARIES=` . $GNUSTEP_CONFIG_FILE \
+       && AS_ECHO(["$GNUSTEP_SYSTEM_LIBRARIES"])`
      dnl I seemed to need these as well with GNUstep-startup 0.25.
-     GNUSTEP_LOCAL_HEADERS=$(
-       . $GNUSTEP_CONFIG_FILE
-       AS_ECHO(["$GNUSTEP_LOCAL_HEADERS"])
-     )
-     GNUSTEP_LOCAL_LIBRARIES=$(
-       . $GNUSTEP_CONFIG_FILE
-       AS_ECHO(["$GNUSTEP_LOCAL_LIBRARIES"])
-     )
+     GNUSTEP_LOCAL_HEADERS=`. $GNUSTEP_CONFIG_FILE \
+       && AS_ECHO(["$GNUSTEP_LOCAL_HEADERS"])`
+     GNUSTEP_LOCAL_LIBRARIES=`. $GNUSTEP_CONFIG_FILE \
+       && AS_ECHO(["$GNUSTEP_LOCAL_LIBRARIES"])`
      test "x${GNUSTEP_LOCAL_HEADERS}" != "x" && \
        GNUSTEP_LOCAL_HEADERS="-I${GNUSTEP_LOCAL_HEADERS}"
      test "x${GNUSTEP_LOCAL_LIBRARIES}" != "x" && \
@@ -4523,7 +4515,7 @@ if test "${HAVE_X11}" = "yes"; then
          AC_DEFINE([HAVE_OTF_GET_VARIATION_GLYPHS], [1],
                    [Define to 1 if libotf has OTF_get_variation_glyphs.])
        fi
-       if ! $PKG_CONFIG --atleast-version=0.9.16 libotf; then
+       if $PKG_CONFIG --atleast-version=0.9.16 libotf; then :; else
          AC_DEFINE([HAVE_OTF_KANNADA_BUG], [1],
 [Define to 1 if libotf is affected by https://debbugs.gnu.org/28110.])
        fi
@@ -4637,7 +4629,7 @@ if test "${HAVE_BE_APP}" = "yes"; then
          AC_DEFINE([HAVE_OTF_GET_VARIATION_GLYPHS], [1],
                    [Define to 1 if libotf has OTF_get_variation_glyphs.])
        fi
-       if ! $PKG_CONFIG --atleast-version=0.9.16 libotf; then
+       if $PKG_CONFIG --atleast-version=0.9.16 libotf; then :; else
          AC_DEFINE([HAVE_OTF_KANNADA_BUG], [1],
 [Define to 1 if libotf is affected by https://debbugs.gnu.org/28110.])
        fi
@@ -4963,7 +4955,7 @@ module_env_snippet_27="$srcdir/src/module-env-27.h"
 module_env_snippet_28="$srcdir/src/module-env-28.h"
 module_env_snippet_29="$srcdir/src/module-env-29.h"
 module_env_snippet_30="$srcdir/src/module-env-30.h"
-emacs_major_version="${PACKAGE_VERSION%%.*}"
+emacs_major_version=`AS_ECHO([$PACKAGE_VERSION]) | sed 's/[[.]].*//'`
 AC_SUBST([emacs_major_version])
 
 ### Emacs Lisp native compiler support
@@ -5073,14 +5065,16 @@ if test "${with_native_compilation}" != "no"; then
         # available.  (We filter out the gcc4 packages, because they
         # don't support jit, and they have names like "gcc49" that
         # sort later than "gcc11".)
-        PORT_PACKAGE=$(port installed active | grep '^ *gcc@<:@0-9@:>@* ' | \
+        PORT_PACKAGE=`port installed active | grep '^ *gcc@<:@0-9@:>@* ' | \
                             awk '{ print $1; }' | grep -v 'gcc4@<:@0-9@:>@' | \
-                            sort -V | tail -n 1)
+                            sort -V | tail -n 1`
         if test -n "$PORT_PACKAGE"; then
-          MAC_CFLAGS="-I$(dirname $(port contents $PORT_PACKAGE | \
-                                           grep libgccjit.h))"
-          MAC_LIBS="-L$(dirname $(port contents $PORT_PACKAGE | \
-                                              grep libgccjit.dylib))"
+         emacs_val=`port contents $PORT_PACKAGE | grep libgccjit.h`
+         emacs_val=`dirname $emacs_val`
+          MAC_CFLAGS="-I$emacs_val"
+         emacs_val=`port contents $PORT_PACKAGE | grep libgccjit.dylib`
+         emacs_val=`dirname $emacs_val`
+          MAC_LIBS="-L$emacs_val"
         fi
       fi
 
diff --git a/doc/lispref/commands.texi b/doc/lispref/commands.texi
index e199000514d..b3584b0caa0 100644
--- a/doc/lispref/commands.texi
+++ b/doc/lispref/commands.texi
@@ -2504,6 +2504,17 @@ as @code{set-language-environment}), use the
 ;; Get the full localized name of the language
 (w32-get-locale-info language-id t)
 @end smallexample
+
+@cindex @code{end-session} event
+@item end-session
+This event is generated on MS-Windows when the operating system
+informs Emacs that the user terminated the interactive session, or
+that the system is shutting down.  The standard definition of this
+event is to invoke the @code{kill-emacs} command (@pxref{Killing
+Emacs}) so as to shut down Emacs in an orderly fashion; if there are
+unsaved changes, this will produce auto-save files
+(@pxref{Auto-Saving}) that the user can use after restarting the
+session to restore the unsaved edits.
 @end table
 
   If one of these events arrives in the middle of a key sequence---that
diff --git a/etc/HELLO b/etc/HELLO
index 25a572e5f1f..a589e69bf03 100644
--- a/etc/HELLO
+++ b/etc/HELLO
@@ -89,7 +89,9 @@ Mathematics   ∀ p ∈ world • hello p  □
 Meetei Mayek (ꯃꯤꯇꯩ ꯃꯌꯦꯛ)       ꯈꯨꯔꯨꯝꯖꯔꯤ
 Mende Kikakui (𞠀𞠁𞠂)    𞠛𞠉
 Modi (𑘦𑘻𑘚𑘲)    𑘡𑘦𑘭𑘿𑘎𑘰𑘨
-Mongolian (монгол хэл) Сайн байна уу?
+Mongolian Cyrillic (монгол хэл)        Сайн байна уу?
+Mongolian Traditional (ᠮᠣᠩᠭᠣᠯ ᠪᠢᠴᠢᠭ᠋)  ᠰᠠᠶᠢᠨ ᠪᠠᠶᠢᠨ᠎ᠠ ᠤᠤ?
+
 Northern Thai (ᨣᩣᩴᨾᩮᩬᩥᨦ / ᨽᩣᩈᩣᩃ᩶ᩣ᩠ᨶᨶᩣ) ᩈ᩠ᩅᩢᩔ᩠ᨯᩦᨣᩕᩢ᩠ᨸ
 Norwegian (norsk)      Hei / God dag
 Odia (ଓଡ଼ିଆ)    ନମସ୍କାର
diff --git a/etc/NEWS b/etc/NEWS
index 78c493998c4..5b62965d1fd 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -249,6 +249,17 @@ the new argument NEW-BUFFER non-nil, it will use a new 
buffer instead.
 Interactively, invoke 'eww-open-file' with a prefix argument to
 activate this behavior.
 
+---
+*** 'eww' URL or keyword prompt now has tab completion.
+The interactive minibuffer prompt when invoking 'eww' now has support
+for tab completion.
+
++++
+*** 'eww' URL and keyword prompt now completes suggested URIs and bookmarks.
+The interactive minibuffer prompt when invoking 'eww' now provides
+completions from 'eww-suggest-uris'. 'eww-suggest-uris' now includes
+bookmark URIs.
+
 ** go-ts-mode
 
 +++
diff --git a/etc/NEWS.29 b/etc/NEWS.29
index 62d2fdcd3a4..0eb5940dbca 100644
--- a/etc/NEWS.29
+++ b/etc/NEWS.29
@@ -857,17 +857,17 @@ This value stands for the value of the corresponding 
attribute of the
 inheriting from other faces.
 
 +++
-** New X resource: "borderThickness".
+** New X resource "borderThickness".
 This controls the thickness of the external borders of the menu bars
 and pop-up menus.
 
 +++
-** New X resource: "inputStyle".
+** New X resource "inputStyle".
 This controls the style of the pre-edit and status areas of X input
 methods.
 
 +++
-** New X resources: "highlightForeground" and "highlightBackground".
+** New X resources "highlightForeground" and "highlightBackground".
 Only in the Lucid build, this controls colors used for highlighted
 menu item widgets.
 
@@ -1546,6 +1546,10 @@ environments are:
 
  Coptic script and language environment
 
+ Mongolian-traditional script and language environment
+
+ Mongolian-cyrillic language environment
+
 ---
 *** The "Oriya" language environment was renamed to "Odia".
 This is to follow the change in the official name of the script.  The
@@ -1559,7 +1563,10 @@ Type 'C-u C-h t' to select it in case your language 
setup does not do
 so automatically.
 
 ---
-*** New Ukrainian translation of the Emacs Tutorial.
+*** New Ukrainian translation of the Emacs tutorial.
+
+---
+*** New Farsi/Persian translation of the Emacs tutorial.
 
 ---
 *** New default phonetic input method for the Tamil language environment.
@@ -1587,7 +1594,8 @@ script.
 ---
 *** New input method 'cyrillic-mongolian'.
 This input method is for typing in the Mongolian language using the
-Cyrillic script.
+Cyrillic script.  It is the default input method for the new
+Mongolian-cyrillic language environment, see above.
 
 
 * Changes in Specialized Modes and Packages in Emacs 29.1
@@ -2664,7 +2672,7 @@ The old name was confusing, and is now an obsolete 
function alias.
 ** Images
 
 +++
-** New commands 'image-crop' and 'image-cut'.
+*** New commands 'image-crop' and 'image-cut'.
 These commands allow interactively cropping/cutting the image at
 point.  The commands are bound to keys 'i c' and 'i x' (respectively)
 in the local keymap over images.  They rely on external programs, by
@@ -2672,7 +2680,7 @@ default "convert" from ImageMagick, to do the actual 
cropping/eliding
 of the image file.
 
 +++
-*** New commands: 'image-flip-horizontally' and 'image-flip-vertically'.
+*** New commands 'image-flip-horizontally' and 'image-flip-vertically'.
 These commands horizontally and vertically flip the image under point,
 and are bound to 'i h' and 'i v', respectively.
 
diff --git a/etc/tutorials/TUTORIAL b/etc/tutorials/TUTORIAL
index e72b972441e..4e6d7b9b287 100644
--- a/etc/tutorials/TUTORIAL
+++ b/etc/tutorials/TUTORIAL
@@ -4,7 +4,7 @@ Emacs commands generally involve the CONTROL key (often labeled 
CTRL)
 or the META key (usually labeled ALT).  Rather than writing that
 in full each time, we'll use the following abbreviations:
 
- C-<chr>  means hold the CONTROL key while typing the character <chr>
+ C-<chr>  means hold the CONTROL key while typing the character <chr>.
          Thus, C-f would be: hold the CONTROL key and type f.
  M-<chr>  means hold the META or ALT key down while typing <chr>.
          If there is no META or ALT key, instead press and release the
diff --git a/etc/tutorials/TUTORIAL.fa b/etc/tutorials/TUTORIAL.fa
new file mode 100644
index 00000000000..5c9c0e1941a
--- /dev/null
+++ b/etc/tutorials/TUTORIAL.fa
@@ -0,0 +1,1169 @@
+آموزش Emacs «ایمکس». برای شرایط کپی به پایان مراجعه کنید.
+
+فرمانهای Emacs عموماً شامل کلید CONTROL (گاهی اوقات با برچسب CTRL)
+یا کلید META (معمولا با برچسب ALT) هستند. به جای هر بار بطور کامل نوشتن،
+از خلاصه زیر استفاده خواهیم کرد:
+
+‏ ‪C-<chr>‬  به معنای نگه داشتن کلید CONTROL در حین تایپ کاراکترِ <chr> است.
+          بنابراین، C-f خواهد بود: کلید CONTROL را نگه دارید و f را تایپ کنید.
+‏ ‪M-<chr>‬  یعنی کلید META یا ALT را هنگام تایپ حرفِ <chr> پایین نگه دارید.
+          اگر کلید META، یا ALT وجود ندارد، به جای آن کلید ESC را فشار
+          داده و رها کنید، سپس <حرف> را تایپ کنید.
+          برای کلید ESC  می نویسیم <ESC>.
+
+نکته مهم: برای پایان دادن به جلسه Emacs، دو حرف C-x C-c را تایپ کنید.
+برای خروج از یک فرمانِ ناکامل، C-g را تایپ کنید.
+برای توقف آموزش، C-x k و سپس در پاسخ به نشانگر <Return> را تایپ کنید.
+کاراکترهای ">>" در حاشیه سمت راست فرمانهایی را برای شمامشخص می کند. برای مثال:
+
+
+
+[وسط صفحه برای اهداف آموزشی خالی مانده است. ادامه متن در زیر]
+
+
+
+>> اکنون C-v را تایپ کنید (نمایش صفحه بعدی) تا یک صفحه کامل به پایین بروید.
+      (این کار را با نگه داشتن کلید CONTROL و فشار کلید v انجام دهید).
+      از این پس، لطفاً هر زمان که به انتهای صفحه رسیدید، این کار را انجام دهید.
+
+توجه داشته باشید که وقتی یک صفحه کامل را اسکرول می کنید، دو خط همپوشانی دارند؛
+این مقداری تداوم را فراهم می کند تا بتوانید به خواندن متن ادامه دهید.
+
+این یک کپی از متن آموزشی Emacs است که کمی برای شما شخصی سازی  شده است.
+بعداً به شما آموزش خواهیم داد که فرمانهای مختلفی را برای تغییر این متن استفاده
+کنید. اگر قبل از اینکه به شماگفته باشیم، این متن را تغییر داده اید،
+نگران نباشید. این کار «ویرایش» نامیده می شود و Emacs برای همین است.
+
+اولین چیزی که باید بدانید این است که چگونه از یک مکان به اطراف حرکت کنید.
+شما از قبل می دانید که با C-v  چگونه یک صفحه به جلو حرکت میکند.
+برای حرکت یک صفحه به سمت عقب، M-v را تایپ کنید (کلید META را نگه دارید
+و v را تایپ کنید، یا اگر کلید META، یا ALT را ندارید، ‪ <ESC>v‬را تایپ کنید).
+
+>> چند بار M-v و سپس C-v را تایپ و امتحان کنید.
+
+شما می توانید این متن را با روش های دیگری که میدانید اسکرول کنید.
+
+* خلاصه
+---------
+
+فرمانهای زیر برای مشاهده کل صفحه نمایش مفید هستند:
+
+‏       C-v   یک صفحه نمایش به جلو حرکت کنید.
+‏       M-v   یک صفحه نمایش به عقب حرکت کنید.
+‏       C-l   پاک کردن صفحه و نمایش مجدد تمام متن،
+              جابجایی مکان نما و متن به مرکز صفحه نمایش
+              (این CONTROL-L است، نه CONTROL-1.)
+
+>> مکان‌نما را پیدا کنید و توجه داشته باشید که چه متنی در نزدیکی آن است.
+   سپس C-l را تایپ کنید. دوباره مکان نما را پیدا کنید وتوجه کنید که  هنوز
+   نزدیک همان متن است. اما مکان نما، اکنون در مرکز صفحه است.
+   اگر دوباره C-l را فشار دهید، این قطعه متن به بالای صفحه منتقل می شود.
+   مجددا C-l را فشار دهید،  صفحه نمایش دوباره به پایین حرکت می کند.
+
+اگر ترمینال شما کلیدهای PageUp و PageDn را دارد، میتوانید برای جابه‌جایی یک
+صفحه کامل از آنها استفاده کنید.
+اما در صورت استفاده از C-v و M-v شما می توانید کارآمدتر ویرایش کنید.
+
+* کنترل مکان نما
+----------------------
+
+حرکت از یک صفحه نمایش به صفحه نمایش دیگر مفید است، اما چگونه
+به مکان خاصی در متنِ روی صفحه حرکت کنید؟
+
+چندین راه وجود دارد که می توانید این کار را انجام دهید. می توانید از
+کلیدهای جهت دار استفاده کنید، اما کارآمدتر است که دستان خود را در وضعیت
+استاندارد نگه دارید. از فرمانهایِ C-p، C-b، C-f و C-n استفاده کنید. این فرمان 
ها
+معادل چهار کلید جهت دار هستند، مانند:
+
+                               سطر قبل، C-p
+                                     :
+                                     :
+             به عقب، C-b .... موقعیت مکان نما فعلی .... به جلو، C-f
+                                     :
+                                     :
+                               خط بعدی، C-n
+
+>> با استفاده از C-n یا C-p مکان نما را به خط وسط نمودار بالا حرکت دهید.
+   سپس C-l را تایپ کنید تا کل نمودار را در مرکز صفحه نمایش  ببینید.
+
+
+به راحتی می توانید این حروف را با کلماتی که مخفف آنها هستند به خاطر بسپارید:
+Previous) p) برای قبلی، Next) n) برای بعدی, Backward) b) برای عقب و
+Forward) f) برای جلو. شما همیشه از این فرمانهایِ اصلی تعیین موقعیت مکان نما
+استفاده خواهید کرد.
+
+>> برای پایین آوردن مکان نما به این خط، چند C-n انجام دهید.
+
+>> حرکت به جلو، روی خط با C-f و سپس به بالا با C-p.
+   ببینید C-p وقتی مکان نما در وسط خط قرار دارد چه می کند.
+
+هر خط از متن با یک کاراکترِ Newline به پایان می رسد، که
+آن را از خط زیر جدا میکند. (به طور معمول،یک فایل در پایان دارای
+یک Newline خواهد بود، اما Emacs به آن نیاز ندارد.)
+
+>>  هنگامی که نشانگر در ابتدای خط است، از C-b استفاده کنید. باید به انتهای
+    خط قبلی حرکت کند. به این دلیل است که این حرکت از سراسر Newline میگذرد.
+
+فرمان C-f می تواند مانند C-b روی خط جدید حرکت کند.
+
+>> چند C-b دیگر انجام دهید، بنابراین می توانید نشانگر را در مکان مورد
+   نظر قرار دهید. سپس C-f را انجام دهید تا به انتهای خط برگردید.
+   سپس یک C-f دیگر انجام دهید تا به خط زیر بروید.
+
+
+وقتی از بالا یا پایین صفحه عبور می کنید، متن فراتر می رود
+لبه روی صفحه نمایش جابجا می شود. به این "پیمایش یا اسکرول" می گویند. این
+Emacs را قادر می سازد تا مکان نما را به مکان مشخص شده در متن منتقل کند
+بدون اینکه آن را از صفحه نمایش جدا کنید.
+
+>> سعی کنید مکان نما را از پایین صفحه با C-n حرکت دهید و
+   ببیند چه اتفاقی می افتد.
+
+اگر حرکت بر اساس کاراکترها خیلی کند است، می توانید با کلمات حرکت کنید. M-f
+(META-f) یک کلمه را جلو می برد و M-b یک کلمه را به عقب می برد.
+
+>> چند M-f و M-b تایپ کنید.
+
+وقتی در وسط یک کلمه هستید، M-f به انتهای کلمه می رود.
+هنگامی که در فضای خالی بین کلمات قرار دارید، M-f به انتهای کلمه بعدی منتقل
+می شود. M-b نیز در جهت مخالف کار می کند.
+
+>> فرمان M-f و M-b را چند بار با C-f و C-b در هم آمیخته تایپ کنید،
+   تا عمل M-f و M-b را از انواع  مکان های درون و بین کلمات مختلف مشاهده کنید.
+
+
+به موازات بین C-f و C-b از یک طرف و M-f و M-b از طرف دیگر توجه کنید.
+
+عملیات مربوط به واحدهای تعریف شده توسط زبان (کلمات، جملات، پاراگراف ها)
+اغلب با کاراکترهای متا انجام می شود،
+در حالی که کاراکترهای Control بر روی واحدهای اصلی، مستقل از آنچه در حال
+ویرایش هستید (حروف، خطوط و غیره) عمل می کنند.
+
+این توازی بین خطوط و جملات اعمال می شود: C-a و C-e حرکت به
+ابتدا یا انتهای یک خط، و M-a و M-e به ابتدا یا پایان یک جمله حرکت می کنند.
+
+
+>>دو C-a، و سپس دو C-e را امتحان کنید.
+  چند M-a و سپس چند M-e را امتحان کنید.
+
+
+ببینید چگونه C-a های تکراری هیچ کاری انجام نمی دهند، اما M-a های تکراری به
+حرکت خود ادامه می دهند. اگرچه اینها کاملاً مشابه نیستند، اما هر یک طبیعی
+به نظر می رسد.
+
+
+به مکانِ مکان نما در متن "نقطه" نیز می گویند.
+به عبارت دیگر، مکان نما روی صفحه نشان می دهد که نقطه در کجای متن قرار دارد.
+
+
+در اینجا خلاصه ای از عملیات ساده حرکت مکان نما، از جمله
+فرمانهایِ حرکت کلمه و جمله نشان داده می شود:
+
+‏            C-f    یک کاراکتر را به جلو حرکت دهید
+‏            C-b    یک کاراکتر را به عقب حرکت دهید
+
+‏            M-f    یک کلمه را به جلو حرکت دهید
+‏            M-b    یک کلمه را به عقب حرکت دهید
+
+‏            C-n    به خط بعدی بروید
+‏            C-p    به خط قبلی بروید
+
+‏            C-a    حرکت به ابتدای خط
+‏            C-e    حرکت به انتهای خط
+
+‏            M-a    به ابتدای جمله برگردید
+‏            M-e    حرکت به جلو تا پایان جمله
+
+>> همه این فرمانها را اکنون چند بار برای تمرین امتحان کنید.
+   این فرمانها بیشترین استفاده را دارند.
+
+دو فرمان مهم دیگر حرکت مکان نما عبارتند از‪ M-<  :‬ (META کمتر از)،
+که به ابتدای کل متن حرکت می کند و ‪M->‬ (META  بزرگتر از)،
+که به انتهای کل متن می رود.
+
+در اکثر ترمینالها، ">" بالای کاما است، بنابراین باید با استفاده از کلید
+shift آن را تایپ کنید.
+در این ترمینالها باید از کلید shift برای تایپ >-M نیز استفاده کنید.
+بدون کلید shift، شما کاما، M را تایپ می کنید.
+
+>> اکنون >-M را امتحان کنید تا به ابتدای آموزش بروید.
+   سپس از C-v مکرراً برای بازگشت به اینجا استفاده کنید.
+
+>> اکنون <-M را امتحان کنید تا به انتهای آموزش بروید.
+   سپس از M-v مکرراً برای بازگشت به اینجا استفاده کنید.
+
+همچنین می توانید مکان نما را با کلیدهای جهت دار حرکت دهید، اگر ترمینال شما
+آن را داشته باشد. ما استفاده از C-b، C-f، C-n و C-p را به سه دلیل توصیه میکنیم.
+
+اول، آنها بر روی انواع ترمینالها کار می کنند.
+دوم, هنگامی که مهارت شما در استفاده از Emacs بیشتر شود، متوجه خواهید شد که
+تایپ با کنترل کاراکترها، سریعتر از تایپ کلیدهای جهت دار است.
+(زیرا احتیاج نیست که شما دستان خود را از موقعیت تایپ لمسی دور کنید).
+سوم، وقتی شما عادت به استفاده از فرمانهایِ کاراکتر Control را دارید، می توانید
+به راحتی یاد بگیرید که از دیگر فرمانهایِ پیشرفته حرکت مکان نما نیز استفاده 
کنید.
+
+اکثر فرمانهایِ Emacs یک آرگومان عددی را می پذیرند. برای اکثر فرمانها، این
+به عنوان یک شمارش تکرار عمل می کند.
+نحویِ تحویل تعداد تکرار، با تایپ C-u و سپس اعداد قبل از تایپ فرمان است. اگر
+شما یک کلید META (یا ALT) دارید، راه جایگزینی دیگری برای وارد کردن
+آرگومان عددی وجود دارد: ارقام را در حالی که کلید META را نگه داشته‌اید
+تایپ کنید. ما توصیه می کنیم استفاده از  C-u را یاد بگیرید زیرا در هر ترمینال
+کار می کند. آرگومان عددی "آرگومان پیشوند" نیز نامیده می شود.
+زیرا آرگومان را قبل از فرمانی که روی آن اعمال می شود تایپ می کنید.
+
+به عنوان مثال، C-u 8 C-f هشت کاراکتر به جلو حرکت می کند.
+
+>> سعی کنید فقط با یک فرمان،  C-n یا C-p با آرگومان عددی برای حرکت مکان نما
+   از خط نزدیک به این خط استفاده کنید.
+
+اکثر فرمانها از آرگومان عددی به عنوان تعداد تکرار استفاده می کنند،
+اما برخی فرمانها از آن به روش دیگری استفاده می کنند.
+چندین فرمان که از آن به عنوان یک علامت تعغیر استفاده میشود.
+(اما هیچ کدام از فرمانهایِی که تا به حال آموخته اید نیستند.)
+وجود یک آرگومان پیشوند، صرف نظر از مقدار آن، فرمان متفاوتی را انجام می دهد.
+
+‏C-v و M-v استثناهای دیگری هستند. با تحویل آرگومان،
+آنها متن را با این تعداد خط به بالا یا پایین اسکرول می کنند نه با یک
+صفحه نمایش. برای مثال، C-u 8 C-v هشت خط پیمایش می کند.
+
+>> اکنون C-u 8 C-v را تایپ کنید.
+
+این فرمان باید متن را 8 خط به بالا اسکرول کند. اگر مایل باشید
+دوباره به پایین برگردید، می توانید یک آرگومان به M-v بدهید.
+
+اگر از یک  سیستم نمایشِ گرافیکی مانند X یا MS-Windows استفاده می کنید،
+باید یک ناحیه مستطیل شکل بلند به نام نوار پیمایش در یک طرف پنجره Emacs
+وجود داشته باشد. با کلیک کردن بر روی نوار، متن را اسکرول کنید.
+
+اگر ماوس شما دگمه چرخ دارد، می توانید از آن برای اسکرول نیز استفاده کنید.
+
+
+* اگر EMACS پاسخ نمی دهد.
+---------------------------
+
+اگر Emacs به فرمانهایِ شما پاسخ نمی دهد، می توانید با خیال راحت با
+تایپ کردن C-g آن را متوقف کنید. می توانید از C-g برای متوقف کردن فرمانی که
+انجامش طولانی شده است استفاده کنید.
+
+همچنین می‌توانید از C-g برای حذف یک آرگومان عددی یا ابتدای فرمانی که
+نمی خواهید آن را تمام کنید استفاده کنید.
+
+>> با عمل C-u 100 یک آرگومان عددی 100 بسازید، سپس C-g وبعد از آن
+   C-f را تایپ کنید. بااین فرمانها فقط یک حرف به جلو  حرکت می کنید، زیرا شما
+   آرگومان را با C-g لغو کرده اید.
+
+اگر یک <ESC> را اشتباه تایپ کرده اید، می توانید با یک C-g از شر آن خلاص شوید.
+
+
+* فرمانهایِ غیر فعال
+-------------------
+
+برخی از فرمانهایِ Emacs "غیرفعال" هستند تا کاربران مبتدی نتوانند
+از آنها به طور تصادفی  استفاده کنند.
+
+اگر یکی از فرمانهایِ غیرفعال را تایپ کنید، Emacs پیامی را نمایش می دهد
+که فرمان چیست و از شما می پرسد که آیامایل به اجرای آن هستید؟
+
+اگر واقعاً می خواهید فرمان را اجرا کنید، <SPC> (نوار فاصله) را در پاسخ به
+سوال تایپ کنید. به طور معمول، اگر نمی خواهید آن را اجرا کنید، به سوال با
+"n" پاسخ دهید.
+
+>> عمل C-x C-l (که یک فرمان غیرفعال است) را انجام دهید،
+   سپس  n را در پاسخ به سوال تایپ کنید.
+
+
+* پنجره ها
+----------
+
+با Emacs می تواند چندین "پنجره" داشته باشد که هر کدام متن خاص خود را نشان
+می دهد. ما بعداً در مورد نحوه استفاده از چندین پنجره توضیح خواهیم داد. در
+حال حاضر می خواهیم برای نحوه حذف پنجره های اضافی و بازگشت به حالت اولیه
+ویرایش یک پنجره توضیح دهیم. این عمل آسان است:
+
+‏        C-x 1  یک پنجره (یعنی تمام پنجره های دیگر را حذف کنید).
+
+فرمان C-x 1 پنجره ای تمام صفحه، که حاوی مکان نما است را باز می کند.
+این فرمان تمام پنجره های دیگر را حذف میکند.
+
+
+>> مکان نما را به این خط ببرید و C-u 0 C-l را تایپ کنید.
+>> C-h k C-f را تایپ کنید.
+   ببینید چگونه این پنجره کوچک می شود، در حالی که یک پنجره جدید برای نمایش
+   اطلا عات در فرمان C-f ظاهر می شود.
+
+
+>> با تایپ C-x 1 پنجره فهرست اسناد ناپدید می شود.
+
+یک سری کامل از فرمانها با CONTROL-x شروع می شوند. بسیاری از
+آنها با ویندوز، فایل ها، بافرها و موارد وابسته ارتباط دارند.
+این فرمانها دو، سه یا چهار کاراکتر هستند.
+
+
+* درج و حذف
+------------
+
+اگر می خواهید متن را وارد کنید، فقط متن را تایپ کنید. حروف معمولی،
+مانند A، 7، *، و غیره، هنگام تایپ آنها نوشته می شوند. برای انجام نوشتن
+ خط جدید، <Return> را تایپ کنید (این کلید روی صفحه کلید است
+که گاهی اوقات با عنوان "Enter" شناخته می شود).
+
+برای حذف کاراکترِ قبل از مکان نمای فعلی ، <DEL> را تایپ کنید. این کلید روی
+صفحه کلید است که معمولاً با برچسب "Backspace"است −− همان که معمولاً در خارج
+از Emacs نیز برای حذف آخرین حرفِ نوشته شده استفاده می کنید.
+
+
+همچنین ممکن است کلید دیگری روی صفحه کلید شما با عنوان <Delete> وجود داشته
+باشد، اما این چیزی نیست که ما در Emacs به آن <DEL> می گوییم.
+
+>> اکنون این کار را انجام دهید - چند کاراکتر را تایپ کنید، سپس آنها را حذف
+   کنید. چند بار <DEL> را تایپ کنید. نگران این فایل نباشید در حال تغییر؛
+   شما آموزش اصلی را تغییر نمی دهید. این کپی شخصی شما از آن است.
+
+وقتی نوشتن یک خط در متن بیش از حد طولانی می شود، خط بر روی سطر دوم صفحه
+"ادامه" می یابد. اگر از یک صفحه نمایش گرافیکی استفاده می کنید برای نشان
+دادن جایی که یک خط ادامه یافته است فلش های منحنی کوچکی در فضاهای باریک در
+دو طرف ناحیه متن (حاشیه‌های چپ و راست ) ظاهر می شوند. اگر از ترمینال متنی
+استفاده می کنید، خطِ ادامه یافته با علامت معکوس ('\') در سمت راست ستون
+صفحه نمایش نشان داده می شود.
+
+
+>> به نوشتن متن پس از رسیدن به انتهای خط ادامه دهید.
+خواهید دید که یک خطِ ادامه ظاهر می شود.
+
+>> از <DEL > برای حذف متن استفاده کنید تا زمانی که نوشته مجدداً روی یک خط
+   صفحه قرار گیرد. خط ادامه از بین می رود.
+
+شما می توانید حروف خط جدید را مانند هر حرف دیگری حذف کنید. حذف کاراکتر
+Newline بین دو خط آنها را با هم ادغام می کند. اگر خط ترکیبی به دست آمده
+بیش از حد طولانی باشد که در آن جا نمی شود، عرض صفحه نمایش، با یک خط ادامه،
+نمایش داده می شود.
+
+>> مکان نما را به ابتدای یک خط ببرید و <DEL> را تایپ کنید. این فرمان
+   آن خط را با خط قبلی ادغام می کند.
+
+>> حالا <Return> را تایپ کنید تا خط جدیدی را که حذف کرده اید دوباره وارد کنید.
+
+کلید <Return> ویژه است، زیرا با فشار دادن آن ممکن است بیش از این کار انجام شود.
+فقط یک کاراکتر Newline وارد کنید. بسته به متن اطراف،
+ممکن است بعد از کاراکتر Newline فضای خالی را وارد کند، به طوری که وقتی
+شما شروع به تایپ کردن در خط جدید می کنید، متن با خط قبلی آن ردیف می شود.
+ما به این رفتار (که در آن فشار دادن یک
+کلید چیزی بیش از وارد کردن کاراکتر مربوطه انجام می دهد)  می گوییم "electric".
+
+>> در اینجا مثالی از الکتریکی بودن <Return> آورده شده است.
+   <Return> را در انتهای این خط تایپ کنید.
+
+باید ببینید که بعد از درج Newline فاصله ها هم درج می شوند،
+به طوری که مکان نمابه جای مناسب حرکت می کند.
+
+به یاد داشته باشید که به اکثر فرمانهایِ Emacs می توان تعداد تکرار، داده شود.
+این شامل کاراکترهای متنی نیز است. تکرار درج کاراکتر متنی برای چندین بار.
+
+
+>> اکنون آن را امتحان کنید - ‪ C-u 8 *‬ را برای درج ******** تایپ کنید.
+
+شما اکنون ابتدایی ترین راه را برای تایپ با Emacs و تصحیح خطاها یاد گرفته اید.
+شما می توانید کلمات یا خطوط را نیز حذف کنید.
+در اینجا خلاصه ای از عملیات حذف آمده است:
+
+      ‏ <DEL>      کاراکتر را درست قبل از مکان نما حذف می کنید.
+      ‏  C−d       کاراکتر بعدی، بعد از مکان نما را حذف می کنید.
+
+      ‏ <M-<DEL    کلمه را بلافاصله قبل از مکان نما حذف می کنید.
+      ‏  M-d       کلمه بعدی را بعد از مکان نما حذف می کنید.
+
+      ‏  C-k       از موقعیت مکان نما تا انتهای خط را حذف می کنید.
+      ‏  M-k       از موقعیت مکان نما تا انتهای جمله را حذف میکنِید.
+
+توجه داشته باشید که <DEL> و C-d در مقابل <M-<DEL و M-d موازاتی را گسترش می دهند
+که با C-f و M-f شروع شده است (خوب، <DEL> واقعاً یک کاراکتر کنترلی نیست، اما
+بیایید نگران این نباشیم). C-k و M-k مانند C-e و M-e هستند، به نوعی، در آن
+خطوط با جملات جفت می شوند.
+
+شما همچنین می توانید یک بخش از متن را با یک روش یکسان حذف کنید . به انتهای
+یک قسمت حرکت کنید، و سپس <C-<SPC را تایپ کنید. (<SPC> کلید نوار Space
+است.) سپس مکان نما را به انتهای دیگر متنی که قصد دارید حذف کنید، ببرید.
+با انجام این کار، Emacs متن بین مکان نما وموقعیتی که با <C-<SPC تایپ کرده اید
+را مشخص می کند. در نهایت C-w را تایپ کنید. با این عمل متنِ بین دو موقعیت
+را حذف میکنید.
+
+
+>> مکان نما را در ابتدای پاراگراف قبلی به «ش» حرکت دهید.
+
+>> با تایپ <C-<SPC، در پایین صفحه نمایش Emacs باید یک پیام "Mark set" را
+   نمایش دهد.
+
+>> در خط دوم ازمتن،  مکان نما را به «ی» در "یک"، حرکت دهید.
+
+‏>> C-w را تایپ کنید. با این کار متنی که از «ش» شروع می شود و درست قبل از
+«ی» به پایان می رسد را از بین می برید.
+
+تفاوت بین "کشتن" و "حذف" در همان متن این است که "کشته" را می توان دوباره
+درج کرد (در هر موقعیتی)، در حالی که چیزهای "حذف شده" را نمی توانید به این
+روش دوباره درج کنید (اما می توانید حذف را لغو کنید - در زیر ببینید.) درج
+مجدد متن کشته شده "yanking" نامیده می شود. ( به عنوان عقب نشینی یا عقب
+کشیدن متنی که برداشته شده است به آن فکرکن.)
+
+به طور کلی، فرمانهایِی که می توانند متن زیادی را حذف کنند، متن را «میکشند».
+(آنها به گونه ای تنظیم شده اند که بتوانید متن را باز گردانند)، در حالی که
+فرمانهایِی که فقط یک کاراکتر را حذف می کند، یا فقط خطوط و فاصله های خالی را
+حذف می کند، حذف را انجام می دهند (بنابراین نمی توانید آن متن را برگرداند).
+<DEL> و C-d در ساده ترین حالت، بدون هیچ آرگومان حذف را انجام می دهند.وقتی
+آرگومان به آنها داده می شود درعوض مکشند.
+
+>> مکان نما را به ابتدای خطی که خالی نیست حرکت دهید.
+سپس C-k را تایپ کنید تا متن روی آن خط حذف شود.
+
+>> بار دوم C-k را تایپ کنید. خواهید دید که Newline را می کشد که بعد از آن
+   خط است.
+
+توجه داشته باشید که یک C-k محتویات خط را می کشد و یک C-k ثانوی خود خط را
+می کشد و همه خطوط دیگر را به سمت بالا حرکت می دهد. C-kبه طور خاص با یک
+آرگومان عددی برخورد می کند: این تعداد خطوط و محتویات آنهارا میکشد. این
+صرفا یک تکرار نیست. C-u 2 C-k دو خط و Newline آنها را می کشد. دو بار تایپ
+کردن C-k این کار را نمی کند.
+
+می‌توانید متن کشته‌شده را در همان مکانی که در آن قرار داشت، باز گردانید.
+یا در جای دیگری از متنی که در حال ویرایش آن هستید، یا حتی در
+یک فایل متفاوت می‌توانید یک متن را چندین بار باز گردانید. که
+چندین کپی از آن می سازد. با مراجعه به  کتابچه راهنمایِ Emacs در موارد "کشتن" و
+انحرافِ "برش" و "چسباندن" میتوانید اطلاعات بیشتری کسب کنید.
+
+
+فرمانِ‪"yank" ,C-y ‬ است. آخرین متن کشته شده را در موقعیت مکان نما فعلی دوباره
+درج می کند.
+
+
+>> آن را امتحان کنید. C-y را تایپ کنید تا متن را به عقب برگردانید.
+
+اگر چندین C-k را پشت سر هم انجام دهید، تمام متن کشته شده ذخیره می شود،
+ به طوری که یک C-y همه خطوط را به یکباره انحراف می دهد.
+
+>> اکنون این کار را انجام دهید، C-k را چندین بار تایپ کنید.
+
+حال برای بازیابی آن متن کشته شده:
+
+‏>> C-y را تایپ کنید. سپس مکان نما را چند خط پایین ببرید و دوباره C-y را
+تایپ کنید اکنون نحوه کپی کردن متن را مشاهده می کنید.
+
+اگر متنی داشته باشید که می خواهید به عقب برگردید، چه کار می کنید چیز دیگری
+می کشید؟ C-y کشتن اخیر را از بین می برد. ولی متن قبلی گم نمی شود می توانید
+با استفاده از M-y به آن برگردید فرمان بعد از اینکه C-y را برای دریافت
+آخرین kill انجام دادید، تایپ کنید M-y آن متن یاک شده را با kill قبلی
+جایگزین می کند. تایپ کردن M-y بارها و بارها کشتارهای قبلی و قبلی را به
+ارمغان می آورد. وقتی به متن مورد نظر رسیدید، لازم نیست کاری انجام دهید تا
+نگهش دارید. فقط به ویرایش خود ادامه دهید و متن انحرافی را رها کنید.
+
+اگر تعداد M-y به دفعات کافی داشته باشید، به نقطه شروع باز می گردید
+(بیشترین کشتن اخیر).
+
+>> یک خط را بکشید، در اطراف حرکت کنید، یک  خط دیگر را بکشید.
+   سپس C-y را انجام دهید تا دومین خط کشته شده را برگردانید.
+   سپس M-y را انجام دهید تا اولین خط کشته شده جایگزین آن شود.
+   M-y های بیشتری انجام دهید و ببینید چه چیزی به دست می آورید. به انجام
+   آنها ادامه دهید تا زمانی که خط کشتن دوم برمی گردد، و سپس چند بار دیگر.
+   اگر دوست دارید، می‌توانید امتحان کنیدو به M-y آرگومانهای مثبت و منفی
+   بدهید.
+
+
+
+* لغو
+------
+
+اگر تغییری در متن ایجاد کنید و سپس تصمیم به برگرداندن آن تغییر بگیرید،
+شما می توانید تغییر را با فرمان ‪(undo)  C-/‬ لغو کنید.
+
+به طور معمول، ‪ C-/‬ تغییرات ایجاد شده توسط یک فرمان را خنثی می کند.
+اگر ‪ C-/‬ را چندین بار پشت سر هم، تکرار کنید هر تکرار یک فرمان دیگر
+را خنثی می کند.
+
+اما دو استثنا وجود دارد: فرمانهایِی که متن را تغییر نمی دهند
+به حساب نمی آیند (این شامل فرمانهایِ حرکت مکان نما و فرمانهایِ اسکرول می شود.)
+و کاراکترهای خود درج معمولاً در گروهای، تا ۲۰ تایی رسیدگی می شوند.
+(این برای  کاهش  تعداد‪ C-/ ‬ هایی است که باید برای لغو درج متن) تایپ کنید.
+
+
+>> این خط را با C-k بکشید، سپس /-C را تایپ کنید تا دوباره ظاهر شود. ـ-C یک
+   فرمان لغو جایگزین است. دقیقاً مانند‪ C-/ ‬ کار می کند. در برخی از پایانه
+   های متنی، تایپ‪ C-/ ‬ در واقع _-C را به Emacs ارسال می کند. از طرف
+   دیگر، C-x u نیز دقیقاً مانند‪ C-/ ‬ کار می کند، اما کمی کمتر است و راحتر
+   تایپ میشود.
+
+
+یک آرگومان عددی  /-C-_ ، C, یا C-x u به عنوان یک تعداد تکرار عمل می کند.
+
+همانطور که می توانید حذف متن را لغو کنید، می توانید کشتن متن رانیز لغو کنید.
+تمایز بین کشتن چیزی و حذف آن در مورد C-y تأثیر می گذارد، برای لغو فرقی نمی کند.
+
+
+* فایل ها
+---------
+
+برای اینکه متنی را که ویرایش می کنید دائمی کنید، باید آن را در یک فایل
+قرار دهید. در غیر این صورت، با خروج از Emacs از بین می رود. برای اینکه متن
+خود را در یک فایل قرار دهید، قبل از وارد کردن فایل باید آن را "پیدا کنید".
+(به این "بازدید از فایل" نیز گفته می شود.)
+
+پیدا کردن یک فایل به این معنی است که شما محتویات فایل را در داخل Emacs
+می بینید از بسیاری جهات، گویی در حال ویرایش خود فایل هستید. با این حال،
+تغییراتی که با استفاده از Emacs ایجاد می کنید دائمی نمی شوند تا زمانی که
+فایل را "ذخیره" کنید. این به این دلیل است که شما بتوانید از ذخیره کردن
+فایل نیمه کامل اجتناب کنید. حتی هنگامی که فایل را ذخیره کردید Emacs فایل
+اصلی را با نام دیگری برایتان نگه میدارد، چون ممکن است بعداً تصمیم بگیرید که
+تغییرات شما اشتباه بوده است.
+
+اگر به پایین صفحه نگاه کنید، خطی را خواهید دید که
+با حروف "−" شروع می شود و چیزی مانند:  "TUTORIAL ---:-" در آن را نشان می دهد.
+این قسمت از صفحه نمایش معمولاً نام فایلی که در حال حاضر از آن بازدید می
+کنید را نشان میدهد. شما اکنون در حال بازدید از کپی شخصی آموزش Emacs خود که
+"TUTORIAL" نام دارد هستید. وقتی شما یک فایل را با Emacs پیدا کردید، نام آن
+فایل بطور دقیق در همان نقطه ظاهر می شود.
+
+یک مورد خاص در مورد فرمان برای یافتن یک فایل این است که شما باید بگویید چه
+نام فایلی را می خواهید. ما می گوییم فرمان "خواندن یک ارگومان"
+(در این مورد، آرگومان نام فایل است.)بعد از تایپ فرمان.
+
+
+با C-x C-f یک فایل را پیدا کنید. Emacs از شما می خواهد که نام فایل را تایپ
+کنید. نام فایلی که تایپ می کنید در خط پایین صفحه نمایش ظاهر می شود. خط
+پایین زمانی که برای این نوع ورودی استفاده می شود، «مینی بافر» نامیده می
+شود. شما می توانید ازفرمانهایِ ویرایش معمولی Emacs برای ویرایش نام فایل
+استفاده کنید.
+
+در حالی که نام فایل (یا هر ورودی مینی بافر دیگر) را وارد می کنید،
+می توانید با C-g فرمان را لغو کنید.
+
+>> فرمانِ C-x C-f را تایپ کنید، سپس C-g را تایپ کنید. این فرمانِ مینی بافر
+   را لغو می کند، و همچنین فرمان C-x C-f را که مینی بافر از آن استفاده می
+   کرد را لغو می کند، بنابراین شما هیچ فایلی را پیدا نمی کنید.
+
+وقتی نام فایل را وارد کردید، <Return> را تایپ کنید تا
+آن را خاتمه دهید. مینی بافر ناپدید می شود و فرمان C-x C-f
+برای یافتن فایلی که انتخاب کرده اید اعمال میشود.
+
+محتویات فایل اکنون روی صفحه ظاهر می شود و می توانید آن را ویرایش کنید.
+هنگامی که می خواهید تغییرات خود را دائمی کنید، فرمان
+
+‏        C-x C-s    فایل را ذخیره کنید
+
+این فرمان  متن را در فایل درون Emacs کپی می کند. اولین باری که این
+کار را انجام دهید، Emacs نام فایل اصلی را به نام جدید تغییر می دهد بنابر این
+گم نمی شود. نام جدید با افزودن "~" به انتهای نام فایل اصلی ساخته می شود.
+هنگامی که ذخیره به پایان رسید، Emacs نام فایل نوشته شده را نمایش می دهد.
+
+
+‏>>  <C-x C-s TUTORIAL <Return را تایپ کنید.
+   این فرمان باید این آموزش را در فایلی به نام TUTORIAL ذخیره کند و
+   و " Wrote...TUTORIAL "  را در پایین صفحه نشان دهد.
+
+می توانید یک فایل موجود را پیدا کنید، آن را مشاهده یا ویرایش کنید. شما
+همچنین می توانید فایلی را پیدا کنید که قبلاً وجود ندارد. این راه ایجاد یک
+فایل با Emacs است: فایل را پیدا کنید که خالی شروع می شود و سپس شروع به درج
+متن در آن کنید، وقتی شما درخواست ذخیره فایل را می کنید، Emacs در واقع فایل
+را با متنی که شما درج کرده اید ایجاد می کند. از آن به بعد، می توانید خود
+را در حال ویرایش فایل موجود بدانید.
+
+
+
+* بافرها
+---------
+
+اگر فایل دومی را با C-x C-f پیدا کردید، فایل اول داخل Emacs باقی می ماند.
+برای برگشت مجدد به آن شما می‌توانید با C-x C-f ، دو باره آن را پیدا کنید.
+با این روش می توانید تعداد زیادی فایل را در داخل Emacs باز کنید.
+
+ایمکس متن هر فایل را در یک مکان به نام "بافر" ذخیره می کند.
+پیدا کردن یک فایل، یک بافر جدید در Emacs ایجاد می کند. برای دیدن لیستی از
+بافرهایی که در حال حاضر وجود دارند، تایپ کنید
+
+‏        C-x C-b     لیست بافرها
+
+>> اکنون C-x C-b را امتحان کنید.
+
+ببینید که چگونه هر بافر یک نام دارد و همچنین ممکن است نام فایلی که محتویات
+آن را نگه می دارد داشته باشد. هر متنی که در پنجره Emacs می بینید همیشه
+بخشی از یک بافر است.
+
+>> با تایپ C-x 1 میتوانید از شر لیست بافر خلاص شوید.
+
+هنگامی که چندین بافر دارید، در هر زمان تنها یکی از آنها "جاری" است. آن
+بافر همان بافری است که شما ویرایش می کنید. اگر می خواهید بافر دیگری را
+ویرایش کنید، باید به آن "سوئیچ" کنید. اگر می خواهید به یک بافر سوئیچ کنید
+که مربوط به یک فایل است، می توانید با مراجعه مجدد به آن فایل با C-x C-f
+این کار را انجام دهید. اما یک راه ساده تر وجود دارد: از فرمان C-x b
+استفاده کنید. در آن فرمان باید نام بافر را تایپ کنید.
+
+>> با تایپ ‪C-x C-f foo <Return> ‬ فایلی به نام "foo" ایجاد کنید.
+   سپس ‪ C-x b TUTORIAL <Return>‬ را تایپ کنید تا به این آموزش بازگردید.
+
+اغلب اوقات، نام بافر با نام فایل یکی است(بدون قسمت پوشه فایل). به هر حال،
+این همیشه درست نیست. لیست بافری که با C-x C-b ایجاد می کنید، نام هر دو
+بافر و نام فایل هر بافر را به شما نشان می دهد.
+
+برخی از بافرها با فایل ها مطابقت ندارند. بافری با نام "*Buffer List*" که
+حاوی لیست بافری است که شما آن را با C-x C-b ساخته اید هیچ فایلی ندارد. این
+‪TUTORIAL buffer‬ که در ابتدا انجام شد فایلی ندارد، اما اکنون دارد، زیرا
+قبلا شما C-x C-s را تایپ کردید و آن را در یک فایل ذخیره کرده اید.
+
+بافر ی با نام "*Messages*" نیز با هیچ فایلی مطابقت ندارد. این بافر حاوی
+پیام هایی است که در در طول جلسه Emacs شما، در خط پایین ظاهر شده اند.
+
+>> حالا < C-x b *Messages* <Return را تایپ کنید تا به بافر پیام ها نگاه کنید.
+   سپس < C-x b TUTORIAL <Return را تایپ کنید تا به این آموزش بازگردید.
+
+اگر در متن یک فایل تغییراتی ایجاد کردید و سپس فایل دیگری را پیدا کنید، این
+فایل اول را ذخیره نمی کند. آن تغییرات در Emacs در بافر آن فایل باقی می ماند.
+ایجاد یا ویرایش فایل دوم بافر، هیچ تاثیری روی بافر فایل اول ندارد.
+این بسیار مفید است، اما این بدان معناست که شما به یک راه راحت برای ذخیره
+بافر فایل اول نیاز دارید. نیاز به برگشت به بافِر اول برای ذخیره آن توسط
+C-x C-s کمی دردسرامیز است. بنابراین فرمانِ زیر را داریم.
+
+‏        C-x s   برخی از بافرها را ذخیره کنید
+
+فرمان C-x s در مورد هر بافری که حاوی تغییراتی که ذخیرِه
+نشده است از شما می پرسد.
+
+>> یک خط متن وارد کنید، سپس C-x s را تایپ کنید.
+   باید از شما بپرسد که آیا بافر با نام TUTORIAL را ذخیره می کنید یا خیر.
+   با تایپ "y" به سوال پاسخ مثبت دهید.
+
+
+* گسترش مجموعه فرمانها
+---------------------------
+
+فرمانهایِ Emacs بسیار بسیار بیشتر است از آنچه که امکان قراردادن همه آنها
+با کاراکترها ی کنترل و متا باشد.
+ Emacs با فرمان( X (eXtend این کار را میسر میکند.
+دو حالت برای این وجود دارد:
+
+‏      C-x    کاراکتر برای  eXtend. بعد از یک کاراکتر.
+‏      M-x    فرمانی با نام eXtend. بعد از یک نام طولانی.
+
+اینها فرمانهایی هستند که عموما مفید هستند، اما کمتر ازفرمانهایی که قبلاً در
+مورد آنها آموخته اید استفاده می شوند. شما قبلاً چند مورد از انها را
+دیده‌اید: برای مثال فرمان فایل C-x C-f را برای یافتن و C-x C-s را برای
+ذخیره کردن در نظر بگیرید. مثال دیگر، فرمان C-x C-c فرمان پایان دادن به جلسه
+Emacs است. (نگران از دست دادن تغییراتی که ایجاد کرده اید نباشید C-x C-c
+پیشنهاد می کند هر فایل تغییر یافته را ذخیره کنید قبل از اتمام جلسه Emacs.)
+
+
+اگر از صفحه نمایش گرافیکی استفاده می کنید، نیازی به فرمان خاصی برای انتقال
+از Emacs به برنامه دیگر ندارید. شما می توانید این کار رابا ماوس یا با
+فرمانهای مدیر پنجره انجام دهید. با این حال،اگر شمااز ترمینال متنی که می
+تواند تنها یک برنامه را در یک زمان نشان دهد، استفاده می کنیدباید Emacs را
+"تعلیق" کنید تا به هر برنامه دیگری بروید.
+
+فرمان C-z خروج *موقت*--- از Emacs است تا بتوانید به همان جلسه Emacs
+برگردید. هنگامی که Emacs روی یک ترمینال متنی اجرا می شود، C-z، Emacs را به
+حالت تعلیق در می آورد. یعنی به shell برمی گردد اما کار Emacs را از بین نمی
+برد. در رایج ترین shell ها، شما می تواند Emacs را با فرمان "fg" یا با‪
+"%emacs"‬ از سر بگیرد.
+
+زمان استفاده از C-x C-c زمانی است که می خواهید از سیستم خارج شوید. همچنین
+برای خروج از Emacs و ویرایش سریع استفاده می شود، همانند یک ابزار مدیریت
+ایمیل.
+
+فرمانهای C-x زیادی وجود دارد. در اینجا لیستی از مواردی که یاد گرفته اید است:
+
+‏       C-x C-f       فایل را پیدا کنید
+‏       C-x C-s       ذخیره فایل
+‏       C-x s         برخی از بافرها را ذخیره کنید
+‏       C-x C-b       لیست بافرها
+‏       C-x b         سوئیچ بافر
+‏       C-x C-c       از Emacs خارج شوید
+‏       C-x 1         تمام پنجره ها را به جز یک حذف کنید
+‏       C-x u         لغو فرمان
+
+فرمانهایی با نام eXtended فرمانهایی هستند که به طور مکرر کمتر مورد استفاده
+قرار می گیرند یا فرمانهایی که فقط در حالت های خاصی استفاده می شوند.
+به عنوان یک مثال فرمان replace-string است که یک رشته حروف را جایگزین رشته
+حروف دیگری در بافر می کند. وقتی M-x را تایپ می‌کنید، Emacs درپایین صفحه با
+نشان دادنِ M-x از شما می‌خواهد نام فرمان را تایپ کنید؛ در اینجا یعنی
+"replace-string". فقط " <repl s<TAB" را تایپ کنید و Emacs نام فرمان را
+تکمیل می کند. (<TAB> کلید Tab است که معمولاً جایگاهش بالای کلید CapsLock یا
+Shift نزدیک لبه سمت چپ کیبورد است.) نام کامل شده فرمان را با <Return>
+ارسال کنید.
+
+فرمان replace-string به دو آرگومان نیاز دارد -- رشته جایگزین شونده
+و رشته ای که جایگزین آن شود.شما باید هر آرگومان رابا  <Return> پایان دهید.
+
+
+>> مکان نما را به خط خالی دو خط زیر این یکی ببرید.
+   سپس < M-x repl s<Return>changed<Return>altered<Return را تایپ کنید.
+
+
+   توجه کنید که این خط چگونه تغییر کرده است: شما کلمه "changed" را با"altered"
+   جایگزین کرده اید. هر جایی که بعد از موقعیت اولیه مکان نما رخ داد.
+
+
+* ذخیره خودکار
+---------------
+
+وقتی تغییراتی در فایلی ایجاد کرده اید، اما هنوز آنها را ذخیره نکرده اید،
+اگر کامپیوتر شما خراب شود، ممکن است از بین بروند. برای محافظت شما از آن،
+Emacs به صورت دوره ای برای هر فایلی که شما در حال ویرایش آن هستید یک فایل
+"ذخیره خودکار" می نویسد. نام فایل ذخیره خودکار دارای یک # در ابتدا و در
+پایان است؛ به عنوان مثال، اگر فایل شما "hello.c" نام دارد، ذخیره خودکار نام
+فایل "#hello.c#" است.وقتی فایل را به روش عادی ذخیره می کنید، Emacs فایل
+ذخیره خودکار خود را حذف می کند.
+
+اگر رایانه خراب شد، می‌توانید ویرایش ذخیره‌شده خودکار خود را توسط
+یافتن فایل به طور معمول (فایلی که در حال ویرایش آن بودید، نه ذخیره فایل  
خودکار)
+و سپس تایپ M-x recover-this-file <Return>  بازیابی کنید . هنگامی که
+تأیید آن را می خواهد،< yes<Return را تایپ کنید تابه ذخیره خودکار داده ها
+ادامه دهید و آن را بازیابی کنید.
+
+
+
+* منطقه اکو
+-----------
+
+اگر Emacs ببیند که به آرامی فرمانهای چند کاراکتری را تایپ می کنید، آن را
+انجام می دهد آنها را در پایین صفحه در ناحیه ای به نام "منطقه اکو" به شما
+نشان می دهد. ناحیه اکو حاوی خط پایین صفحه نمایش است.
+
+
+* خط حالت ( MODE LINE)
+-----------------------
+
+خط بلافاصله بالای ناحیه اکو "mode line" نامیده می شود.
+خط حالت چیزی شبیه به این می گوید:
+
+‏       TUTORIAL       63% L749    (Fundamental)  −**:−
+
+این خط، اطلاعات مفیدی در مورد وضعیت Emacs
+و متنی که در حال ویرایش آن هستید می دهد.
+
+شما از قبل می دانید که نام فایل به چه معناست -- این فایلی است که شما دارید.
+ NN% موقعیت فعلی شما را در متن بافر نشان می دهد. این
+به این معنی است که NN درصد از بافر بالای صفحه نمایش است.
+اگر بالای بافر روی صفحه باشد، به آن "Top" بجای  "0٪" می گوید.
+اگر پایین بافر روی صفحه باشد، "Bot" می گوید.
+اگر به بافری نگاه می کنید که آنقدر کوچک است که همه آن روی صفحه جا می شود,
+خط مد می گوید,  "All".
+
+حرف L و ارقام، موقعیت را به طریق دیگری نشان می دهند: آنها شماره خط فعلیِ
+نقطه را نشان می دهند.
+
+ستاره های نزدیک به جلو به این معنی است که شما تغییراتی در متن ایجاد کرده
+اید. درست پس از بازدید یا ذخیره یک فایل، آن قسمت از خط حالت، با خطوط تیره
+و بدون ستاره نمایش داده می شود.
+
+آن بخشی از خط حالت که در داخل پرانتز است گویایِ
+حالت‌های ویرایشی فعلی هستند. حالتی  که الان استفاده می کنید Fundamental است.
+این نمونه ای از "مد ماژر  (major mode)" است.
+
+ایمکس  حالت های اصلی مختلف فراوان دارد. برخی از آنها برای
+ویرایش زبان های برنامه ریزی مختلف مثل Lisp هستند و برخی برای
+ویرایش متن هستند، و غیره.
+
+در هر زمان یک و تنها یک مد ماژر فعال است، و نام آن را همیشه می توان در خط
+حالت، دقیقاً در جایی که اکنون "Fundamental" است، یافت.
+
+هر مد ماژر باعث می شود که برخی از فرمانها متفاوت عمل کنند. مثلا، فرمانهایی
+برای ایجاد comment در یک برنامه وجود دارد و از آنجایی که هر کدام از
+زبانهای برنامه نویسی ایده متفاوتی در مورد آنچه که یک comment باید باشد
+دارند هر مد ماژر باید comment رابه طور متفاوتی درج کند. هر یک از مدهای
+ماژر نام یک فرمان توسعه یافته است، که چگونه می توانید به آن حالت تغییر
+دهید. برای مثال، M-x fundamental-mode فرمانی است که به حالت اساسی بروید.
+
+اگر قرار است متنی به زبان انسانی مانند: این فایل را ویرایش کنید، شما
+احتمالا باید از حالت متن استفاده کنید.
+
+>> تایپ کنید  < M-x text-mode <Return
+
+نگران نباشید، هیچ یک از فرمانهایِ Emacs که یاد گرفته اید تغییر نمی کند اما
+می توانید مشاهده کنید که M-f و M-b اکنون آپاستروف ها به عنوان بخشی از
+کلمات رفتارمی کنند.قبلاً در حالت بنیادی، M-f و M-b مانند آپاستروف ها به عنوان
+جداکننده کلمات رفتار می کردند.
+
+
+اکثر فرمانها در هر مد ماژر "همان کار" را انجام می دهند، امادرمواردی مانند
+مثال بالا کمی متفاوت عمل می کنند.
+
+
+برای مشاهده اطلاعات امدادی در مد ماژر فعلی خود، C-h m را تایپ کنید.
+
+>> مکان نما را به خط زیر این خط ببرید.
+>> C-l C-l را تایپ کنید تا این خط به بالای صفحه نمایش داده شود.
+>> C-h m را تایپ کنید تا ببینید مدِ Text با مدِ Fundamental چه تفاوتی دارد.
+>> C-x 1 را تایپ کنید تا اطلاعات امدادی را از روی صفحه حذف کنید.
+
+مد ماژور را ماژر می نامند زیرا مد ماینور نیز وجود دارد. مدهای ماینور
+جایگزینی برای مدهای ما‍‍‍ژور نیستند، فقط آنها را تغیر و تبدیل می کنند. هر مد
+ماینور می تواند خودش مستقلانه روشن یا خاموش گردد، مستقل ازتمام مدهای
+ماینور دیگر،و مستقل از مد ماژر فعلی شما. بنابراین می توانید از هیچ مد
+ماینور، یک مد ماینور و یاترکیبی از چند مد ماینور استفاده کنید.
+
+
+یک مد ماینور که بسیار مفید است، به خصوص برای ویرایش متن به زبان انسانی
+(human-language)، مد ماینورِ خود−پر کن (Auto Fill mode) است. وقتی این مد
+روشن است, و شما با نوشتن متن، خطی بوجود می آورد که خیلی طولانی است،Emacs
+خط بین کلمات را به طور خودکار می شکند.
+
+
+شما می توانید با انجام <M-x auto-fill-mode <Return, مد ماینور خودکار را
+روشن کنید. وقتی مد روشن است، می توانید با انجام < M-x auto-fill-mode
+<Return دوباره آن را خاموش کنید. اگر مد خاموش باشد، با این فرمان روشن می
+شود واگر مد روشن است، این فرمان آن را خاموش می کند. ما به این فرمان "تغییر
+مد" می گوییم.
+
+
+>>اکنون  <M-x auto-fill-mode <Return را تایپ کنید.
+  سپس یک خط "asdf" را وارد کنید،آن را تکرار کنید تا زمانی که ببینید که به
+  دو خط تقسیم شده است. شماباید فاصله (spaces) بین آنها بوجود آورید، زیرا
+  Auto Fill خطوط را فقط درفواصل می شکند.
+
+حاشیه معمولاً از 70 کاراکتر تشکیل می شود، اما شما می توانید آن را با فرمان
+C-x f تغییر دهید. شما باید تنظیمات حاشیه ای را که می خواهید بدهید،همراه با
+استدلال عددی باشد.
+
+‏> C-x f را با آرگومان 20 تایپ کنید. (C-u 2 0 C-x f).
+   سپس مقداری متن را تایپ کنید و سپس ببینید Emacs، خطوط 20 کاراکتری را با
+   آن پر می کنید. سپس با استفاده از C-x f، دوباره حاشیه را به 70
+   برگردانید.
+
+
+اگر در وسط پاراگراف تغییراتی ایجاد کردید، حالت پر کردن خودکار دوباره آن را
+برای شماپر نمی کند. برای پر کردن مجدد پاراگراف، M-q (META-q) رابا مکان نما
+در داخل آن پاراگراف تایپ کنید.
+
+
+>> مکان نما را به پاراگراف قبلی ببرید و M-q را تایپ کنید.
+
+
+* جستجوکردن
+-----------
+
+با Emacs می توانید رشته ها را جستجو کند («رشته:string » گروهی از
+کاراکترهای به هم پیوسته است). جستجو به جلو در متن یا به عقب در متن.
+جستجوی برای یک string یک فرمان حرکت مکان نما است. آن مکان نما را به مکان
+بعدی که آن رشته ظاهر می شود حرکت می دهد.
+
+فرمان جستجوی Emacs "افزایشی" است. این بدان معنی است که
+جستجو زمانی اتفاق می افتد که رشته مورد نظر را برای جستجو تایپ می کنید.
+
+فرمان شروع جستجو C-s برای جستجوی جلو و C-r برای جستجوی معکوس است.
+اما صبر کنید! اکنون آنها را امتحان نکنید.
+
+وقتی C-s را تایپ می کنید متوجه خواهید شد که رشته "I-search" به صورت یک
+اعلان در ناحیه اکو ظاهر می شود. این به شما می گوید که Emacs مشغول کاری است
+که یک جستجوی افزایشی نامیده می شود و در آن حالت منتظر شماست تامورد جستجو
+را تایپ کنید. <Return> یک جستجو را خاتمه می دهد.
+
+>> اکنون C-s را برای شروع جستجو تایپ کنید
+   کلمه"مکان نما" را  به آرامی، با تک تک حروف تایپ کنید، پس از تایپ
+   هر کاراکتر مکث کنید, تا متوجه آنچه برای مکان نما اتفاق می افتد شوید.
+   اکنون یک بار "مکان نما" را جستجو کرده اید.
+>> دوباره تایپ کنید C-s، برای جستجوی رخداد بعدی "مکان نما".
+>> اکنون <DEL> را چهار بار تایپ کنید و ببینید مکان نما چگونه حرکت می کند.
+>> برای پایان یافتن جستجو، <Return> را تایپ کنید.
+
+دیدید چه اتفاقی افتاد؟ Emacs، در یک جستجوی افزایشی، سعی می کند
+به رخداد رشته ای که تاکنون تایپ کرده اید بروید.
+برای رفتن به رخداد بعدی "مکان نما"، فقط C-s را دوباره تایپ کنید. اگر چنین
+رخدادی وجود ندارد، Emacs بوق می‌زند و به شما می‌گوید جستجو در حال حاضر
+"شکست" خرده است. C-g نیز جستجو را خاتمه می دهد.
+
+اگر در وسط یک جستجوی افزایشی هستید و <DEL> را تایپ کنید،
+جستجو، "عقب نشینی" به مکان قبلی میکند. اگر برای پیشرفت جستجوی رشته ای بعدی،
+بعد از اینکه C-s را تایپ کردید <DEL> را تایپ کنید،
+<DEL> مکان نما را به یک اتفاق قبلی برمی گرداند. اگر
+هیچ مورد قبلی در رشته جستجو وجود نداشته باشد، <DEL> آخرین کاراکتر را
+در رشته جستجوپاک می کند.
+ برای مثال، فرض کنید "م" را تایپ کرده اید
+برای اولین بار "م" را جستجو کنید. حالا اگر "ک" را تایپ کنید،
+مکان نما به اولین رخداد "مک" حرکت می کند. حالا <DEL> را تایپ کنید.
+این "ک" را از رشته جستجو پاک می کند و مکان نما به به اولین وقوع "م" در
+رشته جستجو به عقب برمی گردد.
+
+اگر در وسط یک جستجو هستید و کاراکتر کنترل یا متا را تایپ کنید،
+شخصیت (به استثنای معدود کاراکتر هایی که در یک جستجو خاص هستند،
+مانند C-s و C-r)، جستجو خاتمه می یابد.
+
+با C-s جستجو را بعد از موقعیت مکان نمای فعلی شروع می کنید و هر رخدادی از رشته
+بعد از مکان نما جستجو می شود. اگر می خواهید چیزی در متن قبل از مکان نما جستجو
+شود، به جای آن، C-r را تایپ کنید. همه چیزهایی که ما در مورد C-s
+گفته ایم برای C-r نیز صدق می کند، با این تفاوت که جهت جستجو معکوس  می شود.
+
+
+* پنجره های چندگانه
+--------------------
+
+یکی از ویژگی های خوب Emacs این است که می توانید در یک زمان بیشتر ازیک
+پنجره روی صفحه نمایش نشان دهید. (توجه داشته باشید که Emacs ازاصطلاح
+"frames"-- که در بخش بعدی توضیح داده شده است -- برای برخی کاربرد دیگر
+"windows" گفته می شود. کتابچه راهنمای Emacs حاوی واژه نامه ای ازشرایط
+استفاده Emacs.)
+
+>> مکان نما را به این خط ببرید و C-l C-l را تایپ کنید.
+
+>> حالا C-x 2 را تایپ کنید که صفحه را به دو پنجره تقسیم می کند. هر دو
+   پنجره این آموزش را نمایش می دهند. مکان نمای ویرایش در پنجره بالا باقی
+   می ماند.
+
+>> تایپ  C-M-v  برای رفتن به پایین پنجره .
+   (اگر کلید META واقعی ندارید، <ESC> C-v را تایپ کنید.)
+
+>> تایپ کنید C-x o ("o" برای "other"دیگر ) برای حرکت مکان نما به پنجره پایین.
+>> از C-v و M-v در پنجره پایین برای پیمایش استفاده کنید.
+   به خواندن این فرمانهای عمل، در پنجره بالا ادامه دهید.
+
+>> دوباره C-x o را تایپ کنید تا مکان نما را به پنجره بالا برگردانید.
+   مکان نما در پنجره بالا دقیقاً همان جایی است که قبلا بود.
+
+می توانید از C-x o برای جابجایی بین پنجره ها استفاده کنید. "پنجره انتخاب
+شده" جایی که بیشترین ویرایش در آن صورت می گیرد، همان پنجره ای است که مکان
+نما برجسته است، و زمانی که تایپ نمی کنید چشمک می زند. پنجره های دیگر
+موقعیت مکان نمای خود را دارند. اگر Emacs را به صورت گرافیکی اجرا می کنید،
+آن مکان نماها به صورت کادرهای توخالی بدون چشمک‌زن ترسیم می‌شوند.
+
+
+فرمان C-M-v هنگامی که متن را در یک پنجره ویرایش می کنید و از پنجره دیگر
+فقط برای مرجع استفاده میکند، بدون ترک پنجره انتخاب شده، بسیار مفید است.
+می توانید متن را باC-M-v در پنجره دیگر پیمایش کنید.
+
+مثال C-M-v نمونه ای از یک کاراکتر CONTROL-META است. اگر یک کلید META
+‪(Alt یا)‬ دارید با نگه داشتن هر دو کلید CONTRO و META و تایپ v,
+میتوانید C-M-v را تایپ کنید. مهم نیست که CONTROL اول باشد یا META.
+زیرا هر دوی این کلیدها با تغییر کاراکترهای شما عمل می کنند.
+
+
+اگر کلید META ندارید و به جای آن از <ESC> استفاده می کنید، مهم است که
+ترتیب را انجام دهید: باید <ESC> و سپس CONTROL-v را تایپ کنید، زیرا
+CONTROL-<ESC> v کار نخواهد کرد. این به این دلیل است که <ESC> در نوع خود
+یک کاراکتر است، نه یک کلید اصلاح کننده.
+
+>> با تایپ C-x 1 (در پنجره بالا) از شر پنجره پایین خلاص شوید.
+
+(اگر C-x 1 را در پنجره پایین تایپ کرده بودید، پنجره بالا خلاص می شد. این
+فرمان را به صورت «فقط یک پنجره را -- هم آنکه هم اکنون در آن هستم نگه دار»
+در نظر بگیرید.
+
+
+شما مجبور نیستید یک بافر را در هر دو پنجره نمایش دهید. اگر شما از C-x C-f
+برای پیدا کردن فایل در یک پنجره استفاده کنید، در پنجره دیگر تغییر ایجاد
+نمی شود. شما می توانید یک فایل را در هر پنجره به طور مستقل پیدا کنید.
+
+در اینجا روش دیگری برای استفاده از دو پنجره برای نمایش دو چیز مختلف وجود دارد:
+
+>> فرمان C-x 4 C-f و سپس نام یکی از فایل های خود را تایپ کنید.
+   با <Return> خاتمه دهید. ببینید فایل مشخص شده در پایین ظاهر می شود و
+   پنجره مکان نما نیز به آنجا می رود.
+
+>> برای بازگشت به پنجره بالا C-x o و برای حذف پنجره پایین C-x 1 را تایپ کنید.
+
+
+*فریم های چندگانه (MULTIPLE FRAMES)
+----------------------------------
+
+با Emacs همچنین می توانید چندین "فریم" ایجاد کنید. یک فریم، مجموعه ای
+ازپنجره ها است که فهرست آن: اسکرول بارها، اکو بار، و غیره است. در
+نمایشگرهای گرافیکی، چیزی که Emacs آن را "فریم" می نامد همان چیزی است که
+اکثر برنامه های کاربردی دیگر "پنجره" می نامند. فریم های گرافیکی متعدد را
+می توان همزمان بر روی صفحه نمایش نشان داد. در یک ترمینال متنی فقط یک فریم
+را می توان در یک زمان نشان داد.
+
+‏ >>   C-x 5 2 را تایپ کنید.
+   مشاهده می کنید که یک فریم جدید روی صفحه نمایش شما ظاهر می شود.
+
+شما می توانید هر کاری را که در فریم اصلی انجام داده اید در فریم جدید
+انجام دهید. هیچ چیز خاصی در فریم اول وجود ندارد.
+
+‏>> C-x 5 0 را تایپ کنید.
+   این فریم انتخاب شده را حذف می کند.
+
+شما همچنین می توانید یک فریم را با استفاده از روش معمولی ارائه شده توسط
+سیستم گرافیکی (اغلب با کلیک روی دکمه ای با نشان "X" در گوشه بالای فریم)بردارید.
+اگر آخرین فریمِ کار Emacs را به این ترتیب حذف کنید،از Emacs خارج می شود.
+
+
+* سطوح ویرایش بازگشتی
+----------------------
+
+گاهی اوقات وارد چیزی می شوید که«سطوح ویرایش بازگشتی» نامیده می شود.
+این با کروشه های مربع در خط حالت اطراف پرانتزهای نام مد ماژر
+نشان داده می شود. برای مثال، ممکن است [(اساسی)] را به جای (اساسی) ببینید.
+
+برای خارج شدن از سطح ویرایش بازگشتی، <ESC> <ESC> <ESC> را تایپ کنید.
+این یک فرمان همه منظوره "برو بیرون" است. همچنین می توانید از آن برای
+حذف پنجره های اضافی و خارج شدن از مینی بافر استفاده کنید.
+
+>> تایپ M-x، تا وارد یک مینی بافر شوید. سپس برای بیرون رفتن
+‏   <ESC> <ESC> <ESC> را تایپ کنید.
+
+شما نمی توانید از C-g برای خارج شدن از یک سطح ویرایش بازگشتی استفاده کنید.
+زیرا C-g برای لغو فرمانها و آرگومان ها در داخل سطح ویرایش بازگشتی
+استفاده می شود.
+
+
+
+* دریافت کمک بیشتر
+-------------------
+
+در این آموزش سعی شده است اطلاعات کافی برای شروع به استفاده از Emacs در
+اختیار شما قرار گیرد. اطلاعات موجود در مورد Emacs آنقدر زیاد است که توضیح
+همه چیز در اینجا غیرممکن است. با این حال، ممکن است بخواهید اطلاعات بیشتری
+در مورد Emacs کسب کنید زیرا Emacs دارای بسیاری از ویژگی های مفید دیگر است.
+Emacs فرمانهایی رابرای خواندن اسناد در مورد Emacs ارائه می دهد. فرمانهای
+"help" همه با کاراکتر CONTROL-h که " کارکتر Help" نامیده می شود شروع
+می شوند.
+
+
+برای استفاده از ویژگی های Help، کاراکتر C-h و سپس کارکتری که می گوید شما
+چه نوع کمکی می خواهید را تایپ کنید. اگر شما واقعاً گم شده اید، ? C-h را
+تایپ کنید و Emacs به شما خواهد گفت که چه نوع کمکی می تواند ارائه دهد. اگر
+C-h را تایپ کرده اید و به این نتیجه رسیده اید که هیچ کمکی نمی خواهید، فقط
+برای لغو آن، C-g را تایپ کنید.
+
+(اگر C-h پیامی در مورد راهنما در پایین صفحه نمایش نمی دهد،
+روی صفحه به جای آن کلید F1 یا< M-x help <Return را تایپ کنید.)
+
+اساسی ترین ویژگی HELP یا کمک، C-h c است. تایپ کنید C-h، کاراکتر c و یک
+کاراکتر یا دنباله فرمان؛ سپس Emacs یک خلاصه بسیار کوتاه از شرح فرمان نمایش
+می دهد.
+
+‏ >> C-h c C-p را تایپ کنید.
+
+پیام باید چیزی شبیه این باشد:
+
+‏      C-p runs the command previous-line
+
+این "نام فرمان -- function" را به شما می گوید. نام فرمان از بابت کاری که
+فرمان انجام می دهد انتخاب می شود. نام فرمان می تواند به عنوان اطلاعات
+امدادی بسیار مختصر باشد - برای یادآوری فرمانهایی که شما قبلا یاد گرفته اید.
+
+
+فرمانهایی چند کاراکتری مانند C-x C-s و ESC>v> (به جای M-v،اگر کلید META یا
+ALT ندارید) همچنین پس از C-h c نیز مجاز هستند.
+
+
+برای دریافت اطلاعات بیشتر در مورد یک فرمان، به جای C-h c از C-h k استفاده
+کنید.
+
+
+‏>> C-h k C-p را تایپ کنید.
+
+این مستندات تابع و همچنین نام آن را در یک پنجره ایمکس  نمایش می دهد.
+وقتی خواندن خروجی تمام شد، برای خلاص شدن از شر آن پنجره C-x 1 را تایپ کنید.
+شما مجبور نیستید این کار را به سرعت انجام دهید.
+می توانید در حین مراجعه به متن راهنما مقداری ویرایش انجام دهید
+و سپس C-x 1 را تایپ کنید.
+
+در اینجا چند گزینه مفید دیگر C-h وجود دارد:
+
+‏    C-h x     یک فرمان را توصیف کنید. شما نام آن فرمان را تایپ می کنید.
+
+
+>>  فرمانِ  <C-h x previous-line <Return را تایپ کنید.
+   این تمام اطلاعات ایمکس را در مورد آن نمایش می دهد.
+   تابعی که فرمان C-p را پیاده سازی می کند.
+
+یک فرمان مشابه C-h v اطلاعات امدادیِ متغیرها "variables" را نمایش می دهد, و
+گاهی اجازه میدهد تا بتوانید مقادیر متغیرها را برای خاص کردن رفتار ایمکس
+تنظیم کنید. زمانی که ایمکس از آن درخواست کرد، باید نام متغیر را تایپ کنید.
+
+‏     C-h a        فرمان Apropos.
+                   یک کلمه کلیدی را تایپ کنید و ایمکس تمام فرمانهایی که نام
+                   آنها حاوی آن کلمه کلیدی است لیست میکند. همه این فرمانها
+                   را می توان با META-x احضار کرد. برای برخی از فرمانها،
+                   Command Apropos نیز یک فهرست دنباله ای است از یک یا چند
+                   کاراکتر که بافرمان یکسان اجرا می شود.
+
+
+>> فرمان <c-h a file <Return راتایپ کنید.
+
+در پنجره ای دیگر لیستی از تمام فرمانهایی M-x با "file" به نام آنها نمایش
+داده می شود. شما فرمانهای کاراکتر را در کنار آن نام فرمانهای مربوطه (مانند
+C-x C-f در کنار find-file) خواهید دید.
+
+
+>> برای پیمایش پنجره راهنما، C-M-v را تایپ کنید. این را چند بار انجام دهید.
+
+‏>> C-x 1 را تایپ کنید تا پنجره راهنما را حذف کنید.
+
+‏   C-h i          خواندن کتابچه راهنمای همراه (با نام مستعار اطلاعات Info).
+                   این فرمان شما را به یک بافر ویژه به نام "*info*" یا
+                   اطلاعات قرار می دهد که در آن شما می توانید کتابچه
+                   راهنمای بسته های نصب شده روی سیستم خود را بخوانید. برای
+                   خواندن کتابچه راهنما < m emacs<Return را تایپ کنید. اگر
+                   قبلاً از Info استفاده نکرده‌اید، Emacs و h را تایپ کنید,
+                   آن شما را به یک راهنمای تور از امکانات حالت info می برد.
+                   پس از اتمام این آموزش، باید به کتابچه راهنمای
+                   Emacs Info به عنوان مستندات اصلی خود مراجعه کنید.
+
+
+* ویژگی های بیشتر
+------------------
+
+شما می‌توانید با مطالعه کتابچه راهنمای ایمکس اطلاعات بیشتری کسب کنید. مانند
+یک کتاب چاپ شده، یا داخل Emacs (از منوی Help یا C-h r استفاده کنید). دو
+ویژگی که ممکن است به خصوص دوست داشته باشید، توانایی تکمیل "Completion" که
+باعث کمتر تایپ کردن میشود و dired، که مدیریت رسیدگی به فایل را ساده می کند.
+
+تکمیل راهی برای جلوگیری از تایپ غیر ضروری است. به عنوان مثال، اگر شما
+می‌خواهید به بافر *Messages* بیاید، می‌توانید< C-x b *M<Tab را تایپ کنید، و
+Emacs بقیه نام بافر را تا جایی که می تواند از آنچه قبلاً تایپ کرده اید پر
+می کند. تکمیل کردن هم چنین برای نام فرمانها ونام فایل ها به کار می آید. در
+کتابچه راهنمای ایمکس، در بخشی به نام "تکمیل Completion " توضیح داده شده
+است.
+
+
+با Dired شما قادر هستید تا فایل ها (و به صورت اختیاری زیر شاخه های آن) را
+در یک فهرست کنید. در اطراف آن لیست حرکت کنید، بازدید کنید، نام خود را
+تغییر دهید، حذف کنید و به صورت دیگر روی فایل ها کار کنید. در کتابچه
+راهنمای ایمکس در بخشی به نام "Dired" توضیح داده شده است.
+
+
+این کتابچه راهنمای بسیاری از ویژگی های دیگر ایمکس را نیز توضیح می دهد.
+
+
+* جمع بندی
+------------
+
+برای خروج از Emacs از C-x C-c استفاده کنید.
+
+این آموزش برای همه کاربران جدید باید قابل درک باشد، بنابراین اگر
+چیز مبهمی پیدا کردید، ننشینید و تو سر خودتان نزنید - شکایت کنید!
+
+
+* کپی برداری
+--------------
+
+این آموزش حاصل زنجیره ای طولانی از آموزش های Emacs است که با کتابی به نوشته
+Stuart Cracraft  سر چشمه گرفت.
+
+این نسخه از آموزش بخشی از GNU Emacs است. دارای حق چاپ است
+و با مجوز برای توزیع کپی در شرایط خاص همراه است:
+
+  Copyright (C) 1985, 1996, 1998, 2001-2022 Free Software Foundation, Inc.
+
+  This file is part of GNU Emacs.
+
+  GNU Emacs is free software: you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation, either version 3 of the License, or
+  (at your option) any later version.
+
+  GNU Emacs is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
+
+لطفاً فایل COPYING را بخوانید و سپس کپی هایی از GNU Emacs را به دوستانتان 
بدهید.
+کمک کنید تا از شر قاعدیِ اشتباهِ کپی رایت غربی راحت شویم.
+
+
+
+--- end of TUTORIAL.fa ---
+
+;;; Local Variables:
+;;;   coding: utf-8
+;;;   bidi-display-reordering: t
+;;;   sentence-end-double-space: nil
+;;;   bidi-paragraph-direction: nil
+;;;   fill-column: 74
+;;; End:
diff --git a/etc/tutorials/TUTORIAL.translators 
b/etc/tutorials/TUTORIAL.translators
index 64d71b61e84..222703cdb9f 100644
--- a/etc/tutorials/TUTORIAL.translators
+++ b/etc/tutorials/TUTORIAL.translators
@@ -30,6 +30,10 @@ Maintainer: Rafael Sepúlveda <drs@gnulinux.org.mx>
 Author:     Protesilaos Stavrou <info@protesilaos.com>
 Maintainer: Protesilaos Stavrou <info@protesilaos.com>
 
+* TUTORIAL.fa:
+Author:     Mohsen BANAN <emacs@mohsen.1.banan.byname.net>
+Maintainer: Mohsen BANAN <emacs@mohsen.1.banan.byname.net>
+
 * TUTORIAL.fr:
 Author:     Éric Jacoboni <jaco@teaser.fr>
 Maintainer: Éric Jacoboni <jaco@teaser.fr>
diff --git a/leim/MISC-DIC/CTLau-b5.html b/leim/MISC-DIC/CTLau-b5.html
index 117a6ee374e..f174e61db2b 100644
--- a/leim/MISC-DIC/CTLau-b5.html
+++ b/leim/MISC-DIC/CTLau-b5.html
@@ -197,7 +197,7 @@ GAM 
 GAN ����ڤy���������Ի����
 GANG ���ü�]�ոe�C
 GAP �F���
-GAT ���N��˸
+GAT ���N��˸��
 GAU �s�¤E���e�����h���[�b�\�ϩS�����
 GEI �X�O����J���޺ߦٰ��ծV�vɫ�H�ҧ���T���B��
 GENG ���V
@@ -231,7 +231,7 @@ GWAAT 
 GWAI �d�u���cֺ�k�t�ӭy���ޮ۸��Q�����X�o�����
 GWAN �g�x���u�Ҷv�p�O�a
 GWANG �F
-GWAT �����]��
+GWAT �����]���
 GWING ��
 GWOH �L�G��q������
 GWOK �����
diff --git a/lisp/international/characters.el b/lisp/international/characters.el
index 518436bd961..9aea5e27063 100644
--- a/lisp/international/characters.el
+++ b/lisp/international/characters.el
@@ -695,6 +695,16 @@ with L, LRE, or LRO Unicode bidi character type.")
     (set-case-syntax c "_" tbl)
     (setq c (1+ c)))
 
+  ;; Traditional Mongolian
+  (setq c #x1800)
+  (while (<= c #x180A)
+    (set-case-syntax c "." tbl)
+    (setq c (1+ c)))
+  (setq c #x11660)
+  (while (<= c #x1166C)
+    (set-case-syntax c "." tbl)
+    (setq c (1+ c)))
+
   ;; Coptic
   ;; There's no Coptic category.  However, Coptic letters that are
   ;; part of the Greek block above get the Greek category, and those
diff --git a/lisp/international/fontset.el b/lisp/international/fontset.el
index a60ce4c4df6..bbb1993ba3c 100644
--- a/lisp/international/fontset.el
+++ b/lisp/international/fontset.el
@@ -651,6 +651,8 @@
             (nil . "MuleArabic-1")
             (nil . "MuleArabic-2")
             (nil . "ISO8859-6"))
+     (mongolian ,(font-spec :registry "iso10646-1"
+                           :otf '(mong nil (init medi fina isol))))
 
      (hebrew ,(font-spec :registry "iso10646-1" :script 'hebrew)
             (nil . "ISO8859-8"))
diff --git a/lisp/language/cyrillic.el b/lisp/language/cyrillic.el
index ffed1c808f7..7af87e65703 100644
--- a/lisp/language/cyrillic.el
+++ b/lisp/language/cyrillic.el
@@ -256,6 +256,16 @@ Support for Russian using koi8-r and the russian-computer 
input method.")
 \(The name Belarusian replaced Byelorussian in the early 1990s.)"))
  '("Cyrillic"))
 
+;; The Mongolian-traditional language environment is in misc-lang.el.
+(set-language-info-alist
+ "Mongolian-cyrillic" '((coding-system utf-8)
+                       (coding-priority utf-8)
+                       (input-method . "cyrillic-mongolian")
+                       (sample-text . "Mongolian (монгол хэл)  Сайн байна уу?")
+                       (documentation
+                        . "Support for Mongolian language with Cyrillic 
alphabet."))
+ '("Cyrillic"))
+
 (provide 'cyrillic)
 
 ;;; cyrillic.el ends here
diff --git a/lisp/language/misc-lang.el b/lisp/language/misc-lang.el
index fe283e8769c..792155f1de5 100644
--- a/lisp/language/misc-lang.el
+++ b/lisp/language/misc-lang.el
@@ -74,10 +74,11 @@ and Italian.")))
            (coding-priority utf-8 iso-8859-6 windows-1256)
            (input-method . "farsi-transliterate-banan")
            (sample-text . "Persian     فارسی")
-           (documentation . "Bidirectional editing is supported.")))
+           (documentation . "Bidirectional editing is supported.")
+            (tutorial . "TUTORIAL.fa")))
 
 (defcustom arabic-shaper-ZWNJ-handling nil
-  "How to handle ZWMJ in Arabic text rendering.
+  "How to handle ZWNJ (Zero-width Non-Joiner) in Arabic text rendering.
 This variable controls the way to handle a glyph for ZWNJ
 returned by the underling shaping engine.
 
@@ -339,6 +340,30 @@ Coptic language using the Coptic script is supported in 
this
 language environment."))
  '("Misc"))
 
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Traditional Mongolian
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;; The Mongolian-cyrillic language environment is in cyrillic.el.
+(set-language-info-alist
+ "Mongolian-traditional" '((coding-system utf-8)
+                          (coding-priority utf-8)
+                          ; (input-method . "FIXME")
+                          (sample-text . "Mongolian Traditional (ᠮᠣᠩᠭᠣᠯ 
ᠪᠢᠴᠢᠭ᠋)        ᠰᠠᠶᠢᠨ ᠪᠠᠶᠢᠨ᠎ᠠ ᠤᠤ?")
+                          (documentation
+                           . "Support for Mongolian language with traditional 
script."))
+ '("Misc"))
+
+;; Composition rules for Mongolian Traditional script.
+(set-char-table-range
+ composition-function-table
+ '(#x1820 . #x18AF)
+ (list (vector "[\u200C\u200D][\u1820-\u18AF][\u200C\u200D]?"
+               1 'font-shape-gstring)
+       (vector "[\u1820-\u18AF][\u200C\u200D]" 0 'font-shape-gstring)
+       (vector "[\u1820-\u18AF\u202F\u180B-\u180F\u1807]+"
+               0 'font-shape-gstring)))
+
 (provide 'misc-lang)
 
 ;;; misc-lang.el ends here
diff --git a/lisp/ldefs-boot.el b/lisp/ldefs-boot.el
index acf8a1d2556..ddaa3f83fbb 100644
--- a/lisp/ldefs-boot.el
+++ b/lisp/ldefs-boot.el
@@ -2919,11 +2919,6 @@ and corresponding effects.
 (register-definition-prefixes "semantic/bovine/c" '("semantic"))
 
 
-;;; Generated autoloads from progmodes/c-ts-common.el
-
-(register-definition-prefixes "c-ts-common" '("c-ts-common-"))
-
-
 ;;; Generated autoloads from progmodes/c-ts-mode.el
 
 (autoload 'c-ts-base-mode "c-ts-mode" "\
@@ -2965,6 +2960,10 @@ To use tree-sitter C/C++ modes by default, evaluate
 
 in your configuration.
 
+Since this mode uses a parser, unbalanced brackets might cause
+some breakage in indentation/fontification.  Therefore, it's
+recommended to enable `electric-pair-mode' with this mode.
+
 (fn)" t)
 (autoload 'c-or-c++-ts-mode "c-ts-mode" "\
 Analyze buffer and enable either C or C++ mode.
@@ -5129,8 +5128,6 @@ evaluate `compilation-shell-minor-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\\{compilation-shell-minor-mode-map}
-
 (fn &optional ARG)" t)
 (autoload 'compilation-minor-mode "compile" "\
 Toggle Compilation minor mode.
@@ -5154,8 +5151,6 @@ evaluate `compilation-minor-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\\{compilation-minor-mode-map}
-
 (fn &optional ARG)" t)
 (autoload 'compilation-next-error-function "compile" "\
 Advance to the next error message and visit the file where the error was.
@@ -8618,7 +8613,7 @@ A second call of this function without changing point 
inserts the next match.
 A call with prefix PREFIX reads the symbol to insert from the minibuffer with
 completion.
 
-(fn PREFIX)" t)
+(fn PREFIX)" '("P"))
 (autoload 'ebrowse-tags-loop-continue "ebrowse" "\
 Repeat last operation on files in tree.
 FIRST-TIME non-nil means this is not a repetition, but the first time.
@@ -9230,24 +9225,25 @@ Turn on EDT Emulation." t)
 
 ;;; Generated autoloads from progmodes/eglot.el
 
-(push (purecopy '(eglot 1 13)) package--builtin-versions)
+(push (purecopy '(eglot 1 14)) package--builtin-versions)
 (autoload 'eglot "eglot" "\
-Start LSP server in support of PROJECT's buffers under MANAGED-MAJOR-MODE.
+Start LSP server for PROJECT's buffers under MANAGED-MAJOR-MODES.
 
-This starts a Language Server Protocol (LSP) server suitable for the
-buffers of PROJECT whose `major-mode' is MANAGED-MAJOR-MODE.
-CLASS is the class of the LSP server to start and CONTACT specifies
-how to connect to the server.
+This starts a Language Server Protocol (LSP) server suitable for
+the buffers of PROJECT whose `major-mode' is among
+MANAGED-MAJOR-MODES.  CLASS is the class of the LSP server to
+start and CONTACT specifies how to connect to the server.
 
-Interactively, the command attempts to guess MANAGED-MAJOR-MODE
-from the current buffer's `major-mode', CLASS and CONTACT from
-`eglot-server-programs' looked up by the major mode, and PROJECT from
-`project-find-functions'.  The search for active projects in this
-context binds `eglot-lsp-context' (which see).
+Interactively, the command attempts to guess MANAGED-MAJOR-MODES,
+CLASS, CONTACT, and LANGUAGE-IDS from `eglot-server-programs',
+according to the current buffer's `major-mode'.  PROJECT is
+guessed from `project-find-functions'.  The search for active
+projects in this context binds `eglot-lsp-context' (which see).
 
-If it can't guess, it prompts the user for the mode and the server.
-With a single \\[universal-argument] prefix arg, it always prompts for COMMAND.
-With two \\[universal-argument], it also always prompts for MANAGED-MAJOR-MODE.
+If it can't guess, it prompts the user for the mode and the
+server.  With a single \\[universal-argument] prefix arg, it
+always prompts for COMMAND.  With two \\[universal-argument], it
+also always prompts for MANAGED-MAJOR-MODE.
 
 The LSP server of CLASS is started (or contacted) via CONTACT.
 If this operation is successful, current *and future* file
@@ -9265,12 +9261,12 @@ CONTACT specifies how to contact the server.  It is a
 keyword-value plist used to initialize CLASS or a plain list as
 described in `eglot-server-programs', which see.
 
-LANGUAGE-ID is the language ID string to send to the server for
-MANAGED-MAJOR-MODE, which matters to a minority of servers.
+LANGUAGE-IDS is a list of language ID string to send to the
+server for each element in MANAGED-MAJOR-MODES.
 
 INTERACTIVE is ignored and provided for backward compatibility.
 
-(fn MANAGED-MAJOR-MODE PROJECT CLASS CONTACT LANGUAGE-ID &optional 
INTERACTIVE)" t)
+(fn MANAGED-MAJOR-MODES PROJECT CLASS CONTACT LANGUAGE-IDS &optional 
INTERACTIVE)" t)
 (autoload 'eglot-ensure "eglot" "\
 Start Eglot session for current buffer if there isn't one.")
 (put 'eglot-workspace-configuration 'safe-local-variable 'listp)
@@ -9400,7 +9396,7 @@ Describe CTR if it is a class constructor.
 
 ;;; Generated autoloads from emacs-lisp/eldoc.el
 
-(push (purecopy '(eldoc 1 13 0)) package--builtin-versions)
+(push (purecopy '(eldoc 1 14 0)) package--builtin-versions)
 
 
 ;;; Generated autoloads from elec-pair.el
@@ -9527,15 +9523,6 @@ optional prefix argument REINIT is non-nil.
 (register-definition-prefixes "elint" '("elint-"))
 
 
-;;; Generated autoloads from progmodes/elixir-ts-mode.el
-
-(autoload 'elixir-ts-mode "elixir-ts-mode" "\
-Major mode for editing Elixir, powered by tree-sitter.
-
-(fn)" t)
-(register-definition-prefixes "elixir-ts-mode" '("elixir-ts-"))
-
-
 ;;; Generated autoloads from emacs-lisp/elp.el
 
 (autoload 'elp-instrument-function "elp" "\
@@ -9830,6 +9817,8 @@ FACTOR is the multiplication factor for the size.
 (fn &optional FACTOR)" t)
 (autoload 'emoji-zoom-decrease "emoji" "\
 Decrease the size of the character under point." t)
+(autoload 'emoji-zoom-reset "emoji" "\
+Reset the size of the character under point." t)
 (register-definition-prefixes "emoji" '("emoji-"))
 
 
@@ -10207,9 +10196,10 @@ Look at CONFIG and try to expand GROUP.
 
 ;;; Generated autoloads from erc/erc.el
 
-(push (purecopy '(erc 5 5)) package--builtin-versions)
+(push (purecopy '(erc 5 6 -4)) package--builtin-versions)
 (autoload 'erc-select-read-args "erc" "\
-Prompt the user for values of nick, server, port, and password.")
+Prompt the user for values of nick, server, port, and password.
+With prefix arg, also prompt for user and full name.")
 (autoload 'erc "erc" "\
 ERC is a powerful, modular, and extensible IRC client.
 This function is the main entry point for ERC.
@@ -10235,7 +10225,7 @@ for the values of the other parameters.
 
 See `erc-tls' for the meaning of ID.
 
-(fn &key (SERVER (erc-compute-server)) (PORT (erc-compute-port)) (NICK 
(erc-compute-nick)) (USER (erc-compute-user)) PASSWORD (FULL-NAME 
(erc-compute-full-name)) ID)" t)
+(fn &key SERVER PORT NICK USER PASSWORD FULL-NAME ID)" 
'((erc-select-read-args)))
 (defalias 'erc-select #'erc)
 (autoload 'erc-tls "erc" "\
 ERC is a powerful, modular, and extensible IRC client.
@@ -10279,11 +10269,11 @@ Example usage:
 
 When present, ID should be a symbol or a string to use for naming
 the server buffer and identifying the connection unequivocally.
-See Info node `(erc) Network Identifier' for details.  Like USER
-and CLIENT-CERTIFICATE, this parameter cannot be specified
+See Info node `(erc) Network Identifier' for details.  Like
+CLIENT-CERTIFICATE, this parameter cannot be specified
 interactively.
 
-(fn &key (SERVER (erc-compute-server)) (PORT (erc-compute-port \\='ircs-u)) 
(NICK (erc-compute-nick)) (USER (erc-compute-user)) PASSWORD (FULL-NAME 
(erc-compute-full-name)) CLIENT-CERTIFICATE ID)" t)
+(fn &key SERVER PORT NICK USER PASSWORD FULL-NAME CLIENT-CERTIFICATE ID)" 
'((let ((erc-default-port erc-default-port-tls)) (erc-select-read-args))))
 (autoload 'erc-handle-irc-url "erc" "\
 Use ERC to IRC on HOST:PORT in CHANNEL.
 If ERC is already connected to HOST:PORT, simply /join CHANNEL.
@@ -10363,7 +10353,7 @@ Customize `erc-url-connect-function' to override this.
 
 ;;; Generated autoloads from erc/erc-imenu.el
 
-(register-definition-prefixes "erc-imenu" '("erc-unfill-notice"))
+(register-definition-prefixes "erc-imenu" '("erc-"))
 
 
 ;;; Generated autoloads from erc/erc-join.el
@@ -10512,9 +10502,7 @@ it has to be wrapped in `(eval (quote ...))'.
 If NAME is already defined as a test and Emacs is running
 in batch mode, an error is signaled.
 
-(fn NAME () [DOCSTRING] [:expected-result RESULT-TYPE] [:tags \\='(TAG...)] 
BODY...)" nil t)
-(function-put 'ert-deftest 'doc-string-elt 3)
-(function-put 'ert-deftest 'lisp-indent-function 2)
+(fn NAME () [DOCSTRING] [:expected-result RESULT-TYPE] [:tags \\='(TAG...)] 
BODY...)" nil 'macro)
 (autoload 'ert-run-tests-batch "ert" "\
 Run the tests specified by SELECTOR, printing results to the terminal.
 
@@ -10649,9 +10637,10 @@ information on Eshell, see Info node `(eshell)Top'.
 (fn &optional ARG)" t)
 (autoload 'eshell-command "eshell" "\
 Execute the Eshell command string COMMAND.
-With prefix ARG, insert output into the current buffer at point.
+If TO-CURRENT-BUFFER is non-nil (interactively, with the prefix
+argument), then insert output into the current buffer at point.
 
-(fn &optional COMMAND ARG)" t)
+(fn COMMAND &optional TO-CURRENT-BUFFER)" t)
 (autoload 'eshell-command-result "eshell" "\
 Execute the given Eshell COMMAND, and return the result.
 The result might be any Lisp object.
@@ -12352,7 +12341,7 @@ Variables of interest include:
    If non-nil, always attempt to create the other file if it was not found.
 
  - `ff-quiet-mode'
-   If non-nil, traces which directories are being searched.
+   If non-nil, does not trace which directories are being searched.
 
  - `ff-special-constructs'
    A list of regular expressions specifying how to recognize special
@@ -12620,7 +12609,7 @@ lines.
 
 ;;; Generated autoloads from progmodes/flymake.el
 
-(push (purecopy '(flymake 1 2 2)) package--builtin-versions)
+(push (purecopy '(flymake 1 3 4)) package--builtin-versions)
 (autoload 'flymake-log "flymake" "\
 Log, at level LEVEL, the message MSG formatted with ARGS.
 LEVEL is passed to `display-warning', which is used to display
@@ -12719,8 +12708,6 @@ evaluate `flymake-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\\{flymake-mode-map}
-
 (fn &optional ARG)" t)
 (autoload 'flymake-mode-on "flymake" "\
 Turn Flymake mode on.")
@@ -15128,15 +15115,6 @@ Prefix arg sets default accept amount temporarily.
 (register-definition-prefixes "hashcash" '("hashcash-"))
 
 
-;;; Generated autoloads from progmodes/heex-ts-mode.el
-
-(autoload 'heex-ts-mode "heex-ts-mode" "\
-Major mode for editing HEEx, powered by tree-sitter.
-
-(fn)" t)
-(register-definition-prefixes "heex-ts-mode" '("heex-ts-"))
-
-
 ;;; Generated autoloads from help-at-pt.el
 
 (autoload 'help-at-pt-string "help-at-pt" "\
@@ -16307,15 +16285,6 @@ values.
 (register-definition-prefixes "semantic/html" '("semantic-"))
 
 
-;;; Generated autoloads from textmodes/html-ts-mode.el
-
-(autoload 'html-ts-mode "html-ts-mode" "\
-Major mode for editing Html, powered by tree-sitter.
-
-(fn)" t)
-(register-definition-prefixes "html-ts-mode" '("html-ts-mode-"))
-
-
 ;;; Generated autoloads from htmlfontify.el
 
 (push (purecopy '(htmlfontify 0 21)) package--builtin-versions)
@@ -16388,8 +16357,7 @@ inlined into the compiled format versions.  This means 
that if you
 change its definition, you should explicitly call
 `ibuffer-recompile-formats'.
 
-(fn SYMBOL (&key NAME INLINE PROPS SUMMARIZER) &rest BODY)" nil t)
-(function-put 'define-ibuffer-column 'lisp-indent-function 'defun)
+(fn SYMBOL (&key NAME INLINE PROPS SUMMARIZER) &rest BODY)" nil 'macro)
 (autoload 'define-ibuffer-sorter "ibuf-macs" "\
 Define a method of sorting named NAME.
 DOCUMENTATION is the documentation of the function, which will be called
@@ -16400,9 +16368,7 @@ For sorting, the forms in BODY will be evaluated with 
`a' bound to one
 buffer object, and `b' bound to another.  BODY should return a non-nil
 value if and only if `a' is \"less than\" `b'.
 
-(fn NAME DOCUMENTATION (&key DESCRIPTION) &rest BODY)" nil t)
-(function-put 'define-ibuffer-sorter 'lisp-indent-function 1)
-(function-put 'define-ibuffer-sorter 'doc-string-elt 2)
+(fn NAME DOCUMENTATION (&key DESCRIPTION) &rest BODY)" nil 'macro)
 (autoload 'define-ibuffer-op "ibuf-macs" "\
 Generate a function which operates on a buffer.
 OP becomes the name of the function; if it doesn't begin with
@@ -16441,9 +16407,7 @@ BODY define the operation; they are forms to evaluate 
per each
 marked buffer.  BODY is evaluated with `buf' bound to the
 buffer object.
 
-(fn OP ARGS DOCUMENTATION (&key INTERACTIVE MARK MODIFIER-P DANGEROUS OPSTRING 
ACTIVE-OPSTRING BEFORE AFTER COMPLEX) &rest BODY)" nil t)
-(function-put 'define-ibuffer-op 'lisp-indent-function 2)
-(function-put 'define-ibuffer-op 'doc-string-elt 3)
+(fn OP ARGS DOCUMENTATION (&key INTERACTIVE MARK MODIFIER-P DANGEROUS OPSTRING 
ACTIVE-OPSTRING BEFORE AFTER COMPLEX) &rest BODY)" nil 'macro)
 (autoload 'define-ibuffer-filter "ibuf-macs" "\
 Define a filter named NAME.
 DOCUMENTATION is the documentation of the function.
@@ -16458,9 +16422,7 @@ not a particular buffer should be displayed or not.  
The forms in BODY
 will be evaluated with BUF bound to the buffer object, and QUALIFIER
 bound to the current value of the filter.
 
-(fn NAME DOCUMENTATION (&key READER DESCRIPTION) &rest BODY)" nil t)
-(function-put 'define-ibuffer-filter 'lisp-indent-function 2)
-(function-put 'define-ibuffer-filter 'doc-string-elt 2)
+(fn NAME DOCUMENTATION (&key READER DESCRIPTION) &rest BODY)" nil 'macro)
 (register-definition-prefixes "ibuf-macs" '("ibuffer-"))
 
 
@@ -17271,8 +17233,8 @@ Put image IMAGE in front of POS in the current buffer.
 IMAGE must be an image created with `create-image' or `defimage'.
 IMAGE is displayed by putting an overlay into the current buffer with a
 `before-string' STRING that has a `display' property whose value is the
-image.  STRING is defaulted if you omit it.
-The overlay created will have the `put-image' property set to t.
+image.  STRING defaults to \"x\" if it's nil or omitted.
+The overlay created by this function has the `put-image' property set to t.
 POS may be an integer or marker.
 AREA is where to display the image.  AREA nil or omitted means
 display it in the text area, a value of `left-margin' means
@@ -17406,14 +17368,31 @@ Cut a rectangle from the image under point, filling 
it with COLOR.
 COLOR defaults to the value of `image-cut-color'.
 Interactively, with prefix argument, prompt for COLOR to use.
 
+This command presents the image with a rectangular area superimposed
+on it, and allows moving and resizing the area to define which
+part of it to cut.
+
+While moving/resizing the cutting area, the following key bindings
+are available:
+
+`q':   Exit without changing anything.
+`RET': Crop/cut the image.
+`m':   Make mouse movements move the rectangle instead of altering the
+       rectangle shape.
+`s':   Same as `m', but make the rectangle into a square first.
+
+After cutting the image, you can save it by `M-x image-save' or
+\\<image-map>\\[image-save] when point is over the image.
+
 (fn &optional COLOR)" t)
 (autoload 'image-crop "image-crop" "\
 Crop the image under point.
-If CUT is non-nil, remove a rectangle from the image instead of
-cropping the image.  In that case CUT should be the name of a
-color to fill the rectangle.
+This command presents the image with a rectangular area superimposed
+on it, and allows moving and resizing the area to define which
+part of it to crop.
 
-While cropping the image, the following key bindings are available:
+While moving/resizing the cropping area, the following key bindings
+are available:
 
 `q':   Exit without changing anything.
 `RET': Crop/cut the image.
@@ -17421,9 +17400,13 @@ While cropping the image, the following key bindings 
are available:
        rectangle shape.
 `s':   Same as `m', but make the rectangle into a square first.
 
-After cropping an image, you can save it by `M-x image-save' or
+After cropping the image, you can save it by `M-x image-save' or
 \\<image-map>\\[image-save] when point is over the image.
 
+When called from Lisp, if CUT is non-nil, remove a rectangle from
+the image instead of cropping the image.  In that case, CUT should
+be the name of a color to fill the rectangle.
+
 (fn &optional CUT)" t)
 (register-definition-prefixes "image-crop" '("image-c"))
 
@@ -18534,6 +18517,11 @@ sequence inside of a word.
 
 Standard ispell choices are then available.
 
+This command uses a word-list file specified
+by `ispell-alternate-dictionary' or by `ispell-complete-word-dict';
+if none of those name an existing word-list file, this command
+signals an error.
+
 (fn &optional INTERIOR-FRAG)" t)
 (autoload 'ispell-complete-word-interior-frag "ispell" "\
 Completes word matching character sequence inside a word." t)
@@ -22466,7 +22454,7 @@ Coloring:
 
 ;;; Generated autoloads from org/org.el
 
-(push (purecopy '(org 9 6 2)) package--builtin-versions)
+(push (purecopy '(org 9 6 4)) package--builtin-versions)
 (autoload 'org-babel-do-load-languages "org" "\
 Load the languages defined in `org-babel-load-languages'.
 
@@ -23458,8 +23446,7 @@ If PACKAGE is a `package-desc' object, MIN-VERSION is 
ignored.
 (autoload 'package-install "package" "\
 Install the package PKG.
 PKG can be a `package-desc' or a symbol naming one of the
-available packages in an archive in `package-archives'.  When
-called interactively, prompt for the package name.
+available packages in an archive in `package-archives'.
 
 Mark the installed package as selected by adding it to
 `package-selected-packages'.
@@ -23471,6 +23458,10 @@ non-nil, install the package but do not add it to
 If PKG is a `package-desc' and it is already installed, don't try
 to install it but still mark it as selected.
 
+If the command is invoked with a prefix argument, it will allow
+upgrading of built-in packages, as if `package-install-upgrade-built-in'
+had been enabled.
+
 (fn PKG &optional DONT-SELECT)" t)
 (autoload 'package-update "package" "\
 Update package NAME if a newer version exists.
@@ -24434,6 +24425,11 @@ they are not by default assigned to keys." t)
 (register-definition-prefixes "picture" '("picture-"))
 
 
+;;; Generated autoloads from language/pinyin.el
+
+(register-definition-prefixes "pinyin" '("pinyin-character-map"))
+
+
 ;;; Generated autoloads from textmodes/pixel-fill.el
 
 (register-definition-prefixes "pixel-fill" '("pixel-fill-"))
@@ -26280,8 +26276,6 @@ evaluate `rectangle-mark-mode'.
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
 
-\\{rectangle-mark-mode-map}
-
 (fn &optional ARG)" t)
 (register-definition-prefixes "rect" '("apply-on-rectangle" 
"clear-rectangle-line" "delete-" "extract-rectangle-" "killed-rectangle" "ope" 
"rectangle-" "spaces-string" "string-rectangle-"))
 
@@ -27440,16 +27434,6 @@ Major mode for editing Ruby code.
 (register-definition-prefixes "ruby-mode" '("ruby-"))
 
 
-;;; Generated autoloads from progmodes/ruby-ts-mode.el
-
-(push (purecopy '(ruby-ts-mode 0 2)) package--builtin-versions)
-(autoload 'ruby-ts-mode "ruby-ts-mode" "\
-Major mode for editing Ruby, powered by tree-sitter.
-
-(fn)" t)
-(register-definition-prefixes "ruby-ts-mode" '("ruby-ts-"))
-
-
 ;;; Generated autoloads from ruler-mode.el
 
 (defvar-local ruler-mode nil "\
@@ -32922,7 +32906,8 @@ Build and install the tree-sitter language grammar 
library for LANG.
 
 Interactively, if `treesit-language-source-alist' doesn't already
 have data for building the grammar for LANG, prompt for its
-repository URL and the C/C++ compiler to use.
+repository URL and the C/C++ compiler to use.  Non-interactively,
+signal an error when there's no recipe for LANG.
 
 This command requires Git, a C compiler and (sometimes) a C++ compiler,
 and the linker to be installed and on PATH.  It also requires that the
@@ -32931,7 +32916,12 @@ recipe for LANG exists in 
`treesit-language-source-alist'.
 See `exec-path' for the current path where Emacs looks for
 executable programs, such as the C/C++ compiler and linker.
 
-(fn LANG)" t)
+Interactively, prompt for the directory in which to install the
+compiled grammar files.  Non-interactively, use OUT-DIR; if it's
+nil, the grammar is installed to the standard location, the
+\"tree-sitter\" directory under `user-emacs-directory'.
+
+(fn LANG &optional OUT-DIR)" t)
 (register-definition-prefixes "treesit" '("treesit-"))
 
 
@@ -33157,7 +33147,15 @@ Major mode for editing TypeScript.
 
 (fn)" t)
 (autoload 'tsx-ts-mode "typescript-ts-mode" "\
-Major mode for editing TypeScript.
+Major mode for editing TSX and JSX documents.
+
+This major mode defines two additional JSX-specific faces:
+`typescript-ts-jsx-attribute-face' and
+`typescript-ts-jsx-attribute-face' that are used for HTML tags
+and attributes, respectively.
+
+The JSX-specific faces are used when `treesit-font-lock-level' is
+at least 3 (which is the default value).
 
 (fn)" t)
 (register-definition-prefixes "typescript-ts-mode" '("typescript-ts-mode-"))
@@ -37163,6 +37161,48 @@ run a specific program.  The program must be a member 
of
 
 (fn &optional PGM)" t)
 (register-definition-prefixes "zone" '("zone-"))
+
+
+;;; Generated autoloads from progmodes/ruby-ts-mode.el
+
+(push (purecopy '(ruby-ts-mode 0 2)) package--builtin-versions)
+(autoload 'ruby-ts-mode "ruby-ts-mode" "\
+Major mode for editing Ruby, powered by tree-sitter.
+
+(fn)" t)
+(register-definition-prefixes "ruby-ts-mode" '("ruby-ts-"))
+
+
+;;; Generated autoloads from textmodes/html-ts-mode.el
+
+(autoload 'html-ts-mode "html-ts-mode" "\
+Major mode for editing Html, powered by tree-sitter.
+
+(fn)" t)
+(register-definition-prefixes "html-ts-mode" '("html-ts-mode-"))
+
+
+;;; Generated autoloads from progmodes/c-ts-common.el
+
+(register-definition-prefixes "c-ts-common" '("c-ts-common-"))
+
+
+;;; Generated autoloads from progmodes/elixir-ts-mode.el
+
+(autoload 'elixir-ts-mode "elixir-ts-mode" "\
+Major mode for editing Elixir, powered by tree-sitter.
+
+(fn)" t)
+(register-definition-prefixes "elixir-ts-mode" '("elixir-ts-"))
+
+
+;;; Generated autoloads from progmodes/heex-ts-mode.el
+
+(autoload 'heex-ts-mode "heex-ts-mode" "\
+Major mode for editing HEEx, powered by tree-sitter.
+
+(fn)" t)
+(register-definition-prefixes "heex-ts-mode" '("heex-ts-"))
 
 ;;; End of scraped data
 
diff --git a/lisp/net/eww.el b/lisp/net/eww.el
index 4cc7fefbe5e..26aee532255 100644
--- a/lisp/net/eww.el
+++ b/lisp/net/eww.el
@@ -94,7 +94,8 @@ no parameters) that returns a directory name."
 (defcustom eww-suggest-uris
   '(eww-links-at-point
     thing-at-point-url-at-point
-    eww-current-url)
+    eww-current-url
+    eww-bookmark-urls)
   "List of functions called to form the list of default URIs for `eww'.
 Each of the elements is a function returning either a string or a list
 of strings.  The results will be joined into a single list with
@@ -104,7 +105,8 @@ duplicate entries (if any) removed."
   :type 'hook
   :options '(eww-links-at-point
              thing-at-point-url-at-point
-             eww-current-url))
+             eww-current-url
+             eww-bookmark-urls))
 
 (defcustom eww-bookmarks-directory user-emacs-directory
   "Directory where bookmark files will be stored."
@@ -329,6 +331,12 @@ parameter, and should return the (possibly) transformed 
URL."
   :parent shr-image-map
   "RET" #'eww-follow-link)
 
+(defvar-keymap eww-minibuffer-url-keymap
+  :doc "Keymap used in the minibuffer prompt for URLs or keywords."
+  :parent minibuffer-local-completion-map
+  "SPC" #'self-insert-command
+  "?" #'self-insert-command)
+
 (defun eww-suggested-uris nil
   "Return the list of URIs to suggest at the `eww' prompt.
 This list can be customized via `eww-suggest-uris'."
@@ -377,10 +385,12 @@ killed after rendering.
 
 For more information, see Info node `(eww) Top'."
   (interactive
-   (let ((uris (eww-suggested-uris)))
-     (list (read-string (format-prompt "Enter URL or keywords"
-                                       (and uris (car uris)))
-                        nil 'eww-prompt-history uris)
+   (let ((uris (eww-suggested-uris))
+         (minibuffer-local-completion-map eww-minibuffer-url-keymap))
+     (list (completing-read (format-prompt "Enter URL or keywords"
+                                           (and uris (car uris)))
+                            (seq-uniq (append eww-prompt-history uris))
+                            nil nil nil 'eww-prompt-history uris)
            current-prefix-arg)))
   (setq url (eww--dwim-expand-url url))
   (pop-to-buffer-same-window
@@ -2227,6 +2237,12 @@ If ERROR-OUT, signal user-error if there are no 
bookmarks."
                                        'eww-bookmark)))
     (eww-browse-url (plist-get bookmark :url))))
 
+(defun eww-bookmark-urls ()
+  "Get the URLs from the current list of bookmarks."
+  (interactive nil eww-boomark-mode)
+  (eww-read-bookmarks)
+  (mapcar (lambda (x) (plist-get x :url)) eww-bookmarks))
+
 (defvar-keymap eww-bookmark-mode-map
   "C-k" #'eww-bookmark-kill
   "C-y" #'eww-bookmark-yank
diff --git a/lisp/org/ob-R.el b/lisp/org/ob-R.el
index 4ee091118e4..f2cc069aa5e 100644
--- a/lisp/org/ob-R.el
+++ b/lisp/org/ob-R.el
@@ -36,7 +36,7 @@
 (require 'ob)
 
 (declare-function orgtbl-to-tsv "org-table" (table params))
-(declare-function R "ext:essd-r" (&optional start-args))
+(declare-function run-ess-r "ext:ess-r-mode" (&optional start-args))
 (declare-function inferior-ess-send-input "ext:ess-inf" ())
 (declare-function ess-make-buffer-current "ext:ess-inf" ())
 (declare-function ess-eval-buffer "ext:ess-inf" (vis))
@@ -276,7 +276,8 @@ This function is called by `org-babel-execute-src-block'."
          (when (get-buffer session)
            ;; Session buffer exists, but with dead process
            (set-buffer session))
-         (require 'ess) (R)
+          (require 'ess-r-mode)
+          (set-buffer (run-ess-r))
          (let ((R-proc (get-process (or ess-local-process-name
                                         ess-current-process-name))))
            (while (process-get R-proc 'callbacks)
diff --git a/lisp/org/ob-js.el b/lisp/org/ob-js.el
index 910c1168667..de7ea91317f 100644
--- a/lisp/org/ob-js.el
+++ b/lisp/org/ob-js.el
@@ -69,7 +69,10 @@
   :safe #'stringp)
 
 (defvar org-babel-js-function-wrapper
-  "require('process').stdout.write(require('util').inspect(function(){%s}()));"
+  ;; Note that newline after %s - it makes sure that closing
+  ;; parenthesis are not shadowed if the last line of the body is a
+  ;; line comment.
+  
"require('process').stdout.write(require('util').inspect(function(){%s\n}()));"
   "Javascript code to print value of body.")
 
 (defun org-babel-execute:js (body params)
diff --git a/lisp/org/oc.el b/lisp/org/oc.el
index 260a4d3e1a7..8a7b662098a 100644
--- a/lisp/org/oc.el
+++ b/lisp/org/oc.el
@@ -1232,7 +1232,9 @@ from the processor set in `org-cite-activate-processor'."
       (let ((cite (org-with-point-at (match-beginning 0)
                     (org-element-citation-parser))))
         (when cite
-          (funcall activate cite)
+          ;; Do not alter match data as font-lock expects us to set it
+          ;; appropriately.
+          (save-match-data (funcall activate cite))
           ;; Move after cite object and make sure to return
           ;; a non-nil value.
           (goto-char (org-element-property :end cite)))))))
diff --git a/lisp/org/org-version.el b/lisp/org/org-version.el
index 15e4a50877a..b82e915ecd1 100644
--- a/lisp/org/org-version.el
+++ b/lisp/org/org-version.el
@@ -11,7 +11,7 @@ Inserted by installing Org mode or when a release is made."
 (defun org-git-version ()
   "The Git version of Org mode.
 Inserted by installing Org or when a release is made."
-   (let ((org-git-version "release_9.6.4-2-g0f6ae7"))
+   (let ((org-git-version "release_9.6.4-9-g8eb209"))
      org-git-version))
 
 (provide 'org-version)
diff --git a/lisp/org/org.el b/lisp/org/org.el
index f7c2b6d16d1..61862b3d63b 100644
--- a/lisp/org/org.el
+++ b/lisp/org/org.el
@@ -3483,13 +3483,17 @@ Make sure that you only list packages here which:
   :group 'org-export-latex
   :set 'org-set-packages-alist
   :get 'org-get-packages-alist
-  :type '(repeat
-         (choice
-          (list :tag "options/package pair"
-                (string :tag "options")
-                (string :tag "package")
-                (boolean :tag "Snippet"))
-          (string :tag "A line of LaTeX"))))
+  :type
+  '(repeat
+    (choice
+     (list :tag "options/package pair"
+           (string :tag "options")
+           (string :tag "package")
+           (boolean :tag "snippet")
+           (choice
+            (const :tag "All compilers include this package" nil)
+            (repeat :tag "Only include from these compilers" string)))
+     (string :tag "A line of LaTeX"))))
 
 (defgroup org-appearance nil
   "Settings for Org mode appearance."
@@ -8440,7 +8444,10 @@ a link."
               (dolist (link (if (stringp links) (list links) links))
                 (search-forward link nil links-end)
                 (goto-char (match-beginning 0))
-                (org-open-at-point arg)))))))
+                 ;; When opening file link, current buffer may be
+                 ;; altered.
+                 (save-current-buffer
+                  (org-open-at-point arg))))))))
        ;; On a footnote reference or at definition's label.
        ((or (eq type 'footnote-reference)
            (and (eq type 'footnote-definition)
diff --git a/lisp/org/ox-latex.el b/lisp/org/ox-latex.el
index 26f8742bec8..768bf402b70 100644
--- a/lisp/org/ox-latex.el
+++ b/lisp/org/ox-latex.el
@@ -1820,9 +1820,11 @@ INFO is a plist used as a communication channel.  See
   "Protect special chars, then wrap TEXT in \"\\texttt{}\"."
   (format "\\texttt{%s}"
           (replace-regexp-in-string
-           "--\\|[\\{}$%&_#~^]"
+           "--\\|<<\\|>>\\|[\\{}$%&_#~^]"
            (lambda (m)
              (cond ((equal m "--") "-{}-{}")
+                   ((equal m "<<") "<{}<{}")
+                   ((equal m ">>") ">{}>{}")
                    ((equal m "\\") "\\textbackslash{}")
                    ((equal m "~") "\\textasciitilde{}")
                    ((equal m "^") "\\textasciicircum{}")
diff --git a/lisp/tab-bar.el b/lisp/tab-bar.el
index 7c3069ca269..9d703b5d048 100644
--- a/lisp/tab-bar.el
+++ b/lisp/tab-bar.el
@@ -1571,15 +1571,14 @@ After the tab is created, the hooks in
       ;; Handle the case when it's called in the active minibuffer.
       (when (minibuffer-selected-window)
         (select-window (minibuffer-selected-window)))
-      ;; Remove window parameters that can cause problems
-      ;; with `delete-other-windows' and `split-window'.
-      (unless (eq tab-bar-new-tab-choice 'clone)
-        (set-window-parameter nil 'window-atom nil)
-        (set-window-parameter nil 'window-side nil))
-      (let ((ignore-window-parameters t))
+      (let ((ignore-window-parameters t)
+            (window--sides-inhibit-check t))
         (if (eq tab-bar-new-tab-choice 'clone)
             ;; Create new unique windows with the same layout
             (window-state-put (window-state-get))
+          ;; Remove window parameters that can cause problems
+          ;; with `delete-other-windows' and `split-window'.
+          (set-window-parameter nil 'window-atom nil)
           (delete-other-windows)
           (if (eq tab-bar-new-tab-choice 'window)
               ;; Create new unique window from remaining window
diff --git a/lisp/tutorial.el b/lisp/tutorial.el
index 0afe565c80b..eb494be8d4d 100644
--- a/lisp/tutorial.el
+++ b/lisp/tutorial.el
@@ -650,6 +650,7 @@ with some explanatory links."
          (delete-region prop-start prop-end))))))
 
 (defvar tutorial--starting-point)
+(put 'tutorial--starting-point 'permanent-local t)
 (defun tutorial--save-on-kill ()
   "Query the user about saving the tutorial when killing Emacs."
   (when (buffer-live-p tutorial--buffer)
diff --git a/src/fns.c b/src/fns.c
index a8ab494eb13..8891d381993 100644
--- a/src/fns.c
+++ b/src/fns.c
@@ -6145,29 +6145,40 @@ second optional argument ABSOLUTE is non-nil, the value 
counts the lines
 from the absolute start of the buffer, disregarding the narrowing.  */)
   (register Lisp_Object position, Lisp_Object absolute)
 {
-  ptrdiff_t pos, start = BEGV_BYTE;
+  ptrdiff_t pos_byte, start_byte = BEGV_BYTE;
 
   if (MARKERP (position))
-    pos = marker_position (position);
+    {
+      /* We don't trust the byte position if the marker's buffer is
+         not the current buffer.  */
+      if (XMARKER (position)->buffer != current_buffer)
+       pos_byte = CHAR_TO_BYTE (marker_position (position));
+      else
+       pos_byte = marker_byte_position (position);
+    }
   else if (NILP (position))
-    pos = PT;
+    pos_byte = PT_BYTE;
   else
     {
       CHECK_FIXNUM (position);
-      pos = XFIXNUM (position);
+      ptrdiff_t pos = XFIXNUM (position);
+      /* Check that POSITION is valid. */
+      if (pos < BEG || pos > Z)
+       args_out_of_range_3 (position, make_int (BEG), make_int (Z));
+      pos_byte = CHAR_TO_BYTE (pos);
     }
 
   if (!NILP (absolute))
-    start = BEG_BYTE;
+    start_byte = BEG_BYTE;
+  else if (NILP (absolute))
+    pos_byte = clip_to_bounds (BEGV_BYTE, pos_byte, ZV_BYTE);
 
-  /* Check that POSITION is in the accessible range of the buffer, or,
-     if we're reporting absolute positions, in the buffer. */
-  if (NILP (absolute) && (pos < BEGV || pos > ZV))
-    args_out_of_range_3 (make_int (pos), make_int (BEGV), make_int (ZV));
-  else if (!NILP (absolute) && (pos < 1 || pos > Z))
-    args_out_of_range_3 (make_int (pos), make_int (1), make_int (Z));
+  /* Check that POSITION is valid. */
+  if (pos_byte < BEG_BYTE || pos_byte > Z_BYTE)
+    args_out_of_range_3 (make_int (BYTE_TO_CHAR (pos_byte)),
+                        make_int (BEG), make_int (Z));
 
-  return make_int (count_lines (start, CHAR_TO_BYTE (pos)) + 1);
+  return make_int (count_lines (start_byte, pos_byte) + 1);
 }
 
 
diff --git a/src/treesit.c b/src/treesit.c
index cbcc688571b..ef272fb8871 100644
--- a/src/treesit.c
+++ b/src/treesit.c
@@ -404,6 +404,9 @@ init_treesit_functions (void)
 
 static Lisp_Object Vtreesit_str_libtree_sitter;
 static Lisp_Object Vtreesit_str_tree_sitter;
+#ifndef WINDOWSNT
+static Lisp_Object Vtreesit_str_dot_0;
+#endif
 static Lisp_Object Vtreesit_str_dot;
 static Lisp_Object Vtreesit_str_question_mark;
 static Lisp_Object Vtreesit_str_star;
@@ -543,8 +546,21 @@ treesit_load_language_push_for_each_suffix (Lisp_Object 
lib_base_name,
   suffixes = Vdynamic_library_suffixes;
 
   FOR_EACH_TAIL (suffixes)
-    *path_candidates = Fcons (concat2 (lib_base_name, XCAR (suffixes)),
-                             *path_candidates);
+    {
+      Lisp_Object candidate1 = concat2 (lib_base_name, XCAR (suffixes));
+#ifndef WINDOWSNT
+      /* On Posix hosts, support libraries named with ABI version
+         numbers.  In the foreseeable future we only need to support
+         version 0.0.  For more details, see
+         https://lists.gnu.org/archive/html/emacs-devel/2023-04/msg00386.html. 
 */
+      Lisp_Object candidate2 = concat2 (candidate1, Vtreesit_str_dot_0);
+      Lisp_Object candidate3 = concat2 (candidate2, Vtreesit_str_dot_0);
+
+      *path_candidates = Fcons (candidate3, *path_candidates);
+      *path_candidates = Fcons (candidate2, *path_candidates);
+#endif
+      *path_candidates = Fcons (candidate1, *path_candidates);
+    }
 }
 
 /* Load the dynamic library of LANGUAGE_SYMBOL and return the pointer
@@ -3948,6 +3964,10 @@ the symbol of that THING.  For example, (or block sexp). 
 */);
   Vtreesit_str_libtree_sitter = build_pure_c_string ("libtree-sitter-");
   staticpro (&Vtreesit_str_tree_sitter);
   Vtreesit_str_tree_sitter = build_pure_c_string ("tree-sitter-");
+#ifndef WINDOWSNT
+  staticpro (&Vtreesit_str_dot_0);
+  Vtreesit_str_dot_0 = build_pure_c_string (".0");
+#endif
   staticpro (&Vtreesit_str_dot);
   Vtreesit_str_dot = build_pure_c_string (".");
   staticpro (&Vtreesit_str_question_mark);



reply via email to

[Prev in Thread] Current Thread [Next in Thread]