Merge from origin/emacs-29

871cf33a45 ; * admin/make-tarball.txt: Minor copyedit.
4faebba2fe Fix invocation of File->Close from the menu bar
cd05fca5f7 ; Improve documentation of 'native-comp-enable-subr-tramp...
c61a30e160 Update thumbnail buffer's header more
4c49452cde (treesit-query-validate): Fix reusing the output buffer
d560dc5044 (rust-ts-mode--font-lock-settings): Highlight closure par...
c15bc91e1b * Fix `native-comp-enable-subr-trampolines' semantic
774051873d Fix documentation of 'just-one-space' and 'delete-horizon...
7337f07250 ; Remove NEWS entry about deleted variable.
fb5299ba09 ; Fix wording of last change.
9f508cef85 Fix 'display-buffer-use-least-recent-window'
5190ea6259 Fix point moving when calling python-shell-send-region
6c0d821017 (project-try-vc): Remove unused defvar/require
4f9862e435 ; Fix typo
a638c79bc5 Delete redundant question from Gnus FAQ
4a90d67eb6 Slightly improve hashcash documentation
6ea3c105ab Fix cursor motion when there's line-prefix and display st...
e985466556 Fix comment in treesit_record_change (bug#61369)
1e5cebc88b Spell out RPN abbreviation in Calc manual intro

# Conflicts:
#	etc/NEWS
#	lisp/window.el
This commit is contained in:
Stefan Kangas 2023-02-19 11:38:09 +01:00
commit 34f44ae07e
22 changed files with 485 additions and 205 deletions

View file

@ -150,10 +150,11 @@ General steps (for each step, check for possible errors):
4. autoreconf -i -I m4 --force 4. autoreconf -i -I m4 --force
make bootstrap make bootstrap
The below script checks for any mistakes in the source text of
manual pages. Fix any errors and re-run the script to verify.
./admin/check-man-pages ./admin/check-man-pages
The above script checks for any mistakes in the source text of
manual pages. Fix any errors and re-run the script to verify.
Then do this: Then do this:
make -C etc/refcards make -C etc/refcards

View file

@ -1120,16 +1120,18 @@ the trampoline generation, unless you know that all the trampolines
needed by your Lisp programs are already compiled and accessible to needed by your Lisp programs are already compiled and accessible to
Emacs. Emacs.
The value of this variable can also be a string, in which case it is The value of this variable can also be a string, in which case it
interpreted as the name of a directory in which to store the generated specifies the name of a directory in which to store the generated
trampoline @file{*.eln} files, overriding the directories specified by trampoline @file{*.eln} files, overriding the directories in
@code{native-comp-eln-load-path}. This is useful if you want the @code{native-comp-eln-load-path}. This is useful if you want the
trampolines to be generated as needed, but don't want to store them trampolines to be generated as needed, but don't want to store them
under the user's @env{HOME} directory or the other public directories under the user's @env{HOME} directory or in the other public
where @file{*.eln} files are kept. However, unlike with directories directories where @file{*.eln} files are kept. However, unlike with
in @code{native-comp-eln-load-path}, the trampolines will be stored in directories in @code{native-comp-eln-load-path}, the trampolines will
the directory given by the value of this variable, not in its be stored in the directory given by the value of this variable, not in
version-specific subdirectory. its version-specific subdirectory. If the name of this directory is
not absolute, it is interpreted relative to
@code{invocation-directory} (@pxref{System Environment})
If this variable is non-@code{nil}, and Emacs needs to produce a If this variable is non-@code{nil}, and Emacs needs to produce a
trampoline, but it cannot find any writable directory to store the trampoline, but it cannot find any writable directory to store the

View file

@ -629,6 +629,12 @@ example, by calling @code{select-window} with argument @var{norecord}
@code{nil}. Hence, this macro is the preferred way to temporarily work @code{nil}. Hence, this macro is the preferred way to temporarily work
with @var{window} as the selected window without needlessly running with @var{window} as the selected window without needlessly running
@code{buffer-list-update-hook}. @code{buffer-list-update-hook}.
Note that this macro temporarily puts the window management code in an
unstable state. In particular, the most recently used window (see below)
will not necessarily match the selected one. Hence, functions like
@code{get-lru-window} and @code{get-mru-window} may return unexpected
results when called from the body of this macro.
@end defmac @end defmac
@defmac with-selected-frame frame forms@dots{} @defmac with-selected-frame frame forms@dots{}
@ -650,15 +656,17 @@ The @dfn{use time} of a window is not really a time value, but an
integer that does increase monotonically with each call of integer that does increase monotonically with each call of
@code{select-window} with a @code{nil} @var{norecord} argument. The @code{select-window} with a @code{nil} @var{norecord} argument. The
window with the lowest use time is usually called the least recently window with the lowest use time is usually called the least recently
used window while the window with the highest use time is called the used window. The window with the highest use time is called the most
most recently used one (@pxref{Cyclic Window Ordering}). recently used one (@pxref{Cyclic Window Ordering}) and is usually the
selected window unless @code{with-selected-window} has been used.
@end defun @end defun
@defun window-bump-use-time &optional window @defun window-bump-use-time &optional window
This function marks @var{window} as being the most recently used This function marks @var{window} as being the second most recently
one. This can be useful when writing certain @code{pop-to-buffer} used one (after the selected window). It does nothing if @var{window}
scenarios (@pxref{Switching Buffers}). @var{window} must be a live is the selected window or the selected window does not have the
window and defaults to the selected one. highest use time among all windows which may happen within the scope
of @code{with-selected-window}.
@end defun @end defun
@anchor{Window Group}Sometimes several windows collectively and @anchor{Window Group}Sometimes several windows collectively and
@ -2755,14 +2763,40 @@ before.
@defun display-buffer-use-some-window buffer alist @defun display-buffer-use-some-window buffer alist
This function tries to display @var{buffer} by choosing an existing This function tries to display @var{buffer} by choosing an existing
window and displaying the buffer in that window. It can fail if all window and displaying the buffer in that window. It first tries to find
windows are dedicated to other buffers (@pxref{Dedicated Windows}). a window that has not been used recently (@pxref{Cyclic Window
Ordering}) on any frame specified by a @code{lru-frames} @var{alist}
entry, falling back to the selected frame if no such entry exists. It
also prefers windows that satisfy the constraints specified by
@code{window-min-width} and @code{window-min-height} @var{alist}
entries; preferring full-width windows if no @code{window-min-width}
entry is found. Finally, it will not return a window whose use time is
higher than that specified by any @code{lru-time} entry provided by
@var{alist}.
If no less recently used window is found, this function will try to use
some other window, preferably a large window on some visible frame. It
can fail if all windows are dedicated to other buffers (@pxref{Dedicated
Windows}).
@end defun @end defun
@defun display-buffer-use-least-recent-window buffer alist @defun display-buffer-use-least-recent-window buffer alist
This function is like @code{display-buffer-use-some-window}, but will This function is similar to @code{display-buffer-use-some-window}, but
not reuse the current window, and will use the least recently will try harder to not use the a recently used window. In particular,
switched-to window. it does not use the selected window. In addition, it will first try to
reuse a window that shows @var{buffer} already, base the decision
whether it should use a window showing another buffer on that window's
use time alone and pop up a new window if no usable window is found.
Finally, this function will bump the use time (@pxref{Selecting
Windows}) of any window it returns in order to avoid that further
invocations will use that window for showing another buffer. An
application that wants to display several buffers in a row can help this
function by providing a @code{lru-time} @var{alist} entry it has
initially set to the value of the selected window's use time. Each
invocation of this function will then bump the use time of the window
returned to a value higher than that and a subsequent invocation will
inhibit this function to use a window it returned earlier.
@end defun @end defun
@defun display-buffer-in-direction buffer alist @defun display-buffer-in-direction buffer alist
@ -3032,12 +3066,40 @@ The value specifies an alist of window parameters to give the chosen
window. All action functions that choose a window should process this window. All action functions that choose a window should process this
entry. entry.
@vindex window-min-width@r{, a buffer display action alist entry}
@item window-min-width
The value specifies a minimum width of the window used, in canonical
frame columns. The special value @code{full-width} means the chosen
window should be one that has no other windows on the left or right of
it in its frame.
This entry is currently honored by @code{display-buffer-use-some-window}
and @code{display-buffer-use-least-recent-window}, which try hard to avoid
returning a less recently used window that does not satisfy the entry.
Note that providing such an entry alone does not necessarily make the
window as wide as specified by its value. To actually resize an
existing window or make a new window as wide as specified by this
entry's value, a @code{window-width} entry specifying that value
should be provided as well. Such a @code{window-width} entry can,
however, specify a completely different value, or ask the window width
to fit that of its buffer, in which case the
@code{window-min-width} entry provides the guaranteed minimum width of
the window.
@vindex window-min-height@r{, a buffer display action alist entry} @vindex window-min-height@r{, a buffer display action alist entry}
@item window-min-height @item window-min-height
The value specifies a minimum height of the window used, in lines. If The value specifies a minimum height of the window used, in canonical
a window is not or cannot be made as high as specified by this entry, frame lines. The special value @code{full-height} means the chosen
the window is not considered for use. The only client of this entry window should be a full-height window, one that has no other windows
is presently @code{display-buffer-below-selected}. above or below it in its frame.
This entry is currently honored by @code{display-buffer-below-selected}
which does not use a window that is not as high as specified by this
entry. It's also honored by @code{display-buffer-use-some-window} and
@code{display-buffer-use-least-recent-window} which try hard to avoid
returning a less recently used window if it does not satisfy this
constraint.
Note that providing such an entry alone does not necessarily make the Note that providing such an entry alone does not necessarily make the
window as tall as specified by its value. To actually resize an window as tall as specified by its value. To actually resize an
@ -3166,6 +3228,40 @@ preserve both, its width and its height. This entry should be
processed only under certain conditions which are specified right processed only under certain conditions which are specified right
after this list. after this list.
@vindex lru-frames@r{, a buffer display action alist entry}
@item lru-frames
The value specifies the set of frames to search for a window that can be
used to display the buffer. It is honored by
@code{display-buffer-use-some-window} and
@code{display-buffer-use-least-recent-window} when trying to find a less
recently used window showing some other buffer. Its values are the same
as for the @code{reusable-frames} entry described above.
@vindex lru-time@r{, a buffer display action alist entry}
@item lru-time
The value is supposed to specify a use time (@pxref{Selecting Windows}).
This entry is honored by @code{display-buffer-use-some-window} and
@code{display-buffer-use-least-recent-window} when trying to find a less
recently used window showing some other buffer. If a window's use time
is higher than the value specified by this option, these action
functions will not consider such a window for displaying the buffer.
@vindex bump-use-time@r{, a buffer display action alist entry}
@item bump-use-time
If non-@code{nil}, such an entry will cause @code{display-buffer} to
bump the use time (@pxref{Selecting Windows}) of the window it uses.
This should avoid later use of this window by action functions
like @code{display-buffer-use-some-window} and
@code{display-buffer-use-least-recent-window} for showing another
buffer.
There is a fine difference between using this entry and using the action
function @code{display-buffer-use-least-recent-window}. Calling the
latter means to only bump the use times of windows that function uses
for displaying the buffer. The entry described here will cause
@code{display-buffer} to bump the use time of @emph{any} window used for
displaying a buffer.
@vindex pop-up-frame-parameters@r{, a buffer display action alist entry} @vindex pop-up-frame-parameters@r{, a buffer display action alist entry}
@item pop-up-frame-parameters @item pop-up-frame-parameters
The value specifies an alist of frame parameters to give a new frame, The value specifies an alist of frame parameters to give a new frame,
@ -3321,13 +3417,6 @@ window has at least that many columns. If the value is @code{nil},
that means not to split this way. that means not to split this way.
@end defopt @end defopt
@defopt display-buffer-avoid-small-windows
If non-@code{nil}, this should be a number. Windows that have fewer
lines than that will be avoided when choosing an existing window. The
value is interpreted in units of the frame's canonical line height,
like @code{window-total-height} does (@pxref{Window Sizes}).
@end defopt
@defopt even-window-sizes @defopt even-window-sizes
This variable, if non-@code{nil}, causes @code{display-buffer} to even This variable, if non-@code{nil}, causes @code{display-buffer} to even
window sizes whenever it reuses an existing window, and that window is window sizes whenever it reuses an existing window, and that window is
@ -3992,54 +4081,80 @@ related to the new window. For non-input related actions
@code{display-buffer-below-selected} might be preferable because the @code{display-buffer-below-selected} might be preferable because the
selected window usually already has the user's attention. selected window usually already has the user's attention.
@item Handle subsequent invocations of @code{display-buffer} @item Take care which window is selected
@code{display-buffer} is not overly well suited for displaying several Many applications call @code{display-buffer} from within window
buffers in sequence and making sure that all these buffers are shown excursions produced by @code{with-selected-window} or
orderly in the resulting window configuration. Again, the standard @code{select-window} calls with a non-@code{nil} @var{norecord}
action functions @code{display-buffer-pop-up-window} and argument. This is almost always a bad idea because the window selected
@code{display-buffer-use-some-window} are not very suited for this within such an excursion is usually not the window selected in the
purpose due to their somewhat chaotic nature in more complex configuration presented to the user.
configurations.
To produce a window configuration displaying multiple buffers (or If, for example, a user had added an @code{inhibit-same-window} alist
different views of one and the same buffer) in one and the same entry, that entry would have avoided the window selected within the
display cycle, Lisp programmers will unavoidably have to write scope of the excursion and not the window selected in the resulting
their own action functions. A few tricks listed below might help in configuration. Even if no such entry has been added, the resulting
this regard. behavior might be strange. While in a frame containing one live
window, evaluating the following form
@itemize @bullet @example
@item @group
Making windows atomic (@pxref{Atomic Windows}) avoids breaking an (progn
existing window composition when popping up a new window. (split-window)
The new window will pop up outside the composition instead. (display-buffer "*Messages*"))
@end group
@end example
@item @noindent
Temporarily dedicating windows to their buffers (@pxref{Dedicated will display a window showing the @file{*Messages*} buffer at the bottom
Windows}) avoids using a window for displaying a different and leave the other window selected. Evaluating the next form
buffer. A non-dedicated window will be used instead.
@item @example
Calling @code{window-preserve-size} (@pxref{Preserving Window Sizes}) @group
will try to keep the size of the argument window unchanged when (with-selected-window (split-window)
popping up a new window. You have to make sure that another window in (display-buffer "*Messages*"))
the same combination can be shrunk instead, though. @end group
@end example
@item @noindent
Side windows (@pxref{Side Windows}) can be used for displaying will display @file{*Messages*} in a window on the top and select it
specific buffers always in a window at the same position of a frame. which is usually not what @code{display-buffer} is supposed to do.
This permits grouping buffers that do not compete for being shown at
the same time on a frame and showing any such buffer in the same window
without disrupting the display of other buffers.
@item On the other hand, while evaluating the following form
Child frames (@pxref{Child Frames}) can be used to display a buffer
within the screen estate of the selected frame without disrupting that @example
frame's window configuration and without the overhead associated with @group
full-fledged frames as inflicted by @code{display-buffer-pop-up-frame}. (progn
@end itemize (split-window)
(pop-to-buffer "*Messages*"))
@end group
@end example
@noindent
will correctly select the @file{*Messages*} buffer, the next form
@example
@group
(progn
(split-window)
(with-selected-window (selected-window)
(pop-to-buffer "*Messages*")))
@end group
@end example
@noindent
will not.
Also, invocations of action functions like
@code{display-buffer-use-some-window} and
@code{display-buffer-use-least-recent-window} that expect the selected
window to have the highest use time among all windows, may fail to
produce a window according to their specifications.
Hence, an application that relies on using a window excursion should try
to postpone the @code{display-buffer} call until after the excursion has
terminated.
@end table @end table
@node Window History @node Window History
@section Window History @section Window History
@cindex window history @cindex window history

View file

@ -232,7 +232,8 @@ series of calculators, its many features include:
@itemize @bullet @itemize @bullet
@item @item
Choice of algebraic or RPN (stack-based) entry of calculations. Choice of algebraic or Reverse Polish notation (RPN),
i.e. stack-based, entry of calculations.
@item @item
Arbitrary precision integers and floating-point numbers. Arbitrary precision integers and floating-point numbers.
@ -421,8 +422,8 @@ difference between lower-case and upper-case letters. Remember,
@key{RET}, @key{TAB}, @key{DEL}, and @key{SPC} are the Return, Tab, @key{RET}, @key{TAB}, @key{DEL}, and @key{SPC} are the Return, Tab,
Delete, and Space keys. Delete, and Space keys.
@strong{RPN calculation.} In RPN, you type the input number(s) first, @strong{RPN calculation.} In Reverse Polish notation (RPN), you type
then the command to operate on the numbers. the input number(s) first, then the command to operate on the numbers.
@noindent @noindent
Type @kbd{2 @key{RET} 3 + Q} to compute Type @kbd{2 @key{RET} 3 + Q} to compute
@ -1348,18 +1349,19 @@ to control various modes of the Calculator.
@subsection RPN Calculations and the Stack @subsection RPN Calculations and the Stack
@cindex RPN notation @cindex RPN notation
@cindex Reverse Polish notation
@noindent @noindent
@ifnottex @ifnottex
Calc normally uses RPN notation. You may be familiar with the RPN Calc normally uses Reverse Polish notation (RPN). You may be familiar
system from Hewlett-Packard calculators, FORTH, or PostScript. with the RPN system from Hewlett-Packard calculators, FORTH, or
(Reverse Polish Notation, RPN, is named after the Polish mathematician PostScript. (Reverse Polish Notation is named after the Polish
Jan Lukasiewicz.) mathematician Jan Lukasiewicz.)
@end ifnottex @end ifnottex
@tex @tex
Calc normally uses RPN notation. You may be familiar with the RPN Calc normally uses Reverse Polish notation (RPN). You may be familiar
system from Hewlett-Packard calculators, FORTH, or PostScript. with the RPN system from Hewlett-Packard calculators, FORTH, or
(Reverse Polish Notation, RPN, is named after the Polish mathematician PostScript. (Reverse Polish Notation is named after the Polish
Jan \L ukasiewicz.) mathematician Jan \L ukasiewicz.)
@end tex @end tex
The central component of an RPN calculator is the @dfn{stack}. A The central component of an RPN calculator is the @dfn{stack}. A

View file

@ -76,16 +76,15 @@ misprints are the Gnus team's fault, sorry.
@subsection Installation FAQ @subsection Installation FAQ
@menu @menu
* FAQ 1-1:: What is the latest version of Gnus? * FAQ 1-1:: Where can I get the latest version of Gnus?
* FAQ 1-2:: Where and how to get Gnus? * FAQ 1-2:: I sometimes read references to No Gnus and Oort Gnus,
* FAQ 1-3:: I sometimes read references to No Gnus and Oort Gnus,
what are those? what are those?
@end menu @end menu
@node FAQ 1-1 @node FAQ 1-1
@subsubheading Question 1.1 @subsubheading Question 1.1
What is the latest version of Gnus? What is the latest version of Gnus and where can I find it?
@subsubheading Answer @subsubheading Answer
@ -94,15 +93,6 @@ The latest version of Gnus is bundled with Emacs.
@node FAQ 1-2 @node FAQ 1-2
@subsubheading Question 1.2 @subsubheading Question 1.2
Where and how to get Gnus?
@subsubheading Answer
Gnus is bundled with Emacs.
@node FAQ 1-3
@subsubheading Question 1.3
I sometimes read references to No Gnus and Oort Gnus, I sometimes read references to No Gnus and Oort Gnus,
what are those? what are those?

View file

@ -1161,12 +1161,6 @@ and 'C-x w 3', respectively. A number of other useful window-related
commands are now available with key sequences that start with the commands are now available with key sequences that start with the
'C-x w' prefix. 'C-x w' prefix.
+++
*** New user option 'display-buffer-avoid-small-windows'.
If non-nil, this should be a window height in lines, a number.
Windows smaller than this will be avoided by 'display-buffer', if
possible.
+++ +++
*** New display action 'display-buffer-full-frame'. *** New display action 'display-buffer-full-frame'.
This action removes other windows from the frame when displaying a This action removes other windows from the frame when displaying a

View file

@ -483,7 +483,7 @@ Return them as multiple value."
;;; Union specific code. ;;; Union specific code.
(defun comp-cstr-union-homogeneous-no-range (dst &rest srcs) (defun comp-cstr-union-homogeneous-no-range (dst &rest srcs)
"As `comp-cstr-union' but escluding the irange component. "As `comp-cstr-union' but excluding the irange component.
All SRCS constraints must be homogeneously negated or non-negated." All SRCS constraints must be homogeneously negated or non-negated."
;; Type propagation. ;; Type propagation.

View file

@ -3794,7 +3794,8 @@ Return the trampoline if found or nil otherwise."
"Return the absolute filename for a trampoline for SUBR-NAME." "Return the absolute filename for a trampoline for SUBR-NAME."
(cl-loop (cl-loop
with dirs = (if (stringp native-comp-enable-subr-trampolines) with dirs = (if (stringp native-comp-enable-subr-trampolines)
(list native-comp-enable-subr-trampolines) (list (expand-file-name native-comp-enable-subr-trampolines
invocation-directory))
(if native-compile-target-directory (if native-compile-target-directory
(list (expand-file-name comp-native-version-dir (list (expand-file-name comp-native-version-dir
native-compile-target-directory)) native-compile-target-directory))

View file

@ -162,8 +162,10 @@ dialogs. Otherwise, the function will always use text-mode dialogs.
The return value is the matching entry from the CHOICES list. The return value is the matching entry from the CHOICES list.
If LONG-FORM, do a `completing-read' over the NAME elements in If LONG-FORM is non-nil, do a `completing-read' over the NAME elements
CHOICES instead. in CHOICES instead. In this case, GUI dialog is not used, regardless
of the value of `use-dialog-box' and whether the function was invoked
via a mouse gesture.
Usage example: Usage example:
@ -177,8 +179,9 @@ Usage example:
prompt choices help-string show-help))) prompt choices help-string show-help)))
(defun read-multiple-choice--short-answers (prompt choices help-string show-help) (defun read-multiple-choice--short-answers (prompt choices help-string show-help)
(let* ((prompt-choices (let* ((dialog-p (use-dialog-box-p))
(if show-help choices (append choices '((?? "?"))))) (prompt-choices
(if (or show-help dialog-p) choices (append choices '((?? "?")))))
(altered-names (mapcar #'rmc--add-key-description prompt-choices)) (altered-names (mapcar #'rmc--add-key-description prompt-choices))
(full-prompt (full-prompt
(format (format
@ -192,16 +195,14 @@ Usage example:
(setq buf (rmc--show-help prompt help-string show-help (setq buf (rmc--show-help prompt help-string show-help
choices altered-names))) choices altered-names)))
(while (not tchar) (while (not tchar)
(message "%s%s" (unless dialog-p
(if wrong-char (message "%s%s"
"Invalid choice. " (if wrong-char
"") "Invalid choice. "
full-prompt) "")
full-prompt))
(setq tchar (setq tchar
(if (and (display-popup-menus-p) (if dialog-p
last-input-event ; not during startup
(consp last-nonmenu-event)
use-dialog-box)
(x-popup-dialog (x-popup-dialog
t t
(cons prompt (cons prompt

View file

@ -1926,9 +1926,10 @@ no, only reply back to the author."
"Whether to generate X-Hashcash: headers. "Whether to generate X-Hashcash: headers.
If t, always generate hashcash headers. If `opportunistic', If t, always generate hashcash headers. If `opportunistic',
only generate hashcash headers if it can be done without the user only generate hashcash headers if it can be done without the user
waiting (i.e., only asynchronously). waiting (i.e., only asynchronously). If nil, don't generate
hashcash headers.
You must have the \"hashcash\" binary installed, see `hashcash-path'." You must have the \"hashcash\" binary installed, see `hashcash-program'."
:version "24.1" :version "24.1"
:group 'message-headers :group 'message-headers
:link '(custom-manual "(message)Mail Headers") :link '(custom-manual "(message)Mail Headers")

View file

@ -593,7 +593,8 @@ thumbnail buffer to be selected."
(if do-not-pop (if do-not-pop
(display-buffer buf) (display-buffer buf)
(pop-to-buffer buf)) (pop-to-buffer buf))
(image-dired--line-up-with-method)))) (image-dired--line-up-with-method)
(image-dired--update-header-line))))
;;;###autoload ;;;###autoload
(defun image-dired-show-all-from-dir (dir) (defun image-dired-show-all-from-dir (dir)

View file

@ -25,16 +25,16 @@
;; The hashcash binary is at http://www.hashcash.org/. ;; The hashcash binary is at http://www.hashcash.org/.
;; ;;
;; Call mail-add-payment to add a hashcash payment to a mail message ;; Call `mail-add-payment' to add a hashcash payment to a mail message
;; in the current buffer. ;; in the current buffer.
;; ;;
;; Call mail-add-payment-async after writing the addresses but before ;; Call `mail-add-payment-async' after writing the addresses but
;; writing the mail to start calculating the hashcash payment ;; before writing the mail to start calculating the hashcash payment
;; asynchronously. ;; asynchronously.
;; ;;
;; The easiest way to do this automatically for all outgoing mail ;; The easiest way to do this automatically for all outgoing mail is
;; is to set `message-generate-hashcash' to t. If you want more ;; to set `message-generate-hashcash' to `opportunistic' or t. If you
;; control, try the following hooks. ;; want more control, try the following hooks.
;; ;;
;; To automatically add payments to all outgoing mail when sending: ;; To automatically add payments to all outgoing mail when sending:
;; (add-hook 'message-send-hook 'mail-add-payment) ;; (add-hook 'message-send-hook 'mail-add-payment)
@ -44,6 +44,8 @@
;; ;;
;; To check whether calculations are done before sending: ;; To check whether calculations are done before sending:
;; (add-hook 'message-send-hook 'hashcash-wait-or-cancel) ;; (add-hook 'message-send-hook 'hashcash-wait-or-cancel)
;;
;; For more information, see Info node `(gnus) Hashcash'.
;;; Code: ;;; Code:
@ -87,7 +89,9 @@ is used instead."
(define-obsolete-variable-alias 'hashcash-path 'hashcash-program "24.4") (define-obsolete-variable-alias 'hashcash-path 'hashcash-program "24.4")
(defcustom hashcash-program "hashcash" (defcustom hashcash-program "hashcash"
"The name of the hashcash executable. "The name of the hashcash executable.
If this is not in your PATH, specify an absolute file name." If this is not in your PATH, specify an absolute file name.
See also `message-generate-hashcash'."
:type '(choice (const nil) file)) :type '(choice (const nil) file))
(defcustom hashcash-extra-generate-parameters '("-Z2") (defcustom hashcash-extra-generate-parameters '("-Z2")

View file

@ -1,7 +1,7 @@
;;; project.el --- Operations on the current project -*- lexical-binding: t; -*- ;;; project.el --- Operations on the current project -*- lexical-binding: t; -*-
;; Copyright (C) 2015-2023 Free Software Foundation, Inc. ;; Copyright (C) 2015-2023 Free Software Foundation, Inc.
;; Version: 0.9.7 ;; Version: 0.9.8
;; Package-Requires: ((emacs "26.1") (xref "1.4.0")) ;; Package-Requires: ((emacs "26.1") (xref "1.4.0"))
;; This is a GNU ELPA :core package. Avoid using functionality that ;; This is a GNU ELPA :core package. Avoid using functionality that
@ -512,8 +512,6 @@ project backend implementation of `project-external-roots'.")
See `project-vc-extra-root-markers' for the marker value format.") See `project-vc-extra-root-markers' for the marker value format.")
(defun project-try-vc (dir) (defun project-try-vc (dir)
(defvar vc-svn-admin-directory)
(require 'vc-svn)
;; FIXME: Learn to invalidate when the value of ;; FIXME: Learn to invalidate when the value of
;; `project-vc-merge-submodules' or `project-vc-extra-root-markers' ;; `project-vc-merge-submodules' or `project-vc-extra-root-markers'
;; changes. ;; changes.

View file

@ -3759,14 +3759,15 @@ the python shell:
whitespaces will be removed. Otherwise, wraps indented whitespaces will be removed. Otherwise, wraps indented
regions under an \"if True:\" block so the interpreter regions under an \"if True:\" block so the interpreter
evaluates them correctly." evaluates them correctly."
(let* ((single-p (save-restriction (let* ((single-p (save-excursion
(narrow-to-region start end) (save-restriction
(= (progn (narrow-to-region start end)
(goto-char start) (= (progn
(python-nav-beginning-of-statement)) (goto-char start)
(progn (python-nav-beginning-of-statement))
(goto-char end) (progn
(python-nav-beginning-of-statement))))) (goto-char end)
(python-nav-beginning-of-statement))))))
(start (save-excursion (start (save-excursion
;; If we're at the start of the expression, and if ;; If we're at the start of the expression, and if
;; the region consists of a single statement, then ;; the region consists of a single statement, then
@ -3785,10 +3786,11 @@ the python shell:
(line-beginning-position) (line-beginning-position)
start)))) start))))
(substring (buffer-substring-no-properties start end)) (substring (buffer-substring-no-properties start end))
(starts-at-first-line-p (save-restriction (starts-at-first-line-p (save-excursion
(widen) (save-restriction
(goto-char start) (widen)
(= (line-number-at-pos) 1))) (goto-char start)
(= (line-number-at-pos) 1))))
(encoding (python-info-encoding)) (encoding (python-info-encoding))
(toplevel-p (zerop (save-excursion (toplevel-p (zerop (save-excursion
(goto-char start) (goto-char start)

View file

@ -158,6 +158,7 @@
(macro_definition (identifier) @font-lock-preprocessor-face) (macro_definition (identifier) @font-lock-preprocessor-face)
(field_declaration name: (field_identifier) @font-lock-property-face) (field_declaration name: (field_identifier) @font-lock-property-face)
(parameter pattern: (_) @rust-ts-mode--fontify-pattern) (parameter pattern: (_) @rust-ts-mode--fontify-pattern)
(closure_parameters (_) @rust-ts-mode--fontify-pattern)
(let_declaration pattern: (_) @rust-ts-mode--fontify-pattern) (let_declaration pattern: (_) @rust-ts-mode--fontify-pattern)
(for_expression pattern: (_) @rust-ts-mode--fontify-pattern) (for_expression pattern: (_) @rust-ts-mode--fontify-pattern)
(let_condition pattern: (_) @rust-ts-mode--fontify-pattern) (let_condition pattern: (_) @rust-ts-mode--fontify-pattern)

View file

@ -1088,7 +1088,8 @@ Leave one space or none, according to the context."
(defun delete-horizontal-space (&optional backward-only) (defun delete-horizontal-space (&optional backward-only)
"Delete all spaces and tabs around point. "Delete all spaces and tabs around point.
If BACKWARD-ONLY is non-nil, delete them only before point." If BACKWARD-ONLY is non-nil (interactively, the prefix argument), delete
them only before point."
(interactive "*P") (interactive "*P")
(delete-space--internal " \t" backward-only)) (delete-space--internal " \t" backward-only))
@ -1114,6 +1115,7 @@ If BACKWARD-ONLY is non-nil, delete them only before point."
(defun just-one-space (&optional n) (defun just-one-space (&optional n)
"Delete all spaces and tabs around point, leaving one space (or N spaces). "Delete all spaces and tabs around point, leaving one space (or N spaces).
Interactively, N is the prefix numeric argument.
If N is negative, delete newlines as well, leaving -N spaces. If N is negative, delete newlines as well, leaving -N spaces.
See also `cycle-spacing'." See also `cycle-spacing'."
(interactive "*p") (interactive "*p")
@ -10832,7 +10834,8 @@ If the buffer doesn't exist, create it first."
'((?y "yes" "kill buffer without saving") '((?y "yes" "kill buffer without saving")
(?n "no" "exit without doing anything") (?n "no" "exit without doing anything")
(?s "save and then kill" "save the buffer and then kill it")) (?s "save and then kill" "save the buffer and then kill it"))
nil nil (not use-short-answers))))) nil nil (and (not use-short-answers)
(not (use-dialog-box-p)))))))
(if (equal response "no") (if (equal response "no")
nil nil
(unless (equal response "yes") (unless (equal response "yes")

View file

@ -1204,6 +1204,11 @@ See `treesit-simple-indent-presets'.")
(cons 'grand-parent (cons 'grand-parent
(lambda (_n parent &rest _) (lambda (_n parent &rest _)
(treesit-node-start (treesit-node-parent parent)))) (treesit-node-start (treesit-node-parent parent))))
(cons 'great-grand-parent
(lambda (_n parent &rest _)
(treesit-node-start
(treesit-node-parent
(treesit-node-parent parent)))))
(cons 'parent-bol (lambda (_n parent &rest _) (cons 'parent-bol (lambda (_n parent &rest _)
(save-excursion (save-excursion
(goto-char (treesit-node-start parent)) (goto-char (treesit-node-start parent))
@ -2462,7 +2467,8 @@ to the offending pattern and highlight the pattern."
(with-current-buffer buf (with-current-buffer buf
(let* ((data (cdr err)) (let* ((data (cdr err))
(message (nth 0 data)) (message (nth 0 data))
(start (nth 1 data))) (start (nth 1 data))
(inhibit-read-only t))
(erase-buffer) (erase-buffer)
(insert (treesit-query-expand query)) (insert (treesit-query-expand query))
(goto-char start) (goto-char start)

View file

@ -2484,14 +2484,6 @@ and no others."
(defalias 'some-window 'get-window-with-predicate) (defalias 'some-window 'get-window-with-predicate)
(defcustom display-buffer-avoid-small-windows nil
"If non-nil, windows that have fewer lines than this are avoided.
This is used by `get-lru-window'. The value is interpreted in units
of the frame's canonical line height, like `window-total-height' does."
:type '(choice (const nil) number)
:version "29.1"
:group 'windows)
(defun get-lru-window (&optional all-frames dedicated not-selected no-other) (defun get-lru-window (&optional all-frames dedicated not-selected no-other)
"Return the least recently used window on frames specified by ALL-FRAMES. "Return the least recently used window on frames specified by ALL-FRAMES.
Return a full-width window if possible. A minibuffer window is Return a full-width window if possible. A minibuffer window is
@ -2517,11 +2509,7 @@ have special meanings:
- A frame means consider all windows on that frame only. - A frame means consider all windows on that frame only.
Any other value of ALL-FRAMES means consider all windows on the Any other value of ALL-FRAMES means consider all windows on the
selected frame and no others. selected frame and no others."
`display-buffer-avoid-small-windows', if non-nil, is also taken into
consideration. Windows whose height is smaller that the value of that
variable will be avoided if larger windows are available."
(declare (side-effect-free error-free)) (declare (side-effect-free error-free))
(let ((windows (window-list-1 nil 'nomini all-frames)) (let ((windows (window-list-1 nil 'nomini all-frames))
best-window best-time second-best-window second-best-time time) best-window best-time second-best-window second-best-time time)
@ -2532,9 +2520,6 @@ variable will be avoided if larger windows are available."
(not (window-parameter window 'no-other-window)))) (not (window-parameter window 'no-other-window))))
(setq time (window-use-time window)) (setq time (window-use-time window))
(if (or (eq window (selected-window)) (if (or (eq window (selected-window))
(and display-buffer-avoid-small-windows
(< (window-height window)
display-buffer-avoid-small-windows))
(not (window-full-width-p window))) (not (window-full-width-p window)))
(when (or (not second-best-time) (< time second-best-time)) (when (or (not second-best-time) (< time second-best-time))
(setq second-best-time time) (setq second-best-time time)
@ -7283,6 +7268,11 @@ entry. Otherwise, if WINDOW is new and the value of
dedicated flag to that value. In any other case, reset WINDOW's dedicated flag to that value. In any other case, reset WINDOW's
dedicated flag to nil. dedicated flag to nil.
If ALIST contains a non-nil `bump-use-time' entry, bump use time
of WINDOW so further calls of `display-buffer-use-some-window'
and `display-buffer-use-least-recent-window' will try to avoid
it.
Return WINDOW if BUFFER and WINDOW are live." Return WINDOW if BUFFER and WINDOW are live."
(when (and (buffer-live-p buffer) (window-live-p window)) (when (and (buffer-live-p buffer) (window-live-p window))
(display-buffer-record-window type window buffer) (display-buffer-record-window type window buffer)
@ -7290,6 +7280,10 @@ Return WINDOW if BUFFER and WINDOW are live."
;; Unless WINDOW already shows BUFFER reset its dedicated flag. ;; Unless WINDOW already shows BUFFER reset its dedicated flag.
(set-window-dedicated-p window nil) (set-window-dedicated-p window nil)
(set-window-buffer window buffer)) (set-window-buffer window buffer))
(when (cdr (assq 'bump-use-time alist))
;; Bump WINDOW's use time so 'display-buffer--lru-window' will try
;; to avoid it.
(window-bump-use-time window))
(let ((alist-dedicated (assq 'dedicated alist))) (let ((alist-dedicated (assq 'dedicated alist)))
;; Maybe dedicate WINDOW to BUFFER if asked for. ;; Maybe dedicate WINDOW to BUFFER if asked for.
(cond (cond
@ -8511,15 +8505,64 @@ indirectly called by the latter."
(when (setq window (or best-window second-best-window)) (when (setq window (or best-window second-best-window))
(window--display-buffer buffer window 'reuse alist)))) (window--display-buffer buffer window 'reuse alist))))
(defun display-buffer-use-least-recent-window (buffer alist) (defun display-buffer--lru-window (alist)
"Display BUFFER in an existing window, but that hasn't been used lately. "Return the least recently used window according to ALIST.
This `display-buffer' action function is like Do not return a minibuffer window or a window dedicated to its
`display-buffer-use-some-window', but will cycle through windows buffer. ALIST is a buffer display action alist as compiled by
when displaying buffers repeatedly, and if there's only a single `display-buffer'. The following ALIST entries are honored:
window, it will split the window."
(when-let ((window (display-buffer-use-some-window - `lru-frames' specifies the frames to investigate and has the
buffer (cons (cons 'inhibit-same-window t) alist)))) same meaning as the ALL-FRAMES argument of `get-lru-window'.
(window-bump-use-time window)))
- `lru-time' specifies a use time. Do not return a window whose
use time is higher than this.
- `window-min-width' specifies a preferred minimum width in
canonical frame columns. If it is the constant `full-width',
prefer a full-width window.
- `window-min-height' specifies a preferred minimum height in
canonical frame lines. If it is the constant `full-height',
prefer a full-height window.
If ALIST contains a non-nil `inhibit-same--window' entry, do not
return the selected window."
(let ((windows
(window-list-1 nil 'nomini (cdr (assq 'lru-frames alist))))
(lru-time (cdr (assq 'lru-time alist)))
(min-width (cdr (assq 'window-min-width alist)))
(min-height (cdr (assq 'window-min-height alist)))
(not-this-window (cdr (assq 'inhibit-same-window alist)))
best-window best-time second-best-window second-best-time time)
(dolist (window windows)
(when (and (not (window-dedicated-p window))
(or (not not-this-window)
(not (eq window (selected-window)))))
(setq time (window-use-time window))
(unless (and (numberp lru-time) (> time lru-time))
(if (or (eq window (selected-window))
(and min-width
(or (and (numberp min-width)
(< (window-width window) min-width))
(and (eq min-width 'full-width)
(not (window-full-width-p window)))))
(and min-height
(or (and (numberp min-height)
(< (window-height window) min-height))
(and (eq min-height 'full-height)
(not (window-full-height-p window))))))
;; This window is either selected or does not meet the size
;; restrictions - so it's only a second best choice. Try to
;; find a more recently used one that fits.
(when (or (not second-best-time) (< time second-best-time))
(setq second-best-time time)
(setq second-best-window window))
;; This window is not selected and does meet the size
;; restrictions. It's the best choice so far.
(when (or (not best-time) (< time best-time))
(setq best-time time)
(setq best-window window))))))
(or best-window second-best-window)))
(defun display-buffer-use-some-window (buffer alist) (defun display-buffer-use-some-window (buffer alist)
"Display BUFFER in an existing window. "Display BUFFER in an existing window.
@ -8543,7 +8586,11 @@ indirectly called by the latter."
(window--frame-usable-p (last-nonminibuffer-frame)))) (window--frame-usable-p (last-nonminibuffer-frame))))
(window (window
;; Reuse an existing window. ;; Reuse an existing window.
(or (get-lru-window frame nil not-this-window) (or (display-buffer--lru-window
;; If ALIST specifies 'lru-frames' or 'window-min-width'
;; let them prevail.
(append alist `((lru-frames . ,frame)
(window-min-width . full-width))))
(let ((window (get-buffer-window buffer 'visible))) (let ((window (get-buffer-window buffer 'visible)))
(unless (and not-this-window (unless (and not-this-window
(eq window (selected-window))) (eq window (selected-window)))
@ -8573,6 +8620,76 @@ indirectly called by the latter."
(unless (cdr (assq 'inhibit-switch-frame alist)) (unless (cdr (assq 'inhibit-switch-frame alist))
(window--maybe-raise-frame (window-frame window))))))) (window--maybe-raise-frame (window-frame window)))))))
(defun display-buffer-use-least-recent-window (buffer alist)
"Display BUFFER trying to avoid windows used recently.
This is similar to `display-buffer-use-some-window' but tries
hard to avoid using a window recently used by `display-buffer'.
Distinctive features are:
- Do not use the selected window.
- Try first to reuse a window that shows BUFFER already on a
frame specified by a `reusable-frames' ALIST entry, using the
selected frame if no such entry has been specified.
- Next try to show BUFFER in the least recently used window. The
frames to search for such a window can be specified via a
`lru-frames' ALIST entry; if no such entry exists, search the
selected frame only. In addition, try to satisfy constraints
specified by the following ALIST entries, if present:
`lru-time' specifies a use time. Do not return a window whose
use time is higher than this. When calling this action
function repeatedly (presumably to display several buffers in
a row), an application should first save the use time of the
selected window and pass that same value via such an entry in
each call of `display-buffer'. This reduces the probability
that `display-buffer' uses the same window as a previous
call.
`window-min-width' specifies a preferred minimum width in
canonical frame columns. If it is the constant `full-width',
prefer a full-width window.
`window-min-height' specifies a preferred minimum height in
canonical frame lines. If it is the constant `full-height',
prefer a full-height window.
- If the preceding steps fail, try to pop up a new window on the
selected frame.
If a window is found, bump the use time of that window to the
highest use time after the selected window. This makes it less
probable that a future invocation of this function uses that
window for another buffer."
(let* ((alist (cons (cons 'inhibit-same-window t) alist))
(window
(or (display-buffer-reuse-window buffer alist)
(let ((window (display-buffer--lru-window alist)))
(when (window-live-p window)
(let* ((quit-restore (window-parameter window 'quit-restore))
(quad (nth 1 quit-restore)))
;; If the window was used by `display-buffer' before, try to
;; resize it to its old height but don't signal an error.
(when (and (listp quad)
(integerp (nth 3 quad))
(> (nth 3 quad) (window-total-height window)))
(condition-case nil
(window-resize
window (- (nth 3 quad) (window-total-height window)))
(error nil)))
(prog1
(window--display-buffer buffer window 'reuse alist)
(window--even-window-sizes window)
(unless (cdr (assq 'inhibit-switch-frame alist))
(window--maybe-raise-frame (window-frame window)))))))
(display-buffer-pop-up-window buffer alist))))
;; Don't bump use time twice.
(when (and window (not (cdr (assq 'bump-use-time alist))))
(window-bump-use-time window))
window))
(defun display-buffer-no-window (_buffer alist) (defun display-buffer-no-window (_buffer alist)
"Display BUFFER in no window. "Display BUFFER in no window.
ALIST is an association list of action symbols and values. See ALIST is an association list of action symbols and values. See

View file

@ -797,12 +797,10 @@ treesit_record_change (ptrdiff_t start_byte, ptrdiff_t old_end_byte,
max (visible_beg, old_end_byte)) max (visible_beg, old_end_byte))
- visible_beg); - visible_beg);
/* We don't clip new_end_offset under visible_end, because /* We don't clip new_end_offset under visible_end, because
inserting in narrowed region always extends the visible otherwise we would miss updating the clipped part. Plus,
region. If we clip new_end_offset here, and re-add the when inserting in narrowed region, the narrowed region
clipped "tail" in treesit_sync_visible_region later, will grow to accommodate the new text, so this is the
while it is technically equivalent, tree-sitter's correct behavior. (Bug#61369). */
incremental parsing algorithm doesn't seem to like it
(bug#61369). */
ptrdiff_t new_end_offset = (max (visible_beg, new_end_byte) ptrdiff_t new_end_offset = (max (visible_beg, new_end_byte)
- visible_beg); - visible_beg);
eassert (start_offset <= old_end_offset); eassert (start_offset <= old_end_offset);

View file

@ -762,10 +762,15 @@ future use. */)
DEFUN ("window-use-time", Fwindow_use_time, Swindow_use_time, 0, 1, 0, DEFUN ("window-use-time", Fwindow_use_time, Swindow_use_time, 0, 1, 0,
doc: /* Return the use time of window WINDOW. doc: /* Return the use time of window WINDOW.
WINDOW must be a live window and defaults to the selected one. WINDOW must specify a live window and defaults to the selected one.
The window with the highest use time is the most recently selected
one. The window with the lowest use time is the least recently The window with the highest use time is usually the one most recently
selected one. */) selected by calling `select-window' with NORECORD nil. The window with
the lowest use time is usually the least recently selected one chosen in
such a way.
Note that the use time of a window can be also changed by calling
`window-bump-use-time' for that window. */)
(Lisp_Object window) (Lisp_Object window)
{ {
return make_fixnum (decode_live_window (window)->use_time); return make_fixnum (decode_live_window (window)->use_time);
@ -773,15 +778,27 @@ selected one. */)
DEFUN ("window-bump-use-time", Fwindow_bump_use_time, DEFUN ("window-bump-use-time", Fwindow_bump_use_time,
Swindow_bump_use_time, 0, 1, 0, Swindow_bump_use_time, 0, 1, 0,
doc: /* Mark WINDOW as having been most recently used. doc: /* Mark WINDOW as second most recently used.
WINDOW must be a live window and defaults to the selected one. */) WINDOW must specify a live window.
If WINDOW is not selected and the selected window has the highest use
time of all windows, set the use time of WINDOW to that of the selected
window, increase the use time of the selected window by one and return
the new use time of WINDOW. Otherwise, do nothing and return nil. */)
(Lisp_Object window) (Lisp_Object window)
{ {
struct window *w = decode_live_window (window); struct window *w = decode_live_window (window);
struct window *sw = XWINDOW (selected_window);
w->use_time = ++window_select_count; if (w != sw && sw->use_time == window_select_count)
{
w->use_time = window_select_count;
sw->use_time = ++window_select_count;
return Qnil; return make_fixnum (w->use_time);
}
else
return Qnil;
} }
DEFUN ("window-pixel-width", Fwindow_pixel_width, Swindow_pixel_width, 0, 1, 0, DEFUN ("window-pixel-width", Fwindow_pixel_width, Swindow_pixel_width, 0, 1, 0,

View file

@ -9609,8 +9609,8 @@ move_it_in_display_line_to (struct it *it,
else else
line_number_pending = true; line_number_pending = true;
} }
/* If there's a line-/wrap-prefix, handle it. */ /* If there's a line-/wrap-prefix, handle it, if we didn't already. */
if (it->method == GET_FROM_BUFFER) if (it->area == TEXT_AREA && !it->string_from_prefix_prop_p)
handle_line_prefix (it); handle_line_prefix (it);
} }

View file

@ -189,6 +189,14 @@ default to `point-min' and `point-max' respectively."
(overlay-end overlay)))) (overlay-end overlay))))
(buffer-substring-no-properties (point-min) (point-max))))) (buffer-substring-no-properties (point-min) (point-max)))))
(defun python-tests-should-not-move (func &rest args)
"Assert that point does not move while calling FUNC with ARGS.
Returns the value returned by FUNC."
(let ((pos (point))
(ret (apply func args)))
(should (= pos (point)))
ret))
(defun python-virt-bin (&optional virt-root) (defun python-virt-bin (&optional virt-root)
"Return the virtualenv bin dir, starting from VIRT-ROOT. "Return the virtualenv bin dir, starting from VIRT-ROOT.
If nil, VIRT-ROOT defaults to `python-shell-virtualenv-root'. If nil, VIRT-ROOT defaults to `python-shell-virtualenv-root'.
@ -4213,7 +4221,8 @@ class Bar(models.Model):
pass pass
" "
(should (string= (buffer-string) (should (string= (buffer-string)
(python-shell-buffer-substring (point-min) (point-max)))))) (python-tests-should-not-move
#'python-shell-buffer-substring (point-min) (point-max))))))
(ert-deftest python-shell-buffer-substring-2 () (ert-deftest python-shell-buffer-substring-2 ()
"Main block should be removed if NOMAIN is non-nil." "Main block should be removed if NOMAIN is non-nil."
@ -4229,7 +4238,8 @@ if __name__ == \"__main__\":
foo = Foo() foo = Foo()
print (foo) print (foo)
" "
(should (string= (python-shell-buffer-substring (point-min) (point-max) t) (should (string= (python-tests-should-not-move
#'python-shell-buffer-substring (point-min) (point-max) t)
" "
class Foo(models.Model): class Foo(models.Model):
pass pass
@ -4256,7 +4266,8 @@ if __name__ == \"__main__\":
class Bar(models.Model): class Bar(models.Model):
pass pass
" "
(should (string= (python-shell-buffer-substring (point-min) (point-max) t) (should (string= (python-tests-should-not-move
#'python-shell-buffer-substring (point-min) (point-max) t)
" "
class Foo(models.Model): class Foo(models.Model):
pass pass
@ -4284,7 +4295,8 @@ if __name__ == \"__main__\":
class Bar(models.Model): class Bar(models.Model):
pass pass
" "
(should (string= (python-shell-buffer-substring (should (string= (python-tests-should-not-move
#'python-shell-buffer-substring
(python-tests-look-at "class Foo(models.Model):") (python-tests-look-at "class Foo(models.Model):")
(progn (python-nav-forward-sexp) (point))) (progn (python-nav-forward-sexp) (point)))
"# -*- coding: latin-1 -*- "# -*- coding: latin-1 -*-
@ -4307,7 +4319,8 @@ if __name__ == \"__main__\":
class Bar(models.Model): class Bar(models.Model):
pass pass
" "
(should (string= (python-shell-buffer-substring (should (string= (python-tests-should-not-move
#'python-shell-buffer-substring
(python-tests-look-at "class Bar(models.Model):") (python-tests-look-at "class Bar(models.Model):")
(progn (python-nav-forward-sexp) (point))) (progn (python-nav-forward-sexp) (point)))
"# -*- coding: latin-1 -*- "# -*- coding: latin-1 -*-
@ -4338,7 +4351,8 @@ if __name__ == \"__main__\":
class Bar(models.Model): class Bar(models.Model):
pass pass
" "
(should (string= (python-shell-buffer-substring (should (string= (python-tests-should-not-move
#'python-shell-buffer-substring
(python-tests-look-at "# coding: latin-1") (python-tests-look-at "# coding: latin-1")
(python-tests-look-at "if __name__ == \"__main__\":")) (python-tests-look-at "if __name__ == \"__main__\":"))
"# -*- coding: latin-1 -*- "# -*- coding: latin-1 -*-
@ -4365,7 +4379,8 @@ if __name__ == \"__main__\":
class Bar(models.Model): class Bar(models.Model):
pass pass
" "
(should (string= (python-shell-buffer-substring (should (string= (python-tests-should-not-move
#'python-shell-buffer-substring
(python-tests-look-at "# coding: latin-1") (python-tests-look-at "# coding: latin-1")
(python-tests-look-at "if __name__ == \"__main__\":")) (python-tests-look-at "if __name__ == \"__main__\":"))
"# -*- coding: utf-8 -*- "# -*- coding: utf-8 -*-
@ -4385,7 +4400,8 @@ class Foo(models.Model):
class Foo(models.Model): class Foo(models.Model):
pass pass
" "
(should (string= (python-shell-buffer-substring (point-min) (point-max)) (should (string= (python-tests-should-not-move
#'python-shell-buffer-substring (point-min) (point-max))
"# coding: utf-8 "# coding: utf-8
@ -4404,7 +4420,8 @@ class Foo(models.Model):
class Bar(models.Model): class Bar(models.Model):
pass pass
" "
(should (string= (python-shell-buffer-substring (should (string= (python-tests-should-not-move
#'python-shell-buffer-substring
(point-min) (point-min)
(python-tests-look-at "class Bar(models.Model):")) (python-tests-look-at "class Bar(models.Model):"))
"# coding: utf-8 "# coding: utf-8
@ -4421,7 +4438,8 @@ class Foo(models.Model):
def foo(): def foo():
print ('a') print ('a')
" "
(should (string= (python-shell-buffer-substring (should (string= (python-tests-should-not-move
#'python-shell-buffer-substring
(python-tests-look-at "print ('a')") (python-tests-look-at "print ('a')")
(point-max)) (point-max))
"# -*- coding: utf-8 -*-\nif True:\n print ('a')\n\n")))) "# -*- coding: utf-8 -*-\nif True:\n print ('a')\n\n"))))
@ -4433,7 +4451,8 @@ def foo():
def foo(): def foo():
print ('a') print ('a')
" "
(should (string= (python-shell-buffer-substring (should (string= (python-tests-should-not-move
#'python-shell-buffer-substring
(progn (progn
(python-tests-look-at "print ('a')") (python-tests-look-at "print ('a')")
(backward-char 1) (backward-char 1)
@ -4451,7 +4470,8 @@ def foo():
print ('a') print ('a')
" "
(should (string= (python-shell-buffer-substring (should (string= (python-tests-should-not-move
#'python-shell-buffer-substring
(python-tests-look-at "# Whitespace") (python-tests-look-at "# Whitespace")
(point-max)) (point-max))
"# -*- coding: utf-8 -*-\n\nif True:\n # Whitespace\n\n print ('a')\n\n")))) "# -*- coding: utf-8 -*-\n\nif True:\n # Whitespace\n\n print ('a')\n\n"))))
@ -4463,7 +4483,8 @@ def foo():
def foo(): def foo():
a = 1 a = 1
" "
(should (string= (python-shell-buffer-substring (should (string= (python-tests-should-not-move
#'python-shell-buffer-substring
(python-tests-look-at "a = 1") (python-tests-look-at "a = 1")
(pos-eol)) (pos-eol))
"# -*- coding: utf-8 -*-\n\na = 1")))) "# -*- coding: utf-8 -*-\n\na = 1"))))
@ -4476,7 +4497,8 @@ def foo():
a = \"\"\"Some a = \"\"\"Some
string\"\"\" string\"\"\"
" "
(should (string= (python-shell-buffer-substring (should (string= (python-tests-should-not-move
#'python-shell-buffer-substring
(python-tests-look-at "a = \"\"\"Some") (python-tests-look-at "a = \"\"\"Some")
(pos-eol 2)) (pos-eol 2))
"# -*- coding: utf-8 -*-\n\na = \"\"\"Some\n string\"\"\"")))) "# -*- coding: utf-8 -*-\n\na = \"\"\"Some\n string\"\"\""))))
@ -4488,7 +4510,8 @@ def foo():
def foo(): def foo():
a = 1 a = 1
" "
(should (string= (python-shell-buffer-substring (should (string= (python-tests-should-not-move
#'python-shell-buffer-substring
(python-tests-look-at " a = 1") (python-tests-look-at " a = 1")
(python-tests-look-at " = 1")) (python-tests-look-at " = 1"))
"# -*- coding: utf-8 -*-\n\na")))) "# -*- coding: utf-8 -*-\n\na"))))
@ -4500,7 +4523,8 @@ def foo():
def foo(): def foo():
a = 1 a = 1
" "
(should (string= (python-shell-buffer-substring (should (string= (python-tests-should-not-move
#'python-shell-buffer-substring
(python-tests-look-at "1") (python-tests-look-at "1")
(1+ (point))) (1+ (point)))
"# -*- coding: utf-8 -*-\n\n1")))) "# -*- coding: utf-8 -*-\n\n1"))))
@ -4515,7 +4539,8 @@ def foo():
b = 2 b = 2
\"\"\" \"\"\"
" "
(should (string= (python-shell-buffer-substring (should (string= (python-tests-should-not-move
#'python-shell-buffer-substring
(python-tests-look-at "a = 1") (python-tests-look-at "a = 1")
(python-tests-look-at "\"\"\"")) (python-tests-look-at "\"\"\""))
"# -*- coding: utf-8 -*-\n\nif True:\n a = 1\n b = 2\n\n")))) "# -*- coding: utf-8 -*-\n\nif True:\n a = 1\n b = 2\n\n"))))
@ -4525,7 +4550,8 @@ def foo():
(python-tests-with-temp-buffer (python-tests-with-temp-buffer
"s = 'test' "s = 'test'
" "
(should (string= (python-shell-buffer-substring (should (string= (python-tests-should-not-move
#'python-shell-buffer-substring
(python-tests-look-at "'test'") (python-tests-look-at "'test'")
(pos-eol)) (pos-eol))
"'test'")))) "'test'"))))