Merge branch 'upstream-vim-cmake-syntax' into import-vim-syntax
* upstream-vim-cmake-syntax: vim-cmake-syntax 2016-08-16 (e782679c)
This commit is contained in:
commit
e3ac68cfbf
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,141 @@
|
||||||
|
#!/usr/bin/env perl
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
my @variables;
|
||||||
|
my @commands;
|
||||||
|
my @properties;
|
||||||
|
my @modules;
|
||||||
|
my %keywords; # command => keyword-list
|
||||||
|
|
||||||
|
# unwanted upper-cases
|
||||||
|
my %unwanted = map { $_ => 1 } qw(VS CXX IDE NOTFOUND NO_ DFOO DBAR);
|
||||||
|
# cannot remove ALL - exists for add_custom_command
|
||||||
|
|
||||||
|
# control-statements
|
||||||
|
my %conditional = map { $_ => 1 } qw(if else elseif endif);
|
||||||
|
my %loop = map { $_ => 1 } qw(foreach while endforeach endwhile);
|
||||||
|
|
||||||
|
# decrecated
|
||||||
|
my %deprecated = map { $_ => 1 } qw(build_name exec_program export_library_dependencies install_files install_programs install_targets link_libraries make_directory output_required_files remove subdir_depends subdirs use_mangled_mesa utility_source variable_requires write_file);
|
||||||
|
|
||||||
|
# add some (popular) modules
|
||||||
|
push @modules, "ExternalProject";
|
||||||
|
|
||||||
|
# variables
|
||||||
|
open(CMAKE, "cmake --help-variable-list|") or die "could not run cmake";
|
||||||
|
while (<CMAKE>) {
|
||||||
|
chomp;
|
||||||
|
push @variables, $_;
|
||||||
|
}
|
||||||
|
close(CMAKE);
|
||||||
|
|
||||||
|
# transform all variables in a hash - to be able to use exists later on
|
||||||
|
my %variables = map { $_ => 1 } @variables;
|
||||||
|
|
||||||
|
# commands
|
||||||
|
open(CMAKE, "cmake --help-command-list|");
|
||||||
|
while (my $cmd = <CMAKE>) {
|
||||||
|
chomp $cmd;
|
||||||
|
|
||||||
|
push @commands, $cmd;
|
||||||
|
}
|
||||||
|
close(CMAKE);
|
||||||
|
|
||||||
|
# now generate a keyword-list per command
|
||||||
|
foreach my $cmd (@commands) {
|
||||||
|
my @word = extract_upper("cmake --help-command $cmd|");
|
||||||
|
|
||||||
|
next if scalar @word == 0;
|
||||||
|
|
||||||
|
$keywords{$cmd} = [ sort keys %{ { map { $_ => 1 } @word } } ];
|
||||||
|
}
|
||||||
|
|
||||||
|
# and now for modules
|
||||||
|
foreach my $mod (@modules) {
|
||||||
|
my @word = extract_upper("cmake --help-module $mod|");
|
||||||
|
|
||||||
|
next if scalar @word == 0;
|
||||||
|
|
||||||
|
$keywords{$mod} = [ sort keys %{ { map { $_ => 1 } @word } } ];
|
||||||
|
}
|
||||||
|
|
||||||
|
# and now for generator-expressions
|
||||||
|
my @generator_expr = extract_upper("cmake --help-manual cmake-generator-expressions |");
|
||||||
|
|
||||||
|
# properties
|
||||||
|
open(CMAKE, "cmake --help-property-list|");
|
||||||
|
while (<CMAKE>) {
|
||||||
|
chomp;
|
||||||
|
push @properties, $_;
|
||||||
|
}
|
||||||
|
close(CMAKE);
|
||||||
|
|
||||||
|
# generate cmake.vim
|
||||||
|
open(IN, "<cmake.vim.in") or die "could not read cmake.vim.in";
|
||||||
|
open(OUT, ">syntax/cmake.vim") or die "could not write to syntax/cmake.vim";
|
||||||
|
|
||||||
|
my @keyword_hi;
|
||||||
|
|
||||||
|
while(<IN>)
|
||||||
|
{
|
||||||
|
if (m/\@([A-Z0-9_]+)\@/) { # match for @SOMETHING@
|
||||||
|
if ($1 eq "COMMAND_LIST") {
|
||||||
|
# do not include "special" commands in this list
|
||||||
|
my @tmp = grep { ! exists $conditional{$_} and
|
||||||
|
! exists $loop{$_} and
|
||||||
|
! exists $deprecated{$_} } @commands;
|
||||||
|
print OUT " " x 12 , "\\ ", join(" ", @tmp), "\n";
|
||||||
|
} elsif ($1 eq "VARIABLE_LIST") {
|
||||||
|
print OUT " " x 12 , "\\ ", join(" ", @variables), "\n";
|
||||||
|
} elsif ($1 eq "MODULES") {
|
||||||
|
print OUT " " x 12 , "\\ ", join("\n", @modules), "\n";
|
||||||
|
} elsif ($1 eq "GENERATOR_EXPRESSIONS") {
|
||||||
|
print OUT " " x 12 , "\\ ", join(" ", @generator_expr), "\n";
|
||||||
|
} elsif ($1 eq "CONDITIONALS") {
|
||||||
|
print OUT " " x 12 , "\\ ", join(" ", sort keys %conditional), "\n";
|
||||||
|
} elsif ($1 eq "LOOPS") {
|
||||||
|
print OUT " " x 12 , "\\ ", join(" ", sort keys %loop), "\n";
|
||||||
|
} elsif ($1 eq "DEPRECATED") {
|
||||||
|
print OUT " " x 12 , "\\ ", join(" ", sort keys %deprecated), "\n";
|
||||||
|
} elsif ($1 eq "KEYWORDS") {
|
||||||
|
foreach my $k (sort keys %keywords) {
|
||||||
|
print OUT "syn keyword cmakeKW$k\n";
|
||||||
|
print OUT " " x 12, "\\ ", join(" ", @{$keywords{$k}}), "\n";
|
||||||
|
print OUT " " x 12, "\\ contained\n";
|
||||||
|
print OUT "\n";
|
||||||
|
push @keyword_hi, "hi def link cmakeKW$k ModeMsg";
|
||||||
|
}
|
||||||
|
} elsif ($1 eq "KEYWORDS_HIGHLIGHT") {
|
||||||
|
print OUT join("\n", @keyword_hi), "\n";
|
||||||
|
} else {
|
||||||
|
print "ERROR do not know how to replace $1\n";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
print OUT $_;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
close(IN);
|
||||||
|
close(OUT);
|
||||||
|
|
||||||
|
sub extract_upper
|
||||||
|
{
|
||||||
|
my $input = shift;
|
||||||
|
my @word;
|
||||||
|
|
||||||
|
open(KW, $input);
|
||||||
|
while (<KW>) {
|
||||||
|
|
||||||
|
foreach my $w (m/\b([A-Z_]{2,})\b/g) {
|
||||||
|
next
|
||||||
|
if exists $variables{$w} or # skip if it is a variable
|
||||||
|
exists $unwanted{$w}; # skip if not wanted
|
||||||
|
|
||||||
|
push @word, $w;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
close(KW);
|
||||||
|
|
||||||
|
return @word;
|
||||||
|
}
|
|
@ -0,0 +1,83 @@
|
||||||
|
" Vim indent file
|
||||||
|
" Language: CMake (ft=cmake)
|
||||||
|
" Author: Andy Cedilnik <andy.cedilnik@kitware.com>
|
||||||
|
" Maintainer: Karthik Krishnan <karthik.krishnan@kitware.com>
|
||||||
|
" Last Change: $Date$
|
||||||
|
" Version: $Revision$
|
||||||
|
"
|
||||||
|
" Licence: The CMake license applies to this file. See
|
||||||
|
" https://cmake.org/licensing
|
||||||
|
" This implies that distribution with Vim is allowed
|
||||||
|
|
||||||
|
if exists("b:did_indent")
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
let b:did_indent = 1
|
||||||
|
|
||||||
|
setlocal indentexpr=CMakeGetIndent(v:lnum)
|
||||||
|
setlocal indentkeys+==ENDIF(,ENDFOREACH(,ENDMACRO(,ELSE(,ELSEIF(,ENDWHILE(
|
||||||
|
|
||||||
|
" Only define the function once.
|
||||||
|
if exists("*CMakeGetIndent")
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
|
||||||
|
fun! CMakeGetIndent(lnum)
|
||||||
|
let this_line = getline(a:lnum)
|
||||||
|
|
||||||
|
" Find a non-blank line above the current line.
|
||||||
|
let lnum = a:lnum
|
||||||
|
let lnum = prevnonblank(lnum - 1)
|
||||||
|
let previous_line = getline(lnum)
|
||||||
|
|
||||||
|
" Hit the start of the file, use zero indent.
|
||||||
|
if lnum == 0
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
|
||||||
|
let ind = indent(lnum)
|
||||||
|
|
||||||
|
let or = '\|'
|
||||||
|
" Regular expressions used by line indentation function.
|
||||||
|
let cmake_regex_comment = '#.*'
|
||||||
|
let cmake_regex_identifier = '[A-Za-z][A-Za-z0-9_]*'
|
||||||
|
let cmake_regex_quoted = '"\([^"\\]\|\\.\)*"'
|
||||||
|
let cmake_regex_arguments = '\(' . cmake_regex_quoted .
|
||||||
|
\ or . '\$(' . cmake_regex_identifier . ')' .
|
||||||
|
\ or . '[^()\\#"]' . or . '\\.' . '\)*'
|
||||||
|
|
||||||
|
let cmake_indent_comment_line = '^\s*' . cmake_regex_comment
|
||||||
|
let cmake_indent_blank_regex = '^\s*$'
|
||||||
|
let cmake_indent_open_regex = '^\s*' . cmake_regex_identifier .
|
||||||
|
\ '\s*(' . cmake_regex_arguments .
|
||||||
|
\ '\(' . cmake_regex_comment . '\)\?$'
|
||||||
|
|
||||||
|
let cmake_indent_close_regex = '^' . cmake_regex_arguments .
|
||||||
|
\ ')\s*' .
|
||||||
|
\ '\(' . cmake_regex_comment . '\)\?$'
|
||||||
|
|
||||||
|
let cmake_indent_begin_regex = '^\s*\(IF\|MACRO\|FOREACH\|ELSE\|ELSEIF\|WHILE\|FUNCTION\)\s*('
|
||||||
|
let cmake_indent_end_regex = '^\s*\(ENDIF\|ENDFOREACH\|ENDMACRO\|ELSE\|ELSEIF\|ENDWHILE\|ENDFUNCTION\)\s*('
|
||||||
|
|
||||||
|
" Add
|
||||||
|
if previous_line =~? cmake_indent_comment_line " Handle comments
|
||||||
|
let ind = ind
|
||||||
|
else
|
||||||
|
if previous_line =~? cmake_indent_begin_regex
|
||||||
|
let ind = ind + &sw
|
||||||
|
endif
|
||||||
|
if previous_line =~? cmake_indent_open_regex
|
||||||
|
let ind = ind + &sw
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Subtract
|
||||||
|
if this_line =~? cmake_indent_end_regex
|
||||||
|
let ind = ind - &sw
|
||||||
|
endif
|
||||||
|
if previous_line =~? cmake_indent_close_regex
|
||||||
|
let ind = ind - &sw
|
||||||
|
endif
|
||||||
|
|
||||||
|
return ind
|
||||||
|
endfun
|
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue