د لینکس لپاره د Xswitcher ترتیب اصلاح کونکی: دوهم ګام

راهیسې پخوانۍ خپرونه (xswitcher په "د مفهوم ثبوت" مرحله کې) خورا ډیر رغنده فیډبیک ترلاسه کړ (کوم چې ښکلی دی)، ما خپل وړیا وخت د پروژې پراختیا ته دوام ورکړ. اوس زه غواړم ستاسو لږ څه مصرف کړم ... دوهم ګام به ډیر معمول نه وي: د ترتیب ډیزاین وړاندیز / بحث.

د لینکس لپاره د Xswitcher ترتیب اصلاح کونکی: دوهم ګام

یو څه دا معلومه شوه چې نورمال پروګرام کونکي د دې ټولو کنټرولونو تنظیم کولو لپاره په زړه پورې ډول ستړي کوي.

د دې لپاره چې بې بنسټه نه وي، دننه د هغه څه مثال دی چې زه ورسره معامله کوم.
په ټولیز ډول په ښه توګه تصور شوی (او ښه پلي شوی) اپاچی کافکا او زوکیپر.
- ترتیب؟ مګر دا ستړي ده! ګونګ xml (ځکه چې دا د "بکس څخه بهر" دی).
- هو، ایا تاسو هم ACL غواړئ؟ مګر دا ډیر ستړی دی! ټاپ-بلوپر ... یو څه ورته.

مګر زما په کار کې دا بالکل برعکس دی. سمه ده (افسوس، تقریبا هیڅکله لومړی ځل نه دی) جوړ شوی ماډل تاسو ته اجازه درکوي چې نور په اسانۍ او طبیعي توګه دوام ورکړئ (تقریبا) یو ډیاګرام راټول کړئ.

ما پدې وروستیو کې د ډیټا ساینس پوهانو د سخت کار په اړه د هابري په اړه یوه مقاله ولیده ...
دا معلومه شوه چې دا شیبه د دوی لپاره په بشپړه توګه احساس شوې. او زما په عمل کې، لکه څنګه چې دوی وايي، "رڼا نسخه". د څو حجم ماډلونه، د OOP سره تجربه لرونکي پروګرامونکي چمتو دي، او داسې نور. - دا ټول به وروسته ښکاره شي کله / که دا پیل شي. مګر ډیزاینر باید دلته او اوس له کوم ځای څخه پیل وکړي.

نقطې ته ورسیږئ. ما TOML د ترکیب اساس په توګه واخیست له دې تبعه څخه.

ځکه چې هغه (TOML) له یوې خوا، د انسان د تدوین وړ. له بلې خوا، دا 1: 1 په نورو عام ترکیبونو کې ژباړل شوی: XML، JSON، YAML.
سربیره پردې ، هغه پلي کول چې ما د "github.com/BurntSushi/toml" څخه کارولي ، که څه هم خورا فیشني ندي (لا هم 1.4 ترکیب) ، په ترکیب کې د ورته ("بلټ ان") JSON سره مطابقت لري.

دا دی، که تاسو وغواړئ، تاسو کولی شئ په ساده ډول ووایاست "ستاسو د TOML سره د لرګیو له لارې لاړ شئ، زه XXX غواړم" او کوډ یوازې د یوې کرښې سره "پیچ" کړئ.

پدې توګه ، که تاسو غواړئ د xswitcher تنظیم کولو لپاره ځینې وینډوز ولیکئ (زه ډاډه نه یم) د کومې ستونزې تمه نه کیږي "ستاسو د دې ناوړه ترتیب سره."

د نورو ټولو لپاره، ترکیب د "کیلي = ارزښت" پر بنسټ والړ دی (او په حقیقت کې یو څو نور پیچلي اختیارونه، لکه = [ځینې، هغه، سرې]) زه فکر کوم
په شعوري ډول اسانه.
هغه څه چې په زړه پورې دي "سوځول" په ورته وخت کې (شاوخوا 2013). یوازې، زما په څیر، د TOML لیکوال په سمه پیمانه لاړ.

له همدې امله، اوس زما لپاره دا اسانه ده چې د دې پلي کول د ځان سره سم تنظیم کړم، نه برعکس.

په عموم کې، موږ TOML اخلو (ډیر د زاړه وینډوز INI سره ورته). او موږ یو ترتیب لرو چې پکې موږ تشریح کوو چې څنګه د کیبورډ څخه د وروستي سکین کوډونو سیټ پورې اړوند د هکونو لړۍ ضمیمه کړو. لاندې، ټوټه ټوټه، هغه څه دي چې تر دې دمه پیښ شوي. او د دې وضاحت چې ولې ما دا پریکړه وکړه.

0. بنسټیز خلاصون

  • د سکین کوډ نومونه. په دې اړه یو څه باید ترسره شي، ځکه چې په ساده ډول ډیجیټل کوډونه د انسان د لوستلو وړ ندي (دا یوازې زه یم loloswitcher).
    ما "ecodes.go" د "ګولنګ - ایوډیف" څخه وغورځاوه (زه د اصلي سرچینې په لیدو کې خورا سست وم ، که څه هم لیکوال دا په کلتوري توګه اشاره کړې). ما یو څه (د اوس لپاره) یو څه سم کړل چې خورا ډارونکی و. لکه "لیفټبریس" → "L_BRACE".
  • برسیره پردې، هغه د "دولت کیلي" مفهوم معرفي کړ. ځکه چې کارول شوي منظم ګرامر د اوږدې مودې لپاره اجازه نه ورکوي. (مګر دا تاسو ته اجازه درکوي د لږترلږه سر سره وګورئ. که تاسو یوازې "مستقیم" ریکارډ کاروئ.)
  • دلته به د هغه څه په اړه جوړ شوی "ډیډپلیکټور" وي چې فشار راوړي. په دې توګه، حالت "تکرار" = 2 به لیکل کیږي один وخت

1. د کينډۍ برخه

[Templates] # "@name@" to simplify expressions
 # Words can consist of these chars (regex)
 "WORD" = "([0-9A-Z`;']|[LR]_BRACE|COMMA|DOT|SLASH|KP[0-9])"

د انساني ژبې کلمه د فونیټیک یادښت سره څه شی لري؟ (یا د ګرافیمونو مسله عرف "هیرګلیف")؟ یو ډول ډارونکی "پاڼه". له همدې امله زه سمدلاسه د "کینډۍ" مفهوم معرفي کوم.

2. څه باید وکړو کله چې یو څه کلیک شي (بل سکین کوډ راغلی)

[ActionKeys]
 # Collect key and do the test for command sequence
 # !!! Repeat codes (code=2) must be collected once per key!
 Add = ["1..0", "=", "BS", "Q..]", "L_CTRL..CAPS", "N_LOCK", "S_LOCK",
        "KP7..KPDOT", "R_CTRL", "KPSLASH", "R_ALT", "KPEQUAL..PAUSE",
        "KPCOMMA", "L_META..COMPOSE", "KPLEFTPAREN", "KPRIGHTPAREN"]

 # Drop all collected keys, including this.  This is default action.
 Drop = ["ESC", "-", "TAB", "ENTER", "KPENTER", "LINEFEED..POWER"]
 # Store extra map for these keys, when any is in "down" state.
 # State is checked via "OFF:"|"ON:" conditions in action.
 # (Also, state of these keys must persist between buffer drops.)
 # ??? How to deal with CAPS and "LOCK"-keys ???
 StateKeys = ["L_CTRL", "L_SHIFT", "L_ALT", "L_META", "CAPS", "N_LOCK", "S_LOCK",
              "R_CTRL", "R_SHIFT", "R_ALT", "R_META"]

 # Test only, but don't collect.
 # E.g., I use F12 instead of BREAK on dumb laptops whith shitty keyboards (new ThinkPads)
 Test = ["F1..F10", "ZENKAKUHANKAKU", "102ND", "F11", "F12",
          "RO..KPJPCOMMA", "SYSRQ", "SCALE", "HANGEUL..YEN",
          "STOP..SCROLLDOWN", "NEW..MAX"]

په ټولیز ډول 768 کوډونه شتون لري. (مګر "یوازې په هغه حالت کې" ما د xswitcher کوډ کې د "حیرانتیا" نیول داخل کړل).
دننه ما د فنکشنونو لینکونو سره د صف ډکول تشریح کړل "څه باید وکړو". په ګولنګ کې دا دی (ناڅاپه) دا اسانه او څرګند شو.

  • زه پلان لرم چې پدې ځای کې لږ تر لږه "ډراپ" راټیټ کړم. د ډیر انعطاف وړ پروسس کولو په ګټه (زه به یې لاندې وښیم).

3. د کړکۍ ټولګیو سره میز

# Some behaviour can depend on application currently doing the input.
[[WindowClasses]]
 # VNC, VirtualBox, qemu etc. emulates there input independently, so never intercept.
 # With the exception of some stupid VNC clients, which does high-level (layout-based) keyboard input.
 Regex = "^VirtualBox"
 Actions = "" # Do nothing while focus stays in VirtualBox

[[WindowClasses]]
 Regex = "^konsole"
 # In general, mouse clicks leads to unpredictable (at the low-level where xswitcher resides) cursor jumps.
 # So, it's good choise to drop all buffers after click.
 # But some windows, e.g. terminals, can stay out of this problem.
 MouseClickDrops = 0
 Actions = "Actions"

[[WindowClasses]] # Default behaviour: no Regex (or wildcard like ".")
 MouseClickDrops = 1
 Actions = "Actions"

د میز قطارونه د نوم سره په دوه مربع قوسونو کې دي. دا د بیټ څخه سمدلاسه اسانه نه و. د اوسني فعال کړکۍ پورې اړه لري، تاسو کولی شئ لاندې اختیارونه وټاکئ:

  • ستاسو د "ګرم کیلي" "عمل = …" خپل سیټ. که نه / خالي وي، هیڅ کار مه کوئ.
  • "MouseClickDrops" بدل کړئ - څه باید وکړئ کله چې د موږک کلیک کشف شي. له هغه ځایه چې xswitcher فعال شوی د "چیرته چې دوی کلیک کوي" په اړه هیڅ توضیحات شتون نلري ، موږ بفر په ډیفالټ بیا تنظیم کوو. مګر په ترمینلونو کې (د مثال په توګه) تاسو اړتیا نلرئ دا کار وکړئ (معمولا).

4. د کلیکونو یوه (یا څو) سلسله یو یا بل هک هڅوي

# action = [ regex1, regex2, ... ]
# "CLEAN" state: all keys are released
[Actions]
# Inverse regex is hard to understand, so extract negation to external condition.
# Expresions will be checked in direct order, one-by-one. Condition succceds when ALL results are True.
 # Maximum key sequence length, extra keys will be dropped. More length - more CPU.
 SeqLength = 8
 # Drop word buffer and start collecting new one
 NewWord = [ "OFF:(CTRL|ALT|META)  SEQ:(((BACK)?SPACE|[LR]_SHIFT):[01],)*(@WORD@:1)", # "@WORD@:0" then collects the char
             "SEQ:(@WORD@:2,@WORD@:0)", # Drop repeated char at all: unlikely it needs correction
             "SEQ:((KP)?MINUS|(KP)?ENTER|ESC|TAB)" ] # Be more flexible: chars line "-" can start new word, but must not completelly invalidate buffer!
 # Drop all buffers
 NewSentence = [ "SEQ:(ENTER:0)" ]

 # Single char must be deleted by single BS, so there is need in compose sequence detector.
 Compose = [ "OFF:(CTRL|L_ALT|META|SHIFT)  SEQ:(R_ALT:1,(R_ALT:2,)?(,@WORD@:1,@WORD@:0){2},R_ALT:0)" ]

 "Action.RetypeWord" = [ "OFF:(CTRL|ALT|META|SHIFT)  SEQ:(PAUSE:0)" ]
 "Action.CyclicSwitch" = [ "OFF:(R_CTRL|ALT|META|SHIFT)  SEQ:(L_CTRL:1,L_CTRL:0)" ] # Single short LEFT CONTROL
 "Action.Respawn" = [ "OFF:(CTRL|ALT|META|SHIFT)  SEQ:(S_LOCK:2,S_LOCK:0)" ] # Long-pressed SCROLL LOCK

 "Action.Layout0" = [ "OFF:(CTRL|ALT|META|R_SHIFT)  SEQ:(L_SHIFT:1,L_SHIFT:0)" ] # Single short LEFT SHIFT
 "Action.Layout1" = [ "OFF:(CTRL|ALT|META|L_SHIFT)  SEQ:(R_SHIFT:1,R_SHIFT:0)" ] # Single short RIGHT SHIFT

 "Action.Hook1" = [ "OFF:(CTRL|R_ALT|META|SHIFT)  SEQ:(L_ALT:1,L_ALT:0)" ]

هکونه په دوه ډوله ویشل شوي دي. جوړ شوی، د "وغولو" نومونو سره (NewWord، NewSentence، Compose) او د پروګرام وړ.

د پروګرام وړ نومونه د "عمل" سره پیل کیږي. ځکه TOML v1.4، د نقطو سره نومونه باید په نرخونو کې وي.

هره برخه باید لاندې تشریح شي په ورته نوم سره.

د دې لپاره چې د خلکو ذهنونه د "ننګو" منظمو سره ونه وهل شي (د تجربې څخه، د دوی لیکلشاید یو له لسو څخه مسلکیان)، زه سمدلاسه اضافي ترکیب پلي کوم.

  • "بند:" (یا "آن:") مخکې لدې چې regexp (منظم بیان) ته اړتیا لري چې لاندې بټن خوشې شي (یا فشار ورکړئ).
    بل زه به یو "غیر عادلانه" منظم بیان وکړم. د پایپونو تر مینځ د ټوټو جلا چیک کولو سره "|". د ریکارډونو شمیر کمولو لپاره لکه "[LR] _SHIFT" (چیرې چې دا په واضح ډول اړین ندي).
  • "SEQ:" که پخوانی شرط پوره شوی وي (یا غیر حاضر)، نو موږ د "نورمال" منظم بیان په مقابل کې ګورو. د جزیاتو لپاره، زه سمدلاسه د ^W "regexp" کتابتون ته لیږم. ځکه چې ما تر اوسه پورې زما د خوښې pcre ("perl مطابقت") سره د مطابقت درجې موندلو زحمت نه دی کړی.
  • بیان په بڼه لیکل شوی "BUTTON_1: CODE1، BUTTON_2: CODE2" او داسې نور، په هغه ترتیب کې چې د سکین کوډونه ترلاسه کیږي.
  • چک تل د ترتیب پای ته "سنګ شوی" وي، نو په دم کې د "$" اضافه کولو ته اړتیا نشته.
  • په یوه لیکه کې ټول چکونه یو له بل وروسته ترسره کیږي او د "I" لخوا یوځای شوي. مګر څرنګه چې ارزښت د سرې په توګه بیان شوی، تاسو کولی شئ د کوما وروسته یو بدیل چک ولیکئ. که دا د کوم دلیل لپاره اړین وي.
  • ارزښت "SeqLength = 8" د بفر اندازه محدودوي چې په مقابل کې ټول چکونه ترسره کیږي. ځکه ما (تر دې دمه) هیڅکله زما په ژوند کې د نه ختمیدونکي سرچینو سره مخ شوی.

5. د هکونو تنظیم کول چې په تیرو برخه کې تشریح شوي

# Action is the array, so actions could be chained (m.b., infinitely... Have I to check this?).
# For each action type, extra named parameters could be collected. Invalid parameters will be ignored(?).
[Action.RetypeWord] # Switch layout, drop last word and type it again
 Action = [ "Action.CyclicSwitch", "RetypeWord" ] # Call Switch() between layouts tuned below, then RetypeWord()

[Action.CyclicSwitch] # Cyclic layout switching
 Action = [ "Switch" ] # Internal layout switcher func
 Layouts = [0, 1]

[Action.Layout0] # Direct layout selection
 Action = [ "Layout" ] # Internal layout selection func
 Layout = 0

[Action.Layout1] # Direct layout selection
 Action = [ "Layout" ] # Internal layout selection func
 Layout = 1

[Action.Respawn] # Completely respawn xswitcher. Reload config as well
 Action = [ "Respawn" ]

[Action.Hook1] # Run external commands
  Action = [ "Exec" ]
  Exec = "/path/to/exec -a -b --key_x"
  Wait = 1
  SendBuffer = "Word" # External hook can process collected buffer by it's own means.

اصلي خبره دلته ده "عمل = [لری]". د تیرې برخې په څیر، د جوړ شوي کړنو محدود سیټ شتون لري. او د ډاک کولو امکان په اصولو کې محدود ندی ("Action.XXX" ولیکئ او د دې لپاره بله برخه لیکلو کې سست مه کوئ).
په ځانګړې توګه، په سمه ترتیب کې د یوې کلمې بیا ټایپ کول په دوو برخو ویشل شوي دي: "لکه څنګه چې هلته مشخص شوي ترتیب بدل کړئ" и "بیا ټایپ" ("ریټایپ ورډ").

پاتې پارامترونه "لغت" ته لیکل شوي ("نقشه" په ګولنګ کې) د ورکړل شوي عمل لپاره، د دوی لیست په هغه څه پورې اړه لري چې په "عمل" کې لیکل شوي.

څو مختلف عملونه په یوه مجموعه کې تشریح کیدی شي (برخې). یا تاسو کولی شئ دا جلا کړئ. لکه څنګه چې ما پورته ښودلې.

ما سمدلاسه د بهرني سکریپټ اجرا کولو لپاره "Exec" عمل تنظیم کړ. د ثبت شوي بفر stdin ته د فشار ورکولو اختیار سره.

  • "انتظار = 1" - د روانې پروسې بشپړیدو ته انتظار وکړئ.
  • شاید، "ډېرې ته" تاسو غواړئ په چاپیریال کې اضافي خلک ځای په ځای کړئ. معلومات لکه د کړکۍ ټولګي نوم چې له هغې څخه یې مخنیوی شوی و.
    "ایا تاسو غواړئ خپل هینډر سره وصل کړئ؟ دا هغه ځای دی چې تاسو باید لاړ شئ."

اوښ (په تنفس کې). داسې ښکاري چې ما هیڅ شی نه دی هیر کړی.

اوف! هو، ما هېر نه کړ ...
د لانچ ترتیب چیرته دی؟ په سخت کوډ کې؟ لکه:

[ScanDevices]
 # Must exist on start. Self-respawn in case it is younger then 30s
 Test = "/dev/input/event0"
 Respawn = 30
 # Search mask
 Search = "/dev/input/event*"
 # In my thinkPads there are such a pseudo-keyboards whith tons of unnecessary events
 Bypass = "(?i)Video|Camera" # "(?i)" obviously differs from "classic" pcre's.

ما چیرته هیر کړی/ تېروتنه وکړه؟ (له دې پرته هیڅ لاره نشته)، زه واقعیا هیله لرم چې متوجه لوستونکي به دومره سست نه وي چې خپلې پوزې وخورئ.

ښه چانس!

سرچینه: www.habr.com

Add a comment