VIM: биекция между элементами тегов VIM и фрагментами кода? - PullRequest
4 голосов
/ 09 апреля 2009

Мой список тегов в коде C:

макро
|| MIN_LEN
|| MAX_ITERATIONS
|| - typedef
|| клетка
|| исходная_ячейка
|| - переменная
|| len_given

Элементы тегов (домен):

A = {MIN_LEN, MAX_ITERATIONS, cell, source_cell, len_given}

Фрагменты кода (кодовый домен):

B = {"code_MIN_LEN", "code_MAX_ITERATIONS", ..., "code_len_given"}

Цель: иметь биекцию между наборами A и B.

Пример: Я хочу удалить любой элемент в A, например MIN_LEN, из A и B, удалив его элемент в A или B.

Вопрос: Есть ли способ гарантировать биекцию между А и В, чтобы изменение в А или В привело к изменению в другом наборе?

1 Ответ

3 голосов
/ 23 июля 2009

Я сильно сомневаюсь, что вы можете сделать это. Плагин taglist использует ctags для сбора символов в вашем коде и отображения их в боковом разрезе. Боковое разделение содержит информацию только для чтения (если вы попытаетесь работать с этим окном, vim сообщит вам, что для этого буфера отключено изменение).

То, чего вы хотите достичь, подразумевает довольно сложный анализ исходного кода, который вы модифицируете. Даже такая простая задача, как автоматическое переименование (при условии, что вы изменяете запись имени функции в буфере списка тегов и обновляются все экземпляры в вашем источнике), требует довольно сложного анализа, который выходит за рамки возможностей ctags или самого тег-списка. Удаление и сохранение всего синхронизированного с биективными отношениями еще сложнее. Предположим, у вас есть строка printf, где вы используете макрос, который хотите удалить. Что должно произойти с этой линией? если вся строка исчезнет, ​​или только макрос (в этом случае строка, вероятно, будет синтаксически неправильной.

taglist - это хороший плагин для просмотра вашего кода, но он не подходит для автоматического рефакторинга (чего вы хотите добиться).

Редактировать: что касается сложности вычислений, то в худшем случае сценарий заключается в том, что вы должны исследовать весь документ при каждом нажатии клавиши, ища новые вхождения меток, которые можно было бы интегрировать, поэтому в этом смысле вы могли бы сказать, что это O (n) при каждом нажатии клавиши. Это, конечно, излишнее и худший метод для его реализации. Мне неизвестна вычислительная сложность подсветки синтаксиса в vim (что также было бы полезно для извлечения тегов посредством правильного токенизации), но я бы оценил его как очень низкий и очень ограниченный по количеству анализируемых данных (вы маловероятно иметь большие конструкции для анализа для извлечения токена и понимания его контекста). В любом случае, это не так, как работает taglist. Taglist запускает ctags при каждом вызове vim, он не анализирует документ в реальном времени во время ввода. Однако это делается, например, Eclipse, XCode и KDevelop, которые также предоставляют инструменты для автоматического или полуавтоматического рефакторинга и могут в конечном итоге интегрировать vim в качестве редактора. Если вам нужны эти функции, вы определенно используете не тот инструмент.

...