[Из песочницы] Vim и IDE — это разные вещи

Увидел очередную статью про vim и IDE и решил поделиться своими мыслями — вдруг кому-то покажутся полезными, чем черт не шутит?…

По сути, статья будет развернутым пояснением идеи, высказанной другим пользователем в комментарии к статье «VIM: зачем, если есть IDE, и как?».

Принципиально IDE от редактора отличается тем, что IDE оперирует синтаксическим деревом редактируемого кода на целевом языке (или неким к нему приближением), а редактор оперирует символами и строками.

Я отталкиваюсь от мысли, что vim и IDE — разные инструменты для разных задач. Совершенно разных и, более того, не пересекающихся задач.

IDE


Задача IDE — разработка программы на одном из языков программирования. Чем лучше IDE «понимает» язык программирования, тем более полезные функции она может предложить разработчику. Начиная от самых элементарных — подсветка синтаксиса, и заканчивая наиболее продвинутыми — подсветка потенциальных ошибок и рефакторинг.

Как пример можно рассмотреть проект Roslyn и Visual Studio. Про него можно прочитать в одной старой статье — Введение в Microsoft «Roslyn» CTP.

Цитата из статьи Введение в 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

© Habrahabr.ru