Hatena::Groupcadr

kozima の日記

2009-07-21

transpose-*

| 23:23

transpose- 系のコマンドに前置引数をつけた場合の挙動がよくわかっていなかったのでいろいろ試してみた。

transpose-chars

a[]bcde@f

の状態で試してみる。[] はカーソル位置。@ はマーク位置。

emacs
C-t -->         ba[]cde@f
C-u 2 C-t -->   bca[]de@f
C-u 3 C-t -->   bcda[]e@f
C-u 0 C-t -->   a@fcde[]b

前置引数が non-zero のときは、ポイントの直前にある文字を前置引数分だけ前に動かしています。一方、前置引数が zero の場合はポイントとマークの位置にある文字を入れ替えています。

xyzzy
C-t -->         ba[]cde@f
C-u 2 C-t -->   cba[]de@f
C-u 3 C-t -->   dbca[]e@f
C-u 0 C-t -->   ebcd@a[]f

こちらは前置引数が non-zero のときはポイント直前にある文字と、前置引数分だけ先の文字と入れ替えています。zero のときはポイント直前の文字とマーク直前の文字を入れ替えています。

transpose-words

foo []bar baz qux quux @corge

から。transpose-chars とだいたい同じですね。

emacs
C-t -->         bar foo[] baz qux quux @corge
C-u 2 C-t -->   bar baz foo[] qux quux @corge
C-u 3 C-t -->   bar baz qux foo[] quux @corge
C-u 0 C-t -->   foo @corge baz qux quux []bar
xyzzy
C-t -->         bar foo[] baz qux quux @corge
C-u 2 C-t -->   baz bar foo[] qux quux @corge
C-u 3 C-t -->   qux bar baz foo[] quux @corge
C-u 0 C-t -->   quux bar baz qux foo[] @corge

まとめ

たぶんこんな感じ。

  • 前置引数 non-zero のとき
    • emacs は現在位置または直前の要素を動かす
    • xyzzy は現在位置または直前の要素と前置引数分だけ先にある要素を交換する
  • 前置引数 zero のとき
    • emacs はポイント位置とマーク位置のまたはそれらの直後の要素を交換する
    • xyzzy はポイント位置とマーク位置のまたはそれらの直前の要素を交換する