タグシステム
対応バージョン: PPx182+4以降プラグイン:
説明
リストファイルのコメント欄にタグを書き込んで運用するシステム。
本格的なタグ管理はできませんが手軽に使えます。次のような機能を持ちます。
- 複数のエントリに対するタグの追加・削除。
- 複数のタグリストの切り替え。
- commentSearch.jsを使って&-or検索で絞り込める。
- リストファイル外でも使える。
- タグに色付けしてPPvで表示。(おまけ機能)
- スクリプト内でcompCode.jsを使用。
- スクリプト内おまけ機能でWindowModuleを使用。
タグ用メニューの説明
項目 | 内容 |
---|---|
1:TagSys | 一行編集が起動してタグリストを選択できます。 通常、一行編集には %'list'%\tag\ が挿入されますが、カレントディレクトリに01_TAG.TXT があればそちらを挿入します。選択したパスが存在しないときは_default.txt を読み込みます。リスト選択後にメニュー下部にタグ項目が追加されます。 |
A:add | 一行編集で選択したタグをエントリに追加します。 スペース区切りで複数のタグを追加できます。 |
R:remove | 一行編集で選択したタグをエントリから削除します。 スペース区切りで複数のタグを削除できます。 |
E:edit taglist | 現在選択中のタグリストを編集します。保存と同時にメニューを再生成します。 |
V:tag view | (おまけ機能) カーソル移動するとPPv[T]に色付けされたタグが表示されます。再実行で解除。 ※カーソル移動ごとにファイルを読み書きしているので連続移動するとエラーがでます。 *entrytip に組み込むのがいいかもしれません。 |
- 1:TagSysからタグリストを選択すると_User:taglistにパスが設定されます。
- タグ項目の生成では一つのタグにつき、二つの項目が追加されます。
-
が付いた項目は削除用です。- 重複するタグは一つにまとめられます。
使い方
- tagMakeMenu.jsの初期設定をする。
*edit -new -lf -utf8bom %'list%\tag\_default.txt
(初期値。スクリプト内変数TAG_LISTと同一のパス)を実行してタグリストを生成する。(必須)- 2.のファイルに使いたいタグを書き込む。タグは一行で1タグと認識される。
- 次にタグ用のメニューを呼び出し、
1:TagSys
を押すと一行編集が起動するので_default.txt
を選択するとメニューにタグが追加される。 - 適当にエントリにタグを付けていく。
- コメントサーチで絞り込む。
タグリスト作成とメニュー生成までの手順.gif
タグ付けとタグの絞り込み.gif
タグの書式
タグ ;アルファベット一文字 ;数字
最初のコメントはメニューのショートカットキー、二つ目のコメントはansi色番号を指定できる。
あとで読む ;a
これはメニューにA: あとで読む
として登録される。いますぐ読め! ;いま!
これはメニューには登録されない。緑 ; ;32
V:tag view
でPPvに表示されるタグが[緑]のように色づけされる。
ansi色番号は
ansi color
などでWeb検索して調べて下さい。
キーバインド
KEY | COMMAND |
---|---|
[ | コメント |
CTRL+[ | コメントサーチ |
CTRL+S(一行編集) | 編集中のタグを保存。 |
設定
A_exec = {
scr = ;スクリプトをまとめておくディレクトリパス
cfg = ;PPxの設定ファイルをまとめておくディレクトリパス
list = ;読み書きするリストをまとめておくディレクトリパス
}
; キーに割り当てる
-|M_Ueco =
M_Ueco = {
&1:TagSys = *string o,basepath=%'list'%\tag\
*ifmatch "o:e,a:d-",01_TAG.TXT %: *string o,basepath=01_TAG.TXT
*string o,listpath=%*input("%so'basepath'" -title:"Select Taglist.." -k *completelist)
*script %'scr'%\tagMakeMenu.js,%so"listpath"
-- =
ex = ??M_UecoSub
}
KC_main = {
'[' , *string o,cmnt=%*comment
*ifmatch *"*,0%so"cmnt" %: *string o,cmnt=%*regexp(%so"cmnt","/""/""""""""/g")
*comment extract,"%*input("%so'cmnt'" -title:"Comment.." -mode:Re -k *mapkey use,K_tagSysMap)"
^'[' , *script %'scr'%\commentSearch.js,filter
}
KV_img = {
'[' , *string o,cmnt=%*extract(C"%%*comment")
*ifmatch *"*,0%so"cmnt" %: *string o,cmnt=%*regexp(%so"cmnt","/""/""""""""/g")
*ifmatch !0,0%su"taglist" %: *string o,comp=*string e,filename=%su"taglist" %%: *completelist -set -file:%su"taglist" -detail:"user1" %%:
*string o,cmnt=%*input("%so"cmnt"" -title:"Comment.." -mode:Re -k %so"comp" *mapkey use,K_tagSysMap)
*execute C,*comment extract,"%so"cmnt"
}
-|K_tagSysMap =
K_tagSysMap = {
^S , *script %'scr'%\appendText-utf8lf.js
*linemessage save tag
*script %'scr'%\tagMakeMenu.js
}
スクリプトの説明
- appendText-utf8lf.js 一行編集からタグリストにタグを保存するときに使う。
- tagColor.js
_User:taglist
を元に色付きタグファイル%'temp'%\ppxtags.tmp
を生成する。 - tagMakeMenu.js
_User:taglist
を設定。それを元にタグ用メニューzzUecoTagSys.cfg
を生成し読み込む。 - tagOperate.js エントリにタグを追加・削除する。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//!*script | |
/** | |
* utf8-lfで保存ファイルに追記 | |
*/ | |
PPx.Execute('*editmode -lf -codepage:65001 %: *replace %*edittext'); | |
var text = PPx.Extract('%*edittext'); | |
var filename = PPx.Extract('%se"filename"'); | |
var st = PPx.CreateObject('ADODB.stream'); | |
st.Open; | |
st.Type = 2; | |
st.Charset = 'UTF-8'; | |
st.LoadFromFile(filename); | |
var textline = st.ReadText(-1).split('\u000A'); | |
var omitByte = -1; | |
for (var i = textline.length; i-- ;) { | |
if (textline[i] !== '') { | |
if (textline.length - 1 === i) { | |
omitByte = 0; | |
text = '\u000A' + text; | |
} | |
break; | |
} | |
omitByte = omitByte + 1; | |
} | |
// 結果を書き出してメニューを上書き | |
st.Position = st.Size - omitByte; | |
st.SetEOS; | |
st.WriteText(text, 1); | |
st.SaveToFile(filename, 2); | |
st.Close; | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//!*script | |
/** | |
* utf8-lfで保存ファイルに追記 | |
*/ | |
'use strict'; | |
PPx.Execute('*editmode -lf -codepage:65001 %: *replace %*edittext'); | |
let text = PPx.Extract('%*edittext'); | |
const filename = PPx.Extract('%se"filename"'); | |
const st = PPx.CreateObject('ADODB.stream'); | |
st.Open; | |
st.Type = 2; | |
st.Charset = 'UTF-8'; | |
st.LoadFromFile(filename); | |
const textline = st.ReadText(-1).split('\u000A'); | |
let omitByte = -1; | |
for (let i = textline.length; i-- ;) { | |
if (textline[i] !== '') { | |
if (textline.length - 1 === i) { | |
omitByte = 0; | |
text = `\u000A${text}`; | |
} | |
break; | |
} | |
omitByte = omitByte + 1; | |
} | |
// 結果を書き出してメニューを上書き | |
st.Position = st.Size - omitByte; | |
st.SetEOS; | |
st.WriteText(text, 1); | |
st.SaveToFile(filename, 2); | |
st.Close; | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//!*script | |
/** | |
* タグに色づけしてTEMP_FILEに出力 | |
*/ | |
var TEMP_FILE = PPx.Extract("%'temp'%\\ppxtags.tmp"); | |
var st = PPx.CreateObject('ADODB.stream'); | |
var g_tags = (function () { | |
// タグリスト読み込み | |
var tags = []; | |
st.Open; | |
st.Type = 2; | |
st.Charset = 'UTF-8'; | |
st.LoadFromFile(PPx.Extract('%su"taglist"')); | |
tags = st.ReadText(-2).split('\u000A'); | |
st.Close; | |
return tags; | |
})(); | |
var g_comments = PPx.Entry.comment.split(' '); | |
var result = []; | |
for (var i = 0, l = g_comments.length; i < l; i++) { | |
var thisTag = g_comments[i]; | |
for (var j = g_tags.length; j--;) { | |
var v = (function (data) { | |
var data_ = data.split(' ;'); | |
return { | |
tag: data_[0], | |
color: data_[2] | |
} | |
})(g_tags[j]); | |
if (~thisTag.indexOf(v.tag) && v.color !== undefined) { | |
thisTag = '[' + v.color + 'm' + v.tag + '[0m'; | |
} | |
} | |
result.push(thisTag); | |
} | |
// 結果を書き出して上書き | |
st.Open; | |
st.Type = 2; | |
st.Charset = 'UTF-8'; | |
st.Position = 0; | |
st.WriteText(result.join(' ')); | |
st.SaveToFile(TEMP_FILE, 2); | |
st.Close; | |
PPx.Result = TEMP_FILE; | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//!*script | |
/** | |
* タグに色づけしてTEMP_FILEに出力 | |
*/ | |
'use strict'; | |
const TEMP_FILE = PPx.Extract("%'temp'%\\ppxtags.tmp"); | |
const st = PPx.CreateObject('ADODB.stream'); | |
const g_tags = (() => { | |
// タグリスト読み込み | |
let tags = []; | |
st.Open; | |
st.Type = 2; | |
st.Charset = 'UTF-8'; | |
st.LoadFromFile(PPx.Extract('%su"taglist"')); | |
tags = st.ReadText(-2).split('\u000A'); | |
st.Close; | |
return tags.map(v => v.split(' ;')); | |
})(); | |
const g_comments = PPx.Entry.comment.split(' '); | |
let result = []; | |
for (let i = g_comments.length; i--;) { | |
let thisTag = g_comments[i]; | |
for (let [tag, ,color] of g_tags.values()) { | |
if (~thisTag.indexOf(tag) && color !== undefined) { | |
thisTag = `[${color}m${tag}[0m`; | |
} | |
} | |
result.push(thisTag); | |
} | |
// 結果を書き出して上書き | |
st.Open; | |
st.Type = 2; | |
st.Charset = 'UTF-8'; | |
st.Position = 0; | |
st.WriteText(result.join(' ')); | |
st.SaveToFile(TEMP_FILE, 2); | |
st.Close; | |
PPx.Result = TEMP_FILE; | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//!*script | |
/** | |
* コメントにタグを付けたり外したり | |
* | |
* PPx.Arguments( | |
* 0: push | remove | |
* 1: tags | |
* ) | |
*/ | |
var g_args = (function () { | |
if (PPx.Arguments.length === 0) { | |
PPx.Echo('引数が足りません'); | |
PPx.Quit(-1); | |
} | |
return { | |
order: PPx.Arguments(0), | |
tags: PPx.Arguments(1).split(' ') | |
}; | |
})(); | |
var cmd = {}; | |
cmd['push'] = function (cmnts) { | |
var cmnts1 = (cmnts.length === 0) ? g_args.tags : cmnts.split(' ').concat(g_args.tags); | |
var exist = {}; | |
var newCmnts = []; | |
for (var i = 0, l = cmnts1.length; i < l; i++) { | |
var thisComment = cmnts1[i]; | |
if (!exist[thisComment]) { | |
exist[thisComment] = true; | |
newCmnts.push(thisComment); | |
} | |
} | |
return newCmnts.sort(function (a, b) { | |
return (a.toLowerCase() < b.toLowerCase()) ? -1 : 1; | |
}); | |
}; | |
cmd['remove'] = function (cmnts) { | |
var cmnts2 = cmnts.split(' '); | |
var i, l; | |
// 編集結果(削除するタグ)の重複チェック | |
// var exist = {}; | |
// var rmTags = []; | |
// for (i = 0, l = g_args.tags.length; i < l; i++) { | |
// var thisComment = g_args.tags[i]; | |
// if (!exist[thisComment]) { | |
// exist[thisComment] = true; | |
// rmTags.push(thisComment); | |
// } | |
// }; | |
for (i = 0, l = g_args.tags.length; i < l;i++) { | |
var tag = g_args.tags[i]; | |
for (var j = 0, k = cmnts2.length; j < k; j++) { | |
if (cmnts2[j] === tag) { | |
cmnts2.splice(j, 1); | |
} | |
} | |
} | |
return cmnts2; | |
}; | |
var thisEntry = PPx.Entry; | |
thisEntry.FirstMark; | |
do { | |
var thisComment = (function () { return cmd[g_args.order](thisEntry.comment); })(); | |
thisEntry.comment = thisComment.join(' '); | |
} while (thisEntry.NextMark); | |
PPx.Execute('*color back'); | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//!*script | |
/** | |
* コメントにタグを付けたり外したり | |
* | |
* PPx.Arguments( | |
* 0: push | remove | |
* 1: tags | |
* ) | |
*/ | |
'use strict'; | |
const g_args = (() => { | |
if (PPx.Arguments.length === 0) { | |
PPx.Echo('引数が足りません'); | |
PPx.Quit(-1); | |
} | |
return { | |
order: PPx.Arguments(0), | |
tags: PPx.Arguments(1).split(' ') | |
}; | |
})(); | |
const cmd = {}; | |
cmd['push'] = (cmnts) => { | |
let cmnts1 = (cmnts.length === 0) ? g_args.tags : [...cmnts.split(' '), ...g_args.tags]; | |
cmnts1 = Array.from(new Set([...cmnts1])); | |
return cmnts1.sort((a, b) => (a.toLowerCase() < b.toLowerCase()) ? -1 : 1); | |
}; | |
cmd['remove'] = (cmnts) => { | |
let cmnts2 = cmnts.split(' '); | |
const rmTags = Array.from(new Set([...g_args.tags])); | |
for (const tag of rmTags.values()) { | |
cmnts2 = cmnts2.filter(v => v !== tag); | |
} | |
return cmnts2; | |
}; | |
const thisEntry = PPx.Entry; | |
thisEntry.FirstMark; | |
do { | |
const thisComment = (() => cmd[g_args.order](thisEntry.comment))(); | |
thisEntry.comment = thisComment.join(' '); | |
} while (thisEntry.NextMark); | |
PPx.Execute('*color back'); | |