TextMate

Useful TextMate Snippets for Drupal

I took a few minutes this evening to whip up some TextMate snippets that I think will be useful for Drupal development. They're nothing fancy, and certainly not as ambitious as Steven Witten's kitchen sink approach, but I think it'll simplify one of the most repetitive tasks I usually find myself in when writing a new module.

These snippets all use TextMate's built-in tab stop handling, which allows you to quickly insert the snippet and then just tab through all the relevant places where you'd need to change something. Give it a try - especially with the .module file snippet.

Initial setup

  1. Open up TextMate
  2. Go to the Bundle Editor (Bundles -> Bundle Editor -> Show Bundle Editor, or ctrl+option+cmd+b)
  3. Add a new bundle and call it "Drupal"
  4. From here out, each snippet can be added by choosing "New Snippet"

The .info file

I called this one "Module info file" and gave it the tab trigger drupmod_info. I haven't figured out how to get this one to actually render via a tab trigger, but it's easy enough to just navigate to the Drupal bundle and choose the snippet.

; \$Id\$
name = "${1:Example module}"
description = "${2:Example module description}"
dependencies = $0

The .module file

This snippet uses TextMate's variable mirroring to let you quickly rename all the hooks in the snippet with the first tab stop. I used the hooks below because most of my modules implement these hooks. Just follow the pattern for naming, etc. to add your preferred hooks.

I called this one "Module general hooks" and assigned it the tab trigger drupmod_m.

<?php
// \$Id\$

/**
 * Implementation of hook_perm
 */

function ${1:example}_perm() {
  return array(
    '${2:example permission}',
  );
}


/**
 * Implementation of hook_menu
 */

function ${1:example}_menu($may_cache) {
  $items = array();

  if ($may_cache) {
    $items[] = array(
      'path' => 'admin/settings/${1:example}',
      'title' => t('${3:Example}'),
      'callback' => 'drupal_get_form',
      'callback arguments' => array('${1:example}_admin_form'),
      'access' => user_access('administer site configuration'),
    );
  }

  return $items;
}


/**
 * Menu callback - Admin settings form.
 */

function ${1:example}_admin_form() {
  $form = array();
  return system_settings_form($form);
}


/**
 * Implementation of hook_form_alter
 */

function ${1:example}_form_alter($form_id, &$form) {
  switch ($form_id) {
    // Alter node edit form
    case $form['type']['#value'] .'_node_form':
    break;
  }
}


/**
 * Implementation of hook_nodeapi
 */

function ${1:example}_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
  switch ($op) {
    case 'delete':
    break;

    case 'insert':
    break;

    case 'load':
    break;

    case 'submit':
    break;

    case 'update':
    break;

    case 'view':
    break;
  }
}

The .install file

This one is pretty similar to the .module file, but I tried to make sure it handled some common uninstall tasks I usually forget to tackle until I absolutely have to.

I called this one "Module install hooks" and assigned it the tab trigger drupmod_i.

<?php
// \$Id\$

/**
 * Implementation of hook_install
 */

function ${1:example}_install() {
  switch ($GLOBALS['db_type']) {
    case 'mysqli':
    case 'mysql':
      db_query("CREATE TABLE IF NOT EXISTS {${1:example}} (
        id int unsigned NOT NULL auto_increment,
        field varchar(128) NOT NULL default ''
        PRIMARY KEY (id),
      ) /*!40100 DEFAULT CHARACTER SET utf8 */;"
);
    break;
  }
}


/**
 * Implementation of hook_uninstall
 */

function ${1:example}_uninstall() {
  db_query("DROP TABLE {${1:example}}");
  $variables = db_query("SELECT name FROM {variable} WHERE name LIKE '${1:example}%%'");
  while ($variable = db_fetch_object($variables)) {
    variable_del($variable->name);
  }
}

Syndicate content