13

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

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

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


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

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


Заметки:

  1. Изображения только для того, чтобы лучше проиллюстрировать мою потребность - мои реальные коды длиннее.
  2. Я также спросил об этом здесь.
  3. Я спрашиваю об этом, потому что не могу вставить блоки кода с отступом в терминал Linux, если эти кодовые блоки включают в себя heredocuments cat (имеет отношение к обработке разделителей heredocument, большая история).

5 ответов5

7

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

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

Примечание: я использовал 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
3

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

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

Редактировать:

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

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

  • Щелчок левой кнопкой мыши в начале требуемого выделения.

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

  • Переместите курсор в это второе и последнее местоположение, используя:

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

Надеюсь это поможет

1

Вот портативное решение с использованием Java

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

Затем вставьте следующее в файл с именем Trimmer.java в вашем пользовательском каталоге (C:\Users\ ваше_имя)

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

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


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

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

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

%windir%\system32\cmd.exe

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

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

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

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

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


После всего этого вы сможете использовать следующий рабочий процесс:

  1. Скопируйте текст с помощью Ctrl C
  2. Обрезать текст с помощью Ctrl+Shift+C
  3. Вставить обрезанный текст с помощью Ctrl V
0

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

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

Найти что: ^( *)[ ]|^\t*

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

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

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

0

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

Это код, который работал лучше всего для меня:

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

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

  • Я удалил InputMode Input из заголовка команды, потому что по какой-то причине он сломал мой скрипт.
  • Я удалил клавишу Shift из обеих комбинаций клавиш, потому что лично я предпочитаю работать без нее большую часть времени.
  • Я заменил Send, ^c и Send, ^x на Send, ^{sc02e} и Send, ^{sc02d} соответственно. Это предотвращает ошибку удаления текста в режиме на иврите и в некоторых других режимах, кроме английского.
  • Я удалил комментарии.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .