Verileri panoya kopyalarken önde gelen sekmeleri ve / veya önde gelen alanları nasıl şeritleyebilirim?


13

Not Defteri ++ panoya kopyalanan verilerden önde gelen girintiler (sekmeler ve boşluklar) şerit gerekir.

Notepad ++ belgesinin kendisindeki veriler bu önde gelen girintilere sahip olmalı ve panoya kopyalanan veriler olmamalıdır.

Bu davranış yalnızca CTRL + C tarafından ve yalnızca Notepad ++ içinde olduğumda başlatılmalıdır.


Metni düzenli olarak fare ile işaretlediğimde Notepad ++ ile olan budur:

resim açıklamasını buraya girin

Metni düzenli olarak işaretledikten ve kopyaladıktan sonra panoda ne olması gerekir:

resim açıklamasını buraya girin


Notlar:

  1. Görüntüler sadece ihtiyacımı daha iyi göstermek için - gerçek kodlarım daha uzun.
  2. Burada da bunu sordum .
  3. Ben Linux terminaline içinde girintili kod bloklarını yapıştırmak olamaz çünkü ben bu sormak eğer bu codeblocks şunlardır cat(heredocument sınırlayıcı, uzun bir hikaye ait işlem ile ilgisi var) heredocuments.

Kaç satır ve karakter kopyalamak istiyorsunuz? IE önde gelen boşlukları kaldırmak, kopyalamak ve sonra değişiklikleri geri almak mümkün olur mu?
FCTW

dosya veya içindeki bazı satırların ön sekmesi yoksa ne olur? neden her zaman yapmak istiyorsun?
phuclv

1
buna ne için ihtiyacın var? Önde gelen beyaz alanı can sıkıcı yapan nedir?
mrjink

Kabukta mı? Bu bir sorun olmamalı. Eğer vim içindeyse, düşün :set paste.
mrjink

Kabukta, Vim'de değil. Bu bir sorundur çünkü kodları catheredoclarla yapıştırdığınızda - Öyle .
JohnDoea

Yanıtlar:


7

Aşağıdaki AutoHotKey (AHK) komut dosyasını göz önünde bulundurun . AutoHotkey komut dosyaları hakkında daha fazla açıklama için AutoHotkey Öğreticisine ve belgelerine bakın .

AutoHotKey'i yükledikten sonra , çizgiler kesilmiş olarak panoya kopyalamak (veya kesmek) için Ctrl+ Shift+ cveya xNotepad ++ içinde basın .

Not: Orijinal kopyayı kullanmaya devam edebilmeniz ve yalnızca normal şekilde kesebilmeniz için Ctrl+ Shiftkullandım Ctrl. Bu davranışı beğenmediyseniz, +hem +^c::ve hem de kaldırın +^v::.

;Açıklama için yorumlara (ile başlayan ) bakın. Herhangi bir kodlamada olduğu gibi, daha sonra geri döndüğünüzde komut dosyasını daha iyi anlamak için yorumlarda daha iyi bırakın.

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

Yorumlar uzun tartışmalar için değildir; bu görüşme sohbete taşındı .
Journeyman Geek

Steven 50 puan daha verdim ama nedense yapamam. İbranice çalışırken kopyalama işleminin aslında içeriği sildiğini ve sonra ctrl+zsilinen içeriği kurtarmak için yapmam gerektiğini fark ettim . Bu biraz sorunlu. Aşağıdaki kod kullanılabilir gibi bir şey anlıyorum? if !LangID := EN { return }. Komut dosyasının başlangıcına eklenmesi hata getirdi ve komut dosyasını benzer bir sürüm artı bir else { return }kapanıştan sonra sarma hata vermedi, ancak çalışmadı.
JohnDoea

1
İfadenin TrimClipboard(){ ... }içine işlev tanımı koyamazsınız if. İfadeyi ifişlevin içine veya komutların çevresine yerleştirinSend, ... TrimClipboard()
Steven

Merhaba sevgili Steven. Denemelerimde işe yaramadı. Bu dilde bir hata mı? Burada ayrıntılı olarak
açıkladım

Orada aynı tartışmada yeni bir çözüm yayınladım: autohotkey.com/boards/…
JohnDoea

3

Sadece kullanmak Alt + Mouse dragging veya Alt + Shift + Arrow keysdaha sonra sütunu seçmek için Ctrl+Csütunu kopyalamak için.

Bu örneğe bakın: https://notepad-plus-plus.org/fr/features/column-mode-editing.html

Düzenle:

Ayrıca tüm sütunu veya hatta bir sütundan daha fazlasını seçebiliriz, ayrıca bir veya daha fazla satır seçebiliriz.

İşte bunu yapmanın basit bir yolu:

  • İstenen seçimin başlangıcında farenin sol tuşuna tıklayın.

  • İstenen seçimin durması gereken konuma gidin

  • İmleci şu şekilde ikinci ve son konuma taşıyın:

    • İstenen sütunları ve satırları seçmek için ALT+ SHIFTtuşlarına ve left clickaynı anda a tuşuna basın.

Umarım bu yardım


1
Önceki yanıtıma biraz daha ayrıntı ekliyorum, umarım bu yardım.
Yacine

1
bu, yalnızca tüm satırların önde gelen sekme veya boşluklara sahip olması durumunda çalışır
phuclv

1
Aslında evet, ve soru şu satırların aynı biçime sahip olmasıydı
Yacine

1

İşte Java kullanarak taşınabilir bir çözüm

İlk adım elbette Java'yı kurmaktır

Ardından, aşağıdakileri Trimmer.javakullanıcı dizininizdeki bir dosyaya yapıştırın (C: \ Kullanıcılar \ adınız)

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);
    }
}

Ardından, bir komut istemi açın ve şunu yazın

javac Trimmer.java

Şimdi aynı klasörde Trimmer.class dosyanız olmalıdır. Trimmer.java dosyasını şimdi silebilirsiniz.


Bu noktada, panodaki her satırdaki tüm önde gelen ve sondaki beyaz boşlukları kaldıracak bir programımız var, ancak yine de rahatça çalıştırmak için bir yolumuz var. Bunun için bir kısayol tuşu yapalım!

İlk olarak, komut istemine bir kısayol oluşturun (C: \ Windows \ System32 \ cmd.exe dosyasına sağ tıklayın)

Ardından, bu kısayolu sağ tıklayın ve "Özellikler" i seçin. Bu pencerede yapmamız gereken birkaç şey var. "Kısayol" sekmesinde, aşağıdaki gibi bir "Hedef" seçeneği olmalıdır

%windir%\system32\cmd.exe

Söylemek için değiştirin

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

Bu, komut isteminin programımızı çalıştırmasına ve bu kısayolu kullandığımızda çıkmasına neden olur.

Ardından, "Kısayol tuşu" kutusunu tıklayın ve metin değişimini tetiklemek istediğiniz kısayol tuşuna basın. Kullanım kolaylığı için Ctrl+ Shift+ tavsiye ederim C!

Son olarak, kısayolu her kullandığımızda ekranda bir pencere yanıp sönmesini istemediğimiz için "Çalıştır" seçeneğini "Küçültülmüş" olarak değiştirin.


Tüm bunlardan sonra, aşağıdaki iş akışını kullanabilmeniz gerekir:

  1. Kullanarak metni kopyala CtrlC
  2. Ctrl+ Shift+ Kullanarak metni kırpmaC
  3. Kırpılan metni kullanarak yapıştırın CtrlV

Merhaba Ryan. Notepad ++ olduğu sürece yalnız CTRL + C ile her şeyi yapmak için bir yol arıyorum ... Ayrıca, Windows önyükleme yaparken bu komut dosyası başlatmak için bir yolu var mı?
JohnDoea

0

Belki bir şey eksik ama diğer tüm cevaplar çözümü aşırı karmaşık gibi görünüyor. Eğer doğru anladıysam, tek yapmanız gereken önde gelen beyaz boşlukları (boşluklar veya sekmeler) kaldırmak ve Notepad ++ 'da mevcut veriler var

Bu durumda çözüm basittir. Dosyanızı şurada açın:Notepad++ >> Search >> Replace... or Ctrl+H

Neyi bul :^( *)[ ]|^\t*

Şununla değiştir : boş bırakın

Kullandığımız tüm önde gelen alanı ^( *)[ ]bulmak ve tüm önde gelen sekmeleri bulmak için ^\t*, kullandığımız tüm önde gelen alanı veya kullandığımız tüm önde gelen sekmeleri veya operatörünü bulmak için kullanırız |. Değiştirme penceresinde Normal İfade'nin seçili olduğundan emin olun .

Büyük bir dosya olsa bile oldukça hızlı bir şekilde bitmelidir. Değiştirme Penceresini kapatın ve Tümünü Seç (Ctrl + A) >> Kopyala (Ctrl + C)


Aslında hayır, onları dosyada tutmak istiyorum. Ben sadece onlara sahip değil panoya sürümü gerekir.
JohnDoea

@Benia evet, bunu anladım. Verileri kopyaladıktan sonra gerekli olmadığından dosyayı kaydetmezdim. Şahsen ben Notepad ++ oldukça ağır kullanmak ve kopya çalışmalarını nasıl değiştirdiğini önerdi nedeni kopyalamak ve dosyayı kaydetmek değil bir regex kullanmaktan daha rahatsız edici olurdu. Önde gelen karakterleri istemediğim bu tek örnekte olduğu için, diğer vakaların% 90'ında yapardım.
JordanGS

0

Cevabım Steven'ın doğru olarak işaretlediğim cevaba dayanıyor (yine de birkaç problemim vardı ve düzenlemem reddedilmesine rağmen düzenlemeye çalıştım).

Bu benim için en uygun olan kod:

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'ın orijinal kodundan farklılıkları:

  • Komutumun başından SendMode Girdisini kaldırdım çünkü komut nedense herhangi bir nedenle bozuldu.
  • Shift anahtarını her iki tuş kombinasyonundan da kaldırdım çünkü çoğu zaman onsuz çalışmayı tercih ederim.
  • Ben yerini Send, ^cve Send, ^xbirlikte Send, ^{sc02e}ve Send, ^{sc02d}sırasıyla. Bu, İbranice ve diğer İngilizce olmayan dil modlarında metin silme hatasını önler).
  • Yorumları kaldırdım.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.