Привязка возвышенных ключей для console.log в зависимости от типа файла - PullRequest
0 голосов
/ 14 ноября 2018

Я хотел бы использовать Ctrl + Shift + C , чтобы вставить основной синтаксис вывода, соответствующий типу файла, в котором я нахожусь.

console.log('');
console.log();

для .vue, .js или .html и

writeDump();
abort;

для .cfc (также я хочу, чтобы это произошло на Ctrl + Shift + W ) .

Вот код, который у меня есть:

{ "keys": ["ctrl+shift+c"],
  "command": "insert_snippet",
  "args": {
    "contents": "console.log(`${1:}$SELECTION`);\nconsole.log(${1:}$SELECTION);\n${0}"
  }, "context":
  [
    { 
      "key": "selector", 
      "operator": "equal", 
      "operand": ["source.js","source.html"], 
      "match_all": true 
    }
  ]
},
{ "keys": ["ctrl+shift+c"],
  "command": "insert_snippet",
  "args": {
    "contents": "console.log(`${1:}$SELECTION`);\nconsole.log(${1:}$SELECTION);\n${0}"
  }, "context":
  [
    { 
      "key": "selector", 
      "operator": "equal", 
      "operand": "source.vue", 
      "match_all": true 
    }
  ]
},
{ "keys": ["ctrl+shift+w","ctrl+shift+c"],
  "command": "insert_snippet",
  "args": {
    "contents": "writeDump(${1:}$SELECTION\"$2);\nabort;\n${0}"
  }, "context":
  [
    { 
      "key": "selector", 
      "operator": "equal", 
      "operand": "source.cfc", 
      "match_all": true 
    }
  ]
},

Однако Ctrl + Shift + C всегда ставит console.log независимо от типа файла и Ctrl + Shift + W закрывает текущее возвышенное окно - это означает, что оно вообще не перезаписывается.

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

@ Удивительный ответ OdatNurd объяснил многое из внутренней работы привязок клавиш и поставил меня на правильный путь, но я хотел опубликовать свое окончательное решение, не угоняя его пост, а не в комментариях, потому что код слишкоммногословно, чтобы быть читаемым там.

Я проверил все функциональные возможности, и это работает как ожидалось:

{ 
    "keys": ["ctrl+shift+c"],
    "command": "insert_snippet",
    "args": {
        "contents": 
        "console.log(`${1:}$SELECTION`);\nconsole.log(${1:}$SELECTION);\n${0}"
    }
},
{ 
    "keys": ["ctrl+shift+c"],
    "command": "insert_snippet",
    "args": {
        "contents": 
        "console.log(`${1:}$SELECTION`);\nconsole.log(${1:}$SELECTION);\n${0}"
    }, 
    "context": [
        { 
            "key": "selector", 
            "operator": "equal", 
            "operand": "text.html.vue",
            "match_all": true 
        }
    ]
},
{ 
    "keys": ["ctrl+shift+w"],
    "command": "insert_snippet",
    "args": {
        "contents": "writeDump(${1:}$SELECTION\"$2);\nabort;\n${0}"
    }
},
{ 
    "keys": ["ctrl+shift+c"],
    "command": "insert_snippet",
    "args": {
        "contents": "writeDump(${1:}$SELECTION\"$2);\nabort;\n${0}"
    }, 
    "context": [
        { 
            "key": "selector", 
            "operator": "equal", 
            "operand": "embedding.cfml", 
            "match_all": true 
        }
    ]
},

Работа в обратном направлении, так же, как Sublime читает привязки клавиш:

Ctrl + Shift + C для файлов ColdFusion

  • Как предписано @OdatNurd, я выделил привязки C и W, с C идет первым.Это заменит любой другой фрагмент Ctrl + Shift + C и заставит writeDump появиться вместо console.log, но только если файл связан с ColdFusion. К сожалению, я не использую файлы CFML, поэтому я не смог найти способ различить .cfml и .cfc.Пакет CFML для Sublime, похоже, не делает различий между ними - по крайней мере, на верхнем уровне области видимости.Если кто-то это выяснит, сообщите нам.

Ctrl + Shift + W

  • Я решил удалить контекст из этой записи, чтобы никогда не происходило «закрытие всех окон».Если я сделаю ошибку, я бы лучше написал writeDump - что легко отменить - чем закрытие всех окон - не так просто отменить.

Ctrl + Shift + C для файлов Vue

  • Я оставил это отдельно (я расскажу об этом позже) и просто изменил operand, чтобы он соответствовал Scope Name(Ctrl + Alt + Shift + P), который был text.html.vue

Ctrl + Shift + C для всего остального:

  • По аналогии с удалением контекста для Ctrl + Shift + W, я сделал это здесь как ловушку для console.log.Теперь Ctrl + Shift + C вставит фрагмент console.log в любой файл, который специально не определен в привязках клавиш.Это потому, что по умолчанию Ctrl + Shift + C не назначен ни для чего.
0 голосов
/ 15 ноября 2018

Привязки клавиш в вашем вопросе не совсем корректны в том смысле, что некоторые области (потенциально) недействительны, и, по крайней мере, первая имеет синтаксическую проблему, из-за которой Sublime полностью игнорирует context.

Область действия для файлов HTML, если вы используете встроенный синтаксис для HTML в Sublime, составляет text.html, а не source.html, что я отразил в привязках ниже. Кроме того, области действия для файлов Vue и CFC также могут быть неправильными. Я не использую эти языки, поэтому я только что установил первый найденный пакет, который поддерживает подсветку синтаксиса в этих типах файлов, так что вы можете использовать что-то другое, чем я выбрал.

Чтобы быть уверенным, вы можете использовать Tools > Developer > Show Scope Name в главном меню (или нажать соответствующую клавишу), чтобы увидеть область при курсоре в любом файле во всплывающем окне. Обычно первая строка во всплывающем окне - это та, которую вы хотите использовать, чтобы ограничить привязки клавиш определенным типом файла.

Кроме того, в каждой из (исправленных) привязок ниже содержимое фрагмента было немного скорректировано, чтобы мы могли убедиться, что нужная вещь вставлена ​​в нужное время.

Переплет # 1

{ "keys": ["ctrl+shift+c"],
  "command": "insert_snippet",
  "args": {
    "contents": "console.log(`${1:}$SELECTION`);\nconsole.log(${1:}$SELECTION);\n${0}"
  }, "context":
  [
    { 
      "key": "selector", 
      "operator": "equal", 
      "operand": ["source.js","source.html"], 
      "match_all": true 
    }
  ]
},

Эта привязка недопустима, поскольку operand в context должна быть строкой, а не списком строк. Таким образом, Sublime думает, что контекст нарушен, и молча игнорирует его, что делает Ctrl + Shift + C активным в каждом типе файла, что является поведением, которое вы сейчас видите.

Можно включить несколько областей в операнд, но вы делаете это как одну строку, а не как список. Примером этого является следующее:

{ "keys": ["ctrl+shift+c"],
  "command": "insert_snippet",
  "args": {
    "contents": "/* js;html */ console.log(`${1:}$SELECTION`);\nconsole.log(${1:}$SELECTION);\n${0}"
  }, "context":
  [
    { 
      "key": "selector", 
      "operator": "equal", 
      "operand": "source.js, text.html", 
      "match_all": true 
    }
  ]
},

Здесь операнд - это две области, разделенные запятыми, что делает привязку активной, пока область соответствует одной из них. Кроме того, область действия HTML была исправлена ​​с source.html до text.html.

Переплет # 2

{ "keys": ["ctrl+shift+c"],
  "command": "insert_snippet",
  "args": {
    "contents": "console.log(`${1:}$SELECTION`);\nconsole.log(${1:}$SELECTION);\n${0}"
  }, "context":
  [
    { 
      "key": "selector", 
      "operator": "equal", 
      "operand": "source.vue", 
      "match_all": true 
    }
  ]
},

Эта привязка технически допустима, но source.vue может быть неправильной областью для этого, в зависимости от того, какое определение синтаксиса вы используете для обеспечения подсветки синтаксиса для файлов Vue.

{ "keys": ["ctrl+shift+c"],
  "command": "insert_snippet",
  "args": {
    "contents": "/* vue */ console.log(`${1:}$SELECTION`);\nconsole.log(${1:}$SELECTION);\n${0}"
  }, "context":
  [
    { 
      "key": "selector", 
      "operator": "equal", 
      "operand": "text.html.vue", 
      "match_all": true 
    }
  ]
},

Для выбранного пакета с подсветкой синтаксиса Vue область действия для файлов Vue составляет text.html.vue, что я здесь и отразил; в противном случае все в этой привязке верно.

Обратите внимание, что область действия для HTML равна text.html, а область действия для Vue - text.html.vue. Следуя правилам сопоставления областей, text.html.vue соответствует области действия text.html, что имеет некоторые последствия для привязок в зависимости от того, что вы хотите, чтобы произошло (и при условии, что эта область соответствует пакету, который вы используете).

Если вы хотите внедрить тот же код в Vue, что и в HTML-файлах, вы можете полностью исключить эту привязку, и приведенная выше для HTML будет соответствовать ей и делать то, что вы хотите напрямую.

С другой стороны, если вы хотите сделать что-то особенное для Vue, важно, чтобы эта привязка пришла после привязки HTML в вашем файле привязок клавиш. Sublime оценивает привязки клавиш в нижней части файла и использует первый, который соответствует. Так как text.html.vue соответствует text.html, вам нужно иметь специальное правило для файлов Vue ниже в файле, чтобы убедиться, что он найден и используется первым.

Переплет # 3

{ "keys": ["ctrl+shift+w","ctrl+shift+c"],
  "command": "insert_snippet",
  "args": {
    "contents": "writeDump(${1:}$SELECTION\"$2);\nabort;\n${0}"
  }, "context":
  [
    { 
      "key": "selector", 
      "operator": "equal", 
      "operand": "source.cfc", 
      "match_all": true 
    }
  ]
},

Опять же, за исключением того, что область действия этой привязки потенциально неверна, в этой привязке нет ничего плохого, кроме того, что, исходя из вашего описания выше, она может не выполнять то, что вы ожидаете.

{ "keys": ["ctrl+shift+w","ctrl+shift+c"],
  "command": "insert_snippet",
  "args": {
    "contents": "writeDump(${1:}$SELECTION\"$2);\nabort;\n${0}"
  }, "context":
  [
    { 
      "key": "selector", 
      "operator": "equal", 
      "operand": "embedding.cfml", 
      "match_all": true 
    }
  ]
},

Область в пакете CFML, которую я выбрал для тестирования, использует embedding.cfml в качестве области действия, что отражено здесь.

Более важно, используя два ключа в качестве списка в привязке, например, это превращает привязку в аккорд клавиш . Это означает, что для того, чтобы вызвать это, вам нужно нажать Ctrl + Shift + W , а затем Ctrl + Shift + c .

Из описания вашего вопроса звучит, что вам могут понадобиться две разные привязки клавиш, которые обе выполняют одно и то же.Если это так, то вам нужно продублировать всю привязку и изменить ключ во второй.

...