LINUX.ORG.RU

Использование пробела в качестве Alt_R в xkb и создание Яро-раскладки

 , , , ,


0

3

Я доделал Яро-раскладку под офтопик на базе AutoHotkey, и она вроде работает. Теперь хочу такую же под Linux. У меня какой-то из довольно новых дебианов с Lxde, раскладка должна органично вписаться в эту среду, ну и вообще, быть совместимой.

Вот веб-версия: http://программирование-по-русски.рф/яроклава-js.яргт

Вот текущая версия для AutoHotkey (Win only).

;;;; Этот файл должен быть в кодировке utf-8 с BOM. 
;;;; Яро-раскладка
;;;; Общая идея такова:
;;;;  Пробел становится модификатором, который 
;;;;  позволяет, не выходя из русской раскладки  набивать латиницу и некоторые спец.значки
;;;;  При этом оставлен только один способ набивать
;;;;  знаки препинания .,:;/\, это позволяет меньше путаться.
;;;;  
;;;;  Проверено на AutoHotkey v1.1.29.01 (Unicode 64-bit), 
;;;;  под Windows 10.
;;;; 
;;;;  https://bitbucket.org/budden/iaroklava-js
;;;;  http://программирование-по-русски/яроклава-js.яргт
;;;;
;;;;  (C) Денис Будяк 2018, budden73@mail.ru
;;;;  Код распространяется по лицензии MIT 
;;;; 
;;;;  Установка: инсталлируйте программу AutoHotkey
;;;;  скопируйте этот файл в свою папку "документы" 
;;;;  и запустите AutoHotkey. 

#UseHook, On

; $vk41:: Print("{vk41}","{U+263C}") ; Space+A -> Sun

;;; Нижеследующий фрагмент генерируется так:
;;; - откройте пример.html в браузере
;;; - откройте консоль (F12)
;;; - вызовите ГенерируйКодДляAutoHotKey()
$vkc0:: Нажато("{vkc0}","~")
$+vkc0:: Нажато("+{vkc0}","`")
$vk31:: Нажато("{vk31}","☼")
$+vk31:: Нажато("+{vk31}","≠")
$vk32:: Нажато("{vk32}","@")
$+vk32:: Нажато("+{vk32}","@")
$vk33:: Нажато("{vk33}","#")
$+vk33:: Нажато("+{vk33}","§")
$vk34:: Нажато("{vk34}","$")
$+vk34:: Нажато("+{vk34}","†")
$vk35:: Нажато("{vk35}","°")
$+vk35:: Нажато("+{vk35}","<НЕТ>")
$vk36:: Нажато("{vk36}","^")
$+vk36:: Нажато("+{vk36}","☭")
$vk37:: Нажато("{vk37}","&")
$+vk37:: Нажато("+{vk37}","¿")
$vk38:: Нажато("{vk38}","<НЕТ>")
$+vk38:: Нажато("+{vk38}","<НЕТ>")
$vk39:: Нажато("{vk39}","<НЕТ>")
$+vk39:: Нажато("+{vk39}","<НЕТ>")
$vk30:: Нажато("{vk30}","<НЕТ>")
$+vk30:: Нажато("+{vk30}","<НЕТ>")
$vkbd:: Нажато("{vkbd}","<НЕТ>")
$+vkbd:: Нажато("+{vkbd}","<НЕТ>")
$vkbb:: Нажато("{vkbb}","≈")
$+vkbb:: Нажато("+{vkbb}","≡")
$vk51:: Нажато("{vk51}","q")
$+vk51:: Нажато("+{vk51}","Q")
$vk57:: Нажато("{vk57}","w")
$+vk57:: Нажато("+{vk57}","W")
$vk45:: Нажато("{vk45}","e")
$+vk45:: Нажато("+{vk45}","E")
$vk52:: Нажато("{vk52}","r")
$+vk52:: Нажато("+{vk52}","R")
$vk54:: Нажато("{vk54}","t")
$+vk54:: Нажато("+{vk54}","T")
$vk59:: Нажато("{vk59}","y")
$+vk59:: Нажато("+{vk59}","Y")
$vk55:: Нажато("{vk55}","u")
$+vk55:: Нажато("+{vk55}","U")
$vk49:: Нажато("{vk49}","i")
$+vk49:: Нажато("+{vk49}","I")
$vk4f:: Нажато("{vk4f}","o")
$+vk4f:: Нажато("+{vk4f}","O")
$vk50:: Нажато("{vk50}","p")
$+vk50:: Нажато("+{vk50}","P")
$vkdb:: Нажато("{vkdb}","[")
$+vkdb:: Нажато("+{vkdb}","{{}")
$vkdd:: Нажато("{vkdd}","]")
$+vkdd:: Нажато("+{vkdd}","{}}")
$vkdc:: Нажато("{vkdc}","|")
$+vkdc:: Нажато("+{vkdc}","<НЕТ>")
$vk41:: Нажато("{vk41}","a")
$+vk41:: Нажато("+{vk41}","A")
$vk53:: Нажато("{vk53}","s")
$+vk53:: Нажато("+{vk53}","S")
$vk44:: Нажато("{vk44}","d")
$+vk44:: Нажато("+{vk44}","D")
$vk46:: Нажато("{vk46}","f")
$+vk46:: Нажато("+{vk46}","F")
$vk47:: Нажато("{vk47}","g")
$+vk47:: Нажато("+{vk47}","G")
$vk48:: Нажато("{vk48}","h")
$+vk48:: Нажато("+{vk48}","H")
$vk4a:: Нажато("{vk4a}","j")
$+vk4a:: Нажато("+{vk4a}","J")
$vk4b:: Нажато("{vk4b}","k")
$+vk4b:: Нажато("+{vk4b}","K")
$vk4c:: Нажато("{vk4c}","l")
$+vk4c:: Нажато("+{vk4c}","L")
$vkba:: Нажато("{vkba}","<НЕТ>")
$+vkba:: Нажато("+{vkba}","<НЕТ>")
$vkde:: Нажато("{vkde}","'")
$+vkde:: Нажато("+{vkde}","<НЕТ>")
$vk5a:: Нажато("{vk5a}","z")
$+vk5a:: Нажато("+{vk5a}","Z")
$vk58:: Нажато("{vk58}","x")
$+vk58:: Нажато("+{vk58}","X")
$vk43:: Нажато("{vk43}","c")
$+vk43:: Нажато("+{vk43}","C")
$vk56:: Нажато("{vk56}","v")
$+vk56:: Нажато("+{vk56}","V")
$vk42:: Нажато("{vk42}","b")
$+vk42:: Нажато("+{vk42}","B")
$vk4e:: Нажато("{vk4e}","n")
$+vk4e:: Нажато("+{vk4e}","N")
$vk4d:: Нажато("{vk4d}","m")
$+vk4d:: Нажато("+{vk4d}","M")
$vkbc:: Нажато("{vkbc}","<")
$+vkbc:: Нажато("+{vkbc}","«")
$vkbe:: Нажато("{vkbe}",">")
$+vkbe:: Нажато("+{vkbe}","»")
;;; !!!! ИЗМЕНЕНО ВРУЧНУЮ, СМ. НИЖЕ! $vkbf:: Нажато("{vkbf}","<НЕТ>")
$+vkbf:: Нажато("+{vkbf}","♥")
;;; Конец сгенерированного фрагмента

;; дублируем пробел, как "пробел+буква справа от ю"
$vkbf:: Нажато("{vkbf}"," ")

ПробелУдерживается := 0
ДругаяКнопкаБылаНажатаВоВремяУдержанияПробелаЛи := 0

$Space::
  ; Critical
  ПробелУдерживается := 1
  ДругаяКнопкаБылаНажатаВоВремяУдержанияПробелаЛи := 0
  ; Critical off
  Return

$+Space::
  ; Critical
  ПробелУдерживается := 1
  ДругаяКнопкаБылаНажатаВоВремяУдержанияПробелаЛи := 0
  ; Critical off
  Return

$Space Up:: 
  ; Critical
  if (ДругаяКнопкаБылаНажатаВоВремяУдержанияПробелаЛи == 0) {
    ; Critical off
    Send, {Space}
  }
  ПробелУдерживается := 0
  ДругаяКнопкаБылаНажатаВоВремяУдержанияПробелаЛи := 0
  ; Critical off
  Return

$+Space Up:: 
  ; Critical
  if (ДругаяКнопкаБылаНажатаВоВремяУдержанияПробелаЛи == 0) {
    ; Critical off
    Send, +{Space}
  }
  ПробелУдерживается := 0
  ДругаяКнопкаБылаНажатаВоВремяУдержанияПробелаЛи := 0
  ; Critical off
  Return
 

Нажато(vk,s)
{
  Global
  if (ПробелУдерживается == 1) {
    ДругаяКнопкаБылаНажатаВоВремяУдержанияПробелаЛи := 1
    ; Critical off
    SendInput, %s%
  } Else {
    ; Critical off
    SendEvent, %vk%
  }
}

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

Теперь попробую воспроизвести под Linux

P.S. для тех, кто нагуглит эту тему подвожу итог: решение находится здесь (но, возможно, переедет на gitlab или github в связи с нестабильностью bitbucket): https://bitbucket.org/budden/iaroklava-js/src/master/linux/Яроклава-для-debia...

★★★★★

Заказ пока снимается - взялся сам. Попробовал AutoKey, который вряд ли подходит. Нашёл xcape, который вроде решает задачу. Читаю man.

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

У тебя мозг есть вообще? Я же не профи в этом, поэтому у меня это займёт дольше. В том и смысл разделения труда. Пока вот часа два, наверное, прошло. При моей зарплате порядка 2 тыр в час я ещё не израсходовал свой бюджет :) Задачу назначения пробелу mod5 я решил, всё работает именно как надо. Осталось сделать саму раскладку.

den73 ★★★★★ ()
Ответ на: комментарий от den73
# First, map an unused modifier's keysym to the  spacebar's  key‐
# code and make it a control modifier. It needs to be an existing
# key so that emacs won't spazz out when you press it. Hyper_L is
# a good candidate.

spare_modifier="Hyper_L"
xmodmap -e "keycode 65 = $spare_modifier"
xmodmap -e "remove mod4 = $spare_modifier"
xmodmap -e "add Mod5 = $spare_modifier"

# Next,  map  space  to  an unused keycode (to keep it around for
# xcape to use).

xmodmap -e "keycode any = space"

# Next,  map  space  to  an unused keycode (to keep it around for
#  xcape to use).

xcape -e "$spare_modifier=space"

С помощью Хабра и по мотивам man xcape - пробел стал модификатором, но если нажимать его без всякой другой кнопки, то он остаётся пробелом. Осталось сделать раскладку. Ща посижу немного, но боюсь, что это уже не сегодня.

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

Собираем предыдущую инфу: сделал свою раскладку клавиатуры в офтопике, теперь хочу такую же под Linux - здесь дали советы, но сводятся по-моему к man xmodmap. Забыл упомянуть, что у меня debian кажется etch с lxde и что мне также частично помогли xev и showkey (хотя скорее помешали, т.к. key code черт-те какой показывается и не очень похож на /usr/include/X11/keysymdef.h). Пошёл курить xmodmap.

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

На минуточку, в чем, говоришь, смысл русских ключевых слов в языке?

Посмотрел листинг. Мне вот всеравно хочется на каждый идентификатор в мануал заглянуть, для точности.

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

чем меньше ты (и остальные) будете засирать эту тему левыми обсуждениями, тем более полезной она будет в будущем для всех, кто хочет создать свою раскладку.

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

Вот ещё нашёл.

https://budden73.livejournal.com/26183.html

Сделал такой скрипт (см. в конце) с помощью генератора, который состряпал в https://bitbucket.org/budden/iaroklava-js/src . Но работает он странно - из кнопок п и р с альтом не получается g и h - либо глупая опечатка, либо что-то ещё неведомое. На этом время на сегодня вышло...

xmodmap -e "keycode 49 = U0060 U007e U0451 U0401 U0060 U007e U0060 U007e"
xmodmap -e "keycode 10 = U0031 U0021 U0031 U0021 U263c U2260 U263c U2260"
xmodmap -e "keycode 11 = U0032 U0040 U0032 U0022 U0040 U0040 U0040 U0040"
xmodmap -e "keycode 12 = U0033 U0023 U0033 U2116 U0023 U00a7 U0023 U00a7"
xmodmap -e "keycode 13 = U0034 U0024 U0034 U003b U0024 U2020 U0024 U2020"
xmodmap -e "keycode 14 = U0035 U0025 U0035 U0025 U00b0 U003c U00b0 U003c"
xmodmap -e "keycode 15 = U0036 U005e U0036 U003a U005e U262d U005e U262d"
xmodmap -e "keycode 16 = U0037 U0026 U0037 U003f U0026 U00bf U0026 U00bf"
xmodmap -e "keycode 17 = U0038 U0026 U0038 U002a U003c U003c U003c U003c"
xmodmap -e "keycode 18 = U0039 U0028 U0039 U0028 U003c U003c U003c U003c"
xmodmap -e "keycode 19 = U0030 U0029 U0030 U0029 U003c U003c U003c U003c"
xmodmap -e "keycode 20 = U002d U005f U002d U005f U003c U003c U003c U003c"
xmodmap -e "keycode 21 = U003d U002b U003d U002b U2248 U2261 U2248 U2261"
xmodmap -e "keycode 24 = U0071 U0051 U0439 U0419 U0071 U0051 U0071 U0051"
xmodmap -e "keycode 25 = U0077 U0057 U0446 U0426 U0077 U0057 U0077 U0057"
xmodmap -e "keycode 26 = U0065 U0045 U0443 U0423 U0065 U0045 U0065 U0045"
xmodmap -e "keycode 27 = U0072 U0052 U043a U041a U0072 U0052 U0072 U0052"
xmodmap -e "keycode 28 = U0074 U0054 U0435 U0415 U0074 U0054 U0074 U0054"
xmodmap -e "keycode 29 = U0079 U0059 U043d U041d U0079 U0059 U0079 U0059"
xmodmap -e "keycode 30 = U0075 U0055 U0433 U0413 U0075 U0055 U0075 U0055"
xmodmap -e "keycode 31 = U0069 U0049 U0448 U0428 U0069 U0049 U0069 U0049"
xmodmap -e "keycode 32 = U006f U004f U0449 U0429 U006f U004f U006f U004f"
xmodmap -e "keycode 33 = U0070 U0050 U0437 U0417 U0070 U0050 U0070 U0050"
xmodmap -e "keycode 34 = U005b U007b U0445 U0425 U005b U007b U005b U007b"
xmodmap -e "keycode 35 = U005d U007d U044a U042a U005d U007d U005d U007d"
xmodmap -e "keycode 51 = U005c U007c U005c U002f U007c U003c U007c U003c"
xmodmap -e "keycode 38 = U0061 U0041 U0444 U0424 U0061 U0041 U0061 U0041"
xmodmap -e "keycode 39 = U0073 U0053 U044b U042b U0073 U0053 U0073 U0053"
xmodmap -e "keycode 40 = U0064 U0044 U0432 U0412 U0064 U0044 U0064 U0044"
xmodmap -e "keycode 41 = U0066 U0046 U0430 U0410 U0066 U0046 U0066 U0046"
xmodmap -e "keycode 42 = U0067 U0047 U043f U041f U0067 U0047 U0067 U0047"
xmodmap -e "keycode 43 = U0068 U0048 U0440 U0420 U0068 U0048 U0068 U0048"
xmodmap -e "keycode 44 = U006a U004a U043e U041e U006a U004a U006a U004a"
xmodmap -e "keycode 45 = U006b U004b U043b U041b U006b U004b U006b U004b"
xmodmap -e "keycode 46 = U006c U004c U0434 U0414 U006c U004c U006c U004c"
xmodmap -e "keycode 47 = U003b U003a U0436 U0416 U003c U003c U003c U003c"
xmodmap -e "keycode 48 = U0027 U0022 U044d U042d U0027 U003c U0027 U003c"
xmodmap -e "keycode 52 = U007a U005a U044f U042f U007a U005a U007a U005a"
xmodmap -e "keycode 53 = U0078 U0058 U0447 U0427 U0078 U0058 U0078 U0058"
xmodmap -e "keycode 54 = U0063 U0043 U0441 U0421 U0063 U0043 U0063 U0043"
xmodmap -e "keycode 55 = U0076 U0056 U043c U041c U0076 U0056 U0076 U0056"
xmodmap -e "keycode 56 = U0062 U0042 U0438 U0418 U0062 U0042 U0062 U0042"
xmodmap -e "keycode 57 = U006e U004e U0442 U0422 U006e U004e U006e U004e"
xmodmap -e "keycode 58 = U006d U004d U044c U042c U006d U004d U006d U004d"
xmodmap -e "keycode 59 = U002c U003c U0431 U0411 U003c U00ab U003c U00ab"
xmodmap -e "keycode 60 = U002e U003e U044e U042e U003e U00bb U003e U00bb"
xmodmap -e "keycode 61 = U002f U003f U002e U002c U003c U2665 U003c U2665"

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

Пока не могу решить вопрос об автозапуске во время старта иксов. Нужно, чтобы xcape запускался после того, как настроена клавиатура. А клавиатура, похоже (точно не знаю) настраивается с помощью «панели», т.е. system tray в терминологии офтопика. Вроде это называется lxpanel и в конфиге ~/.config/lxpanel/LXDE/panels я нашёл плагин для xkb, но как туда поставить запуск xcape - не знаю. Может быть, тупо придётся поставить что-нибудь с таймаутом.

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

Ага, вот тут оказывается, что вообще проблема с переключателями Ищется нормальный индикатор раскладки клавиатуры Т.е. я могу сделать, если эти настройки класть в /etc/default/keyboard, но при этом индикатор раскладки ломается.

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

В общем, пока вот так вроде получается:

http://remdev.org/viewtopic.php?id=197#p2925

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

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

Вообще я впечатлён, насколько всё ужасно.

Я всё жду, пока ты признаешься, сколько суммарно времени ушло. Ты дал несколько ссылок в блогах за разные годы. Каждая из них - это часы времени (на изучение/написание). Т.е. ситуация - ты годами целенапраленно изучаешь тему, ушло у тебя на это много часов, но почему-то ты этого не понимаешь и яростно отрицаешь.

Считаешь, что кто-то ещё, будет так же прошарен в этой теме, да ещё потратит меньше чем ты, специалист с 20+ опыта.

Einstok_Fair ★★★ ()

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

Делай нормальное, компилируемое описание в xkb, если хочешь, что бы твоим поделием кто-то пользовался хоть сколько-то продолжительное время.

anonymous ()

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

Негодная идея, юзать для временного перехода пробел. И вообще, как бы ни был удобен пробел в качестве модификатора, хорошего из этого обычно на qwerty ничего не выходит.

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

Да, глюков поимел я и в итоге сделал через xkb + xcape. xcape как-то опирается на xmodmap? Вот список инклюдов, на которые оно опирается

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/time.h>
#include <signal.h>
#include <unistd.h>
#include <pthread.h>
#include <errno.h>
#include <X11/Xlib.h>
#include <X11/keysym.h>
#include <X11/extensions/record.h>
#include <X11/extensions/XTest.h>
#include <X11/XKBlib.h>

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

Обоснуй. На мой взгляд решение годное. Пробел - это единственная кнопка, зажатие которой не мешает печатать 10 пальцами - его можно зажимать любой рукой и при любом смещении кисти. Плюс к тому, переучивания от qwerty практически не требуется. Вот у меня сейчас есть единственная проблема, что нужно ставить мысленную паузу в конце каждого слова, иначе вместо «решение годное» получается «решениеuдное». Ну и плюс к тому правый альт становится пробелом, так что становится неюзабелен по своему старому назначению, но я им и так никогда не пользовался.

Предыдущий вариант состоял в том, чтобы просто поменять правый альт и пробел местами, навесив латиницу на AltGr - это тоже было приемлемое решение, хотя научиться было не так уж легко и набивать пробел стало не совсем удобно.

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

Ни одна из раскладок не использует переназначение обычных клавиш под что-то другое. xcape задумывался не для переназначения пробела, а для придания уже изначально модификатору свойства обычной клавиши (а не наоборот).

Навешивать на пробел роль модификатора просто не удобно. Пауза, необходимая для этого доконает и сделает это очень быстро.

Так же не надо убирать или переназначать альты, т.к. ты не знаешь кто, как, где и для чего их УЖЕ у себя использует.

Если мне нужно набирать текст в той или иной раскладке, я УЖЕ знаю, как мне это делать. Нах мне какие-то левые пробелы с задержками от Васяна?

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

Если ты такой умный, то запили свою собственную клавиатуру. Дарю идею: сейчас слева три клавиши (Ctrl-Win-Alt), а справа четыре (altgr, win, menu, ctrl). А можно сделать по четыре с каждой стороны. Та, которая будет симметрична «меню» - будет переключать.

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

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

Меня вполне устраивает обычная qwerty за 200 рублей, с небольшими переназначениями. И пробел в эти переназначения уж точно не входит. Если бы это было так удобно, то уже пол мира в линуксе сидели бы на пробеле в качестве модификатора. Да вот только чо-то мужики то не стремятся всем об этом рассказать, как это «удобно». Задержечка-с вносит ложку дерьма в бочку с мёдом, превращая её в бочку дерьма.

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

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

Ни одна из раскладок не использует переназначение обычных клавиш под что-то другое.

Ну так бывает - сначала ни одна, а потом все. Это просто консерватизм пока что, никакого содержания.

Пауза, необходимая для этого доконает и сделает это очень быстро.

Посмотрим. Пока не доканала (сегодня с утра пишу в этой раскладке, и до этого тоже баловался периодически). При этом я помню, как трудно было учиться печатать 10 пальцевым-методом и готов к длительному дискомфорту на время обучения. К пробелу можно привыкнуть и печатать быстро. К переключению раскладки для ввода <p>текст</p> привыкнуть тоже можно, но сколько не привыкай, всё равно печатать будешь медленно, поскольку в этом фрагменте - нужно переключать раскладку 4 раза.

xcape задумывался не для

man xcape

Так же не надо убирать или переназначать альты

Я убираю только правый альт, который никогда и нигде не использовался мной. Хотя я в большинстве программ стараюсь пользоваться клавиатурой. А не использовался он мной, потому что он и предназначен именно для ввода 3-го и 4-го слоя, этим активно пользуются (less /usr/share/X11/xkb/symbols/de) и в нормальных программах его не задействуют. Поскольку Джонам на Васянов наплевать в гораздо большей степени, чем на Гансов, я не думаю, что кто-то рукопожатый от моих действий пострадает lol :)

я УЖЕ знаю, как мне это делать

Ок, делай, а зачем ты тогда в этой теме? Других людей спасти от яро-угрозы?

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