フォーラムの返信を作成しました。
- 作成者投稿
- ShuHeiメンバー
takuyaさんは書きました:
Importがあれば、ShuheiさんがおっしゃっているDOM関連の実装をEmeditorユーザーで作り上げることも可能かと存じます。因みに私のほうはマクロ側からより低レベルな
処理を実行したいので、DOMを拡張できたらなーと思っています。マクロ側でテキストの取得やキャレットの移動などをやろうとするとどうしても冗長になってしまったりするんですよね。
自分達でDOMを拡張できるのであれば、
そういったボトルネックも解消できるかと思いますし、後々にそういった自由性が新たなemeditorの強みになるかもしれません。
(素人考えですので変な所もあるかもしれませんが。)あと、個人的にJavascriptの言語構造でrequireなどの
機能がないのはemeditor側ではどうしようもないような気がします・・・ShuHeiメンバーevalでrequireもどきをやると変数の扱いやデバッグにちょっと気を使いますよね。
私は一時期よく使う関数などはまとめてwscとかにしてましたが結局コピペしたほうが便利なのでやめちゃったなー。どうしてもマクロ書いていると冗長な書き方しないと
いけない部分がでてくるのでそこら辺を解決できると良いですねー。>江村さん
ということでEmeditorのDOM関連の拡張(個人で拡張でできたらステキ)もご検討していただければなーと思いますShuHeiメンバーRedraw = false;
でご希望の動作になるかと思います。ShuHeiメンバーお世話になってます。
マクロツールバーの#title 指示子、#tooltip 指示子に関しては
デフォルトでファイル名が設定されるようにしたほうが良いかと思います。
設定すればいいだけの話ですが、ずらっと無名のアイコンが並ぶのはちょっとびっくりします。
(まぁ、ステータスバーにはファイル名が表示されているんですが。)個人的にはマクロ部分が個人で拡張できれば非常に嬉しいです。
よく使う関数などをCで作っておいて登録できれば、
かなり痒いところまで手が届きますし、マクロの自由度
、実用性がさらに高まると思います。参考までに、phpのextensionを作る記事を張ります。
http://www.whenpenguinsattack.com/2006/11/15/how-to-write-php-extensions/
http://dsas.blog.klab.org/archives/50777398.html是非、前向きにご検討していただければと存じます。
ShuHeiメンバーemacs等には用意されていた機能と思います
すみません、思いっきり誤解してました。
emacsのtranspose-charsだと大体こんな感じですね。
参考までにどうぞ。transpose_chars.jsee
Redraw= false;
transpose_chars();
Redraw = true;
Quit();// Functions
function transpose_chars()
{
if(isStartOfDocument())
{
status = “Beginning of buffer”
return;
}transpose_chars = document.selection.Text;
if(transpose_chars == “”)
{
with(document.selection)
{
if(!isEndOfLine())
CharRight(false,1)CharLeft(true,2);
transpose_chars = Text;
line = transpose_chars.split(“”).reverse()
if(line[1] == “n” && line[2] == “r”)
{
//CR+LFの帳尻あわせ
nline = new Array;
nline[0] = line[0];
nline[1] = line[2]+line[1];
line = nline;
}
Text = line.join(“”);
}
}
}function isStartOfDocument()
{
var p = new Object;
p = getPos()
return (p[‘x’] == 1 && p[‘y’] == 1) ? true : false;
}function isEndOfLine()
{
var p;
with(document.selection)
{p = getPos();
x1 = GetActivePointX(eePosLogical);
EndOfLine()
x2 = GetActivePointX(eePosLogical);
setPos(p);
}
return (x1 == x2) ? true : false;
}function getPos()
{
var pos = new Object;
with(document.selection)
{
pos = {
x : GetActivePointX(eePosLogical),
y : GetActivePointY(eePosLogical)
}
}
return pos
}function setPos(pos)
{
with(document.selection)
{
SetActivePoint(eePosLogical,pos[‘x’],pos[‘y’])
}
}#functionの名前はswap->convcase, reverse->transposeに書き換えさせてもらいました。
#ぜいたくを言うと、メニュー無しのショートカットキーで起動したいところですが、これはマクロでは無理ですよね。ショートカットキーはマクロを一度実行後にヘルプメニューの「キーボードマップ」から割り当てられます。
ちなみに大文字小文字をスワップするマクロは
ライブラリにあるtakuyaさんのマクロを使ったほうが
様々なケースでも変換できるのでオススメです。ShuHeiメンバーStandardからProfessionalに1,500円くらい
でアップグレードできるライセンスがあればいいんですがねぇ。Professionalは試用もできますので、もし機会が
あったら今回書いたマクロ使ってみてください。他にもここのライブラリやEmEditor Wikiなどに
日々の作業を楽にしてくれるマクロがあるので一度
ずらーっと試してみると良いですよShuHeiメンバーあれ、よくよく考がえてみたらそれってなんか腑に落ちない気もしますね。
「単語のみ検索」って今回の件まで一回も使った事がなかったので気づきませんでしたが、潜在的な落とし穴が多そうですねぇ~
仮に、単語の先頭の正規表現を とすると、
単語のみ検索する場合には、 を検索するようです。
私が想定していたのは || でした。すいません、ちょっと仰られてることが分かりません。
・
・||
この二つの正規表現はマッチする箇所は一緒ですよ。
(私はのほうがより良いと思いますが)因みに大なり小なりはエスケープする必要はありません。
ShuHeiメンバー使い方の違いとなります。
正規表現str|str1|str2で検索した場合左から順番に
マッチするかどうかを試します。
この場合だと一番左のstrが先にマッチするので
str1,str2もマッチしますが、左の項目を優先するので結果的に対象にはなりません。
(yunokiさん注釈どうもです。)なのでstr,str1,str2どれもマッチさせたいなら
(3)を用いるのが良いということですね。ShuHeiメンバーkfuさん
すみません、てっきりProfessionalユーザーの方かと
思っていました・・・デフォルトで文字列を反転させたり、ローマ字の大文字小文字をスワップさせる機能はありません。(見落としていたら御免なさい)
頻繁に文字列の変換などを行うならばProfessionalを
購入されるか、既製のものであればその都度gvimとかemacsとか利用されたほうが手っ取り早いと思いますよ。#takuyaさん補足ありがとうございます。
ShuHeiメンバーマクロを使えばご希望のことは可能です。
下記コードの//Initializeから最後の}までコピーし、
emeditorで新しい文章を開いてペーストし、text_support.jseeという名前をつけて保存してください。そのままtext_support.jseeを開いたまま
1.メニューの「マクロ」より「これを選択」をクリック
2.メニューの「マクロ」より「実行(R)」をクリックそうするとポップアップで
文字を逆にする(T)
大文字小文字を反転する(^)
と表示されるのでお好きな処理を選んでください。
(ヘルプのキーボードマップでこのマクロ設定しておくと便利です)デフォルトでは選択範囲がないとキャレットがある位置の単語を対象に処理を行います。
#息抜きで作ったのでどこか間違ってたらごめんなさい・・・
//Initialize
pos = new Object;
commands = new Array;
ccase = new Array;commands[1] = {
“function” : “reverse”,
“label” : “文字を逆にする(&T)”
}
commands[2] = {
“function” : “swap”,
“label” : “大文字小文字を反転する(&^)”
}ccase[1] = “toLowerCase”;
ccase[2] = “toUpperCase”;String.prototype.reverse = function(){
return this.split(“”).reverse().join(“”);
}
String.prototype.swap = function(){
return swap(this.split(“”));
}//Main
getPos();menu = CreatePopupMenu();
for(var n in commands)
menu.Add(commands[n][‘label’],n);result = menu.Track( 0 );
if( result != 0 ) execute(result)setPos();
Quit();//Functions
function execute(num)
{
document.selection.Text = getText()[commands[num][‘function’]]();
}function getText()
{
with(document.selection)
{
if(!(w = Text))
{
selectWord();
w = Text;
}
}
return w;
}function swap(array)
{
for(i=0;i 64 && num < 91) ? 1 : 2;
}function getPos()
{
with(document.selection)
{
pos = {
x : GetActivePointX(eePosLogical),
y : GetActivePointY(eePosLogical)
}
}
}function setPos()
{
with(document.selection)
{
SetActivePoint(eePosLogical,pos['x'],pos['y'])
}
}ShuHeiメンバーとりあえず現状はCtrl+Sとかに自作のマクロを割り当てて
document.Savedとかて判断するのはどうでしょうか? - 作成者投稿