Làm cách nào để loại bỏ các tab hàng đầu và / hoặc khoảng trắng hàng đầu khi sao chép dữ liệu vào clipboard?


13

Tôi cần một cách để loại bỏ các vết lõm hàng đầu (tab và khoảng trắng) khỏi dữ liệu được sao chép vào clipboard từ Notepad ++.

Bản thân dữ liệu trong tài liệu Notepad ++ nên tiếp tục có các thụt lề hàng đầu này và dữ liệu được sao chép vào clipboard không nên.

Hành vi này nên được bắt đầu bằng CTRL + C một mình và chỉ khi tôi ở trong Notepad ++.


Đây là những gì xảy ra trong Notepad ++ khi tôi đánh dấu văn bản thường xuyên bằng chuột:

nhập mô tả hình ảnh ở đây

Đó là những gì nên có trong clipboard sau khi tôi đánh dấu văn bản thường xuyên và sao chép nó:

nhập mô tả hình ảnh ở đây


Ghi chú:

  1. Các hình ảnh chỉ để minh họa rõ hơn nhu cầu của tôi - mã thực tế của tôi dài hơn.
  2. Tôi cũng đã hỏi về điều này ở đây .
  3. Tôi hỏi điều này bởi vì tôi không thể dán các khối mã thụt vào thiết bị đầu cuối Linux nếu các bộ mã này bao gồm các catdi sản (phải thực hiện với việc xử lý các dấu phân cách di truyền, một câu chuyện dài).

Có bao nhiêu dòng và ký tự bạn muốn sao chép? IE có khả thi để loại bỏ các khoảng trắng hàng đầu, sao chép và sau đó hoàn tác các thay đổi không?
FCTW

Điều gì nếu tập tin hoặc một số dòng trong nó không có tab hàng đầu? tại sao bạn muốn làm điều đó luôn
phuclv

1
Tại sao bạn cần điều này? Điều gì làm cho khoảng trắng hàng đầu gây phiền nhiễu?
mrjink

Trong vỏ? Đó không phải là một vấn đề. Nếu nó vào vim, hãy xem xét :set paste.
mrjink

Trong vỏ, không phải trong Vim. Đó là một vấn đề bởi vì khi bạn dán mã với catheredocs - Đó là .
JohnDoea

Câu trả lời:


7

Hãy xem xét tập lệnh AutoHotKey (AHK) sau đây . Xem Hướng dẫn và tài liệu hướng dẫn AutoHotkey để biết thêm giải thích về các tập lệnh AutoHotkey.

Sau khi cài đặt AutoHotKey, nhấn Ctrl+ Shift+ choặc xtrong Notepad ++ để sao chép (hoặc cắt) vào bảng tạm với các dòng được cắt bớt.

Lưu ý: Tôi đã sử dụng Ctrl+ Shiftđể bạn vẫn có thể sử dụng bản gốc và chỉ cắt bình thường Ctrl. Nếu bạn không thích hành vi này, chỉ cần loại bỏ +trong cả hai +^c::+^v::.

Xem các ý kiến ​​(bắt đầu với ;) để được giải thích. Như với bất kỳ mã hóa nào, tốt hơn nên để lại trong các bình luận để hiểu rõ hơn về kịch bản khi bạn quay lại nó sau này.

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

Bình luận không dành cho thảo luận mở rộng; cuộc trò chuyện này đã được chuyển sang trò chuyện .
Journeyman Geek

Steven tôi sẽ cho thêm 50 điểm tiền thưởng nhưng vì một số lý do tôi không thể. Tôi nhận thấy rằng sao chép trong khi làm việc bằng tiếng Do Thái, thực sự xóa nội dung và sau đó tôi phải làm ctrl+zđể lấy lại nội dung đã bị xóa. Đây là một chút vấn đề. Tôi hiểu một cái gì đó giống như mã sau đây có thể được sử dụng? if !LangID := EN { return }. Việc thêm nó vào đầu tập lệnh đã gây ra lỗi và gói tập lệnh bằng một phiên bản tương tự cộng với else { return }sau khi đóng không có lỗi nhưng không hoạt động.
JohnDoea

1
Bạn không thể đặt một định nghĩa hàm TrimClipboard(){ ... }bên trong một ifcâu lệnh. Đặt ifcâu lệnh bên trong hàm hoặc xung quanh các lệnhSend, ... TrimClipboard()
Steven

Chào Steven thân mến. Trong thử nghiệm của tôi, nó đã không làm việc. Đây có phải là một lỗi trong ngôn ngữ? Tôi trình bày chi tiết trong thời gian ở đây: autohotkey.com/boards/...
JohnDoea

Tôi vừa công bố một giải pháp trong các cuộc thảo luận tương tự có: autohotkey.com/boards/...
JohnDoea

3

Chỉ dùng Alt + Mouse dragging hoặc Alt + Shift + Arrow keysđể chọn cột, sau đó Ctrl+Csao chép cột.

Xem ví dụ này: https://notepad-plus-plus.org/fr/features/column-mode-editing.html

Biên tập:

Chúng ta cũng có thể chọn toàn bộ cột, hoặc thậm chí nhiều hơn một cột, chúng ta cũng có thể chọn một hoặc nhiều hàng.

Đây là một cách đơn giản để làm điều đó:

  • Nhấp chuột trái vào đầu lựa chọn mong muốn.

  • Đi đến vị trí mà lựa chọn mong muốn phải dừng lại

  • Di chuyển con trỏ đến vị trí thứ hai và cuối cùng, với:

    • Một lần nhấn vào các phím ALT+ SHIFTvà a left click, đồng thời, để chọn các cột và hàng mong muốn.

Hy vọng điều này giúp đỡ


1
Tôi thêm một số chi tiết để trả lời trước đây của tôi, hy vọng sự giúp đỡ này.
Yacine

1
điều này chỉ hoạt động nếu tất cả các dòng có cùng một tab hoặc khoảng trắng hàng đầu
phuclv

1
Trên thực tế, có, và câu hỏi là các dòng có cùng định dạng
Yacine

1

Đây là một giải pháp di động sử dụng Java

Bước đầu tiên là, tất nhiên, cài đặt Java

Tiếp theo, dán đoạn sau vào tệp có tên Trimmer.javatrong thư mục người dùng của bạn (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);
    }
}

Sau đó, mở một dấu nhắc lệnh và gõ

javac Trimmer.java

Bây giờ bạn sẽ có một tệp trim. Class trong cùng một thư mục. Bạn có thể xóa tệp trim.java ngay bây giờ.


Tại thời điểm này, chúng tôi có một chương trình sẽ loại bỏ tất cả các khoảng trắng ở đầu và cuối khỏi mỗi dòng trong bảng tạm, nhưng chúng tôi vẫn cần một cách để chạy nó một cách thuận tiện. Hãy làm một phím nóng cho nó!

Đầu tiên, tạo một lối tắt đến dấu nhắc lệnh (nhấp chuột phải vào C: \ Windows \ System32 \ cmd.exe)

Sau đó, nhấp chuột phải vào phím tắt này và chọn "Thuộc tính". Có một vài điều chúng ta cần làm trong cửa sổ này. Trong tab "Phím tắt", cần có tùy chọn "Mục tiêu" có nội dung như

%windir%\system32\cmd.exe

Thay đổi nó để nói

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

Điều này sẽ khiến dấu nhắc lệnh chỉ đơn giản là chạy chương trình của chúng tôi và thoát khi chúng tôi sử dụng phím tắt này.

Tiếp theo, nhấp vào hộp "Phím tắt" và nhấn phím nóng bạn muốn kích hoạt thay thế văn bản. Tôi khuyên bạn nên Ctrl+ Shift+ Cđể dễ sử dụng!

Cuối cùng, thay đổi tùy chọn "Chạy" thành "Thu nhỏ" vì chúng tôi không muốn cửa sổ nhấp nháy trên màn hình mỗi khi chúng tôi sử dụng phím tắt.


Sau tất cả, bạn sẽ có thể sử dụng quy trình làm việc sau:

  1. Sao chép văn bản bằng CtrlC
  2. Cắt văn bản bằng Ctrl+ Shift+C
  3. Dán văn bản cắt bằng cách sử dụng CtrlV

Chào Ryan. Tôi đang tìm cách để làm mọi thứ chỉ với CTRL + C, miễn là tôi đang ở trong Notepad ++ ... Ngoài ra, có cách nào để bắt đầu tập lệnh này khi tôi khởi động Windows không?
JohnDoea

0

Có thể tôi đang thiếu một cái gì đó nhưng tất cả các câu trả lời khác dường như quá phức tạp cho giải pháp. Nếu tôi hiểu chính xác, tất cả những gì bạn muốn làm là xóa các khoảng trắng (khoảng trắng hoặc tab) hàng đầu và bạn có sẵn dữ liệu trong Notepad ++

Trong trường hợp đó là giải pháp đơn giản. Mở tập tin của bạn trongNotepad++ >> Search >> Replace... or Ctrl+H

Tìm cái gì :^( *)[ ]|^\t*

Thay thế bằng : để trống

Để tìm tất cả không gian hàng đầu mà chúng tôi sử dụng ^( *)[ ]và để tìm tất cả các tab hàng đầu, chúng tôi sử dụng ^\t*, như vậy để tìm tất cả không gian hàng đầu hoặc tất cả các tab hàng đầu mà chúng tôi sử dụng hoặc toán tử |. Hãy chắc chắn rằng Biểu thức chính quy được chọn trong cửa sổ thay thế.

Nó sẽ hoàn thành khá nhanh, ngay cả khi đó là một tệp lớn. Đóng cửa sổ thay thế và chỉ cần chọn tất cả (Ctrl + A) >> Sao chép (Ctrl + C)


Trên thực tế không, tôi muốn giữ chúng trong tập tin. Tôi chỉ cần phiên bản clipboard để không có chúng.
JohnDoea

@Benia vâng, tôi hiểu điều đó. Tôi chỉ không lưu tệp sau khi sao chép dữ liệu vì không cần thiết. Lý do tôi đề xuất là vì cá nhân tôi sử dụng Notepad ++ khá nhiều và việc thay đổi cách thức hoạt động của bản sao sẽ gây khó chịu cho tôi hơn là sử dụng biểu thức chính quy để sao chép và không lưu tệp. Vì đây chỉ là một trường hợp mà tôi không muốn các nhân vật hàng đầu, nên trong 90% các trường hợp khác tôi sẽ làm.
JordanGS

0

Câu trả lời của tôi dựa trên câu trả lời của Steven mà tôi đã đánh dấu là chính xác (tuy nhiên tôi có một vài vấn đề với nó và tôi đã cố gắng chỉnh sửa mặc dù bản chỉnh sửa của tôi đã bị từ chối).

Đây là mã làm việc tốt nhất với tôi:

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

Sự khác biệt so với mã gốc của Steven:

  • Tôi đã xóa SendMode Input khỏi phần đầu của lệnh vì nó đã phá vỡ tập lệnh của tôi vì một số lý do.
  • Tôi đã loại bỏ phím Shift khỏi cả hai tổ hợp phím vì cá nhân tôi thích làm việc mà không cần hầu hết thời gian.
  • Tôi đã thay thế Send, ^cSend, ^xvới Send, ^{sc02e}Send, ^{sc02d} , tương ứng. Điều này ngăn ngừa lỗi xóa văn bản trong chế độ tiếng Do Thái và một số chế độ ngôn ngữ không phải tiếng Anh khác).
  • Tôi xóa các bình luận.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.