데이터를 클립 보드에 복사 할 때 선행 탭 및 / 또는 선행 공백을 제거하는 방법은 무엇입니까?


13

메모장 ++에서 클립 보드로 복사 한 데이터에서 선행 들여 쓰기 (탭 및 공백)를 제거하는 방법이 필요합니다.

메모장 ++ 문서 자체의 데이터는 이러한 선행 들여 쓰기를 유지해야하며 클립 보드에 복사 된 데이터는 없어야합니다.

이 동작은 CTRL + C 단독으로 시작해야하며 메모장 + + 안에있을 때만 시작해야합니다.


마우스로 텍스트를 정기적으로 표시하면 메모장 ++에서 발생합니다.

여기에 이미지 설명을 입력하십시오

텍스트를 정기적으로 표시하고 복사 한 후 클립 보드에 있어야합니다.

여기에 이미지 설명을 입력하십시오


노트:

  1. 이미지는 내 요구를 더 잘 설명하기 위해 실제 코드가 더 길다.
  2. 나는 또한 이것에 대해 여기에 물었다 .
  3. 이 코드 블록에 heredocuments가 포함 된 경우 들여 쓰기 된 코드 블록을 Linux 터미널에 붙여 넣을 수 없기 때문에이 질문을합니다 cat(heredocument 구분 기호 처리, 긴 이야기와 관련이 있음).

몇 줄과 문자를 복사 하시겠습니까? IE 선행 공백을 제거하고 변경 사항을 복사 한 다음 실행 취소하는 것이 가능합니까?
FCTW 17

파일 또는 파일의 일부 행에 선행 탭이 없으면 어떻게합니까? 왜 항상하고 싶니?
phuclv

1
왜 이것이 필요한가요? 선행 공백이 성가신 이유는 무엇입니까?
mrjink

껍질에? 문제가되지 않습니다. 그것이 vim에 있다면을 고려하십시오 :set paste.
mrjink

Vim이 아닌 쉘에서. catheredocs로 코드를 붙여 넣을 때 문제 됩니다.
JohnDoea

답변:


7

다음 AutoHotKey (AHK) 스크립트를 고려하십시오 . 오토 핫키 스크립트에 대한 자세한 설명은 오토 핫키 튜토리얼 및 설명서를 참조하십시오 .

AutoHotkey를 설치 후, 키를 누릅니다 Ctrl+ Shift+ c또는 x트림 라인으로 클립 보드에 복사 (또는 잘라 내기)하는 메모장 + + 내.

참고 : 원본 사본을 계속 사용하고 정상적으로 잘라낼 수 있도록 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

스티븐 나는 또 다른 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
이전 답변에 더 자세한 내용을 추가하십시오.이 도움이되기를 바랍니다.
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를 마우스 오른쪽 단추로 클릭).

그런 다음이 바로 가기를 마우스 오른쪽 단추로 클릭하고 "속성"을 선택하십시오. 이 창에서해야 할 일이 몇 가지 있습니다. "바로 가기"탭에는 다음과 같은 "타겟"옵션이 있어야합니다.

%windir%\system32\cmd.exe

말로 변경

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

이 명령을 사용하면 프로그램을 실행하고이 바로 가기를 사용하면 종료됩니다.

그런 다음 "바로 가기 키"상자를 클릭하고 텍스트 교체를 시작하려는 단축키를 누르십시오. 사용 편의성을 위해 Ctrl+ Shift+ C를 추천 합니다!

마지막으로, "실행"옵션을 "최소화"로 변경하십시오. 단축키를 사용할 때마다 화면이 창에서 깜박이지 않게하기 때문입니다.


이 모든 작업을 마치면 다음과 같은 워크 플로를 사용할 수 있습니다.

  1. 를 사용하여 텍스트 복사 CtrlC
  2. Ctrl+ Shift+를 사용하여 텍스트 자르기C
  3. 잘라낸 텍스트를 사용하여 붙여 넣기 CtrlV

라이언 안녕 메모장 + +에있는 한 CTRL + C로 모든 것을 할 수있는 방법을 찾고 있습니다 ... 또한 Windows를 부팅 할 때이 스크립트를 시작할 수 있습니까?
JohnDoea

0

어쩌면 나는 뭔가를 놓치고 있지만 다른 모든 대답은 솔루션을 지나치게 복잡하게하는 것처럼 보입니다. 올바르게 이해하면 선행 공백 (공백 또는 탭)을 제거하고 메모장에서 데이터를 사용할 수 있습니다.

어떤 경우에는 해결책이 간단합니다. 에서 파일을여십시오Notepad++ >> Search >> Replace... or Ctrl+H

무엇을 찾기 :^( *)[ ]|^\t*

로 교체 : 비워 두십시오

우리가 사용하는 모든 선행 공간 ^( *)[ ]을 찾고 모든 주요 탭 ^\t*을 찾기 위해, 또는 우리가 사용하는 모든 선행 공간 또는 모든 주요 탭을 찾기 위해, 또는 연산자를 사용합니다 |. 바꾸기 창에서 정규식 이 선택되어 있는지 확인하십시오 .

파일이 크더라도 빨리 완료해야합니다. 바꾸기 창을 닫고 모두 선택 (Ctrl + A) >> 복사 (Ctrl + C)


실제로 아니요, 파일에 보관하고 싶습니다. 클립 보드 버전이 없어야합니다.
JohnDoea

@Benia 네, 이해했습니다. 데이터가 필요하지 않기 때문에 데이터를 복사 한 후 파일을 저장하지 않습니다. 개인적으로 메모장 ++을 많이 사용하고 복사 방법을 변경하기 때문에 정규식을 사용하여 파일을 복사하지 않고 저장하는 것보다 더 자극적입니다. 앞의 문자를 원하지 않는이 하나의 인스턴스에 있기 때문에 다른 경우의 90 %에서 나는 것입니다.
JordanGS

0

내 대답은 내가 옳은 것으로 표시 한 Steven의 대답을 기반으로합니다 (그러나 몇 가지 문제가 있었지만 편집이 거부되었지만 편집하려고했습니다).

이것은 나에게 가장 적합한 코드입니다.

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, ^cSend, ^xSend, ^{sc02e}Send, ^{sc02d}각각. 히브리어 모드 및 영어 이외의 다른 언어 모드에서 텍스트 삭제 버그를 방지합니다.
  • 의견을 삭제했습니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.