13

My language, Guarani, uses G̃/g̃ to denote the nasalized velar approximant. I thought I'd be able to type it by combining a dead tilde with g, but this does not work. Why doesn't it, and how can I fix it?

My main suspicion is that this has to do with the fact that there is no separate Unicode character for g̃, just g with the combining tilde. I can type ỹ and ṽ just fine, but not j̃, r̃, m̃, which seems like good evidence that therein lies the problem.

So one way I could get around this would be to map a key to 0x1000303 (which is U+0303, or ◌̃ ), the combining tilde, instead of to dead_tilde. However, this creates several problems:

  • If I switch to using the combining tilde in all cases:
    • I end up typing e.g. n + ◌̃ in many cases where the single character ñ is expected, and they have different results. For example, I've noticed that certain websites won't display the same search results if I type one vs. the other (obviously that's on them, but I want a keyboard layout that works with the world as it exists now).
    • It's annoying that I have to backspace twice to delete characters with the combining tilde, which I can accept if it's only for the g̃, but it's a little much with every nasalized character.
  • If I add both, which is what I'm currently doing, this becomes really hard for usability, because:
    • I have to think in each case about which key to use, when my brain thinks of them as the same
    • The mechanics of typing the two are different, since dead_tilde is pressed before a character, whereas ◌̃ goes after. My poor little brain will never get used to that.

It seems like in the ideal scenario I'd have X notice that dead_tilde + g doesn't work and just process it as if I'm typing g + ◌̃, and enter the two characters for me together, as it does for ñ, ã, ẽ, ĩ, õ, ũ, ỹ, etc.

It's worth noting that it's not possible to get around this by adding the g̃ directly to my keyboard layout, as xkb doesn't seem to support mapping a key to a combined Unicode glyph (though see the answer to Custom xkb layout in which one key creates two unicode code points for a hacky workaround). If I could fix that, I suppose this would be much less of a problem.

I'm running Ubuntu 18.04, not sure what other background info would be helpful, but I assume this is a problem for anyone running X.

Edit 1: Editing Compose mappings doesn't work

Another thing I've tried, which also did not work, is editing the Compose mappings to add a composed g̃. I wrote an .XCompose file as follows:

include "%L"

<dead_tilde> <g> : "g̃" gtilde <dead_tilde> <G> : "G̃" Gtilde

But this also did not work, I assume for the same reason above: X expects a single character, and g̃ is technically two. Incidentally, I noticed a number of mappings shipped in my locale's default Compose file also don't work, presumably for the same reason. The following mappings for en_US.UTF-8, and perhaps many more, actually do nothing:

<dead_acute> <dead_tilde> <a>       : "ã́"   # LATIN SMALL LETTER A WITH TILDE AND ACUTE
<dead_grave> <dead_tilde> <a>       : "ã̀"   # LATIN SMALL LETTER A WITH TILDE AND GRAVE
<dead_acute> <dead_tilde> <A>       : "Ã́"   # LATIN CAPITAL LETTER A WITH TILDE AND ACUTE
<dead_grave> <dead_tilde> <A>       : "Ã̀"   # LATIN CAPITAL LETTER A WITH TILDE AND GRAVE
<dead_acute> <dead_tilde> <e>       : "ẽ́"   # LATIN SMALL LETTER E WITH TILDE AND ACUTE
<dead_grave> <dead_tilde> <e>       : "ẽ̀"   # LATIN SMALL LETTER E WITH TILDE AND GRAVE
<dead_acute> <dead_tilde> <E>       : "Ẽ́"   # LATIN CAPITAL LETTER E WITH TILDE AND ACUTE
<dead_grave> <dead_tilde> <E>       : "Ẽ̀"   # LATIN CAPITAL LETTER E WITH TILDE AND GRAVE
<dead_acute> <dead_tilde> <i>       : "ĩ́"   # LATIN SMALL LETTER I WITH TILDE AND ACUTE
<dead_grave> <dead_tilde> <i>       : "ĩ̀"   # LATIN SMALL LETTER I WITH TILDE AND GRAVE
<dead_acute> <dead_tilde> <I>       : "Ĩ́"   # LATIN CAPITAL LETTER I WITH TILDE AND ACUTE
<dead_grave> <dead_tilde> <I>       : "Ĩ̀"   # LATIN CAPITAL LETTER I WITH TILDE AND GRAVE
<dead_grave> <dead_tilde> <o>       : "õ̀"   # LATIN SMALL LETTER O WITH TILDE AND GRAVE
<dead_grave> <dead_tilde> <O>       : "Õ̀"   # LATIN CAPITAL LETTER O WITH TILDE AND GRAVE
<dead_grave> <dead_tilde> <u>       : "ũ̀"   # LATIN SMALL LETTER U WITH TILDE AND GRAVE
<dead_grave> <dead_tilde> <U>       : "Ũ̀"   # LATIN CAPITAL LETTER U WITH TILDE AND GRAVE
<dead_grave> <m>                    : "m̀"   # LATIN SMALL LETTER M WITH GRAVE
<dead_grave> <M>                    : "M̀"   # LATIN CAPITAL LETTER M WITH GRAVE

As a matter of opinion, I do not think this is what we should fix: adding an extra line to Compose files for every possible diacritic just seems wasteful, and is not taking advantage of the simplicity of the nice combining diacritics Unicode wants us to use.

An interesting thing I noticed before I removed this .XCompose is that launching GTK programs from the terminal would result in the following errors:

(gedit:7229): Gtk-WARNING **: 23:03:04.848: GTK+ supports to output one char only: "g̃" gtilde: <dead_tilde> <g> : "g̃" gtilde

So presumably this is a GTK issue? I'll continue trying to track it down, but would appreciate any help.

Edit 2: Relevant GTK issue

It seems like my solution would be to fix this: https://gitlab.gnome.org/GNOME/gtk/-/issues/186

mmaluff
  • 181
  • 13
  • Seems this would help: https://unix.stackexchange.com/q/43073 – Netch Jul 22 '20 at 06:06
  • 2
    I saw that (it's linked in my question), I'm looking for a more stable solution that I can share with others too though. The language is spoken by at least 7 million people, after all. – mmaluff Jul 22 '20 at 07:10
  • 2
    Note that in an ISO 9995-3 conformant keyboard layout U+0303 is Group 2 Latch followed by D12. – JdeBP Jul 22 '20 at 08:53
  • Can you type it when the Num Lock is off? – Miloš Pavlović Jul 22 '20 at 10:06
  • 1
    @mmaluff Sorry, missed their identity. But if XKB doesn't allow sending multiple characters per single key without xmodmap or xcompose, you unlikely will have a solution without them... – Netch Jul 22 '20 at 13:36
  • @MilošPavlović Num Lock doesn't seem to make any difference – mmaluff Jul 22 '20 at 17:26
  • 1
    @JdeBP That's interesting, thanks. Just from reading the wikipedia, it seems like Group 2 Latch keys are supposed to work exactly how I want this to work: "when it is pressed and then released, the actuation of the next character input key causes the selection of a character of Group 2." Is it possible to implement this in X? I also didn't totally understand how this all works, but I noticed the sample layouts have three modifiers per key, how does that work? Do I need another key other than altgr to activate them? – mmaluff Jul 22 '20 at 19:57
  • Have you tried using ibus input method, setting Compose key and defining key sequences with <Multi_key> in ~/.XCompose? – Pandya Jul 26 '20 at 04:08
  • @Pandya I have not, but I believe it would not work, see the last few lines I just added. In general I don't think a solution via .XCompose is possible at this time. It does seem link changing the input method from IBus to XIM could allow me to do that, but see the answer to https://askubuntu.com/questions/1099947/how-to-use-xcompose-to-produce-snippets for why this is also perhaps not a good idea. – mmaluff Jul 26 '20 at 04:11
  • Unicode way works fine I think. Can you come to chat-room to clarify your problem with entering ̃ through unicode? – Pandya Jul 26 '20 at 05:03
  • I'll add my vote to @oldpro. What happens if you use xcompose+uim? See pointless-Xcompose – Rusi Jul 26 '20 at 05:46

2 Answers2

3

From what I have read, you are out of luck using standard xkb because, as you have found, with xkb the output of a dead key combo is either zero (if the second key did not match a valid sequence) or one Unicode code point.

I do not have an Ubuntu running X to test on, so I cannot test this suggestion, but I believe the solution for you is to switch to using uim, which supports multi-codepoint outputs from dead key combos. You can read about how to set up uim at wikibooks or from this post (but do not follow the whole post, as it is solving a different problem).

The post I referenced shows how to get 'b to output the 2 character sequence 'b while while still allowing 'a to output the single character á. They solved it by making ' a dead key and then configuring the sequence dead 'b explicitly, and then repeating that for the 99 other characters on the keyboard. You do not have to go so far.

You already created the .XCompose file you need. Switching to uim should be all that is left to do.

Old Pro
  • 1,306
  • It does seem like that's my best bet, short of fixing this in GTK: https://gitlab.gnome.org/GNOME/gtk/-/issues/186

    I'll leave this open for a bit to see if anyone has a better idea, and otherwise give you the bounty.

    – mmaluff Jul 26 '20 at 04:58
  • 2
    Nice, I just did sudo apt install uim and echo export GTK_IM_MODULE="uim" >> ~./profile Now. .XCompose definition for g̃ works fine – Pandya Jul 26 '20 at 05:22
  • Ok, I've become convinced this is currently the best solution. Thank you! And also thank you for that wonderful answer to https://unix.stackexchange.com/a/314175/66803 – mmaluff Jul 26 '20 at 16:24
  • Hmm. Actually, that didn't work. It seems to read my .XCompose file just fine, but it still doesn't take the <dead_tilde> : <g̃> combination. I'll investigate later. – mmaluff Jul 26 '20 at 17:22
  • Just for the record, I did not investigate later because I decided uim is too much of a pain to use to be worth the trouble. But I still think it's, sadly, the best option at present. – mmaluff Jul 29 '20 at 19:40
1

I just upgraded to Ubuntu 20.04, and now the .XCompose solution works perfectly! So that should be the best solution. You just need to make an .XCompose file in your home directory as follows, or add to your existing one:

include "%L"

<dead_tilde> <g> : "g̃" gtilde <dead_tilde> <G> : "G̃" Gtilde

mmaluff
  • 181
  • 13