ubuntuusers.de

Tabulator mit cut'n'paste in eine Shell einfügen

Status: Ungelöst | Ubuntu-Version: Xubuntu 10.04 (Lucid Lynx)
Antworten |

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17605

Wohnort: Berlin

Im Postgresql-Forum http://www.pg-forum.de/f54/tabulator-psql-shell-4577/#post25188 habe ich ein Problem geschildert, von dem sich zeigt, dass es gar nicht postgresql-spezifisch ist, sondern mit Shells per se zu tun hat.

Und zwar schreibe ich einen mit Tabulatoren eingerückten Text in einem Editor - beispielsweise sowas:

CREATE TABLE kunde (
	id 		serial,
	name		character varying (20)
);

Im Editor ist der Tabulator auf eine 8er-Weite eingestellt, und Tab=Tab, nicht x Leerzeichen.

Nun markiere ich das mit der Maus, und wechsle in die Shell, und gebe ein

echo "

und hinter den Anführungsstriche versuche ich meinen Code einzufügen, also klicke ich mittlere Maustaste, und es erscheint

1
2
3
4
5
6
7
8
echo "CREATE TABLE kunde (
> id 
Display all 353 possibilities? (y or n)
> id amecharacter varying (20),
> );"
CREATE TABLE kunde (
id amecharacter varying (20)
);

In Zeile 5 füge ich unverdrossen am Ende die schließenden Anführungsstriche ein, und ENTER, woraufhin das irgendwie zusammengestaucht wird, die Tabulatoren verschwinden, und hier auch irgendwie der Zeilenumbruch.

Oben sieht man, dass der Tab nach dem id eine command-completition ausgelöst hat, und mir 353 mögliche, aber natürlich völlig unsinnige Füllungen angeboten werden.

Allerdings ist das Resultat völlig konsistent mit dem was passiert, wenn ich das so in der Shell eingebe, mit Tab getippt, nicht per cut'n'paste. Und zwar, jeweils bei auskommentierung von bash_completition in ~/.bashrc .

# if [ -f /etc/bash_completion ]; then
#     . /etc/bash_completion
# fi

Ohne die Auskommentierung sieht es aber ähnlich aus, nur das mir auch noch alle Dateien des aktuellen Verzeichnisses in die Shell gedruckt werden.

Ich habe also ein paar Tests ausgeführt, um das Problem einzugrenzen: In Bash mit und ohne die 3 Zeilen per echo. Statt bash in xfterm4, dem Standard unter XFCE/xUbuntu, mit gnome-terminal, xterm und uxterm - kein Unterschied.

Ob in einer bash-Shell, in psql oder der Scala-Shell, prinzipiell das gleiche Problem.

Auch unterschiedliche Editoren als Quelle habe ich getestet (gedit, scite, mousepad). Fail.

Einzig und alleine wenn ich dash aufrufe zeigt sich diese robust, und transferiert Tab zu Tab. Ich kenn' ja die dash nicht - was der Bauer ... die kennt keine History? Keinen bunten Directoryprompt? Keine Cmd-Cmpl.? Oder muss das alles nur konfiguriert werden? Nein - sagt nichts, ich wollte ja Tabs einfügen können, keinen shell-rant beginnen.

Also weiter im Text: Meine Hoffnung, dass ein aus der Shell gestartetes psql oder scala die Tabfreudigkeit der dash erben könnte war schneller ausprobiert und zerschlagen, als durchdacht. Jetzt, wo der Geist langsam hinterherkommt, erscheint es mir nur zu logisch: Sicher, die Programme sind alle eigenständig, und das wäre ja noch schöner, wenn psql mal so, mal so reagierte, je nach dem, ob per bash oder dash gestartet.

Und alle haben ihre eigene Kommandovervollständigung, und da die auf Tab triggert, kann ich allenfalls das eine haben - Tabs per cut'n'paste, oder das andere: Tabs zur Autovervollständigung. Wenn es sich in der Konfiguration ausschalten läßt.

Ich könnte jetzt entweder die Editoren auf Blanks-statt-Tabs umstellen, was natürlich nur theoretisch möglich ist. Oder ich paste jedes Snipplet in eine Datei, die ich temporär durch sed jage, picke da den Code wieder auf - das ist ja auch ziemlich idiotisch.

Kennt jmd. das Problem und hat andere Lösungsideen? Liegt meine Diagnostik vielleicht doch falsch?

Vain

Avatar von Vain

Anmeldungsdatum:
12. April 2008

Beiträge: 2505

Von Zeit zu Zeit stolpere ich da auch drüber. Eine allumfassende Lösung kenne ich aber auch nicht.

XTerm kennt einen Bracketed Paste Mode, der genau auf dieses Problem eingeht. Eingefügter Text wird dann von Escape-Sequenzen umschlossen, sodass die Anwendung erkennen kann, dass dieser Bereich etwas besonderes ist. Mit echo $'\e[?2004h' schaltet du es an und mit echo $'\e[?2004l' wieder aus. Für Vim gibt es ein schönes Beispiel, wie man das dann nutzen kann.

Vielleicht ist das ja ein Ansatz, aus dem du etwas machen kannst. Ich persönlich bin bisher zu selten in dieses Problem gerannt, um es endgültig zu lösen. 😬 Doch dass es diese Option bei XTerm gibt, sagt mir, dass es anders wohl nicht so einfach zu beseitigen ist.

Antworten |