Jak usunąć wiodące tabulatory i / lub wiodące spacje podczas kopiowania danych do schowka?

13

Potrzebuję sposobu na usunięcie wiodących wcięć (tabulatorów i spacji) z danych skopiowanych do schowka z Notepad ++.

Dane w samym dokumencie Notepad ++ powinny nadal mieć te wiodące wcięcia, a dane kopiowane do schowka nie powinny.

To zachowanie powinno być inicjowane przez CTRL + C i tylko wtedy, gdy jestem w Notepad ++.


Tak dzieje się w Notepad ++, kiedy zaznaczam tekst regularnie myszką:

wprowadź opis zdjęcia tutaj

To powinno być w schowku po regularnym zaznaczaniu tekstu i kopiowaniu:

wprowadź opis zdjęcia tutaj


Uwagi:

  1. Zdjęcia mają lepiej zilustrować moją potrzebę - moje rzeczywiste kody są dłuższe.
  2. Zapytałem również o to tutaj .
  3. Pytam o to, ponieważ nie mogę wkleić wciętych bloków kodu do terminala Linux, jeśli te catkody zawierają heredocuments (ma to związek z przetwarzaniem ograniczników heredocument, długa historia).
JohnDoea
źródło
Ile wierszy i znaków chcesz skopiować? Czy byłoby możliwe usunięcie wiodących spacji, skopiowanie, a następnie cofnięcie zmian?
FCTW
co jeśli plik lub niektóre wiersze w nim nie mają wiodącej karty? dlaczego chcesz to zawsze robić?
phuclv
1
Dlaczego tego potrzebujesz? Co sprawia, że ​​wiodące białe znaki są denerwujące?
mrjink
W skorupce? To nie powinno być problemem. Jeśli to vim, zastanów się :set paste.
mrjink
W powłoce, nie w Vimie. Jest to problem, ponieważ kiedy wklejasz kody za pomocą catheredoców - tak jest .
JohnDoea

Odpowiedzi:

7

Rozważ następujący skrypt AutoHotKey (AHK). Zobacz AutoHotkey Tutorial i dokumentację więcej wyjaśnień na temat skryptów AutoHotkey.

Po zainstalowaniu AutoHotKey naciśnij Ctrl+ Shift+ club xw Notepad ++, aby skopiować (lub wyciąć) do schowka z przyciętymi liniami.

Uwaga: użyłem Ctrl+ Shift, abyś mógł nadal używać oryginalnej kopii i normalnie ciąć tylko Ctrl. Jeśli nie podoba ci się to zachowanie, po prostu usuń je +w obu +^c::i +^v::.

;Wyjaśnienia znajdują się w komentarzach (począwszy od ). Podobnie jak w przypadku każdego kodowania, lepiej zostaw komentarz, aby lepiej zrozumieć skrypt, gdy wrócisz do niego później.

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
źródło
Komentarze nie są przeznaczone do rozszerzonej dyskusji; ta rozmowa została przeniesiona do czatu .
Journeyman Geek
Steven Dałbym kolejne 50 punktów nagrody, ale z jakiegoś powodu nie mogę. Zauważyłem, że kopiowanie podczas pracy w języku hebrajskim faktycznie usuwa zawartość, a następnie muszę zrobić, ctrl+zaby pobrać usuniętą treść. Jest to nieco problematyczne. Rozumiem, że można użyć następującego kodu? if !LangID := EN { return }. Dodanie go na początku skryptu spowodowało błąd i owijanie skryptu podobną wersją plus else { return }po zamknięciu nie błąd, ale nie działał.
JohnDoea,
1
Nie można wstawić definicji funkcji TrimClipboard(){ ... }do ifinstrukcji. Umieść ifinstrukcję wewnątrz funkcji lub wokół poleceńSend, ... TrimClipboard()
Steven
Cześć, drogi Steven. W moich próbach nie zadziałało. Czy to błąd w języku? Szczegółowo opisałem
JohnDoea
Właśnie opublikowałem rozwiązanie w tej samej dyskusji: autohotkey.com/boards/…
JohnDoea
3

Wystarczy użyć Alt + Mouse dragging lub, Alt + Shift + Arrow keysaby wybrać kolumnę, a następnie Ctrl+Cskopiować kolumnę.

Zobacz ten przykład: https://notepad-plus-plus.org/fr/features/column-mode-editing.html

Edytować:

Możemy również wybrać całą kolumnę lub nawet więcej niż jedną kolumnę, a także możemy wybrać jeden lub wiele wierszy.

Oto prosty sposób, aby to zrobić:

  • Kliknij lewym przyciskiem myszy na początku żądanego wyboru.

  • Przejdź do miejsca, w którym żądany wybór musi się zatrzymać

  • Przesuń kursor do drugiej i ostatniej lokalizacji, używając:

    • Uderzenie w klawisze ALT+ SHIFTi left clickjednocześnie, aby wybrać żądane kolumny i wiersze.

Mam nadzieję, że to pomoże

Yacine
źródło
1
Dodaję więcej szczegółów do mojej poprzedniej odpowiedzi, mam nadzieję, że ta pomoc.
Yacine
1
działa to tylko wtedy, gdy wszystkie linie mają tę samą wiodącą tabulację lub spacje
phuclv
1
Właściwie tak, a pytanie brzmiało, że linie mają ten sam format
Yacine
1

Oto przenośne rozwiązanie wykorzystujące Javę

Pierwszym krokiem jest oczywiście instalacja Java

Następnie wklej następujące elementy do pliku o nazwie Trimmer.javaw katalogu użytkownika (C: \ Users \ twoja_nazwa)

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

Następnie otwórz wiersz polecenia i wpisz

javac Trimmer.java

Powinieneś teraz mieć plik Trimmer.class w tym samym folderze. Możesz teraz usunąć plik Trimmer.java.


W tym momencie mamy program, który usunie wszystkie wiodące i końcowe białe spacje z każdej linii w schowku, ale wciąż potrzebujemy sposobu, aby uruchomić go wygodnie. Zróbmy dla niego skrót!

Najpierw utwórz skrót do wiersza polecenia (kliknij prawym przyciskiem myszy C: \ Windows \ System32 \ cmd.exe)

Następnie kliknij ten skrót prawym przyciskiem myszy i wybierz „Właściwości”. W tym oknie musimy zrobić kilka rzeczy. Na karcie „Skrót” powinna znajdować się opcja „Cel”, która mówi coś podobnego

%windir%\system32\cmd.exe

Zmień to, żeby powiedzieć

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

Spowoduje to, że wiersz polecenia po prostu uruchomi nasz program i zakończy działanie, gdy użyjemy tego skrótu.

Następnie kliknij pole „Klawisz skrótu” i naciśnij klawisz skrótu, który chcesz uruchomić zamianę tekstu. Polecam Ctrl+ Shift+ Cdla łatwości użytkowania!

Na koniec zmień opcję „Uruchom” na „Zminimalizowane”, ponieważ nie chcemy, aby okno migało na ekranie za każdym razem, gdy korzystamy ze skrótu.


Po tym wszystkim powinieneś być w stanie skorzystać z następującego przepływu pracy:

  1. Skopiuj tekst za pomocą CtrlC
  2. Przytnij tekst za pomocą Ctrl+ Shift+C
  3. Wklej przycięty tekst za pomocą CtrlV
Ryan Hilbert
źródło
Cześć Ryan. Szukam sposobu na zrobienie wszystkiego za pomocą samego CTRL + C, o ile jestem w Notepad ++ ... Czy jest też sposób na uruchomienie tego skryptu podczas uruchamiania systemu Windows?
JohnDoea
0

Może czegoś mi brakuje, ale wszystkie inne odpowiedzi wydają się zbyt skomplikować rozwiązanie. Jeśli dobrze zrozumiałem, wszystko, co chcesz zrobić, to usunąć wiodące białe spacje (spacje lub tabulatory), a dane są dostępne w Notepad ++

W takim przypadku rozwiązanie jest proste. Otwórz plik wNotepad++ >> Search >> Replace... or Ctrl+H

Znajdź co :^( *)[ ]|^\t*

Zamień na : pozostaw puste

Aby znaleźć całą wiodącą przestrzeń, której używamy ^( *)[ ]i aby znaleźć wszystkie wiodące karty, używamy ^\t*jako takiej, aby znaleźć całą wiodącą przestrzeń lub wszystkie wiodące karty, z których korzystamy operator lub |. Upewnij się, że w oknie zamiany wybrano Wyrażenie regularne .

Powinien kończyć się dość szybko, nawet jeśli jest to duży plik. Zamknij okno Zamień i po prostu wybierz wszystko (Ctrl + A) >> Kopiuj (Ctrl + C)

JordanGS
źródło
Właściwie nie, chcę je zachować w pliku. Potrzebuję tylko wersji schowka, żeby ich nie mieć.
JohnDoea
@Benia tak, zrozumiałem to. Po prostu nie zapisałbym pliku po skopiowaniu danych, ponieważ nie jest potrzebny. Powód, dla którego go zasugerowałem, ponieważ osobiście dość mocno używam Notepad ++, a zmiana sposobu jego kopiowania byłaby dla mnie bardziej irytująca niż użycie wyrażenia regularnego do kopiowania i nie zapisywania pliku. Ponieważ jest to tylko jeden przypadek, w którym nie chcę wiodących postaci, w 90% innych przypadków tak.
JordanGS
0

Moja odpowiedź opiera się na odpowiedzi Stevena, którą oznaczyłem jako poprawną (ale miałem z tym kilka problemów i próbowałem edytować, chociaż moja edycja została odrzucona).

Oto kod, który najlepiej dla mnie działał:

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

Różnice w stosunku do oryginalnego kodu Stevena:

  • Usunąłem SendMode Input z nagłówka polecenia, ponieważ z jakiegoś powodu zepsuł się mój skrypt.
  • Usunąłem klawisz Shift z obu kombinacji klawiszy, ponieważ osobiście wolę pracować bez niego przez większość czasu.
  • Wymieniłem Send, ^ci Send, ^xz Send, ^{sc02e}i Send, ^{sc02d}, odpowiednio. Zapobiega to błędom usuwania tekstu w trybie hebrajskim i niektórych innych trybach języka innego niż angielski).
  • Usunąłem komentarze.
JohnDoea
źródło