Как удалить начальные табуляции и / или начальные пробелы при копировании данных в буфер обмена?

Мне нужен способ удалить начальные отступы (табуляции и пробелы) из данных, скопированных в буфер обмена из Notepad++.

данные в самом документе Notepad++ должны продолжать иметь эти начальные отступы, а данные, скопированные в буфер обмена, не должны.

это поведение должно быть инициировано CTRL+C в одиночку и только тогда, когда я нахожусь внутри Notepad++.


это то, что происходит в Notepad++, когда я регулярно текст мышь:

enter image description here

вот что должно быть в буфере обмена после того, как я регулярно отмечаю текст и копирую его:

enter image description here


Примечания:

  1. изображения как раз лучше проиллюстрировать мою потребность - мои фактические коды более длинны.
  2. я тоже спрашивал об этом здесь.
  3. я спрашиваю, потому что я не могу вставьте блоки кода с отступами в терминал Linux если эти блоки кода включают cat heredocuments (связано с обработкой heredocument разделители, долгая история).
19
задан JohnDoea
14.03.2023 0:47 Количество просмотров материала 3012
Распечатать страницу

5 ответов

рассмотрим следующее AutoHotKey (AHK) скрипт. Смотрите AutoHotkey Учебник и документация для более подробной информации о сценариях AutoHotkey.

после установки AutoHotKey нажмите Ctrl+Shift+c или x в Notepad++, чтобы скопировать (или вырезать) в буфер обмена с обрезанными строками.

Примечание: я использовал Ctrl+Shift так что вы могли бы по-прежнему использовать оригинальную копию и вырезать нормально только с Ctrl. Если вам не нравится такое поведение, просто удалите + как +^c:: и +^v::.

посмотреть комментарии (начиная с ;) для объяснений. Как и в любом кодировании, лучше оставить в комментариях, чтобы лучше понять сценарий, когда вы вернетесь к нему позже.

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
7
отвечен Steven 2023-03-15 08:35

просто использовать Alt + Mouse dragging или Alt + Shift + Arrow keys для выбора столбца, затем Ctrl+C скопировать столбец.

посмотреть этот пример : https://notepad-plus-plus.org/fr/features/column-mode-editing.html

Edit:

мы также можем выбрать весь столбец, или даже более одного столбца, также мы можем выбрать одну или несколько строк.

вот простой способ сделать это:

  • левой кнопкой мыши по начало отбора разыскиваемых.

  • перейти к месту, где требуется выбор должен остановить

  • переместите курсор на это второе и последнее место, с:

    • С ALT + SHIFT ключи left click, одновременно, чтобы выбрать нужные столбцы и строки.

надеюсь, что это поможет

3
отвечен Yacine 2023-03-15 10:52

вот портативное решение, использующее Java

первый шаг, конечно,установка Java

далее вставьте следующее в файл с именем Trimmer.java в вашем каталоге пользователя (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);
    }
}

затем откройте командную строку и введите

javac Trimmer.java

теперь у вас должен быть триммер.файл класса в той же папке. Вы можете удалить триммер.java-файл.


на данный момент, мы имеем программа, которая удалит все начальные и конечные пробелы из каждой строки в буфере обмена, но нам все еще нужен способ запустить его удобно. Давайте сделаем горячую клавишу для него!

сначала создайте ярлык командной строки (щелкните правой кнопкой мыши C:\Windows\System32\cmd.exe)

затем щелкните правой кнопкой на ярлыке и выберите "Свойства."Есть несколько вещей, которые нужно сделать в этом окне. На вкладке "Ярлык" должна быть опция "цель", которая что-то говорит как

%windir%\system32\cmd.exe

изменить его, чтобы сказать

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

это приведет к командной строке просто запустите нашу программу и выйти, когда мы используем этот ярлык.

далее, нажмите на поле" Shortcut key " и нажмите горячую клавишу, которую вы хотите, чтобы вызвать замену текста. Рекомендую Ctrl+Shift+C для удобства использования!

наконец, измените параметр " Run " на "Minimized", так как мы не хотим, чтобы окно мигало экран каждый раз, когда мы используем ярлык.


после всего этого, вы должны быть в состоянии использовать следующим образом:

  1. копировать текст с помощью CtrlC
  2. обрезать текст с помощью Ctrl+Shift+C
  3. вставить обрезанный текст с помощью CtrlV
1
отвечен Ryan Hilbert 2023-03-15 13:09

может быть, я что-то упускаю, но все другие ответы, похоже, слишком усложняют решение. Если я правильно понял все, что вы хотите сделать, это удалить начальные пробелы (пробелы или табуляция) и вы уже имеющихся данных в Notepad++

в этом случае решение простое. Откройте файл в Notepad++ >> Search >> Replace... or Ctrl+H

найти:^( *)[ ]|^\t*

заменить на:оставить пустым

найти весь ведущий космос мы используем ^( *)[ ] и чтобы найти все ведущие вкладки, мы используем ^\t*, как таковой, чтобы найти все ведущие пространства или все ведущие вкладки мы используем оператор или |. Убедитесь в этом Регулярные Выражения в окне заменить.

это должно закончиться довольно быстро, даже если это большой файл. Закройте окно заменить и просто Выделить Все (Ctrl+A) > > Копировать (Ctrl+C)

0
отвечен JordanGS 2023-03-15 15:26

мой ответ основан на ответе Стивена, который я отметил как правильный (но у меня было несколько проблем с ним, и я попытался отредактировать, хотя мое редактирование было отклонено).

это код, который работал лучше для меня:

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

отличия от оригинального кода Стивена:

  • я удалил ввод SendMode из головы команды, потому что он сломал мой скрипт по какой-то причине.
  • я удалил клавишу Shift из обоих комбинаций клавиш, потому что я лично предпочитаю работать без него большую часть времени.
  • Я заменил Send, ^c и Send, ^x С Send, ^{sc02e} и Send, ^{sc02d}, соответственно. Это предотвращает ошибку удаления текста в режиме иврита и некоторых других режимах, отличных от английского языка).
  • я удалил комментарии.
0
отвечен JohnDoea 2023-03-15 17:43

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх