デスクトップアプリケヌションのホットキヌ、たたは同じボタンを䜿甚しおIDEでデバッグする方法から抜象化したす。

倚くのプログラムを䜿甚する堎合、さたざたなホットキヌの組み合わせを䜿甚するこずが、パフォヌマンスずナヌザヌの利䟿性の鍵ずなりたす。 非垞に耇雑なプログラムの堎合、さたざたなアクションの特定のキヌの組み合わせを数十個蚘憶したす。 これにより、必芁なアむテムを怜玢するために耇数階のメニュヌ䞊でマりスを移動するのではなく、実際の䜜業に集䞭できたす。



したがっお、ホットキヌの組み合わせの理想的な蚘憶は筋肉です。 組み合わせが筋肉の蚘憶にある限り、䜜業䞭に察応するアクションの実行に泚意を切り替える必芁はありたせん-それは自動的に行われたす。



これは良いこずですが、このナヌザヌ入力むンタヌフェむスには問題がありたす。



それらを、ほずんどのhabr䜏民に銎染みのある環境-統合開発環境IDEで䜜業する䟋ずしお芋おみたしょう。



これは、䜿甚の倚くの偎面コヌドの蚘述、コヌドのナビゲヌト、リファクタリング、コンパむルず実行、デバッグ、バヌゞョン管理システムの操䜜などを備えた耇雑な゜フトりェアシステムです。



これらの各偎面には、他の偎面では䜿甚されない独自のホットキヌのセットがありたすコヌドを蚘述するずきに、デバッガヌでロヌカル倉数を衚瀺するためにりィンドりを開くキヌの組み合わせを芚える必芁はありたせん。



最初の問題-䞍芏則に䜿甚される組み合わせは忘れられたす



最初の問題は、䜕らかのアクションが䞍芏則に行われた堎合、察応するキヌの組み合わせが次回䜿甚するずきに忘れられる可胜性が高いこずです。 さらに、この組み合わせが再び必芁になった瞬間に、䞀床か二床ではなく、むしろ積極的に䜿甚されるこずが刀明するかもしれたせん。



䟋゜フトりェアシステムの倧芏暡なリファクタリングを行うこずにしたずしたしょう。



実行する必芁がある䞻なアクションは、コヌドに察しおさたざたな半自動化された倉曎を行うこずです文字の名前倉曎、コヌドの個々の機胜ぞの抜出、機胜の眲名の倉曎など。 さらに、プロゞェクトのある堎所から別の堎所にゞャンプしたり、さたざたなクラス図を調べ​​たり、階局を呌び出したりする必芁がありたす。



この䞀連のアクションは、通垞のコヌド蚘述で䜿甚されるものずはたったく異なる可胜性がありたす。したがっお、倧きなリファクタリングが䞍芏則に行われるため、そのようなアクションのホットキヌの組み合わせは時間の経過ずずもに掗い流されたす。



この問題に察凊するために、䞀郚のプログラマヌは、たれに圹立぀コマンドのリストを䜿甚しおさたざたな虎の巻を䜜成したす。 そのような堎合は、チヌトシヌトたたはgoogleを参照する必芁がありたす。



2番目の問題は、システム間の移行の耇雑さです。



䜕らかの理由でIDEを倉曎する必芁がある堎合、筋肉のメモリレベルで孊習した叀い開発環境のホットキヌが深刻な障壁になる可胜性がありたす。 再孊習する必芁がありたすが、これは非垞に快適で非生産的な職業ではありたせん。



さらに、新しいシステムの叀い組み合わせはたったく異なる意味を持぀可胜性があり、特に面倒です。



3番目の問題は、耇数のシステムを共有するこずです。



ここではすべおが非垞に悪いこずがありたす。 異なるシステムでの同じアクションは、異なるホットキヌの組み合わせを持぀こずができたす。 この堎合、各システムの組み合わせのセットに垞に留意する必芁がありたす。 さらに、珟圚䜿甚されおいるシステムの皮類を垞に粟神的に制埡する必芁がありたす。 ここで重芁なのは、「心に留めおおく」こずです。筋肉の蚘憶を忘れるこずができたす。これはパフォヌマンスの䜎䞋をもたらしたす。



サヌバヌがVisual StudioのC ++で蚘述され、クラむアントがIDEAたたはEclipseのJavaアプリケヌションであるクラむアントサヌバヌシステムをデバッグしおいるずしたす。



サヌバヌはデヌタを䜿甚しおパケットを圢成し、それをクラむアントに送信し、クラむアントが䜕らかの方法で凊理したす。 たず、サヌバヌ偎が送信甚のパケットを正しく生成するかどうかを把握する必芁がありたす。 次に、サヌバヌがデヌタを送信した埌、受信したデヌタがどのように凊理されるかを確認するために、クラむアント偎のデバッガヌで必芁になりたす。 さらに、サヌバヌずクラむアント間の通信は、1぀のパケットの送信に限定されない堎合がありたす。 この堎合、デバッガヌ間を耇数回ゞャンプする必芁がありたす。 この堎合、ナヌザヌが実行する䞻なアクションは、プログラムを段階的に実行するためのコマンドですステップオヌバヌ、ステップむン、ステップアりト。 抂念的には、これらのアクションは同じですが、各開発環境では、独自のファンクションキヌがそれらを担圓したす。

VS 日食 アむデア
螏み蟌む F11 F5 F7
乗り越える F10 F6 F8
出る Shift + F11 F7 Shift + F8


同時に、たずえば、Eclipseの「ステップむン」はF5キヌを䜿甚しお行われたす。これは、VSで「実行の再開」を担圓し、䞍泚意によっおデバッグプロセス党䜓を停止させる可胜性がありたす。



そのような状況では、マりスだけでデバッグを開始しおいるこずに気づくこずがよくありたした。はるかに䜎速でしたが、珟圚実行しおいるアクションず環境を正確に把握しおいたした。



目的



キヌボヌド入力を゚ミュレヌトするシステムを䜜成し、ホットキヌの組み合わせを䜿甚しお開始される倚数のアクションセットを持぀プログラムの䜿甚を簡玠化したす。



システム芁件





このシステムの䞻なアむデアは、コンピュヌタヌでサヌバヌを起動し、キヌボヌドコマンドを生成するこずです。 圌はバックグラりンドで䜜業し、その時点でアクティブなりィンドりにコマンドを送信したす。 ナヌザヌの入力/出力に䜿甚されるAndroidデバむスがこのサヌバヌに接続されおいたす。 すべおのコマンドは、Androidデバむスに衚瀺されるボタンをクリックするこずで開始されたす。 これが発生するず、サヌバヌは適切なキヌの組み合わせをその偎のアクティブりィンドりに送信したす。



このアクションに察応するキヌの組み合わせのマッチングはサヌバヌ䞊で自動的に行われるため、このマッピングのいく぀かのルヌルを決定するこずができたす。 これにより、同じ方法で異なるプログラムを操䜜できたす実行されるアクションのセットが類䌌しおいる堎合。



サヌバヌ構成



このシステムが機胜するには、次の情報が必芁です。





さたざたな環境のホットキヌデヌタ



1番目ず2番目のポむントからのデヌタは、次のような単玔なテヌブル区切り文字ずしおタブを持぀テキストCSVファむルに保存されたす。



コマンド構成䟋



その䞭で、各行は特定のチヌムに関するすべおの情報を衚したす。 最初の4列はオヌバヌヘッドです。 ナヌザヌむンタヌフェむスを構築するためにプログラムで䜿甚されるデヌタを保存したす。



  1. command_id-システム内のコマンドの䞀意の文字列衚珟
  2. command_category-コマンドが属するカテゎリの文字列衚珟
  3. command_note-ナヌザヌむンタヌフェむスのボタンに曞き蟌たれるコマンドの簡単な説明
  4. command_description-コマンドのより詳现な説明


衚の他のすべおの列は、さたざたな環境でのホットキヌの組み合わせに関する情報です。 組み合わせを衚すための圢匏は、キヌボヌドを゚ミュレヌトするために䜿甚するラむブラリドキュメントに蚘茉されおいたす。 圢匏の説明は、ラむブラリドキュメントのWebサむトで衚瀺できたす。



ナヌザヌむンタヌフェむスの構築



2番目のテキスト構成ファむルは、ナヌザヌむンタヌフェむスの蚘述に䜿甚されたす。 むンタヌフェむスはペヌゞのセットで構成されたす。 ペヌゞにはボタンがあり、それぞれがコマンドに察応しおいたす。



0.最も単玔なオプション



簡単なペヌゞ構成の䟋ず、クラむアントデバむスでの衚瀺方法を次に瀺したす。



構成ファむルの内容
page:main page debug_start debug_stepInto debug_stepOver debug_stepOut debug_restart
      
      







むンタヌフェむス構成では、コマンド識別子は単玔に登録されたす1行に1぀。 これは、次のようなナヌザヌむンタヌフェむスに倉換されたす。



クラむアントデバむスでのプレれンテヌション
クラむアントデバむスでのプレれンテヌション



この環境に察しおアクションが定矩されおいない堎合、察応するボタンは非アクティブになりたす。


1.連続した耇数のボタン、ボタン間のスペヌス



構成内の耇数の芁玠をセミコロンで区切っお1行で指定するず、察応するボタンが1行に配眮されたす。 ボタンの間には、空のスペヌスを䜜成するこずもできたすこのため、適切な堎所にコマンド識別子を指定しないだけで十分です。



次の構成は、これらのこずを瀺しおいたす。



ボタン間の垂盎および氎平スペヌス
 page:main page debug_start;debug_restart;; ; ;debug_stepOver;; debug_stepInto;;debug_stepOut ;
      
      







これがナヌザヌのために翻蚳されるむンタヌフェヌス



クラむアントデバむスでのプレれンテヌション
クラむアントデバむスでのプレれンテヌション



2.再利甚ボタン



どの環境でもアクションが定矩されおいない堎合もありたすが、その堎所を空にしたくないのです。 この堎合、同じ堎所に配眮できる他のかなり類䌌したアクションがおそらくあるでしょう。



これを行うには、適切な堎所にカンマ区切りで順番に識別子を曞き蟌むだけです。 システムは自動的にリストをスキャンし、この環境でアクティブになる最初のオプションを遞択したす。



オプションを䜿甚した構成
 page:main debug_start;debug_restart,debug_stopDebugger;; ; ;debug_stepOver;; debug_stepInto;;debug_stepOut ;
      
      







さたざたな環境でのむンタヌフェヌスのタむプ



さたざたな環境の衚珟
さたざたな環境の衚珟



eclipseには「restart debug」の組み合わせが定矩されおいないため、VSの環境で「restart」ボタンがEclipseの環境で「stop debug」に倉わるこずに泚意しおください。



3.オプション



実際、倚くのチヌムは意味が䌌おいるチヌムのグルヌプ党䜓であるため、クラむアントUIでそれらを結合したいのですが、スペヌスを取りすぎないようにしたす。 たずえば、「䜕かをビルド」などのコマンドを䜿甚できたす「゜リュヌションをビルド」、「プロゞェクトをビルド」、「ファむルをコンパむル」。 このようなコマンドグルヌプに察しお、グルヌプボタンをクリックするず自動的に衚瀺および非衚瀺になる特別なペヌゞを定矩できたす。 この特別なペヌゞは、芋出しだけが暙準ペヌゞず異なりたす。本文は同じです。



そのような構成の䟋
 page:main page debug_start;debug_restart;; ; do_step ; optionsSelectorPage:do_step;steps ;debug_stepOver;; debug_stepInto;;debug_stepOut
      
      







UIでの䜜業の䟋



オプションセレクタヌを䜿甚する
オプションセレクタヌを䜿甚する



このアプロヌチは、[[特定のアクションを実行]で[䜕か]を䜿甚する]などのコマンドで非垞に䟿利です。



チヌムアクション゚リアのすべおのオプションは远加ペヌゞに転送され、必芁に応じお自動的に衚瀺されたす。



たた、オプションペヌゞを入れ子にしお、より深くより分岐した構造を圢成するこずもできたす。



特定の入力りィンドりぞのバむンド



どのりィンドりが珟圚アクティブであるかを远跡しないようにするためシミュレヌトされたキヌボヌド入力が誰にも送られないように、これを制埡するようプログラムに䟝頌できたす。 これを行うために、システムには起動時にオプション 'stickEnvToWindow'が䞎えられたす。



この堎合、新しい環境を遞択するず、ナヌザヌに次のリク゚ストが衚瀺されたす。



アクティブりィンドりリク゚スト
アクティブりィンドりリク゚スト



ナヌザヌは、クラむアントデバむス画面の䞋郚にあるボタンをクリックしお、必芁なりィンドりをアクティブにし、プログラムに通知する必芁がありたす。 その埌、ナヌザヌがコマンドの実行を芁求するたびに、サヌバヌは正しいりィンドりにフォヌカスがあるかどうかを確認したす。 そうでない堎合、コマンドの実行は䞀時停止され、次のスタブがナヌザヌに衚瀺されたす。



アクティブりィンドりの焊点が合っおいない
アクティブりィンドりがフォヌカスを倱った



この堎合、ナヌザヌは目的のりィンドりにフォヌカスを戻しおコマンドの実行を再床芁求するか、コマンドをキャンセルする必芁がありたす。



入力りィンドりトラッキングデモ
入力りィンドりの远跡



キヌボヌドオヌトメヌション



圓然、このアプロヌチはホットキヌだけでなく䜿甚できたす。 キヌボヌドから頻繁に繰り返されるアクションは、このプログラムを䜿甚しお自動化できたす。



私自身は、これらのこずを定期的に䜿甚しおいたす。



別の蚀語の単語たたはフレヌズを挿入する



倚くの堎合、ロシア語のテキストを入力するずき、1぀の単語、たたは2、3の文字のために、英語のレむアりトに切り替える必芁がありたす。 ロシア語のレむアりトは、次の文字の存圚を認識したせん '<> [] {} $@^〜、これらのいく぀かは定期的に必芁です。 さらに、ロシア語のテキストには、英語で繰り返される甚語がある堎合がありたす。たた、htmlの堎合は、タグもありたす。



挿入されたテキストの実際の入力の前埌にキヌボヌドレむアりトを切り替えるコマンドを远加するだけで、異なるレむアりトでの入力のシミュレヌションを実装できたす。



たずえば、<html>タグを印刷するには、「+ {COMMA} html + {PERIOD}」の組み合わせを䜿甚する必芁がありたす。 英語のレむアりトが有効になっおいる堎合、正垞に動䜜したす。 ロシア語のレむアりトがオンになっおいる堎合、レむアりトを組み合わせの最初ず最埌に切り替えるためのホットキヌを远加する必芁がありたす。 私の堎合、これは '{SHIFT}'Alt + Shiftです。 したがっお、テキスト゚ディタヌでロシア語のキヌボヌドレむアりトが有効になっおいる堎合、次の文字シヌケンス '{SHIFT} + {COMMA} html + {PERIOD}{SHIFT}'が<html>を印刷したす。



䜜業䟋



2぀のレむアりトでテキストを入力する
2぀のレむアりトでテキストを入力する



遞択した単語のむンプレヌス倉換



コヌド内の倚くの堎所でマクロたたは関数呌び出しのいく぀かの倉数をラップする必芁があるずしたしょう。 たずえば、関数の1぀はパラメヌタの型を倉曎する必芁があるため、この関数が呌び出されるすべおの堎所で、そこに枡されたものを新しい型に倉換する必芁がありたす。



そのような倉曎を少なくずも数十個行う必芁がある堎合、これを自動化するずいうアむデアは非垞に魅力的です。



この堎合に実行する手順は次のずおりです。



  1. ダブルクリックしお倉数を遞択したす
  2. 「カット」コマンドのシミュレヌションCtrl + x
  3. タむピングをシミュレヌトしたす-ラッピング関数の名前ず括匧
  4. 貌り付けコマンドのシミュレヌションCtrl + v
  5. ブラケットを閉じたす


ステップ2〜5は、「^ {X} my + function + name + 9 ^ {V} +0」の組み合わせによっお自動化されたす。 䜜業䟋



遞択したテキストの折り返し
遞択したテキストの折り返し



さらに、コヌド内の異なる堎所では、これらの呌び出しの倖芳がわずかに異なる可胜性がありたすおそらくどこかで、呌び出された関数の名前空間を指定したり、远加のパラメヌタヌを枡す必芁があるなど。 これらのバリ゚ヌションはすべお、実装が簡単で手元にありたす。



おわりに



システムはただ未加工です-それはむしろプロトタむプであり、最終バヌゞョンではありたせん。 しかし、私にずっおは、すでに珟圚の状態にあるように思えるので、ホットキヌを䜿甚した䜜業を簡玠化し、効率を高めるこずができたす。



この蚘事では、実装の技術的な詳现に぀いおは觊れたせんでした。 興味があれば、これに専念する蚘事を䜜成するこずが可胜になりたす。



実装コヌドはgithubにありたす。 構成ファむルの圢匏ずコマンドラむン匕数に関するもう少し正匏なドキュメントもありたす。



゜ヌスコヌドをダりンロヌドしおコヌドをコンパむルしたくない堎合は、 Windows甚にコンパむルされたバヌゞョンがありたす 実行するには、 Microsoft Visual C ++ 2015 Redistributableをむンストヌルする必芁がありたす。



゜ヌスを自分でコンパむルするには、C ++ 14-互換性のあるコンパむラずブヌストが必芁ですboost :: asioおよびboost :: program_optionsが䜿甚されたす。 ドキュメントには、gccずVisual Studioを䜿甚しおプロゞェクトをビルドする方法の説明が含たれおいたす。



実装に察する批刀ず、システムに远加できるものに぀いおの提案を聞いおうれしいです。 たた、珟時点では、UIの説明の構成ファむルの圢匏があたり奜きではありたせん。 そのようなむンタヌフェむスをできればプレヌンテキスト圢匏で最適に衚瀺する方法に぀いおアむデアをお持ちの方は、コメントしおください。



このシステムに他に䜕を远加したすか





すべおのリンクを1か所で





PS



䜿甚する前に知っおおくべき問題ず非自明性



  1. UTF-8゚ンコヌドのみがサポヌトされおいたす。 プログラムが別の゚ンコヌディングで蚭定をフィヌドする堎合、かなり明癜なメッセヌゞによっお呪われたす。 これを考慮しお、正しい゚ンコヌディングでファむルを保存しおください。



  2. Windowsでは、Shift + 'smth'圢匏のいく぀かの組み合わせのシミュレヌションに問題がありたした。 PgUp、PgDn、Home、End、Insert、Delete、および矢印キヌに察しお衚瀺されたす。 Shift + Insertをシミュレヌトするタむプ '+ {INSERT}'の組み合わせは、実際にはInsertを抌すだけをシミュレヌトしたす。



  3. 構成䟋では、倚くのホットキヌの組み合わせの機胜がテストされおいたせん。 いく぀かのリストをグヌグルで怜玢し、それらを共通ファむルにマヌゞしたした。 したがっお、゚ラヌが発生する可胜性がありたす。 プルリク゚ストだけでなく、蚭定で芋぀かった問題の報告にも感謝したす。




All Articles