Homepage: https://www.gnu.org/software/emacs
Author: William F. Mann
Perl code editing commands for GNU Emacs
To enter `perl-mode' automatically, change the first line of your perl script to: #!/usr/bin/perl -- # -*-Perl-*- With arguments to perl: #!/usr/bin/perl -P- # -*-Perl-*- To handle files included with do 'filename.pl';, add something like (setq auto-mode-alist (append (list (cons "\\.pl\\'" 'perl-mode)) auto-mode-alist)) to your init file; otherwise the .pl suffix defaults to prolog-mode. This code is based on the 18.53 version c-mode.el, with extensive rewriting. Most of the features of c-mode survived intact. I added a new feature which adds functionality to TAB; it is controlled by the variable perl-tab-to-comment. With it enabled, TAB does the first thing it can from the following list: change the indentation; move past leading white space; delete an empty comment; reindent a comment; move to end of line; create an empty comment; tell you that the line ends in a quoted string, or has a # which should be a \#. I also tuned a few things: comments and labels starting in column zero are left there by perl-indent-exp; perl-beginning-of-function goes back to the first open brace/paren in column zero, the open brace in 'sub ... {', or the equal sign in 'format ... ='; perl-indent-exp (meta-^q) indents from the current line through the close of the next brace/paren, so you don't need to start exactly at a brace or paren. It may be good style to put a set of redundant braces around your main program. This will let you reindent it with meta-^q. Known problems (these are all caused by limitations in the Emacs Lisp parsing routine (parse-partial-sexp), which was not designed for such a rich language; writing a more suitable parser would be a big job): 2) The globbing syntaxis not recognized, so special characters in the pattern string must be backslashed. Here are some ugly tricks to bypass some of these problems: the perl expression /`/ (that's a back-tick) usually evaluates harmlessly, but will trick perl-mode into starting a quoted string, which can be ended with another /`/. Assuming you have no embedded back-ticks, this can used to help solve problem 3: /`/; $ugly = q?"'$?; /`/; The same trick can be used for problem 6 as in: /{/; while (<${glob_me}>) but a simpler solution is to add a space between the $ and the {: while (<$ {glob_me}>) Problem 7 is even worse, but this 'fix' does work :-( $DB'stop#' [$DB'line#' ] =~ s/;9$//;