Bagaimana cara menghapus tab dan / atau spasi utama saat menyalin data ke clipboard?

13

Saya perlu cara untuk menghapus indentasi terkemuka (tab dan spasi) dari data yang disalin ke clipboard dari Notepad ++.

Data dalam dokumen Notepad ++ itu sendiri harus tetap memiliki indentasi terkemuka ini dan data yang disalin ke clipboard tidak boleh.

Perilaku ini harus dimulai oleh CTRL + C sendiri dan hanya ketika saya di dalam Notepad ++.


Inilah yang terjadi di Notepad ++ ketika saya menandai teks secara teratur dengan mouse:

masukkan deskripsi gambar di sini

Itu yang seharusnya ada di clipboard setelah saya menandai teks secara teratur dan menyalinnya:

masukkan deskripsi gambar di sini


Catatan:

  1. Gambar hanya untuk menggambarkan kebutuhan saya dengan lebih baik - kode saya yang sebenarnya lebih panjang.
  2. Saya juga bertanya tentang ini di sini .
  3. Saya menanyakan hal ini karena saya tidak dapat menempelkan blok kode yang berlekuk ke dalam terminal Linux jika kode-kode ini menyertakan catheredocuments (berkaitan dengan pemrosesan pembatas heredocument, sebuah cerita panjang).
JohnDoea
sumber
Berapa banyak garis, dan karakter yang ingin Anda salin? Apakah layak untuk menghapus spasi utama, menyalin, dan kemudian membatalkan perubahan?
FCTW
bagaimana jika file atau beberapa baris di dalamnya tidak memiliki tab utama? mengapa kamu selalu ingin melakukannya?
phuclv
1
Mengapa Anda membutuhkan ini? Apa yang membuat ruang putih terkemuka mengganggu?
mrjink
Di shell? Itu seharusnya tidak menjadi masalah. Jika itu ke vim, pertimbangkan :set paste.
mrjink
Di shell, bukan di Vim. Ini adalah masalah karena ketika Anda menyisipkan kode dengan catheredocs - itu adalah .
JohnDoea

Jawaban:

7

Pertimbangkan skrip AutoHotKey (AHK) berikut. Lihat Tutorial dan dokumentasi AutoHotkey untuk penjelasan lebih lanjut tentang skrip AutoHotkey.

Setelah menginstal AutoHotKey, tekan Ctrl+ Shift+ catau di xdalam Notepad ++ untuk menyalin (atau memotong) ke clipboard dengan garis yang dipangkas.

Catatan: Saya menggunakan Ctrl+ Shiftsehingga Anda masih bisa menggunakan salinan asli dan memotong dengan normal saja Ctrl. Jika Anda tidak menyukai perilaku ini, hapus saja +keduanya +^c::dan +^v::.

Lihat komentar (dimulai dengan ;) untuk penjelasan. Seperti halnya pengodean apa pun, lebih baik tinggalkan komentar untuk lebih memahami skrip ketika Anda kembali lagi nanti.

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
sumber
Komentar bukan untuk diskusi panjang; percakapan ini telah dipindahkan ke obrolan .
Journeyman Geek
Steven saya akan memberikan hadiah 50 poin lagi, tetapi untuk beberapa alasan saya tidak bisa. Saya perhatikan bahwa penyalinan saat bekerja dalam bahasa Ibrani, sebenarnya menghapus konten dan kemudian harus saya lakukan ctrl+zuntuk mengambil kembali konten yang dihapus. Ini sedikit bermasalah. Saya mengerti sesuatu seperti kode berikut dapat digunakan? if !LangID := EN { return }. Menambahkannya di awal skrip membawa kesalahan dan membungkus skrip dengan versi yang sama ditambah else { return }setelah penutupan tidak kesalahan tetapi tidak berhasil.
JohnDoea
1
Anda tidak bisa memasukkan definisi fungsi TrimClipboard(){ ... }di dalam ifpernyataan. Letakkan ifpernyataan di dalam fungsi, atau di sekitar perintahSend, ... TrimClipboard()
Steven
Halo Steven yang terkasih. Dalam percobaan saya, itu tidak berhasil. Apakah ini bug dalam bahasa ini? Saya menjelaskan panjang lebar di sini: autohotkey.com/boards/…
JohnDoea
Saya baru saja menerbitkan solusi dalam diskusi yang sama di sana: autohotkey.com/boards/…
JohnDoea
3

Cukup gunakan Alt + Mouse dragging atau Alt + Shift + Arrow keysuntuk memilih kolom, lalu Ctrl+Cuntuk menyalin kolom.

Lihat contoh ini: https://notepad-plus-plus.org/fr/features/column-mode-editing.html

Edit:

Kita juga dapat memilih seluruh kolom, atau bahkan lebih dari satu kolom, juga kita dapat memilih satu atau banyak baris.

Berikut ini cara mudah untuk melakukannya:

  • Klik kiri mouse di awal pilihan yang diinginkan.

  • Pergi ke lokasi di mana seleksi yang diinginkan harus berhenti

  • Pindahkan kursor ke lokasi kedua dan terakhir, dengan:

    • Hit pada tombol ALT+ SHIFTdan left click, secara bersamaan, untuk memilih kolom dan baris yang diinginkan.

Semoga bantuan ini

Yacine
sumber
1
Saya menambahkan beberapa rincian lebih lanjut ke respons saya sebelumnya, semoga bantuan ini.
Yacine
1
ini hanya berfungsi jika semua baris memiliki tab atau spasi utama yang sama
phuclv
1
Sebenarnya, ya, dan pertanyaannya adalah bahwa baris memiliki format yang sama
Yacine
1

Inilah solusi portable-ish menggunakan Java

Langkah pertama adalah, tentu saja, menginstal Java

Selanjutnya, rekatkan yang berikut ke dalam file yang bernama Trimmer.javadi direktori pengguna Anda (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);
    }
}

Kemudian, buka prompt perintah dan ketik

javac Trimmer.java

Anda sekarang harus memiliki file Trimmer.class di folder yang sama. Anda dapat menghapus file Trimmer.java sekarang.


Pada titik ini, kami memiliki program yang akan menghapus semua spasi putih awal dan akhir dari setiap baris di clipboard, tetapi kami masih membutuhkan cara untuk menjalankannya dengan nyaman. Mari buat hotkey untuk itu!

Pertama, buat pintasan ke prompt perintah (klik kanan C: \ Windows \ System32 \ cmd.exe)

Kemudian, klik kanan pintasan ini dan pilih "Properti." Ada beberapa hal yang perlu kita lakukan di jendela ini. Di tab "Pintasan", harus ada opsi "Target" yang mengatakan sesuatu seperti

%windir%\system32\cmd.exe

Ubah untuk mengatakan

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

Ini akan menyebabkan prompt perintah menjalankan program kami dan keluar ketika kami menggunakan pintasan ini.

Selanjutnya, klik kotak "Shortcut key" dan tekan tombol pintas yang Anda inginkan untuk memicu penggantian teks. Saya merekomendasikan Ctrl+ Shift+ Cuntuk kemudahan penggunaan!

Terakhir, ubah opsi "Jalankan" menjadi "Diminimalkan" karena kami tidak ingin jendela berkedip ke layar setiap kali kami menggunakan pintasan.


Setelah semua ini, Anda harus dapat menggunakan alur kerja berikut:

  1. Salin teks menggunakan CtrlC
  2. Potong teks menggunakan Ctrl+ Shift+C
  3. Rekatkan teks yang dipangkas menggunakan CtrlV
Ryan Hilbert
sumber
Hai Ryan. Saya mencari cara untuk melakukan semuanya dengan CTRL + C sendiri, selama saya di Notepad ++ ... Juga, apakah ada cara untuk memulai skrip ini ketika saya mem-boot Windows?
JohnDoea
0

Mungkin saya melewatkan sesuatu tetapi semua jawaban lain sepertinya terlalu menyulitkan solusinya. Jika saya mengerti dengan benar semua yang ingin Anda lakukan adalah menghapus spasi putih terdepan (spasi atau tab) dan Anda memiliki data yang tersedia di Notepad ++

Dalam hal ini solusinya sederhana. Buka file Anda diNotepad++ >> Search >> Replace... or Ctrl+H

Temukan apa :^( *)[ ]|^\t*

Ganti dengan : biarkan kosong

Untuk menemukan semua ruang terdepan yang kami gunakan ^( *)[ ]dan untuk menemukan semua tab terdepan, kami menggunakan ^\t*, dengan demikian, untuk menemukan semua ruang terdepan atau semua tab terdepan yang kami gunakan atau operator |. Pastikan bahwa Ekspresi Reguler dipilih di jendela ganti.

Seharusnya selesai agak cepat, bahkan jika itu file besar. Tutup Jendela Ganti dan cukup Pilih Semua (Ctrl + A) >> Salin (Ctrl + C)

JordanGS
sumber
Sebenarnya tidak, saya ingin menyimpannya dalam file. Saya hanya perlu versi clipboard untuk tidak memilikinya.
JohnDoea
@Benia ya, saya mengerti itu. Saya tidak akan menyimpan file setelah menyalin data karena tidak diperlukan. Alasan saya menyarankan itu karena secara pribadi saya menggunakan Notepad ++ cukup banyak dan mengubah cara kerjanya copy akan lebih menjengkelkan bagi saya daripada menggunakan regex untuk menyalin dan tidak menyimpan file. Karena hanya dalam satu contoh ini di mana saya tidak ingin karakter utama, dalam 90% kasus lain saya akan.
JordanGS
0

Jawaban saya didasarkan pada jawaban oleh Steven yang saya tandai sebagai benar (namun saya punya beberapa masalah dengannya dan saya mencoba mengedit meskipun hasil edit saya ditolak).

Ini adalah kode yang paling cocok untuk saya:

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

Perbedaan dari kode asli oleh Steven:

  • Saya menghapus Input SendMode dari kepala perintah karena itu merusak skrip saya karena beberapa alasan.
  • Saya menghapus tombol Shift dari kedua kombo karena saya pribadi lebih suka bekerja tanpanya.
  • Saya diganti Send, ^cdan Send, ^xdengan Send, ^{sc02e}dan Send, ^{sc02d}, masing-masing. Ini mencegah bug penghapusan teks dalam mode Ibrani dan beberapa mode bahasa non-Inggris lainnya).
  • Saya menghapus komentar.
JohnDoea
sumber