Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sublimetext3 升华-如何粘贴和转换缩进以匹配目标文件?_Sublimetext3_Sublimetext - Fatal编程技术网

Sublimetext3 升华-如何粘贴和转换缩进以匹配目标文件?

Sublimetext3 升华-如何粘贴和转换缩进以匹配目标文件?,sublimetext3,sublimetext,Sublimetext3,Sublimetext,假设我将一些四行间距的文本复制到剪贴板: var double = function(number){ <four spaces>return number * 2 } var double=函数(数字){ 报税号码*2 } 并将其粘贴到以制表符分隔的文件中如何使粘贴自动缩进本地文件自身的缩进?例如,当我粘贴到设置了缩进选项卡的文件中时,它应自动转换为: var double = function(number){ <a tab>return number * 2 }

假设我将一些四行间距的文本复制到剪贴板:

var double = function(number){
<four spaces>return number * 2
}
var double=函数(数字){
报税号码*2
}
并将其粘贴到以制表符分隔的文件中如何使粘贴自动缩进本地文件自身的缩进?例如,当我粘贴到设置了缩进选项卡的文件中时,它应自动转换为:

var double = function(number){
<a tab>return number * 2
}
var double=函数(数字){
报税号码*2
}

另外,我知道粘贴和缩进的快捷方式。这不符合我的要求。

如评论中所述,有用于将缩进转换为空格的命令和将缩进转换为制表符的命令

也可以分别使用
expand_tabs
unexpand_tabs
命令调用它们,因此,如果希望每次粘贴到文件时都触发这些命令,可以创建一个小插件

转到
首选项>浏览软件包
并在
用户
文件夹下创建一个新文件(例如
autoindent.py
)。添加以下内容:

import sublime_plugin

class AutoIndentListener(sublime_plugin.EventListener):
    def on_post_text_command(self, view, command_name, args):
        if command_name in ['paste', 'paste_and_indent']:
            s = view.settings()
            tab_size = s.get('tab_size')
            if s.get('translate_tabs_to_spaces'):
                view.run_command('expand_tabs')
            else:
                spaces = 4
                if tab_size == spaces:
                    view.run_command('unexpand_tabs')
                else:
                    view.run_command(
                        'set_setting',
                        {"setting": "tab_size", "value": spaces})
                    view.run_command('unexpand_tabs')
                    view.run_command(
                        'set_setting',
                        {"setting": "tab_size", "value": tab_size})
                    view.run_command('unexpand_tabs')
每次使用带有缩进的
粘贴
粘贴_
快捷方式时,它都会检查当前视图的
将选项卡转换为空间
设置(在上面的菜单中使用空格缩进),并对文件运行相应的命令


编辑

如果您知道要粘贴的代码有多少空格,我认为类似于上面的内容可能是最简单的。它基本上只是将制表符大小设置为缩进的空格大小(在本例中为4),如果不相同,则将4个空格的代码转换为制表符,然后设置并转换为制表符最初设置为的大小

如果您需要更复杂的内容(例如,检测粘贴代码的缩进)并想查看代码,请从sublime Packages主文件夹中解压缩
Default.sublime package
,然后查看:

  • 检测缩进.py
    :包含选择时调用的代码 从缓冲区猜测设置从菜单(上图)中,该菜单可能会被修改以猜测粘贴代码的缩进
  • indentation.py
    :它包含
    展开选项卡
    未展开选项卡
    的代码。这两个都是
    TabCommand
    的子类,因此您可以 将其子类化并实现您自己的
例如

然后,您可以将上述内容替换为:

import sublime_plugin

class AutoIndentListener(sublime_plugin.EventListener):
    def on_post_text_command(self, view, command_name, args):
        if command_name in ['paste', 'paste_and_indent']:
            s = view.settings()
            if s.get('translate_tabs_to_spaces'):
                view.run_command('expand_tabs')
            else:
                view.run_command('unexplode_tabs')

一种可能的手动解决方法是使用命令选项板。有用于转换为空间和转换为选项卡的命令。由于模糊匹配,您通常可以通过键入
ctspace
cttab
快速找到它。这是一个很好的答案,正是我想要的!不幸的是,在按照步骤(并重新启动升华)将4个间距的文本粘贴到带有“Spaces:2”的文档中后,间距不会改变。你有什么建议帮我调查一下吗?再次感谢您的回答。@Mikemacana没问题。请参阅我的编辑。希望能有帮助。
import sublime_plugin

class AutoIndentListener(sublime_plugin.EventListener):
    def on_post_text_command(self, view, command_name, args):
        if command_name in ['paste', 'paste_and_indent']:
            s = view.settings()
            if s.get('translate_tabs_to_spaces'):
                view.run_command('expand_tabs')
            else:
                view.run_command('unexplode_tabs')