2014-02-04 6 views
1

Я работаю над несколькими проектами, каждая ~ 3-5 миллионов строк кода. У меня есть один файл тегов в корне каждого проекта. У меня также есть каталог инструментов, разделяемый всеми из них.vim set tags с абсолютным путем

disk1 
| 
+--Proj A 
| 
+--Proj B 
| 
+--Shared 

disk2 
| 
+--Proj C 
| 
+--Proj D 

При использовании тегов, я хотел бы Vim сначала найти файл тегов в корне моего проекта, а затем искать файл тегов для Proj X, а затем искать файл тегов в Shared

I не может получить Vim, чтобы найти файл тегов в Shared

в моем файле .vimrc у меня есть:

набор тегов = теги; D:/Shared set tags=tags;,D:/Shared (спасибо romainl за то, что он поймал недостающую запятую!)

но Vim ищет только локальный файл тегов проекта, а не общий.

tags;tags; должен начинаться с CWD и перемещаться по дереву до тех пор, пока не будет найден файл тегов (находит правильный на уровне проекта).

D:/Shared - это явный путь и должен найти файл тегов в этом каталоге, но этого не сделать (я проверил, он действительно существует).

Я использую Exuberand Ctags v5.8

+0

это поможет? http://stackoverflow.com/questions/17336143/using-multiple-tag-files-at-once-in-vim-tag-organisation-in-general –

+0

Итак, я создал файл тегов для общих компонентов в самый корневой уровень диска. Таким образом поведение 'tags = tags;' может найти его, поскольку оно продолжает перемещаться, пока не найдет что-то. Тем не менее, обломка состоит в том, что теперь мне нужно иметь две избыточные копии файла общих тегов, по одному для каждого диска (Proj A и B на диске 1, Proj C и D на диске 2) - файл общих тегов - почти 1 ГБ. Это не пространство, на которое я жалуюсь (1 ГБ - это арахис), это избыточность ... Я считаю, что должен быть лучший способ. – ash

ответ

1
set tags=tags;D:/Shared 

означает "смотреть вверх для tags файла из текущего каталога, пока вы не достигнете D:/Shared".

Если вы работаете в проекте C на диск 2 (давайте назовем этот диск E:), Вим будет никогда визит D:/Shared из-за две вещи:

  1. Восходящий поиск не является рекурсивным.

    Если в корневой папке «текущий каталог» находится файл tags, Vim пытается найти его в корне его родителя и так далее, пока не достигнет самого верхнего родителя или каталога, указанного после точки с запятой. Итак, предположим, что вы редактируете E:\ProjectC\path\to\some\file, вы не можете ожидать, что Vim найдет файл tags за пределами этого пути. Vim будет искать для следующих tags файлов, последовательно и, кстати, никогда не считают, что гипотетический D:\Shared:

    E:\ProjectC\path\to\some\tags <-- KO 
    E:\ProjectC\path\to\tags  <-- KO 
    E:\ProjectC\path\tags   <-- KO 
    E:\ProjectC\tags    <-- OK! 
    E:\tags      <-- KO 
    

    Он не будет найти tags файл, не перечисленные выше.

  2. В любом случае Windows не имеет эквивалента «корневого» каталога UNIX.

    Если вы не указали стоп-каталог, поиск вверх поднимается на инвертированное дерево вашей файловой системы из текущего каталога (или произвольного каталога запуска) в корень файловой системы.

    Предположив вы все еще редактирования E:\ProjectC\path\to\some\file, вверх поиск будет в конечном счете искать каталог остановки D:\Shared непосредственно под каждый родительский каталог на пути к E:\ и довольно очевидно, никогда найти.

Если вы хотите Vim найти D:\Shared\tags где вы находитесь, вам нужно только добавить его явно в опции tags. Не как каталог остановки, но в определенном месте:

set tags=tags;,D:/Shared/tags 

Теперь, он говорит: «смотреть вверх для tags файла из текущего каталога и использования D:/Shared/tags».


Хм ... что было много слов, просто чтобы объяснить необходимость единого ,.

+0

приятно поймать! Я не хотел устанавливать D:/Shared как мой стоп-каталог, я хотел, чтобы он прошел к корню диска. К сожалению, он все еще не работает. Я получаю «тег не найден». Я проверил, что тег, о котором идет речь, фактически существует в моем файле общих тегов. – ash

+0

Я имел в виду 'set tags = tags ;, D:/Shared/tags', извините. – romainl

+0

Я чувствую, что синтаксис для этого немного неуклюжий. Меня научили видеть точку с запятой как полную остановку, конец команды. Так что неудобно, что стоп-каталог появляется после точки с запятой ... Я бы предпочел, чтобы остановка dir появилась после запятой или что-то в этом роде. – ash

Смежные вопросы