「拡張子の違うファイルを開く」の版間の差分

提供: MeryWiki
ナビゲーションに移動 検索に移動
編集の要約なし
MSY-07 (トーク | 投稿記録)
SyntaxHighlightにcopyの追加
 
(2人の利用者による、間の13版が非表示)
1行目: 1行目:
現在Cファイルを開いていれば同じフォルダにあるHファイルを、Hファイルを開いていればCファイルを開きます。
同じフォルダにある拡張子以前が共通のファイルを順ぐりに開きます。たとえば現在Cファイルを開いていれば同じフォルダにあるHファイルを、Hファイルを開いていればCファイルを開きます。


いまのところ対になるファイルは同じフォルダにないと動きません。
== 変更履歴 ==
* r2 (2014-08-07)
** 拡張子を限定せず何でも開くように
* r1 (2012-06-22)
** 失念


対応拡張子は増やせるようになっていますので、必要なら適当に編集してお使いください。
== ソースコード ==
<syntaxhighlight lang="javascript" copy>
// 拡張子の違うファイルを開く.js r2 (2014-08-07)
// 同じフォルダにある拡張子以前が共通のファイルを順に開きます


(同名の対になるファイルを開くを巡回できるようにしたものです)
var FS = new ActiveXObject("Scripting.FileSystemObject");


<source lang="javascript">
function main() {
// 拡張子の違うファイルを開く.js
var path = document.Path;
var name = document.Name;
// 今のところ同じフォルダにあるものだけを探します
var next = calc_next_file(path, name);
 
// 拡張子一覧 (このリストにある順に巡回します)
if (next) {
EXTS = 'h hpp hh hxx inc c m mm cc cpp cxx xs htm html xhtml xml css erl hrl'
editor.OpenFile(next, 0, meOpenAllowNewWindow);
}
function main()
{
    var next = calc_next_file(document.FullName)
    if (next)
    {
        editor.OpenFile(next, 0, meOpenAllowNewWindow)
    }
}
}
 
function calc_next_file(name)
function calc_next_file(path, name) {
{
name = name.toLocaleLowerCase();
    var name_dot_ext = split_last(name, '.')
 
    if (!name_dot_ext) { return }
var name_dot_ext = split_at_dot(name);
if (!name_dot_ext) {
    var name_dot = name_dot_ext[0]
return;
    var ext = name_dot_ext[1]
}
    var exts = get_exts()
 
    var curr = find_index(exts, ext.toLowerCase())
var name_dot = name_dot_ext[0];
    if (curr < 0) { return }
var ext = name_dot_ext[1];
 
    var fs = new ActiveXObject("Scripting.FileSystemObject")
var files = [];
each_file(path, function(filename) {
    for (var a = 1; a < exts.length; a++)
var lower = filename.toLocaleLowerCase();
    {
if (lower.length >= name_dot.length && lower.substr(0, name_dot.length) === name_dot) {
        var i = (curr + a) % exts.length
files.push(lower);
        var o = name_dot + exts[i]
}
});
        if (fs.FileExists(o))
 
        {
if (files.length < 2) {
            return o
return;
        }
}
    }
 
files.sort();
 
var curr = index_of(name, files);
 
if (curr < 0) {
return files[0];
}
 
return path + files[(curr + 1) % files.length];
}
}


function split_last(str, separator)
function split_at_dot(str) {
{
var i = str.lastIndexOf('.');
    var i = str.lastIndexOf(separator)
return i >= 0 && [str.substr(0, i + 1), str.substr(i + 1)];
    return i >= 0 && [str.substr(0, i + 1), str.substr(i + 1)]
}
}
 
function get_exts()
function index_of(x, array) {
{
for (var i = 0; i < array.length; i++) {
    return EXTS.split(/(?:\s| )+/)
if (array[i] === x) {
return i;
}
}
return -1;
}
}
 
function find_index(array, x)
function each_file(path, callback) {
{
return enumerate(FS.GetFolder(path).Files, function(e) {
    for (var i=0; i<array.length; i++)
return callback(e.Name);
    {
});
        if (array[i] == x) { return i }
    }
    return -1
}
}
 
main()
function enumerate(collection, callback) {
</source>
for (var e = new Enumerator(collection); !e.atEnd(); e.moveNext()) {
var result = callback(e.item());
if (result) {
return result;
}
}
}
 
main();
</syntaxhighlight>

2025年6月30日 (月) 00:19時点における最新版

同じフォルダにある拡張子以前が共通のファイルを順ぐりに開きます。たとえば現在Cファイルを開いていれば同じフォルダにあるHファイルを、Hファイルを開いていればCファイルを開きます。

変更履歴[編集]

  • r2 (2014-08-07)
    • 拡張子を限定せず何でも開くように
  • r1 (2012-06-22)
    • 失念

ソースコード[編集]

// 拡張子の違うファイルを開く.js r2 (2014-08-07)
// 同じフォルダにある拡張子以前が共通のファイルを順に開きます

var FS = new ActiveXObject("Scripting.FileSystemObject");

function main() {
	var path = document.Path;
	var name = document.Name;
	var next = calc_next_file(path, name);

	if (next) {
		editor.OpenFile(next, 0, meOpenAllowNewWindow);
	}
}

function calc_next_file(path, name) {
	name = name.toLocaleLowerCase();

	var name_dot_ext = split_at_dot(name);
	if (!name_dot_ext) {
		return;
	}

	var name_dot = name_dot_ext[0];
	var ext = name_dot_ext[1];

	var files = [];
	each_file(path, function(filename) {
		var lower = filename.toLocaleLowerCase();
		if (lower.length >= name_dot.length && lower.substr(0, name_dot.length) === name_dot) {
			files.push(lower);
		}
	});

	if (files.length < 2) {
		return;
	}

	files.sort();

	var curr = index_of(name, files);

	if (curr < 0) {
		return files[0];
	}

	return path + files[(curr + 1) % files.length];
}

function split_at_dot(str) {
	var i = str.lastIndexOf('.');
	return i >= 0 && [str.substr(0, i + 1), str.substr(i + 1)];
}

function index_of(x, array) {
	for (var i = 0; i < array.length; i++) {
		if (array[i] === x) {
			return i;
		}
	}
	return -1;
}

function each_file(path, callback) {
	return enumerate(FS.GetFolder(path).Files, function(e) {
		return callback(e.Name);
	});
}

function enumerate(collection, callback) {
	for (var e = new Enumerator(collection); !e.atEnd(); e.moveNext()) {
		var result = callback(e.item());
		if (result) {
			return result;
		}
	}
}

main();
スポンサーリンク