LINUX.ORG.RU

Easy Switcher - переключатель раскладки клавиатуры

 ,


3

8

Лет 10 у меня на компе жил и работал gxneur. Еще на Ubuntu 20.04 он кое-как работал в ручном режиме, но после недавнего перехода на 22.04 (да, затянул), завести мне его уже не удалось. Пару недель я страдал без переключателя, и в итоге решил написать свой, вот, решил поделиться:

Скачать: https://sourceforge.net/projects/easy-switcher/files/

Реализованы следующие функции:

  • переключение раскладки клавиатуры с корректировкой уже введенного текста.

  • 2 режима корректировки:

      - при нажатии Break корректируется последнее введенное слово.
      - при нажатии Shift + Break корректируется последняя введенная фраза.
    
  • режим настройки.

  • режим отладки.

Программа устанавливается как демон и управляется systemctl. В отличие от xneur, работает не через xkb, а читает устройство ввода с ядра, и поэтому не зависит от графического сервера и рабочего окружения. В теории должна работать на любых ОС с ядром linux, и не будет глючить с выходом обновлений ОС и ДЕ. (время покажет, пока это предположение)

Как работает? Программа ловит нажатия клавиш, а при нажатии Break стирает написанное, меняет раскладку, и пишет заново. Смена раскладки происходит эмуляцией нажатия клавиши, которую нужно прописать в конфиге. Если для смены раскладки вы используете комбинацию клавиш, то нужно в настройках ОС добавить дополнительную клавишу смены раскладки (в kde это можно сделать нативно, а в gnome - например с помощью gnome tweak tool). В моей системе для смены раскладки используется клавиша Win.

Проверялось на Ubuntu 22.04, релиз будем считать альфа, возможны баги.

Устанавливаем пакет, затем:

easy-switcher --configure
easy-switcher --install
systemctl enable easy-switcher
systemctl start easy-switcher

ЗЫ: конфиг лежит здесь: /etc/easy-switcher/default.conf. Пояснения имеются. (первоначально лучше заполнить его с помощью команды easy-switcher –configure)



Последнее исправление: freemind (всего исправлений: 1)
Ответ на: комментарий от anonymous

Или ты пишешь доку, постоянно переключаешься между одним и другим языком, делаешь описание, и тут бац - а весь абзац - белиберда.

Печатать одно, а читать при этом другое — это, конечно, иногда полезный навык, но слишком часто приводит к ошибкам, в том числе и не по вине раскладки. Всё же лучше смотреть на текст, который набираешь.

CrX ★★★★★
()
Ответ на: комментарий от anonymous

Я, кстати, очень много с кем общаюсь, причём часто на разных языках параллельно (да вот даже прямо сейчас — на ЛОРе по-русски и в IRC по-английски). Но сколько не пробовал подобные программы — никакого толку в них не видел и по факту просто прекращал пользоваться. Если вдруг почему-то ошибся с раскладкой, стереть 4–5 символов или с помощью ^W и заново напечатать их несложно, благо происходит это довольно редко. Как по мне, даже напечатать 5 символов требует меньших усилий, чем дотянуться рукой до Break, а потом вернуть руку обратно в то же положение и продолжить печатать.

Но автору всё равно респект. Во-первых, кому-то оно явно удобно, просто не мне. А во-вторых, за то, что не стал ныть на ЛОРе, что мерзкие разработчики xneur не починили для него баг в убунте, а взял и решил проблему самостоятельно, да ещё и со своими киллерфичами.

CrX ★★★★★
()
Последнее исправление: CrX (всего исправлений: 1)
23 августа 2024 г.

Здравствуйте. Спасибо за разработку.

Скачал деб, установил в Минт 22. Выполнил 4 команды выше. Не работает: ввожу в хроме текст, нажимаю Right Alt, ничего не происходит.

zon@zon-office:~$ sudo easy-switcher –configure Easy Switcher keyboard configuration started. Trying to read existing config file… Done.

Easy Switcher will try to detect your keyboard automatically. Please press ENTER…

Found keyboard at /dev/input/event2

Press the key or combination of keys that changes layout in your system. Waiting for your input… Key combination LEFTSHIFT+LEFTCTRL captured

Press the key you will use to correct the text you have entered. Waiting for your input… Key RIGHTALT captured

Writing configuration file… Keyboard configuration successfully saved. See /etc/easy-switcher/default.conf to edit additional parameters. zon@zon-office:~$ sudo easy-switcher –install Installing Easy Switcher daemon… Easy Switcher daemon successfully installed, version: 0.3 zon@zon-office:~$ sudo systemctl enable easy-switcher Created symlink /etc/systemd/system/sysinit.target.wants/easy-switcher.service → /usr/lib/systemd/system/easy-switcher.service. zon@zon-office:~$ sudo systemctl start easy-switcher

Zon
()
7 октября 2024 г.

заработало 👍 (ubuntu 24.04) Но. 1)Нельзя ли прикрутить к этой хне хоть какой-нить GUI? Чтобы хотя бы видет в трее какая у меня сейчас раскладка включена. 2)В Ханурике была замечатальная фича - отключение клавиши CapsLock. Нельзя ли и это как-то реализовать?

vaysburd
()

Я только что запустил xneur на Linu Mint 22

Скачал 2 файла libxneur_0.20.0-3_amd64.deb и xneur_0.20.0.3_amd64.deb и установил. Запустил из консоли xneur и имею результат переключение раскладки.

http://archive.ubuntu.com/ubuntu/pool/universe/x/xneur/xneur_0.20.0-3_amd64.deb

http://archive.ubuntu.com/ubuntu/ubuntu/pool/universe/x/xneur/libxneur_0.20.0-3_amd64.deb

digitalkkoye
()
2 января 2025 г.

Посмотрел код, повнимательнее бы надо...

Например, PrepareBuffer:

Потенциальный выход за границы массива:
1) проверки вроде iBuf[Last - 3] хорошо бы предварять (Last>=3) and

Неоптимальности:
1) пачка копирований между KeyBuf, iBuf, oBuf: зачем?
2) если и копировать массивы, почему отдельным циклом поэлементно, а не не по Copy()?
3) внутри циклов SetLength(xBuf, Length(xBuf)+1): зачем?

На первый взгляд, PrepareBuffer мог бы выглядеть как-то так (если правильно идею уловил):

function IsEvCV(const E: input_event; ACode: cuint16; AValue: cint32): boolean; inline;
begin
  with E do Result := (Value = AValue) and (Code = ACode);
end; 

procedure PrepareBuffer;
var
  i, k, Len: integer;
begin
  //get rid of replace keys
  Len := Length(KeyBuf);
  if (Len >= 4) and
    IsEvCV(KeyBuf[Len - 1], Key_RPL, 0) and
    IsEvCV(KeyBuf[Len - 3], Key_RPL, 1) and
    (KeyBuf[Len - 2].Value = 0) and (KeyBuf[Len - 2].code in Shifts) and
    (KeyBuf[Len - 4].Value = 1) and (KeyBuf[Len - 4].code in Shifts)
  then
    Dec(Len, 4)
  else if (Len >= 2) and
    IsEvCV(KeyBuf[Len - 1], Key_RPL, 0) and
    IsEvCV(KeyBuf[Len - 2], Key_RPL, 1)
  then
    Dec(Len, 2 + Ord((Len >= 3) and (KeyBuf[Len - 3].Value = 1)));

  //cut of last line only
  i := Len - 2;
  while (i >= 0) and not IsEvCV(KeyBuf[i], KEY_ENTER, 0) do Dec(i);
  if i >= 0 then
  begin
    k := Len; Len := 0;
    for i := i + 1 to k - 1 do
    begin
      KeyBuf[Len] := KeyBuf[i];
      Inc(Len);
    end;
  end;

  //get rid of shiftdown-shiftup or BS
  k := Len; Len := 0;
  for i := 0 to k - 1 do
  begin
    if (Len > 0) and
      (KeyBuf[i].code in Shifts) and
      (KeyBuf[Len - 1].code in Shifts)
    then
      Dec(Len)
    else if (KeyBuf[i].code = KEY_BACKSPACE) then
    begin
      if Len > 0 then
      begin
        Dec(Len);
        if (KeyBuf[Len].code in Shifts) and (Len > 0) then
          KeyBuf[Len - 1] := KeyBuf[Len];
      end;
    end
    else
    begin
      KeyBuf[Len] := KeyBuf[i];
      Inc(Len);
    end;
  end;
  SetLength(KeyBuf, Len);

  sleep(10);
end;

bormant ★★★★★
()
Последнее исправление: bormant (всего исправлений: 2)