AutoInsertMode

A mode that comes with Emacs that automagically inserts text into new buffers based on file extension or the major mode. See GIT:autoinsert.el

For those of you annoyed by the “Copyright (C) YEAR Free Software Foundation, Inc.” that’s inserted by default into EmacsLisp buffers, set your ORGANIZATION environment variable.

Use it by running ‘M-x auto-insert-mode’. Or manually insert new text in files with ‘M-x auto-insert’. Try it with an elisp file, for example. The result is quite impressive: The entire GPL notice will be inserted for you.

A common way to configure what should be inserted for a type of file is by adding a skeleton to the ‘auto-insert-alist’. The syntax is based on SkeletonMode.

Here is a skeleton for a C++ file that you can try by EvaluatingExpressions or by adding to you InitFile.

(eval-after-load 'autoinsert
  '(define-auto-insert
     '("\\.\\(CC?\\|cc\\|cxx\\|cpp\\|c++\\)\\'" . "C++ skeleton")
     '("Short description: "
       "/*" \n
       (file-name-nondirectory (buffer-file-name))
       " -- " str \n
       " */" > \n \n
       "#include <iostream>" \n \n
       "using namespace std;" \n \n
       "main()" \n
       "{" \n
       > _ \n
       "}" > \n)))

Auto Insert will insert the following (where the | is point).

/*
  foo.cc -- Description of Foo.
*/

#include <iostream>

using namespace std;

main()
{
  |
}

Here’s another skeleton, but for a C source file that you can try by EvaluatingExpressions or by adding to you InitFile.

(eval-after-load 'autoinsert
  '(define-auto-insert '("\\.c\\'" . "C skeleton")
     '(
       "Short description: "
       "/**\n * "
       (file-name-nondirectory (buffer-file-name))
       " -- " str \n
       " *" \n
       " * Written on " (format-time-string "%A, %e %B %Y.") \n
       " */" > \n \n
       "#include <stdio.h>" \n
       "#include \""
       (file-name-sans-extension
        (file-name-nondirectory (buffer-file-name)))
       ".h\"" \n \n
       "int main()" \n
       "{" > \n
       > _ \n
       "}" > \n)))

Auto Insert will insert the following (where the | is point).

/**
 * foo.c -- Description of Foo
 *
 * Written on Tuesday, 21 August 2012.
 */

#include <stdio.h>
#include "foo.h"

int main()
{
  |
}

Here’s a skeleton for a Perl file that you can try by EvaluatingExpressions or by adding to you InitFile.

(eval-after-load 'autoinsert
  '(define-auto-insert '(perl-mode . "Perl skeleton")
     '("Description: "
       "#!/usr/bin/env perl" \n
       \n
       "use strict;" \n
       "use warnings;" \n \n
       _ \n \n
       "__END__" "\n\n"
       "=head1 NAME" "\n\n"
       str "\n\n"
       "=head1 SYNOPSIS" "\n\n\n"
       "=head1 DESCRIPTION" "\n\n\n"
       "=head1 COPYRIGHT" "\n\n"
       "Copyright (c) " (substring (current-time-string) -4) " "
       (getenv "ORGANIZATION") | (progn user-full-name) "\n\n"
       "This library is free software; you can redistribute it and/or" "\n"
       "modify it under the same terms as Perl itself." "\n\n"
       "=cut" "\n")))

Auto Insert will insert the following (where the | is point).

#!/usr/bin/env perl

use strict;
use warnings;

|

__END__

=head1 NAME

Description of Foo

=head1 SYNOPSIS


=head1 DESCRIPTION


=head1 COPYRIGHT

Copyright (c) <year> <name of author>

This library is free software; you can redistribute it and/or
modify it under the same terms as Perl itself.

=cut

Another way of using autoinsert is to define files that contain the stuff to be inserted and connect them with a filename extension:

    (auto-insert-mode)  ;;; Adds hook to find-files-hook
    (setq auto-insert-directory "~/.mytemplates/") ;;; Or use custom, *NOTE* Trailing slash important
    (setq auto-insert-query nil) ;;; If you don't want to be prompted before insertion
    (define-auto-insert "\.py" "my-python-template.py")
    (define-auto-insert "\.php" "my-php-template.php")

I use Yasnippet for initial skeletons:

    (defun my/autoinsert-yas-expand()
      "Replace text in yasnippet template."
      (yas/expand-snippet (buffer-string) (point-min) (point-max)))
    (custom-set-variables
     '(auto-insert 'other)
     '(auto-insert-directory "~/autoinsert/")
     '(auto-insert-alist '((("\\.\\([Hh]\\|hh\\|hpp\\)\\'" . "C / C++ header") . ["template.h" c++-mode my/autoinsert-yas-expand])
                           (("\\.\\([C]\\|cc\\|cpp\\)\\'" . "C++ source") . ["template.cc" my/autoinsert-yas-expand])
                           (("\\.sh\\'" . "Shell script") . ["template.sh" my/autoinsert-yas-expand])
                           (("\\.el\\'" . "Emacs Lisp") . ["template.el" my/autoinsert-yas-expand])
                           (("\\.pl\\'" . "Perl script") . ["template.pl" my/autoinsert-yas-expand])
                           (("\\.pm\\'" . "Perl module") . ["template.pm" my/autoinsert-yas-expand])
                           (("\\.py\\'" . "Python script") . ["template.py" my/autoinsert-yas-expand])
                           (("[mM]akefile\\'" . "Makefile") . ["Makefile" my/autoinsert-yas-expand])
                           (("\\.tex\\'" . "TeX/LaTeX") . ["template.tex" my/autoinsert-yas-expand]))))

OlafDietsche

See also


CategoryTemplates CategoryCode