quantum-espresso/dev-tools/gen-emacs-mode

169 lines
3.8 KiB
Tcl
Executable File

#!/bin/sh
# the next line restarts using tclsh \
exec tclsh "$0" "$@"
###
# Purpose: this script generates Emacs major mode elisp file for
# requested Quantum ESPRESSO mode
##
# directories
set basedir [file normalize [file dirname [info script]]]
set topdir [file normalize [file join $basedir ..]]
set qe_modes_template_dir [file join $topdir GUI QE-modes qe-modes.templates]
set helpdocdir [file join $basedir helpdoc.d]
source [file join $helpdocdir modules.tcl]; # load which modules do we support
set usage "
Usage:
either: $argv0 \[OPTIONS\] module1 \[module2 module3 ...\]
or: $argv0 \[OPTIONS\] INPUT_*.def \[INPUT_*.def INPUT_*.def ...\]
Where possible values for modules are:
[::helpdoc::get_supported_modules]
While INPUT_*.def are what the name suggests.
OPTIONS are:
-mode value
The \"mode\" stands for the short name of the mode, i.e., the
generated name of the major mode file will be \${mode}-mode.el
(default value is the same as the name of the command-line
specified either module or the lowercase spelled PROG part of the
INPUT_PROG.def file).
-modename value
The \"modename\" is the textual name of mode; for example if
mode = pw, then modename can be set to QE-pw.x
(default value = QE-\${mode}.x).
-nmlprefix value
The \"nmlprefix\" is the prefix character of the fortran namelists
(default value = '&').
-funcs
If this option is specified then the function \$mode-funcs.el file is generated.
-masteronly
If this option is specified then only the master \$mode-modes.el file is generated.
The $argv0 generates an emacs major-mode elisp file for easier editing
of input files of specified Quantum ESPRESSO package.
"
# parse command-line
if { $argc < 1 } {
puts stderr $usage
exit 1
}
package require cmdline
set options {
{funcs "generate $mode-funcs.el file"}
{masteronly "generate $mode-modes.el master file"}
{mode.arg {} "short name of mode; the corresponding mode file will be named $mode-mode.el"}
{modename.arg {} "textual name of mode"}
{nmlprefix.arg & "symbol used for fortran namelist prefix"}
}
set argv_orig $argv
namespace eval ::helpdoc {
variable opt
array set opt [::cmdline::getoptions ::argv $options $usage]
if { [llength $::argv] == 0 } {
puts stderr "
### no module specified on the command line: [concat $::argv0 $::argv_orig]
"
exit 1
}
puts "
Input specs:
-----------"
parray opt
foreach module $argv {
puts "module([incr i]) = $module"
}
puts ""
}
# load the helpdoc package
source [file join $helpdocdir helpdoc.tcl]
# source the gen-emacs-mode.tcl
source [file join $basedir gen-emacs-mode.tcl]
namespace eval ::helpdoc {
# for -masteronly generates only the master mode file
if { $opt(masteronly) } {
qe_master_generate $argv
exit 0
}
# initialize the qe-mode generation
qe_mode_init
# parse each module file ...
variable module
foreach module $argv {
# find whether module is a name of the name of INPUT_*.def file
set deffile $module
if { ! [file exists $module] } {
# seems $module is a module name
puts -nonewline "
trying the $module as a module name ... "
set deffile [get_def_filename $module]
puts "\[OK\]"
} else {
# extract module name from INPUT_*.def as:
set module [modulename_from_defname $deffile]
}
lappend module_list $module
if { $opt(mode) eq {} } {
set opt(mode) $module
}
if { $opt(modename) eq {} } {
set opt(modename) QE-$opt(mode).x
}
# process this def file
qe_mode_process_def $deffile
}
# generate a $opt(mode)-mode.el file
qe_mode_generate $module_list
}