[Wunsch] Strg-V verbessern (je nach Inhalt d. Zwischenablage

German support forum

Moderators: white, Hacker, Stefan2

Post Reply
MarcRené
Junior Member
Junior Member
Posts: 4
Joined: 2018-02-23, 15:45 UTC
Location: Düsseldorf

[Wunsch] Strg-V verbessern (je nach Inhalt d. Zwischenablage

Post by *MarcRené »

Hallo zusammen,

im Total Commander kann man sehr schön den Pfad zu einer Datei oder einem Ordner in die Zwischenablage kopieren. Das klappt auch hervorragend.

Was mir nicht so gut gefällt, ist der andere Weg, nämlich das Aufsuchen eines Pfades, der als Text vorliegt. Häufig arbeite ich mit Pfaden, die ich in Textform erhalte, sei es aus einem Anwenderticket oder als Ergebnis aus einem Script. Da es sich dabei um viele Pfade handelt, die ich aufsuchen muss, bin ich natürlich an einer einfachen Lösung interessiert.

Der offizielle Weg dazu ist, entweder die Befehlszeile aufzumachen und "cd <pfad>" einzugeben oder über der Dateiliste auf den Pfad zu klicken und dort dann mit Strg-V + Enter den Pfad einzufügen und aufzusuchen. Kann man so machen, ist aber im Verhältnis zu einem einfachen Einfügen des Pfades mittels Strg-V doch umständlich. Vor allem, wenn man es mit dreihundert Pfaden zu tun hat... :shock:

Daher folgender Wunsch: Der Total Commander könnte, wenn ein Anwender Strg-V drückt, anhand des Inhaltes der Zwischenablage entscheiden, was zu tun ist.

1. Ist ein Text in der Zwischenablage und der Text bildet einen Pfad, dann versuche, dort hin zu gehen.
2. Handelt es sich jedoch bei dem Inhalt der Zwischenablage um eine Dateiliste, dann füge die Dateien wie bisher in das aktuelle Verzeichnis ein
3. gerne zusätzlich: ist ein Bild in der Zwischenablage, öffne es im Lister

Mein bisheriger Workaround:
Im TC-Verzeichnis unter \plugins\ahk\ liegt ein script "gehezu.ahk" und ein autohotkey.exe

In der usercmd.ini habe ich das Teil entsprechend verknüpft:

Code: Select all

[em_GeheZu]
cmd=%Commander_Path%\Plugins\ahk\autohotkey.exe "%Commander_Path%\Plugins\ahk\gehezu.ahk"
Dann unter Konfigurieren - Einstellungen - Diverses die Tastenbelegung von Strg-V umbelegen, so dass em_GeheZu aufgerufen wird.

Hier das passende Autohotkey-Script:

Code: Select all

IfNotExist, %clipboard% { exit }
  
IfWinActive, ahk_class TTOTAL_CMD ; nur, wenn der TC auch aktiv ist
{ 
  
    if DllCall("IsClipboardFormatAvailable", "uint", 1) ; Clipboard enthält Text => Pfad wechseln
      {
        cm_EditPath := 2912 
        SendMessage 1075, %cm_EditPath%, 0 
        if ErrorLevel <> FAIL 
        Send ^v{Enter} 
      }
    else if DllCall("IsClipboardFormatAvailable", "uint", 15) ; Clipboard enthält eine Dateiliste => reinkopieren der Dateien in akt. Verzeichnis
      {
        cm_PasteFromClipboard := 2009
        SendMessage 1075, %cm_PasteFromClipboard%, 0 
      }
   
  return 
} 
Kann man machen, funktioniert auch. Als Serienausstattung wäre es aber trotzdem gut, finde ich :)

Update 2020-04-15:
Hui, das Script wurde in eine Thread-Sammlung mitaufgenommen. Zur Feier dessen hier noch die tiefergelegte Fassung, die auch eingefügte Bilder als png im Dokumente-Ordner speichert und noch ein paar Verbesserungen hat:

Code: Select all

#Include %A_ScriptDir%
#Include Gdip_all.ahk

IfNotExist, %clipboard% { exit }
  
IfWinActive, ahk_class TTOTAL_CMD ; nur, wenn der TC auch aktiv ist
{ 
    if DllCall("IsClipboardFormatAvailable", "uint", 1) ; Clipboard enthält Text => Pfad wechseln, wenn möglich
    {
        tmp := StrReplace(Clipboard, "`r")   ; entferne alle Zeilenumbrüch,sofern vorhanden
        tmp := StrReplace(tmp, "`n")         ; entferne Zeilenvorschübe,sofern vorhanden
        tmp := StrReplace(tmp, """")         ; entferne doppelte Anführungszeichen,sofern vorhanden
        tmp := Trim(tmp)                     ; entferne Leerzeichen an Anfang und Ende, so vorhanden
        clipboard := tmp                     ; so oder so schreiben wir den bereinigten Text wieder zurück ins Clipboard

        tmp1 := SubStr(tmp, 2,2)             ; prüfe auf Laufwerksbuchstaben
        tmp2 := SubStr(tmp,1,2)              ; prüfe auf UNC Pfad
        if (tmp1 = ":\" or tmp2 = "\\" )     ; nur, wenn es ein voller Dateipfad mit Laufwerksbuchstabe oder ein UNC Pfad ist
        {
            if FileExist(tmp)  ; nur, wenn der Text einen existierenden Pfad darstellt
            {
                cm_EditPath := 2912 
                SendMessage 1075, %cm_EditPath%, 0
                
                if ErrorLevel <> FAIL 
                    Send ^v {Enter} 
            }
        }
        else ; Clipbboard ist ein Text, aber kein gültiger Pfad => filtere Dateiliste
            {
                Send %clipboard%
            }
    }
      
    else if DllCall("IsClipboardFormatAvailable", "uint", 15) ; Clipboard enthält eine Dateiliste => reinkopieren der Dateien in akt. Verzeichnis
      {
        cm_PasteFromClipboard := 2009
        SendMessage 1075, %cm_PasteFromClipboard%, 0 
      }
      
    else if DllCall("IsClipboardFormatAvailable", "uint", 2) ; Clipboard enthält ein Bild => Speichern
      {
         pToken := Gdip_Startup()
         pBitmap := Gdip_CreateBitmapFromClipboard()
         if (pBitmap > 0)
         {
           vPath := A_MyDocuments "\Bild " A_YEAR "-" A_MM "-" A_DD ".png"
           Gdip_SaveBitmapToFile(pBitmap, vPath)
         }
         DllCall("CloseClipboard")
         Gdip_Shutdown(pToken)      
      }
   
  return 
}

Liebe Grüße
Marc
Last edited by MarcRené on 2020-04-15, 15:15 UTC, edited 1 time in total.
User avatar
Horst.Epp
Power Member
Power Member
Posts: 6450
Joined: 2003-02-06, 17:36 UTC
Location: Germany

Post by *Horst.Epp »

Ich mache das in einem em_Befehl mit Hilfe eines Nirsoft Tools.
Den auf einen Button und der TC springt zum Inhalt der Zwischenablage.

Code: Select all

[em_CDToClip]
cmd=c:\tools\NirSoft\x64\nircmd.exe exec show %COMMANDER_EXE% /O /S /A /L="~$clipboard$
Windows 11 Home x64 Version 23H2 (OS Build 22631.3374)
TC 11.03 x64 / x86
Everything 1.5.0.1371a (x64), Everything Toolbar 1.3.2, Listary Pro 6.3.0.69
QAP 11.6.3.2 x64
User avatar
r63
Junior Member
Junior Member
Posts: 3
Joined: 2018-02-27, 13:22 UTC

Post by *r63 »

Nette Lösung, Horst. :)

Hast Du vielleicht eine Idee, warum Dein Kommando anstandslos funktioniert, solange es in einer Zeile steht, aber nicht mehr, wenn alles nach nircmd.exe in die Parameter-Zeile eingetragen wird?

Code: Select all

[em_test]
button=%COMMANDER_EXE%,3
cmd=%COMMANDER_PATH%\NirCmd.exe
param=exec show %COMMANDER_EXE% /O /S /A /L="~$clipboard$
menu=Zum Pfad in der Zwischenablage wechseln
Vielleicht bin ich ja ein bisschen zu OCD, weil ich die Parameter in der Parameter-Zeile haben wollte... ;)
User avatar
Horst.Epp
Power Member
Power Member
Posts: 6450
Joined: 2003-02-06, 17:36 UTC
Location: Germany

Post by *Horst.Epp »

r63 wrote:Nette Lösung, Horst. :)

Hast Du vielleicht eine Idee, warum Dein Kommando anstandslos funktioniert, solange es in einer Zeile steht, aber nicht mehr, wenn alles nach nircmd.exe in die Parameter-Zeile eingetragen wird?

Code: Select all

[em_test]
button=%COMMANDER_EXE%,3
cmd=%COMMANDER_PATH%\NirCmd.exe
param=exec show %COMMANDER_EXE% /O /S /A /L="~$clipboard$
menu=Zum Pfad in der Zwischenablage wechseln
Vielleicht bin ich ja ein bisschen zu OCD, weil ich die Parameter in der Parameter-Zeile haben wollte... ;)
Nein, habe ich nicht.
Es ist aber z.B. wichtig, dass das abschliessende " am Ende fehlt
Für den em_ Befehl ist es aber doch ganz egal wo die Parameter stehen.
Windows 11 Home x64 Version 23H2 (OS Build 22631.3374)
TC 11.03 x64 / x86
Everything 1.5.0.1371a (x64), Everything Toolbar 1.3.2, Listary Pro 6.3.0.69
QAP 11.6.3.2 x64
User avatar
HolgerK
Power Member
Power Member
Posts: 5406
Joined: 2006-01-26, 22:15 UTC
Location: Europe, Aachen

Post by *HolgerK »

r63 wrote:param=exec show %COMMANDER_EXE% /O /S /A /L="~$clipboard$
Umgebungsvariablen mit Prozent(%) müssen im Parameterfeld escaped werden, um Konflikte mit den TC eigenen Parameter (z.B. %C1 oder %P%N ) zu vermeiden. Dazu die %-Zeichen einfach duplizieren.
Zudem sollte beachtet werden, das evtl. Leerzeichen in den Variableninhalten existieren können, die man dann mit Quotes (") dekorieren sollte damit nicht anstelle von einem Parameter, zwei (durch Leerzeichen getrennte) Parameter vom aufgerufenen Programm erkannt werden.
Also korrekterweise:
param=exec show "%%COMMANDER_EXE%%" /O /S /A /L="~$clipboard$"
Gruss
Holger
Make our planet great again
User avatar
r63
Junior Member
Junior Member
Posts: 3
Joined: 2018-02-27, 13:22 UTC

Post by *r63 »

Das war's leider nicht. :(

Das Escapen hat nichts gebracht. Und die Anführungszeichen können auch nicht so entscheidend sein, da Horsts "einzeilige" Lösung auch ohne sie gut funktioniert.

Macht Euch keinen Kopf mehr - so wichtig ist es nicht.

Trotzdem danke für's Nachdenken! :)
User avatar
HolgerK
Power Member
Power Member
Posts: 5406
Joined: 2006-01-26, 22:15 UTC
Location: Europe, Aachen

Post by *HolgerK »

r63 wrote:Macht Euch keinen Kopf mehr..
Da kennst du mich aber schlecht.
So etwas lässt mir keine Ruhe.;-)

Die Variante von Horst.Epp funktioniert, weil der TC die Umgebungsvariablen in der Kommandozeile auflöst (durch den Inhalt ersetzt), während in der Parameterzeile die Umgebungsvariable namentlich erhalten bleibt und das aufgerufene Programm sich um die Auflösung kümmern muss.

Da scheint allerdings bei Nir Sofer mal ein Problem gewesen zu sein:
29/09/2004 1.51 Variable names are now enclosed with '$' char instead of '%' char.
I made this change because the '%' char causes problems when running NirCmd from cmd/bat file. using the '%' char for variable names is still supported for backward compatibility.
Aber kein Problem ohne eine Lösung:
sys.varname You can use this option to represent any environment variable on your system.
For example:
~$sys.username$, ~$sys.windir$, ~$sys.computername$, ~$sys.logonserver$, ~$sys.temp$, and so on...
Die an nircmd angepasste Variante lautet also:
param=exec show "~$sys.COMMANDER_EXE$" /O /S /A /L="~$clipboard$"
;-)
Holger
Make our planet great again
User avatar
r63
Junior Member
Junior Member
Posts: 3
Joined: 2018-02-27, 13:22 UTC

Post by *r63 »

HolgerK wrote: Da kennst du mich aber schlecht.
So etwas lässt mir keine Ruhe.;-)
Sportlichen Ehrgeiz erkenne ich an! 8) Da ich dieses Forum seit gefühlten Jahrzehnten mitlese, habe ich sowas fast "befürchtet"... ;)
HolgerK wrote:Die an nircmd angepasste Variante lautet also:
param=exec show "~$sys.COMMANDER_EXE$" /O /S /A /L="~$clipboard$"
Super! Funktioniert und die Erklärung ist auch gleich mitgeliefert! Vielen Dank dafür! ;)

Ralph
Post Reply