データをクリップボードにコピーするときに、先頭のタブや先頭のスペースを削除する方法は?


13

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

Notepad ++文書内のデータ自体はこれらの先頭のインデントを保持し続ける必要があり、クリップボードにコピーされるデータは保持すべきではありません。

この動作は、Ctrl + Cのみで、Notepad ++内にいるときにのみ開始する必要があります。


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

ここに画像の説明を入力してください

これは、テキストを定期的にマークしてコピーした後、クリップボードにあるべきものです。

ここに画像の説明を入力してください


ノート:

  1. 画像は私のニーズをよりよく説明するためのものです-実際のコードはより長くなります。
  2. ここでこれについても尋ねました
  3. 私は、Linuxのターミナルにでインデントコードブロックを貼り付けることはできませんので、私はこれを聞いている場合、これらのコードブロックが含まcatheredocumentsを(、heredocument区切り文字の処理に長い物語を行う必要があります)。

何行、文字をコピーしますか?IEは、先頭のスペースを削除し、コピーしてから変更を元に戻すことが可能でしょうか?
-FCTW

ファイルまたはその中のいくつかの行に先行タブがない場合はどうなりますか?なぜあなたはいつもそれをしたいのですか?
phuclv

1
なぜこれが必要なのですか?主要な空白が迷惑になるのはなぜですか?
mrjink

シェルで?それは問題ではないはずです。vimを使用する場合は、を検討してください:set paste
-mrjink

Vimではなく、シェルで。それはあなたが持つコード貼り付けるときに問題があるためであるcatヒアドキュメントを- それはあります
-JohnDoea

回答:


7

次のAutoHotKey(AHK)スクリプトを検討してください。AutoHotkeyスクリプトの詳細については、AutoHotkeyチュートリアルとドキュメントを参照してください。

AutoHotKeyをインストールした後、Ctrl+ Shift+ cまたはxNotepad ++内を押して、行をトリミングしてクリップボードにコピー(または切り取り)します。

注: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

コメントは詳細なディスカッション用ではありません。この会話はチャットに移動さました
ジャーニーマンオタク

スティーブン私はさらに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

編集:

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

簡単な方法は次のとおりです。

  • 目的の選択範囲の先頭でマウスを左クリックします。

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

  • カーソルを次の2番目の最終位置に移動します。

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

この助けを願っています


1
以前の回答にさらに詳細を追加します。このヘルプを願っています。
ヤシン

1
これは、すべての行の先頭のタブまたはスペースが同じ場合にのみ機能します
-phuclv

1
実際、はい、質問
は行

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

こんにちはライアン。Notepad ++を使用している限り、CTRL + Cのみですべてを実行する方法を探しています。また、Windowsの起動時にこのスクリプトを開始する方法はありますか?
-JohnDoea

0

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

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

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

置換空のまま

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

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


実際、いや、ファイルに保存したい。私はそれらを持たないようにクリップボードのバージョンが必要です。
-JohnDoea

@ベニアそう、わかった。データをコピーした後、ファイルは必要ないので保存しません。個人的にNotepad ++を非常に頻繁に使用し、コピーの方法を変更することは、ファイルを保存せずに正規表現を使用するよりもイライラするため、私がそれを提案した理由です。先行キャラクターが必要ないのはこの1つのインスタンスだけであるため、他の場合の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, ^xしてSend, ^{sc02e}Send, ^{sc02d}、それぞれ。これにより、ヘブライ語モードおよびその他の英語以外の言語モードでのテキスト削除のバグが防止されます。
  • コメントを削除しました。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.