Sublime Text 2 как IDE для STM32

Уже несколько месяцев прошло, как я писал топик-ссылку про относительно новый текстовый редактор Sublime Text 2 (далее — ST). Первое впечатление от него — что это гламурный продвинутый блокнот, даже себя процитирую: "Это просто продвинутый блокнот, а не какая-нибудь IDE". Тред там развернулся неслабый.

Но я ошибался, и рад этому. Его можно и нужно использовать как IDE, в полном смысле этого слова: парсинг, контекстное автодополнение, сборка, прошивка, отладка. Всё это доступно, и я расскажу как. Только один нюанс: я использую Ubuntu, так что пользователям Windows придётся переложить всё на свой лад.


Инструментарий

Для начала надо научиться собирать проекты, используя имеющийся инструментарий. Так что затариваемся всем, что понадобится:
  1. cmake, make. Последний есть у любого линуксоида, да и cmake скорее всего тоже. Но не помешает проверить
  2. git. Можно и без него, но с ним удобнее.
  3. Тулчейн. Я использовал Sourcery CodeBench Lite Edition. Качаем с сайта разработчика. Лучше скачать не дистрибутив, а архив, распаковать как есть и положить в каталог, доступный для записи. Путь к нему запомнить, или записать на бумажке и съесть
  4. Стандартная библиотека периферии. Ну уж это должно у вас быть, если что — качается с сайта ST. Так же распаковываем архив не меняя структуру каталогов, складываем в укромное место, путь помним.
  5. Проект stlink, если будете прошивать через DISCOVERY. Взять можно тут, там подробная инструкция по сборке, или найти бинарник. Собственно один он нам и нужен. Так же не устанавливаем его, а складываем в укромное место.
  6. Проект stm32-cmake, за который огромное спасибо товарищу Kosyak , который написал статью про использование CMake и GCC для программирования STM32. Проект берём тут, распаковываем и складываем аналогично.
  7. И виновник торжества — Sublime Text 2, который забираем с официального сайта. Ставить не спешим, отложим в сторонку


Теперь нам надо подготовить stm32-cmake, т.е. собрать и установить библиотеки. Там же, на гитхабе, есть инструкция, что надо делать. В кратце:


cd /путь/к/stm32-cmake/cmsis
cmake -DCMAKE_TOOLCHAIN_FILE=../gcc_stm32.cmake -DCMAKE_INSTALL_PREFIX=/путь/к/тулчейну/arm-none-eabi/ -DCMAKE_BUILD_TYPE=Release
make && make install
cd /путь/к/stm32-cmake/stdperiph
cmake -DCMAKE_TOOLCHAIN_FILE=../gcc_stm32.cmake -DCMAKE_INSTALL_PREFIX=/путь/к/тулчейну/arm-none-eabi/ -DCMAKE_BUILD_TYPE=Release
make && make install


Сборка

По идее всё готово, можно проверить, как работает сборка. Для этого копируем из stm32-cmake папку с примером, например stm32-blinky (это программа мигания светодиодом), куда-нибудь, переходим в этот каталог и выполняем:
cmake -DSTM32_CHIP_TYPE=MD_VL -DCMAKE_TOOLCHAIN_FILE=/путь/к/stm32-cmake/gcc_stm32.cmake -DCMAKE_BUILD_TYPE=Debug .

где STM32_CHIP_TYPE — тип линейки МК:
  • HD — High Density MCUs
  • HD_VL — High Density Value Line MCUs
  • MD — Medium Density MCUs
  • MD_VL — Medium Density Value Line MCUs
  • LD — Low Density MCUs
  • LD_VL — Low Density Value Line MCUs
  • CL — Connectivity Line MCUs
  • XL — XL Density MCUs
CMAKE_TOOLCHAIN_FILE — путь к файлу gcc_stm32.cmake (с настройками тулчейна для cmake)
Внимательнее с точкой в конце команды: она означает искать исходники в текущем каталоге, иначе вместо неё надо указать путь к каталогу с исходниками.

Если появились ошибки — анализируем, но на этом этапе всё должно работать нормально, во всяком случае я граблей не обнаружил. Ну а если отработало без ошибок, в каталоге с исходниками появится Makefile. Он-то нам и нужен. Теперь достаточно просто выполнить make в каталоге с ним, как проект соберётся, и мы увидим файл имя_проекта.elf. Если нужен бинарник или HEX, то после делаем make имя_проекта.bin или make имя_проекта.hex

Но не всё так просто. Дело в том, что в примере уже создан корректный CMakeLists.txt, а для нового проекта его придётся написать самому, используя шаблон. Так же меняются параметры cmake в зависимости от типа сборки или линейки МК. В процессе ковыряния всего этого дела и прикрутке его к нашему Sublime Text меня это так задолбало, что я решил упростить жизнь себе и вам, написав интерактивный скрипт. Он задаёт вопросы, после создаёт каталог с проектом, а в нём уже готовые и настроенные файлы.

Скрипт берём тут, редактируем его. В самом начале надо задать несколько переменных. Это пути к библиотеке, к тулчейну, тип МК, память и т.д. В основном они задают дефолтные значения, т.е. можно пропустить потом эти вопросы, но пути надо указать в любом случае. Кроме корректных параметров сборки, скрипт еще создаёт проект для Sublime Text, который вручную с первого раза настроить довольно проблематично. Запускаем, отвечаем на вопросы (если переменные нормально настроили, надо будет только задать имя проекта, и потыкать Enter'ом. Хотя и имя можно использовать дефолтное).
Скрипт общается на русском, кому не нравится — переводите сами.

Настройка Sublime Text

Добрались и до него. Распаковываем, запускаем



На первый взгляд действительно обычный текстовый редактор. «В чём сила, брат? Сила — в плагинах!»

Что нам потребуется: это плагин SublimeClang — парсер языка C/C++/ObjC/ObjC++ и SublimeGDB — плагин для работы с одноимённым дебаггером. Как устанавливать плагины? Легко! У него даже есть собственный пакетный менеджер! Его-то и поставим. Для этого откроем консоль (не системную, а консоль ST, открывается на Ctrl+` ). Копипастим туда это:

import urllib2,os; pf='Package Control.sublime-package'; ipp=sublime.installed_packages_path(); os.makedirs(ipp) if not os.path.exists(ipp) else None; urllib2.install_opener(urllib2.build_opener(urllib2.ProxyHandler())); open(os.path.join(ipp,pf),'wb').write(urllib2.urlopen('http://sublime.wbond.net/'+pf.replace(' ','%20')).read()); print 'Please restart Sublime Text to finish installation'

Смотрим в статус-бар, ждём. Да, нужно соединение с сетью, он всё скачивает сам. Как отработает, нажимаем Ctrl+Shift+P — своеобразная командная строка, пишем в поиске install (должно всплыть Package Control: Install Package), выбираем, подгрузится репозиторий с плагинами, в строке поиска пишем SublimeClang, выбираем, ждём загрузки.

После установки SublimeClang он отказывается работать — выскакивает сообщение, что он запущен, но не работает. Может у вас заработает, но у меня на двух машинах с Ubuntu 10.04 и Ubuntu 12.04 не вышло. Что-то с версиями Python. Хотя гугл быстро подсказал решение, цитирую его сюда полностью:
Собрал Python2.6 с помощью PythonBrew:

curl -kL http://xrl.us/pythonbrewinstall | bash
source "$HOME/.pythonbrew/etc/bashrc"
pythonbrew install --configure="--enable-unicode=ucs4" 2.6

2. После этого создал символическую ссылку так:

sudo ln -s $HOME/.pythonbrew/pythons/Python-2.6/lib/python2.6/ /usr/lib/sublime-text-2/lib/python2.6
ln -s $HOME/.pythonbrew/pythons/Python-2.6/lib/python2.6/ <your Sublime Text 2 folder>/lib/python2.6


3. Поставил llvm-3.0-dev для libclang.so 4. Собрал libcache.so. Либо скачать с оф. сайта, либо по инструкции:

mkdir -p .config/sublime-text-2/Packages/SublimeClang/src/build/
cd .config/sublime-text-2/Packages/SublimeClang/src/build/
cmake ..
make

После тупого выполнения этих команд Python пересобирается, и создаётся ссылка в папку установки программы в /lib/python2.6. Перезапускаем Sublime, сообщения об ошибке быть не должно.

Конечно первым делом хочется испытать, что и как тут работает. Открываем main.c, и видим, что ни один идентификатор не опознан, всё выделяется красным. Происходит это потому, что парсеру надо передать те же настойки, что и настоящему компилятору, которым будет собираться проект. Например пути поиска (он же не знает, где наши инклуды. Компилятор берёт их и Makefile, туда они попадают из конфигурации cmake и т.д.). Так же некоторые дефайны, например -DSTM32F10X_MD_VL, иначе он не распарсит stm32f10x.h (там затычка с ошибкой).



Всё это лучше сделать в настройках проекта. Открываем меню Project -> Save project as и сохраняем. Потом Project -> Add Folder to Project — можно добавить каталог с проектом. Теперь открываем сам файл проекта на редактирование Project -> Edit Project.
Видим следующее

{
	"folders":
	[
		{
			"path": "/home/ploop/tmp"
		}
	]
}

Туда можно добавить конфиг парсера, и он будет относиться к конкретному проекту. Пример можно посмотреть в общем конфиге — Ctrl+Shift+P — clang — выбираем Preferences: SublimeClang settings default — откроется файл с дефолтными настройками, там полно комментариев. В общем случае это будет выглядеть так:

{
    "folders":
    [
        {
      "path": "."
        }
    ],
"build_systems":
    [
        {
            "name": "ARM build",
            "cmd": ["make"],
            "working_dir": "${project_path}/src/"
        },
        {
            "name": "ARM hex",
            "cmd": ["make", "project1.hex"],
            "working_dir": "${project_path}/src/"
        },
        {
            "name": "ARM bin",
            "cmd": ["make", "project1.bin"],
            "working_dir": "${project_path}/src/"
        }

    ],

  "settings":
       {
           "sublimeclang_options":
           [
               "-std=c++11",
               "-Wall",
               "-I/home/ploop/projects/STM/stm32f10x/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/",
               "-I/home/ploop/projects/STM/stm32f10x/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc/",
               "-I/home/ploop/projects/STM/stm32f10x/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport/",
               "-I${folder:${project_path:project1.sublime-project}}/src",
               "-DSTM32F10X_MD",
               "-DUSE_STDPERIPH_DRIVER"
           ]
       }
}

Понятно, что прописывать всё это вручную при создании проекта не очень интересно, да еще и с CMakeLists.txt возиться, поэтому я и взялся за скрипт. Короче скрипт уже должен был создать файл .sublime-project в каталоге с проектом, уже со всеми настройками. Можно открыть его и подредактировать в случае необходимости.

Обратите внимание на секцию build_systems. Это настройки сборки. Каждый такой блок добавляет в меню Tools -> Build systems новый пункт, выбрав который можно запустить сборку по хоткею Ctrl+B. Пункты говорят сами за себя. По сути туда прописать можно что угодно.

Выбираем в меню ARM build, нажимаем Ctrl+B и имеем свежий эльф, который хоть сейчас заливай в МК. Но просто залить неинтересно, нам бы по брекпойнтам попрыгать…

Отладка


Уже понятно, что за отладку отвечает плагин SublimeGDB, который должен быть уже установлен. Но и тут без граблей не обошлось. Я убил сутки, чтобы его запустить, так и не удалось. Уже стал грешить на плагин, полез на гитхаб искать форки, их нашлось штук 20, ничем примечательным они не отличались, по описанию тупо копии. Единственное, в рейтингах у всех было ноль звёзд, от силы одна, а у одного из них — 52!

Интуиция не подвела: он заработал сразу! Берём его тут, распаковываем, удаляем всё содержимое из папки старого плагина (~/.config/sublime-text-2/Packages/SublimeGDB/) и копируем туда новые файлы. Sublime я даже не перезапускал, после удаления он сообщил, что плагин исчез, после копирования тут же увидел его и предложил запустить. Умный, зараза.

Настраивается он проще, чтом Clang. Надо в проект в секцию Settings добавить пару строк:
"sublimegdb_workingdir": "${folder:${project_path:project1.sublime-project}}/src/",
"sublimegdb_commandline": "/путь/к/тулчейну/arm-none-eabi-gdb --interpreter=mi -command=${project_path:gdbcommands}",

и создать файл команд дебаггера в каталоге с проектом (или любом другом, но указать его в параметре -command= что выше)
tar ext :4242
file /путь/к/бинарнику.elf
load /путь/к/бинарнику.elf

Первая команда говорит дебаггеру, чтобы тот соединился с сервером удалённой отладки на локалхосте на порте 4242, остальные указывают на наш бинарник. Настройки внутри файла проекта и файл с командами мой скрипт так же формирует, чтобы не париться.

После того, как всё создано, можно приступить к отладке. Для этого подключаем девайсы к компьютеру (программатор st-link и целевой МК), запускаем утилиту stlink (с параметром -1 если у вас st-link версии 1, или без параметров, если V2), смотрим на консоль, чтобы она соединилась с железом и начала слушать порт 4242. Если будут какие-то проблем с USB или определением девайса, советую посмотреть этот блог, там коротко и ясно описано, как его завести под линуксами.

Далее — в Sublime ставим брекпойнты (доступны из меню, хоткеи можно посмотреть на странице плагина или в настройках в папке плагина), нажимаем F5. При этом смотрим на консоль st-link'а в ожидании заветной надписи GDB connected
Плагин подвисает секунд на 5-7, затем открываются отладочные окна, метка ставится напротив строки с брекпойнтом, можно попрыгать по ним по F9-F10-F11, видно переменные, всё как обычно но не перегружено.

Работает довольно шустро. По ощущениям — скорость ограничена только SWD, а не мостроидальным интерфейсом, как в Eclipse, когда непонятно, то ли что связь тупит, то ли Eclipse не прорисовал свои рюшки. Досконально я с ним еще не разбирался, проверял на обычном мигающем светодиоде.

Вердикт


Вот такими возможностями обладают «гламурные блокнотики». Коенчно, не без плясок с бубнами, но работает. Но всё-таки основная фишка Sublime — редактор, от которого просто прёт! Даже с дефолтными настройками.
Сделать на основе всего этого сборку для AVR тоже не составит труда, вот с отладкой не знаю как, не интересовался.

Всё вышепроделанное мной конечно не вариант для нормальной работы, единственный верный вариант — написать свой плагин. Но на изучение Python'а времени пока нет.
  • +5
  • 28 августа 2012, 11:02
  • ploop

Комментарии (128)

RSS свернуть / развернуть
Кейл все равно круче всех :) Ты из какой либо другой IDE можешь на лету через JTAG/SWD править настройки тактового генератора? Настраивать порты, а потом смотреть что получилось?
0
Кейл все равно круче всех
Но редактор у него убог :)
Если тулченовский GDB позволяет такие фичи, что это вполне можно реализовать в плагине. Я так глубоко не копал.
0
Редактор как редактор. Код можно и в блокноте писать, а отладочные фичи это мега тру. Насчет GDB не знаю, но вот CoIDE такое, например, не умеет. Она в лучшем случае покажет тебе регистры. Сиди там и надрачивай биты А вот чтобы так:

расписать чет я там ничего похожего не нашел. Раскурить бы еще как в Keil логический анализатор внутренний включить…
0
Ээээ… Ну да, красиво, спору нет. Только эта тулза мне сильно напомнила ST-шную Peripheral Library — буковок много, а по сути бесполезно ибо не решает главной задачи — создать уровень абстракции для упрощения жизни программиста. IMHO, нормальная либа делает все эти красивые картинки ненужными или, как минимум, крайне редко используемыми.
0
А почему возникла ассоциация с именно Peripheral Library?
Мне эта тулза скорее напомнила что-то вроде ST-шного бесполезного MicroXplorer, или скорее даже Clock Tool.
+1
Только не надо путать. Это не настройка-визард. Это непосредственное управление реалтайм. Например, можно нажирать буфер отладочных данных, а потом нажать паузу, вручную настроить DMA и скормить его чере UART наружу, а прога будет спокойненько стоять себе на паузе. Отладка с такими штуками вообще кайф.
0
Это я понимаю, не путаю. Сравнение чисто на уровне ассоциации с внешним видом.
0
А почему возникла ассоциация с именно Peripheral Library?
Такой же низкий уровень.
0
«Нормальная либа» суть сферический конь в вакууме. Либо она будет всепоглощающей, но жирной и тормозной, либо узкоспециализированной с допиливанием на месте под задачу.

А сие средства кела не замена либе, а возможность быстро найти нужное, не глядя в мануал вообще, понять, что происходит и на лету поправить, поглядеть как будет работать дальше.
0
«Нормальная либа» суть сферический конь в вакууме. Либо она будет всепоглощающей, но жирной и тормозной, либо узкоспециализированной с допиливанием на месте под задачу.
Допиливать придется по любому. Что же до тормозов, то правильное применение плюсовых темплейтов позволяет получать код который не уступает ползанию по регистрам руками. Достаточно посмотреть либы камрада neiver , что бы убедиться, что это вполне реально.
А сие средства кела не замена либе, а возможность быстро найти нужное, не глядя в мануал вообще, понять, что происходит и на лету поправить, поглядеть как будет работать дальше.
Если в рантайме поковырять, то да, штука полезная.
0
Ну Вы погорячились насчет CoIDE. В режиме отладки тоже можно все посмотреть и изменить, но конечно не так красиво как в Keil. Screen сделан не в режиме отладки так как под рукой нет отладчика а эмулятора в CoIDE нету :(
0
Там GDB? Значит всё самое необходимое есть. А красивости они конечно хорошо, но стоят дорого…
0
Ну, дык ничего сложного там нет, в GDB можно изменит значение паями в любой момент.

(gdb) set {int}0xAAAA = 1


Можно менять значение любого регистра конфигурации периферии.

З.Ы. Я тут начал писать статью для сообщества по командам GDB, но что-то у меня процесс затянулся :)
0
Давай-давай, может совместными усилиями что-нибудь родим! Вон, Kosyak как помог с cmake'ом.
0
Это режим отладки или просто визард?
0
Это визард. В режиме отладки также видно значения регистров и есть возможность их изменять. Если необходимо, то где то после 19:00 выставлю скрины в режиме отладки.
0
Если можно, тоже посмотреть хочется.
0
Как говорят — «Обещанного три года ждут». Выкладываю скрины CoIDE в режиме отладки, и скрин детального просмотра одного из регистров модуля тактовой частоты. Все значения которые с атрибутом R/W можно менять.
Вообще эта IDE меня привлекла несколькими вещами:
1. Простота в использовании (никаких сто тысяч опций). Просто понятно = надежно
2. Основана на Eclipse. Что не говорите но это не VIM. Я уважаю VIM но здравый смысл должен побеждать. Кто хоть раз правил код в средах с подобным функционалом меня поймут, всем остальным — я пользовался VIM а Вы пользовались Eclipse?
3. Добавление библиотек одним кликом.
В общем — Welcome in XXI century господа!
Джерело: CoIDE

Джерело: CoIDE
0
Вот как выглядит отладка в sublime: dl.dropbox.com/u/22991016/images/GDBRegisters.png
0
А регистры периферии можно так же увидеть?
0
Не знаю. По дефолту так, возможно стоит настройки поковырять.
0
А что за регистры f0-f7 и fps? По ARM7 я их не помню…
0
А кортексы и ARM7 разве одно и то же?
0
Нет. Кортексы — ARMv7, ARM7 — ARMv4 или ARMv5 (вроде разные варианты ARM7 относятся к разным поколениям архитектуры). Я более-менее знаком только с ядром и ассемблером ARM7TDMI, увы.
0
Хитро (а нужно?). Спасибо за информацию, будем иметь в виду. =)
0
Но редактор таки аппетитный. После Code Warrior, с которым в последнее время очень много имею общих дел, вообще…
0
Редактор суперский! Да и для сборки отлично подходит (парсер нормально работает). Дебаг глубоко не ковырял, но переменные посмотреть, пошагать можно.
0
В общем, как я вчера ни игрался, а даже после пересборки Python Clang работать наотрез отказался. Хотя у меня тоже Ubuntu 12.04. Или я что-то не так делаю, или не совсем универсален такой метод… Кстати, подобные жалобы вчера в сети тоже встречал.
0
Создал ссылку в папке, где установлен Sublimе на Python?
Должна быть ссылка в lib на /home/user/.pythonbrew/pythons/Python-2.6/lib/python2.6/
0
Вот так:
ln -s $HOME/.pythonbrew/pythons/Python-2.6/lib/python2.6/ <your Sublime Text 2 folder>/lib/python2.6

<your Sublime Text 2 folder> заменишь на путь до Sublime
0
да, все четко по инструкции, без самодеятельности.
Снес и перераспаковал sublime text, проделал все заново, теперь при запуске вылетает окошко «It looks like libcache.so couldn't be loaded. On Linux you have to compile it yourself.» Жесть какая-то. =))
0
Не знаю, у меня с первого раза получилось…
0
Ну, теперь у меня и pythonbrew обвалился и не поднимается. Дохимичился. :D
О, опыт — сын ошибок трудных. Ладно, буду ставить убунту на стационар и пробовать заново. Есть догадки, где нахомутал.
0
Не знаю, с чем конкретно была связана неудача при первой попытке, но прошлой ночью парсер нормально запустился (с сопутствующими, конечно, плясками, связанными с установкой недостающих пакетов и утилит, но все же). Подозреваю, что в первый раз:
1. Либо криво пересобрался python;
2. Либо нахомутал с символической ссылкой;
3. Либо провтыкал важный warning в терминале, вследствие чего не собрался/не был установлен какой-либо пакет.
Кстати, касательно двухоконных файловых менеджеров: Krusader в упор отказывается видеть бинарник sublime_text, если в названии папки, его содержащей, присутствуют пробелы (а именно в таком виде она распаковывается по дефолту: «Sublime Text 2»). Пришлось переименовать в «sublime-text-2».
Такие дела…
0
Кстати я сразу переименовал в «SublimeText2», т.к. обжигался. В некоторых скриптах или в чём-то еще могут быть неэкранированные пути (криворукость писателей, но всё же), тогда его хрен запустишь.
0
Прикольно. Надо будет поиграться.
0
  • avatar
  • evsi
  • 28 августа 2012, 11:28
Тупо использую Keil, Visual Studio и J-Link
Keil Logic Analyzer описан в подборностях на сайте и в Help. Удобный.
0
  • avatar
  • x893
  • 28 августа 2012, 11:55
Под линуксом?
0
Под Windows
0
И я про то :)
0
Да мне без разницы какая OS — главное что бы удобнее было. Компьютеров/мониторв как грязи — хоть 5 систем поставить можно — а голова/глаза/руки пока тяжело масштабируются.
0
vim — наше все!
0
  • avatar
  • bzzz
  • 28 августа 2012, 16:36
Ваше видимо точно=)
0
и мое и многих моих коллег ;)

$ find. -type f -name "*.[ch]"|xargs cat |wc -l
888242
0
Сорсы ядра подсчитали? :)
0
нет, в ядре значительно больше.
0
В подкаталог зашли? :)
0
Да, на лыжах и в гамаке это довольно забавно. Некоторое время.
+1
и таких очень много… наверное все такие тупые, что десятилетиями пользуются гамаком вместо хорошего текстового редактора.
0
Да, я в курсе, что миллион леммингов не может ошибаться :)
+1
проще простого — всех записать в лемминги, а самому назваться д'артаньяном.
0
Проще простого это записать леммингов во «все», как это сделали вы. Пользователи (тем более фаны) vim отнюдь не «все», даже не большинство.
0
После освоения вим отлично подходит для правки шелл-скриптов, документов в техе и еще кое-чего. Для программирования-- ннннет, все-таки нет.
0
еще оттачивай скилзы ;) нормально подходит, устриц еМ.
0
еще оттачивай скилзы ;)
Зачем?
0
Аналогичные впечатления.
0
я не очень дискусси понимаю — каждый пользуется тем чем хочет. Человек написал — спасибо ему. Он же не говорит, что все должны этим пользоваться. Зачем писать, что vim, eclipse, keil, etc. лучше?
+5
  • avatar
  • x893
  • 28 августа 2012, 17:14
чтобы молодые не кидались на новомодные инструменты которым только предстоит доказать свою жизнеспособность, чтобы расширяли кругозор, обращали внимание на классические инструменты.
0
Меня очень сложно отнести к молодым. Но я совершенно уверен, что никто из молодежи совершенно не пострадает от отсутствия знаний об этом «классическом» инструменте. Да, по необходимости я vi пользую и, вобщем, не испытываю дискомфорта. Но пользоваться им постоянно, тем более для написания кода я стану только от очень большой нужды. И уж тем более не стану его рекомендовать молодежи.

P.S. из «классического» в нем, разве что, пример того, каким вычурным может быть стиль мышления другого человека…
0
для меня это означает, что ты не потрудился, осваивая vim (не путай с vi, ты очень вряд-ли его видел). это очень удобный и человечный редактор. нужно только хорошо разобраться с правилами и мнемониками.
0
для меня это означает, что ты не потрудился, осваивая vim
Это ничем не обоснованное утверждение. Как раз тогда, когда я начинал его изучать (лет 15 назад), это потребовало изрядных усилий.
VIM - Vi IMproved
version 7.3.35
by Bram Moolenaar et al.

Этот?
нужно только хорошо разобраться с правилами и мнемониками.
Есть масса других инструментов, которые кроют vim как бык овцу (во всяком случае для моих задач) и при этом не требуют выноса мозга для того, что бы научиться ими пользоваться.
0
ничего личного, но за 15 лет его можно было освоить по самое нихочу ;)

и да, хороший инструмент тем и отличается, что его нужно изучать.
0
ничего личного, но за 15 лет его можно было освоить по самое нихочу ;)
Я написал: «я vi пользую и, вобщем, не испытываю дискомфорта». Ничего личного, но на курсы внимательного чтения вам сходить явно стоит :)
и да, хороший инструмент тем и отличается, что его нужно изучать.
Сколько волка не корми, а у слона все равно толще. Так и тут — как vim не изучай, но для моих задач ему не тягаться с другими инструментами.
0
Я бы наверно пострадал от незнания.
0
никто из молодежи совершенно не пострадает от отсутствия знаний об этом «классическом» инструменте.

Ну почему же :) Я знаю случай, когда незнание vi стоило человеку должности.

Он запустил vi на локальной консоли FreeBSD и не мог из него (редактора) выйти :) Переключится в другую виртуальную консоль и убить оттуда процесс он не додумался (или не знал о такой возможности). В результате, дабы скрыть следы преступления, он решил перезагрузить сервер кнопочкой reset …

Так что vi знать нужно. Но вполне можно ограничиться знанием команды «:q!» :)
0
* Чтобы выйти из vi, нужно нажать «ESC (можно использовать Ctrl+[ или Ctrl+C) :q!». Все изменения будут утеряны. Или ESC и ZQ если не нужно сохранять или ZZ если нужно. Либо вообще в другой консоли набрать «kill −9 `ps -ef | awk '/vi/ {print $2}'`»
* Это единственное, что нормальному человеку вообще стóит знать о vi.
+1
esc,:wq
0
kill −9 `ps -ef | awk '/vi/ {print $2}'`
Это мощно :)
0
Если бы молодые «не кидались на новомодные» инструменты, то мы до сих пор бы корякались с перфокартами=) На счет хорошего инструмента, то я считаю, что он не обязательно должен быть таким сложным, чтобы его «за 15 лет его можно было освоить по самое нихочу»…
+1
Без холивара, но тут точно перебор с VIM!)
0
Vim реально удобный.
Вовсе он не сложный и научиться не долго — есть такая отличная штука для обучения как
vimtutor, поставляется вместе с вимом.
Честно говоря сложно представить задачу по работе с текстом которую нельзя было бы легко выполнить при помощи vim'a.

Связки gcc, vim, make, openocd вполне достаточно для полноценной разработки ПО под армы и другие МК, ИМХО.
А все эти IDE от лукавого :)
+1
А все эти IDE от лукавого :)
Да-да, давайте писать софт так, как писали 20-30-50 лет назад. Вот это было труЪ, верно? :)
+1
Что за предубеждение такое, что vim что-то неудобное древнее и т.д.
Причем тут «труЪ»? Мне удобно, вас использовать не заставляю.
0
Что за предубеждение такое, что vim что-то неудобное древнее и т.д.
Это не предубеждение, а знание того, что могут современные IDE, а главное — почему они это могут. Как редактор не допиливай плагинами, он этого сделать не сможет просто потому, что он в принципе иначе устроен.
0
Связки gcc, vim, make, openocd вполне достаточно для полноценной разработки ПО
Согласен. Для разработки под AVR я вполне использовал gedit и компилятор gavrasm. Без отладок и всего прочего. Даже ошибки искал по номерам строк. По 4 кб «нетто» кода — легко.
А спорим, что без компилятора даже обойдусь, прямо в hex-файл забью код мигалки?

Я ничего против vim не имею. Знаю его достаточно, чтобы свободно редактировать текст, не более. Но это не значит, что поковырять что-то новое и неизвестное для себя (cmake например, gdb и прочее, с чем не сталкивался) есть пустая трата времени.
0
ploop,

Ковырять, что-то, новое и незивестное это, по-моему, точно не есть пустая трата времени.
Тем мне и нравится мир СПО что все можно пощупать, попробовать по-разному, подобрать удобный для себя инструмент.
Решить можно любую задачу, а не ограничиваться тем что заложили разработчики IDE и других подобных программ-комбайнов.

У меня вот есть желание освоить cmake, да что-то все руки не доходят. Makefile'ы пишу вручную.
0
Vim реально удобный.

А чем он удобный, какие преимущества? Я не тролю, мне действительно интересно услышать вше мнение. Я, честно говоря, абсолютно не вижу этого удобства.

Вовсе он не сложный и научиться не долго — есть такая отличная штука для обучения как vimtutor, поставляется вместе с вимом.

ИМХО, сомнительный довод в пользу vim, если «научится не долго» и для обучения создали специальную программу.
+1
А чем он удобный, какие преимущества?

Тем, что редактор, а не блокнот с единственным режимом вставки текста. То есть своими командными режимами. Но это не всем нравиться, так же как и gui vs. cli.
0
Тем, что редактор, а не блокнот с единственным режимом вставки текста.
Это давно уже не достижение.
0
Извините, но это не ответ. Это абстрактные размышления о преимуществе одного подхода над другим.

Мне интересно (действительно интересно, не тролинга ради) услышать конкретные доводы: этот редактор позволяет сделать {название фичи}, а этот нет. Или: в этом редакторе “A” сделать {название функции} проще и быстрее чем в «B».
0
Не знаю у кого преимущество, мне просто удобнее нажать / для поиска чем ходить по меню, :w newname чтобы сохранить в другой файл и т.д.

Из «фич» пользуюсь только метками, макросами, быстрыми переходами на строки, скобки, отдельные символы, все не вспомнишь. Про плагины и такие обычные возможности как спеллчек не говорю, здесь наверно все почти как у всех.

При работе с огромной горой кода (больше и запутанней чем ведро) есть недостатки, но они не так сильны, чтобы отказаться от vim. Если речь идет о C/C++, с другими особо не работал.
0
Достаточно один раз попользоваться нормальной навигацией по коду, что бы больше никогда не хотеть работать с кодом в обычном (пусть и навернутом) редакторе. А нормальная навигация невозможна без достаточно глубокого парсинга кода. С плюсами и С ситуация еще тяжелее, поскольку, помимо и так не сильно простого синтаксиса, есть еще препроцессор и код (помимо прочих граблей) может разворачиваться сильно по разном, в зависимости от активных дефайнов. Замечу, что навигация это только одна из фич нормальных IDE. Помимо нее есть еще рефакторинг, который требует еще более глубокого парсинга и знаний о языке, с которым идет работа, куда бОльших, чем может обеспечить самый навороченный редактор с плагинами. Так что подобные холивары типа «vim vs everything else» ничуть не напоминают gui vs cli. Речь уже идет не о стиле работы, а о том, насколько инструмент в состоянии помочь разработчику.

P.S. предваряя возможные возражения IDE-хейтеров добавлю — нормальная IDE совершенно спокойно сосуществует со средствами автоматизации сборки типа make, maven, etc.
0
У вима просто очень свой подход к редактированию текста. Его нужно принять в первую очередь, а все эти команды и хоткеи приложатся сами.

Другой вопрос, что не всем это надо и не у всех прокатывает.
0
есть такая отличная штука для обучения как vimtutor

Есть более приятный туториал в виде игры.
0
Связки gcc, vim, make, openocd вполне достаточно для полноценной разработки ПО

Если Вы сидите на хосте с отладчиком по ssh. Или если у Вам религия не позволяет поставить оконный менеджер. Или если у Вас нет мыши. Или если у Вас болезнь, при которой не воспринимается информация в графическом виде. В остальных случаях есть более приятные альтернативы описанной связке со значительно меньшим порогом вхождения.
+3
Полностью согласен. Хотя тут этому товарющю много кто пытался донести другую точку зрения… Но как видимо известного известное исправит=)
0
ошибки: Pithon->Python
0
Ctrl+F выдаёт только одно слово «Pithon» на странице: в вашем посте :)
0
в тексте вообще страшный зверь Phiton :)
0
А, такой имелся. Но я его победил! :)
0
Значит ошибка уже исправлена(ваш кэп) =)
0
Не, там действительно было не Pithon, а Phiton. Последнюю исправил :)
0
Вот так:
ln -s $HOME/.pythonbrew/pythons/Python-2.6/lib/python2.6/ <your Sublime Text 2 folder>/lib/python2.6
0
сорри, промахнулся…
0
Как только в IDE по правой кнопке мыши на имени функции будет пункт Find All References — я тут же ею воспользуюсь (про eclipse писать не надо и VS тоже)
0
  • avatar
  • x893
  • 28 августа 2012, 20:29
Как только в IDE по правой кнопке мыши на имени функции будет пункт Find All References — я тут же ею воспользуюсь (про eclipse писать не надо и VS тоже)
А почему об эклипсе писать не надо? Потому, что в нем это есть?
0
В eclipse не видел. Про eclipse просто писать не надо. :) Никак
+1
В eclipse не видел.
RMB->References, а там на вкус — Workspace/Project/Working set. Отдельно есть аналогичный пункт для объявление — Declarations->Workspace/Project/Working set. Замечу, что по References выбираются именно ссылки на идентификатор, а не все текстовые вхождения.
0
kdevelop? Но мало кто про такие знает. Тем более под винду его нет. Он кстати тоже неплохо подходит для разработки под арм. А его парсер/анализатор C/C++ вообще замечателен.
0
Чем устраивать холиворы, лучше бы кто-нибудь рассказал, как к кейлу прикрутить другой текстовый редактор.
Например, чтобы текст можно было редактировать в саблайме, там же чтобы была кнопочка или команда — компилировать и отладить. А уж по нажатию кнопочки фокус ввода переключался бы в сам кейл. Или чтобы внутри кейла был другой редактор…
Да еще и под винду :)
0
Саблайм с плагином Clang. Пишем текст, проверка синтаксиса есть. Если кейл умеет обновлять на лету изменённый файл, то после написания просто переключаемся на него и дебажим.
0
Это я уже и так практикую. Не удобно каждый раз переключать окна, соглашаться с загрузкой измененного файла, жмакать кнопку компиляции. Хочется одну кнопку в самом саблайме, связанную с действием в кейле.
0
Пипл, а можно настроить контекстный поиск? Например ткнул в функцию, а в меню пунктик есть «перейти к определению».
0
Есть. Только не ткнул, а выделил. Перейти к определению (тут он нашарит хидер) или к применению. Не найдет в открытом исходнике — вежливо спросит, а не пошарить ли по всему проекту. После разрешения откроет исходник, в котором объявлена функция и ее найдет.
В общем, лично я доволен. Удобных фишек, присущих современным нормальным средам, полно.
0
Нужно пакет добавить или из коробки умеет? Что-то натйи не могу…
0
Если стоит SublimeClang — то ищет во всех файлах, добавленных в опцию "-I". Если нет, то ищет только в текущем файле своими средствами, и то не определение как таковое, а первое вхождение слова в тексте.
0
2ploop, а как называется шрифт на скриншотах?
0
Стандартный убунтовский monospace
0
Размер десятый, если что :)
0
окей, спасибо)
0
у меня вываливает кучу ошибок на CMSIS'овские файлы типа
lib/CMSIS/Core/CM3/system_stm32f10x.h:52,14 - Error - reference to 'uint32_t' is ambiguous

не было у вас такого?

Инклюды такие
"-IC:\\Program Files (x86)\\CodeSourcery\\Sourcery G++ Lite\\arm-none-eabi\\include",
"-I${folder:${project_path:stm32_cpp_test.sublime-project}}/lib/CMSIS/CM3/DeviceSupport/ST/STM32F10x/",
"-I${folder:${project_path:stm32_cpp_test.sublime-project}}/lib/CMSIS/CM3/CoreSupport/",
"-I${folder:${project_path:stm32_cpp_test.sublime-project}}/lib/CMSIS/Core/CM3/",
"-I${folder:${project_path:stm32_cpp_test.sublime-project}}/lib/spd/inc/",
"-I${folder:${project_path:stm32_cpp_test.sublime-project}}/",
0
вроде починилось добавлением
"-D__GNUC__",
"-D_GCC_LIMITS_H_",

в конфиг Шланга
0
reference is ambiguous означает, что проинклудил два раза. Он не понимает, какой именно использовать.

Нет, у меня такого не было.
0
А не могли бы добрые люди показать конфиги для WinAVR-20100110? Не могу понять ход мыслей плагина и как ему правильно задать все координаты, явки и пароли. Нужно под WinXP. Вываливаются кучи ошибок парсинга, начиная с элементарного: Error — unknown type name 'uint8_t'.
И ещё, когда задал в «build_systems» команды сборки, то откуда их вызывать-то?
0
  • avatar
  • uni
  • 05 декабря 2012, 19:13
Сам себе отвечу:

"sublimeclang_options":
[
   "-std=c++11",
   "-Wall",
   "-Wno-attributes",
   "-Wno-#warnings",
   "-Wno-invalid-source-encoding",
   "-IC:\\WinAVR-20100110\\avr\\include",
   "-IC:\\WinAVR-20100110\\avr\\include\\util",
   "-IC:\\WinAVR-20100110\\avr\\include\\compat",
   "-IC:\\WinAVR-20100110\\avr\\include\\avr",
   "-D__GNUC__",
   "-D_GCC_LIMITS_H_",
   "-I${folder:${project_path:Tetris.sublime-project}}/"
]

Это помогает избавиться почти от всего, кроме парсинга ассемблера: "Error — invalid output constraint '=w' in asm"
Эта ошибка на стандартный заголовочник: C:\WinAVR-20100110\avr\include\util\delay_basic.h
Тут я уже сдаюсь. Ну и какой стандарт C++ указать тоже не очень ясно, если пишешь на avr-gcc с плюсами.
0
Хм, странно, не могу воспроизвести Вашу проблему.
А вы точно используете WinAVR-20100110. Дело в том, что в данной сборке поставляется GCC 4.3.3

C:\Utils\WinAVR-20100110\bin>avr-gcc.exe --version
avr-gcc.exe (WinAVR 20100110) 4.3.3


Он не знает о стандарте c++11, максимум c++0х. По идее, с такими ключами как у Вас код не должен собираться на данной сборке:

C:\Utils\WinAVR-20100110\bin>avr-gcc.exe  -c -IC:\Utils\WinAVR-20100110\avr\include\util\  -Wall  -std=c++11 test.cpp
cc1plus.exe: error: unrecognized command line option "-std=c++11"
0
ИМХО, ели у Вас компилятор не ругается на ключ -std=c++11, то есть подозрение, что среда вызывает какой-то другой GCC компилятор, и этим объясняется ошибка в ассемблерной вставке.
0
Например, похожая ошибка вылазит, если попробовать скомпилировать AVR-овский код компилятором для ARM от CodeBench:

C:\Utils\CodeBench\bin>arm-none-eabi-gcc.exe  -c -IC:\Utils\WinAVR-20100110\avr\include\util\  -Wall  -std=c++11 test.cpp
In file included from test.cpp:1:0:
C:\Utils\WinAVR-20100110\avr\include\util/delay_basic.h: In function 'int main(int, char**)':
C:\Utils\WinAVR-20100110\avr\include\util/delay_basic.h:110:3: error: inconsistent operand constraints in an 'asm'
0
По моему, это ключи не GCC, а Clang. uni интересует, какие выбрать ключи, чтобы разбор клангом был предельно близок к разбору GCC, т.к. компилировать будет именно GCC, а разбор клангом нужен для работы кодонавигации и иже с ней.
0
Хм, возможно, я торможу (тяжелый выдался день). Но почему Вы думаете, что речь одет о Clang? Вроде изначально говорилось о GCC: «показать конфиги для WinAVR-20100110»…
0
Во первых, в статье говорится о основанном на кланге плагине кодонавигации.
Во вторых, блок конфига называется sublimeclang_options.
В третьих — так кажется телепатору)
0
Возможно, Вы правы. В пользу Вашей теории: uni явно определяет дефайн "-D__GNUC__", а для GCC, ЕМНИП, этот дефайн задан по умолчанию.

В любом случае, придёт — uni и расскажет, что он имел в виду.
0
Вообще Clang очень придирчив к синтаксису, там, где GCC выдаст варнинг, Clang может застрять. Может, конечно, надо получше раскурить его…
0
Мда, я действительно торможу) Ещё раз сопоставил статью с комментариями – Вы правы.
0
В общем и целом, тут нужно разделять парсер и компилятор, как было правильно замечено. Парсер используется для навигации по коду, ну а компилятор собирает проект. Соответственно, сборка проекта прописана в Makefile и имеет малое отношение к самому редактору.

Вот сам проект: mysvn.ru/avr/examples/Tetris/

Достаёте его такой командой:
svn export -r20 https://mysvn.ru/avr/examples/Tetris/

Сборку делаете такой:
C:\WinAVR-20100110\utils\bin\make.exe build all

Для сборки я использую такое описание секции настроек в Sublime Text 2:

	"build_systems":
    [
        {
            "name": "AVR build",
            "cmd": ["C:\\WinAVR-20100110\\utils\\bin\\make.exe", "build"],
            "working_dir": "${project_path}"
        },
        {
            "name": "AVR build all",
            "cmd": ["C:\\WinAVR-20100110\\utils\\bin\\make.exe", "build all"],
            "working_dir": "${project_path}"
        },
        {
            "name": "AVR clean",
            "cmd": ["C:\\WinAVR-20100110\\utils\\bin\\make.exe", "clean"],
            "working_dir": "${project_path}"
        }

    ],

Это появляется в Tools, но как это использовать я не понял. Как видно, я использую полные пути. Возможности плагина по парсингу не плохие, но ему, конечно, ещё далеко ещё до MSVS20xx, которые понимают проект в целом, а не частями. Например, там есть подсветка для веток препроцессора, а иерархия заголовочнных файлов воспринимается в целом и не нужно явно указывать откуда какие определения взяты, как для компилятора.

Так вот, иногда лень грузить студию, ибо она очень тяжела нынче стала, а хочется слегка что-то изменить, но чтобы это было более-менее осмысленно и цивилизовано. Notepad++ я освоил для этих целей, работает хорошо, а вот как даже сборку делать в ST2 я пока не понял. Нажимаю Ctrl+B и нулевой результат. Где-то туплю.
0
Да, я уже понял, что стромзил и речь шла о Clang.

Подозреваю, что в случае с Clang не получится корректно парсить инлайн асм вставки для AVR. Операнд «w», на который ругается Clang – это специфический операнд для AVR GCC (w — Special upper register pairs r24, r26, r28, r30). Clang (и версии GCC, не заточенные под AVR) о данном операнде ничего не знает.
0
Оставлю послание для тех, кто захочет прикрутить SublimeClang к ST3 уже в 2015 году.

SublimeClang, к сожалению, уже давно заброшен и через менеджер пакетов его не поставить. Поэтому делаем следующее:
1.Грузим содержимое репозитория Clang в папку, куда ставятся пакеты ST3.
— git clone --recursive github.com/quarnster/SublimeClang SublimeClang
— cd SublimeClang
— git pull && git submodule foreach --recursive git pull origin master

2. Грузим уже собранный пакет SublimeClang-1.0.41.sublime-package.
Переименовываем его в SublimeClang-1.0.41.zip, и вытаскиваем оттуда libclang.dll and libcache.dll или их 64 битные версии.

3.Копируем dll файлы в «SublimeClang\internals». Все должно заработать.

На win7 что 32, что 64 заработало сразу, а на win 8.1 не взлетело =( Для этого походу уже dll придется пересобирать. Вытащил libclang.dll из бинарников Clang for Windows (64bit) — навигация заработала, автодополнение нет.
Согласно этой инструкции пытался пересобрать dll. libclang.dll вроде скомпилился, а вторую dll не получается скомпилить (MSVS 12 использовал).
0
На Win 8.1 тоже решилась проблема — достаточно поставить 32 разрядный ST3 и соответсвенно подкинуть ему 32 разрядные dll.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.