<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>zInformatik</title>
	<atom:link href="http://zinformatik.de/feed/" rel="self" type="application/rss+xml" />
	<link>http://zinformatik.de</link>
	<description>Computer, Informatik und Mikrocontroller Blog</description>
	<lastBuildDate>Sat, 22 Oct 2011 09:51:29 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>dmenuLauncher 0.1.1 &#8211; Update des leichtgewichtigen Launchers</title>
		<link>http://zinformatik.de/linux/dmenulauncher-0-1-1-update-des-leichtgewichtigen-launchers/</link>
		<comments>http://zinformatik.de/linux/dmenulauncher-0-1-1-update-des-leichtgewichtigen-launchers/#comments</comments>
		<pubDate>Sat, 14 May 2011 12:51:54 +0000</pubDate>
		<dc:creator>zimon</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Ubuntuusers-Planet]]></category>
		<category><![CDATA[Launcher]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[Scripte]]></category>

		<guid isPermaLink="false">http://zinformatik.de/?p=1798</guid>
		<description><![CDATA[<p>Aufgrund des Feedbacks und der vielen interessanten Anregungen habe ich dmenuLauncher ein wenig erweitert. Vielen Dank an alle, die mir Ihre Ideen mitgeteilt haben <img src='http://zinformatik.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>dmenuLauncher ist ein Programmstarter, der dmenu nutzt um ein Programm auszuwählen. Die Grundfunktionalität ist im Artikel <a href="http://zinformatik.de/linux/ein-leichtgewichtiger-launcher-mit-dmenu-und-perl" title="Ein leichtgewichtiger Launcher mit dmenu und Perl" class="liinternal">Ein leichtgewichtiger Launcher mit dmenu</a>&#8230;</p>]]></description>
			<content:encoded><![CDATA[<p>Aufgrund des Feedbacks und der vielen interessanten Anregungen habe ich dmenuLauncher ein wenig erweitert. Vielen Dank an alle, die mir Ihre Ideen mitgeteilt haben <img src='http://zinformatik.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>dmenuLauncher ist ein Programmstarter, der dmenu nutzt um ein Programm auszuwählen. Die Grundfunktionalität ist im Artikel <a href="http://zinformatik.de/linux/ein-leichtgewichtiger-launcher-mit-dmenu-und-perl" title="Ein leichtgewichtiger Launcher mit dmenu und Perl" class="liinternal">Ein leichtgewichtiger Launcher mit dmenu und Perl</a> beschrieben. Das Skript habe ich auf <a href="https://gist.github.com/950556" title="dmenuLauncher.pl auf GitHub" target="_blank" class="liexternal">GitHub</a> hochgeladen.</p>
<p>Das Script wurde um folgende Punkte erweitert:</p>
<ul>
<li>Ob ein Programm im Terminal gestartet werden soll wird nun mitgespeichert</li>
<li>Es können optional auch Argumente für ein Programm gespeichert werden</li>
<li>Es kann ein String definiert werden, der immer vor dem Befehl eingefügt wird</li>
<li>Es gibt eine (englische) readme, in der alle Funktionen beschrieben sind</li>
</ul>
<p><b>Starten im Terminal</b><br />
Wird dem Programmaufruf ein ; angehängt, so wird damit zwischen &#8220;im Terminal ausführen&#8221; und &#8220;direkt ausführen&#8221; hin und hergeschaltet. Die jeweils letzte Einstellung wird für zukünftige Aufrufe gespeichert.</p>
<p>Beispiel: Ich gehe von davon aus, dass die pathfile gerade generiert wurde, also alle Programme immer direkt ausgeführt werden.</p>
<ul>
<li><code>firefox</code> &#8211; führt firefox direkt aus</li>
<li><code>firefox;</code> &#8211; führt firefox im Terminal aus</li>
<li><code>firefox</code> &#8211; führt firefox im Terminal aus (weil dies beim obigen Aufruf für die Zukunft gespeichert wurde)</li>
<li><code>firefox;</code> &#8211; führt firefox direkt aus</li>
<li><code>firefox</code> &#8211; führt firefox direkt aus (weil dies beim obigen Aufruf für die Zukunft gespeichert wurde)</li>
</ul>
<p>Möchte man wirklich ein ; an einen Befehl anhängen ohne die Option &#8220;Starten im Terminal&#8221; zu verändern, kann man dies mit einem \ escapen.</p>
<p>Also: <code>programm\;</code></p>
<p><b>Speichern von Argumenten</b><br />
Es gibt nun eine Konfigurationsvariable <code>SAVE_ARGUMENTS</code>. Ist diese auf 1 gesetzt, werden automatisch alle Argumente gespeichert. Das bedeutet, dass in der Liste der Programme, aus denen man wählen kann das entsprechende Programm einmal ohne Argumente und jeweils einmal mit Argument aufgeführt wird.</p>
<div id="attachment_1801" class="wp-caption alignright" style="width: 244px"><a href="http://zinformatik.de/wp-content/uploads/2011/05/dmenulauncher_vertical_arguments.png" class="liimagelink"><img src="http://zinformatik.de/wp-content/uploads/2011/05/dmenulauncher_vertical_arguments.png" alt="dmenuLauncher im vertikalen Modus mit Argumenten" title="dmenuLauncher im vertikalen Modus mit Argumenten" width="234" height="192" class="size-full wp-image-1801" /></a><p class="wp-caption-text">dmenuLauncher im vertikalen Modus mit Argumenten</p></div>
<p>Für jedes Argument eines Befehls wird auch die Anzahl der Aufrufe gespeichert, so dass häufig genutzte Argumente weiter vorne stehen.</p>
<p>Man kann die Variable <code>SAVE_ARGUMENTS</code> für einen Aufruf umschalten, indem man einen . an den Programmaufruf anhängt.</p>
<p>Beispiel: <code>free -m.</code></p>
<ul>
<li>Ist die Variable <code>SAVE_ARGUMENTS</code> auf 1 gesetzt, so wird das Argument <code>-m</code> nicht gespeichert (ohne den . am Ende würde es gespeichert werden)</li>
<li>Ist die Variable <code>SAVE_ARGUMENTS</code> auf 0 gesetzt, so wird das Argument <code>-m</code> gespeichert (ohne den . am Ende würde es nicht gespeichert werden)</li>
</ul>
<p>Bei der Optimierung werden Programme, zu denen Argumente gespeichert sind grundsätzlich nicht entfernt.</p>
<p>Möchte man wirklich einen . an einen Befehl anhängen ohne die Option &#8220;Speichern von Argumenten&#8221; zu verändern, kann man ihn mit einem \ escapen.</p>
<p>Also: <code>programm\.</code></p>
<p>Man kann . und ; nicht gleichzeitig bei einem Aufruf verwenden.</p>
<p><strong>[UPDATE]</strong> Ich habe als Trenner für mehrere Argumente in der pathfile die Zeichenfolge <code>|||</code> genutzt und zum Trennen der Argumente und der jeweiligen Anzahl der Aufrufe die Zeichenfolge <code>|#|</code>. Leerzeichen sind hier nicht möglich, da diese auch in den Argumenten vorkommen dürfen sollen. Falls jemand einen Fall kennt, wo diese Trenner problematisch wären oder grundsätzlich eine bessere Idee hat würde ich mich über einen entsprechenden Kommentar freuen <img src='http://zinformatik.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> <strong>[/UPDATE]</strong></p>
<p><b>String vor dem Befehl</b><br />
In der Variable <code>BEFORE_COMMAND</code> kann man einen String definieren, der vor dem Befehl eingefügt wird. Ein Anwendungszweck wäre das Wechseln ins Home-Verzeichnis, so dass alle Befehle im Home-Verzeichnis ausgeführt werden.<br />
Dafür setzt man <code>BEFORE_COMMAND</code> auf <code>"cd ~ &#038;&#038; "</code>. Dies ist auch die default Einstellung.</p>
<p>Natürlich kann man auch einen leeren String angeben, damit nichts vor dem eigentlichen Befehl eingefügt wird.</p>
<p><b>Die Readme</b><br />
Die Readme findet man, wenn man die Datei dmenuLauncher.pl mit einem Texteditor öffnet.</p>
]]></content:encoded>
			<wfw:commentRss>http://zinformatik.de/linux/dmenulauncher-0-1-1-update-des-leichtgewichtigen-launchers/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Ein leichtgewichtiger Launcher mit dmenu und Perl</title>
		<link>http://zinformatik.de/linux/ein-leichtgewichtiger-launcher-mit-dmenu-und-perl/</link>
		<comments>http://zinformatik.de/linux/ein-leichtgewichtiger-launcher-mit-dmenu-und-perl/#comments</comments>
		<pubDate>Sun, 01 May 2011 15:30:30 +0000</pubDate>
		<dc:creator>zimon</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Ubuntuusers-Planet]]></category>
		<category><![CDATA[Launcher]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[Scripte]]></category>

		<guid isPermaLink="false">http://zinformatik.de/?p=1765</guid>
		<description><![CDATA[<p>Lange habe ich GNOMEDo genutzt nur um Programme zu starten. Auch Kupfer und Launchy habe ich ausprobiert. Was mir an allen Programmen nicht gefällt: Für die Aufgabe, für die ich sie brauche (zum Starten von Programmen) sind sie viel zu groß, zu überladen und sie laufen die ganze Zeit im Hintergrund und brauchen RAM. Durch <a href="http://uzbl.org" target="_blank" class="liexternal">uzbl</a> habe&#8230;</p>]]></description>
			<content:encoded><![CDATA[<p>Lange habe ich GNOMEDo genutzt nur um Programme zu starten. Auch Kupfer und Launchy habe ich ausprobiert. Was mir an allen Programmen nicht gefällt: Für die Aufgabe, für die ich sie brauche (zum Starten von Programmen) sind sie viel zu groß, zu überladen und sie laufen die ganze Zeit im Hintergrund und brauchen RAM. Durch <a href="http://uzbl.org" target="_blank" class="liexternal">uzbl</a> habe ich <a href="http://tools.suckless.org/dmenu/" target="_blank" class="liexternal"><code>dmenu</code></a> kennen gelernt. Ein Programm, mit dem man leicht eine Liste von Worten als Menü anzeigen kann. Der Benutzer kann nun das gesuchte Wort eingeben und <code>dmenu</code> schließt automatisch beim Tippen alle unpassenden Wörter aus (dabei wird nicht nur der Wortanfang kontrolliert sondern ob irgendein Teil des Wortes matched). Mit &lt;ENTER&gt; wird das aktuell ausgewählte Wort zurückgegeben und dmenu beendet. Übergibt man diesem Programm die Liste aller im PATH befindlichen Programme und führt das gewählte Programm danach aus hat man schon einen Launcher.</p>
<p>Ich habe nun noch ein kleines Script &#8211; <code>dmenuLauncher.pl</code> &#8211; geschrieben, das die Programme nach Häufigkeit ihrer Aufrufe sortiert, damit die am häufigsten genutzten Programmen immer zuerst gewählt werden, wenn es eine Mehrdeutigkeit gibt.</p>
<p>Features:</p>
<ul>
<li>Kleines Perl-Script, dass nur bei Bedarf gestartet wird und sonst weder Prozessorzeit noch RAM benötigt</li>
<li>Kann in den meisten Fenstermanagern über Tastenkombination gestartet werden</li>
<li>Programmen können beim Aufruf Argumente übergeben werden</li>
<li>Sortiert Programme nach Nutzungshäufigkeit</li>
<li>Horizontale oder vertikale Anzeige der Programmliste</li>
<li>Programme im Terminal öffnen</li>
<li>Optimierung der Programmliste (löschen aller Programme mit geringer Aufrufsanzahl aus der Liste)</li>
<li>Einfaches hinzufügen von Programmen, die nicht in der Liste sind</li>
</ul>
<p>&nbsp;</p>
<p style="text-align: center;">
<div id="attachment_1772" class="wp-caption aligncenter" style="width: 707px"><a href="http://zinformatik.de/wp-content/uploads/2011/05/dmenuLauncher-horizontal1.png" class="liimagelink"><img class="size-full wp-image-1772  " title="dmenuLauncher-horizontal" src="http://zinformatik.de/wp-content/uploads/2011/05/dmenuLauncher-horizontal1.png" alt="dmenuLauncher mit horizontaler Anzeige" width="697" height="94" /></a><p class="wp-caption-text">dmenuLauncher mit horizontaler Anzeige der am häufigsten aufgerufenen Programme</p></div>
<p>&nbsp;</p>
<p>Das Script habe ich auf <a href="https://gist.github.com/950556" title="dmenuLauncher.pl auf gitHub" target="_blank" class="liexternal">gitHub</a> online gestellt. Das Programm <code>dmenu</code> kann unter Ubuntu über das Paket <code>dwm-tools</code> installiert werden. Also mit dem Befehl <code>sudo apt-get install dwm-tools</code>.</p>
<p>Die Datei <code>dmenuLauncher.pl</code> hat im oberen Teil einen Konfigurationsbereich. Ich habe auf eine externe Konfigurationsdatei verzichtet um diese nicht jedes Mal laden zu müssen.</p>
<p>Zuerst wird der Pfad zur path-Datei (in der die Liste der Programme mit ihrer jeweiligen Aufrufanzahl gespeichert wird) in der Variablen <code>PATHFILE</code> angegeben.</p>
<p><code>dmenu</code> kann die Programme im Menü nebeneinander oder untereinander angezeigen. Dafür kann man <code>dmenuLauncher.pl</code> entweder mit der Option <code>-h</code> für horizontal (also nebeneinander) oder <code>-v</code> für vertical (also untereinander) aufrufen.</p>
<p>Den Standardmodus, der genutzt wird, wenn nichts angegeben wurde kann man über die Variable <code>MODE</code> steuern. Sie wird entweder auf <code>horizontal</code> oder <code>vertical</code> gesetzt.</p>
<div id="attachment_1773" class="wp-caption alignright" style="width: 310px"><a href="http://zinformatik.de/wp-content/uploads/2011/05/dmenuLauncher-vertical.png" class="liimagelink"><img class="size-medium wp-image-1773" title="dmenuLauncher-vertical" src="http://zinformatik.de/wp-content/uploads/2011/05/dmenuLauncher-vertical-300x209.png" alt="dmenuLauncher vertikale Anzeige" width="300" height="209" /></a><p class="wp-caption-text">dmenuLauncher mit vertikaler Anzeige der Programme mit &quot;gnome&quot; im Namen</p></div>
<p>Die Konfigurationsvariable <code>NUMBER_OF_LINES</code> gibt die Anzahl von anzuzeigenden Zeilen im <code>vertical</code>-Modus an.</p>
<p>In der Variablen <code>TERMINAL</code> wird der Befehl für den Terminalaufruf gespeichert. Der Platzhalter <code>%COMMAND%</code> wird durch das aufzurufende Kommando (mit Argumenten) ersetzt.</p>
<p>Nun kann durch den Aufruf <code>dmenuLauncher.pl -u</code> die path-Datei generiert werden. Nach dem Installieren oder Löschen von Programmen kann die Datei so auch aktualisiert werden.</p>
<p>Nachdem man <code>dmenuLauncher.pl</code> konfiguriert und die path-Datei (mit der Option <code>-u</code>) generiert hat, kann man eine Tastenkombination dafür einrichten. Bei GNOME unter System -&gt; Einstellungen -&gt; Tastenkombinationen auf den Button &#8220;Hinzufügen&#8221; klicken, als Namen &#8220;dmenuLauncher&#8221; und als Befehl den Pfad zur Perldatei (<code>dmenuLauncher.pl</code>) angeben. Nun gibt es in der Liste ganz unten einen neuen Eintrag. Klickt man auf das Feld &#8220;Tastenkombination&#8221;, so kann man die gewünschte Tastenkombination drücken (ich habe SHIFT+&lt;Space&gt; gewählt, die dann dem Script automatisch zugeordnet wird.</p>
<p>Nach dem Starten des Programms (also drücken der zugeordneten Tastenkombination oder per Terminal) öffnet sich nun das Menü und zeigt die Programmliste an. Nun fängt man an, den gewünschten Befehl einzutippen bis er markiert ist. Man kann auch die Pfeiltasten benutzen. Mit der Eingabetaste wird das gewählte Programm ausgeführt und <code>dmenuLauncher</code> geschlossen.</p>
<p>Drückt man nicht direkt die Eingabetaste sondern &lt;Tab&gt;, so wird der Befehl vervollständigt und man kann noch Argumente angeben.</p>
<p>Ob mit ohne ohne Argumente: Durch ein abschließendes Semikolon wird der Befehl im Terminal ausgeführt.</p>
<p>Ein paar Beispiele:</p>
<ul>
<li><code>firef&lt;ENTER&gt;</code> öffnet Firefox</li>
<li><code>firef&lt;Tab&gt; http://zinformatik.de&lt;ENTER&gt;</code> öffnet firefox und geht auf die Seite &#8220;http://zinformatik.de&#8221;</li>
<li><code>top;&lt;ENTER&gt;</code> öffnet <code>top</code> in einem Terminal</li>
<li><code>ls -lh ~;&lt;ENTER&gt;</code> zeigt das Ergebnis von  <code>ls -lh ~</code> in einem Terminal an.</li>
</ul>
<p>Da die ganze Liste von Programmen sehr groß ist, man jedoch meist nur einen sehr kleinen Teil nutzt gibt es die Möglichkeit die Liste der Programme zu optimieren. Durch den Aufruf von <code>dmenuLauncher.pl -o</code> werden alle Programme aus der Liste entfernt, die noch nie genutzt wurden. Ein weiteres Argument gibt die Anzahl der Aufrufe an, die ein Programm mindestens haben sollte. So werden durch <code>dmenuLauncher.pl -o 3</code> alle Programm aus der Liste entfernt die weniger als 3 mal aufgerufen wurden.</p>
<p>Möchte man nach der Optimierung ein Programm aufrufen, das sich nicht mehr in der Liste befindet, so kann man es einfach komplett eingeben. Auch wenn es dann keine Auswahl gibt, wird das Programm ausgeführt und mit der Aufrufsanzahl 1 in die Liste gespeichert.<br />
Um ein neues Programm in die Liste aufzunehmen braucht man es also nur einmal eingeben.</p>
<p>Mit <code>dmenuLauncher</code> habe ich also ein sehr kleines Programm, welches nur kurz läuft um mir die Auswahl eines Programms zu ermöglichen und danach sofort wieder beendet wird. Das Laden ist auch auf älteren Systemen kaum zu spüren, weil keine Bibliotheken geladen werden. Das bedeutet ich kann jedes häufiger genutzte Programm mit 3-4 Tastendrücken ohne irgendeine Verzögerung starten.</p>
]]></content:encoded>
			<wfw:commentRss>http://zinformatik.de/linux/ein-leichtgewichtiger-launcher-mit-dmenu-und-perl/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>Vim Plugin &#8211; Taglist: Splitscreen mit Übersicht der Funkionen in einer Datei</title>
		<link>http://zinformatik.de/tipps-tricks/interessante-programme/plugins-erweiterungen/vim-plugin-taglist-splitscreen-mit-ubersicht-der-funkionen-in-einer-datei/</link>
		<comments>http://zinformatik.de/tipps-tricks/interessante-programme/plugins-erweiterungen/vim-plugin-taglist-splitscreen-mit-ubersicht-der-funkionen-in-einer-datei/#comments</comments>
		<pubDate>Sun, 17 Apr 2011 13:15:35 +0000</pubDate>
		<dc:creator>zimon</dc:creator>
				<category><![CDATA[Plugins und Erweiterungen]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Ubuntuusers-Planet]]></category>
		<category><![CDATA[vim Tipps]]></category>
		<category><![CDATA[Scripte]]></category>
		<category><![CDATA[Splitscreen]]></category>
		<category><![CDATA[taglist]]></category>
		<category><![CDATA[Vim]]></category>

		<guid isPermaLink="false">http://zinformatik.de/?p=1751</guid>
		<description><![CDATA[<p>Das <a href="http://www.vim.org/scripts/script.php?script_id=273" title="Vim Plugin - Tasklist" target="_blank" class="liexternal">Taglist Plugin</a> für Vim ist ein praktisches Tool zum programmieren. Es listet die einzelnen Funktionen (je nach Programmiersprache auch Klassen, Packete und Membervariablen) eines Programms in einem eigenen Splitscreen auf. Diese sind nach Dateien sortiert und man kann so sehr schnell zu einer gewünschten Funktion springen.</p>
<p>Damit das Plugin funktioniert muss das&#8230;</p>]]></description>
			<content:encoded><![CDATA[<p>Das <a href="http://www.vim.org/scripts/script.php?script_id=273" title="Vim Plugin - Tasklist" target="_blank" class="liexternal">Taglist Plugin</a> für Vim ist ein praktisches Tool zum programmieren. Es listet die einzelnen Funktionen (je nach Programmiersprache auch Klassen, Packete und Membervariablen) eines Programms in einem eigenen Splitscreen auf. Diese sind nach Dateien sortiert und man kann so sehr schnell zu einer gewünschten Funktion springen.</p>
<p>Damit das Plugin funktioniert muss das Paket <em>exuberant-ctags</em> installiert sein. Danach kann man die Datei <code>taglist.vim</code> ins<br />
Pluginverzeichnis (<code>~/.vim/plugin</code>) kopieren.</p>
<p>Wenn nun eine Datei mit Quellcode geöffnet ist, kann man das Taglist Plugin durch den Befehl <code>:TList</code> aktivieren, woraufhin sich auf der rechten Seite der Splitscreen mit den Funktionen öffnet. Mit STRG+w w kann man zwischen den Splitscreens hin und her wechseln (Ich habe mir <a href="http://zinformatik.de/tipps-tricks/vim-tipps/praktische-vim-mappings/#map_split" title="Praktische vim Mappings" target="_self" class="liinternal">diese Tastenkombination</a> auf <em>+</em> gelegt). Mit j und k kann man nun in den Funktionen hoch und runter scrollen. Drückt man bei der gewünschten Funktion ENTER, so springt der Cursor automatisch wieder auf den Quelltext an der Position, wo die gewählte Funktion beginnt.<br />
Da sich beim Sprung zu einer Funktion die entsprechende Datei im aktuellen Buffer öffnet, empfiehlt es sich, <a href="http://zinformatik.de/tipps-tricks/vim-tipps/vim-buffer-statt-tabs-benutzen/" title="Vim - Buffer statt Tabs benutzen" target="_self" class="liinternal">Buffer statt Tabs</a> zu verwenden.</p>
<p>Praktisch ist es, sich ein autocommand für Quelltexte zu erstellen, so dass die Taglist automatisch beim Öffnen von Quelltexten geladen wird.</p>
<p>Dafür wird eine Funktion benötigt, welche die Dateiendung überprüft und bei entsprechenden Endungen die Taglist öffnet. Das folgende Beispiel öffnet die Taglist für Java und Perl Dateien:</p>

<div class="wp_syntax"><div class="code"><pre class="vim" style="font-family:monospace;"><span style="color: #804040;">function</span> OpenTlist<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
    <span style="color: #804040;">let</span> myfile = <span style="color: #25BB4D;">expand</span><span style="color: #000000;">&#40;</span><span style="color: #C5A22D;">&quot;%&quot;</span><span style="color: #000000;">&#41;</span>
    <span style="color: #804040;">let</span> myfiletype = <span style="color: #25BB4D;">expand</span><span style="color: #000000;">&#40;</span><span style="color: #C5A22D;">&quot;%:e&quot;</span><span style="color: #000000;">&#41;</span>
    <span style="color: #804040;">if</span> myfiletype == <span style="color: #C5A22D;">&quot;pl&quot;</span> <span style="color: #000000;">||</span> myfiletype == <span style="color: #C5A22D;">&quot;java&quot;</span>
        Tlist
    <span style="color: #804040;">end</span>
endfunction</pre></div></div>

<p>Nun noch das autocommand:</p>

<div class="wp_syntax"><div class="code"><pre class="vim" style="font-family:monospace;"><span style="color: #804040;">au</span> <span style="color: #25BB4D;">BufRead</span> <span style="color: #000000;">*</span> <span style="color: #804040;">call</span> OpenTlist<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span></pre></div></div>

<p>Beides wird in die <code>~/.vimrc</code> geschrieben.</p>
<p>Nun kann man sich in der <code>~/.vimrc</code> noch ein Mapping anlegen um die Taglist mit z.B. F3 ein- und auszublenden:</p>

<div class="wp_syntax"><div class="code"><pre class="vim" style="font-family:monospace;"><span style="color: #804040;">map</span> <span style="color: #668080;">&lt;F3&gt;</span> <span style="color: #000000;">:</span>TlistToggle<span style="color: #000000;">&lt;</span>cr<span style="color: #000000;">&gt;</span></pre></div></div>

<p>Wenn man Programmiert, dann schreibt man natürlich auch neue Funktionen. Diese werden von der Taglist leider nicht sofort erkannt. Daher ist es sinnvoll ein Mapping zu definieren um die Taglist zu updaten. Das folgende Mapping legt das Updaten der Taglist auf F4 (die Datei wird dabei direkt gespeichert):</p>

<div class="wp_syntax"><div class="code"><pre class="vim" style="font-family:monospace;"><span style="color: #804040;">map</span> <span style="color: #668080;">&lt;F4&gt;</span> <span style="color: #000000;">:</span>w<span style="color: #000000;">&lt;</span>cr<span style="color: #000000;">&gt;:</span>TlistUpdate<span style="color: #000000;">&lt;</span>cr<span style="color: #000000;">&gt;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://zinformatik.de/tipps-tricks/interessante-programme/plugins-erweiterungen/vim-plugin-taglist-splitscreen-mit-ubersicht-der-funkionen-in-einer-datei/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Notizen mit dem Hilfesystem von Vim verwalten</title>
		<link>http://zinformatik.de/tipps-tricks/vim-tipps/notizen-mit-dem-hilfesystem-von-vim-verwalten/</link>
		<comments>http://zinformatik.de/tipps-tricks/vim-tipps/notizen-mit-dem-hilfesystem-von-vim-verwalten/#comments</comments>
		<pubDate>Fri, 23 Jul 2010 20:52:10 +0000</pubDate>
		<dc:creator>zimon</dc:creator>
				<category><![CDATA[Ubuntuusers-Planet]]></category>
		<category><![CDATA[vim Tipps]]></category>
		<category><![CDATA[Hilfe]]></category>
		<category><![CDATA[Notizen]]></category>
		<category><![CDATA[Vim]]></category>

		<guid isPermaLink="false">http://zinformatik.de/?p=1742</guid>
		<description><![CDATA[<p>Wer sich schon einmal etwas näher mit Vim befasst hat, wird das Hilfesystem kennen. Man kann sich zu jedem Befehl und jeder Option eine Hilfeseite in einem horizontalen <a href="http://zinformatik.de/tipps-tricks/vim-tipps/unter-vim-mit-splitscreens-arbeiten/" title="Unter Vim mit Splitscreens arbeiten" target="_self" class="liinternal">Splitscreen</a> anzeigen lassen, indem man im Kommandomodus</p>

<div class="wp_syntax"><div class="code"><pre class="vim" style="font-family:monospace;"><span style="color: #000000;">:</span>h befehlsname</pre></div></div>

<p>eingibt. In der Hilfe gibt es dann auch Verweise um auf weiterführende Informationen zu&#8230;</p>]]></description>
			<content:encoded><![CDATA[<p>Wer sich schon einmal etwas näher mit Vim befasst hat, wird das Hilfesystem kennen. Man kann sich zu jedem Befehl und jeder Option eine Hilfeseite in einem horizontalen <a href="http://zinformatik.de/tipps-tricks/vim-tipps/unter-vim-mit-splitscreens-arbeiten/" title="Unter Vim mit Splitscreens arbeiten" target="_self" class="liinternal">Splitscreen</a> anzeigen lassen, indem man im Kommandomodus</p>

<div class="wp_syntax"><div class="code"><pre class="vim" style="font-family:monospace;"><span style="color: #000000;">:</span>h befehlsname</pre></div></div>

<p>eingibt. In der Hilfe gibt es dann auch Verweise um auf weiterführende Informationen zu gelangen. Man kann diesen &#8220;Links&#8221;  folgen indem man mit dem Cursor auf den Verweis navigiert und <code>Strg+]</code> (<code>Strg+AltGr+9</code>) drückt. Mit <code>Strg+t</code> springt man wieder zurück.</p>
<p>Eine praktische Möglichkeit seine Notizen zu verwalten ist es nun, dafür eine eigenene Hilfeseite anzulegen. Das hört sich komplizierter an als es ist. Man legt eine Datei im Ordner <code>~/.vim/doc/</code> an, deren letze Zeile so aussieht:</p>

<div class="wp_syntax"><div class="code"><pre class="vim" style="font-family:monospace;"><span style="color: #adadad; font-style: italic;">&quot; vim: filetype=help modifiable noreadonly</span></pre></div></div>

<p>Durch den <code>filetype</code>-Befehl weiß Vim, dass es eine Hilfedatei ist. <code>modifiable</code> und <code>noreadonly</code> müssen gesetzt sein, damit man die Datei auch editieren kann (da dies für Hilfedateien per Default nicht möglich ist). Natürlich kann man auch noch weitere Optionen und Einstellungen vornehmen. Ich habe bei mir noch einige Optionen für <a href="http://zinformatik.de/tipps-tricks/vim-tipps/faltungen-mit-vim-textstellen-zusammen-klappen/" title="Faltungen mit Vim" target="_self" class="liinternal">Faltungen</a> hinzugefügt:</p>

<div class="wp_syntax"><div class="code"><pre class="vim" style="font-family:monospace;"><span style="color: #adadad; font-style: italic;">&quot; vim: filetype=help foldmethod=marker foldmarker={{{,}}} foldlevel=0 modifiable noreadonly commentstring=\ %s</span></pre></div></div>

<p>Man kann (wenn man möchte) statt der Datei selbst auch einen symbolischen Link im Verzeichnis <code>~/.vim/doc/</code> platzieren, der auf die Notizen-Datei zeigt, wodurch Notizen und echte Hilfedateien etwas besser getrennt sind.</p>
<p>Nun braucht man noch Tags (die Ziele der Verweise) in der Datei. Diese werden von Sternchen umschlossen (z.B. <code>*tag*</code>). Die Verweise auf die Tags werden durch senkrechte Striche (Pipes) markiert (z.B. <code>|tag|</code>). Von <code>|tag|</code> kann man also mittels <code>Strg+]</code> auf die Textstelle gelangen, wo <code>*tag*</code> steht.</p>
<p>Hier mal eine kleine Beispieldatei:</p>

<div class="wp_syntax"><div class="code"><pre class="plain" style="font-family:monospace;">Meine Notizen *znotizen*
&nbsp;
&nbsp;
Telefonliste *zphone* {{{
    mom: 555-676767-333
    dad: 555-767676-222
    work: 555-121212-999
 }}}
&nbsp;
Vim Shortcuts *zvim* {{{
    mx      markieren mit x, siehe |mark|
    'x      springe zu Markierung x
    yy      kopiere Zeile
 }}}
&nbsp;
Hier ein Link zur Telefonliste: |zphone|
&nbsp;
&nbsp;
&quot; vim: filetype=help foldmethod=marker foldmarker={{{,}}} foldlevel=0 modifiable noreadonly commentstring=\ %s</pre></div></div>

<p>Wenn man neue Tags eingefügt hat, muss man sie mit dem Befehl <code>:helptags ~/.vim/doc/</code> bekannt machen. Nun kann mit mit <code>:h znotizen</code> die Datei öffnen wie eine Hilfeseite. Genauso kann man mit <code>:h zphone</code> die Hilfeseite öffnen, wobei man direkt bei den Telefonnummern landet. Es reicht nur einen Teil des Tags einzugeben, wenn dieser eindeutig ist, z.B. kann man <code>:h zno</code> eingeben statt den ganzen Tag <code>:h znotizen</code> auszuschreiben.</p>
<p>Um bei jedem Speichern der Notizen das <code>helptags</code>-Kommando automatisch auszuführen wird das folgende Autokommando empfohlen:</p>

<div class="wp_syntax"><div class="code"><pre class="vim" style="font-family:monospace;"><span style="color: #804040;">au</span> <span style="color: #25BB4D;">BufWritePost</span> <span style="color: #000000;">~/.</span>vim<span style="color: #000000;">/</span>doc<span style="color: #000000;">/*</span> helptags <span style="color: #000000;">~/.</span>vim<span style="color: #000000;">/</span>doc</pre></div></div>

<p>Leider funktioniert es bei mir nicht, weswegen ich mir ein Mapping dafür definiert habe:</p>

<div class="wp_syntax"><div class="code"><pre class="vim" style="font-family:monospace;"><span style="color: #804040;">map</span> <span style="color: #000000;">&lt;</span>leader<span style="color: #000000;">&gt;</span>ut <span style="color: #000000;">:</span>helptags <span style="color: #000000;">~/.</span>vim<span style="color: #000000;">/</span>doc<span style="color: #000000;">&lt;</span>CR<span style="color: #000000;">&gt;</span></pre></div></div>

<p>Durch dieses Mapping kann man mittels <code>\ut</code> seine Tags aktualisieren (ut für update tags)</p>
<p>Es gibt auch Plugins, die einen bei der Verwaltung seiner Notizen im Hilfesystem unterstützen (siehe Links)</p>
<p><strong>Links</strong></p>
<ul>
<li><a href="http://vim.wikia.com/wiki/Add_your_note_files_to_Vim_help" target="_blank" class="liexternal">http://vim.wikia.com/wiki/Add_your_note_files_to_Vim_help</a> &#8211; VimTip zum Thema</li>
<li><a href="http://vim.wikia.com/wiki/VimTip482" target="_blank" class="liexternal">http://vim.wikia.com/wiki/VimTip482</a> &#8211; ein weiterer VimTip dazu</li>
<li><a href="http://www.vim.org/scripts/script.php?script_id=828" target="blank" class="liexternal">http://www.vim.org/scripts/script.php?script_id=828</a> &#8211; VimNotes Plugin zur Unterstützung bei der Verwaltung von Notizen mit dem Hilfesystem</li>
<li><a href="http://www.vim.org/scripts/script.php?script_id=293" target="_blank" class="liexternal">http://www.vim.org/scripts/script.php?script_id=293</a> &#8211; Universal Text Linking Plugin um alle Arten von Links in Vim einzufügen und aus Vim heraus aufzurufen</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://zinformatik.de/tipps-tricks/vim-tipps/notizen-mit-dem-hilfesystem-von-vim-verwalten/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Schöner Debuggen mit DebugMessages &#8211; Stacktraces mit Quelltextanzeige</title>
		<link>http://zinformatik.de/programmieren/schoner-debuggen-mit-debugmessages-stacktraces-mit-quellttextanzeige/</link>
		<comments>http://zinformatik.de/programmieren/schoner-debuggen-mit-debugmessages-stacktraces-mit-quellttextanzeige/#comments</comments>
		<pubDate>Wed, 24 Mar 2010 11:51:52 +0000</pubDate>
		<dc:creator>zimon</dc:creator>
				<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Ubuntuusers-Planet]]></category>
		<category><![CDATA[Debugging]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[Stacktrace]]></category>

		<guid isPermaLink="false">http://zinformatik.de/?p=1727</guid>
		<description><![CDATA[<p>Das Standardverhalten von Perl beim Auftreten eines Fehlers ist mit der Funktion <code>die</code> zu beenden. Dabei wird neben einer Fehlerursache die Zeilennummer ausgegeben, welche den Fehler verursacht hat<br />
Tritt ein Fehler in einer sehr häufig genutzten Funktion auf (z.B. Umrechnen eines Wertes), so ist es sehr schwer festzustellen, von wo und mit welchen Parametern diese Funktion aufgerufen wurde.</p>
<p>Beispiel:&#8230;</p>]]></description>
			<content:encoded><![CDATA[<p>Das Standardverhalten von Perl beim Auftreten eines Fehlers ist mit der Funktion <code>die</code> zu beenden. Dabei wird neben einer Fehlerursache die Zeilennummer ausgegeben, welche den Fehler verursacht hat<br />
Tritt ein Fehler in einer sehr häufig genutzten Funktion auf (z.B. Umrechnen eines Wertes), so ist es sehr schwer festzustellen, von wo und mit welchen Parametern diese Funktion aufgerufen wurde.</p>
<p>Beispiel:</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/usr/bin/perl</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">use</span> strict<span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> warnings<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">sub</span> divide <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$x</span><span style="color: #339933;">,</span><span style="color: #0000ff;">$y</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">@_</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">return</span> <span style="color: #0000ff;">$x</span><span style="color: #339933;">/</span><span style="color: #0000ff;">$y</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">sub</span> printDivision <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$x</span><span style="color: #339933;">,</span><span style="color: #0000ff;">$y</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">@_</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;$x durch $y = &quot;</span><span style="color: #339933;">.</span>divide<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$x</span><span style="color: #339933;">,</span><span style="color: #0000ff;">$y</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">sub</span> divideList <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$x</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$listReference</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">@list</span> <span style="color: #339933;">=</span> <span style="color: #339933;">@</span><span style="color: #009900;">&#123;</span><span style="color: #0000ff;">$listReference</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">foreach</span> <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$i</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">@list</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        printDivision<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$x</span><span style="color: #339933;">,</span><span style="color: #0000ff;">$i</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
&nbsp;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">@divList1</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">22</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">7</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">16</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">@divList2</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">2</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">5</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">33</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">50</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">7</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">65</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
divideList<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">100</span><span style="color: #339933;">,</span><span style="color: #0000ff;">\@divList1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># do something else ...</span>
&nbsp;
divideList<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">100</span><span style="color: #339933;">,</span><span style="color: #0000ff;">\@divList2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Zugegeben ist dies ein recht künstlich konstruiertes Beispiel, jedoch ist es nicht leicht ein möglichst einfaches und gleichzeitig realistisches Beispiel zu finden. Die Funktion <code>divide</code> dividiert zwei übergebene Zahlen ohne überprüfung, ob durch 0 dividiert wird. <code>printDivision</code> nutzt diese Funktion um das Ergebnis einer Division auszugeben. Die Funktion <code>divideList</code> bekommt eine Zahl und eine Referenz zu einer Liste übergeben, durch die die Zahl jeweils geteilt und das Ergebnis mit der Funktion <code>printList</code> ausgegeben werden soll. Schließlich wird die Funktion <code>divideList</code> erst mit einer Liste ohne 0 und dann mit einer Liste aufgerufen, in der eine 0 vorkommt.</p>
<p>Die Ausgabe des Programms ist:</p>

<div class="wp_syntax"><div class="code"><pre class="plain" style="font-family:monospace;">100 durch 22 = 4.54545454545455
100 durch 7 = 14.2857142857143
100 durch 16 = 6.25
100 durch 2 = 50
100 durch 5 = 20
100 durch 33 = 3.03030303030303
100 durch 50 = 2
Illegal division by zero at ./test.pl line 8.</pre></div></div>

<p>Wenn man die beiden Lisen jetzt nicht direkt so vor Augen hat (weil sie z.B. während des Ablaufs generiert werden), kann man schwer sagen, welcher Funktionsaufruf den Fehler verursacht hat. Man weiß nur, dass der Fehler in Zeile 8 lag. Auch wenn der Fehler abgefangen wird, kommen wir nicht an die Stelle, an der der falsche Parameter ins Spiel gekommen ist.</p>
<p>Ein Stacktrace kann da ein wenig Abhilfe schaffen. Nutzt man das Modul <code>Carp</code>, so kann man die Funktionen <code>warn</code> und <code>die</code> mit <code>carp</code> und <code>croak</code> überschreiben und bekommt nun zusätzlich einen Stacktrace. Dafür werden die beiden folgenden Zeilen an den Anfang des Programms eingefügt:</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">use</span> Carp<span style="color: #339933;">;</span>
<span style="color: #0000ff;">$SIG</span><span style="color: #009900;">&#123;</span><span style="color: #000000; font-weight: bold;">__DIE__</span><span style="color: #009900;">&#125;</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">sub</span> <span style="color: #009900;">&#123;</span>croak <span style="color: #000066;">shift</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Die Ausgabe sieht nun so aus:</p>

<div class="wp_syntax"><div class="code"><pre class="plain" style="font-family:monospace;">100 durch 5 = 20
100 durch 10 = 10
100 durch 33 = 3.03030303030303
100 durch 50 = 2
Illegal division by zero at ./test.pl line 9.
 at ./test_croak.pl line 5
        main::__ANON__('Illegal division by zero at ./test_croak.pl line 9.\x{a}') called at ./test.pl line 9
        main::divide(100, 0) called at ./test.pl line 15
        main::printDivision(100, 0) called at ./test.pl line 22
        main::divideList(100, 'ARRAY(0x87d6d28)') called at ./test.pl line 34</pre></div></div>

<p>Bei einer Warnung kann das Programm zwar noch weiter ausgeführt werden, doch sind die Ergebnisse dann in der Regel falsch (vor allem wenn die Warnung wegen einer nicht initialisierten Variablen auftritt). Daher kann es sinnvoll sein die Funktion <code>warn</code> mit <code>croak</code> zu überschreiben, so dass das Programm auch bei einer Warnung abbricht. </p>
<p>Noch praktischer wäre es natürlich, wenn man nun noch die Elemente der Liste kennen würde, mit deren Referenz die Funktion <code>divideList</code> aufgerufen wurde.</p>
<p>Daher habe ich ein kleines Modul entwickelt (die Grundidee stammt aus einem Perl-Buch), welches noch etwas mehr kann. Das Modul <code>DebugMessages</code> gibt bei einem Fehler einen Stacktrace aus, wobei die aktuellen Parameter des Aufrufs mit ausgegeben werden. Auf Wunsch werden werden auch Inhalte von Listen und Hashes ausgegeben.<br />
Zusätzlich wird der Quelltext mit ausgegeben und zwar ab n Zeilen über der Zeile, die den Fehler erzeugt hat bis n Zeilen danach. (Die Anzahl der Zeilen n kann beliebig gewählt werden). Die Zeile mit dem Fehler wird dabei markiert.</p>
<p>Das Modul kann folgendermaßen eingebunden werden:</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">use</span> lib <span style="color: #ff0000;">&quot;path/to/module&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> DebugMessages exit_on_warning <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span> errors <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">3</span><span style="color: #339933;">,</span> warnings <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">3</span><span style="color: #339933;">,</span> level <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">5</span><span style="color: #339933;">,</span> verbose <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span></pre></div></div>

<p>Die Pfadangabe <code>"path/to/module"</code> muss natürlich auf das Verzeichnis zeigen, in dem die Datei <code>DebugMessages.pm</code> liegt.</p>
<p>Die einzelnen Parameter haben dabei folgende Bedeutung:</p>
<ul>
<li>exit_on_warning: Wenn dieser Parameter 1 ist bricht das Programm schon bei einer Warnung ab. (Default ist 0)</li>
<li>errors: Anzahl der Zeilen, die jeweils vor und nach der Zeile ausgegeben werden sollen, die einen Fehler produziert hat. -1 deaktiviert DebugMessages für Fehler. (Default ist 3)</li>
<li>warnings: Anzahl der Zeilen, die jeweils vor und nach der Zeile ausgegeben werden sollen, die eine Warnung produziert hat. -1 deaktiviert Default für Warnungen. (Default ist 3)</li>
<li>level: Anzahl der Rekursionslevel für den Stacktrace. (Default ist 3)</li>
<li>verbose: 1 zeigt den Inhalt von Listen und Hasheses in kompakter Schreibweise an. 2 Zeigt den Inhalt ausführlich an. 0 deaktiviert das Ausgeben von Listeninhalten.</li>
</ul>
<p>Die Fehlermeldung des obigen Beispiels sieht ist nun sehr ausführlich:</p>

<div class="wp_syntax"><div class="code"><pre class="plain" style="font-family:monospace;">100 durch 22 = 4.54545454545455
100 durch 7 = 14.2857142857143
100 durch 16 = 6.25
100 durch 2 = 50
100 durch 5 = 20
100 durch 33 = 3.03030303030303
100 durch 50 = 2
&nbsp;
Error: Illegal division by zero at ./test.pl line 11.
&nbsp;
   0008:
   0009: sub divide {
   0010:     my ($x,$y) = @_;
 * 0011:     return $x/$y;
   0012: }
   0013:
   0014: sub divideAll {
&nbsp;
-------------------------------------
Verbose output of parameters for call of main::divide
100
0
-------------------------------------
&nbsp;
   main::divide(100,0) called at line 33 in file ./test.pl (package main):
     0030:
     0031: sub printDivision {
     0032:     my ($x,$y) = @_;
   * 0033:     print &quot;$x durch $y = &quot;.divide($x,$y).&quot;\n&quot;;
     0034: }
     0035:
     0036: sub divideList {
&nbsp;
-------------------------------------
Verbose output of parameters for call of main::printDivision
100
0
-------------------------------------
&nbsp;
     main::printDivision(100,0) called at line 41 in file ./test.pl (package main):
       0038:     my $listReference = shift;
       0039:     my @list = @{$listReference};
       0040:     foreach my $i(@list){
     * 0041:         printDivision($x,$i);
       0042:     }
       0043: }  
       0044:
&nbsp;
-------------------------------------
Verbose output of parameters for call of main::divideList
100
0..6  2 5 33 50 0 7 65
-------------------------------------
&nbsp;
       main::divideList(100,ARRAY(0x9ff2528)) called at line 52 in file ./test.pl (package main):
         0049:
         0050: # do something else ...
         0051:  
       * 0052: divideList(100,\@divList2);</pre></div></div>

<p>So kann man den Fehler über alle Funktionsaufrufe zurückverfolgen ohne in den Editor wechseln zu müssen. Man hat ja auch den Kontext des Quellcodes vor Augen. </p>
<p>Zusätzlich wurde noch eine kleine Verschönerung für die Ausgabe von Listen hinzugefügt. Mit eingebundenem Modul kann man Listen folgendermaßen ausgeben:</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #b1b100;">my</span> <span style="color: #0000ff;">@list</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Hallo Welt&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;a&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;b&quot;</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">2</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">3</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;[@list]<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Statt der normalen Ausgabe:</p>

<div class="wp_syntax"><div class="code"><pre class="plain" style="font-family:monospace;">[Hallo Welt a b 1 2 3]</pre></div></div>

<p>bei der man nicht erkennen kann, wie viele Elemente die Liste enthält, bekommt man mit eingebundenem DebugMessages Modul folgende Ausgabe:</p>

<div class="wp_syntax"><div class="code"><pre class="plain" style="font-family:monospace;">[Hallo Welt] [a] [b] [1] [2] [3]</pre></div></div>

<p>Das Modul <code>DebugMessages</code> habe ich bei GitHub hoch geladen. Die Adresse ist: <a href="http://github.com/zimon/DebugMessages" target="_blank" class="liexternal">http://github.com/zimon/DebugMessages</a></p>
]]></content:encoded>
			<wfw:commentRss>http://zinformatik.de/programmieren/schoner-debuggen-mit-debugmessages-stacktraces-mit-quellttextanzeige/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Die Z-Shell (zsh) &#8211; Eine mächtige Alternative zur Bash</title>
		<link>http://zinformatik.de/tipps-tricks/interessante-programme/die-z-shell-zsh-eine-machtige-alternative-zur-bash/</link>
		<comments>http://zinformatik.de/tipps-tricks/interessante-programme/die-z-shell-zsh-eine-machtige-alternative-zur-bash/#comments</comments>
		<pubDate>Mon, 01 Feb 2010 15:44:52 +0000</pubDate>
		<dc:creator>zimon</dc:creator>
				<category><![CDATA[Interessante Programme]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Ubuntuusers-Planet]]></category>
		<category><![CDATA[Bash]]></category>
		<category><![CDATA[Konsole]]></category>
		<category><![CDATA[Shell]]></category>
		<category><![CDATA[zsh]]></category>

		<guid isPermaLink="false">http://zinformatik.de/?p=1668</guid>
		<description><![CDATA[Die Standardshell auf den meisten Linux-Systemen ist die Bash. Sie ist schon sehr mächtig und erlaubt es viele Aufgaben zu automatisieren. Dieser Artikel soll sich einer sehr interessanten weil noch mächtigeren Shell widmen, der Z-Shell kurz zsh.
]]></description>
			<content:encoded><![CDATA[<p>Die Standardshell auf den meisten Linux-Systemen ist die Bash. Sie ist schon sehr mächtig und erlaubt es viele Aufgaben zu automatisieren. Dieser Artikel soll sich einer sehr interessanten weil noch mächtigeren Shell widmen, der Z-Shell kurz zsh.</p>
<p>Die zsh lässt sich auf quasi allen Linuxsystemen über die Paketverwaltung installieren. Unter Ubuntu z.B. mit dem Befehl</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get</span> <span style="color: #c20cb9; font-weight: bold;">install</span> <span style="color: #c20cb9; font-weight: bold;">zsh</span></pre></div></div>

<p>Danach kann man sie mit dem Aufruf von <code>zsh</code> ausführen. Um sie zur Standardshell zu machen genügt der Befehl</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">chsh</span> <span style="color: #660033;">-s</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">zsh</span> username</pre></div></div>

<p>Wobei <code>username</code> durch den entsprechenden Usernamen ersetzt werden muss und der Pfad zu <code>zsh</code> stimmen muss. Auf manchen Systemen liegt <code>zsh</code> in <code>/bin</code>. Wo <code>zsh</code> liegt kann man mit dem folgenden Befehl heraus finden:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">which</span> <span style="color: #c20cb9; font-weight: bold;">zsh</span></pre></div></div>

<p>Die zsh bedient sich Elementen der Bash, der Korn-Shell (ksh) und der TENEX-C-Shell (tcsh &#8211; eine erweiterte C-Shell). Sie ist sehr gut konfigurierbar und fast jedes Verhalten der Bash kann nachgeahmt werden so dass der Umstieg sehr leicht fällt. Bestehende Bash-Scripte können natürlich weiterhin genutzt werden, wenn der Shebang entsprechend gesetzt ist. Also in der ersten Zeile folgendes steht:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/bash</span></pre></div></div>

<p>Im Folgenden werde ich einige interessante Vorteile der zsh kurz beschreiben. Zu einzelnen Themen werde wahrscheinlich in anderen Artikel ausführlicher eingehen. Dies sollen also nur Beispiele sein, die die Mächtigkeit demonstrieren sollen. Da die zsh so viele Möglichkeiten bietet ist es nicht möglich hier alles im Detail zu erläutern. Optionen werden mit dem Befehl <code>setopt</code> gesetzt. Dies kann man auch so in die Konfigurationsdatei <code>~/.zshrc</code> schreiben.</p>
<p><strong>Autokorrektur</strong><br />
Die zsh beherrscht einen Mechanismus, der kleine Tippfehler automatisch korrigiert. Hat man in einem Ordner eine Datei <code>testfile.txt</code> und möchte diese kopieren nach <code>file2.txt</code>, so führt man in der Regel folgenden Befehl aus:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">cp</span> testfile.txt file2.txt</pre></div></div>

<p>wie von der Bash gewohnt nutzt man dafür die Autovervollständigung mittels TAB. Bei einem Verschreiber wird dieser in der zsh automatisch korrigiert. Beispiel:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">cp</span> tsetf<span style="color: #000000; font-weight: bold;">&lt;</span>TAB<span style="color: #000000; font-weight: bold;">&gt;</span></pre></div></div>

<p>wird automatisch korrigiert und zu</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">cp</span> testfile.txt</pre></div></div>

<p>vervollständigt.</p>
<p>Die Autokorrektur aktiviert man mit der Option <code>correct</code></p>
<p><strong>Globale Aliase</strong><br />
Neben den normalen Aliasen für Kommandos, wie man sie aus der Bash kennt, gibt es in der zsh noch globale Aliase, die überall im Befehl genutzt werden können, nicht nur am Anfang. Zwei Beispiele verdeutlichen dies:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">alias</span> <span style="color: #660033;">-g</span> <span style="color: #007800;">G</span>=<span style="color: #ff0000;">'| grep'</span>
<span style="color: #7a0874; font-weight: bold;">alias</span> <span style="color: #660033;">-g</span> <span style="color: #007800;">L</span>=<span style="color: #ff0000;">'| less'</span></pre></div></div>

<p>erzeugt die globalen Aliase G und L die man hinter alle möglichen Befehle schreiben kann um die Ausgabe des entsprechenden Befehls in grep oder less zu pipen. Z.B.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">ls</span> G txt</pre></div></div>

<p>entspricht dem Befehl</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">ls</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> txt</pre></div></div>

<p>oder</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">ps</span> <span style="color: #660033;">-e</span> L</pre></div></div>

<p>entspricht</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">ps</span> <span style="color: #660033;">-e</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">less</span></pre></div></div>

<p>Natürlich ist auch folgendes Möglich:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">ls</span> G txt L</pre></div></div>

<p>was folgendem Befehl entspricht:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">ls</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> txt <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">less</span></pre></div></div>

<p><strong>Suffix Aliase</strong><br />
Mit Suffixaliasen kann man Programme festlegen, mit denen bestimmte Dateitypen (anhand ihrer Endung) geöffnet werden sollen. Man braucht dann nur noch den Namen der Datei eingeben und sie wird mit dem entsprechenden Programm geöffnet. Beispiel:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">alias</span> <span style="color: #660033;">-s</span> <span style="color: #007800;">pdf</span>=evince</pre></div></div>

<p>legt einen Alias für pdf Dateien an. Sie sollen mit evince geöffnet werden. Danach reicht die Eingabe von</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">dokument.pdf</pre></div></div>

<p>und die Datei <code>dokument.pdf</code> wird mit evince geöffnet.</p>
<p><strong>Aliase für Verzeichnisse: Hashes</strong><br />
Mit sogenannten Hashes lassen sich Aliase für beliebige Verzeichnisse anlegen. Auf diese kann dann sehr einfach zugegriffen werden. Mit dem Befehl</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">hash</span> <span style="color: #660033;">-d</span> <span style="color: #007800;">perl</span>=~<span style="color: #000000; font-weight: bold;">/</span>developement<span style="color: #000000; font-weight: bold;">/</span>scripting<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">perl</span></pre></div></div>

<p>legt man einen Hash namens <code>perl</code> für das Verzeichnis <code>~/developement/scripting/perl</code> an. Auf dieses Verzeichnis kann man jetzt mit <code>~perl</code> zugreifen. Auch innerhalb eines Befehls wie folgendes Beispiel zeigt:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">cp</span> testscript.pl ~<span style="color: #c20cb9; font-weight: bold;">perl</span></pre></div></div>

<p>Dieser Befehl kopiert die Datei <code>testscript.pl</code> in das Verzeichnis <code>~/developement/scripting/perl</code>.</p>
<p><strong>Auto-CD</strong><br />
Mit der Option <code>autocd</code> kann man zum Wechseln in ein Verzeichnis einfach den Namen eines Verzeichnisses eingeben und das Kommando <code>cd</code> davor einfach weglassen. Wenn es keinen Befehl gibt, der so heißt wie das Verzeichnis, so wird in das Verzeichnis gewechselt.</p>
<p><strong>Kurze for-Schleifen</strong><br />
Statt einem</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">for</span> i <span style="color: #000000; font-weight: bold;">in</span> <span style="color: #000000; font-weight: bold;">*</span>.eps; <span style="color: #000000; font-weight: bold;">do</span> epstopdf <span style="color: #007800;">$i</span>; <span style="color: #000000; font-weight: bold;">done</span></pre></div></div>

<p>um alle eps-Dateien in einem Verzeichnis in pdf-Dateien umzuwandeln genügt unter zsh die kürzere Form</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">for</span> i <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">*</span>.eps<span style="color: #7a0874; font-weight: bold;">&#41;</span> epstopdf <span style="color: #007800;">$i</span></pre></div></div>

<p><strong>Globale History</strong><br />
Die History, die man mit der Pfeil-auf Taste durchgehen kann, kann man in der zsh so einstellen, dass sie in jeder zsh-Instanz gleich ist. Das heißt man hat nicht mehr für jedes Fenster seine eigene History sondern kann mit der Pfeil-auf Taste auch Befehle raussuchen, die in anderen Fenstern eingegeben wurden. Die History wird jedoch nur nach jedem Befehl geupdated, das heißt man muss ggf. einmal Return drücken, damit die Befehle aus einem anderen Fenster verfügbar sind.</p>
<p>Dieses Verhalten kann mit der Option <code>share_history</code> aktiviert werden.</p>
<p><strong>Directory Stack</strong><br />
Wie Bash, hat die zsh auch einen Directory stack. Mit dem Befehl <code>pushd</code> kann man das aktuelle Verzeichnis auf den Stack legen und mit <code>popd</code> das jeweils letzte Verzeichnis vom Stack nehmen und dorthin springen. Mit der Option <code>auto_pushd</code> legt die zsh automatisch jedes Verzeichnis auf den Directorystack, aus welchem man in ein anderes Verzeichnis wechselt. So hat man immer eine History der Verzeichnisse in denen man war und kann mit <code>popd</code> sehr einfach wieder in Verzeichnisse welchseln, die man vorher besucht hatte.</p>
<p><strong>Globbing</strong><br />
Die Nutzung von Wildcards &#8211; unter zsh globbing genannt &#8211; ist bei der Z-Shell wesentlich mächtiger als in der Bash. Zunächst gibt es rekursives Globbing (gibts in der Bash in neueren Versionen wohl auch). So kann man mit dem Befehl</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">ls</span> <span style="color: #000000; font-weight: bold;">**/*</span>.html</pre></div></div>

<p>alle HTML-Dateien im aktuellen Verzeichnis und allen Unterverzeichnissen auflisten lassen.</p>
<p>Es gibt jedoch auch noch Qualifier um Dateien mit bestimmten Eigenschaften auszuwählen. Diese schreibt man in runde Klammern. So kann man mit <code>.</code> normale Dateien, mit <code>/</code> Verzeichnisse und mit <code>@</code> Symbolische Links matchen. Praktisch ist das z.B. wenn man allen Verzeichnissen ab einem bestimmten Verzeichnis die Rechte 755 und allen Dateien 644 vergeben möchte. Dies kann man mit den folgenden zwei Befehlen bewerkstelligen statt mit <code>find</code> und <code>exec</code> zu arbeiten.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">chmod</span> <span style="color: #000000;">755</span> <span style="color: #000000; font-weight: bold;">**/*</span><span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #c20cb9; font-weight: bold;">chmod</span> <span style="color: #000000;">644</span> <span style="color: #000000; font-weight: bold;">**/*</span><span style="color: #7a0874; font-weight: bold;">&#40;</span>.<span style="color: #7a0874; font-weight: bold;">&#41;</span></pre></div></div>

<p>Zusätzlich gibt es auch Qualifier für verschiedenste Dateirechte. Folgender Befehl listet alle Dateien auf, die von allen beschrieben werden können:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">ls</span> <span style="color: #000000; font-weight: bold;">**/*</span><span style="color: #7a0874; font-weight: bold;">&#40;</span>.W<span style="color: #7a0874; font-weight: bold;">&#41;</span></pre></div></div>

<p>Auch nach der Dateigröße lässt sich suchen:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">print <span style="color: #000000; font-weight: bold;">**/*</span><span style="color: #7a0874; font-weight: bold;">&#40;</span>L0<span style="color: #7a0874; font-weight: bold;">&#41;</span></pre></div></div>

<p>listet alle leeren Dateien auf.</p>
<p>Auch die Sortierung lässt sich beliebig anpassen. Mit dem Befehl:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">print <span style="color: #000000; font-weight: bold;">*</span><span style="color: #7a0874; font-weight: bold;">&#40;</span>oL<span style="color: #7a0874; font-weight: bold;">&#41;</span></pre></div></div>

<p>Listet alle Dateien der Größe nach von klein nach groß auf. Mit großem O wird die Sortierung umgekehrt.</p>
<p>Somit lässt sich mittels globbing in der zsh das Kommando <code>find</code> quasi komplett ersetzen. Die hier gezeigten Beispiele sehen auf den ersten Blick recht kompliziert und kryptisch aus. Wenn man das Prinzip aber einmal verstanden hat und die wichtigsten Qualifier kennt ist es aber ganz einfach und sehr praktisch.</p>
<p>Es gibt noch jede Menge weiterer Qualifier und Möglichkeiten für das Globbing (z.B. nur das erste oder eine bestimmte Anzahl von Elementen auszuwählen), die ich hier gar nicht alle erwähnen kann. Im zsh-Manual gibt es jedoch eine Liste der <a href="http://zsh.sourceforge.net/Doc/Release/Expansion.html#SEC87" title="zsh-Manual - Glob-Qualifier" target="_blank" class="liexternal">Glob-Qualifier</a>.</p>
<p>Um alle Möglichkeiten nutzen zu können sollte die Option <code>extended_glob</code> gesetzt werden.</p>
<p><strong>Vervollständigung</strong><br />
Die zsh hat wie die Bash einen Vervollständigungsmechanismus, so dass man mit der TAB-Taste Kommandos, Dateinamen und vieles mehr vervollständigen kann. In der zsh ist dieser Mechanismus jedoch extrem gut konfigurierbar und programierbar. So kann man z.B. beim <code>scp</code> Befehl (der Dateien über ssh kopiert) die <a href="http://blog.pimpmyshell.de/2007/01/21/ssh-completion-mit-zsh/" title="ssh completion mit zsh" target="_blank" class="liexternal">Verzeichnisse auf dem entfernten Rechner vervollständigen</a> und genau definieren welche Programme mit welchen Dateitypen zusammen arbeiten können. Für sehr viele Programme ist dies schon vorgefertigt, so dass ein</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">latex doku<span style="color: #000000; font-weight: bold;">&lt;</span>TAB<span style="color: #000000; font-weight: bold;">&gt;</span></pre></div></div>

<p>automatisch zu</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"> latex dokument.tex</pre></div></div>

<p>vervollständigt wird. Dies beherrscht die Bash zum Teil auch. Jedoch ist es in der zsh wesentlich besser konfigurierbar und anpassbar.</p>
<p>Sehr praktisch finde ich auch die Menüfunktion. So wird beim ersten Druck auf die TAB-Taste wie in der Bash soweit vervollständigt, bis nicht mehr entschieden werden kann welche Datei (bzw. welcher Befehl) gemeint ist. Ein weiterer Druck auf die TAB-Taste listet alle weiteren Möglichkeiten auf und jeder weitere Druck geht diese Möglichkeiten durch. Wenn ich also drei Dateien habe: <code>test.txt</code>, <code>testfile1.txt</code> und <code>testfile2.txt</code> und gebe folgendes ein:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">ls</span> te<span style="color: #000000; font-weight: bold;">&lt;</span>TAB<span style="color: #000000; font-weight: bold;">&gt;</span></pre></div></div>

<p>so wird zuerst auf <code>test</code> vervollständigt. Ein weiterer Druck gibt mir alle Möglichkeiten aus:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">testfile1.txt  testfile2.txt  test.txt</pre></div></div>

<p>und ein dritter Druck auf die Tab-Taste vervollständigt den Befehl zu</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">ls</span> testfile1.txt</pre></div></div>

<p>Das ist viel schneller als erst ein <code>f</code> einzugeben um erneut TAB zu drücken und dann die <code>1</code> einzugeben um wiederum TAB zu drücken bis der Dateiname endgültig vervollständigt wird.</p>
<p>Ein weiterer Druck auf TAB nimmt dann die nächste Möglichkeit. In diesem Beispiel also</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">ls</span> testfile2.txt</pre></div></div>

<p>und so weiter.</p>
<p><strong>Expansion</strong><br />
Mit der TAB-Taste kann man in der zsh nicht nur Kommandos, Dateinamen, &#8230; vervollständigen, sondern auch Variablen expandieren. Viele kennen ja die spezielle Variable <code>!!</code>, die den zuletzt ausgeführten Befehl enthält. In der zsh kann man nun folgendes eingeben:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">!!&lt;</span>TAB<span style="color: #000000; font-weight: bold;">&gt;</span></pre></div></div>

<p>und die Variable <code>!!</code> wird automatisch zum zuletzt ausgeführten Befehl expandiert. Genauso kann man auch jede andere Variable expandieren:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #007800;">$PWD</span><span style="color: #000000; font-weight: bold;">&lt;</span>TAB<span style="color: #000000; font-weight: bold;">&gt;</span></pre></div></div>

<p>wird zu <code>/home/zimon/developement</code> (vorrausgesetzt ich befinde mich zum Zeitpunkt der expansion in diesem Verzeichnis).</p>
<p><strong>History Kontrolle</strong><br />
Wie bei der Bash auch, kann man in der zsh die History durchsuchen. Die zsh geht jedoch so weit, dass man auch nach bestimmten Parametern suchen kann. Ein Beispiel:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">cp</span> ..<span style="color: #000000; font-weight: bold;">/</span>perl<span style="color: #000000; font-weight: bold;">/</span>foo.pl ~<span style="color: #000000; font-weight: bold;">/</span>developement<span style="color: #000000; font-weight: bold;">/</span>projektordner</pre></div></div>

<p>Danach kommen ein paar andere Kommandos. Möchte nun eine andere Datei in den gleichen Projektordner kopieren reicht folgende Eingabe:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">cp</span> ..<span style="color: #000000; font-weight: bold;">/</span>perl<span style="color: #000000; font-weight: bold;">/</span>bar.pl <span style="color: #000000; font-weight: bold;">!</span>?proj?:<span style="color: #000000;">3</span></pre></div></div>

<p>Mit !? wird nach einem vorherigen Befehl gesucht. Das <code>proj</code> ist ein String der in diesem Befehl vorkam. Mit dem <code>?:3</code> wird das dritte Argument genutzt. Durch die Expansion kann manmit durch einen Druck auf TAB diesen Ausdruck auch noch expandieren um sicher zu gehen, dass das richtige Argument ausgewählt wurde. Man kann zwar mit Alt+. wie in der Bash die jeweils letzten Argumente durchgehen, auf diese Weise kann man aber auch das zweite von drei Argumenten suchen.</p>
<p>Es gibt noch wesentlich mehr Möglichkeiten die History zu durchsuchen und zu verwenden.</p>
<p><strong>Hochkonfigurierbarer Prompt</strong><br />
In der Z-Shell kann man nicht nur die linke Seite des Prompts sondern auch die rechte Seite konfigurieren. Als Beispiel hier mal mein aktueller Prompt:</p>
<div id="attachment_1679" class="wp-caption aligncenter" style="width: 643px"><a href="http://zinformatik.de/wp-content/uploads/2010/01/zsh_prompt.png" class="liimagelink"><img class="size-full wp-image-1679" title="zsh Prompt" src="http://zinformatik.de/wp-content/uploads/2010/01/zsh_prompt.png" alt="zsh Prompt" width="633" height="37" /></a><p class="wp-caption-text">Mein aktueller zsh-Prompt</p></div>
<p>Ich finde die Anzeige der Uhrzeit inklusive Sekunden recht praktisch, da man daran sieht wie lange ein Befehl gedauert hat oder wann man ihn ausgeführt hat. Es gibt jedoch auch die Möglichkeit automatisch die Ausgabe von <code>time</code> bei der Beendigung eines Befehls ausgeben zu lassen, der länger als eine vorher definierte Zeit benötigt hat.</p>
<p>Der Prompt ist eine abgeänderte Version von <a href="http://aperiodic.net/phil/prompt/" title="Phil!s ZSH Prompt" target="_blank" class="liexternal">Phil!s ZSH Prompt</a>.</p>
<p><strong>[UPDATE]</strong> Auf Anfrage hin ist hier noch der Code für die von mir abgeänderte Version des Prompts:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">setprompt <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">&#123;</span>
    <span style="color: #666666; font-style: italic;">###</span>
    <span style="color: #666666; font-style: italic;"># Need this so the prompt will work.</span>
&nbsp;
    setopt prompt_subst
&nbsp;
&nbsp;
    <span style="color: #666666; font-style: italic;">###</span>
    <span style="color: #666666; font-style: italic;"># See if we can use colors.</span>
&nbsp;
    autoload colors zsh<span style="color: #000000; font-weight: bold;">/</span>terminfo
    <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$terminfo</span>[colors]&quot;</span> <span style="color: #660033;">-ge</span> <span style="color: #000000;">8</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
	colors
    <span style="color: #000000; font-weight: bold;">fi</span>
    <span style="color: #000000; font-weight: bold;">for</span> color <span style="color: #000000; font-weight: bold;">in</span> RED GREEN YELLOW BLUE MAGENTA CYAN WHITE; <span style="color: #000000; font-weight: bold;">do</span>
	<span style="color: #7a0874; font-weight: bold;">eval</span> PR_<span style="color: #007800;">$color</span>=<span style="color: #ff0000;">'%{$terminfo[bold]$fg[${(L)color}]%}'</span>
	<span style="color: #7a0874; font-weight: bold;">eval</span> PR_LIGHT_<span style="color: #007800;">$color</span>=<span style="color: #ff0000;">'%{$fg[${(L)color}]%}'</span>
	<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#40;</span> count = <span style="color: #007800;">$count</span> + <span style="color: #000000;">1</span> <span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
    <span style="color: #000000; font-weight: bold;">done</span>
    <span style="color: #007800;">PR_NO_COLOUR</span>=<span style="color: #ff0000;">&quot;%{<span style="color: #007800;">$terminfo</span>[sgr0]%}&quot;</span>
&nbsp;
&nbsp;
    <span style="color: #666666; font-style: italic;">###</span>
    <span style="color: #666666; font-style: italic;"># See if we can use extended characters to look nicer.</span>
&nbsp;
    <span style="color: #7a0874; font-weight: bold;">typeset</span> <span style="color: #660033;">-A</span> altchar
    <span style="color: #000000; font-weight: bold;">set</span> <span style="color: #660033;">-A</span> altchar <span style="color: #800000;">${(s..)terminfo[acsc]}</span>
    <span style="color: #007800;">PR_SET_CHARSET</span>=<span style="color: #ff0000;">&quot;%{<span style="color: #007800;">$terminfo</span>[enacs]%}&quot;</span>
    <span style="color: #007800;">PR_SHIFT_IN</span>=<span style="color: #ff0000;">&quot;%{<span style="color: #007800;">$terminfo</span>[smacs]%}&quot;</span>
    <span style="color: #007800;">PR_SHIFT_OUT</span>=<span style="color: #ff0000;">&quot;%{<span style="color: #007800;">$terminfo</span>[rmacs]%}&quot;</span>
    <span style="color: #007800;">PR_HBAR</span>=<span style="color: #800000;">${altchar[q]:--}</span>
    <span style="color: #007800;">PR_ULCORNER</span>=<span style="color: #800000;">${altchar[l]:--}</span>
    <span style="color: #007800;">PR_LLCORNER</span>=<span style="color: #800000;">${altchar[m]:--}</span>
    <span style="color: #007800;">PR_LRCORNER</span>=<span style="color: #800000;">${altchar[j]:--}</span>
    <span style="color: #007800;">PR_URCORNER</span>=<span style="color: #800000;">${altchar[k]:--}</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$TERM</span>&quot;</span> == <span style="color: #ff0000;">&quot;screen&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
	<span style="color: #007800;">PR_HBAR</span>=-
     	<span style="color: #007800;">PR_ULCORNER</span>=--
    	<span style="color: #007800;">PR_LLCORNER</span>=--
    	<span style="color: #007800;">PR_LRCORNER</span>=--
    	<span style="color: #007800;">PR_URCORNER</span>=-
   <span style="color: #000000; font-weight: bold;">fi</span> 
&nbsp;
&nbsp;
    <span style="color: #666666; font-style: italic;">###</span>
    <span style="color: #666666; font-style: italic;"># Decide if we need to set titlebar text.</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">case</span> <span style="color: #007800;">$TERM</span> <span style="color: #000000; font-weight: bold;">in</span>
	xterm<span style="color: #000000; font-weight: bold;">*</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
	    <span style="color: #007800;">PR_TITLEBAR</span>=$<span style="color: #ff0000;">'%{\e]0;%(!.-=*[ROOT]*=- | .)%n@%m:%~ | ${COLUMNS}x${LINES} | %y\a%}'</span>
	    <span style="color: #000000; font-weight: bold;">;;</span>
	<span style="color: #c20cb9; font-weight: bold;">screen</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
	    <span style="color: #007800;">PR_TITLEBAR</span>=$<span style="color: #ff0000;">'%{\e_screen \005 (\005t) | %(!.-=[ROOT]=- | .)%n@%m:%~ | ${COLUMNS}x${LINES} | %y\e\\%}'</span>
	    <span style="color: #000000; font-weight: bold;">;;</span>
	<span style="color: #000000; font-weight: bold;">*</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
	    <span style="color: #007800;">PR_TITLEBAR</span>=<span style="color: #ff0000;">''</span>
	    <span style="color: #000000; font-weight: bold;">;;</span>
    <span style="color: #000000; font-weight: bold;">esac</span>
&nbsp;
&nbsp;
    <span style="color: #666666; font-style: italic;">###</span>
    <span style="color: #666666; font-style: italic;"># Decide whether to set a screen title</span>
    <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$TERM</span>&quot;</span> == <span style="color: #ff0000;">&quot;screen&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
        <span style="color: #007800;">PR_STITLE</span>=$<span style="color: #ff0000;">'%{\ekzsh\e\\%}'</span>
    <span style="color: #000000; font-weight: bold;">else</span>
        <span style="color: #007800;">PR_STITLE</span>=<span style="color: #ff0000;">''</span>
    <span style="color: #000000; font-weight: bold;">fi</span>
&nbsp;
&nbsp;
    <span style="color: #666666; font-style: italic;">###</span>
    <span style="color: #666666; font-style: italic;"># Finally, the prompt.</span>
&nbsp;
    <span style="color: #007800;">PROMPT</span>=<span style="color: #ff0000;">'$PR_SET_CHARSET$PR_STITLE${(e)PR_TITLEBAR}\
$PR_RED$PR_SHIFT_IN$PR_ULCORNER$PR_BLUE$PR_HBAR$PR_SHIFT_OUT(\
$PR_GREEN%(!.%SROOT%s.%n)$PR_GREEN@%m:%l\
$PR_BLUE)$PR_SHIFT_IN$PR_HBAR$PR_RED$PR_HBAR${(e)PR_FILLBAR}$PR_BLUE$PR_HBAR$PR_SHIFT_OUT(\
$PR_MAGENTA%$PR_PWDLEN&lt;...&lt;%~%&lt;&lt;\
$PR_BLUE)$PR_SHIFT_IN$PR_HBAR$PR_RED$PR_URCORNER$PR_SHIFT_OUT\
&nbsp;
$PR_RED$PR_SHIFT_IN$PR_LLCORNER$PR_BLUE$PR_HBAR$PR_SHIFT_OUT(\
%(?..$PR_LIGHT_RED%?$PR_BLUE:)\
${(e)PR_APM}$PR_YELLOW%D{%H:%M:%S}\
$PR_BLUE)$PR_SHIFT_IN$PR_HBAR$PR_SHIFT_OUT\
$PR_RED$PR_SHIFT_IN$PR_HBAR$PR_SHIFT_OUT\
$PR_NO_COLOUR '</span>
&nbsp;
    <span style="color: #007800;">RPROMPT</span>=<span style="color: #ff0000;">' $PR_RED$PR_SHIFT_IN$PR_HBAR$PR_BLUE$PR_HBAR$PR_SHIFT_OUT\
($PR_YELLOW%D{%a,%b%d}$PR_BLUE)$PR_SHIFT_IN$PR_HBAR$PR_RED$PR_LRCORNER$PR_SHIFT_OUT$PR_NO_COLOUR'</span>
&nbsp;
    <span style="color: #007800;">PS2</span>=<span style="color: #ff0000;">'$PR_RED$PR_SHIFT_IN$PR_HBAR$PR_SHIFT_OUT\
$PR_BLUE$PR_SHIFT_IN$PR_HBAR$PR_SHIFT_OUT(\
$PR_LIGHT_GREEN%_$PR_BLUE)$PR_SHIFT_IN$PR_HBAR$PR_SHIFT_OUT\
$PR_RED$PR_SHIFT_IN$PR_HBAR$PR_SHIFT_OUT$PR_NO_COLOUR '</span>
&nbsp;
<span style="color: #7a0874; font-weight: bold;">&#125;</span>
&nbsp;
setprompt</pre></div></div>

<p><strong>[/UPDATE]</strong></p>
<p><strong>ZLE-Widgets</strong><br />
Der Z-Line-Editor (ZLE) ist quasi die Eingabezeile in der zsh. Dafür kann man sich kleine Programme schreiben, die einem das Leben vereinfachen. Ein Beispiel wäre ein Programm, dass bei der Eingabe von <code>...</code> diese zu <code>../..</code> umwandelt. Jeder weitere Punkt wird wieder umgewandelt. So kann man recht einfach folgendes eingeben:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">cd</span> ....<span style="color: #000000; font-weight: bold;">/</span>directory</pre></div></div>

<p>Auf dem Bildschirm erscheint jedoch folgendes:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">cd</span> ..<span style="color: #000000; font-weight: bold;">/</span>..<span style="color: #000000; font-weight: bold;">/</span>..<span style="color: #000000; font-weight: bold;">/</span>directory</pre></div></div>

<p>Dieses Widget ist kein Standard bei der Z-Shell. Man kann es aber durch folgenden Code in der Konfigurationsdatei <code>~/.zshrc</code> erzeugen:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">rationalise-dot<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$LBUFFER</span> = <span style="color: #000000; font-weight: bold;">*</span>.. <span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
        LBUFFER+=<span style="color: #000000; font-weight: bold;">/</span>..
    <span style="color: #000000; font-weight: bold;">else</span>
        LBUFFER+=.
            <span style="color: #000000; font-weight: bold;">fi</span>
<span style="color: #7a0874; font-weight: bold;">&#125;</span>
zle <span style="color: #660033;">-N</span> rationalise-dot
bindkey . rationalise-dot</pre></div></div>

<p><strong>Automatisches tee-ing</strong><br />
In der Z-Shell kann man die Ausgabe eines Kommandos recht einfach in mehrere verschiedene Dateien umleiten. Statt wie in der Bash</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">ls</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">tee</span> <span style="color: #660033;">-a</span> all <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">tee</span> actual</pre></div></div>

<p>zu schreiben, kann man in der zsh einfach</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">ls</span> <span style="color: #000000; font-weight: bold;">&gt;&gt;</span>all <span style="color: #000000; font-weight: bold;">&gt;</span>actual</pre></div></div>

<p>eingeben. Beide Befehle führen ls aus und hängen die Ausgabe an die Datei <code>all</code> an und schreiben sie in die Datei <code>actual</code> wobei der inhalt jeweils überschrieben wird.<br />
Möchte man die Ausgabe wie beim original <code>tee</code> Befehl auch auf dem Bildschirm sehen, so leitet man sie auch noch auf STDOUT um:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">ls</span> <span style="color: #000000; font-weight: bold;">&gt;&gt;</span>all <span style="color: #000000; font-weight: bold;">&gt;</span>actual <span style="color: #000000; font-weight: bold;">&gt;&amp;</span><span style="color: #000000;">1</span></pre></div></div>

<p><strong>Verzeichnisse durch Ersetzung wechseln</strong><br />
Ein Beispiel sollte dies am besten Erklären. Man nehme an man hat zwei Verzeichnisse: <code>~/developement/scripting/perl/modules</code> und <code>~/developement/scripting/python/modules</code> und man befindet sich in <code>~/developement/scripting/perl/modules</code>, so kann man durch den Befehl</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #c20cb9; font-weight: bold;">perl</span> python</pre></div></div>

<p>in das Verzeichnis <code>~/developement/scripting/python/modules</code> wechseln. Bei einem <code>cd</code> Kommando mit zwei Parametern wird im aktuellen Verzeichnis-String das erste Wort durch das zweite ersetzt. Hier also <code>perl</code> durch <code>python</code>.</p>
<p><strong>Fazit</strong><br />
Ich bin jetzt nicht 100% sicher, dass alles hier beschriebene nicht auch in der Bash möglich ist. Es zeigt aber auf jeden Fall, dass die Z-Shell jede Menge interessante Möglichkeiten bietet und man viele Dinge einfacher und schneller erledigen kann als in der Bash. Die oben gezeigten Features sind meist nur angerissen und nur eine kleine Auswahl von dem was die Z-Shell bietet. Darüber hinaus besitzt die Z-Shell eine ganze Reihe Module z.B. für Matheoperationen oder einen eigenen FTP-Client, die man bei Bedarf laden kann.</p>
<p>Sehr schön ist auch die Möglichkeit den <a href="http://zinformatik.de/linux/titel-von-screen-fenstern-automatisch-von-vim-bash-und-zsh-setzen/" title="Titel von Screen Fenstern automatisch von vim, Bash und zsh setzen" target="_self" class="liinternal">Screen-Title von der zsh aus zu setzen</a>.</p>
<p>Es lohnt sich auf jeden Fall, diese Shell etwas genauer zu betrachten. Bei mir hat sie mittlerweile die Bash fast vollständig ersetzt (vorhandene Scripte habe ich nicht umgeschrieben).</p>
<p><strong>Links</strong></p>
<ul>
<li><a href="http://zsh.sourceforge.net/" title="Offizielle zsh Projektseite" target="_blank" class="liexternal">Offizielle zsh Projektseite</a> (englisch)</li>
<li><a href="http://zsh.sourceforge.net/Doc/Release/zsh_toc.html" title="zsh Manual" target="_blank" class="liexternal">zsh Manual</a> (englisch)</li>
<li><a href="http://zsh.sourceforge.net/Guide/zshguide.html" title="zsh Users Guide" target="_blank" class="liexternal">zsh User&#8217;s Guide</a> (englisch)</li>
<li><a href="http://michael-prokop.at/computer/tools_zsh.html" title="zsh generell" target="_blank" class="liexternal">Michael Prokops zsh Seite</a> &#8211; Seite mit Features und Beispielen wo zsh mit Bash verglichen wird</li>
<li><a href="http://michael-prokop.at/computer/tools_zsh_liebhaber.html" title="zsh liebhaber" target="_blank" class="liexternal">Michael Prokops zsh Liebhaberseite</a> &#8211; Viele gute Beispiele und zsh Tricks angelehnt an das zsh-lovers Projekt.</li>
<li><a href="http://zshwiki.org" title="zsh wiki" target="_blank" class="liexternal">zsh wiki</a> &#8211; Wiki über zsh (englisch)</li>
<li><a href="http://grml.org/zsh/zsh-lovers.html" title="zsh-lovers" target="_blank" class="liexternal">zsh-lovers</a> &#8211; Sammlung von Tipps, Tricks und Beispielen (englisch)</li>
<li><a href="http://grml.org/zsh/" target="_blank" class="liexternal">grml zsh Seite</a> &#8211; Seite mit sehr großer zsh-Konfigurationsdatei, Referenzkarte und anderen zsh Infos. Die grml-Linuxdistribution hat zsh als Standardshell. (englisch)</li>
<li><a href="http://www.strcat.de/zsh/" title="stcats zsh Page" target="_blank" class="liexternal">strcat.de/zsh/</a> &#8211; Seite mit Auflistung vieler Features und Tipps (englisch)</li>
<li><a href="http://rayninfo.co.uk/tips/zshtips.html" title="Best of zsh Tips" target="_blank" class="liexternal">Zzappers Best of ZSH Tips</a> &#8211; Viele zsh Tipps (englisch)</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://zinformatik.de/tipps-tricks/interessante-programme/die-z-shell-zsh-eine-machtige-alternative-zur-bash/feed/</wfw:commentRss>
		<slash:comments>30</slash:comments>
		</item>
		<item>
		<title>Gimp 2.7 mit Single-Window-Mode installieren</title>
		<link>http://zinformatik.de/tipps-tricks/interessante-programme/gimp-2-7-mit-single-window-mode-installieren/</link>
		<comments>http://zinformatik.de/tipps-tricks/interessante-programme/gimp-2-7-mit-single-window-mode-installieren/#comments</comments>
		<pubDate>Mon, 21 Dec 2009 17:33:11 +0000</pubDate>
		<dc:creator>zimon</dc:creator>
				<category><![CDATA[Interessante Programme]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Ubuntuusers-Planet]]></category>
		<category><![CDATA[Gimp]]></category>
		<category><![CDATA[Single-Window-Mode]]></category>

		<guid isPermaLink="false">http://zinformatik.de/?p=1644</guid>
		<description><![CDATA[<p>Ab der nächsten Version von Gimp (2.8) gibt es endlich auch die Möglichkeit des Einfenster-Betriebs. <div id="attachment_1645" class="wp-caption alignright" style="width: 310px"><a href="http://zinformatik.de/wp-content/uploads/2009/12/gimp_screen.png" class="liimagelink"><img class="size-medium wp-image-1645" title="gimp_screenshot" src="http://zinformatik.de/wp-content/uploads/2009/12/gimp_screen-300x215.png" alt="Screenshot des Single-Window Modus von Gimp 2.7" width="300" height="215" /></a><p class="wp-caption-text">Screenshot des Single-Window Modus von Gimp 2.7</p></div><br />
Im Moment gibt es in Gimp je ein Fenster für jedes geöffnete Bild und zusätzlich ein Fenster mit den Werkzeugen (Werkzeugkasten) sowie bei Bedarf auch Dialogfenster für Ebenen, Pfade, &#8230; Der Umgang mit&#8230;</p>]]></description>
			<content:encoded><![CDATA[<p>Ab der nächsten Version von Gimp (2.8) gibt es endlich auch die Möglichkeit des Einfenster-Betriebs. <div id="attachment_1645" class="wp-caption alignright" style="width: 310px"><a href="http://zinformatik.de/wp-content/uploads/2009/12/gimp_screen.png" class="liimagelink"><img class="size-medium wp-image-1645" title="gimp_screenshot" src="http://zinformatik.de/wp-content/uploads/2009/12/gimp_screen-300x215.png" alt="Screenshot des Single-Window Modus von Gimp 2.7" width="300" height="215" /></a><p class="wp-caption-text">Screenshot des Single-Window Modus von Gimp 2.7</p></div><br />
Im Moment gibt es in Gimp je ein Fenster für jedes geöffnete Bild und zusätzlich ein Fenster mit den Werkzeugen (Werkzeugkasten) sowie bei Bedarf auch Dialogfenster für Ebenen, Pfade, &#8230; Der Umgang mit so vielen Fenstern ist auf kleinen Bildschirmen recht umständlich, da oft ein Fenster im Weg steht und man es zuerst weg schieben muss. Daher freuen sich schon viele Nutzer auf den Einfenster Modus, bei dem Bilder als Tabs angezeigt werden und die restlichen Fenster links und rechts neben dem Bild angeordnet werden. Dialogfenster können jedoch immer noch heraus gezogen und als eigenes Fenster angezeigt werden.</p>
<p>Es gibt jedoch auch Beführworter des Multi-Window Modus, da man mehrere Fenster leichter auf verschiedene Bildschirme verteilen kann.</p>
<p>Ich habe mir mal die Entwicklerversion (2.7) installiert und (vor allem den Single-Window Modus <img src='http://zinformatik.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  ) angesehen.</p>
<p><strong>Installation</strong></p>
<p>Zuerst müssend die <code>build-utils</code>, <code>git</code> sowie einige Abhängigkeiten installiert werden. Unter Ubuntu kann man dies mit dem folgenden Befehl erreichen:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get</span> build-dep <span style="color: #c20cb9; font-weight: bold;">gimp</span> libtool ruby git-core git-doc git-email</pre></div></div>

<p>Als nächstes wird git konfiguriert. Dafür die folgenden beiden Befehle ausführen, wobei beim ersten Befehl der Name eingegeben wird und beim zweiten die Emailadresse:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">git</span> config <span style="color: #660033;">--global</span> user.name <span style="color: #ff0000;">&quot;Your Name&quot;</span>
<span style="color: #c20cb9; font-weight: bold;">git</span> config <span style="color: #660033;">--global</span> user.email you<span style="color: #000000; font-weight: bold;">@</span>host</pre></div></div>

<p>Nun werden die aktuellen Entwickerversionen von babl, gegl und gimp ausgecheckt:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">git</span> clone <span style="color: #c20cb9; font-weight: bold;">git</span>:<span style="color: #000000; font-weight: bold;">//</span>git.gnome.org<span style="color: #000000; font-weight: bold;">/</span>babl
<span style="color: #c20cb9; font-weight: bold;">git</span> clone <span style="color: #c20cb9; font-weight: bold;">git</span>:<span style="color: #000000; font-weight: bold;">//</span>git.gnome.org<span style="color: #000000; font-weight: bold;">/</span>gegl
<span style="color: #c20cb9; font-weight: bold;">git</span> clone <span style="color: #c20cb9; font-weight: bold;">git</span>:<span style="color: #000000; font-weight: bold;">//</span>git.gnome.org<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">gimp</span></pre></div></div>

<p>Um eine bereits installiertes Gimp weiter benutzen zu können, wird die Entwicklerversion in das Verzeichnis <code>/usr/local/gimp-git</code> installiert.<br />
Dafür wird dieses Verzeichnis angelegt und dort ein Verzeichnis share erstellt. Nun legt man die Datei <code>/usr/local/gimp-git/share/config.site</code> mit folgendem Inhalt an:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">PKG_CONFIG_PATH</span>=<span style="color: #ff0000;">&quot;/usr/local/gimp-git/lib/pkgconfig:<span style="color: #007800;">$PKG_CONFIG_PATH</span>&quot;</span>
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">LD_LIBRARY_PATH</span>=<span style="color: #ff0000;">&quot;/usr/local/gimp-git/lib:<span style="color: #007800;">$LD_LIBRARY_PATH</span>&quot;</span></pre></div></div>

<p>Wenn es Probleme gibt, dass die neueste babl-Version nicht gefunden werden kann, können die beiden Befehle auch nochmal in der aktuellen Shell ausgeführt werden.</p>
<p>Die Leserechte müssen auch noch entsprechend gesetzt werden:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">chmod</span> <span style="color: #660033;">-R</span> oug+rx <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>gimp-git
<span style="color: #c20cb9; font-weight: bold;">chmod</span> oug-x <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>gimp-git<span style="color: #000000; font-weight: bold;">/</span>share<span style="color: #000000; font-weight: bold;">/</span>config.site</pre></div></div>

<p>Nun werden babl, gegl und schließlich gimp selbst kompiliert und installiert:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">cd</span> babl
.<span style="color: #000000; font-weight: bold;">/</span>autogen.sh <span style="color: #660033;">--prefix</span>=<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>gimp-git
<span style="color: #c20cb9; font-weight: bold;">make</span>
<span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #c20cb9; font-weight: bold;">install</span>
&nbsp;
<span style="color: #7a0874; font-weight: bold;">cd</span> ..<span style="color: #000000; font-weight: bold;">/</span>gegl
.<span style="color: #000000; font-weight: bold;">/</span>autogen.sh <span style="color: #660033;">--prefix</span>=<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>gimp-git
<span style="color: #c20cb9; font-weight: bold;">make</span>
<span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #c20cb9; font-weight: bold;">install</span>
&nbsp;
<span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #c20cb9; font-weight: bold;">gimp</span>
.<span style="color: #000000; font-weight: bold;">/</span>autogen.sh <span style="color: #660033;">--prefix</span>=<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>gimp-git <span style="color: #660033;">--disable-gtk-doc</span>
<span style="color: #c20cb9; font-weight: bold;">make</span>
<span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #c20cb9; font-weight: bold;">install</span></pre></div></div>

<p>Nun kann man gimp-2.7 mit folgendem Befehl starten:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>gimp-git<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>gimp-<span style="color: #000000;">2.7</span></pre></div></div>

<p>Ein Alias in der <code>~/.bashrc</code> erleichtert den Aufruf:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">alias</span> gimp-git=<span style="color: #ff0000;">'/usr/local/gimp-git/bin/gimp-2.7'</span></pre></div></div>

<p><b>Single-Window-Mode</b></p>
<p>Nachdem ich alle Menüs in den Einstellungen durchforstet habe und auch in einige Konfigurationsdateien geschaut habe, habe ich die Funktion für den Single-Window-Mode schließlich unter dem Menüpunkt &#8220;Fenster&#8221; gefunden.</p>
<p>Es sieht schon ziemlich schick aus. Auch wenn viele Kleinigkeiten noch nicht so richtig Funktionieren. Wenn die Dialoge an der Seite sind, reagieren sie manchmal nicht (oder nur teilweise). Abhilfe schaft auch manchmal den Modus wieder zurück zu wechseln und erneut in den Single-Window Modus zu wechseln. Versucht man einen Dialog unter den Werkzeugkasten (oder an eine andere Stelle an der Seite) zu platzieren, stürzt das ganze Programm mit einem segmentation fault ab. </p>
<p>Im Moment ist es noch sehr emfehlenswert, bei der Version 2.6 zu bleiben und die Entwicklerversion nur zum Ausprobieren zu nutzen. Dies gilt besonders für den Single-Window Modus, da dieser noch nicht sehr stabil läuft. Das wird sich aber sicherlich in der nächsten Zeit noch ändern.</p>
<p><strong>[UPDATE]</strong>Mittlerweile funktioniert der Single-Window Modus recht gut und stabil, so dass man ihn nun verwenden kann. Man sollte jedoch im Hinterkopf behalten, dass sich das Programm noch im Entwicklungsstadium befindet und Fehler auftreten können.</p>
<p>Übrigens soll Gimp 2.8 frühestens Ende des Jahres (2010) erscheinen, wie man der <a href="http://www.mail-archive.com/gimp-developer@lists.xcf.berkeley.edu/msg19390.html" target="_blank" title="Gimp 2.8 Schedule" class="liexternal">Developer-Mailingliste</a> entnehmen kann.<strong>[/UPDATE]</strong></p>
<p>Den Screenshot in voller Auflösung habe ich <a href="http://zinformatik.de/gimp_screen_big.png" class="liinternal">hier</a> verlinkt (am besten in einem nuen Tab oder Fenster öffnen).</p>
]]></content:encoded>
			<wfw:commentRss>http://zinformatik.de/tipps-tricks/interessante-programme/gimp-2-7-mit-single-window-mode-installieren/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Erinnerungen mit at und zenity</title>
		<link>http://zinformatik.de/linux/erinnerungen-mit-at-und-zenity/</link>
		<comments>http://zinformatik.de/linux/erinnerungen-mit-at-und-zenity/#comments</comments>
		<pubDate>Fri, 11 Dec 2009 17:59:53 +0000</pubDate>
		<dc:creator>zimon</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Tipps und Tricks]]></category>
		<category><![CDATA[Ubuntuusers-Planet]]></category>
		<category><![CDATA[at]]></category>
		<category><![CDATA[Bash]]></category>
		<category><![CDATA[Erinnerung]]></category>
		<category><![CDATA[Konsole]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[zenity]]></category>

		<guid isPermaLink="false">http://zinformatik.de/?p=1619</guid>
		<description><![CDATA[<p>Wenn man am PC sitzt vergisst man schnell die Zeit. Wenn man noch etwas erledigen muss wäre es daher vorteilhaft, wenn man daran erinnert werden würde. </p>
<p>Ein solches &#8220;Erinnerungsprogramm&#8221; kann man sich recht leicht selber basteln. Ich habe dafür  das Linuxtool <code>at</code> mit dem Programm <a href="http://wiki.ubuntuusers.de/Zenity" target="_blank" title="zenity - Darstellung von Dialogen" class="liuu"><code>zenity</code></a>, welches Dialoge darstellen kann, kombiniert.&#8230;</p>]]></description>
			<content:encoded><![CDATA[<p>Wenn man am PC sitzt vergisst man schnell die Zeit. Wenn man noch etwas erledigen muss wäre es daher vorteilhaft, wenn man daran erinnert werden würde. </p>
<p>Ein solches &#8220;Erinnerungsprogramm&#8221; kann man sich recht leicht selber basteln. Ich habe dafür  das Linuxtool <code>at</code> mit dem Programm <a href="http://wiki.ubuntuusers.de/Zenity" target="_blank" title="zenity - Darstellung von Dialogen" class="liuu"><code>zenity</code></a>, welches Dialoge darstellen kann, kombiniert.</p>
<p><code>at</code> (bzw. der at-Daemon <code>atd</code>) ist auf den meisten Linuxdistributionen bereits vorhanden, kann sonst aber auch über die Paketverwaltung installiert werden. Zenity sollte bei den meisten Distributionen ebenfalls über die Paketverwaltung installierbar sein.<br />
Unter Ubuntu installiert man <code>zenity</code> mit dem Befehl:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get</span> <span style="color: #c20cb9; font-weight: bold;">install</span> zenity</pre></div></div>

<p>Mit <code>at</code> können Befehle zu einem festgelegten Zeitpunkt ausgeführt werden. Eine sehr schöne Einführung gibt es in der <a href="http://www.freiesmagazin.de/mobil/freiesMagazin-2008-10-bilder.html#08_10_at" target="_blank" title="freiesMagazin 10/2008 - at" class="liexternal">Ausgabe 10/2008 von freiesMagazin</a> (eine Fortsetzung ist in der <a href="http://www.freiesmagazin.de/mobil/freiesMagazin-2008-11-bilder.html#08_11_at-beispiele" target="_blank" class="liexternal">nachfolgenden Ausgabe</a> enthalten, welche mich auch zu diesem &#8220;Programm&#8221; inspirierte, weil ich mit den dort vorgestellten Erinnerungs-Lösungen nicht zufrieden war).</p>
<p>Um mit <code>zenity</code> einen Dialog anzuzeigen kann man folgenden Befehl nutzen:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">zenity <span style="color: #660033;">--info</span> <span style="color: #660033;">--title</span>=<span style="color: #ff0000;">&quot;Titel des Dialogs&quot;</span> <span style="color: #660033;">--text</span> <span style="color: #ff0000;">&quot;Text, der angezeigt werden soll&quot;</span></pre></div></div>

<p>Damit dies von <code>at</code> angezeigt werden kann muss noch das Display angegeben werden:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">zenity <span style="color: #660033;">--info</span> <span style="color: #660033;">--title</span>=<span style="color: #ff0000;">&quot;Titel des Dialogs&quot;</span> <span style="color: #660033;">--text</span> <span style="color: #ff0000;">&quot;Text, der angezeigt werden soll&quot;</span> <span style="color: #660033;">--display</span>=:<span style="color: #000000;">0</span></pre></div></div>

<p>Diesen Befehl kann man nun in ein Bash- oder Perl-Script einfügen, wobei der Titel fest sein kann und der Text als Argument übergeben wird. Ich habe mich für Perl entschieden:</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/usr/bin/perl</span>
&nbsp;
<span style="color: #000066;">system</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;zenity --info --title=<span style="color: #000099; font-weight: bold;">\&quot;</span>Erinnerung<span style="color: #000099; font-weight: bold;">\&quot;</span> --text <span style="color: #000099; font-weight: bold;">\&quot;</span>@ARGV<span style="color: #000099; font-weight: bold;">\&quot;</span> --display=:0&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Dieses Script habe ich unter dem Namen <code>r</code> (für &#8220;remember&#8221;) im bin-Ordner meines Homeverzeichnisses gespeichert. Dieses muss natürlich im Pfad liegen, was durch folgende Zeile in der Datei <code>~/.bashrc</code> erreicht werden kann:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">PATH</span>=<span style="color: #007800;">$PATH</span>:<span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>user<span style="color: #000000; font-weight: bold;">/</span>bin</pre></div></div>

<p>&#8220;user&#8221; muss natürlich durch den entsprechenden Usernamen ersetzt werden. Nachdem man die <code>~/.bashrc</code> mit dem Befehl</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">. ~<span style="color: #000000; font-weight: bold;">/</span>.bashrc</pre></div></div>

<p>neu &#8220;geladen&#8221; hat kann man sich nun an Termine oder andere Dinge erinnern lassen.</p>
<p><strong>Beispiele:</strong><br />
Um 14:30 Termin bei FooBar. Also um 14:15 erinnern:</p>

<div class="wp_syntax"><div class="code"><pre class="plain" style="font-family:monospace;">at 14:15
r Termin bei FooBar in 15 Minuten
Strg+d</pre></div></div>

<p>In einer halben Stunde ist eine Besprechung (5 min vorher erinnern):</p>

<div class="wp_syntax"><div class="code"><pre class="plain" style="font-family:monospace;">at now +25min
r Besprechung
Strg+d</pre></div></div>

<p>Es öffnet sich zur angegebenen Zeit ein Dialogfenster (egal, was man gerade macht &#8211; solange man sich in X befindet. Bei Spielen im Fullscreen habe ich es jedoch nicht getestet.), welches den Titel &#8220;Erinnerung&#8221; enthält und den angegebenen Text ausgibt. Das Fenster kann durch einen Klick auf &#8220;OK&#8221; wieder geschlossen werden.</p>
<p><code>at</code> bietet noch viele weitere Möglichkeiten eine Zeit anzugeben. Diese werden im (ersten) oben verlinkten freiesMagazin-Artikel beschrieben.</p>
]]></content:encoded>
			<wfw:commentRss>http://zinformatik.de/linux/erinnerungen-mit-at-und-zenity/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Titel von Screen-Fenstern automatisch von Vim, Bash und zsh setzen</title>
		<link>http://zinformatik.de/linux/titel-von-screen-fenstern-automatisch-von-vim-bash-und-zsh-setzen/</link>
		<comments>http://zinformatik.de/linux/titel-von-screen-fenstern-automatisch-von-vim-bash-und-zsh-setzen/#comments</comments>
		<pubDate>Sat, 03 Oct 2009 09:34:51 +0000</pubDate>
		<dc:creator>zimon</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Ubuntuusers-Planet]]></category>
		<category><![CDATA[vim Tipps]]></category>
		<category><![CDATA[Bash]]></category>
		<category><![CDATA[Konsole]]></category>
		<category><![CDATA[Screen]]></category>
		<category><![CDATA[Titel]]></category>
		<category><![CDATA[Vim]]></category>
		<category><![CDATA[zsh]]></category>

		<guid isPermaLink="false">http://zinformatik.de/?p=1605</guid>
		<description><![CDATA[<p>Wenn man unter <a href="http://zinformatik.de/tipps-tricks/interessante-programme/einfuhrung-in-screen/" title="Einführung in Screen" target="_blank" class="liinternal">Screen</a> die Statusleiste nutzt, ist es oft mühsam jedes mal die Titel zu setzen. Auch wenn man diese fest in der <code>~/.screenrc</code> definiert, kann man manchmal durcheinander kommen.</p>
<p>Unter Vim gibt es die Möglichkeit, den Namen der aktuellen Datei als Titel für das Screenfenster zu benutzen.<br />
Dafür braucht man nur&#8230;</p>]]></description>
			<content:encoded><![CDATA[<p>Wenn man unter <a href="http://zinformatik.de/tipps-tricks/interessante-programme/einfuhrung-in-screen/" title="Einführung in Screen" target="_blank" class="liinternal">Screen</a> die Statusleiste nutzt, ist es oft mühsam jedes mal die Titel zu setzen. Auch wenn man diese fest in der <code>~/.screenrc</code> definiert, kann man manchmal durcheinander kommen.</p>
<p>Unter Vim gibt es die Möglichkeit, den Namen der aktuellen Datei als Titel für das Screenfenster zu benutzen.<br />
Dafür braucht man nur die folgenden Zeilen zur <code>~/.vimrc</code> hinzufügen:</p>

<div class="wp_syntax"><div class="code"><pre class="vim" style="font-family:monospace;"><span style="color: #804040;">if</span> <span style="color: #25BB4D;">expand</span><span style="color: #000000;">&#40;</span><span style="color: #C5A22D;">'$TERM'</span><span style="color: #000000;">&#41;</span> == <span style="color: #C5A22D;">'screen'</span>
<span style="color: #804040;">augroup</span> vim_screen
  <span style="color: #804040;">autocmd</span><span style="color: #000000;">!</span>
  <span style="color: #804040;">autocmd</span> <span style="color: #25BB4D;">VimEnter</span>,<span style="color: #25BB4D;">BufWinEnter</span>,<span style="color: #25BB4D;">WinEnter</span> <span style="color: #000000;">*</span>
    \ <span style="color: #804040;">exec</span> <span style="color: #C5A22D;">&quot;silent! !echo -ne '<span style="">\\</span>ek&quot;</span> <span style="color: #000000;">.</span> <span style="color: #25BB4D;">expand</span><span style="color: #000000;">&#40;</span><span style="color: #C5A22D;">'%:t'</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">.</span> <span style="color: #C5A22D;">&quot;<span style="">\\</span>e<span style="">\\</span><span style="">\\</span>'&quot;</span>
<span style="color: #804040;">augroup</span> END
<span style="color: #804040;">endif</span></pre></div></div>

<p><strong>[UPDATE]</strong>Auf dem <a href="http://blog.256bit.org/archives/451-Vim-in-Screen.html" title="Vim in Screen" target="_blank" class="liexternal">256bit Blog</a> beschreibt Christian Brabandt, wie man den Screen-Titel von Vim aus ohne autocommands und mit sehr vielen Einstellungen setzen kann.<strong>[/UPDATE]</strong></p>
<p>Ansonsten finde ich es sehr praktisch, wenn in der Statusleiste das aktuelle Verzeichnis steht. Da der komplette Pfad meist sehr lang ist, können mit einem regulären Ausdruck alle Verzeichnisse bis auf das letzte jeweils mit ihren Anfangsbuchstaben abgekürzt werden:</p>
<p><code>s/(\w).*?\//$1\//g</code></p>
<p>So wird <code>/home/zimon/.vim/plugin</code> zu <code>/h/z/.v/plugin</code> abgekürzt.</p>
<p>Wem das immer noch zu lang ist, der kann aus dem Namen des letzten Verzeichnisses auch noch die Vokale heraus nehmen (ähnlich wie es dillo in seinen Tabs macht):</p>
<p><code>s/(\w).*?\//$1\//g; my $end; $x=~s/\/(.)(?:[aeiou]|([^aeiou\/])(?{$end.=$^N}))*\s*$/\/$1$end/</code></p>
<p>Damit wird <code>/home/zimon/.vim/plugin</code> zu <code>/h/z/.v/plgn</code></p>
<p>Um in der Bash den Screen-Titel automatisch zu setzen, kann man folgenden Code zu seiner <code>~/.bashrc</code> hinzufügen. Hier wurde der erste reguläre Ausdruck genutzt (man kann ihn natürlich auch durch den anderen Ausdruck ersetzen, wenn man möchte):</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> precmd <span style="color: #7a0874; font-weight: bold;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">case</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$TERM</span>&quot;</span> <span style="color: #000000; font-weight: bold;">in</span>
        <span style="color: #c20cb9; font-weight: bold;">screen</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
        <span style="color: #007800;">wd</span>=<span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">perl</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">'$x=shift; $x=~ s/(\w).*?\//$1\//g; print $x;'</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$PWD</span>&quot;</span><span style="color: #000000; font-weight: bold;">`</span>
        <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #660033;">-ne</span> <span style="color: #ff0000;">&quot;\033k<span style="color: #007800;">$wd</span>\033\<span style="color: #000099; font-weight: bold;">\&quot;</span>
        ;;
    esac
}
PROMPT_COMMAND=precmd</span></pre></div></div>

<p>Für zsh User gibt es hier den Code für die <code>~/.zshrc</code>. In diesem Beispiel wurde der zweite reguläre Ausdruck genutzt:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> precmd <span style="color: #7a0874; font-weight: bold;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$TERM</span>&quot;</span> == <span style="color: #ff0000;">&quot;screen&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
    <span style="color: #7a0874; font-weight: bold;">local</span> <span style="color: #007800;">wd</span>=<span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">perl</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">'$x=shift; $ x=~ s/(\w).*?\//$1\//g; my $end; $x=~s/\/(.)(?:[aeiou]|([^aeiou\/])(?{$end.=$^N}))*\s*$/\/$1$end/; print $x;'</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$PWD</span>&quot;</span><span style="color: #000000; font-weight: bold;">`</span>
	<span style="color: #007800;">PR_STITLE</span>=$<span style="color: #ff0000;">'%{\ek'</span><span style="color: #007800;">$wd</span>$<span style="color: #ff0000;">'\e\\%}'</span>
    <span style="color: #000000; font-weight: bold;">fi</span>
<span style="color: #7a0874; font-weight: bold;">&#125;</span></pre></div></div>

<p>Vielen Dank an <a href="http://zinformatik.de/author/ploppor/" target="_self" class="liinternal">Ploppor</a> für den zsh Code und sonstige zahlreiche Unterstützung in letzter Zeit.</p>
<p>Es tut mir leid, dass ich in letzter Zeit nichts geschrieben habe, aber meine Diplomarbeit lässt mir einfach keine Zeit.</p>
]]></content:encoded>
			<wfw:commentRss>http://zinformatik.de/linux/titel-von-screen-fenstern-automatisch-von-vim-bash-und-zsh-setzen/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Vim Plugin &#8211; VCSCommand zur Versionsverwaltung mittels SVN und CVS</title>
		<link>http://zinformatik.de/tipps-tricks/interessante-programme/plugins-erweiterungen/vim-plugin-vcscommand-zur-versionsverwaltung-mittels-svn-und-cvs/</link>
		<comments>http://zinformatik.de/tipps-tricks/interessante-programme/plugins-erweiterungen/vim-plugin-vcscommand-zur-versionsverwaltung-mittels-svn-und-cvs/#comments</comments>
		<pubDate>Sat, 08 Aug 2009 10:24:51 +0000</pubDate>
		<dc:creator>zimon</dc:creator>
				<category><![CDATA[Plugins und Erweiterungen]]></category>
		<category><![CDATA[Ubuntuusers-Planet]]></category>
		<category><![CDATA[vim Tipps]]></category>
		<category><![CDATA[CVS]]></category>
		<category><![CDATA[Repository]]></category>
		<category><![CDATA[SVN]]></category>
		<category><![CDATA[Versionsverwaltung]]></category>
		<category><![CDATA[Vim]]></category>

		<guid isPermaLink="false">http://zinformatik.de/?p=1585</guid>
		<description><![CDATA[<p>Mit dem Plugin <a href="http://www.vim.org/scripts/script.php?script_id=90" title="Vim Plugin - VCSCommand" target="_blank" class="liexternal">VCSCommand</a> kann man Dateien und Verzeichnisse direkt von Vim aus über ein SVN- oder CVS-Repository verwalten. Ich werde hier jedoch nur SVN behandeln, da ich momentan nur dieses System nutze.</p>
<p>Nachdem man die Dateien des Plugins nach <code>~/.vim/plugin/</code> kopiert hat, kann man die Befehle <code>:VCSUpdate</code> und <code>:VCSCommit</code>nutzen um die aktuelle&#8230;</p>]]></description>
			<content:encoded><![CDATA[<p>Mit dem Plugin <a href="http://www.vim.org/scripts/script.php?script_id=90" title="Vim Plugin - VCSCommand" target="_blank" class="liexternal">VCSCommand</a> kann man Dateien und Verzeichnisse direkt von Vim aus über ein SVN- oder CVS-Repository verwalten. Ich werde hier jedoch nur SVN behandeln, da ich momentan nur dieses System nutze.</p>
<p>Nachdem man die Dateien des Plugins nach <code>~/.vim/plugin/</code> kopiert hat, kann man die Befehle <code>:VCSUpdate</code> und <code>:VCSCommit</code>nutzen um die aktuelle Datei zu Updaten bzw. seine Änderungen zu committen. Dafür muss die Datei jedoch bereits unter Versionskontrolle stehen.<br />
Beim Commit öffnet sich ein <a href="http://zinformatik.de/tipps-tricks/vim-tipps/unter-vim-mit-splitscreens-arbeiten/" title="Unter vim mit Splitscreens arbeiten" target="_self" class="liinternal">Splitscreen</a>, in den man die Logmessage eintragen kann. Mittels <code>:wq</code> oder <code>\cc</code> wird diese übernommen. Um ohne Logmessage zu Committen, kann man das Kommando mit einem Ausrufezeichen aufrufen: <code>:VCSCommit!</code>. </p>
<p>Es gibt auch Abkürzungen für die Kommandos. So kann man statt <code>:VCSCommit</code> auch den Befehl <code>\cc</code> nutzen, der das gleiche bewirkt. Genauso kann man mit <code>\cu</code> updaten.</p>
<p>Auch die anderen Kommandos sind im Prinzip die SVN Kommandos mit vorrangestelltem <em>VCS</em>. In Klammern steht jeweils die Kurzvariante:</p>
<ul>
<li><code>:VCSAdd</code> &#8211; (<code>\ca</code>) zum Hinzufügen von Dateien zum Repository</li>
<li><code>:VCSDelete</code> &#8211; (<code>\cD</code>) zum Löschen</li>
<li><code>:VCSStatus</code> &#8211; (<code>\cs</code>) um den Status der Datei anzuzeigen</li>
<li><code>:VCSDiff</code> &#8211; (<code>\cd</code>) um den Unterschied zur letzten Version anzuzgeigen</li>
<li><code>:VCSLog</code> &#8211; (<code>\cl</code>) zeigt die bereits getätigten commits mit ihren Logmessages an</li>
</ul>
<p>Statt <code>:VCSDiff</code> kann man auch <code>:VCSVimDiff</code> (<code>\cv</code>) nutzen um die Unterschiede mittels <a title="" href="" target="_self">Vimdiff</a> zu betrachten.</p>
<p>Um ganze Verzeichnisse mit dem CVSCommand-Plugin zu verwalten, kann man die <a href="http://zinformatik.de/tipps-tricks/vim-tipps/vim-als-dateibrowser-und-sftp-client/" titel="vim als Dateibrowser und (S)FTP-Client" target="_self" class="liinternal">Dateibrower-Funktion</a> des Vim nutzen und die entsprechenden Kommandos bei einem geöffneten Verzeichnis ausführen.</p>
<p>Es gibt natürlich noch weitere Kommandos und Einstellungsmöglichkeiten. Diese sind in der Hilfe näher beschrieben, die man mittels <code>:h vcscommand</code> aufrufen kann.</p>
]]></content:encoded>
			<wfw:commentRss>http://zinformatik.de/tipps-tricks/interessante-programme/plugins-erweiterungen/vim-plugin-vcscommand-zur-versionsverwaltung-mittels-svn-und-cvs/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic page generated in 4.555 seconds. -->
<!-- Cached page generated by WP-Super-Cache on 2012-02-05 17:30:08 -->

