¿Cómo quitar las pestañas iniciales y / o los espacios iniciales al copiar datos en el portapapeles?

13

Necesito una forma de eliminar las sangrías iniciales (pestañas y espacios) de los datos copiados al portapapeles desde Notepad ++.

Los datos en el documento Notepad ++ deberían seguir teniendo estas sangrías iniciales y los datos copiados al portapapeles no deberían.

Este comportamiento debe iniciarse solo con CTRL + C y solo cuando estoy dentro de Notepad ++.


Esto es lo que sucede en Notepad ++ cuando marco el texto regularmente con el mouse:

ingrese la descripción de la imagen aquí

Eso es lo que debería estar en el portapapeles después de marcar el texto regularmente y copiarlo:

ingrese la descripción de la imagen aquí


Notas:

  1. Las imágenes son solo para ilustrar mejor mi necesidad: mis códigos reales son más largos.
  2. También pregunté sobre esto aquí .
  3. Pregunto esto porque no puedo pegar bloques de código sangrados en la terminal de Linux si estos bloques de código incluyen catdocumentos aquí (tiene que ver con el procesamiento de delimitadores de documentos aquí, una larga historia).
JohnDoea
fuente
¿Cuántas líneas y personajes quieres copiar? IE ¿sería factible eliminar los espacios iniciales, copiar y luego deshacer los cambios?
FCTW
¿Qué pasa si el archivo o algunas líneas no tienen una pestaña inicial? ¿Por qué quieres hacerlo siempre?
phuclv
1
¿Por qué necesitas esto? ¿Qué hace que el espacio en blanco líder sea molesto?
mrjink
En la cáscara? Eso no debería ser un problema. Si está en vim, considere :set paste.
mrjink
En el caparazón, no en Vim. Es un problema porque cuando pega códigos con catheredocs, lo es .
JohnDoea

Respuestas:

7

Considere el siguiente script de AutoHotKey (AHK). Consulte el Tutorial y la documentación de AutoHotkey para obtener más explicaciones sobre los scripts de AutoHotkey.

Después de instalar AutoHotKey, presione Ctrl+ Shift+ co xdentro de Notepad ++ para copiar (o cortar) al portapapeles con las líneas recortadas.

Nota: utilicé Ctrl+ Shiftpara poder seguir utilizando la copia original y cortar normalmente solo con Ctrl. Si no le gusta este comportamiento, simplemente elimine +ambos +^c::y +^v::.

Vea los comentarios (comenzando con ;) para obtener una explicación. Al igual que con cualquier codificación, es mejor dejarlo en los comentarios para comprender mejor el guión cuando vuelva a leerlo más 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
Steven
fuente
Los comentarios no son para discusión extendida; Esta conversación se ha movido al chat .
Journeyman Geek
Steven, le daría otra recompensa de 50 puntos, pero por alguna razón no puedo. Noté que copiar mientras trabajaba en hebreo, en realidad elimina contenido y luego tengo que hacer ctrl+zpara recuperar el contenido eliminado. Esto es un poco problemático. ¿Entiendo que se podría utilizar algo como el siguiente código? if !LangID := EN { return }. Agregarlo al comienzo de la secuencia de comandos trajo un error y envolver la secuencia de comandos con una versión similar más un else { return }error después del cierre, pero no funcionó.
JohnDoea
1
No puede poner una definición de función TrimClipboard(){ ... }dentro de una ifdeclaración. Ponga la ifdeclaración dentro de la función, o alrededor de los comandosSend, ... TrimClipboard()
Steven
Hola, querido Steven. En mis intentos, no funcionó. ¿Es esto un error en el idioma? He detallado en detalle aquí: autohotkey.com/boards/…
JohnDoea
Acabo de publicar una solución en la misma discusión allí: autohotkey.com/boards/…
JohnDoea
3

Simplemente use Alt + Mouse dragging o Alt + Shift + Arrow keyspara seleccionar la columna, luego Ctrl+Ccopie la columna.

Vea este ejemplo: https://notepad-plus-plus.org/fr/features/column-mode-editing.html

Editar:

También podemos seleccionar la columna completa, o incluso más de una columna, también podemos seleccionar una o varias filas.

Aquí hay una manera simple de hacerlo:

  • Haga clic con el botón izquierdo al comienzo de la selección deseada.

  • Vaya a la ubicación donde debe detenerse la selección deseada

  • Mueva el cursor a esa segunda y última ubicación, con:

    • Un golpe en las teclas ALT+ SHIFTy a left click, simultáneamente, para seleccionar las columnas y filas deseadas.

Espero que esto ayude

Yacine
fuente
1
Agrego algunos detalles más a mi respuesta anterior, espero esta ayuda.
Yacine
1
esto solo funciona si todas las líneas tienen la misma pestaña o espacios
iniciales
1
En realidad, sí, y la pregunta era que las líneas tienen el mismo formato
Yacine,
1

Aquí hay una solución portable-ish que usa Java

El primer paso es, por supuesto, instalar Java

Luego, pegue lo siguiente en un archivo nombrado Trimmer.javaen su directorio de usuarios (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);
    }
}

Luego, abra un símbolo del sistema y escriba

javac Trimmer.java

Ahora debería tener un archivo Trimmer.class en la misma carpeta. Puede eliminar el archivo Trimmer.java ahora.


En este punto, tenemos un programa que eliminará todos los espacios en blanco iniciales y finales de cada línea en el portapapeles, pero aún necesitamos una forma de ejecutarlo convenientemente. ¡Hagamos una tecla de acceso rápido para ello!

Primero, cree un acceso directo al símbolo del sistema (haga clic con el botón derecho en C: \ Windows \ System32 \ cmd.exe)

Luego, haga clic derecho en este acceso directo y seleccione "Propiedades". Hay algunas cosas que debemos hacer en esta ventana. En la pestaña "Acceso directo", debería haber una opción "Destino" que diga algo como

%windir%\system32\cmd.exe

Cámbialo para decir

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

Esto hará que el símbolo del sistema simplemente ejecute nuestro programa y salga cuando usemos este acceso directo.

A continuación, haga clic en el cuadro "Tecla de acceso directo" y presione la tecla de acceso rápido que desea activar el reemplazo de texto. ¡Recomiendo Ctrl+ Shift+ Cpara facilitar su uso!

Finalmente, cambie la opción "Ejecutar" a "Minimizado" ya que no queremos que una ventana parpadee en la pantalla cada vez que usemos el acceso directo.


Después de todo esto, debería poder usar el siguiente flujo de trabajo:

  1. Copiar texto usando CtrlC
  2. Recorte texto usando Ctrl+ Shift+C
  3. Pegar texto recortado usando CtrlV
Ryan Hilbert
fuente
Hola Ryan. Estoy buscando una manera de hacer todo con CTRL + C solo, siempre y cuando esté en Notepad ++ ... Además, ¿hay alguna manera de iniciar este script cuando inicio Windows?
JohnDoea
0

Tal vez me falta algo, pero todas las otras respuestas parecen complicar demasiado la solución. Si entendí correctamente, todo lo que quiere hacer es eliminar los espacios en blanco iniciales (espacios o pestañas) y tiene los datos disponibles en Notepad ++

En cuyo caso la solución es simple. Abre tu archivo enNotepad++ >> Search >> Replace... or Ctrl+H

Encuentra qué :^( *)[ ]|^\t*

Reemplazar con : dejar en blanco

Para encontrar todo el espacio inicial que utilizamos ^( *)[ ]y para encontrar todas las pestañas principales, utilizamos ^\t*, como tal, para encontrar todo el espacio inicial o todas las pestañas principales que utilizamos el operador o |. Asegúrese de que la expresión regular esté seleccionada en la ventana de reemplazo.

Debería terminar bastante rápido, incluso si se trata de un archivo grande. Cierre la ventana Reemplazar y simplemente seleccione Todo (Ctrl + A) >> Copiar (Ctrl + C)

JordanGS
fuente
En realidad no, quiero mantenerlos en el archivo. Solo necesito la versión del portapapeles para no tenerlos.
JohnDoea
@Benia, sí, lo entendí. Simplemente no guardaría el archivo después de copiar los datos, ya que no es necesario. La razón por la que lo sugerí porque personalmente uso bastante Notepad ++ y alterar cómo funciona su copia sería más irritante para mí que usar una expresión regular para copiar y no guardar el archivo. Dado que es solo en esta instancia donde no quiero personajes principales, en el 90% de los demás casos lo haría.
JordanGS
0

Mi respuesta se basa en la respuesta de Steven, que marqué como correcta (sin embargo, tuve algunos problemas e intenté editar aunque mi edición fue rechazada).

Este es el código que mejor funcionó para mí:

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

Diferencias con el código original de Steven:

  • Eliminé SendMode Input del encabezado del comando porque rompió mi script por alguna razón.
  • Quité la tecla Shift de ambos combos de teclas porque personalmente prefiero trabajar sin ella la mayor parte del tiempo.
  • Reemplacé Send, ^cy Send, ^xcon Send, ^{sc02e}y Send, ^{sc02d}, respectivamente. Esto evita un error de eliminación de texto en modo hebreo y algunos otros modos de idioma que no sean inglés).
  • Eliminé los comentarios.
JohnDoea
fuente