Як знімати провідні вкладки та / або провідні пробіли під час копіювання даних у буфер обміну?


13

Мені потрібен спосіб зняти провідні відступи (вкладки та пробіли) з даних, скопійованих у буфер обміну з Notepad ++.

Дані в документі Notepad ++ самі повинні мати ці провідні відступи, а дані, скопійовані в буфер обміну, не повинні.

Таку поведінку слід ініціювати CTRL + C поодинці і лише тоді, коли я перебуваю всередині Notepad ++.


Це відбувається в «Блокноті ++», коли я регулярно мічую текст мишкою:

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

Ось що має бути в буфері обміну після того, як я регулярно позначаю текст і копіюю його:

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


Примітки:

  1. Образи просто для того, щоб краще проілюструвати мою потребу - мої фактичні коди довші.
  2. Я також про це запитав тут .
  3. Я запитую це, тому що я не можу вставити відкладені блоки коду до терміналу Linux, якщо ці кодові блоки включають catгередокументи (пов’язані з обробкою роздільників heredocument, довга історія).

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

що робити, якщо файл або деякі рядки в ньому не мають провідної вкладки? чому ти хочеш це робити завжди?
phuclv

1
Навіщо вам це потрібно? Що дратує провідних пробілів?
mrjink

У оболонці? Це не повинно бути проблемою. Якщо це в vim, подумайте :set paste.
mrjink

В оболонці, а не у Вім. Це проблема, тому що коли ви вставляєте коди catгередоками - Це так .
JohnDoea

Відповіді:


7

Розглянемо наступний сценарій 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

Коментарі не для розширеного обговорення; ця розмова була переміщена до чату .
Подорожник Geek

Стівен я би дав ще 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
це працює лише в тому випадку, якщо всі рядки мають однакові провідні вкладки або пробіли
phuclv

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для зручності використання!

Нарешті, змініть параметр "Виконати" на "Мінімізований", оскільки ми не хочемо, щоб вікно блимало на екран щоразу, коли ми використовуємо ярлик.


Після цього ви повинні мати можливість використовувати наступний робочий процес:

  1. Скопіюйте текст за допомогою CtrlC
  2. Обріжте текст, використовуючи Ctrl+ Shift+C
  3. Вставте обрізаний текст за допомогою CtrlV

Привіт, Райан. Я шукаю спосіб зробити все з CTRL + C поодинці, якщо я перебуваю в Notepad ++ ... Крім того, чи є спосіб запустити цей скрипт під час завантаження Windows?
JohnDoea

0

Можливо, мені чогось не вистачає, але всі інші відповіді, здається, занадто ускладнюють рішення. Якщо я правильно зрозумів, все, що ви хочете зробити, - це видалити провідні пробіли (пробіли або вкладки), і у вас є дані, доступні в Блокноті ++

У цьому випадку рішення просте. Відкрийте файл уNotepad++ >> Search >> Replace... or Ctrl+H

Знайдіть що :^( *)[ ]|^\t*

Замінити на : залишити порожнім

Щоб знайти весь провідний простір, який ми використовуємо, ^( *)[ ]і знайти всі провідні вкладки, ми використовуємо ^\t*як такий, щоб знайти весь провідний простір або всі провідні вкладки, якими ми користуємось або оператор |. Переконайтеся, що у вікні заміни вибрано регулярний вираз .

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


Насправді ні, я хочу зберігати їх у файлі. Мені просто потрібно буфер обміну, щоб їх не було.
JohnDoea

@ Беня так, я зрозумів це. Я просто не зберігав би файл після копіювання даних, оскільки він не потрібен. Причина, яку я запропонував, тому що особисто я використовую 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

Відмінності від оригінального коду від Steven:

  • Я видалив SendMode Input з голови команди, тому що він зламав мій сценарій чомусь.
  • Я видалив клавішу Shift з обох комбінацій клавіш, тому що я особисто вважаю за краще працювати без неї більшу частину часу.
  • Я замінив Send, ^cі Send, ^xна, Send, ^{sc02e}і Send, ^{sc02d}відповідно. Це запобігає помилкою видалення тексту в івриті та деяких інших режимах, що не є англійською мовою).
  • Я видалив коментарі.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.