Merge remote-tracking branch 'origin/master' into feature/android

This commit is contained in:
Po Lu 2023-07-29 11:29:42 +08:00
commit 183c65e0c4
14 changed files with 257 additions and 149 deletions

View file

@ -669,6 +669,10 @@ This matches the hexadecimal digits: @samp{0} through @samp{9}, @samp{a}
through @samp{f} and @samp{A} through @samp{F}.
@end table
The classes @samp{[:space:]}, @samp{[:word:]} and @samp{[:punct:]} use
the syntax-table of the current buffer but not any overriding syntax
text properties (@pxref{Syntax Properties}).
@node Regexp Backslash
@subsubsection Backslash Constructs in Regular Expressions
@cindex backslash in regular expressions
@ -1341,6 +1345,9 @@ Match any @acronym{ASCII} character (codes 0--127).
Match any non-@acronym{ASCII} character (but not raw bytes).
@end table
The classes @code{space}, @code{word} and @code{punct} use the
syntax-table of the current buffer but not any overriding syntax text
properties (@pxref{Syntax Properties}).@*
Corresponding string regexp: @samp{[[:@var{class}:]]}
@item @code{(syntax @var{syntax})}
@ -1920,7 +1927,8 @@ causing a match to fail early.
@item
Avoid or-patterns in favor of bracket expressions: write
@samp{[ab]} instead of @samp{a\|b}. Recall that @samp{\s-} and @samp{\sw}
are equivalent to @samp{[[:space:]]} and @samp{[[:word:]]}, respectively.
are equivalent to @samp{[[:space:]]} and @samp{[[:word:]]}, respectively,
most of the time.
@item
Since the last branch of an or-pattern does not add a backtrack point

View file

@ -1268,6 +1268,9 @@ settings (@pxref{Sample configuration via Customize}).
(erc-server-reconnect-function #'erc-server-delayed-check-reconnect)
(erc-server-reconnect-timeout 30)
;; Show new buffers in the current window instead of a split.
(erc-interactive-display 'buffer)
;; Insert a newline when I hit <RET> at the prompt, and prefer
;; something more deliberate for actually sending messages.
:bind (:map erc-mode-map
@ -1391,6 +1394,16 @@ Indeed, you can always get back here by running @kbd{M-x
customize-group @key{RET} erc-server @key{RET}} from almost anywhere
in Emacs.
To make sure you've got this, try quickly customizing the option
@code{erc-interactive-display}, which lives in the @samp{Erc Buffers}
group (@kbd{M-x customize-group @key{RET} erc-buffers @key{RET}}). As
its doc string explains, the option controls where new buffers show up
when you do @kbd{M-x erc-tls @key{RET}} or issue certain ``slash''
commands, like @kbd{/JOIN #emacs-beginners @key{RET}}, at ERC's
prompt. Change its value to the symbol @code{buffer} by choosing
@samp{Use current window} (item @kbd{5}) from the option's
@samp{[Value Menu]}. Don't forget to save.
Now it's time to set some key bindings for @code{erc-mode-map}, a
major-mode keymap active in all ERC buffers. In general, it's best to
do this part either entirely or in conjunction with some lisp code in

View file

@ -14,29 +14,29 @@ GNU Emacs since Emacs version 22.1.
* Changes in ERC 5.6
** Module 'keep-place' has gained a more flamboyant cousin.
Remember your place in ERC buffers more easily while retaining the
freedom to look around, all with the help of a configurable, visible
indicator. Optionally sync the indicator to any progress made when
you haven't yet caught up to the live stream. See options
'erc-keep-place-indicator-style' and friends, and try M-x
** Module 'keep-place' has a more decorative cousin.
Remember your place in ERC buffers a bit more easily with the help of
a configurable, visible indicator. Optionally sync the indicator to
any progress made while you haven't yet caught up to the live stream.
See options 'erc-keep-place-indicator-style' and friends, and try M-x
keep-place-indicator-mode to see it in action.
** Module 'fill' offers a style based on 'visual-line-mode'.
This fill style mimics the "hanging indent" look of 'erc-fill-static'
and provides some movement and editing commands to optionally tame the
** Module 'fill' offers an adaptive style based on 'visual-line-mode'.
This style dynamically wraps messages to a window's width while
mimicking the "hanging indent" look of 'erc-fill-static'. It also
provides some movement and editing commands to optionally tame the
less familiar aspects of 'visual-line' behavior. An interactive
helper called 'erc-fill-wrap-nudge' allows for dynamic "refilling" of
buffers on the fly. Set 'erc-fill-function' to 'erc-fill-wrap' to get
started.
helper called 'erc-fill-wrap-nudge' makes easy work of adjusting the
overhang on the fly. Set 'erc-fill-function' to 'erc-fill-wrap' to
get started.
** A module for nickname highlighting has joined ERC.
Automatic nickname coloring has come to ERC core. Users familiar with
'erc-hl-nicks', from which this module directly descends, will already
be familiar with its suite of handy options. By default, each
nickname in an ERC session receives a unique face with a unique (or
evenly dealt) foreground color. Add 'nicks' to 'erc-modules' to get
started.
uniformly dealt) foreground color. Add 'nicks' to 'erc-modules' to
get started.
** A unified interactive entry point.
New users are often dismayed to discover that M-x ERC doesn't connect
@ -88,9 +88,9 @@ users to edit the 'erc-modules' widget instead.
Users can now add 'bufbar' to 'erc-modules' to achieve the same effect
as toggling 'erc-status-sidebar-open' manually at the start of an IRC
session. The module has also been outfitted to show channels and
queries under their respective servers by default. To avoid
confusion, the major mode used for the sidebar buffer itself,
'erc-status-sidebar-mode', is no longer available interactively.
queries under their servers by default. To avoid confusion, the major
mode for the actual sidebar buffer itself, 'erc-status-sidebar-mode',
is no longer available interactively.
** A new spin on a classic integration in erc-speedbar.
Add 'nickbar' to 'erc-modules' to spawn a dynamically updating side
@ -252,20 +252,19 @@ versions.
For starters, the 'cursor-sensor-functions' property no longer
contains unique closures and thus no longer proves effective for
traversing messages. To compensate, a new property, 'erc-timestamp',
now spans message bodies but not the newlines delimiting them.
Somewhat relatedly, the function 'erc-insert-aligned' has been
deprecated and removed from the primary client code path.
Additionally, the 'stamp' module now merges its 'invisible' property
with existing ones, when present, and it includes all white space
around stamps when doing so.
now spans message bodies but not the newlines delimiting them. Also
affecting the `stamp' module is the deprecation of the function
'erc-insert-aligned' and its removal from client code. Additionally,
the module now merges its 'invisible' property with existing ones and
includes all white space around stamps when doing so.
Moreover, such "propertizing" of surrounding white space now extends
to all 'stamp'-applied properties, like 'field', in all intervening
space between message text and timestamps. This constitutes a
This "propertizing" of surrounding white space also extends to all
'stamp'-applied properties, like 'field', in all intervening space
between message text and timestamps. Technically, this constitutes a
breaking change from the perspective of detecting a timestamp's
bounds. For example, ERC has always propertized leading space before
bounds. However, ERC has always propertized leading space before
right-sided stamps on the same line as message text but not those
folded onto the next line. This inconsistency made stamp detection
folded onto the next line. Such inconsistency made stamp detection
overly complex and produced uneven results when toggling stamp
visibility.
@ -317,11 +316,11 @@ third-party code, the key takeaway is that more 'font-lock-face'
properties encountered in the wild may be combinations of faces rather
than lone ones.
*** Prompt input split before 'erc-pre-send-functions' gets a say.
Hook members are now treated to input whose lines have already been
adjusted to fall within the allowed length limit. For convenience,
third-party code can request that the final input be "re-filled" prior
to being sent. See doc string for details.
*** 'erc-pre-send-functions' visits prompt input post-split.
ERC now adjusts input lines to fall within allowed length limits
before showing hook members the result. For compatibility,
third-party code can request that the final input be adjusted again
prior to being sent. See doc string for details.
*** ERC's prompt survives the insertion of user input and messages.
Previously, ERC's prompt and its input marker disappeared while
@ -329,18 +328,20 @@ running hooks during message insertion, and the position of its
"insert marker" (ERC's per-buffer process mark) was inconsistent
during these spells. To make insertion handling more predictable in
preparation for incorporating various protocol extensions, the prompt
and its bounding markers have become perennial fixtures. To effect
this change, small behavioral differences in message insertion have
been adopted. Crucially, 'erc-insert-marker' now has an "insertion
type" of t, and 'erc-display-line-1' now calls 'insert' instead of
'insert-before-prompt'. This allows user code to leave its own
markers via 'erc-insert-modify-hook' and 'erc-insert-post-hook'
instead of having to resort to workarounds. Message insertion for
outgoing messages, in 'erc-display-msg', remains as before. In rare
cases, these changes may mean third-party code needs tweaking, for
example, requiring the use of 'insert-before-markers' instead of
'insert'. As always, users feeling unduly inconvenienced by these
changes are encouraged to voice their concerns on the bug list.
and its bounding markers have become perennial fixtures.
To effect this change, small behavioral differences in message
insertion have been adopted. Crucially, 'erc-insert-marker' now has
an "insertion type" of t, and 'erc-display-line-1' now calls 'insert'
instead of 'insert-before-markers. This allows user code running on
'erc-insert-modify-hook' and 'erc-insert-post-hook' to leave its own
markers at the actual insertion point instead of resorting to
workarounds. Message insertion for outgoing messages, in
'erc-display-msg', remains as before. In rare cases, these changes
may mean third-party code needs tweaking, for example, requiring the
use of 'insert-before-markers' instead of 'insert'. As always, users
feeling unduly inconvenienced by these changes are encouraged to voice
their concerns on the bug list.
*** Miscellaneous changes
Two helper macros from GNU ELPA's Compat library are now available to

View file

@ -226,9 +226,9 @@ mnemonics of the following coding systems:
(put 'mode-line-mule-info 'risky-local-variable t)
(defvar mode-line-client
`(""
(:propertize ("" (:eval (if (frame-parameter nil 'client) "@" "")))
help-echo ,(purecopy "emacsclient frame")))
`(:eval
(if (frame-parameter nil 'client)
,(propertize "@" 'help-echo (purecopy "emacsclient frame"))))
"Mode line construct for identifying emacsclient frames.")
;; Autoload if this file no longer dumped.
;;;###autoload

View file

@ -176,7 +176,7 @@ are available (see Info node `(emacs)Document View')."
;; non-MikTeX apps. Was available under:
;; http://blog.miktex.org/post/2005/04/07/Starting-mgsexe-at-the-DOS-Prompt.aspx
((and (executable-find "mgs")
(= 0 (shell-command "mgs -q -dNODISPLAY -c quit")))
(eql 0 (shell-command "mgs -q -dNODISPLAY -c quit")))
"mgs")))
(t "gs"))
"Program to convert PS and PDF files to PNG."
@ -216,7 +216,7 @@ are available (see Info node `(emacs)Document View')."
:type 'boolean
:version "30.1")
(defcustom doc-view-imenu-enabled (executable-find "mutool")
(defcustom doc-view-imenu-enabled (and (executable-find "mutool") t)
"Whether to generate an imenu outline when \"mutool\" is available."
:type 'boolean
:version "29.1")
@ -577,8 +577,8 @@ Typically \"page-%s.png\".")
;; file. (TODO: We'd like to have something like that also
;; for other types, at least PS, but I don't know a good way
;; to test if a PS file is complete.)
(if (= 0 (call-process "pdfinfo" nil nil nil
doc-view--buffer-file-name))
(if (eql 0 (call-process "pdfinfo" nil nil nil
doc-view--buffer-file-name))
(revert)
(when (called-interactively-p 'interactive)
(message "Can't revert right now because the file is corrupted.")))
@ -1962,7 +1962,7 @@ structure is extracted by `doc-view--imenu-subtree'."
(let ((outline nil)
(fn (expand-file-name fn)))
(with-temp-buffer
(unless (= 0 (call-process "mutool" nil (current-buffer) nil "show" fn "outline"))
(unless (eql 0 (call-process "mutool" nil (current-buffer) nil "show" fn "outline"))
(imenu-unavailable-error "Unable to create imenu index using `mutool'"))
(goto-char (point-min))
(while (re-search-forward doc-view--outline-rx nil t)

View file

@ -443,12 +443,13 @@ parties.")
(cons (get-text-property m 'erc-timestamp)
(get-text-property spr 'erc-speaker)))))
(ts (pop props))
(props)
((not (time-less-p (erc-stamp--current-time) ts)))
((time-less-p (time-subtract (erc-stamp--current-time) ts)
erc-fill--wrap-max-lull))
(speaker (next-single-property-change (point-min) 'erc-speaker))
((not (eq (get-text-property speaker 'erc-ctcp) 'ACTION)))
(nick (get-text-property speaker 'erc-speaker))
(props)
((erc-nick-equal-p props nick))))
(set-marker erc-fill--wrap-last-msg (point-min))))

View file

@ -45,8 +45,8 @@
;; Use M-x erc-status-sidebar-kill RET to kill the sidebar buffer and
;; close the sidebar on all frames.
;; In addition to the commands above, you can also try the all-in-one,
;; "DWIM" command, `erc-bufbar-mode'. See its doc string for usage.
;; In addition to the commands above, you can also try the all-in-one
;; entry point `erc-bufbar-mode'. See its doc string for usage.
;; If you want the status sidebar enabled whenever you use ERC, add
;; `bufbar' to `erc-modules'. Note that this library also has a major
@ -130,8 +130,11 @@ buffers, using the functions
`erc-status-sidebar-pad-hierarchy'
for the above-mentioned purposes. ERC also accepts a list of
functions to preform these roles a la carte. See doc strings for
a description of their expected arguments and return values."
functions to preform these roles a la carte. Since the members
of the above sets aren't really interoperable, we don't offer
them here as customization choices, but you can still specify
them manually. See doc strings for a description of their
expected arguments and return values."
:package-version '(ERC . "5.6") ; FIXME sync on release
:type '(choice (const channels-only)
(const all-mixed)
@ -158,10 +161,12 @@ ACTION parameter."
:key-type symbol
:value-type (sexp :tag "Value")))))
(defcustom erc-status-sidebar-singular t
"Whether to show the sidebar on all frames or just one (default)."
:package-version '(ERC . "5.6") ; FIXME sync on release
:type 'boolean)
(defvar erc-status-sidebar--singular-p t
"Whether to restrict the sidebar to a single frame.
This variable only affects `erc-bufbar-mode'. Disabling it does
not arrange for automatically showing the sidebar in all frames.
Rather, disabling it allows for displaying the sidebar in the
selected frame even if it's already showing in some other frame.")
(defvar hl-line-mode)
(declare-function hl-line-highlight "hl-line" nil)
@ -178,7 +183,7 @@ ACTION parameter."
If NO-CREATION is non-nil, the window is not created."
(let ((sidebar-window (get-buffer-window erc-status-sidebar-buffer-name
erc-status-sidebar-singular)))
erc-status-sidebar--singular-p)))
(unless (or sidebar-window no-creation)
(with-current-buffer (erc-status-sidebar-get-buffer)
(setq-local vertical-scroll-bar nil))
@ -214,7 +219,7 @@ The erc-status-sidebar buffer is left alone, but the window
containing it on the current frame is closed. See
`erc-status-sidebar-kill'."
(interactive "P")
(mapcar #'delete-window
(mapcar #'delete-window ; FIXME use `mapc'.
(get-buffer-window-list (erc-status-sidebar-get-buffer)
nil (if all-frames t))))
@ -223,10 +228,8 @@ containing it on the current frame is closed. See
`(let ((buffer-read-only nil))
,@body))
;;;###autoload
(defun erc-status-sidebar-open ()
"Open or create a sidebar."
(interactive)
(defun erc-status-sidebar--open ()
"Maybe open the sidebar, respecting `erc-status-sidebar--singular-p'."
(save-excursion
(if (erc-status-sidebar-buffer-exists-p)
(erc-status-sidebar-get-window)
@ -237,11 +240,15 @@ containing it on the current frame is closed. See
;;;###autoload(autoload 'erc-bufbar-mode "erc-status-sidebar" nil t)
(define-erc-module bufbar nil
"Show `erc-track'-like activity in a side window.
When enabling, show the sidebar immediately if called from a
connected ERC buffer. Otherwise, arrange for doing so on connect
or whenever next displaying a new ERC buffer. When disabling,
hide the status window if it's showing. With a negative prefix
arg, also shutdown the session."
When enabling, show the sidebar immediately in the current frame
if called from a connected ERC buffer. Otherwise, arrange for
doing so on connect or whenever next displaying a new ERC buffer.
When disabling, hide the status window in all frames. With a
negative prefix arg, also shutdown the session. Normally, this
module only allows one sidebar window in an Emacs session. To
override this, use `erc-status-sidebar-open' to force creation
and `erc-status-sidebar-close' to hide a single instance on the
current frame only."
((unless erc-track-mode
(unless (memq 'track erc-modules)
(erc--warn-once-before-connect 'erc-bufbar-mode
@ -249,30 +256,38 @@ arg, also shutdown the session."
" This will affect \C-]all\C-] ERC sessions."
" Add `track' to `erc-modules' to silence this message."))
(erc-track-mode +1))
(add-hook 'erc--setup-buffer-hook #'erc-status-sidebar-open)
(add-hook 'erc--setup-buffer-hook #'erc-status-sidebar--open)
(unless erc--updating-modules-p
(if (erc-with-server-buffer erc-server-connected)
(erc-status-sidebar-open)
(setq erc-bufbar-mode nil)
(erc-status-sidebar--open)
(when (derived-mode-p 'erc-mode)
(erc-error "Not initializing `erc-bufbar-mode' in %s"
(current-buffer))))))
((remove-hook 'erc--setup-buffer-hook #'erc-status-sidebar-open)
(erc-status-sidebar-close erc-status-sidebar-singular)
((remove-hook 'erc--setup-buffer-hook #'erc-status-sidebar--open)
(erc-status-sidebar-close 'all-frames)
(when-let ((arg erc--module-toggle-prefix-arg)
((numberp arg))
((< arg 0)))
(erc-status-sidebar-kill))))
;;;###autoload
(defun erc-status-sidebar-open ()
"Open or create a sidebar window in the current frame.
When `erc-bufbar-mode' is active, do this even if one already
exists in another frame."
(interactive)
(let ((erc-status-sidebar--singular-p (not erc-bufbar-mode)))
(erc-status-sidebar--open)))
;;;###autoload
(defun erc-status-sidebar-toggle ()
"Toggle the sidebar open/closed on the current frame.
Do this regardless of `erc-status-sidebar-singular'."
When opening, and `erc-bufbar-mode' is active, create a sidebar
even if one already exists in another frame."
(interactive)
(if (get-buffer-window erc-status-sidebar-buffer-name nil)
(erc-status-sidebar-close)
(let (erc-status-sidebar-singular)
(erc-status-sidebar-open))))
(erc-status-sidebar-open)))
(defun erc-status-sidebar-get-channame (buffer)
"Return name of BUFFER with all leading \"#\" characters removed."
@ -413,11 +428,10 @@ name stand out."
erc-status-sidebar-pad-hierarchy))
(v v)))
(chanlist (apply sort-fn (funcall list-fn nil) nil))
(window nil)
(winstart nil))
(windows nil))
(with-current-buffer (erc-status-sidebar-get-buffer)
(setq window (get-buffer-window nil erc-status-sidebar-singular)
winstart (and window (window-start window)))
(dolist (window (get-buffer-window-list nil nil t))
(push (cons window (window-start window)) windows))
(erc-status-sidebar-writable
(delete-region (point-min) (point-max))
(goto-char (point-min))
@ -443,9 +457,8 @@ name stand out."
0 cnlen 'help-echo
"mouse-1: switch to buffer in other window" channame)
(funcall insert-fn channame chanbuf chanlist)))
(when winstart
(set-window-point window winstart)
(with-selected-window window (recenter 0)))
(when windows
(map-apply #'set-window-start windows))
(when (and erc-status-sidebar-highlight-active-buffer
(marker-buffer erc-status-sidebar--active-marker))
(goto-char erc-status-sidebar--active-marker)
@ -519,14 +532,28 @@ highlighted."
erc-kill-server-hook
erc-kick-hook
erc-disconnected-hook
erc-quit-hook))
erc-quit-hook)
"Hooks to refresh the sidebar on.
This may be set locally in the status-sidebar buffer under
various conditions, like when the option
`erc-status-sidebar-highlight-active-buffer' is non-nil.")
(defvar erc-status-sidebar--highlight-refresh-triggers
'(window-selection-change-functions)
"Triggers enabled with `erc-status-sidebar-highlight-active-buffer'.")
(defun erc-status-sidebar--refresh-unless-input ()
"Run `erc-status-sidebar-refresh' unless there are unread commands.
Also abstain when the user is interacting with the minibuffer."
(unless (or (input-pending-p) (minibuffer-window-active-p (selected-window)))
(erc-status-sidebar-refresh)))
(defun erc-status-sidebar--post-refresh (&rest _ignore)
"Schedule sidebar refresh for execution after command stack is cleared.
Ignore arguments in IGNORE, allowing this function to be added to
hooks that invoke it with arguments."
(run-at-time 0 nil #'erc-status-sidebar-refresh))
(run-at-time 0 nil #'erc-status-sidebar--refresh-unless-input))
(defun erc-status-sidebar-mode--unhook ()
"Remove hooks installed by `erc-status-sidebar-mode'."
@ -541,7 +568,7 @@ hooks that invoke it with arguments."
Note that preserve status needs to be reset when the window is
manually resized, so `erc-status-sidebar-mode' adds this function
to the `window-configuration-change-hook'."
(when (and (eq (selected-window) (let (erc-status-sidebar-singular)
(when (and (eq (selected-window) (let (erc-status-sidebar--singular-p)
(erc-status-sidebar-get-window)))
(fboundp 'window-preserve-size))
(unless (eq (window-total-width) (window-min-size nil t))
@ -563,6 +590,10 @@ to the `window-configuration-change-hook'."
(add-hook 'window-configuration-change-hook
#'erc-status-sidebar-set-window-preserve-size nil t)
(when erc-status-sidebar-highlight-active-buffer
(setq-local erc-status-sidebar-refresh-triggers
`(,@erc-status-sidebar--highlight-refresh-triggers
,@erc-status-sidebar-refresh-triggers)))
(dolist (hk erc-status-sidebar-refresh-triggers)
(add-hook hk #'erc-status-sidebar--post-refresh))

View file

@ -255,15 +255,14 @@ Only attributes that `tar-mode' can grok are mentioned.")
(decode-coding-string str coding)
str))
(defvar tar-attr-vector '[nil nil nil nil nil nil nil nil])
(defvar tar-attr-vector (make-vector 8 nil))
(defun tar-parse-pax-extended-header (pos)
"Parse a pax external header of a Posix-format tar file."
(let ((end (+ pos 512))
(result tar-attr-vector)
(coding 'utf-8-unix)
attr value record-len value-len)
(dotimes (i 8)
(aset result i nil))
(fillarray result nil)
(goto-char pos)
(while (and (< pos end)
(re-search-forward pax-extended-attribute-record-regexp

View file

@ -141,8 +141,10 @@ You can <\\`q'>uit; don't modify this file."))
;; modtime in that buffer, to cater to use case where the
;; file is about to be written to from some buffer that
;; doesn't visit any file, like a temporary buffer.
(with-current-buffer (get-file-buffer (file-truename filename))
(set-visited-file-modtime))
(let ((buf (get-file-buffer (file-truename filename))))
(when buf ; If we cannot find the visiting buffer, punt.
(with-current-buffer buf
(set-visited-file-modtime))))
'unchanged)))))
;;;###autoload

View file

@ -241,6 +241,46 @@
"<bob> " "<alice> " "<alice> " "<bob> " "<bob> " "<Dummy> " "<Dummy> ")
(erc-fill-tests--compare "merge-02-right")))))
(ert-deftest erc-fill-wrap--merge-action ()
:tags '(:unstable)
(unless (>= emacs-major-version 29)
(ert-skip "Emacs version too low, missing `buffer-text-pixel-size'"))
(erc-fill-tests--wrap-populate
(lambda ()
;; Set this here so that the first few messages are from 1970
(let ((erc-fill-tests--time-vals (lambda () 1680332400)))
(erc-fill-tests--insert-privmsg "bob" "zero.")
(erc-process-ctcp-query
erc-server-process
(make-erc-response
:unparsed ":bob!~u@fake PRIVMSG #chan :\1ACTION one\1"
:sender "bob!~u@fake" :command "PRIVMSG"
:command-args '("#chan" "\1ACTION one\1") :contents "\1ACTION one\1")
"bob" "~u" "fake")
(erc-fill-tests--insert-privmsg "bob" "two.")
;; Compat switch to opt out of overhanging speaker.
(let (erc-fill--wrap-action-dedent-p)
(erc-process-ctcp-query
erc-server-process
(make-erc-response
:unparsed ":bob!~u@fake PRIVMSG #chan :\1ACTION three\1"
:sender "bob!~u@fake" :command "PRIVMSG"
:command-args '("#chan" "\1ACTION three\1")
:contents "\1ACTION three\1")
"bob" "~u" "fake"))
(erc-fill-tests--insert-privmsg "bob" "four."))
(should (= erc-fill--wrap-value 27))
(erc-fill-tests--wrap-check-prefixes
"*** " "<alice> " "<bob> " "<bob> " "* bob " "<bob> " "* " "<bob> ")
(erc-fill-tests--compare "merge-wrap-01"))))
(ert-deftest erc-fill-line-spacing ()
:tags '(:unstable)
(unless (>= emacs-major-version 29)

View file

@ -0,0 +1 @@
#("\n\n\n[Thu Jan 1 1970]\n*** This server is in debug mode and is logging all user I/O. If you do not wish for everything you send to be readable by the server owner(s), please disconnect.[00:00]\n<alice> bob: come, you are a tedious fool: to the purpose. What was done to Elbow's wife, that he hath cause to complain of? Come me to what was done to her.\n<bob> alice: Either your unparagoned mistress is dead, or she's outprized by a trifle.\n\n[Sat Apr 1 2023]\n<bob> zero.[07:00]\n* bob one\n<bob> two.\n* bob three\n<bob> four.\n" 2 20 (erc-timestamp 0 line-prefix (space :width (- 27 (18))) field erc-timestamp) 20 21 (erc-timestamp 0 field erc-timestamp) 21 183 (erc-timestamp 0 wrap-prefix #2=(space :width 27) line-prefix #3=(space :width (- 27 (4)))) 183 190 (erc-timestamp 0 field erc-timestamp wrap-prefix #2# line-prefix #3# display #1=(#7=(margin right-margin) #("[00:00]" 0 7 (display #1# invisible timestamp font-lock-face erc-timestamp-face)))) 191 192 (erc-timestamp 0 wrap-prefix #2# line-prefix #4=(space :width (- 27 (8))) erc-command PRIVMSG) 192 197 (erc-timestamp 0 wrap-prefix #2# line-prefix #4# erc-command PRIVMSG) 197 199 (erc-timestamp 0 wrap-prefix #2# line-prefix #4# erc-command PRIVMSG) 199 202 (erc-timestamp 0 wrap-prefix #2# line-prefix #4# erc-command PRIVMSG) 202 315 (erc-timestamp 0 wrap-prefix #2# line-prefix #4# erc-command PRIVMSG) 315 316 (erc-timestamp 0 erc-command PRIVMSG) 316 348 (erc-timestamp 0 wrap-prefix #2# line-prefix #4# erc-command PRIVMSG) 349 350 (erc-timestamp 0 wrap-prefix #2# line-prefix #5=(space :width (- 27 (6))) erc-command PRIVMSG) 350 353 (erc-timestamp 0 wrap-prefix #2# line-prefix #5# erc-command PRIVMSG) 353 355 (erc-timestamp 0 wrap-prefix #2# line-prefix #5# erc-command PRIVMSG) 355 360 (erc-timestamp 0 wrap-prefix #2# line-prefix #5# erc-command PRIVMSG) 360 435 (erc-timestamp 0 wrap-prefix #2# line-prefix #5# erc-command PRIVMSG) 436 454 (erc-timestamp 1680332400 line-prefix (space :width (- 27 (18))) field erc-timestamp) 454 455 (erc-timestamp 1680332400 field erc-timestamp) 455 456 (erc-timestamp 1680332400 wrap-prefix #2# line-prefix #6=(space :width (- 27 (6))) erc-command PRIVMSG) 456 459 (erc-timestamp 1680332400 wrap-prefix #2# line-prefix #6# erc-command PRIVMSG) 459 466 (erc-timestamp 1680332400 wrap-prefix #2# line-prefix #6# erc-command PRIVMSG) 466 473 (erc-timestamp 1680332400 field erc-timestamp wrap-prefix #2# line-prefix #6# display #8=(#7# #("[07:00]" 0 7 (display #8# invisible timestamp font-lock-face erc-timestamp-face)))) 474 476 (erc-timestamp 1680332400 wrap-prefix #2# line-prefix #9=(space :width (- 27 (6))) erc-ctcp ACTION erc-command PRIVMSG) 476 479 (erc-timestamp 1680332400 wrap-prefix #2# line-prefix #9# erc-ctcp ACTION erc-command PRIVMSG) 479 483 (erc-timestamp 1680332400 wrap-prefix #2# line-prefix #9# erc-ctcp ACTION erc-command PRIVMSG) 484 485 (erc-timestamp 1680332400 wrap-prefix #2# line-prefix #10=(space :width (- 27 (6))) erc-command PRIVMSG) 485 488 (erc-timestamp 1680332400 wrap-prefix #2# line-prefix #10# erc-command PRIVMSG) 488 494 (erc-timestamp 1680332400 wrap-prefix #2# line-prefix #10# erc-command PRIVMSG) 495 497 (erc-timestamp 1680332400 wrap-prefix #2# line-prefix #11=(space :width (- 27 (2))) erc-ctcp ACTION erc-command PRIVMSG) 497 500 (erc-timestamp 1680332400 wrap-prefix #2# line-prefix #11# erc-ctcp ACTION erc-command PRIVMSG) 500 506 (erc-timestamp 1680332400 wrap-prefix #2# line-prefix #11# erc-ctcp ACTION erc-command PRIVMSG) 507 508 (erc-timestamp 1680332400 wrap-prefix #2# line-prefix #12=(space :width (- 27 (6))) erc-command PRIVMSG) 508 511 (erc-timestamp 1680332400 wrap-prefix #2# line-prefix #12# erc-command PRIVMSG) 511 518 (erc-timestamp 1680332400 wrap-prefix #2# line-prefix #12# erc-command PRIVMSG))

View file

@ -57,20 +57,23 @@
"jpg")))))
(ert-deftest image-dired-thumb-name/per-directory ()
(let ((image-dired-thumbnail-storage 'per-directory))
(should (file-name-absolute-p (image-dired-thumb-name "foo.jpg")))
(should (file-name-absolute-p (image-dired-thumb-name "/tmp/foo.jpg")))
(let ((image-dired-thumbnail-storage 'per-directory)
(rel-path "foo.jpg")
(abs-path "/tmp/foo.jpg")
(hash-name (concat (sha1 "foo.jpg") ".jpg")))
(should (file-name-absolute-p (image-dired-thumb-name rel-path)))
(should (file-name-absolute-p (image-dired-thumb-name abs-path)))
(should (equal
(file-name-nondirectory (image-dired-thumb-name "foo.jpg"))
(file-name-nondirectory (image-dired-thumb-name "/tmp/foo.jpg"))))
(file-name-nondirectory (image-dired-thumb-name rel-path))
(file-name-nondirectory (image-dired-thumb-name abs-path))))
;; The cdr below avoids the system dependency in the car of the
;; list returned by 'file-name-split': it's "" on Posix systems,
;; but the drive letter on MS-Windows.
(should (equal (cdr (file-name-split
(image-dired-thumb-name "/tmp/foo.jpg")))
'("tmp" ".image-dired" "foo.jpg.thumb.jpg")))
(image-dired-thumb-name abs-path)))
(list "tmp" ".image-dired" hash-name)))
(should (equal (file-name-nondirectory
(image-dired-thumb-name "foo.jpg"))
"foo.jpg.thumb.jpg"))))
(image-dired-thumb-name rel-path))
hash-name))))
;;; image-dired-util-tests.el ends here

View file

@ -22,6 +22,7 @@
;;; Code:
(require 'ert)
(require 'ert-x)
(ert-deftest uniquify-basic ()
(let (bufs old-names)
@ -58,35 +59,35 @@
(ert-deftest uniquify-dirs ()
"Check strip-common-suffix and trailing-separator-p work together; bug#47132"
(let* ((root (make-temp-file "emacs-uniquify-tests" 'dir))
(a-path (file-name-concat root "a/x/y/dir"))
(b-path (file-name-concat root "b/x/y/dir")))
(make-directory a-path 'parents)
(make-directory b-path 'parents)
(let ((uniquify-buffer-name-style 'forward)
(uniquify-strip-common-suffix t)
(uniquify-trailing-separator-p nil))
(let ((bufs (list (find-file-noselect a-path)
(find-file-noselect b-path))))
(should (equal (mapcar #'buffer-name bufs)
'("a/dir" "b/dir")))
(mapc #'kill-buffer bufs)))
(let ((uniquify-buffer-name-style 'forward)
(uniquify-strip-common-suffix nil)
(uniquify-trailing-separator-p t))
(let ((bufs (list (find-file-noselect a-path)
(find-file-noselect b-path))))
(should (equal (mapcar #'buffer-name bufs)
'("a/x/y/dir/" "b/x/y/dir/")))
(mapc #'kill-buffer bufs)))
(let ((uniquify-buffer-name-style 'forward)
(uniquify-strip-common-suffix t)
(uniquify-trailing-separator-p t))
(let ((bufs (list (find-file-noselect a-path)
(find-file-noselect b-path))))
(should (equal (mapcar #'buffer-name bufs)
'("a/dir/" "b/dir/")))
(mapc #'kill-buffer bufs)))))
(ert-with-temp-directory root
(let ((a-path (file-name-concat root "a/x/y/dir"))
(b-path (file-name-concat root "b/x/y/dir")))
(make-directory a-path 'parents)
(make-directory b-path 'parents)
(let ((uniquify-buffer-name-style 'forward)
(uniquify-strip-common-suffix t)
(uniquify-trailing-separator-p nil))
(let ((bufs (list (find-file-noselect a-path)
(find-file-noselect b-path))))
(should (equal (mapcar #'buffer-name bufs)
'("a/dir" "b/dir")))
(mapc #'kill-buffer bufs)))
(let ((uniquify-buffer-name-style 'forward)
(uniquify-strip-common-suffix nil)
(uniquify-trailing-separator-p t))
(let ((bufs (list (find-file-noselect a-path)
(find-file-noselect b-path))))
(should (equal (mapcar #'buffer-name bufs)
'("a/x/y/dir/" "b/x/y/dir/")))
(mapc #'kill-buffer bufs)))
(let ((uniquify-buffer-name-style 'forward)
(uniquify-strip-common-suffix t)
(uniquify-trailing-separator-p t))
(let ((bufs (list (find-file-noselect a-path)
(find-file-noselect b-path))))
(should (equal (mapcar #'buffer-name bufs)
'("a/dir/" "b/dir/")))
(mapc #'kill-buffer bufs))))))
(ert-deftest uniquify-home ()
"uniquify works, albeit confusingly, in the presence of directories named \"~\""
@ -147,16 +148,18 @@ uniquify-trailing-separator-p is ignored"
(project-vc-name "foo1/bar")
bufs)
(save-excursion
(should (file-exists-p "../README"))
(push (find-file-noselect "../README") bufs)
(push (find-file-noselect "other/README") bufs)
(should (equal (mapcar #'buffer-name bufs)
'("README<other>" "README<bar>")))
(push (find-file-noselect "foo2/bar/README") bufs)
(should (equal (mapcar #'buffer-name bufs)
'("README<foo2/bar>" "README<other>" "README<foo1/bar>")))
(while bufs
(kill-buffer (pop bufs))))))
(let ((default-directory (expand-file-name "test/" source-directory)))
(should (file-exists-p "../README"))
(push (find-file-noselect "../README") bufs)
(push (find-file-noselect "other/README") bufs)
(should (equal (mapcar #'buffer-name bufs)
'("README<other>" "README<bar>")))
(push (find-file-noselect "foo2/bar/README") bufs)
(should (equal (mapcar #'buffer-name bufs)
'("README<foo2/bar>" "README<other>"
"README<foo1/bar>")))
(while bufs
(kill-buffer (pop bufs)))))))
(provide 'uniquify-tests)
;;; uniquify-tests.el ends here

View file

@ -38,8 +38,12 @@ Create a test directory and a buffer whose `buffer-file-name' and
Finally, delete the buffer and the test directory."
(declare (debug (body)))
`(ert-with-temp-directory temp-dir
(let ((name (concat (file-name-as-directory temp-dir)
"userfile"))
(let ((name
;; Use file-truename for when 'temporary-file-directory'
;; is a symlink, to make sure 'buffer-file-name' is set
;; below to a real existing file.
(file-truename (concat (file-name-as-directory temp-dir)
"userfile")))
(create-lockfiles t))
(with-temp-buffer
(setq buffer-file-name name
@ -184,7 +188,8 @@ the case)."
;; Just changing the file modification on disk doesn't hurt,
;; because file contents in buffer and on disk look equal.
(shell-command (format "touch %s" (buffer-file-name)))
(shell-command (format "touch %s"
(shell-quote-argument (buffer-file-name))))
(insert "bar")
(when cl (filelock-tests--should-be-locked))
@ -198,7 +203,8 @@ the case)."
;; Changing the file contents on disk hurts when buffer is
;; modified. There shall be a query, which we answer.
;; *Messages* buffer is checked for prompt.
(shell-command (format "echo bar >>%s" (buffer-file-name)))
(shell-command (format "echo bar >>%s"
(shell-quote-argument (buffer-file-name))))
(cl-letf (((symbol-function 'read-char-choice)
(lambda (prompt &rest _) (message "%s" prompt) ?y)))
(ert-with-message-capture captured-messages