Comment supprimer les tabulations et / ou les espaces de début lors de la copie de données dans le presse-papiers?


13

J'ai besoin d'un moyen de supprimer les retraits principaux (tabulations et espaces) des données copiées dans le presse-papiers de Notepad ++.

Les données dans le document Notepad ++ lui-même doivent conserver ces indentations principales et les données copiées dans le presse-papiers ne doivent pas l'être.

Ce comportement doit être initié par CTRL + C seul et uniquement lorsque je suis dans Notepad ++.


C'est ce qui se passe dans Notepad ++ lorsque je marque régulièrement le texte avec la souris:

entrez la description de l'image ici

C'est ce qui devrait être dans le presse-papiers après avoir marqué le texte régulièrement et le copier:

entrez la description de l'image ici


Remarques:

  1. Les images sont juste pour mieux illustrer mon besoin - mes codes réels sont plus longs.
  2. J'ai également posé des questions à ce sujet ici .
  3. Je pose cette question parce que je ne peux pas coller de blocs de code en retrait dans un terminal Linux si ces blocs de code incluent des documents cathérités (a à voir avec le traitement des délimiteurs de documents hérités, une longue histoire).

Combien de lignes et de caractères cherchez-vous à copier? IE serait-il possible de supprimer les espaces de tête, de copier, puis d'annuler les modifications?
FCTW

que se passe-t-il si le fichier ou certaines lignes ne contiennent pas d’onglet de tête? pourquoi voulez-vous toujours le faire?
phuclv

1
Pourquoi en avez-vous besoin? Qu'est-ce qui rend ennuyeux le premier espace blanc?
mrjink

Dans la coquille? Ça ne devrait pas être un problème. Si c'est dans vim, réfléchissez :set paste.
mrjink

Dans la coquille, pas dans Vim. C'est un problème parce que lorsque vous collez des codes avec catheredocs - C'est vrai .
JohnDoea

Réponses:


7

Considérez le script AutoHotKey (AHK) suivant. Consultez le didacticiel et la documentation AutoHotkey pour plus d'explications sur les scripts AutoHotkey.

Après avoir installé AutoHotKey, appuyez sur Ctrl+ Shift+ cou xdans le Bloc-notes ++ pour copier (ou couper) dans le presse-papiers avec les lignes coupées.

Remarque: j'ai utilisé Ctrl + Shiftpour que vous puissiez toujours utiliser la copie originale et couper normalement avec seulement Ctrl. Si vous n'aimez pas ce comportement, supprimez simplement les +deux +^c::et +^v::.

Voir les commentaires (commençant par ;) pour une explication. Comme pour tout codage, mieux vaut laisser dans les commentaires pour mieux comprendre le script quand on y reviendra plus tard.

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

Les commentaires ne sont pas pour une discussion approfondie; cette conversation a été déplacée vers le chat .
Journeyman Geek

Steven, je donnerais encore 50 points de prime, mais pour une raison que je ne peux pas. J'ai remarqué que la copie en travaillant en hébreu, en fait, supprime le contenu, puis je dois faire ctrl+zpour récupérer le contenu supprimé. C'est un peu problématique. Je comprends que quelque chose comme le code suivant pourrait être utilisé? if !LangID := EN { return }. L'ajouter au début du script a généré une erreur et encapsuler le script avec une version similaire plus une else { return }après la fermeture n'a pas généré d'erreur mais n'a pas fonctionné.
JohnDoea

1
Vous ne pouvez pas mettre une définition de fonction à l' TrimClipboard(){ ... }intérieur d'une ifinstruction. Mettez l' ifinstruction dans la fonction ou autour des commandesSend, ... TrimClipboard()
Steven

Salut, cher Steven. Dans mes essais, cela n'a pas fonctionné. Est-ce un bug dans la langue? J'ai détaillé en détail ici: autohotkey.com/boards/…
JohnDoea

Je viens de publier une solution dans la même discussion là-bas: autohotkey.com/boards/…
JohnDoea

3

Utilisez simplement Alt + Mouse dragging ou Alt + Shift + Arrow keyspour sélectionner la colonne, puis Ctrl+Ccopiez la colonne.

Voir cet exemple: https://notepad-plus-plus.org/fr/features/column-mode-editing.html

Éditer:

Nous pouvons également sélectionner la colonne entière, ou même plus d'une colonne, nous pouvons également sélectionner une ou plusieurs lignes.

Voici un moyen simple de le faire:

  • Clic gauche de la souris au début de la sélection souhaitée.

  • Allez à l'endroit où la sélection souhaitée doit s'arrêter

  • Déplacez le curseur sur ce deuxième et dernier emplacement, avec:

    • Appuyez sur les touches ALT+ SHIFTet a left click, simultanément, pour sélectionner les colonnes et les lignes souhaitées.

J'espère que cette aide


1
J'ajoute quelques détails à ma réponse précédente, j'espère que cette aide.
Yacine

1
cela ne fonctionne que si toutes les lignes ont le même onglet de tête ou les mêmes espaces
phuclv

1
En fait, oui, et la question était que les lignes ont le même format
Yacine

1

Voici une solution portable-ish utilisant Java

La première étape consiste, bien sûr, à installer Java

Ensuite, collez ce qui suit dans un fichier nommé Trimmer.javadans votre répertoire utilisateur (C: \ Users \ votre_nom)

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

Ensuite, ouvrez une invite de commande et tapez

javac Trimmer.java

Vous devriez maintenant avoir un fichier Trimmer.class dans le même dossier. Vous pouvez maintenant supprimer le fichier Trimmer.java.


À ce stade, nous avons un programme qui supprimera tous les espaces blancs de début et de fin de chaque ligne du presse-papiers, mais nous avons toujours besoin d'un moyen de l'exécuter facilement. Faisons un raccourci clavier pour cela!

Créez d'abord un raccourci vers l'invite de commande (cliquez avec le bouton droit sur C: \ Windows \ System32 \ cmd.exe)

Ensuite, cliquez avec le bouton droit sur ce raccourci et sélectionnez "Propriétés". Il y a quelques choses que nous devons faire dans cette fenêtre. Dans l'onglet "Raccourci", il devrait y avoir une option "Cible" qui dit quelque chose comme

%windir%\system32\cmd.exe

Changez-le pour dire

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

Cela entraînera l'invite de commandes à exécuter simplement notre programme et à quitter lorsque nous utiliserons ce raccourci.

Ensuite, cliquez sur la case "Touche de raccourci" et appuyez sur le raccourci clavier que vous souhaitez déclencher le remplacement du texte. Je recommande Ctrl+ Shift+ Cpour une facilité d'utilisation!

Enfin, changez l'option "Exécuter" en "Réduit" car nous ne voulons pas qu'une fenêtre clignote sur l'écran chaque fois que nous utilisons le raccourci.


Après tout cela, vous devriez pouvoir utiliser le workflow suivant:

  1. Copiez du texte à l'aide CtrlC
  2. Couper le texte à l'aide de Ctrl+ Shift+C
  3. Coller le texte coupé à l'aide de CtrlV

Salut Ryan. Je cherche un moyen de tout faire avec CTRL + C seul, tant que je suis dans Notepad ++ ... De plus, existe-t-il un moyen de démarrer ce script lorsque je démarre Windows?
JohnDoea

0

Peut-être que je manque quelque chose, mais toutes les autres réponses semblent compliquer la solution. Si j'ai bien compris, tout ce que vous voulez faire est de supprimer les principaux espaces blancs (espaces ou tabulations) et vous avez les données disponibles dans Notepad ++

Dans ce cas, la solution est simple. Ouvrez votre fichier dansNotepad++ >> Search >> Replace... or Ctrl+H

Trouvez quoi :^( *)[ ]|^\t*

Remplacer par : laisser vide

Pour trouver tout l'espace de tête que nous utilisons ^( *)[ ]et pour trouver tous les onglets de tête, nous utilisons ^\t*, en tant que tels, pour trouver tout l'espace de tête ou tous les onglets de tête que nous utilisons, ou l'opérateur |. Assurez-vous que l' expression régulière est sélectionnée dans la fenêtre de remplacement.

Il devrait se terminer assez rapidement, même s'il s'agit d'un gros fichier. Fermez la fenêtre Remplacer et sélectionnez tout (Ctrl + A) >> Copier (Ctrl + C)


En fait non, je veux les garder dans le dossier. J'ai juste besoin de la version presse-papiers pour ne pas les avoir.
JohnDoea

@Benia ouais, j'ai compris ça. Je ne voudrais tout simplement pas enregistrer le fichier après avoir copié les données car il n'est pas nécessaire. La raison pour laquelle je l'ai suggéré parce que personnellement j'utilise Notepad ++ assez fortement et modifier le fonctionnement de la copie serait plus irritant pour moi que d'utiliser une expression régulière pour copier et ne pas enregistrer le fichier. Comme c'est juste dans ce cas où je ne veux pas de caractères principaux, dans 90% des autres cas, je le ferais.
JordanGS

0

Ma réponse est basée sur la réponse de Steven que j'ai marquée comme correcte (pourtant j'ai eu quelques problèmes avec elle et j'ai essayé de la modifier bien que ma modification ait été rejetée).

Voici le code qui m'a le mieux fonctionné:

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

Différences par rapport au code d'origine de Steven:

  • J'ai supprimé SendMode Input de la tête de la commande car il a cassé mon script pour une raison quelconque.
  • J'ai supprimé la touche Maj des deux combinaisons de touches car je préfère personnellement travailler sans elle la plupart du temps.
  • J'ai remplacé Send, ^cet Send, ^xavec Send, ^{sc02e}etSend, ^{sc02d} , respectivement. Cela empêche un bogue de suppression de texte en mode hébreu et certains autres modes de langue non anglais).
  • J'ai supprimé les commentaires.
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.