วิธีดึงแถบแท็บนำหน้าและ / หรือช่องว่างนำหน้าเมื่อคัดลอกข้อมูลไปยังคลิปบอร์ด


13

ฉันต้องการวิธีที่จะตัดการเยื้องนำ (แท็บและช่องว่าง) จากข้อมูลที่คัดลอกไปยังคลิปบอร์ดจาก Notepad ++

ข้อมูลในเอกสาร Notepad ++ นั้นควรมีเยื้องนำเหล่านี้และข้อมูลที่คัดลอกไปยังคลิปบอร์ดไม่ควร

พฤติกรรมนี้ควรเริ่มต้นด้วย CTRL + C อย่างเดียวและเฉพาะเมื่อฉันอยู่ใน Notepad ++


นี่คือสิ่งที่เกิดขึ้นใน Notepad ++ เมื่อฉันทำเครื่องหมายข้อความด้วยเมาส์เป็นประจำ:

ป้อนคำอธิบายรูปภาพที่นี่

นั่นคือสิ่งที่ควรอยู่ในคลิปบอร์ดหลังจากฉันทำเครื่องหมายข้อความเป็นประจำและคัดลอก:

ป้อนคำอธิบายรูปภาพที่นี่


หมายเหตุ:

  1. ภาพเป็นเพียงการอธิบายความต้องการของฉันได้ดีกว่า - รหัสจริงของฉันยาวกว่า
  2. ฉันยังถามเกี่ยวกับเรื่องนี้ที่นี่
  3. ฉันถามสิ่งนี้เพราะฉันไม่สามารถวางบล็อกโค้ดที่เยื้องเข้าไปในเทอร์มินัล Linux ได้หากบล็อกบล็อกเหล่านี้มีcatheredocuments (เกี่ยวข้องกับการประมวลผลตัวคั่น heredocument ซึ่งเป็นเรื่องยาว)

คุณต้องการคัดลอกจำนวนบรรทัดและอักขระเท่าใด IE จะสามารถลบช่องว่างนำหน้าคัดลอกแล้วเลิกทำการเปลี่ยนแปลงได้หรือไม่
FCTW

เกิดอะไรขึ้นถ้าไฟล์หรือบางบรรทัดในนั้นไม่มีแท็บนำหน้า ทำไมคุณถึงอยากทำมันตลอดไป?
phuclv

1
ทำไมคุณต้องการสิ่งนี้ อะไรทำให้ช่องว่างชั้นนำทำให้เกิดความรำคาญ
mrjink

ในเปลือก? นั่นไม่ควรเป็นปัญหา :set pasteถ้ามันเข้ามาเป็นกลุ่มพิจารณา
mrjink

ในเปลือกไม่ใช่ในกลุ่ม มันเป็นปัญหาเพราะเมื่อคุณวางรหัสกับcatheredocs - มันเป็น
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

ความคิดเห็นไม่ได้มีไว้สำหรับการอภิปรายเพิ่มเติม การสนทนานี้ได้รับการย้ายไปแชท
Journeyman Geek

Steven ฉันจะให้รางวัลอีก 50 แต้ม แต่ด้วยเหตุผลบางอย่างที่ฉันทำไม่ได้ ฉันสังเกตเห็นว่าการคัดลอกในขณะที่ทำงานในภาษาฮิบรูจริงลบเนื้อหาแล้วฉันต้องทำctrl+zเพื่อย้อนกลับเนื้อหาที่ถูกลบ นี่เป็นปัญหาเล็กน้อย ฉันเข้าใจว่าสามารถใช้โค้ดต่อไปนี้ได้หรือไม่ if !LangID := EN { return }. การเพิ่มลงในจุดเริ่มต้นของสคริปต์ทำให้เกิดข้อผิดพลาดและตัดสคริปต์ด้วยเวอร์ชันที่คล้ายกันบวกกับelse { return }หลังจากการปิดไม่เกิดข้อผิดพลาด แต่ไม่ได้ผล
JohnDoea

1
คุณไม่สามารถใส่คำนิยามฟังก์ชั่นTrimClipboard(){ ... }ภายในifคำสั่ง ใส่ifคำสั่งภายในฟังก์ชั่นหรือรอบคำสั่งSend, ... TrimClipboard()
Steven

สวัสดีสตีเว่นที่รัก ในความพยายามของฉันมันไม่ทำงาน นี่เป็นข้อบกพร่องในภาษาหรือไม่ ฉันมีรายละเอียดความยาวที่นี่: 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และ a left clickพร้อมกันเพื่อเลือกคอลัมน์และแถวที่ต้องการ

หวังว่าความช่วยเหลือนี้


1
ฉันเพิ่มรายละเอียดเพิ่มเติมลงในการตอบกลับของฉันหวังว่าจะช่วยได้
Yacine

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)

จากนั้นคลิกขวาที่ทางลัดนี้แล้วเลือก "Properties" มีบางสิ่งที่เราต้องทำในหน้าต่างนี้ ในแท็บ "ทางลัด" ควรมีตัวเลือก "เป้าหมาย" ที่ระบุสิ่งที่ต้องการ

%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 ++ ค่อนข้างหนักและการเปลี่ยนแปลงวิธีการทำสำเนาจะทำให้ฉันรำคาญมากกว่าการใช้ regex เพื่อคัดลอกและไม่บันทึกไฟล์ เนื่องจากเป็นเพียงตัวอย่างเดียวที่ฉันไม่ต้องการตัวละครนำใน 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}ตามลำดับ การทำเช่นนี้จะป้องกันบั๊กการลบข้อความในโหมดฮิบรูและโหมดอื่น ๆ ที่ไม่ใช่ภาษาอังกฤษ)
  • ฉันลบความคิดเห็น
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.