Come rimuovere le schede iniziali e / o gli spazi iniziali durante la copia dei dati negli Appunti?


13

Ho bisogno di un modo per eliminare i rientri principali (tabulazioni e spazi) dai dati copiati negli appunti da Notepad ++.

I dati nel documento Notepad ++ stesso dovrebbero continuare ad avere questi rientri principali e i dati copiati negli appunti non dovrebbero.

Questo comportamento dovrebbe essere avviato da CTRL + C da solo e solo quando sono dentro Notepad ++.


Questo è ciò che accade in Notepad ++ quando segnare il testo regolarmente con il mouse:

inserisci qui la descrizione dell'immagine

Questo è ciò che dovrebbe essere negli appunti dopo aver segnato il testo regolarmente e copiarlo:

inserisci qui la descrizione dell'immagine


Appunti:

  1. Le immagini sono solo per illustrare meglio il mio bisogno: i miei codici attuali sono più lunghi.
  2. Ho anche chiesto di questo qui .
  3. Lo chiedo perché non riesco a incollare blocchi di codice rientrati nel terminale Linux se questi blocchi di codice includono documenti catereditari (ha a che fare con l'elaborazione dei delimitatori di documenti ereditari, una lunga storia).

Quante righe e caratteri stai cercando di copiare? IE sarebbe possibile rimuovere gli spazi iniziali, copiare e quindi annullare le modifiche?
FCTW

cosa succede se il file o alcune righe al suo interno non hanno una scheda iniziale? perché vuoi farlo sempre?
phuclv,

1
Perchè ti serve? Cosa rende fastidioso lo spazio bianco principale?
mrjink,

Nel guscio? Questo non dovrebbe essere un problema. Se è in vim, considera :set paste.
mrjink,

Nella shell, non in Vim. È un problema perché quando si incollano i codici con catheredocs - Lo è .
JohnDoea,

Risposte:


7

Considera il seguente script AutoHotKey (AHK). Vedere il tutorial e la documentazione di AutoHotkey per ulteriori spiegazioni sugli script AutoHotkey.

Dopo aver installato AutoHotKey, premere Ctrl+ Shift+ co xin Notepad ++ per copiare (o tagliare) negli Appunti con le linee tagliate.

Nota: ho usato Ctrl+ in Shiftmodo da poter utilizzare la copia originale e tagliarla normalmente solo con Ctrl. Se non ti piace questo comportamento, rimuovi +entrambi +^c::e +^v::.

Vedere i commenti (a partire da ;) per una spiegazione. Come con qualsiasi codifica, meglio lasciare nei commenti per capire meglio lo script quando torni ad esso in seguito.

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

I commenti non sono per una discussione estesa; questa conversazione è stata spostata in chat .
Journeyman Geek

Steven darei un altro premio di 50 punti, ma per qualche motivo non posso. Ho notato che la copia mentre si lavora in ebraico elimina effettivamente il contenuto e quindi devo fare ctrl+zper recuperare il contenuto eliminato. Questo è leggermente problematico. Capisco qualcosa come il seguente codice potrebbe essere utilizzato? if !LangID := EN { return }. L'aggiunta all'inizio dello script ha comportato errori e il wrapping dello script con una versione simile più un else { return }dopo la chiusura non ha funzionato ma non ha funzionato.
JohnDoea,

1
Non è possibile inserire una definizione di funzione TrimClipboard(){ ... }all'interno di ifun'istruzione. Inserisci l' ifistruzione all'interno della funzione o attorno ai comandiSend, ... TrimClipboard()
Steven

Ciao caro Steven. Nei miei tentativi, non ha funzionato. È un bug nella lingua? Ho dettagliato qui: autohotkey.com/boards/…
JohnDoea,

Ho appena pubblicato una soluzione nella stessa discussione lì: autohotkey.com/boards/…
JohnDoea,

3

Basta usare Alt + Mouse dragging o Alt + Shift + Arrow keysper selezionare la colonna, quindi Ctrl+Cper copiare la colonna.

Vedi questo esempio: https://notepad-plus-plus.org/fr/features/column-mode-editing.html

Modificare:

Possiamo anche selezionare l'intera colonna, o anche più di una colonna, inoltre possiamo selezionare una o più righe.

Ecco un modo semplice per farlo:

  • Fare clic con il tasto sinistro del mouse all'inizio della selezione desiderata.

  • Vai alla posizione in cui la selezione desiderata deve terminare

  • Sposta il cursore sulla seconda e ultima posizione, con:

    • Un successo sul ALTSHIFT tasti + e un left click, contemporaneamente, per selezionare le colonne e le righe desiderate.

Spero che questo aiuto


1
Aggiungo alcuni dettagli alla mia precedente risposta, spero che questo aiuto.
Yacine,

1
questo funziona solo se tutte le linee hanno la stessa scheda o spazi
iniziali

1
In realtà sì, e la domanda era che le linee hanno lo stesso formato
Yacine,

1

Ecco una soluzione portatile che usa Java

Il primo passo è, ovviamente, installazione di Java

Successivamente, incolla quanto segue in un file denominato Trimmer.javanella tua directory utente (C: \ Users \ nome_utente)

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);
    }
}

Quindi, apri un prompt dei comandi e digita

javac Trimmer.java

Ora dovresti avere un file Trimmer.class nella stessa cartella. È possibile eliminare il file Trimmer.java ora.


A questo punto, abbiamo un programma che rimuoverà tutti gli spazi bianchi iniziali e finali da ogni riga negli appunti, ma abbiamo ancora bisogno di un modo per eseguirlo comodamente. Facciamo un tasto di scelta rapida per questo!

Innanzitutto, crea un collegamento al prompt dei comandi (fai clic con il pulsante destro del mouse su C: \ Windows \ System32 \ cmd.exe)

Quindi, fai clic con il pulsante destro del mouse su questo collegamento e seleziona "Proprietà". Ci sono alcune cose che dobbiamo fare in questa finestra. Nella scheda "Scorciatoia", dovrebbe esserci un'opzione "Destinazione" che dice qualcosa di simile

%windir%\system32\cmd.exe

Cambialo per dire

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

Questo farà sì che il prompt dei comandi esegua semplicemente il nostro programma e si chiuda quando utilizziamo questo collegamento.

Successivamente, fai clic sulla casella "Tasto di scelta rapida" e premi il tasto di scelta rapida per attivare la sostituzione del testo. Consiglio Ctrl+ Shift+ Cper facilità d'uso!

Infine, modifica l'opzione "Esegui" su "Ridotta a icona" poiché non vogliamo che una finestra lampeggi sullo schermo ogni volta che utilizziamo il collegamento.


Dopo tutto ciò, dovresti essere in grado di utilizzare il seguente flusso di lavoro:

  1. Copia il testo utilizzando CtrlC
  2. Taglia il testo usando Ctrl+Shift +C
  3. Incollare il testo ritagliato usando CtrlV

Ciao Ryan Sto cercando un modo per fare tutto con CTRL + C da solo, purché sia ​​in Notepad ++ ... Inoltre, c'è un modo per avviare questo script quando avvio Windows?
JohnDoea,

0

Forse mi manca qualcosa, ma tutte le altre risposte sembrano complicare troppo la soluzione. Se ho capito correttamente tutto ciò che vuoi fare è rimuovere i primi spazi bianchi (spazi o tabulazioni) e hai i dati disponibili in Notepad ++

Nel qual caso la soluzione è semplice. Apri il tuo file inNotepad++ >> Search >> Replace... or Ctrl+H

Trova cosa :^( *)[ ]|^\t*

Sostituisci con : lascia vuoto

Per trovare tutto lo spazio principale che utilizziamo ^( *)[ ]e per trovare tutte le schede principali, utilizziamo ^\t*, come tale, per trovare tutto lo spazio principale o tutte le schede principali che utilizziamo o l'operatore |. Assicurarsi che Espressione regolare sia selezionata nella finestra di sostituzione.

Dovrebbe finire piuttosto rapidamente, anche se è un file di grandi dimensioni. Chiudi la finestra Sostituisci e seleziona Tutto (Ctrl + A) >> Copia (Ctrl + C)


In realtà no, voglio tenerli nel file. Ho solo bisogno di versione per appunti per non averli.
JohnDoea,

@Benia sì, l'ho capito. Non vorrei salvare il file dopo aver copiato i dati poiché non è necessario. Il motivo per cui l'ho suggerito perché personalmente uso Notepad ++ piuttosto pesantemente e alterare il modo in cui funziona la copia sarebbe più irritante per me che usare un regex per copiare e non salvare il file. Dato che è proprio in questo caso che non voglio personaggi protagonisti, nel 90% degli altri casi lo farei.
JordanGS,

0

La mia risposta si basa sulla risposta di Steven che ho contrassegnato come corretta (eppure ho avuto alcuni problemi con esso e ho provato a modificare anche se la mia modifica è stata respinta).

Questo è il codice che ha funzionato meglio per me:

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

Differenze dal codice originale di Steven:

  • Ho rimosso l'input SendMode dall'intestazione del comando perché ha rotto il mio script per qualche motivo.
  • Ho rimosso il tasto Maiusc da entrambe le combinazioni di tasti perché personalmente preferisco lavorare senza di esso per la maggior parte del tempo.
  • Ho sostituito Send, ^ce Send, ^xcon Send, ^{sc02e}eSend, ^{sc02d} , rispettivamente. Questo impedisce un bug di cancellazione del testo in modalità ebraica e alcune altre modalità di lingua non inglese).
  • Ho rimosso i commenti.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.