Xmodmap permanente in Ubuntu 13.04


72

Non riesco a far funzionare xmodmap al login in Ubuntu 13.04. Ho cercato in giro, anche in askubuntu e tutte le risposte che ho trovato non funzionano.

Ho un file chiamato .Xmodmap nella mia cartella home che contiene i mapping desiderati. Se lo eseguo manualmente funziona bene, quindi non c'è nessun errore lì. Per farlo funzionare all'avvio, ho provato:

  1. Utilizzando vari .xinitrccontenenti uno dei seguenti comandi:

    • xmodmap .Xmodmap
    • xmodmap ~/.Xmodmap
    • /usr/bin/xmodmap /home/NAME/.Xmodmap
    • if [ -s ~/.Xmodmap ]; then
      xmodmap ~/.Xmodmap
      fi
  2. Usando .Xresourcesanziché .xinitrccon le stesse variazioni.

  3. Impostandolo come un'applicazione di avvio.

Nessuna delle precedenti funzioni funziona in Ubuntu 13.04 (64 bit). Ho anche visto alcune idee sulla modifica globale delle mappature della tastiera, ma la maggior parte di esse non era applicabile in Ubuntu 13.04 (ovvero i file corrispondenti non esistevano dove specificato) e preferisco comunque non toccare le impostazioni globali.

Risposte:


81

Ubuntu non utilizza più xmodmap, ma utilizza xkb(per quanto ne so, ciò facilita il layout della tastiera per finestra, tra le altre cose).

Sono presenti i file delle mappe a livello di sistema

/usr/share/X11/xkb/symbols/

Le mappe sembrano essere caricate gerarchicamente, con la pcmappa come radice e qualsiasi linguaggio (ad es. en) Come figlio della radice.

Nel mio caso particolare, ho scambiato fisicamente Pagina su con Home e Pagina giù con Fine sulla mia tastiera, quindi ho apportato modifiche molto grossolane alla mappa dell'intero sistema pc, come segue:

 key <HOME> {    [  Prior        ]   };
 key <PGUP> {    [  Home         ]   };
 key  <END> {    [  Next         ]   };
 key <PGDN> {    [  End          ]   };

NOTA: per forzare Xorg a utilizzare la nuova mappa della tastiera, potrebbe essere necessario rimuovere le mappe precompilate esistenti (* .xkm) in

/var/lib/xkb/

e quindi riavviare Xorg.

Ci sono varie risorse xkb, ma questa è relativa a Ubuntu.


9
A partire da Ubuntu 14.04, questo è purtroppo il modo più semplice per scambiare le chiavi. È possibile eseguire xmodmap al momento dell'accesso aggiungendolo alle applicazioni di avvio, ma se si sospende, si iberna, ecc. È necessario avviarlo manualmente o creare script daemon di avvio.
holocronweaver,

Posso rimappare i tasti a seconda modificatori: unmodified shift altgr* shift+altgr. Ma che dire di left alte super key?
Farzher,

7
Non penso che la tua prima frase sia vera. Hai qualche fonte per questo? Trovo difficile credere che "il modo Ubuntu" di rimappare i tuoi tasti sarebbe modificare le mappe della tastiera da xkb. Oltre ad essere criptico, questo ha il problema che le tue mappe personalizzate vengono eliminate quando xkbviene aggiornato.
Mateus Araújo,

1
Detto questo, questo è l'unico metodo affidabile che ho trovato per rimappare le chiavi su Ubuntu.
Mateus Araújo,

1
Deve esserci un modo migliore. Conosco il codice esatto che voglio mappare, ma il codice 217 non è nemmeno elencato in xkb. Non vedo nemmeno un modo per aggiungere nuovi codici chiave.
Jonathan,

13

Per me, la configurazione di xkb è troppo complicata se si desidera rimappare 1 o 2 chiavi in ​​un modo non disponibile nelle Impostazioni di sistema. Inoltre, la soluzione dovrebbe rimanere sul lato utente, senza modificare "/ usr / share / X11 / xkb / simboli /" ecc. Forza il caricamento di "xmodmap ~ / .Xmodmap" utilizzando le applicazioni di avvio funziona solo fino alla sospensione, modifica utenti o cambia il layout della tastiera. Quindi, come suggerisce holocronweaver, con frammenti di codice che ho trovato, ho creato uno script Python da caricare all'avvio della sessione, che ricarica la '~ / .Xmodmap' quando necessario.

Controllare la segnalazione bug # 1243642 (commento # 6) e scaricarla qui .


1
Ancora funzionante dal 15.10 :-) Grazie!
Lalomartins,

Il link a questo script leggendario sembra essere rotto. Qualcuno potrebbe metterlo su Github?
Epigene,

Ottima - e unica risposta fattibile! Lavorare nel 16.04. Per farlo funzionare in Python3 è cambiato: "import gobject" in "da gi.repository import GObject come gobject".
Craig Hicks,

1
@Epigene - il link è lì adesso
Craig Hicks

Sia lode! Un genio aggira.
dmanexe,

6

Ho avuto questo problema in Ubuntu 14.04 e ho trovato la soluzione qui . Apparentemente, Ubuntu non è in grado di configurare subito la tastiera dopo aver effettuato l'accesso, ma è un po 'più tardi. Quindi se aggiungi un comando

sleep 4 && xmodmap ~/.Xmodmap &

per ~/.bash_profileallora dovrebbe funzionare (lo fa per me).

EDIT: sembra funzionare solo dopo aver effettuato l'accesso, non dopo l'avvio. Dovrò indagare su questo più tardi.


1
Hai avuto fortuna a impostarlo per l'esecuzione dopo la sospensione / ibernazione?
Jonathan,

No, sfortunatamente non riesco nemmeno a farlo funzionare dopo l'avvio. Quindi ogni volta che avvio, apro un terminale e xmodmap ~/.Xmodmap
digito

tieni presente che su Ubuntu 16.04 dovresti usare .profile
Vitor Abella il

5

Converti Caps Lockin Escper l' vimuso

Ecco la mia variante di uno script di avvio per la mappatura dei tasti. Si converte Caps Lockin Escqualsiasi tastiera da utilizzare con vi, vimo gvim.

A differenza della risposta di q4w56 , questa risposta non utilizza alcun while; dociclo infinito . Altrimenti, un core della mia CPU dual core avrebbe raggiunto il 42% ogni 5 secondi, riducendo drasticamente la carica della batteria del mio laptop.

#!/usr/bin/env bash
sleep 4
xmodmap -e "clear Lock"
xmodmap -e "keysym Caps_Lock = Escape"

Salvalo come script. Rendi il file eseguibile con chmod +x. Aggiungi il nome e la posizione dello script a Session and Startup → Application Autostart(in Xubuntu).

Il comportamento della tastiera per questo utente rimarrà persistente attraverso il riavvio e il logout, ma non la sospensione. La persistenza attraverso la sospensione può essere raggiunta , ma sfortunatamente solo a livello di sistema, non facilmente a livello di utente.

Motivazione di questo rimappatura della tastiera

Nel mondo informatico di oggi è rimasto ben poco per la Caps Lockchiave. In generale, si dovrebbe astenersi dall'utilizzare TUTTI I CAPS in virtù sia della netiquette che della separazione di presentazione e contenuto . Inoltre, premere accidentalmente la Caps Lockchiave mentre si modifica il testo con vimnon è sempre immediatamente notato, ma inevitabilmente si traduce in un comportamento piuttosto fastidiosovim più avanti. Disabilitando la Caps Lockchiave tutti insieme e riutilizzandola come Escchiave facile da raggiungere, si ottiene una doppia vincita per l' vimuso.


Sostituire la funzione del Caps Locktasto potrebbe essere un vero salvavita per gli vimutenti di Apple MacBook senza un Esctasto .
Serge Stroobandt,

3
E 'meglio per rimappare la capslocka ctrl. Questo risolve molti altri problemi, e in Vim, quindi, puoi usare capslock+ [per EscMi dispiace per intromettermi, ma mi sono sentito obbligato a suggerire questo.
user907860

Che cosa è esattamente la sospensione? Quello sta chiudendo il coperchio sul tuo laptop? Dopo che la tua soluzione non funziona? Come usi vim dopo aver chiuso il coperchio del tuo laptop?
Marko Avlijaš,

@ MarkoAvlijaš How do you use vim after you close the lid on your laptop?Aprendo il coperchio ovviamente!
Serge Stroobandt,

Haha non lo avrei mai immaginato. Voglio dire, il blocco maiuscole non è più mappato per esc dopo quello?
Marko Avlijaš,

3

Ho avuto il problema anche su Ubuntu 16.04 con fcitx e avevo la soluzione sul wiki di fcitx , ma è necessario che fcitx abbia la versione 4.2.7 o successiva

  • touch ~/.Xmodmap
  • scrivi la configurazione
  • riavviare e fcitx proverà a caricarlo automaticamente

Ci sono anche alcune spiegazioni per il motivo.


1
Sebbene ciò possa teoricamente rispondere alla domanda, sarebbe preferibile includere qui le parti essenziali della risposta e fornire il collegamento come riferimento.
Videonauth,

@Videonauth Ho modificato la mia risposta
Bluethon,

Grazie mille :) Lascio ancora qui il mio commento così le persone in fase di revisione possono vedere che hai cambiato qualcosa.
Videonauth,

@Videonauth questa è la mia prima risposta e sono povero di inglese, quindi ho commesso un errore. e grazie per il tuo consiglio. : P
Bluethon,

Prego. Fornire risposte è un buon modo per contribuire alla comunità.
Videonauth,

3

La risposta di Daniel mi ha indicato la strada giusta, ma vorrei estenderla.

Funziona per me su Linux Mint 17.2 e Ubuntu 16.04.

Ho provato tutti i colpi di scena che potevo pensare di continuare a utilizzare xmodmap, ma tutti falliscono quando il sistema entra in modalità di sospensione. Lo stesso vale anche per gli script di avvio dell'applicazione che usano setxkbmapnei casi in cui il * daemon-settings (per me è xfce4) viene eseguito dopo lo script --- e l'ordine non può essere realmente influenzato.

Quello che ho finalmente trovato ha i seguenti ingredienti:

1) Scrivi un file di mappatura della tastiera minimo per /usr/share/X11/xkb/symbols. Consente di chiamare il file. mylayoutPuò essere semplice come

xkb_symbols "basic" {
  name[Group1] = "My Layout";
  include "us"
  key <AE03> { [ 3, numbersign, sterling, sterling] };
  include "level3(ralt_switch)"
}
  • basic è solo un nome, lo incontreremo di nuovo più tardi.
  • Il name[Group1]simile è solo un nome a quanto pare, ma non giocherà alcun ruolo in seguito.
  • include "us"include la semplice tastiera americana. In realtà usè un altro file nella stessa directory. Questo è il layout della tastiera che stiamo adattando. Scegli uno diverso, se necessario. Nota: nessun punto e virgola per terminare questa riga.
  • La keylinea è un adattamento della tastiera, più può seguire. Il <AE03>può essere trovato nei file sotto /usr/share/X11/xkb/keycodes. Utilizzare il xevprogramma per capire che il tasto "3" ha il codice 12 e nel file codici chiave a Xfree86cui è mappato <AE03>.
  • Finalmente un'altra includedirettiva per attivare un'altra opzione della tastiera, in questo caso voglio avere il tasto Alt giusto per essere il tasto shift di livello 3, cioè il tasto che dà accesso al sterlingsegno che ho definito sopra. level3è solo un nome di file nella stessa cartella con ralt_switchuna sezione di esso. Dai un'occhiata in giro e scegli ciò che devi includere.

2) ho non messo la mylayoutnella cartella di sistema. Piuttosto ho creato solo un collegamento soft dalla cartella di sistema a una cartella di mio gradimento per vedere immediatamente che questo non è un software stock.

3) Inoltre non ho risolto evdev.xml, di nuovo per evitare problemi di aggiornamento. Ma questo sarebbe necessario per trovare mylayout nell'editor di configurazione della tastiera (per xfce4 lo è xfce4-keyboard-settings). Invece ho usato xfce4-settings-editore cambiato keyboard-layout->XkbLayoutin mylayout(il nome del file) e XkbVariantin basic(vedi sopra). Successivamente, mylayout/basicviene visualizzato anche nell'editor delle impostazioni della tastiera. Una voce in evdev.xmlsembra essere necessaria solo per poter selezionare il layout.

In questo modo, le impostazioni della tastiera ora sopravvivono alla modalità di sospensione e al riavvio.

Ulteriori informazioni sono disponibili qui: http://www.charvolant.org/~doug/xkb/html/node5.html .

Un altro approccio per risolvere il problema della modalità di sospensione (non provato da solo) è disponibile qui: https://www.vinc17.net/unix/xkb.en.html .

AGGIORNAMENTO: ho lavorato con Mint 18.3 nello stesso momento in cui ho modificato le impostazioni in xfce4-settings-editor come descritto sopra.

AGGIORNAMENTO: Con 18.04, gdm3 come display manager e XFCE4 come window manager, sembra che ~ / .Xmodmap venga letto di nuovo e le impostazioni sembrano sopravvivere a una sospensione. (Uso raramente suspend e non sono mai sicuro in quale modalità sia il laptop allora.)


2

REVISIONE

Un aggiornamento all'inizio del 2018 ha interrotto la persistenza: il ricaricamento automatico della mappa dei tasti dopo la sospensione o l'ibernazione. Poiché i metodi che usano gli script /etc/pm/sleep.d hanno smesso di funzionare (deprecato?), Questo ha lasciato solo il modo più recente, usando / lib / systemd / system-sleep e script leggermente diversi (che hanno iniziato a lavorare su keymap!).

Quindi questo post viene aggiornato con il metodo più recente per la persistenza e per includere il normale caricamento della keymap iniziale, che ha anche iniziato a funzionare. La routine per convertire un file .Xmodmap in .xkbmap rimane invariata.

Nota che questa è una soluzione per utente. Per una risposta per dispositivo, vedere come applicare una mappa di tasti a un singolo dispositivo . Questo metodo potrebbe essere adattato per l'uso qui.

Prima modifica il file .Xmodmap come desideri. Questi sono più facili da modificare direttamente rispetto ai file .xkbmap. Quando è caricato:

xmodmap .Xmodmap

quindi converti in un file .xkb:

xkbcomp $ DISPLAY $ HOME / .xkbmap

Per caricare automaticamente all'avvio, apri Applicazioni di avvio, fai clic su Aggiungi e nella riga di comando inserisci:

xkbcomp /home/user/.xkbmap ": 0"

("utente" viene sostituito con il nome utente effettivo). Per Nome, forse inserisci Carica mappa tastiera. Aggiungi un commento se lo desideri e premi Salva.

La keymap ora verrà caricata ogni volta che si avvia il sistema, ma non sopravviverà a una sospensione o ibernazione. Per questo, crea un nuovo file in / lib / systemd / system-sleep, forse chiamato 60_xkbmap, che contiene:

#!/bin/sh
case $1/$2 in
  pre/*)
    # Place pre-suspend commands here
    exit 0
    ;;
  post/*)
    # Place post-suspend commands here
    export DISPLAY=":0"
    export XAUTHORITY="/home/user/.Xauthority"
    su user -c "xkbcomp /home/user/.xkb/xkb-map $DISPLAY 2>/dev/null"
    ;;
esac

( Rif. ) Come sopra, sostituire "utente" con il nome utente effettivo.

La mappa dei tasti dovrebbe ora caricarsi automaticamente e rimanere persistente. Nota:

  • Vale per l'attuale versione LTS, 16.04, e probabilmente anche per quelle successive.
  • Tratto dal post 14 del thread di bug collegato in precedenza.
  • Commenti precedenti applicati al post originale.

Sto provando questo metodo ora e ora quando avvio un terminale ricevo un sacco di messaggi in questo modo: Avviso: Nessun simbolo definito per <AB11> (codice chiave 97) Avviso: Nessun simbolo definito per <JPCM> (codice chiave 103) Avviso: Nessun simbolo definito per <I120> (codice chiave 120) ...... molti altri non sono sicuri di quali saranno le conseguenze. Qualcuno sa?
Ho perso il bambino il

Questo metodo, nonostante le avvertenze sopra menzionate, funziona ma solo temporaneamente - dopo un po 'di tempo la mappatura viene in qualche modo dimenticata e il tasto super ritorna alla sua funzione predefinita. Quindi ci proverò al contrario: rimapperò le scorciatoie di modifica di base sul mio mac per usare il tasto Control anziché il tasto Command e vedere se funziona. Voglio solo che i miei comandi cut-copy-paste-undo-redo siano gli stessi su Mac e Ubuntu. Mi sento molto frustrato quando il menu di ricerca si apre su Ubuntu ogni volta che provo a copiare o incollare qualcosa.
Ho perso il bambino il

1

Questo mi ha fatto inciampare anche quando sono passato da Ubuntu 12.04 a 13.04.

Fortunatamente questa impostazione è ora (o forse è sempre stata) facilmente accessibile nelle preferenze della tastiera e può essere modificata con pochi clic del mouse.

  1. Vai su Impostazioni di sistema > Layout tastiera > Opzioni ...
  2. In Opzioni layout tastiera, fai clic sulla freccia per visualizzare le opzioni di posizione del tasto key Ctrl .
  3. Metti il ​​segno di spunta su Scambia Ctrl e Blocco maiuscole .

Ecco fatto: controllo sinistro e blocco maiuscole hanno posizioni cambiate.

Non dimenticare di eliminare ~/.Xmodmapuna volta effettuata la modifica.


Questo è stato forse ridimensionato perché non si occupa di xmodmap, ma in realtà è stato così che ho scoperto che l'uso di Gnome Tweak potrebbe essere stato il motivo per cui alcuni dei miei mapping si sono comportati in modo strano.
dragon788,

Non lo vedo nel 16.04, è ancora possibile?
Chrismarx,

1
@chrismarx No, l'hanno rimosso. Al giorno d'oggi (16.04) ho impostato XKBOPTIONS="ctrl:swapcaps"in /etc/default/keyboard.
inizia il

0

Trovo soddisfacente l'aggiunta di questo script all'avvio:

while true;do 
    xmodmap -e "keycode 87=Prior"
    xmodmap -e "keycode 88=Next"
    sleep 5
done

Ho provato a utilizzare xmodmap ./Xmodmap, ma ogni volta che viene eseguito, si verificherà un notevole ritardo.


4
L'uso di qualsiasi while; dociclo infinito dovrebbe essere evitato. Ha fatto sì che un core della mia CPU dual core raggiungesse il 42% ogni 5 secondi, riducendo drasticamente la carica della batteria del mio laptop!
Serge Stroobandt,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.