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).
- Markieren Sie einen Text "Hallo Welt!" mit dem Cursor
- 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.
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.

Wie es funktioniert
xclip -o
Gibt die Auswahl auf die Standardausgabe aus, an die eine Pipe gesendet wird sed
Hier.
- Nächster
sed
ersetzt die Zeichenfolgen, die vom Benutzer eingegeben werden.
- 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.