Como remover guias principais e / ou espaços à esquerda ao copiar dados para a área de transferência?

13

Eu preciso de uma maneira de retirar os recuos (tabulações e espaços) dos dados copiados para a área de transferência do Notepad ++.

Os dados no próprio documento do Notepad ++ devem continuar tendo esses recuos principais e os dados copiados para a área de transferência não devem.

Esse comportamento deve ser iniciado apenas por CTRL + C e somente quando eu estiver dentro do Notepad ++.

Isso é o que acontece no Notepad ++ quando marquei o texto regularmente com o mouse:

Éoquedeveestarnaáreadetransferênciadepoisdemarcarotextoregularmenteecopiá-lo:

Notas:

  1. Asimagenssãoapenasparailustrarmelhorminhanecessidade-meuscódigosreaissãomaislongos.
  2. Eutambémpergunteisobreisso aqui .
  3. Pergunto isso porque não posso colar blocos de códigos recuados no terminal Linux se esses codeblocks incluírem cat heredocuments (tem a ver com o processamento de delimitadores de documentos, uma longa história).
por JohnDoea 01.05.2017 / 22:02

5 respostas

7

Considere o seguinte script AutoHotKey (AHK). Veja o Tutorial AutoHotkey e a documentação para mais explicações sobre os scripts AutoHotkey.

Depois de instalar o AutoHotKey, pressione Ctrl + Desloc + c ou x dentro do Notepad ++ para copiar (ou cortar ) para a área de transferência com as linhas cortadas.

Nota: Eu usei Ctrl + Shift para que você ainda pudesse usar a cópia original e cortar normalmente com apenas Ctrl . Se você não gostar desse comportamento, basta remover + em +^c:: e +^v:: .

Veja os comentários (começando com ; ) para uma explicação. Como em qualquer codificação, é melhor deixar nos comentários para entender melhor o roteiro quando você voltar mais tarde.

SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.

TrimClipboard()
{
    ; Split each line of the clipboard into an array. 
    ; Note: Ignoring Cr ('r) prevents duplicate rows
    linesArray := StrSplit(clipboard, "'n", "'r")

    newClip := "" ; Initialize output string

    for index, element in linesArray
    {   
        ; For each line: trim it, append it and CrLf to output string
        newClip .= trim(element) . "'r'n" 
    }
    ; Note: There is always an extra newline at this point, regardless 
    ; of if the clipboard ended in a newline.

    ; Assign value back to clipboard, without the trailing CrLf
    clipboard := SubStr(newClip, 1, -2)
}

#IfWinActive ahk_class Notepad++
; On Shift+Ctrl+C, perform copy, wait for new content, and trim clipboard
+^c::
    ; Note: ^{sc02e} is the scancode for c which works regardless of keyboard layout
    Send, ^{sc02e}
    Clipwait
    TrimClipboard()
return

;On Shift+Ctrl+X, perform copy, wait for new content, and trim clipboard
+^x::
    ; Note: ^{sc02d} is the scancode for x which works regardless of keyboard layout
    Send, ^{sc02d}
    Clipwait
    TrimClipboard()
return

; sc02e && sc02d are keyboard scan codes for the keys c and x respectively.
; The scancodes work regardless of the keyboard layout set in Windows

#IfWinActive
    
por 02.05.2017 / 00:45
3

Apenas use Alt + Mouse dragging ou Alt + Shift + Arrow keys para selecionar a coluna e, em seguida, Ctrl+C para copiar a coluna.

Veja este exemplo: link

Editar:

Também podemos selecionar a coluna inteira, ou até mais de uma coluna, também podemos selecionar uma ou várias linhas.

Aqui está uma maneira simples de fazer isso:

  • Clique com o botão esquerdo do mouse no início da seleção desejada.

  • Vá até o local em que a seleção desejada deve parar

  • Mova o cursor para o segundo e último local, com:

    • Um hit nas chaves ALT + SHIFT e left click , simultaneamente, para selecionar as colunas e linhas desejadas.

Espero que esta ajuda

    
por 01.05.2017 / 23:29
1

Aqui está uma solução portátil e ish usando Java

O primeiro passo é, obviamente, instalar o Java

Em seguida, cole o seguinte em um arquivo chamado Trimmer.java em seu diretório de usuários (C: \ Users \ your_name)

import java.awt.*;
import java.awt.datatransfer.*;

public class Trimmer{
    public static void main(String... lines) throws Exception{
        Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard();
        String str = (String)clip.getContents(null).getTransferData(DataFlavor.stringFlavor);
        lines = str.split("\n");
        str = "";
        for(String line: lines) str += line.trim() + '\n';
        StringSelection selection = new StringSelection(str.substring(0,str.length()-1));
        clip.setContents(selection,selection);
    }
}

Em seguida, abra um prompt de comando e digite

javac Trimmer.java

Agora você deve ter um arquivo Trimmer.class na mesma pasta. Você pode excluir o arquivo Trimmer.java agora.

Neste ponto, temos um programa que remove todos os espaços em branco iniciais e finais de cada linha da área de transferência, mas ainda precisamos de uma maneira de executá-lo de maneira conveniente. Vamos fazer uma tecla de atalho para isso!

Primeiro, crie um atalho para o prompt de comando (clique com o botão direito do mouse em C: \ Windows \ System32 \ cmd.exe)

Em seguida, clique com o botão direito do mouse nesse atalho e selecione "Propriedades". Existem algumas coisas que precisamos fazer nesta janela. Na guia "Atalho", deve haver uma opção "Destino" que diz algo como

%windir%\system32\cmd.exe

Altere para dizer

%windir%\system32\cmd.exe /C "java Trimmer"

Isso fará com que o prompt de comando simplesmente execute nosso programa e saia quando usarmos esse atalho.

Em seguida, clique na caixa "Tecla de atalho" e pressione a tecla de atalho que você deseja acionar a substituição do texto. Eu recomendo Ctrl + Deslocar + C para facilidade de uso!

Por fim, altere a opção "Executar" para "Minimizado", pois não queremos que uma janela pisque na tela toda vez que fizermos uso do atalho.

Depois de tudo isso, você deve poder usar o seguinte fluxo de trabalho:

  1. Copiar texto usando Ctrl C
  2. Corte o texto usando Ctrl + Deslocamento + C
  3. Cole o texto cortado usando Ctrl V
por 04.05.2017 / 07:43
0

Talvez eu esteja perdendo alguma coisa, mas todas as outras respostas parecem complicar demais a solução. Se eu entendi corretamente tudo o que você quer fazer é remover espaços em branco iniciais (espaços ou abas) e você tem os dados disponíveis no Notepad ++

Nesse caso, a solução é simples. Abra seu arquivo em Notepad++ >> Search >> Replace... or Ctrl+H

Encontre o que : ^( *)[ ]|^\t*

Substitua por : deixe em branco

Para encontrar todo o espaço principal, usamos ^( *)[ ] e, para encontrar todas as guias principais, usamos ^\t* , como tal, para encontrar todo o espaço principal ou todas as guias principais que usamos o operador | . Certifique-se de que Regular Expression esteja selecionado na janela de substituição.

Ele deve terminar rapidamente, mesmo que seja um arquivo grande. Feche a janela Substituir e apenas Selecionar tudo (Ctrl + A) > > Copiar (Ctrl + C)

    
por 04.05.2017 / 23:19
0

Minha resposta é baseada na resposta de Steven, que eu marquei como correta (ainda assim, tive alguns problemas com ela e tentei editar, embora minha edição tenha sido rejeitada).

Este é o código que funcionou melhor para mim:

TrimClipboard()
{
    linesArray := StrSplit(clipboard, "'n", "'r")

    newClip := ""

    for index, element in linesArray
    {   
        newClip .= trim(element) . "'r'n" 
    }

    clipboard := SubStr(newClip, 1, -2)
}

#IfWinActive ahk_class Notepad++
^c::
    Send, ^{sc02e}
    Clipwait
    TrimClipboard()
return

^x::
    Send, ^{sc02d}
    Clipwait
    TrimClipboard()
return

Diferenças do código original por Steven:

  • Eu removi o SendMode Input do cabeçalho do comando porque ele quebrou meu script por algum motivo.
  • Eu removi a tecla Shift dos dois combos principais porque eu pessoalmente prefiro trabalhar sem ela na maior parte do tempo.
  • Eu substituí Send, ^c e Send, ^x por Send, ^{sc02e} e Send, ^{sc02d} , respectivamente. Isso evita um erro de exclusão de texto no modo hebraico e alguns outros modos de idioma que não o inglês).
  • removi os comentários.
por 12.06.2017 / 16:03