LINUX.ORG.RU

i3status, как добавить раскладку языка в статус бар

 ,


0

1

Сегодня искал решение, как добавить раскладку в статус бар. Потратил время, поэтому решил поделиться…

Я использую для переключение раскладки setxkbmap. Для отображения раскладки xkblayout-state (AUR). У меня конфиг для i3status в формате JSON.

Создаем скрипт add-lang-layout-i3status:

#!/bin/sh

lang=""

update_lang() {
  lang=$(xkblayout-state print "%s")
}

i3status | (read line && echo "$line" && read line && echo "$line" && read line && echo "$line" && update_lang && while :

do
  read line
  update_lang
  echo ",[{\"full_text\":\"${lang}\" },${line#,\[}" || exit 1
done)

Размещаем где-то в $PATH, у меня он в /usr/local/bin, делаем его исполняемым.

И в конфиг ~/.config/i3/conf добавляем переключение раскладки:

exec --no-startup-id setxkbmap -model 105 -layout us,ru -option grp:ctrl_shift_toggle

и в секции bar:

bar {
    status_command exec add-lang-layout-i3status
}

Жмем CTRL+SHIFT+C. Должно работать…



Последнее исправление: zv_X (всего исправлений: 1)

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

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

ну а если бар таки нужен, то только polybar, конечно же.

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

Я сам пользовался им некоторое время и проблем не заметил. Единственное, где проявляется косяк - это на моём 4к мониторе, но там все иконки в трее косячат. Отказался потому, что не смотрю на него и всё равно иногда печатаю не на той раскладке. Относительно недавно перешёл на включение раскладки и проблема стала не так актуальна, хотя рефлексы всё ещё остались старые.

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

далее тебе не нужен никакой бар

Не возводи в абсолют своё личное мнение. Все эти кастомизации - это вкусовщина же и каждый пилит окружение под себя.

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

Так да, тоже самое - не смотрю на значок в 90% случаев… Но напрягает на вводе пароля, приходится по два раза вводить ))(( ну а тыкать в «глазик» не всегда возможно и удобно. Короче лишние телодвижения…

Ну как будет чутка времени, посмотрю в сторону xxkb, хотя сомневаюсь, когда уже работает, то…

zv_X
() автор топика
Ответ на: комментарий от zv_X

Настроить переключение таким образом, чтоб каждая раскладка включалась своим сочетанием клавиш.

Например, раньше у меня было сочетание клавиш win+пробел, которое циклически переключало раскладки.

Теперь я настроил так, что при нажатии левого ctrl+win включается английская раскладка, а при нажатии правого ctrl+меню включается русская.

Таким образом вообще не нужно смотреть на индикатор - просто нажимаю сочетание клавиш для нужной раскладки и печатаю.

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

Я тоже до сих пор не привык, но всё равно стало значительно удобнее. До этого была такая бесявая тема, когда изначально стоит не та раскладка, о которой я думаю и нужно напечатать текст сначала на одном, а потом на другом языке.

Слепой печатью не владею, поэтому часто бывала такая ситуация. Сначала я печатаю русские слова английским языком, а потом английские русским. Потом я замечаю это, стираю весь текст и печатаю снова русские слова английским и английские русским. Фишка в том, что пальцы переключают язык машинально и я практически об этом не задумываюсь. Поэтому сначала происходит 3-4 попытки написать текст, потом меня это выбешивает и я громко ругаюсь нехорошими словами. Потом я осознанно выставляю нужную раскладку и уже после этого удаётся напечатать текст.

В какой-то момент меня это окончательно выбесило и я полез в сеть искать идеи и наткнулся на информацию про включение раскладки. С тех пор косяков с неправильной раскладкой становится всё меньше по мере привыкания.

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

напрягает на вводе пароля, приходится по два раза вводить

настрой лампочку на клавиатуре, numlock — горит, значит кириллица. у меня такой клавиши нет, настроил на caps grp_led:caps + kbdd — при переключении фокуса раскладка в текущем окне автоматически сбрасывается на латиницу, так что вообще не приходится гадать, очень удобно. я тот самый пользователь без бара-панели. другой аноним

anonymous
()

Мой велосипед на питоне

https://github.com/kraskden/dotfiles/tree/legion/exe/scripts/i3status/mod

Ещё при переключении раскладок надо SIGUSR1 слать, чтобы перерисовывался бар

Ну и заодно пропиарю привязку раскладки к окну в i3 , чтобы у каждого окна была своя раскладка. Когда-то использовал для этих целей gxkb, но они, во-первых, стали protestware, а во-вторых, работало оно все крайне нестабильно и часто вылетало с сегфолтом

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

В какой-то момент меня это окончательно выбесило и я полез в сеть искать идеи и наткнулся на информацию про включение раскладки. С тех пор косяков с неправильной раскладкой становится всё меньше по мере привыкания.

про tapper знаешь?

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

Ну так как я печатаю вслепую и не смотрю на клаву, мне не особо поможет лампочка на клаве. Мне гораздо удобней видеть значок в баре. Поэтому я и допиливаю i3status.

zv_X
() автор топика
Ответ на: комментарий от u5er

Ну да, тут у каждого свой путь. А вообще слепая печать сильно экономит время. Переучиваться это жестко и мучительно, но потом это окупается…

Русская у меня от самого начала, как только сел за комп. Друг подарил комп с условием, что я сразу буду осваивать слепую печать, за что я ему до сих пор благодарен. А вот English в слепую осваивал уже спустя многие годы, когда уже писал код и вышел с фриланса в компанию и понял, что я отстал и очень сильно…

Полгода переучивался с 4-х пальцев. Но там было без вариантов, потому как все набирали вслепую вокруг меня )

zv_X
() автор топика

Решил пойти немного другим путем.
Добавил запуск скрипта в конфиг i3:

exec --no-startup-id i3layout &

В конфиге i3status:

order += "read_file LAYOUT"

и соответственно

read_file LAYOUT
{
    path = "/tmp/layout"
    format = "%content "
}

i3layout

#!/usr/bin/bash

while [[ -z $(pgrep i3status) ]]
do
    sleep 0.2s
done

while [[ -n $(pgrep i3status) ]]
do
    value=$(xkblayout-state print %c)
    case $value in
        0) echo En > /tmp/layout ;;
        1) echo Ru > /tmp/layout ;;
    esac
    sleep 0.7s
done

вариант без xkblayout-state

value=$(xset -q | grep 'LED' | sed -E 's/.+0{4}([01]).+/\1/')
dmitry237 ★★★★
()

Нашел еще лучший, чем мой предыдущий вариант.

Скрипт для проверки текущей раскладки сократил и запускаю его при нажатии клавиши, которая переключает раскладку:

#!/usr/bin/bash

layout=$(xkblayout-state print %c)

case $layout in
    0) echo En > /tmp/layout ;;
    1) echo Ru > /tmp/layout ;;
esac

В конфиге i3 привязал скрипт к клавише, в моем случае правый Alt:

bindcode 108 exec --no-startup-id i3layout

В i3status.conf:

order += "read_file LAYOUT"
...
read_file LAYOUT
{
    path = "/tmp/layout"
    format = "%content "
    format_bad = "En "
}

Теперь скрипту не надо крутиться в бесконечном while, он вызывается при смене языка.

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

Можно еще упростить, и выкинуть switch

#!/usr/bin/bash

echo `xkblayout-state print %s | awk '{print toupper($0)}'`

ну это если вообще надо форматировать стринг в капс например. А можно этого не делать )

echo `xkblayout-state print %s`

тогда будет нижний регистр, ну или приводим только первую букву к верхнему

echo `xkblayout-state print %s | sed -e 's/^./\U&\E/g'`
zv_X
() автор топика
Последнее исправление: zv_X (всего исправлений: 2)
Ответ на: комментарий от zv_X

Да, привык к правому альту:

setxkbmap -layout "us,ru" -option "grp:toggle"

Но можно, если уж используется xkblayout-state, то им и переключать (с биндингом скрипта на нужную клавишу):

xkblayout-state set 0 # us
xkblayout-state set 1 # ru

или setxkbmap (ru|us). Не принципиально, имхо.

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

Ну чтобы на скорость повлиять, это сейчас при современных процах, очень сильно надо постараться ))

А так, switch - это просто избыточный код, влияет на оптимальность кода.

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