デザインソフトウェア (Blender など) で使用するために、テンキー/キーパッドをエミュレートするにはどうすればよいですか?

デザインソフトウェア (Blender など) で使用するために、テンキー/キーパッドをエミュレートするにはどうすればよいですか?

問題

特定のソフトウェアを使用する場合、ブレンダーユーザーがデザイン空間内で方向を確認するなどの操作を行えるようにテンキーを使用できることは重要ですが、多くのラップトップには物理的なテンキーが付属していません。通常の数字バー入力 (キーボード上部の 1 ~ 9) は実際にはコンピューターに対して異なる「記号」を表し、これらの種類のソフトウェアではまったく異なる機能を持つことが多いため、状況はさらに複雑になります。

試みられた解決策

多くのノートパソコンにはテンキーが付いていないので、多くのプラットフォームで一般的な解決策は、テンキーをエミュレートすることですたとえば、あるキーを押しながらキーボードの他のキーを押すことで (たとえば、jkluio789 で 123456789 を表す)、エミュレーションを実行できます。多くのラップトップでは、これを BIOS レベルで実装しています (たとえば、Fn キーを使用する)。ただし、このような低レベルの実装がなければ、このエミュレーションを実装するのは非常に困難です。

いくつかの解決策はオンラインでも存在しますが、設計ソフトウェアで使用するには不十分な場合が多い(正しいシンボルを実装しておらず、修飾キーも使用する必要があるため)、または詳しく説明されていないほとんどのソリューションは、日本語は、使い始めるのが複雑で非常に難しいアーキテクチャです。

優れたソリューションの要件

この問題のよい解決策は、グラフィックス ソフトウェアが真のキーパッド入力として受け入れ、使いやすいエミュレートされたキーパッドです。さらに制限があるのは、Blender が明確な修飾キーを指示されている場合でも修飾キー ( ShiftAltSuper(「コマンド キー」、「Windows キー」など)、 など)の使用を検出するため、「修飾キーを押しながらキーパッドをエミュレートする」ソリューションをまったく別の入力 (つまり、 ではなく[ + ])として解釈してしまうことです。したがって、理想的な解決策は、修飾キーが誤ってソフトウェアに渡されないように、保持メカニズム (例: Shift キーによる大文字化) ではなくロック メカニズム (例: Caps Lock キーによる大文字化) を実際に使用することになります。HyperxkbNumpad1AltNumpad1

答え1

クイックスタート

もし説明がどうでもいいなら(長々と説明し過ぎなのは承知していますが)、{中括弧内の太字の数字}いくつかの段落の冒頭に、これらの手順を順番に実行すれば、おそらく数分で実装できるでしょう。このガイドでは、ある程度の Unix のスキル (ディレクトリの作成、ファイルの作成、sudoルート権限への昇格など) があることを前提としています。また、ルートアクセスは指定された場合にのみ必要ですsudoなので、指示されない限り使用する必要はありません。

ソリューションの概要

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

これを行うには、キーパッド エミュレーションを初期化するために使用するさまざまな修飾キーを xkb に解釈する方法を指示するカスタム xkb「type」ファイルと、押す各キーの通常の動作 (グループ 1)、テンキー エミュレーション中の動作 (グループ 2)、および 2 つのキーを切り替える方法 (両方のグループでレベル 3 のアクション) を xkb に指示するカスタム xkb「symbols」ファイルを定義します。最後に、新しいセッションをsed開始するたびに使用する現在の xkbmap に統合して、ソリューションを永続化します (これにより、更新されるたびにソリューションが消去されなくなりますxkb)。

ソリューションの詳細な説明

ディレクトリ構造

{1}まず最初に、さまざまなファイルを保存するためのディレクトリを定義します。ディレクトリはどのようなものでも構いませんが、私のディレクトリは次のようになります。

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

ファイルの種類

ディレクトリ ツリーができたら、ソリューション内の実際のファイルを定義しましょう。まず、「タイプ」ファイルを定義します。このファイルは、「xkbレベル」間の移動方法を指定します (Shift文字を大文字にする方法、小文字の最初のレベルから大文字の大文字のレベルに移動する方法など)。これらのレベルは、特に英語を母国語とする人にとっては理解しにくいものですが、国際キーボードでは、代替文字や記号、発音区別記号に効果的に使用されています。

これを使用して、キーの変更を示す方法を定義します。言い換えると、修飾子が押されていない場合は「レベル 1」の動作 (通常、「通常モード」では標準の小文字)、キーを押したままにした場合は「レベル 2」の動作Shift(通常、「通常モード」では標準の大文字)、両方のShift+を押したままにした場合は「レベル 3」の動作Mod4(キーを変更するために使用すると、キーがモードを切り替えることを示すために使用する特別なケース) を期待することを指示します。

{2}新しいファイルを開きます。このファイルを と呼びますtogglekeypad。次のコードブロックをコピーして、typesの下のディレクトリに保存します\home\<username>\.xkb\types。注意: のすべてのインスタンスを、"Command"/"Windows Key" ボタンに対応する修飾子に変更する必要がある場合があります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";
        };
};

{3}このファイルをディレクトリにコピーする必要もあります/usr/share/X11/xkb/types/。これにはルート権限が必要になり、残念ながらxkbユーザー空間アプリケーションの目的が達成されないことになりますが、setxkbmapこれを行わないとファイルを認識できないようです。ご提案をお待ちしています。

シンボルファイル

次に、xkbtypes ファイルで説明したそれぞれの方法で変更されたときに各キーが何を実行するかを指定します。

シンボル ファイルで 2 つのグループを使用するとします。つまり、各キーには 2 つの異なる一般的な動作があり、何らかの方法で切り替えます。これらの動作は、通常の入力動作と新しいテンキー エミュレーション動作です。各キーについて、1) タイプを使用するTOGGLEKEYPAD、2) すべてのレベルの両方のグループの各物理キーに関連付けられたシンボル (つまり、コンピューターが認識するもの) を定義する、3) すべてのレベルの両方のグループの各xkbキーに関連付けられたアクション (実行する特別な操作) を定義する、とします。これはかなり混乱しているように聞こえますが、例を見ると少し理解しやすくなります。

以下に貼り付けたシンボルファイルの最初のキーはキーです<AC07>。これはほとんどのキーボードの「J」キーに相当します。ここにある地図によると(図 2)。この物理キーについては、通常モードでは、レベル 1 (型ファイルによると修飾子なし) では単に "j" と入力し、レベル 2 (Shift修飾子) では単に "J" と入力する、としています。レベル 3 では特別な処理を行います。レベル 3 に関連付けられているシンボルはありませんが、アクションがあり、そのアクションは ですLockGroup(group=2)。つまり、2 番目のグループである "キーパッド" グループに変更します。次の数行を見ると、この同じキーに対してグループ 2 に定義されているシンボルとアクションがさらにあることがわかります。レベル 1 (修飾子なし) では、シンボルは入力せず と入力する、としていますRedirectKey(keycode=<KP1>)。つまり、このキーを、キーパッドの "1" に対応するキーを実際に押したかのように登録します。(注: ここでも NoAction() を配置して、キー に対応するシンボル<KP1>を使用することもできますが、これが最も互換性が高いと考えました)。レベル 2 では、同じことを行いますが、キーに修飾子を追加します。最後に、レベル 3 では、グループ 1 の「標準」モードに戻ります。KP_1<KP1>Shift

{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 などの主要な機能をコンピューターに送信します。エミュレートされたテンキーを使用しているときに数字を入力するには、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何らかの理由で、カスタム タイプ ファイルを認識するにはルート アクセスが必要なことです。しかし、全体として、これは私にとってはうまく機能しているようです。ご質問やご提案がありましたら、お気軽に下記にご記入ください。

関連情報