目录

Vim动态执行编译

最近突然编译需求来了。每一个文件的依赖库都不同,以前vim的编译函数都是扯谈了。干脆写了一个通用的方法的函数。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
"============ <F5> 运行前五行注释中的命令 =========
map <F5> :call RunComment()<CR>
func RunComment()
	let n = 1
	while n < 5
		let l=getline(n)
		if l =~ '//!'
			echo strpart(l, stridx(l, "!"))
			exec strpart(l, stridx(l, "!"))
			if v:shell_error
				echo "=================== exec error !!! =================="
				break
			endif

		endif
		let n = n + 1
	endwhile
endfunc

源码里面类似这样的,直接写编译命令。反正只认包含"//!“的行。

1
2
3
4
5
6
 head -n 5 ~/bin/showit/showsvgpngtxt.vala
//▶ valac --pkg gtk+-3.0 --pkg librsvg-2.0 showsvgpngtxt.vala
//!valac --pkg gtk+-3.0 --pkg librsvg-2.0 %
//!./%<
using Gtk;
using Cairo;

又找到一个v:shell_error,类似shell的$?可判断编译时候成功。

gedit动态执行编译

外部工具真强大,通过管道调用各种脚本,再管道返回。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
 cat ~/.config/gedit/tools/F5执行前5行内的命令
#!/bin/perl
# [Gedit Tool]
# Name=F5执行前5行内的命令
# Input=nothing
# Output=output-panel
# Applicability=titled
# Save-files=nothing
# Shortcut=F5
# Languages=


# https://wiki.gnome.org/Apps/Gedit/Plugins/ExternalTools

use 5.010;

chdir $ENV{GEDIT_CURRENT_DOCUMENT_DIR};
open IN,"<$ENV{GEDIT_CURRENT_DOCUMENT_PATH}" or die $!;
@_ = split '\n', <IN>.<IN>.<IN>.<IN>.<IN>;
for(@_){
	next if ! m'//!';
	$cmd = $';
 	$cmd =~ s/%f/$ENV{GEDIT_CURRENT_DOCUMENT_NAME}/;
	print "当前目录:".`pwd`;
	say "执行命令:".$cmd;
	say "-----------------------------------------";
	say `$cmd`;
	say "输出无错误" if $? eq 0;
}