Blenderのようなデザインソフトウェアで使用するために数字キーパッド/数字パッドをどのようにシミュレートできますか?

Blenderのようなデザインソフトウェアで使用するために数字キーパッド/数字パッドをどのようにシミュレートできますか?

質問

特定のソフトウェアを使用するとき。ミキサー、ユーザーはデザインスペースで位置決めなどの操作を実行できるため、数字キーパッドを使用できることが重要ですが、多くのラップトップには実際の数字キーパッドはありません。。これは、通常の数字バー入力(キーボードの上部の1-9)が実際にコンピュータに異なる「記号」を表すため、これらのソフトウェアではまったく異なる機能を持つことが多いため、より複雑になります。

試してみるソリューション

ノートパソコンには数字キーボードがない場合が多いので多くのプラットフォームでは、一般的な解決策は数​​字パッドをエミュレートすることです。たとえば、キーボードの別のキーを使用している間にキーを押し続けているとします(たとえば、jkluio789は123456789を表します)。多くのノートブックはBIOSレベルでこの機能を実装しています(たとえば、Fnキーを使用)。しかし、これらの低レベルの実装なしでは、このシミュレーションを実装することは非常に困難です。

オンラインにはいくつかの回避策がありますが、デザインソフトウェアで使用するには不足していることがよくあります。(正しいシンボルを実装せずに修飾キーを使用する必要があるため)深く説明しませんでした。。ほとんどのソリューションは、次の使用に焦点を当てています。xkb、これは始めるのが複雑で非常に難しいアーキテクチャです。

良いソリューションのための要件

この問題に対する良い解決策は、グラフィックソフトウェアが実際のキーボード入力として扱い、使いやすいシミュレーションキーボードを使用することです。もう1つの制限は、BlenderがShift明示的な修飾子キーについて言っても、修飾子キー(「Command」、「Windowsキー」など)の使用を検出するため、「修飾子キーを押しながらキーボードシミュレーション」を実行することです。です。解決策はまったく異なる入力(つまり、[+])ではな​​いと解釈されます。したがって、理想的なソリューションには、実際には保持メカニズム(Shift大文字など)ではなくロックメカニズム(Caps Lock大文字など)が含まれているため、修飾キーはありません。誤ってソフトウェアに渡されました。AltSuperHyperxkbNumpad1AltNumpad1

ベストアンサー1

クイックスタート

説明が必要ない場合(言葉が長すぎる可能性があることを知っています)、ただフォローしてください。{中括弧内の太字}特定の段落の始めに。各ステップを順番に実行すると、おそらく数分でこれを達成できます。このガイドでは、ユーザーがある程度Unixに精通していると想定しています(ディレクトリの作成、ファイルの作成、sudorootアクセス権の上昇など)。また参考にしてくださいルートアクセスは、指定された状況でのみ必要です。sudoそのため、別途指示しない限り使用する必要はありません。

ソリューションの一般的な説明

xkbを使用して、「ロックされた」(Caps Lockなど)の数値キーボードエミュレーションをLinuxに追加します。私のキー "jkluio789"には別のインクルードが含まれています("m、"->"0"、"-=[]"-> [numpad]"-+と一緒に数字"123456789"の数字キーパッド表現を表したい)*" 、"."->[数字パッド]".")。 [ Shift+ Mod4+ ]キーの組み合わせで[key]この「数字パッドモード」を切り替えます。ここにMod4私のオペレーティングシステムキーの修飾子コード(「Command」または「Windowsキー」とも呼ばれ、時にはまたはSuper修飾子コードに割り当てられますHyper)があります。 、[key]シミュレートされた数字パッド(たとえば、「j」または「[」)に使用されるキー。ソリューション全体を読んだ後、この設定を簡単に変更すると比較的簡単になります。

これを行うには、キーボードシミュレーションを初期化するために使用するさまざまな修飾子キーを解釈する方法をxkbに通知するカスタムxkb「タイプ」ファイルと、キーを押すたびにxkbに通知するカスタムxkb「シンボル」ファイルを定義します。以下のキーは正常に動作する必要があり(グループ1)、数字キーパッドエミュレーション中にキーがどのように動作するか(グループ2)、2つのキー間を切り替える方法(両方のグループのレベル3操作)。最後に、新しいセッションが開始されるたびにソリューションを現在のxkbmapに統合してソリューションを永久に作成しますsedxkb更新するたびにソリューションは削除されません)。

ソリューションの詳細

ディレクトリ構造

{1}最初にすべきことは、さまざまなファイルを保持するディレクトリを定義することです。あなたのディレクトリはほぼすべてのディレクトリになることができますが、私のディレクトリは次のとおりです。

/home
  +-<username>
    +-.xkb
      +-symbols
      +-types
      +-keymap
      +-log

タイプファイル

ディレクトリツリーがある場合は、ソリューションで物理ファイルを定義できます。最初にすべきことは、「タイプ」ファイルを定義することです。このファイルは、「レベル」の間を移動する方法を示しています(たとえば、小文字の最初のレベルから大文字の大文字レベルに文字を大文字で始めるxkb方法)。Shiftこれらのレベルは、特に英語のネイティブスピーカーではマスターするのがやや難しいですが、国際キーボードではこのレベルを使用して発音区別記号だけでなく、代替文字や記号に大きな効果を与えます。

これを使用して、キーに対する変更を表示する方法を定義します。つまり、修飾キーを押さないと「レベル1」動作(通常「通常モード」では標準小文字)が予想され、キーを押していると「レベル2」動作(Shift通常は「レベル2」動作)が予想されると言います。 、「通常モード」の標準キャップ)とShift+を同時に押すと、「レベル3」の動作Mod4(私たちの目的のためにこれは特別なケースであり、キーを変更するために使用されるとき、そのキーはモード間で切り替えられます)。

{2}新しいファイルを開き、名前をとして指定しますtogglekeypad。次のコードブロックをコピーしてtypesディレクトリに保存します。注:すべてのインスタンスをすべての修飾子に対応するCommand / Windowsキーボタン\home\<username>\.xkb\typesに変更する必要があるかもしれません。Mod4このページは修飾キーの下にあります。指示)または必要な他の修飾子。

partial default xkb_types "togglekeypad" { // Name of this type file
        type "TOGGLEKEYPAD" { // Name of this "type"
                modifiers = Shift+Mod4; // The modifiers that this type concerns itself with
                map[Shift] = level2; // Shift brings us to level 2
                map[Mod4+Shift] = level3; // Windows key plus shift brings us to level 3
                level_name[Level1] = "Base"; // Human-readable names for each level (not really used, but convenient)
                level_name[Level2] = "Shift";
                level_name[Level3] = "Transfer";
        };
};

{三}また、このファイルをディレクトリにコピーする必要があります/usr/share/X11/xkb/types/。これにはroot権限が必要です。これは残念ながらxkbユーザースペースアプリケーションの目的に反していますが、これを行わないとsetxkbmapファイルを認識できないようです。提案を歓迎します!

シンボルファイル

xkb次に、タイプファイルで説明されている各方法で変更されたときに各キーが何をすべきかをお知らせします。

シンボリックファイルで2つのグループを使用したいとします。つまり、各キーには、一般的な入力動作と新しい数値キーボードエミュレーション動作を切り替えることができる2つの一般的な動作があります。各キーに1)タイプを使用したいと言い、TOGGLEKEYPAD2)すべてのレベルで2つのグループの各物理キーに関連付けられているシンボル(つまり、コンピュータが見るもの)を定義し、3)すべてのxkb操作を実行します。すべてのレベルで、2つのグループの各キー(実行する必要がある特別なアクション)に関連するキーが定義されます。かなり混乱するように聞こえますが、例を見ればもっと理解するでしょう。

下に貼り付けたシンボルファイルに表示される最初のキーはkeyです<AC07>。これはほとんどのキーボードの「J」キーに対応します。ここに見える地図によると(図2)。この物理キーの場合、通常モードではレベル1(タイプファイルに応じて修飾子なし)では「j」のみ、レベル2(Shift修飾子)では「J」のみを入力します。レベル3では特別な作業を行います。レベル3に関連するシンボルはありませんが、には何かがありますLockGroup(group=2)。つまり、2番目のグループ「Keyboard」グループに移動しましょう。次の数行を見ると、同じキーのグループ2に対してより多くのシンボルとアクションを定義したことがわかります。レベル1(修飾子なし)では記号が入力されていないとしますRedirectKey(keycode=<KP1>)。つまり、実際に押したようにキーが登録され、<KP1>これはキーボードの「1」に対応します。 (注:NoAction()を再配置し、KP_1キーに対応するシンボルであるシンボルを使用することもできますが、<KP1>これは最高の互換性を提供すると思います。)レベル2の場合は同じことを行いますが、キーにShift修飾子を追加します。最後に、レベル3ではグループ1の「標準」モードにロックされます。

{4}新しいファイルを開き、名前をとして指定しますtogglekeypad_symbols。次のコードブロックをコピーしてsymbolsディレクトリに保存します\home\<username>\.xkb\symbols

default partial
xkb_symbols "togglekeypad" {
    name[Group1]= "Standard";
    name[Group2]= "Keypad";

    key <AC07> { // J
        type = "TOGGLEKEYPAD",
        symbols[Group1] = [ j,  J, NoSymbol],
        actions[Group1] = [NoAction(), NoAction(), LockGroup(group=2)],     
        
        symbols[Group2] = [NoSymbol, NoSymbol, NoSymbol],
        actions[Group2] = [RedirectKey(keyCode=<KP1>), RedirectKey(keyCode=<KP1>, modifiers=Shift), LockGroup(group=1)]
    };
    
    key <AC08> { // K
        type = "TOGGLEKEYPAD",
        symbols[Group1] = [ k,  K, NoSymbol],
        actions[Group1] = [NoAction(), NoAction(), LockGroup(group=2)],     
        
        symbols[Group2] = [NoSymbol, NoSymbol, NoSymbol],
        actions[Group2] = [RedirectKey(keyCode=<KP2>), RedirectKey(keyCode=<KP2>, modifiers=Shift), LockGroup(group=1)]
    };
    
    key <AC09> { // L
        type = "TOGGLEKEYPAD",
        symbols[Group1] = [ l,  L, NoSymbol],
        actions[Group1] = [NoAction(), NoAction(), LockGroup(group=2)],     
        
        symbols[Group2] = [NoSymbol, NoSymbol, NoSymbol],
        actions[Group2] = [RedirectKey(keyCode=<KP3>), RedirectKey(keyCode=<KP3>, modifiers=Shift), LockGroup(group=1)]
    };
    
    key <AD07> { // U
        type = "TOGGLEKEYPAD",
        symbols[Group1] = [ u,  U, NoSymbol],
        actions[Group1] = [NoAction(), NoAction(), LockGroup(group=2)],     
        
        symbols[Group2] = [NoSymbol, NoSymbol, NoSymbol],
        actions[Group2] = [RedirectKey(keyCode=<KP4>), RedirectKey(keyCode=<KP4>, modifiers=Shift), LockGroup(group=1)]
    };
    
    key <AD08> { // I
        type = "TOGGLEKEYPAD",
        symbols[Group1] = [ i,  I, NoSymbol],
        actions[Group1] = [NoAction(), NoAction(), LockGroup(group=2)],     
        
        symbols[Group2] = [NoSymbol, NoSymbol, NoSymbol],
        actions[Group2] = [RedirectKey(keyCode=<KP5>), RedirectKey(keyCode=<KP5>, modifiers=Shift), LockGroup(group=1)]
    };
    
    key <AD09> { // O
        type = "TOGGLEKEYPAD",
        symbols[Group1] = [ o,  O, NoSymbol],
        actions[Group1] = [NoAction(), NoAction(), LockGroup(group=2)],     
        
        symbols[Group2] = [NoSymbol, NoSymbol, NoSymbol],
        actions[Group2] = [RedirectKey(keyCode=<KP6>), RedirectKey(keyCode=<KP6>, modifiers=Shift), LockGroup(group=1)]
    };
    
    key <AE07> { // 7
        type = "TOGGLEKEYPAD",
        symbols[Group1] = [ 7,  ampersand, NoSymbol],
        actions[Group1] = [NoAction(), NoAction(), LockGroup(group=2)],     
        
        symbols[Group2] = [NoSymbol, NoSymbol, NoSymbol],
        actions[Group2] = [RedirectKey(keyCode=<KP7>), RedirectKey(keyCode=<KP7>, modifiers=Shift), LockGroup(group=1)]
    };
    
    key <AE08> { // 8
        type = "TOGGLEKEYPAD",
        symbols[Group1] = [ 8,  asterisk, NoSymbol],
        actions[Group1] = [NoAction(), NoAction(), LockGroup(group=2)],     
        
        symbols[Group2] = [NoSymbol, NoSymbol, NoSymbol],
        actions[Group2] = [RedirectKey(keyCode=<KP8>), RedirectKey(keyCode=<KP8>, modifiers=Shift), LockGroup(group=1)]
    };
    
    key <AE09> { // 9
        type = "TOGGLEKEYPAD",
        symbols[Group1] = [ 9,  parenleft, NoSymbol],
        actions[Group1] = [NoAction(), NoAction(), LockGroup(group=2)],
        
        symbols[Group2] = [NoSymbol, NoSymbol, NoSymbol],
        actions[Group2] = [RedirectKey(keyCode=<KP9>), RedirectKey(keyCode=<KP9>), LockGroup(group=1)]
    };
    
    // NumLock
    key <AE06> { // 6
        type = "TOGGLEKEYPAD",
        symbols[Group1] = [ 6,  asciicircum, NoSymbol],
        actions[Group1] = [NoAction(), NoAction(), LockGroup(group=2)],
        
        symbols[Group2] = [NoSymbol, NoSymbol, NoSymbol],
        actions[Group2] = [RedirectKey(keyCode=<NMLK>), RedirectKey(keyCode=<NMLK>), LockGroup(group=1)]
    };
    
    // Bottom Row (and zero)
    key <AB07> { // M
        type = "TOGGLEKEYPAD",
        symbols[Group1] = [ m,  M, NoSymbol],
        actions[Group1] = [NoAction(), NoAction(), LockGroup(group=2)],
        
        symbols[Group2] = [NoSymbol, NoSymbol, NoSymbol],
        actions[Group2] = [RedirectKey(keyCode=<KP0>), RedirectKey(keyCode=<KP0>, modifiers=Shift), LockGroup(group=1)]
    };
    
    key <AE10> { // 0
        type = "TOGGLEKEYPAD",
        symbols[Group1] = [ 0,  parenright, NoSymbol],
        actions[Group1] = [NoAction(), NoAction(), LockGroup(group=2)],
        
        symbols[Group2] = [NoSymbol, NoSymbol, NoSymbol],
        actions[Group2] = [RedirectKey(keyCode=<KP0>), RedirectKey(keyCode=<KP0>, modifiers=Shift), LockGroup(group=1)]
    };
    
    key <AB09> { // .
        type = "TOGGLEKEYPAD",
        symbols[Group1] = [ period,  greater, NoSymbol],
        actions[Group1] = [NoAction(), NoAction(), LockGroup(group=2)],
        
        symbols[Group2] = [NoSymbol, NoSymbol, NoSymbol],
        actions[Group2] = [RedirectKey(keyCode=<KPDL>), RedirectKey(keyCode=<KPDL>, modifiers=Shift), LockGroup(group=1)]
    };
    
    // Arithmetic Operators
    key <AE11> { // -
        type = "TOGGLEKEYPAD",
        symbols[Group1] = [ minus,  underscore, NoSymbol],
        actions[Group1] = [NoAction(), NoAction(), LockGroup(group=2)],
        
        symbols[Group2] = [NoSymbol, NoSymbol, NoSymbol],
        actions[Group2] = [RedirectKey(keyCode=<KPSU>), RedirectKey(keyCode=<KPSU>, modifiers=Shift), LockGroup(group=1)]
    };
    
    key <AE12> { // +
        type = "TOGGLEKEYPAD",
        symbols[Group1] = [ equal,  plus, NoSymbol],
        actions[Group1] = [NoAction(), NoAction(), LockGroup(group=2)],
        
        symbols[Group2] = [NoSymbol, NoSymbol, NoSymbol],
        actions[Group2] = [RedirectKey(keyCode=<KPAD>), RedirectKey(keyCode=<KPAD>, modifiers=Shift), LockGroup(group=1)]
    };
    
    key <AD12> { // [
        type = "TOGGLEKEYPAD",
        symbols[Group1] = [ bracketleft,  braceleft, NoSymbol],
        actions[Group1] = [NoAction(), NoAction(), LockGroup(group=2)],
        
        symbols[Group2] = [NoSymbol, NoSymbol, NoSymbol],
        actions[Group2] = [RedirectKey(keyCode=<KPDV>), RedirectKey(keyCode=<KPDV>, modifiers=Shift), LockGroup(group=1)]
    };
    
    key <AD12> { // ]
        type = "TOGGLEKEYPAD",
        symbols[Group1] = [ bracketright,  braceright, NoSymbol],
        actions[Group1] = [NoAction(), NoAction(), LockGroup(group=2)],
        
        symbols[Group2] = [NoSymbol, NoSymbol, NoSymbol],
        actions[Group2] = [RedirectKey(keyCode=<KPMU>), RedirectKey(keyCode=<KPMU>, modifiers=Shift), LockGroup(group=1)]
    };
};

キーボードテスト

{5}キーボード構成をそのままテストするには、Terminalウィンドウを開き、次のように入力します。

setxkbmap -types complete+togglekeypad -print | sed -e '/xkb_symbols/s/"[[:space:]]/+togglekeypad_symbols(togglekeypad)&/' > $HOME/.xkb/keymap/customMap
xkbcomp -I$HOME/.xkb -R$HOME/.xkb keymap/customMap $DISPLAY

これにより、マップの現在の設定xkb(使用済みsetxkbmap - print)が取得され、マップに使用されるタイプcomplete+togglekeypad(ファイル/usr/share/X11/xkb/types/complete内のタイプファイルを含むファイル内のすべて/usr/share/X11/xkb/types/togglekeypad)も設定されます。次にそれをインポートし、ファイルのシンボルを使用済みのシンボルファイルに追加しますsed。最後に、それを使用して新しいキーマップをコンパイルします。togglekeypadtogglekeypad_symbolsxkbcomp

私のコンピュータでは、NumLockがオフになっていると仮定しているので(コンピュータに数字パッドがないため)、数字パッドキーは実際にHome、End、PG Up、PG Down Toなどの主な機能をコンピュータに送信します。アナログ数字キーボードを使って数字を入力し、Shiftキーを押します。私はこの動作を反転するためにさまざまな方法を試しましたが(modifersシンボルファイルのレベル間のパラメータ交換、NumLockキーをシミュレートするための新しいキーの割り当てと切り替え<NMLK>)、まだ何も効果がありませんでした。幸いなことに、BlenderでテストしたときにShiftキーを押さずに期待通りに動作しました。

{6}この時点で何かが間違っている場合は、心配せずにログアウト/ログイン(または最悪の場合は再起動)して、デバッグしてやり直してください。すべてがうまくいったら、永久に作ります。

ソリューションを恒久的にする

セッション間でソリューションを維持するためのよりエレガントな方法がありますが、私にとって最も簡単で信頼性の高い方法は、上記のコマンドをファイルの末尾に置くことです~/.bashrc。私が使うものはここで提案されたソリューションいくつかのエラーチェック機能とそれ以上を追加します(したがって、すべてのエラー出力を見ることができます)。

{7}ファイルを開きます~/.bashrc。最後に次のスクリプトを追加します。

    # Setup custom keyboard remapping to emulate a number pad when "Shift+Cmd+numap_key" is pressed to initialize
if [ -d $HOME/.xkb/keymap ]; then
  setxkbmap -types complete+togglekeypad -print | \
    sed -e '/xkb_symbols/s/"[[:space:]]/+togglekeypad_symbols(togglekeypad)&/' > $HOME/.xkb/keymap/customMap 2> $HOME/.xkb/log/sedErrors
  xkbcomp -w0 -I$HOME/.xkb -R$HOME/.xkb keymap/customMap $DISPLAY > $HOME/.xkb/log/outputOfCommand 2>&1
fi

{8}再起動後、数字キーパッドのエミュレーションは永久に維持されます!

結論として

説明は長いが、方法自体は比較的短い。欠点は、Blenderが正しく機能するためにロック方法が必要であることです。一方、私は保留方法を使用することを好み、何らかのxkb理由でカスタムタイプファイルを認識するにはrootアクセスが必要です。しかし、全体的にこれは私によく合うようです。質問や提案がある場合は、以下にコメントを残してください!

おすすめ記事