web-dev-qa-db-ja.com

データをクリップボードにコピーするときに、先頭のタブや先頭のスペースを削除するにはどうすればよいですか?

Notepad ++からクリップボードにコピーされたデータから先頭のインデント(タブとスペース)を取り除く方法が必要です。

Notepad ++ドキュメント自体のデータには、これらの先頭のインデントが含まれている必要がありますが、クリップボードにコピーされたデータには含まれていません。

この動作は、CTRL + Cのみで開始し、Notepad ++内にいる場合にのみ開始する必要があります。


これは、マウスでテキストを定期的にマークすると、Notepad ++で発生することです:

enter image description here

テキストに定期的にマークを付けてコピーした後、クリップボードに表示されるはずです:

enter image description here


ノート:

  1. 画像は私の必要性をよりよく説明するためのものです-私の実際のコードはもっと長いです。
  2. 私もこれについて尋ねました ここ
  3. インデントされたコードブロックをLinuxターミナルifに貼り付けることができないため、これを尋ねます。これらのコードブロックにはcatヒアドキュメントが含まれます(ヒアドキュメント区切り文字の処理、長い話)。
13
user529857

次の 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
6
Steven

Alt + Mouse draggingまたはAlt + Shift + Arrow keysを使用して列を選択し、次にCtrl+Cを使用して列をコピーします。

この例を参照してください: https://notepad-plus-plus.org/fr/features/column-mode-editing.html

編集:

列全体、または複数の列を選択することもできます。また、1つまたは複数の行を選択することもできます。

これを行う簡単な方法は次のとおりです。

  • 必要な選択の先頭でマウスを左クリックします。

  • 必要な選択を停止する必要がある場所に移動します

  • カーソルをその2番目の最後の場所に移動します。

    • ALT + SHIFTキーとleft clickを同時に押して、目的の列と行を選択します。

この助けを願っています

2
Yacine

これがJavaを使用したポータブルなソリューションです

もちろん、最初のステップは Javaのインストール

次に、以下をユーザーディレクトリ(C:\ Users\your_name)のTrimmer.Javaという名前のファイルに貼り付けます。

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
0
Ryan Hilbert

何かが足りないかもしれませんが、他のすべての答えは解決策を複雑にしすぎているようです。私が正しく理解していれば、あなたがしたいのは先頭の空白(スペースまたはタブ)を削除することだけであり、メモ帳++で利用可能なデータがあります

その場合、解決策は簡単です。 _Notepad++ >> Search >> Replace... or Ctrl+H_でファイルを開きます

何を見つけるか^( *)[ ]|^\t*

置換 :空のままにします

^( *)[ ]を使用してすべての先行スペースを検索し、すべての先行タブを検索するには、_^\t*_を使用します。したがって、or演算子_|_を使用してすべての先行スペースまたはすべての先行タブを検索します。 。置換ウィンドウで正規表現が選択されていることを確認してください。

大きなファイルであっても、かなり早く終了するはずです。置換ウィンドウを閉じて、すべて選択(Ctrl + A)>>コピー(Ctrl + C)

0
JordanGS

私の答えは、私が正しいとマークしたスティーブンの答えに基づいています(それでも、いくつか問題があり、編集が拒否されましたが、編集しようとしました)。

これは私にとって最もうまくいったコードです:

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による元のコードとの違い:

  • 何らかの理由でスクリプトが壊れたため、コマンドの先頭からSendModeInputを削除しました。
  • 私は個人的にほとんどの場合それなしで作業することを好むので、両方のキーコンボからShiftキーを削除しました。
  • Send, ^cSend, ^xをそれぞれSend, ^{sc02e}Send, ^{sc02d}に置き換えました。これにより、ヘブライ語モードおよびその他の英語以外の言語モードでのテキスト削除のバグが防止されます。
  • コメントを削除しました。
0
user529857