Hi I thought I had used the following successfully some time ago (define-abbrev-table 'fundamental-mode-abbrev-table '( ("a que" "a qué" nil :count 0) ("asi" "así" nil :count 1) ("ciertas problemas" "ciertos problemas" nil :count 0) ("di nos" "dinos" nil :count 0) ("lamentamos de" "lamentamos comunicarte" nil :count 0) ("likke" "bike" nil :count 0) ("los siguientes circunstancias" "las siguientes circunstancias" nil :count 0) ("no se" "no sé" nil :count 0) ("portail" "portátil" nil :count 0) ("premierment" "premièrement" nil :count 0) ("thiss" "this" nil :count 0) ("varias ordenadores" "varios ordenadores" nil :count 0) )) I open an empty file in fundamental mode turn abbrev mode on And type asi --> así So the expansion works However "a que" is NOT expanded to "a qué" As indicated in the table. I am pretty sure that worked some time ago. I filed even a bug report but now I am starting to doubt my own memory. Could someone with a better memory than mine, help and tell me whether I am wrong or correct? Thanks Uwe Brauer
> From: Uwe Brauer <oub@mat.ucm.es>
> Date: Thu, 07 Jan 2021 21:10:54 +0100
>
> I open an empty file in fundamental mode turn abbrev mode on
>
> And type
>
> asi --> así So the expansion works
>
> However
>
> "a que" is NOT expanded to "a qué"
>
> As indicated in the table. I am pretty sure that worked some time ago.
I doubt it. From the Emacs manual:
An “abbrev” is a word that has been defined to “expand” into a specified
“expansion”. When you insert a word-separator character following the
abbrev, that expands the abbrev—replacing the abbrev with its expansion.
For example, if ‘foo’ is defined as an abbrev expanding to ‘find outer
otter’, then typing ‘f o o .’ will insert ‘find outer otter.’.
This mean a word-separator character cannot be part of an abbrev.
[-- Attachment #1: Type: text/plain, Size: 1140 bytes --] >>> "EZ" == Eli Zaretskii <eliz@gnu.org> writes: >> From: Uwe Brauer <oub@mat.ucm.es> >> Date: Thu, 07 Jan 2021 21:10:54 +0100 >> >> I open an empty file in fundamental mode turn abbrev mode on >> >> And type >> >> asi --> así So the expansion works >> >> However >> >> "a que" is NOT expanded to "a qué" >> >> As indicated in the table. I am pretty sure that worked some time ago. > I doubt it. From the Emacs manual: > An “abbrev” is a word that has been defined to “expand” into a specified > “expansion”. When you insert a word-separator character following the > abbrev, that expands the abbrev—replacing the abbrev with its expansion. > For example, if ‘foo’ is defined as an abbrev expanding to ‘find outer > otter’, then typing ‘f o o .’ will insert ‘find outer otter.’. > This mean a word-separator character cannot be part of an abbrev. Yeah makes sense, but is there or was some package that would allow to replace several strings by several other strings, in my case "a que" a "a qué" I thought I had used that functionality, hm [-- Attachment #2: smime.p7s --] [-- Type: application/pkcs7-signature, Size: 5673 bytes --]
> An “abbrev” is a word that has been defined to “expand” into a specified
> “expansion”. When you insert a word-separator character following the
> abbrev, that expands the abbrev—replacing the abbrev with its expansion.
> For example, if ‘foo’ is defined as an abbrev expanding to ‘find outer
> otter’, then typing ‘f o o .’ will insert ‘find outer otter.’.
>
> This mean a word-separator character cannot be part of an abbrev.
That's true for the default behavior.
Since Emacs-24, abbrev tables do support abbrevs whose name includes
non-word characters, but it requires extra work on the part of the user
in order to characterize the possible names via the `:regexp` property
(see `C-h o define-abbrev-table`).
Stefan
> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Cc: Uwe Brauer <oub@mat.ucm.es>, emacs-devel@gnu.org
> Date: Thu, 07 Jan 2021 15:36:52 -0500
>
> > An “abbrev” is a word that has been defined to “expand” into a specified
> > “expansion”. When you insert a word-separator character following the
> > abbrev, that expands the abbrev—replacing the abbrev with its expansion.
> > For example, if ‘foo’ is defined as an abbrev expanding to ‘find outer
> > otter’, then typing ‘f o o .’ will insert ‘find outer otter.’.
> >
> > This mean a word-separator character cannot be part of an abbrev.
>
> That's true for the default behavior.
> Since Emacs-24, abbrev tables do support abbrevs whose name includes
> non-word characters, but it requires extra work on the part of the user
> in order to characterize the possible names via the `:regexp` property
> (see `C-h o define-abbrev-table`).
Then I guess we did a poor job of documenting that extension.
[-- Attachment #1: Type: text/plain, Size: 1327 bytes --] >>> "SM" == Stefan Monnier <monnier@iro.umontreal.ca> writes: >> An “abbrev” is a word that has been defined to “expand” into a specified >> “expansion”. When you insert a word-separator character following the >> abbrev, that expands the abbrev—replacing the abbrev with its expansion. >> For example, if ‘foo’ is defined as an abbrev expanding to ‘find outer >> otter’, then typing ‘f o o .’ will insert ‘find outer otter.’. >> >> This mean a word-separator character cannot be part of an abbrev. > That's true for the default behavior. > Since Emacs-24, abbrev tables do support abbrevs whose name includes > non-word characters, but it requires extra work on the part of the user > in order to characterize the possible names via the `:regexp` property > (see `C-h o define-abbrev-table`). Thanks, I read the documentation but I am unable to figure out, what regexp has to be used for that regexp I should use in order to make a two word expansion work. All regexp I tried returned error. So this (define-abbrev-table 'fundamental-mode-abbrev-table '( ("a que" "a qué" :regexp 1 :count 0))) Does not return error but does not work as well. May I suggest to add an example in the documentation of `C-h o define-abbrev-table` Thanks [-- Attachment #2: smime.p7s --] [-- Type: application/pkcs7-signature, Size: 5673 bytes --]
Uwe Brauer <oub@mat.ucm.es> writes:
> Thanks, I read the documentation but I am unable to figure out, what
> regexp has to be used for that regexp I should use in order to make a
> two word expansion work.
>
> All regexp I tried returned error.
>
> So this
>
> (define-abbrev-table 'fundamental-mode-abbrev-table
> '(
> ("a que" "a qué" :regexp 1 :count 0)))
>
>
> Does not return error but does not work as well.
>
You've forgotten the 'hook' argument in the abbrev definition. Also,
:regexp is a property for the whole table, so you need something like
this:
(define-abbrev-table 'fundamental-mode-abbrev-table
'(
("a que" "a qué" nil :count 0))
"Uwe's table"
:regexp "\\(\\w+ ?\\w+\\)")
(I agree the documentation could be clearer)
Robert
[-- Attachment #1: Type: text/plain, Size: 1351 bytes --] >>> "RP" == Robert Pluim <rpluim@gmail.com> writes: > Uwe Brauer <oub@mat.ucm.es> writes: >> Thanks, I read the documentation but I am unable to figure out, what >> regexp has to be used for that regexp I should use in order to make a >> two word expansion work. >> >> All regexp I tried returned error. >> >> So this >> >> (define-abbrev-table 'fundamental-mode-abbrev-table >> '( >> ("a que" "a qué" :regexp 1 :count 0))) >> >> >> Does not return error but does not work as well. >> > You've forgotten the 'hook' argument in the abbrev definition. Also, > :regexp is a property for the whole table, so you need something like > this: > (define-abbrev-table 'fundamental-mode-abbrev-table > '( > ("a que" "a qué" nil :count 0)) > "Uwe's table" > :regexp "\\(\\w+ ?\\w+\\)") > (I agree the documentation could be clearer) Thanks but it did not work. I am using emacs (28) master commit "84ec57fe06e187f41a3546131d5dae3b185c3511" I overwrote my complete fundamental-mode-abbrev-table with your suggestion and restarted emacs (BTW edit-abbrev did not show the regexp) In any case a que was not expanded to a qué To make matter worse, I added your suggestion to my old fundamental-mode-abbrev-table restarted emacs and then *nothing* was expanded. I am puzzled Uwe [-- Attachment #2: smime.p7s --] [-- Type: application/pkcs7-signature, Size: 5673 bytes --]
> To make matter worse, I added your suggestion to my old
> fundamental-mode-abbrev-table restarted emacs and then *nothing* was
> expanded.
>
> I am puzzled
>
Hmm, so am I. Youʼre right, what I sent doesnʼt work, but this does:
(define-abbrev-table 'fundamental-mode-abbrev-table
'(
("a que" "a qué" nil :count 0))
"Uwe's table"
:regexp "\\(\\w+ \\w+\\)")
Robert
[-- Attachment #1: Type: text/plain, Size: 976 bytes --] >>> "RP" == Robert Pluim <rpluim@gmail.com> writes: >> To make matter worse, I added your suggestion to my old >> fundamental-mode-abbrev-table restarted emacs and then *nothing* was >> expanded. >> >> I am puzzled >> > Hmm, so am I. Youʼre right, what I sent doesnʼt work, but this does: > (define-abbrev-table 'fundamental-mode-abbrev-table > '( > ("a que" "a qué" nil :count 0)) > "Uwe's table" > :regexp "\\(\\w+ \\w+\\)") Right, thanks, however good and bad news. I am using (define-abbrev-table 'fundamental-mode-abbrev-table '( ("a que" "a qué" nil :count 0) ("asi" "así" nil :count 0)) "Uwe's table" :regexp "\\(\\w+ \\w+\\)") 1. It works in the sense that "a que" is expanded to "a qué" 2. But now asi is *not* expanded to así The reasons seems to me that what you did is globally for the whole table, while I hoped it could be done locally for each entry. Am I correct? [-- Attachment #2: smime.p7s --] [-- Type: application/pkcs7-signature, Size: 5673 bytes --]
Uwe Brauer <oub@mat.ucm.es> writes:
> Right, thanks, however good and bad news.
>
>
> I am using
>
> (define-abbrev-table 'fundamental-mode-abbrev-table
> '(
> ("a que" "a qué" nil :count 0)
> ("asi" "así" nil :count 0))
> "Uwe's table"
> :regexp "\\(\\w+ \\w+\\)")
>
>
> 1. It works in the sense that "a que" is expanded to "a qué"
>
> 2. But now asi is *not* expanded to así
>
> The reasons seems to me that what you did is globally for the whole
> table, while I hoped it could be done locally for each entry.
>
Thatʼs not the way abbrev tables work: the regexp answers the question
"which characters before point do I use to lookup abbrevs in this
table?". That can't be both two words separated by a space and a
single word at the same time, ie using
"\\(\\w+ \\w+\\)\\|\\(w+\\)
will fail, since that will match the 'two word' version if thereʼs a
space on the line, so in order to get what you want you need two
abbrev tables:
(define-abbrev-table 'fundamental-mode-abbrev-table
'(
("asi" "así" nil :count 0)))
(define-abbrev-table 'my-abbrev-table
'(
("a que" "a qué" nil :count 0))
"Uwe's table"
:regexp "\\(\\w+ \\w+\\)")
(setq local-abbrev-table (list my-abbrev-table fundamental-mode-abbrev-table))
(thereʼs a ':parents' property you can set on an abbrev table to achieve
the same thing, in theory, but I donʼt know how that interacts with
':regexp')
Robert
[-- Attachment #1: Type: text/plain, Size: 2201 bytes --] >>> "RP" == Robert Pluim <rpluim@gmail.com> writes: > Uwe Brauer <oub@mat.ucm.es> writes: >> Right, thanks, however good and bad news. >> >> >> I am using >> >> (define-abbrev-table 'fundamental-mode-abbrev-table >> '( >> ("a que" "a qué" nil :count 0) >> ("asi" "así" nil :count 0)) >> "Uwe's table" >> :regexp "\\(\\w+ \\w+\\)") >> >> >> 1. It works in the sense that "a que" is expanded to "a qué" >> >> 2. But now asi is *not* expanded to así >> >> The reasons seems to me that what you did is globally for the whole >> table, while I hoped it could be done locally for each entry. >> > Thatʼs not the way abbrev tables work: the regexp answers the question > "which characters before point do I use to lookup abbrevs in this > table?". That can't be both two words separated by a space and a > single word at the same time, ie using > "\\(\\w+ \\w+\\)\\|\\(w+\\) This is indeed what I tried. > will fail, since that will match the 'two word' version if thereʼs a > space on the line, so in order to get what you want you need two > abbrev tables: > (define-abbrev-table 'fundamental-mode-abbrev-table > '( > ("asi" "así" nil :count 0))) > (define-abbrev-table 'my-abbrev-table > '( > ("a que" "a qué" nil :count 0)) > "Uwe's table" > :regexp "\\(\\w+ \\w+\\)") > (setq local-abbrev-table (list my-abbrev-table fundamental-mode-abbrev-table)) Thanks where is the setq line supposed to be? Most likely in the file in question which is in fundamental mode? Not in the .abbrev_devs file? I tried the former and it works! May thanks. I might need to edit my abbrev times from time to time but that is ok and it might be a hassle in mail modes, but better than nothing. > (thereʼs a ':parents' property you can set on an abbrev table to achieve > the same thing, in theory, but I donʼt know how that interacts with > ':regexp') Maybe some other developer has an idea? In any case, I think it would be very useful to add some of the stuff Robert told me to the documentation, which is a bit sparse, I'd say. Thanks and regards Uwe [-- Attachment #2: smime.p7s --] [-- Type: application/pkcs7-signature, Size: 5673 bytes --]
> table?". That can't be both two words separated by a space and a
> single word at the same time, ie using
>
> "\\(\\w+ \\w+\\)\\|\\(w+\\)
Note that these regexps will be matched via `re-search-backward` so
\\(w+\\) will typically only match a single character (it stops at the
*rightmost* match).
Another way to go about it is to construct the regexp from the set of
abbrevs using `regexp-opt`.
Stefan
[-- Attachment #1: Type: text/plain, Size: 772 bytes --] >>> "SM" == Stefan Monnier <monnier@iro.umontreal.ca> writes: >> table?". That can't be both two words separated by a space and a >> single word at the same time, ie using >> >> "\\(\\w+ \\w+\\)\\|\\(w+\\) > Note that these regexps will be matched via `re-search-backward` so > \\(w+\\) will typically only match a single character (it stops at the > *rightmost* match). > Another way to go about it is to construct the regexp from the set of > abbrevs using `regexp-opt`. Robert's solution works, the only downside is that I need and additional (setq local-abbrev-table (list my-abbrev-table fundamental-mode-abbrev-table)) In each buffer which is a bit cumbersome. Are you saying this could be avoided using regexp-opt? If so how? [-- Attachment #2: smime.p7s --] [-- Type: application/pkcs7-signature, Size: 5673 bytes --]
[[[ To any NSA and FBI agents reading my email: please consider ]]] [[[ whether defending the US Constitution against all enemies, ]]] [[[ foreign or domestic, requires you to follow Snowden's example. ]]] > This mean a word-separator character cannot be part of an abbrev. I am pretty sure that was always the case. -- Dr Richard Stallman Chief GNUisance of the GNU Project (https://gnu.org) Founder, Free Software Foundation (https://fsf.org) Internet Hall-of-Famer (https://internethalloffame.org)
[-- Attachment #1: Type: text/plain, Size: 6337 bytes --] >>> "RS" == Richard Stallman <rms@gnu.org> writes: > [[[ To any NSA and FBI agents reading my email: please consider ]]] > [[[ whether defending the US Constitution against all enemies, ]]] > [[[ foreign or domestic, requires you to follow Snowden's example. ]]] >> This mean a word-separator character cannot be part of an abbrev. > I am pretty sure that was always the case. Well in my .abbrev_defs files I have entries like ("en cambio" "a cambio" nil :count 34) Which seems to indicate that it worked at same stage. Maybe I used code similar of what Robert suggested but deleted it some time ago (documentation is important). I want to add a remark, concerning adding new abbrev. I have now a modification of my code (define-minor-mode castellano-minor-mode nil nil nil nil (setq local-abbrev-table (if castellano-minor-mode (list my-abbrev-table castellano-minor-mode-abbrev-table))) (message "Added the local `my-abbrev-table' to the `castellano-minor-abbrev-table'")) I used to define two words abbrev like this (defun ediff-define-abbrev () (interactive) (let ((name (get-register ?A))) (let ((expansion (get-register ?B))) (set-text-properties 0 (length name) nil name) (define-abbrev local-abbrev-table name (downcase expansion)))) (message "abbrev is added using register A and B.")) That however does not work any more instead gives an error of the form Any idea what to do, now? Debugger entered--Lisp error: (wrong-type-argument vectorp ([de\ usar 0 0 en\ la\ mayor\ brevedad\ posible de\ la\ entrega 0 en\ la\ siguiente\ manera los\ prácticas\ 0 hola\ salva a\ final 0 0 0 0 los\ funciones 0 0 0 0 0 0 hola\ gabriel a\ penas de\ comprometerme\ de\ darte 0 0 0 0 hola\ raúl posibilidad\ hacerlo 0 0 0 hola\ alicia 0 0 los\ siguientes\ cosas 0 0 0 los\ siguientes\ posibilidades les\ ruego\ aclararme en\ internet los\ manos 0 0 0 0 lamento\ que\ me\ has\ encontrado ...] [áfrica vacio votacion utlidad volutarios útlies vistemos vicino terero vacuana áfin vostros util vostotros vistido veronica varibilidad vienieras varidad traquilidad veniste tristesa verifca venieron victimas volvia traduccir volutaria vecorial virtualizar àrea viveis supervision trival tutoria zanhoria vivia vivian vivisite vuitre tradicion volutario varon zero volvere tuvé vistitado virnes ví vendria ...])) intern-soft("" ([de\ usar 0 0 en\ la\ mayor\ brevedad\ posible de\ la\ entrega 0 en\ la\ siguiente\ manera los\ prácticas\ 0 hola\ salva a\ final 0 0 0 0 los\ funciones 0 0 0 0 0 0 hola\ gabriel a\ penas de\ comprometerme\ de\ darte 0 0 0 0 hola\ raúl posibilidad\ hacerlo 0 0 0 hola\ alicia 0 0 los\ siguientes\ cosas 0 0 0 los\ siguientes\ posibilidades les\ ruego\ aclararme en\ internet los\ manos 0 0 0 0 lamento\ que\ me\ has\ encontrado ...] [áfrica vacio votacion utlidad volutarios útlies vistemos vicino terero vacuana áfin vostros util vostotros vistido veronica varibilidad vienieras varidad traquilidad veniste tristesa verifca venieron victimas volvia traduccir volutaria vecorial virtualizar àrea viveis supervision trival tutoria zanhoria vivia vivian vivisite vuitre tradicion volutario varon zero volvere tuvé vistitado virnes ví vendria ...])) obarray-get(([de\ usar 0 0 en\ la\ mayor\ brevedad\ posible de\ la\ entrega 0 en\ la\ siguiente\ manera los\ prácticas\ 0 hola\ salva a\ final 0 0 0 0 los\ funciones 0 0 0 0 0 0 hola\ gabriel a\ penas de\ comprometerme\ de\ darte 0 0 0 0 hola\ raúl posibilidad\ hacerlo 0 0 0 hola\ alicia 0 0 los\ siguientes\ cosas 0 0 0 los\ siguientes\ posibilidades les\ ruego\ aclararme en\ internet los\ manos 0 0 0 0 lamento\ que\ me\ has\ encontrado ...] [áfrica vacio votacion utlidad volutarios útlies vistemos vicino terero vacuana áfin vostros util vostotros vistido veronica varibilidad vienieras varidad traquilidad veniste tristesa verifca venieron victimas volvia traduccir volutaria vecorial virtualizar àrea viveis supervision trival tutoria zanhoria vivia vivian vivisite vuitre tradicion volutario varon zero volvere tuvé vistitado virnes ví vendria ...]) "") abbrev-table-get(([de\ usar 0 0 en\ la\ mayor\ brevedad\ posible de\ la\ entrega 0 en\ la\ siguiente\ manera los\ prácticas\ 0 hola\ salva a\ final 0 0 0 0 los\ funciones 0 0 0 0 0 0 hola\ gabriel a\ penas de\ comprometerme\ de\ darte 0 0 0 0 hola\ raúl posibilidad\ hacerlo 0 0 0 hola\ alicia 0 0 los\ siguientes\ cosas 0 0 0 los\ siguientes\ posibilidades les\ ruego\ aclararme en\ internet los\ manos 0 0 0 0 lamento\ que\ me\ has\ encontrado ...] [áfrica vacio votacion utlidad volutarios útlies vistemos vicino terero vacuana áfin vostros util vostotros vistido veronica varibilidad vienieras varidad traquilidad veniste tristesa verifca venieron victimas volvia traduccir volutaria vecorial virtualizar àrea viveis supervision trival tutoria zanhoria vivia vivian vivisite vuitre tradicion volutario varon zero volvere tuvé vistitado virnes ví vendria ...]) :abbrev-table-modiff) define-abbrev(([de\ usar 0 0 en\ la\ mayor\ brevedad\ posible de\ la\ entrega 0 en\ la\ siguiente\ manera los\ prácticas\ 0 hola\ salva a\ final 0 0 0 0 los\ funciones 0 0 0 0 0 0 hola\ gabriel a\ penas de\ comprometerme\ de\ darte 0 0 0 0 hola\ raúl posibilidad\ hacerlo 0 0 0 hola\ alicia 0 0 los\ siguientes\ cosas 0 0 0 los\ siguientes\ posibilidades les\ ruego\ aclararme en\ internet los\ manos 0 0 0 0 lamento\ que\ me\ has\ encontrado ...] [áfrica vacio votacion utlidad volutarios útlies vistemos vicino terero vacuana áfin vostros util vostotros vistido veronica varibilidad vienieras varidad traquilidad veniste tristesa verifca venieron victimas volvia traduccir volutaria vecorial virtualizar àrea viveis supervision trival tutoria zanhoria vivia vivian vivisite vuitre tradicion volutario varon zero volvere tuvé vistitado virnes ví vendria ...]) "cuando antes" "cuanto antes") ediff-define-abbrev() funcall-interactively(ediff-define-abbrev) call-interactively(ediff-define-abbrev nil nil) command-execute(ediff-define-abbrev) [-- Attachment #2: smime.p7s --] [-- Type: application/pkcs7-signature, Size: 5673 bytes --]
On Friday, 8 Jan 2021 at 22:06, Uwe Brauer wrote:
> Robert's solution works, the only downside is that I need and additional
>
> (setq local-abbrev-table (list my-abbrev-table fundamental-mode-abbrev-table))
>
> In each buffer which is a bit cumbersome.
If all of your files are in a directory (or collection of
subdirectories), you could use directory local variables maybe?
--
Eric S Fraga via Emacs 28.0.50 & org 9.4.4 on Debian bullseye/sid
[-- Attachment #1: Type: text/plain, Size: 521 bytes --] >>> "ESF" == Eric S Fraga <e.fraga@ucl.ac.uk> writes: > On Friday, 8 Jan 2021 at 22:06, Uwe Brauer wrote: >> Robert's solution works, the only downside is that I need and additional >> >> (setq local-abbrev-table (list my-abbrev-table fundamental-mode-abbrev-table)) >> >> In each buffer which is a bit cumbersome. > If all of your files are in a directory (or collection of > subdirectories), you could use directory local variables maybe? I found a way around this problem: I will use minor modes. [-- Attachment #2: smime.p7s --] [-- Type: application/pkcs7-signature, Size: 5673 bytes --]
[-- Attachment #1: Type: text/plain, Size: 1078 bytes --] > Uwe Brauer <oub@mat.ucm.es> writes: > Thatʼs not the way abbrev tables work: the regexp answers the question > "which characters before point do I use to lookup abbrevs in this > table?". That can't be both two words separated by a space and a > single word at the same time, ie using > "\\(\\w+ \\w+\\)\\|\\(w+\\) > will fail, since that will match the 'two word' version if thereʼs a > space on the line, so in order to get what you want you need two > abbrev tables: > (define-abbrev-table 'fundamental-mode-abbrev-table > '( > ("asi" "así" nil :count 0))) > (define-abbrev-table 'my-abbrev-table > '( > ("a que" "a qué" nil :count 0)) > "Uwe's table" > :regexp "\\(\\w+ \\w+\\)") Your code works, if I put it in by .abbrev_defs file and re-read the abbrev file. However when close emacs write-abbrev-file somehow destroys the table with the regexp. Is this a bug? This parts enters a minor mode > (setq local-abbrev-table (list my-abbrev-table fundamental-mode-abbrev-table)) [-- Attachment #2: smime.p7s --] [-- Type: application/pkcs7-signature, Size: 5673 bytes --]