Форум программистов, компьютерный форум, киберфорум
remarkes
Войти
Регистрация
Восстановить пароль
Рейтинг: 5.00. Голосов: 1.

IDE Geany: создание и работа со сниппетами (snippets)

Запись от remarkes размещена 28.09.2012 в 21:26
Обновил(-а) remarkes 15.05.2013 в 14:09 (в новой версии Geany произошли изменения)
Метки ide geany linux

IDE Geany — свободная кроссплатформенная среда разработки программного обеспечения. Geany переводится как "джинн" (из лампы, а не с тоником). При всей своей легкости и простоте, обладает достаточным функционалом и возможностью наращиваться - благодаря возможности подключения плагинов (как в браузере Firefox) и создания сниппетов. Вот, собственно о сниппетах и пойдет речь.
Как правило, Geany позиционируется как IDE для новичков, что правда, она действительно проста и легка в использовании. Некоторые правда тут же утверждают, что "только для новичков", вот этот миф я и попытаюсь развеять.
Сниппет (snippet) - в случае с Geany - это некоторый заранее заготовленный шаблон текста (кода) или команда в оболочке, которые вызываются ключевой фразой и нажатием клавиши Tab.
Допустим, вы пишете некоторую программу на языке Си и вводите "if" и нажимаете клавишу Tab.
Вам автоматически подставится текст:
C
1
2
3
if () {
    
}
Если вы наберете "for" и нажмете Tab, вам подставится текст:
C
1
2
3
for (i = 0; i < ; i++) {
    
}
Подобный функционал позволяет облегчить и ускорить работу пользователя по написанию кода.
По поводу вызова команд в оболочке расскажу ниже.
По-умолчанию количество сниппетов весьма ограничено, но их можно обогатить своими, создав шаблоны-сниппеты на все случаи жизни.

конфигурационный файл сниппетов snippets.conf
Общий файл конфигурации сниппетов называется snippets.conf и, например, в системе Debian/Ubuntu находится в каталоге:
Bash
1
/usr/share/geany/
В других системах он может находиться по адресу:
Bash
1
/usr/local/share/geany/
В Windows он находится по адресу:
Bash
1
C:\Program Files\Geany\data
Первоначально нам необходимо перенести общий файл к себе в домашний каталог, например, так:
Bash
1
cp /usr/share/geany/snippets.conf /home/$USER/.config/geany/
где "$USER" - имя вашего пользователя.
Таким образом, файл ваших личных сниппетов будет лежать по адресу:
Bash
1
/home/$USER/.config/geany/snippets.conf
Файл расположенный в вашем домашнем каталоге имеет приоритет перед общим файлом.


синтаксис файла snippets.conf


Согласно постулату UNIX-way "храните данные в простых текстовых файлах", все конфигурационные файлы в Geany - это простые текстовые файлы. Поэтому совершенно логично файл snippets.conf редактировать в самом Geany.
Определимся с понятиями:
ключ, key - это ключевое слово, вместо которого будет подставляться сниппет по нажатию клавиши Tab. Выше я уже приводил пример ключей if и for.
шаблон, value, сниппет - это собственно тот шаблон, который будет подставлен вместо ключа. Или команда, которая должна сработать вместо ключа.

В самом начале открытого нами файла snippets.conf мы увидим примерно на пол-странички небольшое руководство, как писать сниппеты. Я его переведу, с некоторыми своими изменениями и комментариями:

Цитата:
используйте \n или %newline% для создания переноса строки.
используйте \t или %ws% для создания отступа (табуляции), он будет заменен в соответствии с действующими в документе (имеется ввиду тот файл, из которого мы вызываем сниппет) настройками длины отступа.
используйте \s когда необходимо "насильно" вставить пробел вначале или в конце (сниппета) ('ключ= значение_сниппета' не работает, используйте 'ключ=\sзначение_сниппета').
используйте формат %имя_ключа% для использования "ключей" объявленных в разделе [Special].
используйте %cursor% чтобы указать, где курсор должен находится в шаблоне. Можете указать несколько курсоров и использовать комбинацию клавиш "Move cursor in snippet" ("Перемещать курсор в фрагменте"), чтобы перемещать курсор на следующую позицию в шаблоне.
Вы можете объявить раздел для любого поддерживаемого формата файла (языка программирования) отдельно. Делается это так (например, для языка C++):
[C++]
Раздел должен называться, как формат файла (и языка). Запустите "geany --ft-names" в командной строке, чтобы посмотреть весь список поддерживаемых языков.
Пользователи Linux, если вы запустите эту команду, вы не увидите например языка bash. Но увидите Sh. То есть раздел сниппетов для bash должен называться [Sh]
Кроме того, вы можете использовать специальные параметры (template wildcards), например: {developer}, {command:...} или {date} в ваших шаблонах.
Чтобы узнать больше деталей, читайте документацию (золотые слова).
Разделы сниппетов

  • Раздел [Default]
используется для всех типов файлов (в том числе для типа файлов "Пустой"). Его можно охарактеризовать как "общий". Сниппеты, записанные в этом разделе действительны для всех видов файлов.
  • - сниппеты раздела Special

Обратите внимание на вставки %brace_open% и %brace_close% в файле snippets.conf.
Это так сказать "сниппеты сниппетов". Они описываются в разделе [Special].
Например:
Bash
1
2
3
[Special]
brace_open=\n{\n\t
brace_close=}\n
Таким образом, в разделе Special мы можем наделать части сниппетов и потом их использовать в разных частях других сниппетов.
  • Сниппеты раздела Special не могут быть вызваны из файлов.
  • Сниппеты раздела Special не могут вкладываться один в другой.
То есть нельзя написать нечто:
Bash
1
2
3
4
[Special]
braces=%brace_open%\n%brace_close%
brace_open=\n{\n\t
brace_close=}\n
  • - Разделы отдельных языков

Если нам необходима различная реализация для отдельных языков, нам необходимо написать сниппет в конкретном разделе. Например, разный for для языка bash (shell), C++ и PHP, при этом отличающийся от сниппета по-умолчанию, необходимо написать так:
Bash
1
2
3
4
5
6
7
8
[Sh]
for_bash=for (( i = 0; i < %cursor%; i++ )); do\n\t%cursor%\ndone\n%cursor%
 
[C++]
for=for (int i = 0; i < %cursor%; i++)%brace_open%\n%brace_close%
 
[PHP]
for=for ($i = 0; $i < %cursor%; $i++)%brace_open%\n%brace_close%
  • - использование курсора (установка горячих клавиш курсора)

Вставка %cursor% позволяет указать, где курсор будет находится при вызове шаблона. Нет нужды перемещать курсор кнопками вправо-влево, достаточно указать несколько "курсоров" и после перемещаться с помощью комбинации клавиш "Перемещать курсор в фрагменте". Устанавливаются комбинации клавиш в меню Правка -> Настройки (Ctrl+Alt+P) -> вкладка "Привязки" -> вкладка "Редактор" -> "Перемещать курсор в фрагменте". У меня, например, установлена комбинация Alt+W

примеры и полезности
Расскажу несколько полезных на мой взгляд своих сниппетов.

в разделе [Default]
Bash
1
snip={command: geany "/home/user/.config/geany/snippets.conf"}
открывает файл с конфигом сниппетов
Как только меня осенит мысль придумать/изменить сниппет, я набираю snip (и нажимаю Tab) и открывается вкладка с моими сниппетами. В приведенной команде "user" - соответственно - имя вашего пользователя.

Bash
1
2
3
4
5
6
7
    #~ Скобки
f=%cursor%{%cursor%}%cursor%
k=[ $%cursor% ]%cursor%
r=( %cursor% )%cursor%
    #~ двойные скобки
kk=[[ $%cursor% ]]%cursor%
rr=(( %cursor% ))%cursor%
Написание скобок с точки зрения эргономики пользователя трудоемкое занятие: необходимо удерживать Shift и нажимать соответствующую клавишу. Подобные сниппеты решают эту проблему.

в разделе [Sh]
Bash
1
2
3
4
5
    #~ комментарии
#~ c - английская
c=%_Bash_comment%
#~ c - русская
с=%_Bash_comment%
в разделе [Special] соответственно прописал
Bash
1
_Bash_comment=%cursor%#~ %cursor%
Данный сниппет вставляет комментарий, отличие его от комбинации Ctrl+E в том, что этот комментарий можно (и удобно) ставить справа от кода. Дублирование английской "c" и русской "с" позволяет мне не задумываться о раскладке. Отсюда, кстати, делаем вывод: сниппеты можно писать на русском. Хотя большей нужды в этом, кроме комментариев я пока не знаю.

Это сниппеты "для ленивых"
Bash
1
2
ec=echo $%cursor%\n
ex=exit 0\n
  • Блоки:
Bash
1
2
3
4
5
6
7
8
9
10
11
12
#~ условие
if=if [ $%cursor% ]; then\n\t%cursor%\nfi\n%cursor%
#~ цикл for
for=for (( i = 0; i < %cursor%; i++ )); do\n\t%cursor%\ndone\n%cursor%
#~ цикл for in
forin=for %cursor% in $%cursor%; do\n\t%cursor%\ndone\n%cursor%
#~ цикл while
while=while (( %cursor% )); do\n\t%cursor%\ndone\n%cursor%
#~ ветвление
case=case $%cursor% in\n[%cursor%] ) %cursor%;;\nesac\n%cursor%
#~ сниппет создающий функцию
fun=func_%cursor%() {\n\t%cursor%\n}\n\n%cursor%
  • Сниппеты массивов:
Bash
1
2
3
4
#~ массив
ar=${%cursor%[$%cursor%]}%cursor%
#~ размер массива
ara=${#%cursor%[@]}%cursor%
В bash очень неудобно печатать массивы, типичный массив выглядит это примерно так:
Bash
1
${array[$i]}
Размер массива пишется так:
Bash
1
${#array[@]}
где array - имя массива, i - индекс. Комбинации "ar" и "ara" - удобная замена этой громоздкой конструкции.
  • Сниппеты готовых конструкций утилит:
Bash
1
2
bc=#~ scale - точность, т.е. два знака после запятой\nvar%cursor%=$(echo "scale=2; $x/$y" | bc)%cursor%
awk=$( echo $string | awk -F - '{print $1}' )   #~ после -F стоит разделитель
Это своего рода и "напоминалка", как использовать утилиту, и типовая строка.
  • Редактирование файла-шаблона shell
Bash
1
template={command: geany /home/user/.config/geany/templates/files/bash.sh}
Это файл-шаблон, содержимое которого появляется при создании нового файла shell, то есть, когда мы выбираем "Файл" -> "Создать из шаблона" -> соответствующий шаблон
Свои шаблоны можно создать в каталоге /home/user/.config/geany/templates/files/
Это вовсе необязательно должны быть шаблоны просто "под язык". Это может быть конкретный типовой шаблон графического/консольного приложения, клиент/сервер и просто некоторого текста.

То же самое можно делать и для других языков, например Си
Bash
1
2
3
4
5
6
7
8
9
[C]
pfi=printf("%i%cursor%\\n", %cursor%);%cursor%
printf=printf("%s%cursor%\\n", %cursor%);
ex=exit(0);
    #~ комментарии
#~ c - английская
c=%cursor%/* %cursor% */%cursor%
#~ с - русская
с=%cursor%/* %cursor% */%cursor%
  • Раздел [Пустой]
Этот режим описывает файлы, которые неопределены Geany как файлы для какого-либо языка.
Может быть использован в качестве использования сниппетов для текстовых файлов, например, для файлов "txt".
Для таких файлов, как и для всех, также действуют сниппеты, объявленные в разделе [Default]
...и т.д.


использование команд


Возможность использования команд оболочки и запуск скриптов с помощью сниппетов позволяет существенно расширить функционал Geany, а также написать свои скрипты/программы.
Использование команд возможно с помощью специального параметра
Bash
1
{command: команда}
Параметр вызывает исполнение указанной команды, а ее выдача (stdout) вставляется в файл, из которого его вызвали.
Пример:
Bash
1
{command:uname -a}
Вернет в файл строку с данными о вашей системе
Bash
1
{command:ls}
Соответственно список файлов и каталогов
и т.д.
Собственно, в сниппетах выше я уже использовал специальный параметр command для открытия в Geany файла конфигурации сниппетов и файла-шаблона для bash.
Помимо этого есть и другие специальные параметры:
{filename}Имя текущего файла (без пути)
{project}Название проекта
{description}Описание проекта, если оно имеется
{developer}Имя разработчика
year 
date 
datetimeДата и время.Формат по умолчанию: DD.MM.YYYY HH:mm:ss ZZZZ.
переменные окружения GEANY_FILENAME, GEANY_FILETYPE
В вызываемую параметром {command:} программу передаются переменные окружения:
GEANY_FILENAME - полное имя файла, вызвавшего сниппет
GEANY_FILETYPE - тип файла, вызвавшего сниппет. Например, C, C++, PHP и т.д.
Таким образом, в программе с помощью этих переменных, мы можем обратиться с вызвавшему файлу и знаем его тип. Мы можем сделать этот файл исполняемым, запустить его, скомпилировать, подать на какой-нибудь фильтр (например, sort, sed, awk и т.д.), короче - сделать с ним, что захотим.

С помощью этих двух возможностей: использования команд, и передачи переменной с именем файла, мы с помощью Geany по сути можем делать все то, что может делать bash (та оболочка, которая установлена в сборках linux по-умолчанию).


примеры использования команд

В разделе [Default] можно создать такие строчки:
Bash
1
2
3
name={developer}
dt={date}
fn={filename}
Теперь при написании fn, сниппет будет возвращать имя текущего файла.


примеры скриптов
  • скрипт, форматирующий код в стиле kernel linux style
Создаем файл make_kr-style.sh с таким кодом:
код на bash

Bash
1
2
3
4
5
6
7
8
#!/bin/bash
 
#~ скрипт вызывается из Geany и меняет стиль форматирования кода
#~ вызвавшего его файла на стиль kernel linux style
 
indent -kr -i8 -ts8 -sob -l80 -ss -bs -linux "$GEANY_FILENAME"
echo $(basename "$GEANY_FILENAME") is converted. Reload it
exit 0


В файле snippets.conf в разделе [C] пишем:
Bash
1
style={command: /projects/bash/geany_scripts/make_kr-style.sh}
где /projects/bash/geany_scripts/ путь к каталогу со скриптами, которые вы будете использовать для Geany.
Даем ему право на исполнение:
Bash
1
chmod +x /projects/bash/geany_scripts/make_kr-style.sh
Теперь если написать в файле с кодом на языке C "style" и нажать Tab, скрипт отформатирует файл в соответствии со стандартами linux kernel style
Примечание: для этого необходимо установить утилиту indent. Например, в deb-ориентированных дистрибутивах это делается так:
Bash
1
sudo apt-get install indent -y
  • скрипт вызова мануала из Geany

Вообще-то в Geany есть мануалы, но никто не мешает нам посмотреть мануал в интернете. Например, если у вас нет локализованной версии (на русском), а на сайте opennet.ru она есть.
Для этого можно создать скрипт geany_man.sh с содержимым:
код на bash
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#!/bin/bash
 
#~ скрипт вызывается из Geany,
#~ предлагает ввести команду для манов и
#~ открывает в браузере подходящий ман из opennet.ru
 
declare -i num_of_man       #~ номер раздела мануала
declare command=""      #~ искомое слово для поиска в мануалах
 
if [ "$GEANY_FILETYPE" == "C" ] || [ "GEANY_FILETYPE" == "C++" ]; then
    num_of_man="3"      #~ если язык вызвавшего файла C/C++
else                #~ то вызываем раздел №3
    num_of_man="1"      #~ по-умолчанию раздел №1
fi
 
command=( $( zenity --entry \
--title="команда для ман" \
--text="введите команду для поиска в man:" \
--entry-text "" ) )
 
if ((${#command[@]} > 1)); then     #~ если пользователем
    num_of_man="${command[1]}"  #~ был введен раздел мана
fi
 
if [ "$command" != "" ]; then
    ( x-www-browser \
    "http://www.opennet.ru/man.shtml?topic=$command&category=$num_of_man&russian=0" 1>/dev/null) &
fi
exit 0
 
    #~ Примечание: разделы man
#~ 1    Пользовательские команды.
#~ 2    Системные вызовы, т.е. те, которые предоставляет ядро.
#~ 3    Подпрограммы ( библиотечные функции ).
#~ 4    Устройства ( файлы в каталоге /dev ).
#~ 5    Описания форматов файлов ( например /etc/passwd ).
#~ 6    Игры.
#~ 7    Разное.
#~ 8    Инструменты для системного администрирования (доступные только root'у ).
#~ 9    Другое.
#~ n    Новая документация.
#~ l    Локальная документация ( относится к данной системе ).

Даем право на исполнение, и создаем сниппет в разделе [Default], как описано выше.
Для работы скрипта необходима утилита zenity (для диалога с пользователем).

  • скрипт, выполняющий bash-команду и возвращающий в файл ответ
код на bash
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash
 
#~ скрипт вызывается из Geany, выполняет в bash команду и возвращает в файл ответ
 
#~ вводимая пользователем команда для исполнения
command=$( zenity --entry \
--title="bash" \
--text="введите команду для bash:" \
--entry-text "" )
 
if [ "$command" != "" ]; then   #~ если пользователь таки что-то ввел
    $command
fi
 
exit 0


Всем заинтересовавшимся скриптами для Geany, я предлагаю выкладывать здесь ваши скрипты.
Или просто можете предложить идею.


некоторые минусы Geany
  • не копирует/вырезает/вставляет при русской раскладке. Для решения этой проблемы, необходимо перейти в настройки клавиш (Настройки - Привязки) и переназначить вышеуказанные комбинации, включив русскую раскладку.

Резюме

Как видите, IDE Geany не такая простая, как кому-то может показаться на первый взгляд. В связке с другим ПО (gcc, gdb, bash/shell, Devhelp), она обладает достаточно мощными средствами, и при этом имеет потенциал к расширению.

PS: я планирую описать еще несколько статей по работе с Geany: работа с шаблонами, перемещение по интерфейсу, настройки и тонкости и т.д. Если возникнут вопросы и пожелания - пишите.
PSS: полную документацию на русском вы можете взять по адресу:
http://www.geany.org/manual/0.19_ru/index.html
О сниппетах и самой IDE Geany вы также можете прочитать в википедии:
http://ru.wikipedia.org/wiki/Snippet
http://ru.wikipedia.org/wiki/Geany
Размещено в Без категории
Показов 18774 Комментарии 5
Всего комментариев 5
Комментарии
  1. Старый комментарий
    [QUOTE]Допустим, вы пишете некоторую программу на языке Си и вводите "if" и нажимаете клавишу Tab.
    Вам автоматически подставится текст:
    [C]if () {

    }[/C][/QUOTE] просто [C]if () {
    }[/C] не соответствует правилам языка, придётся возвращаться в обе пары скобок, тратя на это в десятки раз больше времени, чем на набор самих скобок.
    Запись от размещена 29.09.2012 в 08:44
  2. Старый комментарий
    [QUOTE][C]for (i = 0; i < ; i++) {

    }[/C][/QUOTE]И с большинстве случаев придётся исправлять i на другие идентификаторы счётчиков и примерно в половине случаев переставлять ноль из присваивания в сравнение.
    Запись от размещена 29.09.2012 в 08:46
  3. Старый комментарий
    Цитата:
    Сообщение от taras atavin Просмотреть комментарий
    придётся возвращаться в обе пары скобок, тратя на это в десятки раз больше времени, чем на набор самих скобок.
    я видимо не совсем четко пояснил: курсор после срабатывания сниппета находится там, где вы ставите тег %cursor% в сниппете, перемещаться по ним можно с помощью установленной комбинации клавиш. При вызове if:
    C
    1
    2
    3
    
    if (курсор_изначально_находится_здесь) {
        а_потом_курсор_будет_находиться_здесь
    }а_потом_здесь
    В том-то и вся прелесть, что перемещаться с помощью курсорных клавиш не надо. Перемещать свое положение в сниппете лучше с помощью комбинации клавиш "Перемещать курсор в фрагменте" (поставить в настройках). Я поставил себе Alt+W, можно Alt+R, или Alt+E - короче что-то эргономичное, чтобы не убирать руки с клавиатуры.
    Запись от remarkes размещена 29.09.2012 в 09:28 remarkes вне форума
    Обновил(-а) remarkes 29.09.2012 в 09:48
  4. Старый комментарий
    Цитата:
    Сообщение от taras atavin Просмотреть комментарий
    придётся исправлять i
    никто не мешает создать свой сниппет без счетчиков или создать несколько "форов" с переменными i, j , k (например). Потом: for с i - это настолько типовой набор, что i - это первое, что приходит на ум, что туда поставить. С проблемой "подставить другую переменную" можно встретиться в случае вложенных циклов, а они встречаются реже, чем просто циклы.
    По моим наблюдениям самыми полезными сниппетами являются комментариев. Сниппет if еще удобен.
    В шелле также очень помогает сниппет создания массивов.
    Запись от remarkes размещена 29.09.2012 в 09:47 remarkes вне форума
  5. Старый комментарий
    А шаблоны (скелеты файлов) свои как создавать? Это вообще возможно?
    Запись от Igor-dis размещена 13.04.2016 в 19:37 Igor-dis вне форума
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru