я давно искал редактор способный удовлетворить мои скромные запросы в плане написания кода на языке C. Он должен:
работать в консоли;
быть по возможности максимально быстрым;
поддерживать подсветку синтаксиса;
иметь возможность навигации по исходному коду (переход к определению функций, отображение свойств объектов, и т.п.);
устанавливать закладки в тексте и перемещаться по ним;
отображать номера строк;
позволять удобно и интуитивно форматировать исходный код программы;
иметь привычное для меня сочетание клавиш, либо иметь возможность эти сочетания переопределить;
Таких редакторов не так уж и много - vim, emacs, motor и еще небольшая кучка разношерстых редакторов в стадии 0.0.7-pre-alfa. Первые два ну всем хороши, кроме одной небольшой, но существенной для меня детали - они весьма специфичны в плане сочетания клавиш, и поведения. Крайне досадно бывало после долгого сидения в vim портить текст редактируемый в far. Больше всего напрягали постоянные нажатия esc (на автомате после vim) в far-е которые рано или поздно приводили к тому, что набранный текст или попросту не сохраняется после очередного эскейпа или портится. И наоборот после far-а сложно было переключиться на набор текста в vim. Другими словами я получил кучу проблем вместо удовольствия от написания кода :)
Motor был всем хорош, но не держал юникод и существенное время не обновлялся (последняя овость на их сайте датировалась 2000-м годом). Промучившись с полгода я решил что не стоит пытаться научить старую собаку новым трюкам, нужно найти какую-то иной редактор более привычный для меня. Им как ни странно оказался встроенный редактор Миднайт коммандера. Ниже представлена одна из возможностей mc 4.7, а именно использование утилит ctags/etags совместно с mcedit для навигации по коду.
Навигация по коду
Подготовка
Поддержка данного функционала появилась в mcedit с версии 4.7.0-pre1.
Чтобы им воспользоваться необходимо проиндексировать каталог проектом с помощью утилиты ctags либо etags, для этого необходимо выполнить следующие команды:
$ cd /home/user/projects/myproj
$ find . -type f -name "*.[ch]" | etags -l c --declarations -
После завершения работы утилиты в корневом каталоге нашего проекта появится файл TAGS, который mcedit и будет использовать.
Ну вот практически и все что нужно сделать для того чтобы mcedit мог находить определение функций переменных или свойств исследуемого объекта.
Использование
Представим что нам необходимо определить место где находится определение свойства locked объекта edit в неком исходнике довольно большого проекта.
/* Succesful, so unlock both files */
if (different_filename) {
if (save_lock)
edit_unlock_file (exp);
if (edit->locked)
edit->locked = edit_unlock_file (edit->filename);
} else {
if (edit->locked || save_lock)
edit->locked = edit_unlock_file (edit->filename);
}
Для этого помещаем курсор в конец слова locked и нажимаем alt+enter, появляется список возможных вариантов, как на представленном ниже скриншоте
После выбора нужного варианта мы попадаем на строку с определением.
Чтобы вернуться к редактируемому файлу нужно нажать alt+'-', чтобы снова перейти к нужному определению необходимо нажать alt+'='