Browse Source

vim-cmake-syntax 2016-08-16 (e782679c)

Code extracted from:

    https://github.com/pboettch/vim-cmake-syntax.git

at commit e782679cb93a4ccb419cffbc1c076db0d524d43e (master).
vim-cmake-syntax upstream 9 years ago
commit
4a22c06e7f
4 changed files with 292 additions and 0 deletions
  1. 34 0
      cmake.vim.in
  2. 141 0
      extract-upper-case.pl
  3. 83 0
      indent/cmake.vim
  4. 34 0
      syntax/cmake.vim

File diff suppressed because it is too large
+ 34 - 0
cmake.vim.in


+ 141 - 0
extract-upper-case.pl

@@ -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;
+}

+ 83 - 0
indent/cmake.vim

@@ -0,0 +1,83 @@
+" Vim indent file
+" Language:     CMake (ft=cmake)
+" Author:       Andy Cedilnik <[email protected]>
+" Maintainer:   Karthik Krishnan <[email protected]>
+" 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 it is too large
+ 34 - 0
syntax/cmake.vim


Some files were not shown because too many files changed in this diff