|
Open include files
[Back]
Here are some macros which will search for include
files in C/C++ (i.e. starting with a #include) using a colon-separated
list of paths in an environment variable, $NEDIT_INCLUDE_PATH.
It's probably pretty fragile. To get this to work, add a macro menu item
which calls open_include(). Note that you might have to fiddle
with some of the shell commands if you're not using csh.
The macros are slightly broken for relative paths. If you set your environment
variable to .:../include:/usr/include, edit a file in your source
directory (for example), use the open_include() macro to open
a file in ../include, the current directory is set to ../include
in shell commands fired from that window, but remains in your source directory
when the attempt is made to actually open the file.
What that means is, within the header file you just opened, if you attempt
to use open_include() to open another header file which is also
in the include directory (header2.h, say), it will fail. The
shell_command("test -r "...) command in the open_with_test()
macro will indicate that the file ./header2.h exists (because
the shell process did a chdir() to ../include), but
the open() command will fail because source/./header2.h
won't exist.
One (crude) way to fix that would be to assign your current directory
to a global macro variable at startup and always prepend that to relative
paths before opening files in open_with_test(). A better solution
might be to remove the chdir() in shell.c, but I have
no idea what else that might break.
#
# $g_include_path -- this bit depends on your shell.
#
$g_include_path = ".:/usr/include:/usr/include/CC" # useful default
include_path = shell_command("echo $NEDIT_INCLUDE_PATH", "")
if($shell_cmd_status == 0)
{
# Strip trailing newline. You might want to do other checks here
# for 0-length path elements, etc.
$g_include_path = substring(include_path, 0, length(include_path) -1)
}
# open_with_test
#
# If the given file is readable, this opens it & returns "yay".
# Otherwise it just returns "".
#
define open_with_test
{
filename = $1
shell_command("test -r " filename, "")
if($shell_cmd_status == 0)
{
open(filename)
return "yay"
}
return ""
}
# open_include
#
# This attempts to find an #include file name in the current line and
# search for it in the global include path.
#
define open_include
{
#
# Try to get the filename from the current line. All this does
# is look for a string delimited by <> or "".
#
# There may be a better/built-in way to get the text of the current line.
bpos = search("^", $cursor, "regex", "backward")
epos = search("$", $cursor, "regex", "forward")
line = get_range(bpos, epos)
# See if we can find a filename delimited by <>. This is pretty fragile,
# & doesn't permit "< file.h >", etc.
filename = replace_in_string(line, "^.+\\<(.+)\\>.*$", "\\1", "regex")
if(filename == "")
{
# OK, see if we can find a filename delimited by ""
filename = replace_in_string(line, "^.+\"(.+)\".*$", "\\1", "regex")
}
if(filename == "")
{
dialog("No filename found in line " $line "!\n" \
"I'm looking for <filename> or \"filename\".", "Oops.")
return ""
}
#
# We have a filename; now run through our list of paths & see
# if we can open the file.
#
include_path = $g_include_path
path_separator = ":"
bpos = 0
epos = search_string(include_path, path_separator, bpos)
while(epos > bpos)
{
path_bit = substring(include_path, bpos, epos)
if(open_with_test(path_bit "/" filename) != "") return ""
bpos = epos + length(path_separator)
epos = search_string(include_path, path_separator, bpos)
}
# Do the last element in the path.
path_bit = substring(include_path, bpos, length(include_path))
if(open_with_test(path_bit "/" filename) != "") return ""
#
# Bummer! Might as well open a file-open dialog...
#
open_dialog(filename)
}
[Back]
Released on Wed, 21 Nov 2001
by
C. Denat
|
|