Discussion:
[Emacs23.3] Subword und das ß (sz)
(zu alt für eine Antwort)
Michael Jahn
2011-11-17 20:09:40 UTC
Permalink
Hi,

wenn ich mit subword-forward durch Texte navigiere bleibt der Cursor
beim ß stehen, subword-backward hingegen nicht und auch forward-word
und backward-word machen es wie erwartet und "übersehen" das ß.

Bsp. subword-forward:
| Größer
|^ ^ ^
Bsp. subword-backward:
| Größer
| ^ ^
(^ = Cursorposition)

decribe-char beschreibt ß aber als 'word'.

Tritt auch mit 'emacs -Q' auf.

Jemand ne idee? :-)

Micha
Memnon Anon
2011-11-17 22:50:51 UTC
Permalink
Post by Michael Jahn
| Größer
|^ ^ ^
| Größer
| ^ ^
(^ = Cursorposition)
decribe-char beschreibt ß aber als 'word'.
Tritt auch mit 'emacs -Q' auf.
Jemand ne idee? :-)
Spannend.

Alsoooo...

Wenn ich das richtig sehe, ist der problematische Teil diese Regexp
suche in subword-forward-internal:

(re-search-forward
(concat "\\W*\\(\\([[:upper:]]*\\W?\\)[[:lower:][:digit:]]*\\)")
nil t)))

, genauer gesagt: [[:lower:][:digit:]]*, was, wie man mit
C-M-s gut sieht, alle Kleinbuchstaben und Zahlen matcht.

Tjahaaa, aber nicht das besagte ß...

Mit einem 'M-x describe-buffer-case-table' sieht man dann, dasz
der Buchstabe wie folgt gewertet wird:

ß case-invariant

"i" z.B. hingegen als:

i lowercase, matches I

Die Frage ist nun:

- Kann man das ß als case-invariant *und* lowercase eintragen?
- Falls nicht, kann man ß als lowercase ohne "matches" Teil eintragen?

Dann sollte die Regexpsuche wie gewuenscht verlaufen ...

Falls das kein Guru aus dem Stehgreif beantworten kann, werde ich mich
auf die weitere Suche begeben; nu ist erstmal genug gesucht fuer
heute ;).

Memnon
Memnon Anon
2011-11-17 23:18:11 UTC
Permalink
Post by Memnon Anon
Dann sollte die Regexpsuche wie gewuenscht verlaufen ...
Schneller Test:

--8<---------------cut here---------------start------------->8---
(defun subword-forward-internal ()
(if (and
(save-excursion
(let ((case-fold-search nil))
(re-search-forward
(concat "\\W*\\(\\([[:upper:]]*\\W?\\)[[:lower:]ß[:digit:]]*\\)")
nil t))) ;; ^
(> (match-end 0) (point)))
(goto-char
(cond
((< 1 (- (match-end 2) (match-beginning 2)))
(1- (match-end 2)))
(t
(match-end 0))))
(forward-word 1)))
--8<---------------cut here---------------end--------------->8---

... und es scheint zu funktionieren wie es soll.

Ist aber natuerlich keine Loesung des zugrunde liegenden Uebels.

Memnon
Andreas Röhler
2011-11-18 08:46:58 UTC
Permalink
Post by Memnon Anon
Post by Memnon Anon
Dann sollte die Regexpsuche wie gewuenscht verlaufen ...
--8<---------------cut here---------------start------------->8---
(defun subword-forward-internal ()
(if (and
(save-excursion
(let ((case-fold-search nil))
(re-search-forward
(concat "\\W*\\(\\([[:upper:]]*\\W?\\)[[:lower:]ß[:digit:]]*\\)")
äöü müssten dann auch noch rein
Post by Memnon Anon
nil t))) ;; ^
(> (match-end 0) (point)))
(goto-char
(cond
((< 1 (- (match-end 2) (match-beginning 2)))
(1- (match-end 2)))
(t
(match-end 0))))
(forward-word 1)))
--8<---------------cut here---------------end--------------->8---
... und es scheint zu funktionieren wie es soll.
Ist aber natuerlich keine Loesung des zugrunde liegenden Uebels.
Memnon
Memnon Anon
2011-11-18 18:42:32 UTC
Permalink
Post by Andreas Röhler
Post by Memnon Anon
(concat "\\W*\\(\\([[:upper:]]*\\W?\\)[[:lower:]ß[:digit:]]*\\)")
äöü müssten dann auch noch rein
Warum?
Umlaute machen hier, soweit ich sehe, im Gegensatz zum ß kein Problem.

Memnon
Andreas Röhler
2011-11-19 09:06:55 UTC
Permalink
Post by Memnon Anon
Post by Andreas Röhler
Post by Memnon Anon
(concat "\\W*\\(\\([[:upper:]]*\\W?\\)[[:lower:]ß[:digit:]]*\\)")
äöü müssten dann auch noch rein
Warum?
Umlaute machen hier, soweit ich sehe, im Gegensatz zum ß kein Problem.
Memnon
ah ja, ist keine Frage der Syntax sondern der Gross-Klein-Buchstaben
Zuordnung.

Gibt's hierzu einen Fehlerbericht?

Andreas
Memnon Anon
2011-11-19 19:09:57 UTC
Permalink
Post by Andreas Röhler
ah ja, ist keine Frage der Syntax sondern der Gross-Klein-Buchstaben
Zuordnung.
Genau, scheint mir auch so zu sein.

ß ist ja auch kein einfacher Fall.
Laut Wikipedia wurde das upper case ß zwar 2008 in Unicode aufgenommen,
aber es sollte anscheinend (noch) offiziell nicht verwendet werden:
upper case ß sollte mit SS ersetzt werden. ... Natürlich ist nicht
jedes SS hingegen ein ß.

Blöd.

Wer trotzdem das upper case ß verwenden möchte, scheint damit
gravierende Performance-Einbußen in Kauf nehmen zu müssen.

cf.
http://lists.gnu.org/archive/html/emacs-devel/2009-11/msg00460.html
ff.

Nocheinmal: Blöd.
Post by Andreas Röhler
Gibt's hierzu einen Fehlerbericht?
Hab noch nicht gesucht.
Wenn Du was findest, wäre ein Link nett ;).

Memnon
--
Nein, bin kein Experte. Halbwahrheiten und Fehler sind gut möglich
oder gar wahrscheinlich. Verbesserungen willkommen ;)
Memnon Anon
2011-11-19 21:10:41 UTC
Permalink
Post by Andreas Röhler
Gibt's hierzu einen Fehlerbericht?
Habe

http://debbugs.gnu.org/cgi/pkgreport.cgi?archive=both;include=subject%3Acase;package=emacs

ueberflogen.
Sehe ersteinmal nichts, was vielversprechend waere.

Habe ersteinmal auf emacs.help angefragt, wie andere das loesen.

Memnon
Andreas Röhler
2011-11-20 18:45:23 UTC
Permalink
Post by Memnon Anon
Post by Andreas Röhler
Gibt's hierzu einen Fehlerbericht?
Habe
http://debbugs.gnu.org/cgi/pkgreport.cgi?archive=both;include=subject%3Acase;package=emacs
ueberflogen.
Sehe ersteinmal nichts, was vielversprechend waere.
Habe ersteinmal auf emacs.help angefragt, wie andere das loesen.
Gesehen. Danke auch für den Hinweis zur Diskussion auf emacs-devel
Post by Memnon Anon
Memnon
Michael Jahn
2011-11-18 13:22:07 UTC
Permalink
Post by Memnon Anon
- Kann man das ß als case-invariant *und* lowercase eintragen?
- Falls nicht, kann man ß als lowercase ohne "matches" Teil eintragen?
Nunja, es gibt ja auch ein großes Sz. ;-)
| ẞ (großes ß - U+1E9E)

Insofern würde ich beide sz, als elegante Variante, auch mit
lowercase/uppercase und matches versehen wollen.

Nur wie macht man das denn?

Micha
Michael Jahn
2011-11-18 15:34:25 UTC
Permalink
Post by Michael Jahn
Insofern würde ich beide sz, als elegante Variante, auch mit
lowercase/uppercase und matches versehen wollen.
Nur wie macht man das denn?
#v+
(let ((tbl (standard-case-table)))
(set-case-syntax-pair ?ẞ ?ß tbl))
#v-
Loading...