Como retirar as guias iniciais e / ou os espaços iniciais quando copiamos dados para a área de transferência?

13

Eu preciso de uma maneira de remover os recuos à esquerda (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 ter esses recuos iniciais e os dados copiados para a área de transferência.

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


É o que acontece no Notepad ++ quando eu marca o texto regularmente com o mouse:

insira a descrição da imagem aqui

É isso que deve estar na área de transferência depois que eu marcar o texto regularmente e copiá-lo:

insira a descrição da imagem aqui


Notas:

  1. As imagens são apenas para melhor ilustrar minha necessidade - meus códigos reais são mais longos.
  2. Eu também perguntei sobre isso aqui .
  3. Eu pergunto isso porque não consigo colar blocos de código recuado no terminal Linux se esses blocos de código incluem catheredocuments (tem a ver com o processamento de delimitadores de heredocument, uma longa história).
JohnDoea
fonte
Quantas linhas e caracteres você deseja copiar? IE, seria possível remover os espaços à esquerda, copiar e desfazer as alterações?
FCTW
e se o arquivo ou algumas linhas nele não tiver uma guia inicial? por que você quer fazer isso sempre?
Phuclv 02/05/19
1
Por que você precisa disso? O que torna o espaço em branco líder irritante?
Mrjink #
Na concha? Isso não deveria ser um problema. Se estiver no vim, considere :set paste.
Mrjink #
No shell, não no Vim. É um problema porque quando você cola códigos com catheredocs - é .
JohnDoea 4/17

Respostas:

7

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

Depois de instalar o AutoHotKey, pressione Ctrl+ Shift+ cou xno Notepad ++ para copiar (ou recortar) na área de transferência com as linhas cortadas.

Nota: usei Ctrl+ Shiftpara que você ainda possa usar a cópia original e cortar normalmente apenas Ctrl. Se você não gosta desse comportamento, basta remover +em ambos +^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 script quando voltar depois.

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
Steven
fonte
Comentários não são para discussão prolongada; esta conversa foi movida para o bate-papo .
Journeyman Geek
Steven, eu daria mais 50 pontos de recompensa, mas por algum motivo não posso. Percebi que copiar enquanto trabalhava em hebraico na verdade exclui o conteúdo e, em seguida, tenho que fazer ctrl+zpara recuperar o conteúdo excluído. Isso é um pouco problemático. Entendo que algo como o seguinte código possa ser utilizado? if !LangID := EN { return }. Adicioná-lo no início do script causou erro e agrupar o script com uma versão semelhante e uma else { return }após o fechamento não causou erro, mas não funcionou.
JohnDoea
1
Você não pode colocar uma definição de função TrimClipboard(){ ... }dentro de uma ifinstrução. Coloque a ifinstrução dentro da função ou em torno dos comandosSend, ... TrimClipboard()
Steven
Olá, querido Steven. Nos meus testes, não funcionou. Isso é um bug no idioma? Eu detalhado no comprimento aqui: autohotkey.com/boards/...
JohnDoea
Eu só publicou uma solução na mesma discussão lá: autohotkey.com/boards/...
JohnDoea
3

Basta usar Alt + Mouse dragging ou Alt + Shift + Arrow keyspara selecionar a coluna e, em seguida, Ctrl+Ccopiar a coluna.

Veja este exemplo: https://notepad-plus-plus.org/fr/features/column-mode-editing.html

Editar:

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

Aqui está uma maneira simples de fazer isso:

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

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

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

    • Um clique nas teclas ALT+ SHIFTe um left click, simultaneamente, para selecionar as colunas e linhas desejadas.

Espero que esta ajuda

Yacine
fonte
1
Acrescento mais alguns detalhes à minha resposta anterior, espero que ajude.
Yacine
1
isso só funciona se todas as linhas têm o mesmo guia que conduz ou espaços
phuclv
1
Na verdade, sim, ea pergunta era que as linhas têm o mesmo formato
Yacine
1

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

O primeiro passo é, é claro, instalar o Java

Em seguida, cole o seguinte em um arquivo nomeado Trimmer.javaem 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 removerá 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 criar uma tecla de atalho!

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 neste atalho e selecione "Propriedades". Há algumas coisas que precisamos fazer nesta janela. Na guia "Atalho", deve haver uma opção "Alvo" que diz algo como

%windir%\system32\cmd.exe

Mude para dizer

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

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

Em seguida, clique na caixa "Tecla de atalho" e pressione a tecla de atalho que deseja ativar a substituição do texto. Eu recomendo Ctrl+ Shift+ Cpara facilitar o uso!

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


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

  1. Copie texto usando CtrlC
  2. Cortar texto usando Ctrl+ Shift+C
  3. Cole o texto cortado usando CtrlV
Ryan Hilbert
fonte
Oi Ryan. Estou procurando uma maneira de fazer tudo apenas com CTRL + C, contanto que eu esteja no Notepad ++ ... Além disso, existe uma maneira de iniciar esse script ao inicializar o Windows?
JohnDoea #
0

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

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

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

Substitua por : deixe em branco

Para encontrar todo o espaço inicial que usamos ^( *)[ ]e para encontrar todas as guias principais, usamos ^\t*, como tal, para encontrar todo o espaço inicial ou todas as guias principais que usamos o operador ou |. Verifique se Expressão regular está selecionada na janela de substituição.

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

JordanGS
fonte
Na verdade não, quero mantê-los no arquivo. Eu só preciso da versão da área de transferência para não tê-las.
JohnDoea 4/17
@ Benia sim, eu entendi isso. Eu simplesmente não salvaria o arquivo depois de copiar os dados, pois não é necessário. A razão pela qual eu sugeri isso, porque pessoalmente eu uso o Notepad ++ com muita intensidade e alterar como a cópia funciona seria mais irritante para mim do que usar um regex para copiar e não salvar o arquivo. Como é apenas neste caso em que eu não quero personagens principais, em 90% dos outros casos eu o faria.
JordanGS
0

Minha resposta é baseada na resposta de Steven, que marquei como correta (ainda tive alguns problemas com ela e tentei editar, apesar de minha edição ter 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 de Steven:

  • Eu removi a Entrada SendMode da cabeça do comando porque ele quebrou meu script por algum motivo.
  • Eu removi a tecla Shift dos dois combos de teclas, porque eu pessoalmente prefiro trabalhar sem ela na maioria das vezes.
  • Troquei Send, ^ce Send, ^xcom Send, ^{sc02e}e Send, ^{sc02d}, respectivamente. Isso evita um erro de exclusão de texto no modo hebraico e em alguns outros modos de idioma que não o inglês).
  • Eu removi os comentários.
JohnDoea
fonte