Geçerli klavye düzenini nasıl alabilirim?


61

Merak ediyorum mevcut klavye düzenini döndüren herhangi bir komut satırı aracı var.

Ben var XkbLayoutayarlı us, ru.

Güncelle: setxkbmap seçilen düzeni değil, yerleşim ayarlarını döndürür. Örneğin:

$ setxkbmap -print | grep xkb_symbols
xkb_symbols   { include "pc+us+ru:2+inet(evdev)+capslock(grouplock)+terminate(ctrl_alt_bksp)"   };

Mevcut düzen ne olursa olsun aynı sonucu verecektir.


D-Bus'ta pek iyi değilim ama geçerli klavye düzenini kullanarak onu izlemek kolay olmalı. Aktif anahtar yoksa bunu yapamayabilir.
Benjamin

Yanıtlar:


31

Belki bu sürüm bağımlıdır, ancak setxkbmap1.3.0 kullanan makinemde aşağıdaki komut çalışır:

setxkbmap -query | grep layout

İhtiyacınıza bağlı olarak, sadece düzeni bilmenin yararsız olabileceğini unutmayın: örneğin, ABD düzeninin Dvorak varyantı varsayılan QWERTY'den oldukça farklıdır. -querySeçeneği setxkbmapdüzeni ve farklı alanlarda olduğu gibi varyant, hem de verir:

$ setxkbmap -query
rules:      evdev
model:      default
layout:     fr
variant:    bepo
options:    grp:alt_shift_toggle

3
-queryilave edildi setxkbmap dosyasını 1.2.0
alanc

Mevcut düzenleri ve çeşitlemeleri ve birçok ek bilgiyisetxkbmap -print -verbose 10
erik

Bunu ayarlamak için, örneğin hem cz hem de biz düzenini (varyant dvorak ile sonuncusu (104 tuşlu klavye için)) ayarlamak için kullanınsetxkbmap -model pc104 -layout cz,us -variant ,dvorak
erik

Teşekkürler, çalışma
Indacochea Wachín

19

Böylece açıklanan xkb-anahtarı var:

xkb-switch, XKB düzen durumunu sorgulamaya ve değiştirmeye izin veren bir C ++ programıdır.

https://github.com/ierton/xkb-switch

Veya nozimica'nın önerisini izleyerek şunları kullanabilirsiniz:

setxkbmap -print | awk -F"+" '/xkb_symbols/ {print $2}'

Arch Linux panolarındaki bu konudan: https://bbs.archlinux.org/viewtopic.php?pid=539406


1
Teşekkürler, iyi xkb-switchçalışıyor, ama daha taşınabilir bir çözüm olduğunu umuyorum
Andrew

1
@Andrew: evet, mevcut düzeni elde etmenin basit bir yolu yok.
Benjamin

7
Sizin setxkbmapbirden fazla düzen tanımlandığında anda etkin düzenini göstermez.
terdon

13

Evet, istediğinizi yapan bir komut satırı aracı VAR! Daha 10 dakika önce keşfettim :)

Buraya bakın: https://github.com/nonpop/xkblayout-state

xkblayout-state print "%s"

tam olarak ne istiyorsan onu yapar (bir satır sonu çıkarmaz, bu yüzden ; echogerekirse ekleyin ). Yardım için parametreler olmadan aracı çalıştırın.


11

Geçerli mizanpajın kodunu almak için bunu kullanın:

$(xset -q|grep LED| awk '{ print $10 }')

Bunun, istediğiniz gibi bir formata dönüştürülmesi gerekebilir:

case "$(xset -q|grep LED| awk '{ print $10 }')" in
  "00000002") KBD="English" ;;
  "00001002") KBD="Thai" ;;
  *) KBD="unknown" ;;
esac

3
Ben olsun 00000002benim düzeni "ABD Dvorak uluslararası" olsa bile. Dil yeterli değil ...
l0b0

4
Üç veya daha fazla düzen varsa yardımcı olmaz. İkinci ve üçüncü düzenler 00001004makinemde aynı değeri veriyor .
sastanin

problem:
numlock'ınızı

Bu güvenilir bir şekilde çalışmaz - LED, klavye led düğmelerinin durumunu gösterdiğinden bir maske kullanmanız gerekir.
fikovnik

9

xset -qKomutun çıktısının sabit konumlarından dolayı daha basit bir yaklaşım şudur:

xset -q | grep -A 0 'LED' | cut -c59-67

Yazdırır 00000002veya 00001002geçerli klavye düzeninize bağlı olarak.


Bunu sevdim, sanırım 8 karaktere kadar daraltabilirsin. c59-66.
xlembouras

8

Daha yeni sistemlerde kullanabilirsiniz

localectl status

Örneğin, size aşağıdakileri gösterecektir:

System Locale: LANG=en_US.UTF-8
       VC Keymap: us
      X11 Layout: us

3

Şu ana kadarki cevaplar benim için işe yaramadı. Ben setkbmapiki düzen ingilizce ve çek ile kullanmak , bu yüzden herhangi -printveya -queryher zaman iki dönecektir. LED durumunu grepping etmek xset -qde işe yaramaz, çünkü bu tüm klavye ledlerinin durumunu gösterir.

Şimdiye kadarki en iyi şey hızlıca bu küçük yardımcı programı yazmaktı: https://gist.github.com/fikovnik/ef428e82a26774280c4fdf8f96ce8eeb

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <X11/XKBlib.h>
#include <X11/extensions/XKBrules.h>

int main(int argc, char **argv) {
  Display *dpy = XOpenDisplay(NULL);

  if (dpy == NULL) {
    fprintf(stderr, "Cannot open display\n");
    exit(1);
  }

  XkbStateRec state;
  XkbGetState(dpy, XkbUseCoreKbd, &state);

  XkbDescPtr desc = XkbGetKeyboard(dpy, XkbAllComponentsMask, XkbUseCoreKbd);
  char *group = XGetAtomName(dpy, desc->names->groups[state.group]);
  printf("Full name: %s\n", group);

  XkbRF_VarDefsRec vd;
  XkbRF_GetNamesProp(dpy, NULL, &vd);

  char *tok = strtok(vd.layout, ",");

  for (int i = 0; i < state.group; i++) {
    tok = strtok(NULL, ",");
    if (tok == NULL) {
      return 1;
    }
  }

  printf("Layout name: %s\n", tok);

  return 0;
}

ve kullanarak derleme

gcc -I/usr/include getxkblayout.c -lX11 -lxkbfile


3

xkbprintMevcut düzeni yazdırmak için kullanabilirsiniz .

Örneğin mevcut düzeni PDF kullanımı olarak yazdırmak için

xkbprint -color "${DISPLAY}" - |\
    ps2pdf - > current_keyboard_layout.pdf

hangi üretir:

xkbprint sonucu


2

Gönderen Arch Linux forumlarda Goosfrabaa :

setxkbmap -v | awk -F "+" '/symbols/ {print $2}'

Bu burada doğru çalışır ve yazdırır us(dvorak-intl)(GNOME klavye seçim menüsünde "ABD Dvorak uluslararası" olarak görüntülenir).


7
Geçerli olanı değil, yalnızca listedeki ilk düzeni yazdırır.
sastanin

Setxkbmap ile dil değiştirme özelliğini kullandığımda, anahtar haritamı nasıl tespit edebilirim? $ setxkbmap -v>> Trying to build keymap using the following components: | keycodes: evdev+aliases(qwerty) | types: complete | compat: complete+ledscroll(group_lock) | symbols: pc+us+hu:2+inet(evdev)+group(alt_shift_toggle)+compose(rwin)+terminate(ctrl_alt_bksp) | geometry: pc(pc105)bu durumda her zaman "biz" aldım
andras.tim

0

Kısmi cevap: KDE'de , görünüşe göre geçerli klavye düzenini qdbuskomut aracılığıyla alabilirsiniz :

$ qdbus org.kde.keyboard /Layouts getCurrentLayout
gb(intl)

Yapılandırılmış birkaç düzen var, ancak yalnızca şu anda kullanımda olanı gösteriyor.

Kubuntu 18.04'te test edildi (qdbus sürüm 4.8.7). Qt olmayan ortamlar için başka d-bus tabanlı çözümler olabilir, ancak ben onları bilmiyorum.


0
#! /bin/bash
#  (GPL3+) Alberto Salvia Novella (es20490446e)


keyboardLayout () {
    layout=$(variableInFile "KEYMAP" "/etc/vconsole.conf")
    echo ${layout}
}


variableInFile () {
    variable=${1}
    file=${2}

    source ${file}
    eval value=\$\{${variable}\}
    echo ${value}
}


keyboardLayout

-1

Kullanabilirsiniz:

setxkbmap -print | grep xkb_symbols

5
geçerli klavye düzenini değil genel klavye ayarlarını döndürür (bize veya ru)
Andrew

@Jasonwryan'ın ifade ettiği gibi, bu çizgiyi dikkatli bir şekilde analiz ederseniz, düzeninize uyduğundan emin olun. Benim durumumda öyle latam.
nozimica

5
jasonwryan sürümü sadece '+' işaretinden sonra dizgenin bir kısmını çıkardı, xkb_symbolsdeğer seçilen düzene bağlı değil, her zaman 'biz' alırım
Andrew
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.