お品書き

概要 *

filesnippet-2007.07.15.zip

Abbrevで展開した後に、

  • 指定した位置にジャンプ
  • 編集した部分を他の場所に反映

します。

プログラムやHTMLなどの定型的な文を良く入力する人以外はあまり美味しくないかもしれません。

TextMateで話題になっていたので勢いで実装しました。
詳細が良く分からないところや、しっかり考えてないところがあるので、
いろいろと問題があるかもしれません。

ac-modeと一緒に使うことを推奨。

ScreenCast *

使ってる様子を動画で紹介
紫色のポップアップしてるやつはac-modeが出してる補完候補です。

使い方 *

abbrevで使用する設定をそのまま使っています。(デフォルトでは~/.abbrev_defs)
ac-modeを導入している方はabbrevの展開前の文字列の直後でTABを押してください。
ac-modeを導入していない方は.xyzzyに

(define-key ctl-x-map #\' 'snippet-expand)

等とキーバインドを定義し、abbrevの展開前の文字列の直後で C-x ' を押してください。

TAB/C-x 'で展開すると、snippet-modeに入ります。
snippet-modeではC-n/C-pでジャンプできます。
C-n/C-pで移動する先がない場合や、C-gを押すとsnippet-modeを抜け、
元の状態に戻ります。
TextMateではTABでジャンプするようですが、
ジャンプして編集してる時にac-modeで補完したいので、
ジャンプはC-n/C-pで行うようにしています。
(なので戻ることも出来ます。)

使い方 2 *

abbrev/snippetがよく分からんという人や、とりあえず試してみたい人用。

  1. snippet.lをsite-lispにコピー
  2. ~/.abbrev_defsに以下を書いて保存
    (in-package "editor")
    (define-abbrev-table '*global-abbrev-table* '(
    ("class" "class ${1:ClassName} (${2:object}):
        def __init__(self${3:, arg}):
            \"\"\"${4:documentation}\"\"\"
    ${3/, *\\([a-zA-Z][0-9a-zA-Z_]*\\)/        self.\\1 = \\1\n/g}
        $0")))
  3. .xyzzyに以下を追加して保存後、xyzzyを再起動
    (quietly-read-abbrev-file)
    (require "snippet")
    (define-key ctl-x-map #\' 'snippet-expand)
  4. *scratch* バッファなどで class と入力し、
    キャレットを動かさずに C-x ' を押してください。
    以下のように展開され、ClassNameを選択している状態たと思います。
    class ClassName (object):
        def __init__(self, arg):
            """documentation"""
            self.arg = arg
  5. 適当にクラス名を入力して C-n を押してください。
    objectの部分にキャレットがジャンプしたと思います。
    もう一度 C-n を押し、
    , arg
    , arg1, arg2, arg3
    などに編集してみてください。
    以下のようになると思います。
    class ClassName (object):
        def __init__(self, arg1, arg2, arg3):
            """documentation"""
            self.arg1 = arg1
            self.arg2 = arg2
            self.arg3 = arg3
  6. 最後まで C-n でジャンプするか、途中で C-g を押すとsnippet-modeを抜けます。
    ちなみに、snippet-modeの状態なら間違えても C-p で戻れます。

使い方 3 *

M-x snippet-select-and-expand
何か入力して選ぶ。
後は一緒。

書式 *

1. ${[0-9]:default}

    キャレットが移動する位置。
    デフォルト値を指定すると、ジャンプした時に選択状態になる。

2. ${[0-9]/pattern/format/option}

    1で指定されたものと同じ数字を指定することで連動して変化する文字列。
    patternに正規表現を指定し、formatに挿入する文字列を指定します。
    formatには\\1-\\9が指定可能です。
    optionには今のところgのみ指定可能です。(何度もマッチさせます。)
    ${[0-9]/.*/\\0}の省略系として${[0-9]}が使えます。
    単純に他の場所に同じ文字列を使いたい場合は${1}の方が多少楽です。

3. $[0-9]

    1番目の書式のデフォルト値を指定しない時の省略形。
    ただし、$0を最後に書くとsnippet-modeを抜ける(ジャンプできなくなる)ので注意してください。

4. ${file:path}

    pathにあるファイルの中身を挿入します。
    (${file:~/.license}や${file:C:/doc/hoge.txt}のように使います)
    1,2,3の書式を展開する前に挿入するので、ファイル内に1,2,3の書式を使うことができます。
    ${file:path}周辺の数字とファイル内の書式の数字が重複しないようにしてください。

具体的な例は使用方法2の1を見てください。
1-9までを指定した場合は色も付きます。

置換マクロ *

書式1に使用できる置換マクロ
XYZZY-SELECTIONセレクション
書式1及び2のformat部に使用できる置換マクロ
XYZZY-FILE-NAMEフルパス
XYZZY-FILE-DIRECTORY-NAMESTRINGディレクトリ名
XYZZY-FILE-NAMESTRINGファイル名
XYZZY-FILE-PATHNAME-NAMEファイル名(拡張子無し)
XYZZY-FILE-PATHNAME-TYPE拡張子
XYZZY-FILE-PATHNAME-DEVICEドライブ名
行頭に使用できる置換マクロ
$INDENTmode-specific-indent-commandで指定されたインデントコマンドでインデント

履歴 *

2007.07.15

  • 10個以上の展開ができなかったのを修正

2007.04.14

  • 選択直後のバッファ修正の挙動を修正

2007.04.12

  • 番号と属性の対応を決める変数 *snippet-attribute-dict* を追加
  • ファイルを指定して挿入する書式を追加

2007.03.22

  • バッファ変更コマンドかどうかのフラグを元に戻すタイミングを修正

2007.03.16

  • 正規表現を微妙に変更

2007.03.13

  • インデント分の空白がセレクションに含まれていたのを修正

2007.03.12

  • バッファを修正するコマンドを自動で判定するようにした
  • それに伴ってsnippet-modify-commandを廃止

2007.03.07

  • 特定のparen.lへの依存をなくしたつもり
  • ${1/.*/\\0}を${1}と省略できるようにした

2007.03.02

  • マーカー($0などで使用)の位置に文字を挿入した時、同時にマーカーも動くようにあちこち修正
  • シンボルの開始位置を見るようにした(1文字のみの定義があっても誤爆しないように)

2007.02.22

  • $0が他の${1:hoge}などにくっついてるとうまくジャンプできなかったのを修正
    (バッファの末尾で展開した時だけはできない)

2007.02.19

  • C-nでジャンプした後にac-mode-complete-or-indent(TAB)
    が実行されたら選択中の文字列を削除するようにした
  • indent-regionを使わずに一行ずつインデントするようにした(末尾の空白が消されるため)

2007.02.15

  • キーボードマクロで使えるようにした

2007.02.09

  • セレクション関係のバグ修正

2007.02.08

  • ミニバッファから選択してsnippetを挿入する機能を追加
  • XYZZY-SELECTIONを追加
  • 書式2にスラッシュを指定できるようにした(エスケープする必要有り)

2007.01.20

  • あちこち修正。
  • 本来abbrevで展開できない文字(記号が含まれていたり)でも展開。
  • インデントする展開マクロ$INDENT(仮)を追加。

2007.01.12

  • ものすごく修正

2007.01.10

  • 初版

コメント *

最新の10件を表示しています。 コメントページを参照

  • 作者さんにとって色変更の設定が使わない機能ならば、却下されても構いません。 -- 甘栗? 2007-03-18 (日) 13:28:22
  • 私も試行錯誤をあきらめました。
    行ごとに$INDENTがあるよりは、展開語の先頭に$INDENTがあったら全体をindentしてくれる形式にすると、実装も使い方も楽になると思います。
    一部だけindentする需要ってありますか? -- tt? 2007-03-22 (木) 12:14:49
  • 色はそのうちやることにします。
    インデントは、そういわれれば全体でやっちゃってもいい気がするんですがちょっと問題があります。
    行頭に${n:foo}があるsnippetを展開すると、展開後に
    foo
    ってなりますよね。fooの部分はset-text-attributeで色付けされます。
    その状態で行頭に空白を挿入すると、その空白の部分もfooと同じ属性になります。
    そうすると、C-nでジャンプしたときに空白部分も一緒に選択してしまいます。
    なので、インデントする行の行頭に$INDENTを書く(=行頭に${n:foo}がこないようにする)、という今の仕様になってます。
    これをどうにかできない限り解決しそうにありません。 -- シロ? 2007-03-22 (木) 16:36:22
  • 色の設定の件、やってみました。 -- シロ? 2007-04-12 (木) 21:54:18
  • 色の件ありがとうございます。これで大分見やすくなりました。
    インデントについてなんですが、色付け前にインデントさせることはできないのでしょうか?何か別の問題がでてくるんですかね? -- 甘栗? 2007-04-14 (土) 10:06:17
  • ${}内に改行があると、そこで改行した状態でインデントした後に展開するのでうまいこといきませんでした。 -- シロ? 2007-04-14 (土) 13:50:58
  • 10個以上の展開ができないようです。
    snippet.l の 591行目? の正規表現を次のように変えたら動きました。
    (while (scan-buffer "\\(?:[^\\]\\|^\\)\\($\\(?:\\([0-9]+\\)\\|{\\([0-9]+\\)\\(?::\\([^}]*\\)\\)}\\)\\)" -- NKN? 2007-07-15 (日) 15:28:14
  • ありがとうございます。取り込みました。 -- シロ? 2007-07-15 (日) 16:41:10
  • 1 -- 163已覚利? 2007-08-12 (日) 06:07:11
  • snippetを使うとenable-post-buffer-modified-hookがnilになってしまうのですが、これを実行時の値を維持するようにはできませんか?変更行をマークなどのpost-buffer-modified-hookを使った他のlispがsnippet実行後無効になってしまいます。 -- たんぽぽ? 2008-06-09 (月) 12:18:16
お名前:

Tag: xyzzy script



添付ファイル: filesnippet-2007.07.15.zip 1461件 [詳細] filesnippet-2007.04.14.zip 571件 [詳細] filesnippet-2007.04.12.zip [詳細] filesnippet-2007.03.22.zip 526件 [詳細] filesnippet-2007.03.16.zip 498件 [詳細] filesnippet-2007.03.13.zip 484件 [詳細] filesnippet-2007.03.12.zip 466件 [詳細]
トップ   編集 凍結 差分 BACKUP 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2007-08-05 (日) 05:40:17 (3525d)