Cygwin 上の vim で :browse

OpenFile.vbs
「ファイルを開くダイアログ」を出して、選択したファイル名を WScript.Echo。
(cscript で実行すると標準出力へ出力)

Dim ComDlg, WshShell
Set ComDlg = WScript.CreateObject("MSComDlg.CommonDialog")
Set WshShell = WScript.CreateObject ("WScript.Shell")
ComDlg.MaxFileSize = 256                            'ファイル名を格納する場所のサイズ
ComDlg.DialogTitle = "ファイルを開く"  'ウインドウタイトル
ComDlg.Filter = "*.*|*.*"             'ファイルの拡張子を.vbsに限定する
ComDlg.CancelError = True                           'キャンセルボタンが押されたときにエラーを発生させる
On Error Resume Next                                'エラーが発生しても処理を続ける
ComDlg.ShowOpen                                     '「ファイルを開く」ダイアログを開く
If Err.Number <> 32755 Then                         'エラーナンバー32755(キャンセルボタンが押された)以外なら実行する
    path = ComDlg.FileName
    WScript.Echo path
End If

Set WshShell = Nothing
Set ComDlg = Nothing

browse.vim
OpenFile.vbs で選択したファイルを開く。

function! Browse()
  let a = system("cscript //nologo 'c:\\ao\\src\\vbs\\OpenFile.vbs'") 
  let path = strpart(a, 0, strlen(a)-2)
  if path != ""
    exe "e " . escape(path, ' \')
  endif
endfunction
  • VBScript の可能性は大きい
  • gtk や qt でこの VBScript に相当するプログラム

[追記]
qt は以下でできた。

#include <qapplication.h>
#include <qfiledialog.h>

int main( int argc, char **argv )
{    
	QApplication a( argc, argv );
	QString s( QFileDialog::getOpenFileName( QString::null, "All Files (*)", 0, "OpenFile", "Open File" ) );

	if ( ! s.isEmpty() ) { 
		printf("%s", (const char*)s); 
	}

	return 0;
}

[追記:2006-08-20]
gtk 1.2 は以下でできた。

/*
 *File name: filedialog.c
 */

#include <gtk/gtk.h>
#include <glib.h>

GtkWidget *file_selection_box;

gint destroyapp (GtkWidget *widget, gpointer gdata)
{
	gtk_main_quit();
	return (FALSE);
}

void store_filename(GtkFileSelection *file_selection, gpointer data)
{
	gchar *filename;

	filename = gtk_file_selection_get_filename(GTK_FILE_SELECTION(file_selection_box)); 
	g_print(filename); 

	gtk_main_quit();
}

void create_file_selection(void) 
{
	file_selection_box = gtk_file_selection_new("Please select a file for editing.");

	gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(file_selection_box)->ok_button), "clicked", GTK_SIGNAL_FUNC(store_filename), NULL);
	gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(file_selection_box)->cancel_button), "clicked", GTK_SIGNAL_FUNC(destroyapp), NULL);

	gtk_signal_connect_object(GTK_OBJECT(GTK_FILE_SELECTION(file_selection_box)->ok_button), "clicked", GTK_SIGNAL_FUNC (gtk_widget_destroy), (gpointer) file_selection_box);

	gtk_signal_connect_object(GTK_OBJECT(GTK_FILE_SELECTION(file_selection_box)->cancel_button), "clicked", GTK_SIGNAL_FUNC (gtk_widget_destroy), (gpointer) file_selection_box);

	gtk_widget_show(file_selection_box);
}

int main(int argc, char *argv[])
{
	gtk_init(&argc, &argv);

	create_file_selection();

	gtk_signal_connect(GTK_OBJECT(file_selection_box), "delete_event", GTK_SIGNAL_FUNC(destroyapp), NULL);

	gtk_main();

	return 0;
}

Makefile

filedialog: filedialog.c
	gcc -Wall filedialog.c -o filedialog `gtk-config --cflags` `gtk-config --libs`

ここから拾ってきた物を適当に削っただけなので、正しいかどうか自信なし。
http://www.linuxheadquarters.com/howto/programming/gtk_examples/filedialog/filedialog.shtml