Mittwoch, 8. Juni 2011

Finalbuilder-Hook in Mercurial

In der Firma in der ich arbeite wird viel Finalbuilder verwendet. Das Tool ist zwar ganz nett, hat aber Probleme zu bemerken dass eine bereits geöffnete Datei verändert wurde. Das führt zu den merkwürdigsten Problemen wenn die Finalbuilder-Dateien unter Versionskontrolle stehen (Schnell ein update machen, aber Finalbuilder ist noch geöffnet. Das update funktioniert problemlos, nur sind keine Änderungen im Finalbuilder „angekommen“)

Damit mir das nicht mehr passiert habe ich mir mal einen kleinen hook für mercurial zusammen gezimmert.

Einfach das folgende Skript irgendwo auf der Platte parken:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import os

def preupdate(ui, repo, **kwargs):
 basepath = repo.origroot
 rev = kwargs['parent1']
 node = repo.changelog.lookup(rev)
 _,_,_,files,_,_ = repo.changelog.read(node)
 for file in files:
  if os.path.splitext(file)[1] != '.fbz6':
   continue
  fb_file = os.path.join(basepath, file)
  fb_lockfile = os.path.splitext(fb_file)[0] + '.fb6lck'
  if os.path.exists(fb_lockfile):
   ui.write('Fehler: Die Finalbuilder-Datei\n%s\nsoll geändert werden, ist aber noch gelockt.\nSchließen sie Finalbuilder um das Update durchzuführen.\n' % fb_file)
   ui.write('(Hinweis: Wenn sie (wirklich...) keinen Finalbuilder mehr geöffnet haben,\nsollten sie die lock-datei löschen.\n diese findet sich unter:\n%s)\n' % fb_lockfile)
   return True
 
 return False

Diesen hook dann noch in mercurial einbauen, indem die globale mercurial.ini (bei mir: c:\users\nils\mercurial.ini) mit einem editor geöffnet wird und folgende Zeilen ergänzen:
[hooks]
preupdate.finalbuilder = python:C:\wo\das\skript\liegt.py:preupdate

Mehr info's über mercurial-hooks gib es im mercurial Buch, Kap. 10.

Hinweis: Zur Ausführung dieses hooks muss kein python extra installiert werden, der hook wird einfach „direkt“ in mercurial ausgeführt. Mehr dazu gibt es im mercurial Buch.

Sonntag, 29. Mai 2011

Pfadleiste in Nautilus 3 - oder wo ist mein „überliegendes Verzeichnis“-Knopf geblieben…

Ich habe gestern auf gnome 3 umgestellt, daher ist meine aktuelle Version von Nautilus die v. 3.0.1.1
Nun fehlt in dieser der Knopf für „überliegendes Verzeichnis“. Klar - der „Zurück“-Knopf führt in wohl 80% der Fälle zum überliegenden Verzeichnis... Ich vermisse ihn aber trotzdem.
Eine kleine Suche hat mich auf die Antwort gebracht: Der „überliegendes Verzeichnis“-Knopf ist nicht mehr notwendig, die Verzeichnis-Anzeige ist ja in der „Pfadleiste“ - und da kann man ja einfach das überliegende Verzeichnis anklicken... Achso? Nicht bei mir...
Bei mir ist keine Pfadleiste, sondern ein Text-Feld....
Es hat etwas länger gedauert bis ich heraus gefunden hatte, dass Nautilus die Pfadleiste ja schon lange hatte, nur halt nicht bei mir - und nach reichlich nachdenken bin ich mir ganz sicher — die Pfadleiste hatte ich mal abgeschaltet. Aber wie nun wieder zurück bekommen?
Die Lösung liegt in der always-use-location-entry Einstellung von Nautilus.
Also den dconf-editor geöffnet und navigieren nach org/gnome/nautilus/preferences:
Nachdem ich die Einstellung zurück gesetzt habe erscheint auch die Pfadleiste:
Super. Das Textfeld, dass ich vorher hatte kann jetzt übrigens temporär aktiviert werden über Strg+L oder „Gehe zu“>„Ort” 

Freitag, 22. April 2011

Leere VS2010 Solution in Nautilus

Ich habe schon einmal geschrieben, wie man eine neue VS2008 Solution mit dem Explorer anlegen kann.
Das selbe ist natürlich auch für gnomes Nautilus möglch.
Einfach eine der Vorlagen (2008 oder 2010) ablegen im Template-Verzeichnis ablegen und mit "nautilus -q" Nautilus neu starten.

Das Template-Verzeichnis von Nautilus ist unter dem Namen XDG_TEMPLATES_DIR abgelegt in der Datei user-dirs.dirs des config-verzeichnisses. Dieses sollte in XDG_CONFIG_HOME stehen, standard ist ~./config.
Also im Lieblings-Editor (vim für mich...) die user-dirs.dir bearbeiten :
vim ${XDG_CONFIG_HOME:-~/.config}/user-dirs.dirs

und entweder herausfinden was der Wert der variablen ist, oder einen guten setzen. Meiner ist:
XDG_TEMPLATES_DIR="$HOME/.XdgTemplates"

Also Kurzfassung:

  1. XDG_TEMPLATES_DIR finden
  2. Vorlage (2008 oder 2010) im XDG_TEMPLATES_DIR ablegen 
  3. Nautilus neustarten (nautilus -q)

vim probleme mit delete unter rxvt?

In meinem letzten post hatte ich dargestellt, wie man einen netten terminal-emulator (rxvt) unter cygwin zum laufen bringt. Soweit so gut.
Jetzt machte aber plötzlich mein vim probleme: Del funktionierte manchmal nicht und die Pfeiltasten verhielten sich auch komisch..
Die Antwort war wie immer recht einfach: Ich hatte die .vimrc vergessen.
cp /usr/share/vim/vim73/vimrc_example.vim ~/.vimrc
Behebt das Problem. Super-Einfache lösung.
(Nur vorsicht, wenn man schon eine .vimrc hat...)

EDIT:
Natürlich ist es nicht „die magische .vimrc“, die das Problem behebt, sondern die folgende Zeile innerhalb dieser:
set backspace=indent,eol,start

Besserer Terminal-Emulator für cygwin

Seit kurzem befasse ich mich (mal wieder) mit cygwin. Eine gute Idee habe ich heute im Netz gefunden: Den bestehenden emulator gegen rxvt ersetzen.
Dafür muss natürlich rxvt in der cygwin-umgebung installiert sein.
Folgende bat-Datei sollte dann zum starten erstellt werden:
@echo off
C:
chdir C:\cygwin\bin
start rxvt -sr -sl 10000 -fg white -bg black -fn "Lucida Console-10" -tn cygwin -e /bin/bash --login -i

Super.

Mittwoch, 23. März 2011

Word-Dokumente zusammenfassen

Mein aktuelles Problem: Mehrere Word-Dokumente sollten in einem neuem Dokument zusammengefasst werden.

Zwei mögliche Lösungen bieten sich an:
1. Neues Word-Dokument erstellen, Einfügen, Objekt, „Text aus Datei”
2. Ein Makro erstellen, dass alle Dateien in einem bestimmten Ordner öffnet und in eine neue Datei einfügt (ohne Beachtung einer eventuell gewünschten Reihenfolge).

Da mir Variante 2 besser gefällt (*grins*) folgt der verwendete code:

Sub ConcatenateAllWordFiles()
 Dim mypath
 mypath = BrowseFolder("Verzeichnis Wählen")
 
 Set fso = CreateObject("Scripting.FileSystemObject")
 Set Folder = fso.GetFolder(mypath)
 Set allFiles = Folder.Files
 Set newDoc = Documents.Add

 For Each file In allFiles
    If Right(file, 5) = ".docx" Then

        Documents.Open FileName:=file.Path
        current = ActiveDocument.Name
        Selection.WholeStory
        Selection.Copy
        Documents(current).Close
        newDoc.Activate
        Selection.Paste
        Selection.EndKey Unit:=wdLine
    End If
 Next
End Sub

Function BrowseFolder(Title As String, _
        Optional InitialFolder As String = vbNullString, _
        Optional InitialView As Office.MsoFileDialogView = _
            msoFileDialogViewList) As String
    Dim V As Variant
    Dim InitFolder As String
    With Application.FileDialog(msoFileDialogFolderPicker)
        .Title = Title
        .InitialView = InitialView
        If Len(InitialFolder) > 0 Then
            If Dir(InitialFolder, vbDirectory) <> vbNullString Then
                InitFolder = InitialFolder
                If Right(InitFolder, 1) <> "\" Then
                    InitFolder = InitFolder & "\"
                End If
                .InitialFileName = InitFolder
            End If
        End If
        .Show
        On Error Resume Next
        Err.Clear
        V = .SelectedItems(1)
        If Err.Number <> 0 Then
            V = vbNullString
        End If
    End With
    BrowseFolder = CStr(V)
End Function

Das ist natürlich nicht alles meine alleinige Idee, die Grobe Vorlage war dies.
Wie BrowseFolder-Funktion habe ich komplett „gefunden”...