Во время разработки часто приходится повторять ввод одних и тех же кусков кода. К примеру, писать if() или foreach(). Это интересно делать только первую тысячу раз, но затем начинает подташнивать. Чтобы избавить себя от мучений, можно использовать макросы. Они вставят код при нажатии комбинации клавиш.
Современные программы - это сотни тысяч строк кода. При таком количестве тяжело не устать от однообразия. То и дело приходится вводить на клавиатуре название одной и той же функции/класса в 30 символов в длину. Чтобы не уставать от разработки и сделать больше за один день, можно доверить макросам скучную рутину. Благо дело редактор Atom позволяет сделать это.
Сначала назначим макросы на комбинации клавиш. Открываем файл "keymap.cson", который находится в папке ".atom" в домашней директории. И в самый конец файла добавляем комбинации клавиш и название макросов, которые они будут вызывать.
'atom-text-editor':
'ctrl-shift-x': 'custom:insert-<??>'
'ctrl-shift-v': 'custom:insert-if'
'ctrl-shift-a': 'custom:insert-ifAdmin'
'ctrl-shift-w': 'custom:insert-printr'
'ctrl-shift-f': 'custom:insert-foreach'
'ctrl-shift-c': 'custom:insert-count'
'ctrl-shift-s': 'custom:insert-strlen'
'ctrl-shift-i': 'custom:insert-intvar'
'ctrl-alt-w': 'custom:insert-consolelog'
В этом списке сначала написана комбинация клавиш, которая вызывает макрос, к примеру, 'ctrl-shift-x'. А затем название макроса: 'insert-<??>'. Из названия можно догадаться, что комбинация клавиш 'ctrl-shift-x' вставляет четыре символа <??>, которые нужны для начала разработки на языке PHP. Вставлять эту конструкцию необходимо довольно часто, поэтому для неё был задан макрос.
Теперь добавим сами скрипты макросов с названиями, перечисленными выше. Для этого открываем файл "init.coffee" в той же папке ".atom" и добавляем в конец все макросы, описанные ниже:
ctrl+shift+x = <??>
Чтобы начать разработку на PHP необходимо вставить четыре символа <??>:
atom.commands.add 'atom-text-editor',
'custom:insert-<??>': ->
editor = atom.workspace.getActiveTextEditor()
editor?.insertText('<??>')
cursor = editor?.getLastCursor()
cursor?.moveLeft(2)
- этот макрос не только вставляет '<??>', но и переводит положение каретки (курсора) между знаками вопроса (это делает строчка "cursor?.moveLeft(2)"). Поэтому можно нажать кобинацию 'ctrl-shift-x' и сразу же набирать PHP код.
Почти все приведённые макросы обладают свойством перемещения курсора, чтобы минимизировать затраченное время.
Обратите внимание на отступы (пробелы) в начале строки. У второй строки только один отступ, а у третьей и последующих - два отступа. Логика как в язуке Python: если не сделать правильно отступы, то макрос не будет работать.
ctrl+shift+w = printr
Сделаем макрос для вывода PHP переменной внутри HTML тега <pre>:
atom.commands.add 'atom-text-editor',
'custom:insert-printr': ->
editor = atom.workspace.getActiveTextEditor()
clipboardText = atom.clipboard.read()
editor?.insertText("echo '<pre>' . print_r(#{clipboardText}) . '</pre>';")
Обратите внимание на #{clipboardText} - эта конструкция будет заменена на содержания буфера обмена. На практике это означает, что если необходимо вывести содержимое переменной $a, то копируем '$a' в буфер обмена, нажимаем комбинацию клавиш 'ctrl-shift-w' и на месте курсора макрос выдаёт строку:
echo '<pre>' . print_r($a) . '</pre>';
Можно скомбинировать два макроса - открытие <??> и вставка print_r(). Для этого необходимо зажать ctrl+shift, затем последовательно нажать клавиши c - w:
<?echo '<pre>' . print_r($a) . '</pre>';?>
При использовании макросов можно сэкономить много сил.
ctrl+shift+v = if
Следующий макрос вставляет конструкцию 'if(){}' и переводит курсор в положение между круглых скобок:
atom.commands.add 'atom-text-editor',
'custom:insert-if': ->
editor = atom.workspace.getActiveTextEditor()
editor?.insertText('if(){}')
cursor = editor?.getLastCursor()
cursor?.moveLeft(3)
Последняя строка cursor?.moveLeft(3) переводит курсор на 3 символа влево.
ctrl+shift+f = foreach
Макросы удобно делать со вставкой текста из буфера обмена. К примеру, если понадобилось обойти все элементы массива. Для этого копируем в буфер обмена переменную, которую поставим в функцию foreach() и выполняем макрос:
atom.commands.add 'atom-text-editor',
'custom:insert-foreach': ->
editor = atom.workspace.getActiveTextEditor()
clipboardText = atom.clipboard.read()
editor?.insertText("foreach(#{clipboardText} as $key => $el){}")
cursor = editor?.getLastCursor()
cursor?.moveLeft(1)
- если переменная в буфере обмена была "$a", то появится код:
foreach($a as $key => $el){}
- а курсор будет установлен между фигурными скобками {}. Удобно и быстро.
Далее рассмотрим макросы, которые работают в паре с 'if(){}'. После вставки 'if(){}' курсор переводится внутрь круглых скобок и можно вставить условие. Для этого тоже используются макросы.
ctrl+shift+a = ifAdmin
Макрос вставляет конструкцию для проверки доступа администратора на Битриксе '$USER->IsAuthorized() && CSite::InGroup(array(1))' :
atom.commands.add 'atom-text-editor',
'custom:insert-ifAdmin': ->
atom.workspace.getActiveTextEditor()?.insertText('$USER->IsAuthorized() && CSite::InGroup(array(1))')
- этот макрос использую в паре с макросом 'if(){}'. Нажимаю 'ctrl-shift-v' для вставки 'if(){}', затем 'a' (не отмуская 'ctrl-shift'). И появляется конструкция:
if($USER->IsAuthorized() && CSite::InGroup(array(1))){}
внутри этого условия можно вести разработку не опасаясь, что отладочную информацию увидят простые пользователи сайта. Руками я бы набивал эти символы несколько десятков секунд. Но с макросом это делается за секунду.
ctrl+shift+s = strlen
Макрос вставляет условие strlen(). Внутри круглых скобок вставляет содержимое буфера обмена:
atom.commands.add 'atom-text-editor',
'custom:insert-strlen': ->
editor = atom.workspace.getActiveTextEditor()
clipboardText = atom.clipboard.read()
editor?.insertText("strlen(#{clipboardText})")
Можно делать комбинации из трёх макросов, чтобы получить любые конструкции, к примеру, '<?if(strlen($a)){}?>'. Для этого вставляем символы '<??>', внутри них 'if(){}' с условием strlen(). В комбинация клавиш это выглядит так: зажимаем ctrl+shift и нажимаем последовательно x - v - s. Вся операция занимает меньше секунды и на месте курсора появляется конструкция:
<?if(strlen($a)){}?>
ctrl+shift+c = count
Проверка является ли переменная массивом и не является ли он пустым.
atom.commands.add 'atom-text-editor',
'custom:insert-count': ->
editor = atom.workspace.getActiveTextEditor()
clipboardText = atom.clipboard.read()
editor?.insertText("is_array(#{clipboardText}) && count(#{clipboardText})")
Если в буфере обмена переменная $a, то вставляет конструкцию:
is_array($a) && count($a)
Если прожать 'ctrl+shift' и затем последовательно v - c , то вставится
if(is_array($a) && count($a)){}
ctrl+shift+i = intvar
Макрос для приведения к типу integer.
atom.commands.add 'atom-text-editor',
'custom:insert-intvar': ->
editor = atom.workspace.getActiveTextEditor()
clipboardText = atom.clipboard.read()
editor?.insertText("#{clipboardText} = (int)#{clipboardText};")
Для его использования копируем в буфер обмена переменную, устанавливаем курсор в нужном месте и появляется конструкция:
$a = (int)$a;
ctrl+alt+w = console.log()
Комбинация для работы с JavaScript. Во время отладки часто приходится выводить значения переменных в консоль. Поэтому сделал такой бинд:
atom.commands.add 'atom-text-editor',
'custom:insert-consolelog': ->
editor = atom.workspace.getActiveTextEditor()
clipboardText = atom.clipboard.read()
editor?.insertText("console.log('#{clipboardText} = ' + #{clipboardText});")
Копируете в буфер обмена переменную, к примеру "а", жмёте ctrl-alt-w и вставляется конструкция:
console.log('a = ' + a);
P.S.
Пердыдущая статья рассказывает о том, как сделать разработку ещё приятнее с визуальной точки зрения: Редактор Atom. Изменить внешний вид
Сработало, спасибо. Но не совсем 🙂 Забиндил на некую кнопку некий текст, но он появляется в редакторе не сразу, а после закрытия/открытия Атома. Довольно странно.