GNU bug report logs -
#17558
24.4.50; global-subword-mode breaks ERC
Previous Next
Reported by: Dima Kogan <dima <at> secretsauce.net>
Date: Fri, 23 May 2014 09:20:02 UTC
Severity: normal
Tags: fixed
Merged with 20347
Found in versions 24.4.50, 25.0.50
Fixed in version 25.1
Done: Lars Ingebrigtsen <larsi <at> gnus.org>
Bug is archived. No further changes may be made.
Full log
View this message in rfc822 format
[Message part 1 (text/plain, inline)]
Lars Magne Ingebrigtsen <larsi <at> gnus.org> writes:
>> The attached patch thus has no changes to this hunk. Let me know if you
>> think of a nicer way to do this.
>
> This still seems very difficult to understand. The old version has a
> clear loop condition
>
>> - (while (forward-word 1)
>
> while in the new version everything is inside a progn, making it kinda
> difficult to follow.
Aaah, I see the complaint now. New patch attached.
[0001-ERC-no-longer-gets-confused-by-subword-mode.patch (text/x-diff, inline)]
From ba2f53e864cc36a3a9296104975407274b59b601 Mon Sep 17 00:00:00 2001
From: Dima Kogan <dima <at> secretsauce.net>
Date: Tue, 30 Dec 2014 23:29:21 -0800
Subject: [PATCH] ERC no longer gets confused by subword-mode
In commit 6ddc44225e743e2b2a0d5c192f50aefd7a4a915b subword-mode was
integrated into the syntax table instead of simply remapping the
interactive motion bindings as was done previously. This had the
unintended effect of changing the behavior of lisp programs that touch
words. In the case of ERC, it completely broke it: emacs now throws an
error when ERC is launched, making it unusable when subword-mode is
active.
This commit replaces the word-oriented calls with ones that navigate
the buffer using syntax classes
Closes: #17558
---
lisp/erc/erc-backend.el | 28 +++++++++++++++++++++++++++-
lisp/erc/erc-button.el | 16 ++++++++--------
2 files changed, 35 insertions(+), 9 deletions(-)
diff --git a/lisp/erc/erc-backend.el b/lisp/erc/erc-backend.el
index ec45dcf..4925c96 100644
--- a/lisp/erc/erc-backend.el
+++ b/lisp/erc/erc-backend.el
@@ -474,13 +474,39 @@ Currently this is called by `erc-send-input'."
nil t))
(split-string (buffer-string) "\n"))))
+(defun erc-forward-word ()
+ "Moves forward one word, ignoring any subword settings. If no
+subword-mode is active, then this is (forward-word)."
+ (skip-syntax-forward "^w")
+ (> (skip-syntax-forward "w") 0))
+
+(defun erc-word-at-arg-p (pos)
+ "Reports whether the char after a given POS has word syntax.
+If POS is out of range, the value is nil."
+ (let ((c (char-after pos)))
+ (if c
+ (eq ?w (char-syntax c))
+ nil)))
+
+(defun erc-bounds-of-word-at-point ()
+ "Returns the bounds of a word at point, or nil if we're not at
+a word. If no subword-mode is active, then this
+is (bounds-of-thing-at-point 'word)."
+ (if (or (erc-word-at-arg-p (point))
+ (erc-word-at-arg-p (1- (point))))
+ (save-excursion
+ (let* ((start (progn (skip-syntax-backward "w") (point)))
+ (end (progn (skip-syntax-forward "w") (point))))
+ (cons start end)))
+ nil))
+
;; Used by CTCP functions
(defun erc-upcase-first-word (str)
"Upcase the first word in STR."
(with-temp-buffer
(insert str)
(goto-char (point-min))
- (upcase-word 1)
+ (upcase-region (point) (progn (erc-forward-word) (point)))
(buffer-string)))
(defun erc-server-setup-periodical-ping (buffer)
diff --git a/lisp/erc/erc-button.el b/lisp/erc/erc-button.el
index 0e4c709..a59ad22 100644
--- a/lisp/erc/erc-button.el
+++ b/lisp/erc/erc-button.el
@@ -300,14 +300,14 @@ specified by `erc-button-alist'."
(when (or (eq t form)
(eval form))
(goto-char (point-min))
- (while (forward-word 1)
- (setq bounds (bounds-of-thing-at-point 'word))
- (setq word (buffer-substring-no-properties
- (car bounds) (cdr bounds)))
- (when (or (and (erc-server-buffer-p) (erc-get-server-user word))
- (and erc-channel-users (erc-get-channel-user word)))
- (erc-button-add-button (car bounds) (cdr bounds)
- fun t (list word)))))))
+ (while (erc-forward-word)
+ (when (setq bounds (erc-bounds-of-word-at-point))
+ (setq word (buffer-substring-no-properties
+ (car bounds) (cdr bounds)))
+ (when (or (and (erc-server-buffer-p) (erc-get-server-user word))
+ (and erc-channel-users (erc-get-channel-user word)))
+ (erc-button-add-button (car bounds) (cdr bounds)
+ fun t (list word))))))))
(defun erc-button-add-buttons-1 (regexp entry)
"Search through the buffer for matches to ENTRY and add buttons."
--
2.1.4
This bug report was last modified 9 years and 161 days ago.
Previous Next
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.