Files views-pristine/.views_query.inc.swp and views/.views_query.inc.swp differ
diff --exclude='*svn*' -Nru views-pristine/modules/views_taxonomy.inc views/modules/views_taxonomy.inc
--- views-pristine/modules/views_taxonomy.inc	2008-07-02 16:09:00.000000000 -0400
+++ views/modules/views_taxonomy.inc	2008-07-07 17:39:11.000000000 -0400
@@ -154,16 +154,26 @@
       'help' => t('The argument will filter by a taxonomy term ID. For this argument, set the option to the depth to search. See taxonomy for more information.'),
     ),
     'taxletter' => array(
-      'name' => t('Taxonomy: Term Name'),
+      'name' => t('Taxonomy: Term Name for Any Vocabulary'),
       'handler' => 'views_handler_arg_taxletter',
       'option' => 'string',
       'help' => t('The argument will filter by a taxonomy term name. For this argument, set the option to the number of characters, using 0 for full term; use 1 for an A/B/C style glossary.'),
     ),
-    'vocid' => array(
+  );
+
+  $vocabularies = taxonomy_get_vocabularies();
+  foreach ($vocabularies as $voc) {
+    $arguments["taxletterfromvoc_{$voc->vid}"] = array(
+      'name' => t('Taxonomy: Term Name for @voc-name', array('@voc-name' => $voc->name)),
+      'handler' => 'views_handler_arg_taxletter',
+      'option' => "string",
+      'help' => t('The argument will filter by a taxonomy term name from the \'@voc-name\' vocabulary. For this argument, set the option to the number of characters, using 0 for full term; use 1 for an A/B/C style glossary.', array('@voc-name' => $voc->name)),
+    );
+  }
+  $arguments['vocid'] = array(
       'name' => t('Taxonomy: Vocabulary ID'),
       'handler' => 'views_handler_arg_vocid',
       'help' => t('The argument will filter to nodes with terms in a vocabulary.'),
-    ),
   );
   return $arguments;
 }
@@ -378,6 +388,17 @@
 
 function views_handler_arg_taxletter($op, &$query, $argtype, $arg = '') {
   static $field = NULL;
+
+  if (is_array($argtype)) {
+    $argtype_type = $argtype['type'];
+  } else {
+    $argtype_type = $argtype;
+  }
+  $type_vocid = explode("_", $argtype_type);
+  if (count($type_vocid > 1)) {
+    $vocid = $type_vocid[1];
+  }
+
   switch($op) {
     case 'summary':
       $query->add_table('term_data', true);
@@ -394,12 +415,23 @@
       break;
     case 'filter':
       $len = intval($argtype['options']);
-      $query->add_table('term_data', true);
+      $term_node_num = $query->add_table('term_node', false, 1, array('left' => array('table' => 'node', 'field' => 'nid'), 'right' => array('field' => 'nid') ));
+      $term_node = $query->get_table_name('term_node', $term_node_num);
+
+      $term_data_num = $query->add_table('term_data', false, 1, array('left' => array('table' => $term_node, 'field' => 'tid'), 'right' => array('field' => 'tid')));
+      $term_data = $query->get_table_name('term_data', $term_data_num);
+
+      if (isset($vocid)) {
+        $term_voc_num = $query->add_table('vocabulary', false, 1, array('left' => array('table' => $term_data, 'field' => 'vid'), 'right' => array('field' => 'vid')));
+        $term_voc = $query->get_table_name('vocabulary', $term_voc_num);
+        $query->add_where("{$term_voc}.vid = '%s'", $vocid);
+      }
+
 
       if ($len <= 0) {
-        $query->add_where("term_data.name = '%s'", $arg);
+        $query->add_where("{$term_data}.name = '%s'", $arg);
       } else {
-        $query->add_where("LEFT(term_data.name, $len) = '%s'", $arg);
+        $query->add_where("LEFT({$term_data}.name, $len) = '%s'", $arg);
       }
       break;
     case 'link':
