如何使用Sublime Text代码片段复制选定内容

3

任务

将此内容转换为以下形式(其中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);

等等,让我理解一下。您需要翻译关于IT技术的内容,并使其更加通俗易懂,但是不要删除HTML标签和解释。请参考以下内容:


情况

现在,按照这个答案的方法,我能够生成第二行,代码如下:

<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" } },

好的,这让我完成了一半...


问题

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

4个回答

1

我对代码片段不太熟悉,可能还有其他方法。无论如何,您可以使用插件来完成。

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*)(var\s+)?(\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>

编辑:

我使用了插件来生成带有光标的 var foo = barfoo = bar 代码行的console.logs。也就是说,这是插件命令的两个调用。虽然你也可以修改它来处理多个光标。

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

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

我还修改了插件,如果没有选择任何内容,它应该自动使用变量分配。如果选择了某些内容,则会在控制台日志中使用所选文本。如果您不想要空选择内容,请删除 if match: 下的 if 语句,并将其替换为 var_text = view.substr(cursor)

从快速查看插件(未实际测试)来看,它似乎依赖于与@kbaskett248的答案相同的机制(正则表达式)。当变量在较早的行中声明时,该解决方案会失败。 - Saran
@kbaskett248的答案之前并不存在。除此之外,它并没有什么影响。在正则表达式中,“var”是可选的。虽然你可能也可以修改@kbaskett248的答案片段以获得相同的效果。 - skuroda
感谢 @skuroda 进行了扩展。我编辑了你的答案,因为它缺少了 "import re"。 - Saran
哎呀,我加了 sublime 的引用,但还是忘了 re。真丢人。 - skuroda
实际上,我稍微改变了逻辑-->现在它是“完美的” ;) 选择路径现在不会缩进新行,但至少如果没有匹配,它不会中断。我已经更新了你的答案,希望你不介意。 - Saran

0

您可以通过将类似的代码片段与宏组合来实现基本上想要的内容。

该代码片段:

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

代码片段根据当前行找出变量名,并使用该变量格式化console.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" } 
},

如果变量赋值行已经存在,则这似乎是插入日志行的最佳方法。


宏的技巧不错,但它并没有按预期工作。 你的解决方案过于复杂,就像所有做得比需要多的解决方案一样,它只在行以“var”开头时才起作用,然后解析名称并使用它来创建“console.log…”。这个解决方案太过限制(例如,如果没有“var”,它只是复制该行)。问题清楚地描述了解决方案所需的内容——复制选择。 如果你纠正你的答案使其按照预期工作,我会接受它的。尽管如此,还是感谢你的努力。 - Saran

0
一个宏可以在两种情况下实现你想要的功能:
将其保存在以下位置:
~/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" } }

无论你突出显示什么,都将成为宏中的变量。

看起来很有前途。我会试一下。是否可能制作一个不触及/覆盖当前剪贴板内容的变体? - Saran

0

你好,我使用所选答案中的代码创建了this

它支持多个选择并放置正确的缩进。而且它不必是“var foo =”行。


1
欢迎来到Stack Overflow!如果您能提供除了链接以外的更多内容,这个答案会更好。仅有链接的答案往往会随着时间变得无效。如果您能想出改进答案的方法,请点击“编辑”。 - Bob Gilmore

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接