如何使用崇高文本片段复制选择



The Quest

转动这个(currHour是当前选择):

var currHour = now.getHours();

进入这个:

var currHour = now.getHours();
console.log('currHour=' + currHour);

也应该适用于以下情况:

currHour = now.getHours();
-

->

currHour = now.getHours();
console.log('currHour=' + currHour);

和(选择b):

a = b;
-

->

a = b;
console.log('b=' + b);

等。


A. 情况

现在,通过遵循这个答案,我能够产生第二行,如下所示:

<snippet>
  <content>
    <![CDATA[console.log('$SELECTION=' + $SELECTION);]]> </content>
  <description>Print selection to console.log</description>
</snippet>

注意:我的代码片段代码省略了<scope>因为代码片段文件的位置暗示了范围(在特定于语言的目录 - JavaScript 下)。

注意2:代码段中的<tabTrigger>设置被故意省略,因为我将使用键盘快捷键:

{ "keys": ["ctrl+shift+o"], "command": "insert_snippet", "args": { "name": "Packages/User/JavaScript/console-log-selection.sublime-snippet" } },

好了,这就把我带到了一半...


问题所在

当前的"解决方案"要求我在调用代码段之前手动复制选择。如果可以的话,这是一个不方便的步骤,我想跳过。那么,有没有办法让代码段将选择复制到新行中

我不擅长片段,所以可能有另一种方法。无论如何,您可以使用插件来完成。

import re
import sublime
import sublime_plugin
class ConsoleLog(sublime_plugin.TextCommand):
    def run(self, edit):
        view = self.view
        cursor = view.sel()[0]
        line_region = view.line(cursor)
        string = view.substr(line_region)
        match = re.search(r"(s*)(vars+)?(w+)s*=", string)
        if match:
            if cursor.empty():
                var_text = match.group(3)
            else:
                var_text = view.substr(cursor)
            view.insert(edit, line_region.end(), "n%sconsole.log('%s = ' + %s);" % (match.group(1), var_text, var_text))
            end = view.line(line_region.end() + 1).end()
            view.sel().clear()
            view.sel().add(sublime.Region(end, end))

您只需要将光标放在分配操作的行上即可。将密钥绑定到console_log 。您可以根据需要更改名称。只需确保也更改文本命令的名称即可。

您还可以修改代码段,这样就不必先键入文本。输入变量名称,选择它,然后点击您的代码段键似乎不直观。这样的东西可能会更好用。

<snippet>
  <content>
    <![CDATA[console.log('$1 =' + $1);$2]]> </content>
  <description>Print selection to console.log</description>
</snippet>

编辑:

我使用该插件生成 console.logs,光标位于包含 var foo = barfoo = bar 的行上。也就是说,它是插件命令的两次调用。尽管您也可以修改它以处理多个游标。

var foo = bar
console.log('foo = ' + foo)
foo = bar
console.log('foo = ' + foo)

我还修改了插件,因此如果未选择任何内容,它应该自动使用变量赋值。如果选择了某些内容,它将使用控制台日志中的选定文本。如果您不想要空的选择内容,只需删除 if match: 下的 if 语句并将其替换为 var_text = view.substr(cursor)

您可以通过将

类似的代码片段与宏组合来基本完成您想要的。

代码段:

<snippet>
  <content><![CDATA[
${TM_CURRENT_LINE/var *(.+?) *=.+/nconsole.log('$1=' + $1);/}
]]> 
    </content>
  <description>Print selection to console.log</description>
</snippet>

该代码段根据当前行计算出变量名称,并使用该变量设置控制台.log行的格式。

宏:

[
    {"command": "move_to",          "args": {"to": "hardeol", "extend": false}},
    {"command": "insert_snippet",   "args": {"name": "Packages/User/console-log-selection.sublime-snippet"}}
]

该宏使用现有命令(move_to)在插入代码段之前到达行尾。这允许您从行上的任何位置运行命令。

最后,快捷方式:

{ "keys": ["ctrl+shift+o"], 
  "command": "run_macro_file", 
  "args": { "file": "Packages/User/console-log-selection.sublime-macro" } 
},

如果变量分配行已存在,这似乎是插入日志行的最佳方法。

这两种情况下,宏都会做你想做的事:

将其保存在

~/Library/Application Support/Sublime Text 2/Packages/User/saran_macro.sublime-macro

[
  {"command": "copy"},
  {"command": "move_to",  "args": {"to": "hardeol", "extend": false}},
  {"command": "insert",   "args": {"characters": "nconsole.log('"}},
  {"command": "paste"},
  {"command": "insert",   "args": {"characters": "=' + "}},
  {"command": "paste"},
  {"command": "insert",   "args": {"characters":");"}}
]

将此添加到您的键绑定中:

{ "keys": ["ctrl+shift+i"], "command": "run_macro_file", "args": { "file": "Packages/User/saran_macro.sublime-macro" } }

突出显示的任何内容都将是宏中的变量。

你好,我使用了所选答案中的代码来创建这个。

它支持多项选择并放置正确的缩进。此外,它不必是"var foo ="行

最新更新