[Из песочницы] Vim и IDE — это разные вещи
По сути, статья будет развернутым пояснением идеи, высказанной другим пользователем в комментарии к статье «VIM: зачем, если есть IDE, и как?».
Принципиально IDE от редактора отличается тем, что IDE оперирует синтаксическим деревом редактируемого кода на целевом языке (или неким к нему приближением), а редактор оперирует символами и строками.
Я отталкиваюсь от мысли, что vim и IDE — разные инструменты для разных задач. Совершенно разных и, более того, не пересекающихся задач.
IDE
Задача IDE — разработка программы на одном из языков программирования. Чем лучше IDE «понимает» язык программирования, тем более полезные функции она может предложить разработчику. Начиная от самых элементарных — подсветка синтаксиса, и заканчивая наиболее продвинутыми — подсветка потенциальных ошибок и рефакторинг.
Как пример можно рассмотреть проект Roslyn и Visual Studio. Про него можно прочитать в одной старой статье — Введение в Microsoft «Roslyn» CTP.
В прошлом наши компиляторы работали как черные ящики — вы подаёте на вход исходный текст программы, а на выходе получаете сборку. Все знания и информация, которую формирует компилятор выбрасывается и недоступны для чьего-либо использования.Как пишет Soma в своём блоге, часть Visual Studio language team работает на проектом, который называется Roslyn. Его главная цель — переписать компиляторы C# и VB и создать языкове сервисы в управляемом коде. С чистым, современным и управляемым кодом наша команда сможет быть более продуктивной, внедрять инновации быстрее и выдавать больше возможностей скорее и с лучшим качеством.
Более того, мы открываем компиляторы C# и VB со всей их внутренней информацией, делая доступным для вас анализ кода. Мы предоставляем публичное API и обеспечиваем точки расширения в языковых сервисах C# и VB.
Это открывает новые возможности для расширений VisualStudio — написание мощных инструментов рефакторинга и утилит языкового анализа, а так же позволит любому использовать наши парсеры, семантические движки, генераторы кода и сценариев в своих проложениях.
Если кратко, то Roslyn — проект, дающий API для компилятора. И это позволяет IDE «понимать» язык программирования так же хорошо, как это делает компилятор.
Vim
Задача vim — редактирование текста. Все. Точка. Серьезно. И сейчас я поясню, что имею ввиду.
Основная «фишка» vim’a — «понимание» элементов текста: слово, строка, предложение, абзац и т.д. Vim на самом низком, простом уровне заточен под работу с текстом. Просто попробуйте поработать в vim без дополнений и даже без подсветки синтаксиса. Уверяю, это будет незабываемый опыт.
Кажется, что-то подобное звучало и в вебинаре Hexlet про vim: www.youtube.com/watch? v=79OWQ1qJwto.
Но в этом же кроется и основная трудность освоения vim — вам приходится думать в терминах, в которых работает vim. Для IDE это не проблема — мы изучаем язык программирования, мы работаем в тех же терминах, что и IDE. Для vim это не очевидно. У меня ушло некоторое время для того, чтобы поменять свои мысленные направляющие. Раньше я думал:
Надо перейти к этой строчке или к этому месту в коде. И мышкой ставил курсор в нужное место. Теперь это выглядит чуть по-другому:
Надо перейти к этой строчке. Хм… К ближайшей сточке с объявлением публичного метода. /public
Удалить три слова 3dw
Все это выглядит достаточно неудобно на первом этапе, но потом позволяет делать сложные вещи относительно простыми действиями. Например, если у меня есть лог, я могу одной командой удалить все строки, в которых нет слова «Exception».
Кроме того, это позволяет использовать систему макросов, которые работают в терминах элементов текста и получаются более гибкими.
Можно еще много написать про возможности, но это статья не про «плюсы» vim’a, поэтому перехожу к заключению.
Вместе
У читателя наверняка родился вопрос:, а зачем же тогда все эти плагины для vim? Если это не его задача?
Плагины для имитации разных функций IDE — это попытка объединить два инструмента. Точно так же как и плагины для IDE, имитирующие работу в vim.
Вы можете пойти трудным путем и попытаться сделать IDE из vim’a. Можете пойти более простым путем и добавить часть возможностей vim’a в свою любимую IDE. Или можете пойти самым простым путем — не использовать vim. Использование vim дает дополнительный «режим» работы — когда с кодом удобнее работать как с простым текстом.
Выводы
Я хотел подчеркнуть, что IDE и vim — это разные инструменты для разных задач, и их противостояние заключается лишь в том, что нет идеального варианта интегрировать эти два инструмента.
На мой взгляд, лучшим решением было бы, если бы IDE и редактор текста были бы отдельными модулями, взаимодействующими через некое API (как это сделано между IDE и компилятором Roslyn). Чтобы в IDE можно было бы встроить любой редактор, наиболее подходящий для работы с текстом.
Комментарии (12)
6 июля 2016 в 10:54
+1↑
↓
> Удалить три слова 3dw
проблема в том, что удаляете вы не слова, а термы языка, и как то не комильфо смешивать 2 разных парадигмы.
Вам просто повезло что 3 слова в редакторе = 3 термам языка. Попробуйте редактировать код на брайнфаке. Я думаю IDE и для него можно сделать с подсветкой :)6 июля 2016 в 11:28
0↑
↓
Просто уже давно есть IDE, в которые отлично интегрирован vim (например, Qt Creator). Хочешь юзай, хочешь нет.6 июля 2016 в 12:12
–3↑
↓
Единственная IDE операционная система, в которую отлично интегрирован vim — это emacs. Все остальное — жалкие подделки.6 июля 2016 в 14:18
+1↑
↓
Я пробовал — «жалкое подобие левой руки».6 июля 2016 в 14:23 (комментарий был изменён)
0↑
↓
Дополню себя — я говорил об Evil (an extensible vi layer for Emacs). Это самый полный из эмуляторов вима, который я видел. Я бы сказал, что они близок процентов на 98 к оригиналу.Таким образом можно получить редактор, совмещающий лучшее из двух миров. Emacs добавляет:
— расширяемость на стероидах (привет elisp вместо vim script)
— асинхронность
— org-modeИз минусов я бы назвал долгое время старта. Однако это не важно в случае, если редактор используется только на одном компьютере.
Для желающих почитать/посмотреть на темуhttps://www.youtube.com/watch? v=JWD1Fpdd4Pc
http://blog.aaronbieber.com/2015/01/17/learning-to-love-emacs.html
http://juanjoalvarez.net/es/detail/2014/sep/19/vim-emacsevil-chaotic-migration-guide/Если лень копать конфиг, можно посмотреть на готовую сборку.
6 июля 2016 в 11:54
0↑
↓
> На мой взгляд, лучшим решением было бы, если бы IDE и редактор текста были бы отдельными модулями, взаимодействующими через некое API (как это сделано между IDE и компилятором Roslyn). Чтобы в IDE можно было бы встроить любой редактор, наиболее подходящий для работы с текстом.eclim примерно это и делает. Хотя тот еще франкенштейн.
6 июля 2016 в 12:11
+2↑
↓
Вот правильное завершение холивара) Конечно, он не завершится, но очень сильный аргумент в нём.6 июля 2016 в 15:41
0↑
↓
Под очень сильным аргументом вы подразумиваете то, что автор перепутал «задачу редактора» и «все есть из коробки»?
6 июля 2016 в 12:25
+1↑
↓
vim прекрасно справляется и с подсветкой синтаксиса и с подсветкой синтаксических ошибок. Писать код с использованием vim вполне себе нормальное занятие, и чаще это просто дело привычки.Однако vim это действительно не IDE: vim не знает ничего кроме синтаксиса, и понятия не имеет, например о содержимом структур данных и классов, и соответственно не в состоянии валидировать семантику. Современная IDE должна уметь это делать, и должна определять доступность классов и объектов в контексте редактируемого кода. Да почему современная? Древние Borland-овский Turbo Pascal и Turbo C из конца 80-х прошлого века умели это делать. vim не умеет. А также не забываем о сторонних фреймворках используемых в Вашем проекте, знания о которых у vim просто быть не может.
Для небольших проектов (до 10–15 фалов), я например, продолжаю использовать vim, т.к. вполне в состоянии удержать информацию такого объёма в голове. И в таком случае продуктивность использования vim выше чем IDE. Как только объём информации необходимой для работы с кодом становится таким, что я начинаю забывать детали реализации в каком либо из классов, или суммарная информация о проекте не умещается в моей голове, я перевожу проект на любимую IDE (NetBeans).
6 июля 2016 в 13:44
0↑
↓
Современные IDE, к примеру QtCreator 4, студии под рукой нет, к сожалению, но думаю и там тоже, умеют делать такие трюки, как выведение типа auto для С++, хотелось бы посмотреть на плагин к текстовому редактору, который это сумеет :)6 июля 2016 в 15:10
–1↑
↓
неужели нельзя сделать аналогичный плагин на основе какого нибудь llvm?6 июля 2016 в 15:19
0↑
↓
YouCompleteMe использует clang для автокомплита. И так же поддерживает clang CompilationDatabase