15

キーボード ショートカットを定義するための構文タイプを取得する方法、または構文タイプ (おそらく ) 設定に依存するようにキーボード ショートカットを設定する方法はあります"context"か?

私の引用されたリストは'(1 2 3)次のように入力されます: '(1 2 3)'Sublime がこの便利な (ただし、この場合ではありません) 動作を適用するためです。

Default (OSX).sublime-keymapここにファイルの関連ビットがあります

// Auto-pair single quotes
{ "keys": ["'"], "command": "insert_snippet", "args": {"contents": "'$0'"}, "context":
    [
        { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true },
        { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true },
        { "key": "following_text", "operator": "regex_contains", "operand": "^(?:\t| |\\)|]|\\}|>|$)", "match_all": true },
        { "key": "preceding_text", "operator": "not_regex_contains", "operand": "['a-zA-Z0-9_]$", "match_all": true },
        { "key": "eol_selector", "operator": "not_equal", "operand": "string.quoted.single", "match_all": true }
    ]
},
{ "keys": ["'"], "command": "insert_snippet", "args": {"contents": "'${0:$SELECTION}'"}, "context":
    [
        { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true },
        { "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true }
    ]
},
{ "keys": ["'"], "command": "move", "args": {"by": "characters", "forward": true}, "context":
    [
        { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true },
        { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true },
        { "key": "following_text", "operator": "regex_contains", "operand": "^'", "match_all": true }
    ]
},
4

2 に答える 2

14

私はこの簡単なことをしました:これ
を入れて ください:

// Singlequote for lisp
{ "keys": ["'"], "command": "insert_snippet", "args": {"contents": "'"}, "context":
    [
        { "key": "selector", "operator": "equal", "operand": "source.lisp"}
    ]
},

あなたのuser-keys-bindingsで。


ワンランク上のステップ:

このシナリオにはまだ 1 つの異常なケースがあります: '|'(パイプはキャレットを表します)、バックスペースを押した後でも、両方の単一引用符が削除されます。


これを修正するには、これuser-key-keybindingsに追加します。

{ "keys": ["backspace"], "command": "left_delete", "context":
    [
        { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true },
        { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true },
        { "key": "preceding_text", "operator": "regex_contains", "operand": "'$", "match_all": true },
        { "key": "following_text", "operator": "regex_contains", "operand": "^'", "match_all": true },
        { "key": "selector", "operator": "equal", "operand": "source.lisp"}
    ]
},

重要な注意点:

コメントでピックウィックが述べたように、もちろん変更する必要があります

"source.lisp"
に、
"source.<lisp-of-your-choice>"
またはむしろに、
"source.<name-of-syntax-of-your-choice>"
またはむしろ-er:
"source.<name-of-scope-the-syntax-you're-using-is-using>".


ScopeAlwaysは、構文が使用しているスコープの正しい名前を表示できるプラグインです"source.lisp"CL や"source.clojure"clojure のようなものになる可能性が非常に高い"source.scheme"です。

于 2013-05-08T22:51:19.513 に答える
8

多少の痛みはありますが、できるはずです。まず、組み込みの自動ペアリングを無効にする必要があります (心配しないでください。終了したら、他のすべての自動ペアリングが機能するはずです)。これを行うには、ユーザー設定で次のように設定します。

"auto_match_enabled": false

次に、以下を設定に追加します。

"my_auto_match_enabled": false

次に、キーバインドの新しいセットを追加する必要があります。私はあなたが投稿したものから1つだけをしましたが、明らかではないかもしれないので、私がしたことを説明します.

{ "keys": ["'"], "command": "insert_snippet", "args": {"contents": "'${0:$SELECTION}'"}, "context":
    [
        { "key": "setting.my_auto_match_enabled", "operator": "equal", "operand": true },
        { "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true },
        { "key": "selector", "operator": "not_equal", "operand": "source.clojure", "match_all": true }
    ]
}

まず、最初のコンテキスト キーを から に切り替えたことに注意してsetting.auto_match_enabledくださいsetting.my_auto_match_enabled。次に、スコープを制限する最後のコンテキスト エントリを追加しました。source.clojureこれにより、スニペットはスコープ外の場合にのみ実行されます。clojure のスコープ名がわからないので、これを変更する必要があるかもしれません。すべての一重引用符エントリに対してこれを行う必要があります。ここで、組み込みの自動ペアリングを無効にしたため、これらのエントリもすべて再読み込みする必要があります。これらのエントリでは、再び に変更setting.auto_match_enabledsetting.my_auto_match_enabledます。その後、すべてが機能するはずです。実際に である必要はないことに注意してください。それはmy_auto_match_enabled私が選んだものです。必要に応じて変更できます。

とはいえ、すべてを完全にテストしたわけではないので、問題が発生した場合はコメントしてください。

説明:

組み込みの自動マッチング コードを無効にする必要があるのはなぜですか? さて、ここに答えがあります。同様のスコープ ルールを使用して、ユーザー設定でオート コンプリートをブロックしたとしても、デフォルトにフォールバックするため、ユーザー フォルダーで何を行っても、オート ペアの引用符が挿入されます。と思われるかもしれませんが、デフォルト設定ファイルを変更したらどうなるでしょうか。これを行うことはできますが、同じコンテキスト設定を再度挿入すると、その後の更新でそのファイルを確実に復元する必要があります。ですから、最終的にはあなた次第だと思います。デフォルトのファイルを編集した場合、元に戻す必要がある場合は、ファイルを再度変更する必要があることに注意してください。

崇高なテキスト 3:

ST3 では、「デフォルト」ファイルを実際に変更することができます。これは、ST3 でのパッケージのロード方法が変更されたためです。Packages フォルダーに展開する必要はなく、プラグインは .sublime-package ファイル (単に名前が変更された zip) から直接実行されます。さらに、Packages ディレクトリ内のファイルは、.sublime-package ファイルよりも優先されます。したがって、ST3 では、 を作成しPackages/Default/Default (your os here).sublime-keymap、コンテキスト行を追加します。更新によって Packages ディレクトリが変更されることはないため、その後の更新から安全です。

于 2013-04-06T04:04:28.093 に答える