Sublime Text 2 - inserir quebras para coincidir com a quebra atual?

6

Existe uma maneira automática de inserir quebras de linha em todos os pontos em que o texto está no momento? Após esta operação, nenhuma linha deve ser envolvida, mas deve parecer visualmente idêntica.

    
por recursive 21.08.2012 / 18:25

3 respostas

10

Crie um plugin para isso. Selecione Ferramentas »Novo plug-in… e insira o seguinte script:

import sublime, sublime_plugin

class WrapLinesExCommand(sublime_plugin.TextCommand):
    def run(self, edit):
        wrap_column = 0

        if self.view.settings().get('word_wrap') == False:
            # wrapping is disabled, do nothing
            return

        if self.view.settings().get('wrap_width') == 0:
            # compute wrap column from viewport width
            wrap_column = int(self.view.viewport_extent()[0] / self.view.em_width())
        else:
            wrap_column = self.view.settings().get('wrap_width')

        e = self.view.begin_edit()
        rewrap(self.view, e, wrap_column)
        self.view.end_edit(e)

def rewrap(v, e, column):
    # 0-indexed current line
    current_line_no = 0

    # RHS expression is line count, can change whenever we create a new one
    while current_line_no < v.rowcol(v.size())[0] + 1:
        # where current line drawing starts
        current_line_coords = v.text_to_layout(v.text_point(current_line_no, 0))

        # rightmost character drawn in current viewport
        textpos = v.layout_to_text((v.em_width() * (column), current_line_coords[1]))

        # physical line boundaries as absolute text positions
        current_line = v.line(textpos)

        if textpos < current_line.b:
            # the current line spans multiple rows, so insert a newline at the wrap column

            textpos = v.layout_to_text((v.em_width() * (column), current_line_coords[1]))
            next_line_indent = v.text_to_layout(textpos+1)[0]

            # TODO why -1?
            next_line_indent_chars = int(next_line_indent/(v.em_width()))-1
            # determine how to indent the following line based on how wide the wrapping indents and what the current tab/spaces settings are
            if v.settings().get('translate_tabs_to_spaces') and v.settings().get('use_tab_stops'):
                next_line_indent_chars = next_line_indent_chars / v.settings().get('tab_size')
                next_line_indent_string = '\t' * next_line_indent_chars
            else:
                next_line_indent_string = ' ' * next_line_indent_chars

            # insert newline and spacing at wrap column (sublime hides actual line endings from editor, therefore it's always LF)
            v.insert(e, textpos, '\n' + next_line_indent_string)
        else:
            # only continue to the next line if we didn't edit the current line
            current_line_no = current_line_no + 1

Salvar, por exemplo como wrap_lines_ex_command.py no diretório padrão ( User ).

Para torná-lo acessível na barra de menus, selecione o item de menu Procurar Pacotes… , navegue até a pasta User e edite Main.sublime-menu (criando-o, se necessário), conforme descrito em < um href="https://superuser.com/a/452190/22317"> esta resposta por isso contém texto como por exemplo o seguinte:

[
    {
        "id": "edit",
        "children":
        [
            {"id": "wrap"},
            {"command": "wrap_lines_ex", "caption": "Wrap All Lines"}
        ]
    }
]

Screenshots

Antes:

Depois:

É claro que, neste caso, devido aos comentários serem incluídos, o código não funcionará mais. Mas esse é o comportamento como design por questão.

    
por 02.09.2012 / 17:52
1

Anos depois, existem pacotes prontos (plug-ins) para esse tipo de coisa. Eles podem não satisfazer exatamente a sua solicitação (para corresponder ao wrapping atual mostrado na sua janela), mas você pode definir em qual coluna deseja agrupar suas preferências.

Sublime-Wrap-Plus

Página do GitHub

Instalação

  1. Abra Sublime Text 2 or 3 .
  2. Pressione command-shift-p (Mac OS X) ou ctrl-shift-p (Windows) para abrir o Command Palette , digite "instalar" e selecione a opção para Install Package Control .
  3. Abra novamente o Command Palette , digite "instalar" novamente e selecione a opção Install a Package .
  4. Comece a digitar e selecione sublime-wrap-text .

Uso

  1. Selecione o texto em questão.
  2. Pressione command+alt+q (Mac OS X) ou alt+q (Windows).

Veja a página do GitHub para mais nuances de uso e como definir preferências.

Demonstração

Antes

Depois(acabeidedestacartodootextoeclicoemalt+q)

OutropacotesemelhanteéSublime-Wrap-Statement

Página do GitHub

Eu não tentei este, mas você pode tentar se quiser.

    
por 11.04.2017 / 22:50
0

No momento, parece que esse recurso não está incluído nas preferências do Sublime Text 2 (você pode ver por si mesmo em Default / Preferences.sublime-settings). É possível usar uma opção de configuração como "line_padding_bottom": 4 (onde 4 é o número de pixels que você deseja abaixo de cada linha) para leitura de clareza em todas as linhas, mas não é possível aplicar seletivamente preenchimento de linha diferente, dependendo se a linha está embrulhada.

Você pode enviar uma solicitação de recurso no fórum do Sublime Text 2 . Sei que apreciaria essa funcionalidade também, se for razoável implementá-la.

    
por 21.08.2012 / 18:43