クリップボードの各行先頭に付加

最近 DokuWiki というのを見つけて、これはけっこう好みかも、と試用を始めました。ファイルベースの Wiki がほしい、という条件で探していたのですが、これなら使い勝手もそこそこよいみたいです。「そこそこ」というのは、サーバーに置いてると手元のテキストエディタよりは反応が悪いあたりが、非常にはがゆいので。この DokuWiki では、スクリプトなどをブロックで引用するのに、各行の先頭に半角スペース2つ入れる、という書式になっていますが、まとめて貼り付けるときにスペースを入れるのが面倒。

そこで、まずクリップボード関連ツールを当たってみたのですが、ちょうどよいのが見つかりませんでした。さらに探す努力をするよりは、いつもの QX エディタのマクロで……、と作ってみました。

メニューを表示して選択させる、というのは QX マクロの定番ですが、メニューアイテムにショートカットキーをつける、というのと、実際に付加する文字列のほかに、それぞれの解説も用意してわかりやすく、という構成になっています。解説文字列の前に「タブ文字(chr$(&h09))」をはさんであります。

選択肢は初期状態で 18 個まで増やせます。もっと増やしたいときは [20] という部分の数を増やしてください。クリップボードの処理が完了してもダイアログなどは出ません。QX エディタのステータスバーに「done!」と表示されるだけ。

proc main
    'ショートカットキー用文字列
    const key$ = "abcdefghijklmnopqrstuvwxyz"
    '変数設定 選択肢メニュー と クリップボードバッファ 他
    dim add$[20], tag$[20],item$[20], clip$, clipall$, sel, i, j, k, n
    '先頭に付加する文字列の選択肢設定 (mainly for dokuwiki)
    i = 1
    add$[i++] = "  "
    add$[i++] = "  * "
    add$[i++] = "    * "
    add$[i++] = "> "
    '選択肢についての解説文字列
    i = 1
    tag$[i++] = "半角スペース2つ"
    tag$[i++] = "箇条書き"
    tag$[i++] = "箇条書き2"
    tag$[i++] = "引用"
    'メニュー表示
    j = 1
    item$[j++] = "[ESC] 終了"
    item$[j++] = "-"
    for k = 1 to i-1
        item$[j++] = "&" + mid$(key$,j-3,1) + ". " + add$[j-3] \
        + chr$(&h09) + tag$[j-3]
    next
    sel = popupmenu(item$)
    if sel < 3 then exit proc
    'クリップボード行数取得
    n = val(clipboard$(-2))
    'クリップボードを行ごとに取得して処理
    for i = 1 to n
        clip$ = add$[sel-2] + clipboard$(i)
        clipall$ = clipall$ + clip$
    next
    clipboard$ = clipall$
    print "done!"
end proc

| | コメント (0) | トラックバック (0)

ルビ入りテキストの印刷

QX エディタには縦書き編集および縦書き印刷機能があり、さらに「特殊メモ」という機能によるルビ印刷ができます。しかし、このルビ印刷の文字サイズは別途指定できません。

QX はテキストエディタとしてじゅうぶんに高機能なので、印刷くらいは別ツールで補完してもよいだろう、という視点でちょっと探してみたところ、「紙蚊帳釣」というフリーウェアを見つけました。窓の杜の “青空文庫”をルビ付きで縦書き印刷できるテキスト印刷ソフト「紙蚊帳釣」 という記事に紹介があります。作者サイトは 鴉の巣

この印刷ツールは「扉」というビューアから派生したようですが、必要な設定が揃っているのがうれしいです。ただし、この設定はプリンタ設定の用紙設定(サイズ・縦横)に依存しますので、用紙を横に使って縦書き印刷したいときは、最初にプリンタ設定で横置きを指定してから設定を行う必要があります。また、行のジャスティフィケーションはありませんので、禁則文字は「はみ出す」か「次の行に送られて行末が欠ける」ことになります。そこまで求めるのであれば、市販ソフトが必要になると思います。

| | コメント (0) | トラックバック (0)

行頭タブの ON/OFF その2

QXエディタには「選択行全体にわたって行頭にタブを挿入する」という基本コマンド BlockIndent があることに、今日になって気がつきました。というわけで、複数行をまとめてインデントするには、このコマンドを何かのキーに割り当てればよいわけですが、この基本コマンドは選択範囲がないと動作しません。そこで、選択範囲がないときは単純にタブコードを挿入するように、マクロで組み合わせてみました。

ついでに、前回のマクロを Tab キーに割り当てたら、なぜか Shift キーでの切替がうまくいかないので、別マクロにして、Tab と Shift + Tab にも確実に割り当てられるようにしてみました。

proc writetab
    if @Select > 0 then '選択がある場合
        @BlockIndent
    else
        @CharTab
    end if
end proc

proc deletetab
    if @Select > 0 then '選択がある場合
        @BlockUnindent
    else
        if @Code = KEY_TAB then @DeleteChar
    end if
end proc

| | コメント (0) | トラックバック (0)

行頭タブの ON/OFF

文書の一部分が選択されていれば、選択行のみに対して、そうでなければカーソルがある行だけに対して、行頭にタブを挿入、もしくは、Shift キーを押し下げつつ実行したときは、行頭がタブならそれを削除、というマクロです。何かキーを割り当てて使用することを想定しています。t$ に代入している部分は、タブコードそのものに置き換えてください。

proc main
    if @hwnd = 0 then exit proc
    dim i, m, n, t$
    t$ = "    "
    @Redraw = 0
    @UndoBlock = 1
    if @Select > 0 then '選択がある場合
        m = @SelectStartLine
        n = @SelectEndLine
        @Select = 0 '選択解除しないと文字列書換えができない
        for i = n-1 to m
            @MoveBeginningLine
            if iskeydown(KEY_SHIFT) then
                if left$(@TextCr$(i),1) = t$ then @Change i, 0, 1, ""
            else
                @Change i, 0, 0, t$
            end if
            @MoveUpChar
        next
        @Line = n
    else
        if iskeydown(KEY_SHIFT) then
            if left$(@TextCr$(@Line),1) = t$ then @Change @Line, 0, 1, ""
        else
            @Change @Line, 0, 0, t$
        end if
    end if
    @UndoBlock = 0
    @Redraw = 1
end proc

| | コメント (0) | トラックバック (0)

編集ウィンドウ二重化

編集中のファイルの編集ウィンドウを二重化し、さらに縦あるいは横に並べて配置します。同じファイルの別の場所を参照しながら編集したいときに。

proc double_tate
    if @hwnd = 0 then exit proc
    @WindowNew
    @WindowChange
    @WindowTileTate2
end proc

proc double_yoko
    if @hwnd = 0 then exit proc
    @WindowNew
    @WindowChange
    @WindowTileYoko2
end proc

| | コメント (0) | トラックバック (0)

コメント行 ON/OFF

マクロ書いたり CGI 書いたりしてると、部分的にコメントアウトしたり、コメントアウトしたのを元に戻したりということをかなり頻繁にやるので、ちょっと自動化する必要が出てきます。コメント関係のマクロは他にもあったと思いますが、好みにあったものを自作するのもマクロ作りの楽しみかも。このマクロは「通常実行でコメント挿入、SHIFT キーを押し下げながら実行することでコメント削除」という動作になってます。

proc main
    if @hwnd = 0 then exit proc
    dim i, line, m, n, c$, cnum
    'ファイルタイプ別設定(いくつでも)/ cnum にはコメント文字列の長さを入れる
    if right$(lcase$(@Filename$),4) = ".mac" then c$ = "' " : cnum = 2
    if right$(lcase$(@Filename$),4) = ".cgi" then c$ = "# " : cnum = 2
    if right$(lcase$(@Filename$),3) = ".pl" then c$ = "# " : cnum = 2
    if right$(lcase$(@Filename$),4) = ".php" then c$ = "// " : cnum = 3
    if c$ = "" then  c$ = "> " : cnum = 2 'その他のファイルなら普通の引用符

    @UndoBlock = 1
    if @Select > 0 then '選択がある場合
        m = @SelectStartLine
        n = @SelectEndLine
        @Select = 0 '選択解除しないと文字列書換えができない
        for i = n-1 to m
            @MoveBeginningLine
            if iskeydown(KEY_SHIFT) then
                if left$(@TextCr$(i),cnum) = c$ then @Change i, 0, cnum, ""
            else
                @Change i, 0, 0, c$
            end if
            @MoveUpChar
        next
        @Line = n
    else
        if iskeydown(KEY_SHIFT) then
            if left$(@TextCr$(@Line),cnum) = c$ then @Change @Line, 0, cnum, ""
        else
            @Change @Line, 0, 0, c$
        end if
    end if
    @UndoBlock = 0
    @Redraw = 1
end proc

| | コメント (0) | トラックバック (0)

FrameMaker での半角ブラケット

FrameMaker は海外発のアプリケーションではあるが、Adobe がかなりまじめに日本語対応を考えているためか、句読点の「ツメ」とか、日本語と英数半角の間に自動的に入れるスペースの幅設定とかの日本語の組版関係の設定もある。しかし、「禁則設定」のダイアログがない。

この点については Adobe のサポートデータベースでも [ FrameMaker の禁則処理について ] という文書でいちおう対応している。

マニュアル関係で多用するブラケット([ と ])について、具体的な設定を以下に解説。

  1. 該当の FM ファイルを MIF 形式で保存。
  2. MIF ファイルをテキストエディタで開き、「>BegParentheses」を検索。
  3. この行およびその次の行が、行末に来ないカッコと行頭に来ないカッコの指定なので、それぞれ [ と ] を追加する。
  4. その少し下の「>RomanChar」の設定から [\\] と () を削除。
  5. MIF ファイルを保存。FrameMaker から読み込んで FM 形式で保存しなおす。

4 つめの項目がミソ、だと思います。間違ってたら指摘よろしく。

| | コメント (0) | トラックバック (0)

«FrameMaker 7.2 発表