Frage Verarbeiten von Zwischenablage-Text durch ein Skript zwischen Kopieren und Einfügen


Ich möchte das Einfügeereignis abfangen und einen beliebigen Text in meinem Skript ausführen. Der Anwendungsfall ist so (nehme an, ich habe irgendwo ein Skript, das Text auf stdin akzeptiert und "world" in "potato" umwandelt, auf stdout schreibend).

  1. Markieren Sie einen Text "Hallo Welt!" mit dem Cursor
  2. Mit der mittleren Maustaste klicken, um aus dem Auswahlpuffer einzufügen, und "Hallo Kartoffel!" erscheint

Es sollte keinen manuellen Schritt zwischen 1 und 2 gebend. h. Ich möchte einen Haken beim Einfügeereignis (oder vielleicht beim Kopierereignis), damit der Text automatisch verarbeitet wird. Ich habe nichts Böses im Kopf; Es geht nur darum, den Quellcode beim Kopieren / Einfügen aus dem / ins Web automatisch zu formatieren.

Meine Frage betrifft den Auswahlpuffer (Zwischenablage), aber ich denke, die Frage gilt auch für andere Zwischenablage-Texte.


4
2018-01-03 17:18


Ursprung




Antworten:


Sie können die folgende Bash-Funktion verwenden. Kopiere es in dein ~/.bashrc und es als Quelle beziehen . ~/.bashrc von einem Terminal.

cngstr(){
    echo `xclip -o` | sed -e "s#$1#$2#g" | xclip
}

Verwendung

  • Markieren Sie einen beliebigen Text, indem Sie ihn mit der Maus auswählen. Wie gewohnt kann der ausgewählte Text mit dem mittleren Mausklick eingefügt werden.
  • Im Terminal laufen:

    $ cngstr "string" "replacement"
    
  • Weiter, wenn Sie mit der Maus mittleren Klick einfügen, wird das Wort "Zeichenfolge" in Ihrer Auswahl durch "Ersatz" ersetzt.

Beispiel

Sagen Sie, Ihre Auswahl ist "Hallo Welt!". Als nächstes laufen Sie im Terminal,

cngstr world potato

Benutzen "" für eine Zeichenfolge, die aus mehr als einem Wort besteht. Weiter, wenn Sie mit der Maus mittleren Clip einfügen, "Hallo Kartoffel!" wird auftauchen. Siehe die Screenshots.

Enter image description here

Wie es funktioniert

  1. xclip -o Gibt die Auswahl auf die Standardausgabe aus, an die eine Pipe gesendet wird sed Hier.
  2. Nächster sed ersetzt die Zeichenfolgen, die vom Benutzer eingegeben werden.
  3. Abschließend werden die geänderten Inhalte übergeben xclip was es eingab die primäre Auswahl und wird für das Einfügen durch einen Mausklick in der Mitte verfügbar.

Ich denke xclip kommt mit der Standard-Ubuntu-Distribution. Ansonsten installiere es durch apt-get:

sudo apt-get install xclip

Zusatzinformation

Stellen Sie den geänderten Inhalt auch in die Zwischenablage

Wenn Sie möchten, dass die geänderten Inhalte auch in der Zwischenablage verfügbar sind, so dass Strg+V funktioniert auch, fügen Sie die folgende Zeile im obigen Skript hinzu.

echo `xclip -o` | xclip -selection c

Die obige Zeile übergibt den Inhalt der primären Auswahl an die Zwischenablage. Die modifizierte Funktion sieht folgendermaßen aus:

cngstr(){
    echo `xclip -o` | sed -e "s#$1#$2#g" | xclip
    echo `xclip -o` | xclip -selection c
}

Eine Bash-Funktion, die den Inhalt der Zwischenablage ändern kann (d. h. kopiert mit Strg+C oder aus dem Rechtsklick-Menü) und die modifizierte Zeichenfolge sowohl für die primäre Auswahl als auch für die Zwischenablage verfügbar machen.

cngstr1(){
    echo `xclip -o -selection c` | sed -e "s#$1#$2#g" | xclip
    echo `xclip -o` | xclip -selection c
}

xclip -o Gibt den Inhalt der primären Auswahl standardmäßig aus. Benutzen -selection c um den Inhalt der Zwischenablage zu drucken. Sehen man xclip für mehr.


Sie können diese beiden Funktionen in einem Skript mit einem Schalterfall kombinieren,

#!/bin/sh
string="$2"
replacement="$3"

cngstr(){
    echo `xclip -o` | sed -e "s#$1#$2#g" | xclip
    echo `xclip -o` | xclip -selection c
}

cngstr1(){
    echo `xclip -o -selection c` | sed -e "s#$1#$2#g" | xclip
    echo `xclip -o` | xclip -selection c
}

if [ $# -lt 2 ]
then
    echo "Usage : $0 [c|p] \"string\" \"replacement\" "
    exit
fi

case "$1" in

    c)  cngstr1 "$string" "$replacement"
        ;;
    p)  cngstr "$string" "$replacement"
        ;;
    *) echo "Usage : $0 [c|p] \"string\" \"replacement\" "
        ;;
esac

Verwendung

./script.sh [c|p] "string" "replacement"
  • Verwenden Sie die Option c zum Ändern von Inhalten, die unter Verwendung der Zwischenablage kopiert wurden, d. h. Inhalte, die mit kopiert wurden Strg+Coder aus dem Rechtsklick-Menü.

  • Verwenden Sie die Option p um den Inhalt zu ändern, der mit der primären Auswahl kopiert wurde.


2
2018-03-16 16:37



Ist das nicht Ihre Frage? - souravc
Nein. Das Ausführen eines Skripts zwischen Kopieren und Einfügen ist für mich nicht akzeptabel. Die ganze Idee war, dass es automatisch passiert ist. - wim
OK. Wie kann man wissen, welche Wörter ersetzt werden sollen und durch was? - souravc
Ich schreibe mein eigenes Skript. Sie können davon ausgehen, dass es Text von stdin und outputs auf stdout liest, wie ich im ersten Abschnitt der Frage erklärt habe. Das Problem besteht darin, dass dies automatisch bei Auswahlpufferereignissen ausgeführt wird, sodass zwischen 1. und 2. kein manueller Schritt erforderlich ist. - wim