とりあえず日記

VIM→秀丸エディタ→VIM→秀丸エディタ→VIM→秀丸エディタ→VIM→秀丸エディタ→VIM→秀丸エディタ→VIM→秀丸エディタ(いまここ🍄)

秀丸エディタでPythonを実行するマクロ

秀丸エディタPythonを実行するマクロを書きました。

特徴

ファイル(.py)に保存する必要がないので、思いついたときにPythonコードを実行することが出来ます。
もちろん、ファイルに保存してあっても動作します。

動作環境

秀丸エディタver8.20 b14で動作を確認。
ver8以降なら動くはずです。

インストール方法

cmd_python.mac秀丸のマクロディレクトリへコピーしたらキーアサインして下さい。
あと、Pythonはインストールしておいて下さい。

その1

その2

その3

その4


Pythonバージョン

Python 2/3系で動作を確認しています。
Pythonのバージョン切り替えはマクロ冒頭の $g_exe 変数を編集して下さい。

//python.exe へのパス
$g_exe	= "python.exe";
//$g_exe	= "C:\\Python26\\python.exe";
//$g_exe	= "C:\\Python27\\python.exe";
//$g_exe	= "C:\\Python32\\python.exe";

マクロの内側

文字コード

Pythonは以下のように文字コードを明示する必要があります。

# -*- coding:utf8 -*-
print u"にほんご"

毎回記述するのは面倒なので秀丸マクロ側で補っています。

リダイレクト

あと、Pythonはリダイレクトすると下記エラーメッセージが出力されます。

UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128)

マクロ側で補っていること(文字コード+リダイレクト)

このエラーが出力されないように秀丸マクロ側で補っています。
何をやっているかというとコード先頭に定型処理を挿入しているだけです。

元のコード
print u"にほんご"
秀丸マクロで補った結果
# -*- coding:utf8 -*-
import sys, codecs
sys.stdout = codecs.getwriter('cp932')(sys.stdout)
del sys, codecs
print u"にほんご"

副作用としてはエラー出力時の行番号がずれることです。。。まあ正確さよりも利便性を優先しています。
文字コードの取得は秀丸マクロのプロパティから取得しています。(一応、中国語、韓国語も対応したつもりですが、動作検証は行っていません。)

まとめ


初めてのPython 第3版

初めてのPython 第3版

秀丸スーパーライセンスパック [ダウンロード]

秀丸スーパーライセンスパック [ダウンロード]

次の秀丸マクロ

次は、Python の lint を秀丸エディタから使えるようなマクロを書こうかと思っています。
ちょっとググってみると、PyChecker、Pylint、PyFlakesが有名なようです。

あと、VIMにはflymake.vimっていうスクリプトがあるようなので、こちらも併せて調べてみようかと思います。

いつ完成するかは分かりませんが、まずは下調べから。

Visual Assist Xっぽい秀丸マクロとりあえず完成

id:ohtorii:20120204 前回の続き。

Visual Assist X の Hovering Tooltipsっぽ秀丸マクロがとりあえず完成しました。

とりあえず完成なので正常系は動きますが、異常系は・・・

インストール方法

とりあえず、macroディレクトリ中のファイルを秀丸エディタのマクロディレクトリへ全てコピーしてください。
hovering_tooltips_config.ini 中のファイルパスなどを編集してください。

まだマニュアル類はないです・・・すいません。


動作イメージ

C++


Visual Assist Xっぽい秀丸マクロを書いてみた

id:ohtorii:20120128 の続き。


Visual Assist X の Hovering Tooltips っぽい秀丸マクロを途中まで書いてみました。

何をするマクロかというと、関数とかクラスのコメントを表示するマクロです。
コメントはTooltipsで表示したかったんですが、秀丸エディタに機能がそもそも無いため、仮でアウトプット枠へ出力しています。

C++


Perl


メモ

上記で使用しているソースコードLLVM 3.0のものです。

やっていること

Exuberant Ctagsが生成した「tagsファイル」をパースして諸々処理しています。
ちなみに、Exuberant Ctagsは41言語に対応しているのでサーバ系開発から組み込み系まで幅広く使えるんじゃないでしょうか?

今後

まだ、作成途中です。
ボチボチやっていきます。

tagsファイル(Exuberant Ctags)を解析してみたのでその覚え書き。

Visual Assist X の Hovering Tooltips っぽい機能を秀丸マクロで実装するために、tagsファイルを解析しています。

Hovering Tooltipsの詳細はこちら

http://www.wholetomato.com/products/features/hover.asp

要するに関数のコメントをTooltipでポップアップ表示する機能ですな。
こんなのを秀丸マクロで作ろうとしています。

さてtagsファイルの中身ですが

tagsファイルの中身はシンボル名でソートされたテキストファイルになっていて、テキストエディタで開くとこんな風になってます。

!_TAG_FILE_FORMAT	2	/extended format; --format=1 will not append ;" to lines/
!_TAG_FILE_SORTED	1	/0=unsorted, 1=sorted, 2=foldcase/
!_TAG_PROGRAM_AUTHOR	Darren Hiebert	/dhiebert@users.sourceforge.net/
!_TAG_PROGRAM_JP_AUTHOR	Hirohito Higashi	/h_east@pop11.odn.ne.jp/
!_TAG_PROGRAM_JP_URL	http://hp.vector.co.jp/authors/VA025040/	//
!_TAG_PROGRAM_NAME	Exuberant Ctags	//
!_TAG_PROGRAM_URL	http://ctags.sourceforge.net	/official site/
!_TAG_PROGRAM_VERSION	5.8J1	//
$0	.\test\MC\AsmParser\macro-def-in-instantiation.s	/^$0 $1$/;"	l
$2	.\test\MC\AsmParser\macro-def-in-instantiation.s	/^$2 $3$/;"	l
<<省略>>
~s1	.\tools\clang-3.0.src\test\SemaTemplate\destructor-template.cpp	/^    ~s1() {}$/;"	f	class:s0::s1	file:
~scoped_ptr	.\utils\unittest\googletest\include\gtest\internal\gtest-port.h	/^  ~scoped_ptr() { reset(); }$/;"	f	class:testing::internal::scoped_ptr
~simple_ptr	.\tools\clang-3.0.src\test\SemaCXX\destructor.cpp	/^  ~simple_ptr() { delete _ptr; } \/\/ \\$/;"	f	class:dnvd::simple_ptr
~simple_ptr2	.\tools\clang-3.0.src\test\SemaCXX\destructor.cpp	/^  ~simple_ptr2() { delete _ptr; } \/\/ expected-warning {{delete called on 'dnvd::B' that has virtual functions but non-virtual destructor}}$/;"	f	class:dnvd::simple_ptr2
~thing	.\tools\clang-3.0.src\test\SemaTemplate\alias-templates.cpp	/^    ~thing() { traits.free(static_cast<inner_ptr&&>(val)); }$/;"	f	struct:X::thing
~unique_ptr	.\tools\clang-3.0.src\test\SemaCXX\rval-references-examples.cpp	/^  ~unique_ptr() { delete ptr; }$/;"	f	class:unique_ptr
~usage_requirements	.\tools\clang-3.0.src\test\SemaTemplate\instantiate-field.cpp	/^    ~usage_requirements()$/;"	f	struct:PR7123::usage_requirements
~xpto	.\tools\clang-3.0.src\test\CodeGenCXX\array-construction.cpp	/^  ~xpto() {$/;"	f	class:xpto

1行が横に長いためブラウザによっては折り返されて見にくいかもしれません。
上記サンプルは、LLVM3.0のソールコードからtagsファイルを作っています。ちなみにファイルサイズは17MBです。

並び方は、

シンボル名 ファイル名 シンボルの定義値を探す正規表現 ・・・

tagsファイルを作った後でテキストを編集し行番号がずれたときでもシンボルを検索出来るように行番号は格納されていません。
その代わりに正規表現で探します。(まさにテキストエディタ向けのフォーマット)

tagsファイルからシンボルを検索する

tagsファイルはシンボル名でソートされています。
ふと思いつくのは二分検索(Binary Search)ですが、ファイルに対しての二分検索はランダムアクセスなので効率が悪いのと、任意の行へアクセスするには別途補助情報(行番号へのオフセットを格納したファイル??)が必要になります、、、面倒です。

「データベースを別途用意すれば・・・」とも思いましたが、管理するものが増えてこれも面倒です。(DBという別の問題にすり替えただけ)

まあ、うだうだと頭の中で考えていても仕方ないので、tagsファイルのシンボルを線形検索で探すプログラムを書いたところ、17MB程度のtagsファイルを一瞬で検索出来ました。
きちんと時間は計っていませんが(すいません)テキストエディタから呼び出して使うぶんには問題なさそうです。

100MB級のtagsファイルを検索して遅ければ、それはその時に考えようかと思います。

作ったプログラム

Githubへアップしました。
https://github.com/ohtorii/hidemaru_hovering_tooltips

使い方

>ctags_search createCXTUResourceUsageEntry ..\sample\tags

createCXTUResourceUsageEntry    .\tools\clang-3.0.src\tools\libclang\CIndex.cpp /^static inline void createCXTUResourceUsageEntry(MemUsageEntries &entries,$/;" f       file:

今後の予定

tagsファイルから「関数名、クラス名・・・」などを検索することができたので、あとは秀丸ディタ側の処理だけです。
ぼちぼち、やっていこうかと思います。

数値を増やしながら貼り付ける秀丸マクロ

はじめに

プログラムを書いていると、テキストの数値部分を増やしながら貼り付けたいことが時々あります。
というわけで、サクッと秀丸マクロを書きました。

簡単な紹介

クリップボードに格納されたテキストを貼り付けるときに、数値の箇所があれば1つずつ増やしながら貼り付ける秀丸マクロです。

マクロが連続起動されていたら数値を増やします、そうじゃないときは普通に貼り付けます。
数値は16進数と10進数に対応しています。

動作イメージ

スニペットマクロ(インキュベーターバージョン)

いまさらですが、動的なスニペットマクロを書きました。
インキュベーターバージョンを公開します。

始めに

静的なスニペットマクロは色々あるので困りませんが、動的なスニペットとなると「これっ!」というのが見つからず結局書いてしまいました。

スクリーンショット

クラス宣言(C++)


クラス宣言(Python)


拡張

秀丸マクロで拡張するのはつらいのでpython/VBScript/JavaScriptなど使えるようになっています。

その他

emacsyasnippetを参考にしています。(動作は似ても似つかないですが・・・すいません)

本家の動作。

前半はインストール方法の説明です、スニペットの動作は1分20秒から始まります。

考え方

テキストを効率よく入力するんじゃ無くて、ガシガシ自動生成するという考え方を取り入れてみました。
100のテキストを効率よく入力するよりも、1の入力で100のテキストを自動生成したいんですよ。

最後に

Pythonディレクトリが固定だったりと自分の環境でしかテストしていません。
インキュベーターバージョンということでご了承を。
もう少しちゃんと動くようにして正式なリリースを行いたいと思います。