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


13

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

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

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


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

введите описание изображения здесь

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

введите описание изображения здесь


Примечания:

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

Сколько строк и символов вы хотите скопировать? IE будет возможно удалить пробелы, скопировать, а затем отменить изменения?
FCTW

Что делать, если файл или несколько строк в нем не имеют ведущей вкладки? почему ты хочешь делать это всегда?
phuclv

1
зачем вам это? Что делает ведущие пробелы раздражающими?
mrjink

В оболочке? Это не должно быть проблемой. Если это в vim, подумайте :set paste.
mrjink

В оболочке, а не в Vim. Это проблема, потому что когда вы вставляете коды с помощью catheredocs - это так .
JohnDoea

Ответы:


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

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

Стивен, я бы дал еще 50 баллов, но по какой-то причине не могу. Я заметил, что копирование во время работы на иврите фактически удаляет контент, а затем мне нужно сделать, ctrl+zчтобы извлечь удаленный контент. Это немного проблематично. Я понимаю, что-то вроде следующего кода может быть использовано? if !LangID := EN { return }, Добавление его в начало скрипта привело к ошибке, а завершение скрипта с аналогичной версией плюс else { return }после закрытия не было ошибки, но не работало.
JohnDoea

1
Вы не можете поместить определение функции TrimClipboard(){ ... }внутри ifоператора. Поместите ifоператор внутри функции или вокруг командSend, ... TrimClipboard()
Стивен

Привет, дорогой Стивен. В моих попытках это не сработало. Это ошибка в языке? Я подробно изложил здесь: autohotkey.com/boards/…
JohnDoea

Я только что опубликовал решение в том же обсуждении там: autohotkey.com/boards/…
JohnDoea

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
Я добавлю еще некоторые детали в мой предыдущий ответ, надеюсь, это поможет.
Ясин

1
это работает, только если все строки имеют одинаковую
начальную

1
Собственно, да, и вопрос был в том, что строки имеют одинаковый формат
Yacine

1

Вот портативное решение с использованием 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

Теперь у вас должен быть файл 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. Скопируйте текст используя CtrlC
  2. Обрезать текст с помощью Ctrl+ Shift+C
  3. Вставить обрезанный текст, используя CtrlV

Привет Райан. Я ищу способ сделать все только с помощью CTRL + C, если я в Notepad ++ ... Кроме того, есть ли способ запустить этот скрипт при загрузке Windows?
JohnDoea

0

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

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

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

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

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

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


На самом деле нет, я хочу сохранить их в файле. Мне просто нужно в буфер обмена версии, чтобы их не было.
JohnDoea

@ Benia да, я поняла это. Я просто не стал бы сохранять файл после копирования данных, так как он не нужен. Причина, по которой я это предложил, потому что лично я довольно интенсивно использую Notepad ++, и изменение способа его копирования будет для меня более раздражающим, чем использование регулярных выражений для копирования, а не для сохранения файла. Так как это только в одном случае, когда я не хочу главных героев, в 90% других случаев я бы.
JordanGS

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}, соответственно. Это предотвращает ошибку удаления текста в режиме на иврите и в некоторых других режимах, кроме английского.
  • Я удалил комментарии.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.