Sublime Text 3, converta espaços em tabulações

192

Sei que existem muitos posts sobre isso, mas não consegui fazê-lo funcionar.
Eu uso guias para codificação. Existe uma maneira de converter sempre espaços em guias? Ou seja, abrir e salvar arquivos? Alguém teve uma ideia?

// edit:
Meu desejo é fazer isso automaticamente ! -> abrir, salvar ou em tempo real
Alguém sabe como fazer?


Eu tentei isso :

import sublime, sublime_plugin, os

class ExpandTabsOnSave(sublime_plugin.EventListener):
  # Run ST's 'expand_tabs' command when saving a file
  def on_pre_save(self, view):
    if view.settings().get('expand_tabs_on_save') == 1:
      view.window().run_command('expand_tabs')

E aqui estão as minhas configurações de usuário:

{
    "auto_complete_selector": "source - comment, meta.tag - punctuation.definition.tag.begin",
    "auto_indent": true,
    "detect_indentation": true,
    "draw_white_space": "all",
    "ensure_newline_at_eof_on_save": true,
    "expand_tabs_on_save": true,
    "font_face": "SourceCodePro-Regular",
    "font_size": 10,
    "format_on_save": true,
    "ignored_packages":
    [
        "Vintage"
    ],
    "indent_to_bracket": true,
    "open_files_in_new_window": false,
    "smart_indent": true,
    "tab_size": 4,
    "translate_tabs_to_spaces": false,
    "trim_automatic_white_space": true,
    "trim_trailing_white_space_on_save": true,
    "use_tab_stops": false,
    "word_wrap": false
}
chris
fonte
O plug-in que você postou está realmente funcionando bem para mim no ST3, versão 3059. Você pode abrir o console Ctrl + ~e ver se ele está causando algum erro de plug-in? E se você tiver o Controle de Pacotes instalado, poderá ver se ExpandTabsOnSaveestá listado como um plug-in instalado?
Angerson
louco, parece estar instalado (listado na lista de pacotes) e no console não consigo encontrar nenhum erro :-(
chris
Tente adicionar print("debug")ou semelhante ao plug-in para ver se está sendo executado ou não no salvamento.
Angerson
omg, suas obras! estava no diretório errado na máquina Windows, os pacotes estão listados em user /.../ AppData / Roaming / SublimeText3 / Packages Muito obrigado!
21414 chris
Certifique-se de definir essa exibição como a exibição ativa da janela antes de executar o comando. Pode não ser muito provável, mas conforme você a postou, é possível que ela expanda as guias de uma página diferente daquela que você está tentando salvar. Mesmo com a visualização do foco, suponho que haja uma chance de salvar em um arquivo errado, mas pelo menos você pode minimizar o risco.
skuroda

Respostas:

376

No canto inferior direito da sua janela Sublime Text, você verá um indicador de indentação semelhante a este:

Menu de opções de recuo

Clicar nele abrirá um menu com opções para ajustar suas preferências de recuo e, mais importante Convert Indentation to Tabs/Spaces,.

insira a descrição da imagem aqui

O mesmo menu está listado em View -> Indentation.

angerson
fonte
42
Sim eu conheço. Meu desejo é fazer isso automaticamente ... alguma idéia?
chris
2
@chris ツ Ah. Você poderia reformatar sua pergunta para tornar isso mais explicitamente óbvio? Perdi o seu significado, para que outros também pudessem.
Angerson
Não tenho essa barra de status na parte inferior - como faço para obtê-la?
Geoidesic
1
E isso ocorre em todo o arquivo e não pode ser feito apenas em uma seleção.
Not2qubit
Muito agradável. Eu também fiz 'command-a' para selecionar todos, 'command- [' para cancelar a indentação e, em seguida, 'edit> line> reindent' para corrigir o arquivo. Tenho certeza que isso pode ser incorporado em uma macro.
ribeiros DuBois de
130

Na parte inferior da janela Sublime, você verá algo representando sua configuração de guia / espaço.

Você receberá um menu suspenso com várias opções. As opções importantes para você são:

  • Converter recuo em espaços
  • Converter recuo em guias

Aplique a configuração desejada ao documento inteiro.

Espero que isto ajude.

mais erier
fonte
2
Eu gostaria que isso pudesse ser feito sob carga e automaticamente ... para todos os arquivos que eu abrir. Quero dizer: a conversão de espaços de indentação em tabulações. Ele é executado automaticamente no carregamento :-)
Filip OvertoneSinger Rydlo
1
Eu ouvi você sobre isso. Prefiro tabulações, MAS entendo por que muito código é escrito com espaços. Com espaços, não haverá inconsistências entre os IDE - um espaço é um espaço é um espaço. As guias podem ocupar um número variável de espaços entre os IDE e fazer o código parecer estranho.
Erier
Olá @Green - o que não funciona? Vamos começar isso funcionou ...
erier
80

Como você já deve saber, você pode personalizar suas configurações de recuo Preferences.sublime-settings, por exemplo:

"detect_indentation": true,
"tab_size": 4,
"translate_tabs_to_spaces": false

Isso definirá seu editor para usar guias com 4 espaços de largura e substituirá o comportamento padrão que faz com que o Sublime corresponda à indentação de qualquer arquivo que você estiver editando. Com essas configurações, reentrar o arquivo fará com que quaisquer espaços sejam substituídos por guias.

No que diz respeito à reentrância automática ao abrir um arquivo, isso não é tão fácil (mas provavelmente não é uma ótima idéia, pois as mudanças de espaço em branco causam estragos nas diferenças de arquivo). Qual poderia ser um curso de ação melhor: você pode mapear um atalho para re-indentação e apenas acioná-lo quando abrir um novo arquivo que precise ser corrigido.

justin
fonte
13

Você pode usar a paleta de comandos para resolver esse problema.

Etapa 1: Ctrl + Shift + P(para ativar a paleta de comandos)

Etapa 2: digite "Recuo", escolha "Indentation: Convert to Tabs"

Jojoleo
fonte
1
Excelente. Obrigado.
RJ
Melhor solução. Obrigado!
Matthew K
7

No meu caso, esta linha resolveu o problema:

"translate_tabs_to_spaces": false
vljs
fonte
4

Aqui está uma solução que será convertida automaticamente em guias sempre que você abrir um arquivo.

Crie este arquivo .../Packages/User/on_file_load.py::

import sublime
import sublime_plugin

class OnFileLoadEventListener(sublime_plugin.EventListener):

    def on_load_async(self, view):
        view.run_command("unexpand_tabs")

NOTA. Faz com que o arquivo esteja em um estado não salvo após abri-lo, mesmo que nenhuma conversão de espaço para guia tenha ocorrido ... talvez alguns possam ajudar com uma correção para isso ...

TheStoryCoder
fonte
Eu acho que você quis dizer .../Packages/User/on_file_load.py, não.php
Pranav Nutalapati
@PranavNutalapati Obrigado por capturar isso.
TheStoryCoder
Sim claro. Sem problemas.
Pranav Nutalapati
tente em on_loadvez de on_load_async.
Pedro Góes
3

Para converter automaticamente espaços em abas ao salvar , adicione o seguinte script Python a uma subpasta criada recentemente chamada "UnexpandTabsOnSave" em "$ SUBLIME_HOME $ \ Packages \":

import sublime, sublime_plugin, os

class ConvertSpacesToTabsOnSave( sublime_plugin.EventListener ):
  # Run Sublime's 'unexpand_tabs' command when saving any file
  def on_pre_save( self, view ):
    view.window().run_command( 'unexpand_tabs' )

Obrigado pelo recurso inicial.

sean2078
fonte
0

Você pode substituir guias por espaços em todos os arquivos do projeto:

  1. Substituindo tudo Ctrl+Shif+F
  2. Definir pesquisa regex ^\A(.*)$
  3. Defina o diretório como Your dir
  4. Substituir por \1

    insira a descrição da imagem aqui

  5. Isso fará com que todos os arquivos do projeto sejam abertos, com o buffer marcado como sujo. Com isso, agora você pode habilitar opcionalmente essas próximas configurações de texto sublime, para aparar todos os arquivos com espaço em branco e garantir uma nova linha no final de cada arquivo.

    Você pode ativar essas configurações acessando o menu Preferences -> Settingse adicionando este conteúdo ao seu arquivo de configurações:

    1. "ensure_newline_at_eof_on_save": true,
    2. "trim_trailing_white_space_on_save": true,
  6. Abra o console Sublime Text, acessando o menu View -> Show Console (Ctrl+`)e execute o comando: import threading; threading.Thread( args=(set(),), target=lambda counterset: [ (view.run_command( "expand_tabs", {"set_translate_tabs": True} ), print( "Processing {:>5} view of {:>5}, view id {} {}".format( len( counterset ) + 1, len( window.views() ), view.id(), ( "Finished converting!" if len( counterset ) > len( window.views() ) - 2 else "" ) ) ), counterset.add( len( counterset ) ) ) for view in window.views() ] ).start()
  7. Agora, salve todos os arquivos alterados, acessando o menu File -> Save All
do utilizador
fonte
0

se você possui o Mac, use a opção de ajuda (geralmente a última opção na barra de menus do Mac) e digite: "indentação de tabulação" e escolha uma largura de indentação de tabulação

mas geralmente, você pode seguir este caminho: view -> recuo

Todos
fonte
0

Use o seguinte comando para resolvê-lo:

autopep8 -i <filename>.py
Sharyar Vohra
fonte