Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

PATCH: kfmclient and MIME type completion



This patch

- adds completion for MIME types.  The only place I found where this
  slotted into the current system, after a rather cursory inspection,
  was _elinks.
- adds completion for kfmclient.  This is the neat way of passing
  remote commands to konqueror (KDE's file manager and web browser).
  This works for most MIME types because it uses the full KDE bindings.
  Hence pick-web-browser becomes an alternative to the zsh MIME functions,
  although you have to do the aliasing by hand.
- prefers kfmclient to dcop in pick-web-browser
- allows mailcap and mime-types styles to include a `+' to get the
  default path.  This works in zsh-mime-setup and _mime_types.

Index: Completion/Unix/Command/_elinks
===================================================================
RCS file: /cvsroot/zsh/zsh/Completion/Unix/Command/_elinks,v
retrieving revision 1.8
diff -u -r1.8 _elinks
--- Completion/Unix/Command/_elinks	16 Apr 2004 15:50:02 -0000	1.8
+++ Completion/Unix/Command/_elinks	26 Jul 2004 13:34:10 -0000
@@ -11,7 +11,7 @@
   '*-base-session[clone session with given ID]:ID number:' \
   '*-confdir[set config dir to given string]:configuration directory:_files -/' \
   '*-conffile[configuration file name]:configuration file:_files' \
-  '*-default-mime-type[MIME type to assume for documents]:MIME type:' \
+  '*-default-mime-type[MIME type to assume for documents]:MIME type:_mime_types' \
   '*-dump[write formatted version of given URL to stdout]::boolean:(0 1)' \
   '*-dump-charset[codepage to use with -dump]:codepage:' \
   '*-dump-width[width of document formatted with -dump]:width:' \
Index: Completion/Unix/Type/.distfiles
===================================================================
RCS file: /cvsroot/zsh/zsh/Completion/Unix/Type/.distfiles,v
retrieving revision 1.12
diff -u -r1.12 .distfiles
--- Completion/Unix/Type/.distfiles	16 Feb 2004 10:50:56 -0000	1.12
+++ Completion/Unix/Type/.distfiles	26 Jul 2004 13:34:10 -0000
@@ -10,4 +10,5 @@
 _hosts               _tar_archive         _time_zone
 _file_systems        _net_interfaces      _terminals           _locales
 _java_class          _services		  _email_addresses     _global_tags
+_mime_types
 '
Index: Completion/Unix/Type/_mime_types
===================================================================
RCS file: Completion/Unix/Type/_mime_types
diff -N Completion/Unix/Type/_mime_types
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ Completion/Unix/Type/_mime_types	26 Jul 2004 13:34:10 -0000
@@ -0,0 +1,42 @@
+#autoload
+
+local expl maintype
+local -a default_type_files type_files match mbegin mend
+integer ind
+
+default_type_files=(~/.mime.types /etc/mime.types)
+
+# This is the same style as used by zsh-mime-setup, with a different
+# context.
+if zstyle -a ":completion:${curcontext}:mime" mime-types type_files; then
+  while (( (ind = ${type_files[(I)+]}) > 0 )); do
+    type_files[$ind]=($default_type_files)
+  done
+else
+  type_files=($default_type_files)
+fi
+
+#
+# Handle two different mime type formats; the simple
+# format:
+#   application/x-pws-frobnicate psf pwsf
+# and the extended format
+#   type=application/x-pws-frobnicate \
+#   desc="PWS frobnicated widget" \
+#   exts="pwsf,psf"
+# which Netscape seems to like.
+#
+
+if [[ $PREFIX = (#b)([^/]##)/* ]]; then
+  # Search for subtype.
+  maintype=$match[1]
+  compset -p $(( ${#maintype} + 1 ))
+  _wanted mimesubtype expl 'MIME subtype' \
+      compadd -- $(sed -ne "s%^\(type=\|\)${maintype}/\([^ 	]*\).*$%\2%p" \
+      $type_files)
+else
+  # Search for main type.
+  _wanted mimetype expl 'MIME type' \
+    compadd -S/ -- $(sed -ne "s/^type=//" \
+      -e "s%^\(${PREFIX:-[a-z]}[^=\"]*\)/.*$%\1%p" $type_files)
+fi
Index: Completion/X/Command/.distfiles
===================================================================
RCS file: /cvsroot/zsh/zsh/Completion/X/Command/.distfiles,v
retrieving revision 1.9
diff -u -r1.9 .distfiles
--- Completion/X/Command/.distfiles	28 May 2003 14:17:13 -0000	1.9
+++ Completion/X/Command/.distfiles	26 Jul 2004 13:34:10 -0000
@@ -3,4 +3,5 @@
 _gv        _netscape  _xauth     _xfig      _mozilla   _xterm     _xwit
 _nedit     _vnc       _x_utils   _xdvi      _xmodmap   _xset      _xv
 _acroread  _dcop      _gqview    _xloadimage _mplayer
+_kfmclient
 '
Index: Completion/X/Command/_kfmclient
===================================================================
RCS file: Completion/X/Command/_kfmclient
diff -N Completion/X/Command/_kfmclient
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ Completion/X/Command/_kfmclient	26 Jul 2004 13:34:10 -0000
@@ -0,0 +1,93 @@
+#compdef kfmclient
+
+local expl
+local -a context state line
+typeset -A opt_args
+
+_arguments \
+  '--help[show help message]' \
+  '--help-qt[show Qt specific options]' \
+  '--help-kde[show KDE specific options]' \
+  '--help-all[show all options]' \
+  '--author[show author information]' \
+  '-v[show version information]' \
+  '--version[show version information]' \
+  '--license[show license information]' \
+  '--commands[show available commands]' \
+  '--display=:X display:_x_display' \
+  '--session=:session id for restoring application: ' \
+  '--cmap[use private colormap (8-bit display)]' \
+  '--ncols=:limit on number of colors (8-bit display): ' \
+  '--nograb[never grab mouse or keyboard]' \
+  '--dograb[override nograb in debugger]' \
+  '--sync[switch to synchronous mode when debugging]' \
+  '--fn=:font name:_x_font' \
+  '--font=:font name:_x_font' \
+  '--bg=:background color:_x_color' \
+  '--background=:background color:_x_color' \
+  '--fg=:foreground color:_x_color' \
+  '--foreround=:foreground color:_x_color' \
+  '--btn=:button color:_x_color' \
+  '--button=:button color:_x_color' \
+  '--name=:application name: ' \
+  '--title=:application title (caption): ' \
+  '--visual=:specify visual:_x_visual' \
+  '--inputstyle:X input method:(onthespot overthespot offthespot root)' \
+  '--im:X Input Method server: ' \
+  '--noxim[disable X Input Method]' \
+  '--reverse[reverse widget layout]' \
+  '--caption=:name in titlebar: ' \
+  '--icon=:application icon: ' \
+  '--miniicon=:icon in titlebar: ' \
+  '--config=:configuration  file:_files' \
+  '--dcopserver=:DCOP server: ' \
+  '--nocrashhandler[disable crash handler, allow core dumps]' \
+  '--waitforwm[Wait for a WM_NET compatible window manager]' \
+  '--style=:GUI style for application: ' \
+  '--geometry=:client window geometry:_x_geometry' \
+  '1:client command:(openURL openProfile openProperties exec move
+download copy sortDesktop configure configureDesktop)' \
+  '2::args:->firstarg' \
+  '3::args:->secondarg'  &&  return 0
+
+[[ $state = *arg ]] || return 1
+
+# Argument to previous command.
+
+print $line >/tmp/tmp.out
+
+case $line[1] in
+  (openURL)
+  if [[ $state = secondarg ]]; then
+    _mime_types && return 0
+  elif [[ $state = firstarg ]]; then
+    _urls && return 0
+  fi
+  ;;
+
+  (openProfile)
+  if [[ $state = secondarg ]]; then
+    _urls && return 0
+  elif [[ $state = firstarg ]]; then
+    _wanted profile expl 'Konqueror profile' \
+      compadd -- ~/.kde/share/apps/konqueror/profiles/*(:t) && return 0
+  fi
+  ;;
+
+  (exec)
+  if [[ $state = secondarg ]]; then
+    # TODO: could probe inside Desktop files.
+    _message "KDE binding" && return 0
+  elif [[ $state = firstarg ]]; then
+    _urls && return 0
+  fi
+  ;;
+
+  (move|download|openProperties)
+  if [[ $state = firstarg ]]; then
+      _urls && return 0
+  fi
+  ;;
+esac
+
+_message "no more arguments"
Index: Doc/Zsh/contrib.yo
===================================================================
RCS file: /cvsroot/zsh/zsh/Doc/Zsh/contrib.yo,v
retrieving revision 1.34
diff -u -r1.34 contrib.yo
--- Doc/Zsh/contrib.yo	26 Jul 2004 06:57:46 -0000	1.34
+++ Doc/Zsh/contrib.yo	26 Jul 2004 13:34:12 -0000
@@ -1045,11 +1045,13 @@
 A list of files in the format of tt(~/.mime.types) and
 tt(/etc/mime.types) to be read during setup, replacing the default list
 which consists of those two files.  The context is tt(:mime:).
+A tt(PLUS()) in the list will be replaced by the default files.
 )
 item(mailcap)(
 A list of files in the format of tt(~/.mailcap) and
 tt(/etc/mailcap) to be read during setup, replacing the default list
 which consists of those two files.  The context is tt(:mime:).
+A tt(PLUS()) in the list will be replaced by the default files.
 )
 item(handler)(
 Specifies a handler for a suffix; the suffix is given by the context as
Index: Functions/MIME/pick-web-browser
===================================================================
RCS file: /cvsroot/zsh/zsh/Functions/MIME/pick-web-browser,v
retrieving revision 1.1
diff -u -r1.1 pick-web-browser
--- Functions/MIME/pick-web-browser	14 Sep 2003 19:37:35 -0000	1.1
+++ Functions/MIME/pick-web-browser	26 Jul 2004 13:34:13 -0000
@@ -82,8 +82,13 @@
   for browser in $xbrowsers; do
     if [[ $windows[(I)(#i)$browser] -ne 0 ]]; then
       if [[ $browser = konqueror ]]; then
-	# I'm sure there's documentation for this somewhere...
-	dcop $(dcop|grep konqueror) default openBrowserWindow $url
+	# kfmclient is less hairy and better supported than direct
+	# use of dcop.  Run kfmclient --commands
+	# for more information.  Note that as konqueror is a fully
+	# featured file manager, this will actually do complete
+	# MIME handling, not just web pages.
+	kfmclient openURL $url ||
+	  dcop $(dcop|grep konqueror) default openBrowserWindow $url
       else
 	# Mozilla bells and whistles are described at:
 	# http://www.mozilla.org/unix/remote.html
Index: Functions/MIME/zsh-mime-setup
===================================================================
RCS file: /cvsroot/zsh/zsh/Functions/MIME/zsh-mime-setup,v
retrieving revision 1.2
diff -u -r1.2 zsh-mime-setup
--- Functions/MIME/zsh-mime-setup	22 Jun 2004 14:35:05 -0000	1.2
+++ Functions/MIME/zsh-mime-setup	26 Jul 2004 13:34:13 -0000
@@ -53,14 +53,30 @@
 # to handlers and their flags.
 typeset -A suffix_type_map type_handler_map type_flags_map
 
+local -a default_type_files default_cap_files
 local -a type_files cap_files array match mbegin mend
 local file line type suffix exts elt flags line2
+integer ind
+
+default_type_files=(~/.mime.types /etc/mime.types)
+default_cap_files=(~/.mailcap /etc/mailcap)
 
 # Customizable list of files to examine.
-zstyle -a :mime: mime-types type_files ||
-  type_files=(~/.mime.types /etc/mime.types)
-zstyle -a :mime: mailcap cap_files ||
-  cap_files=(~/.mailcap /etc/mailcap)
+if zstyle -a :mime: mime-types type_files; then
+  while (( (ind = ${type_files[(I)+]}) > 0 )); do
+    type_files[$ind]=($default_type_files)
+  done
+else
+  type_files=($default_type_files)
+fi
+
+if zstyle -a :mime: mailcap cap_files; then
+  while (( (ind = ${cap_files[(I)+]}) > 0 )); do
+    cap_files[$ind]=($default_cap_files)
+  done
+else
+  cap_files=($default_cap_files)
+fi
 
 {
   mime-setup-add-type() {

-- 
Peter Stephenson <pws@xxxxxxx>                  Software Engineer
CSR Ltd., Science Park, Milton Road,
Cambridge, CB4 0WH, UK                          Tel: +44 (0)1223 692070


**********************************************************************
This email and any files transmitted with it are confidential and
intended solely for the use of the individual or entity to whom they
are addressed. If you have received this email in error please notify
the system manager.

This footnote also confirms that this email message has been swept by
MIMEsweeper for the presence of computer viruses.

www.mimesweeper.com
**********************************************************************



Messages sorted by: Reverse Date, Date, Thread, Author