xyzzy
Top Page > Editing Tips


テキスト移動

ソート

C-x | sort
リージョンをソート
C-x # sort
バッファ全体をソート

 リージョンやバッファにソートをかけます。実際には、filter-regionfilter-bufferを使って、リージョンやバッファにsortという外部コマンドを実行しています。M-x filter-regionM-x filter-bufferの後にsortと入力しても同様の効果が得られます。

カーソル行を上下に移動
 →MailingList 1048

site-init.l(追加)
(defun transpose-lines-down (&optional (n 1))
  (interactive "*p")
  (when (save-excursion (forward-line n))
    (let ((column (current-column))
      (beg (progn (goto-bol) (point)))
      (end (progn
         (or (forward-line 1)
             (progn (goto-eol) (insert #\LFD)))
         (point))))
      (insert (prog1
          (buffer-substring beg end)
        (delete-region beg end)
        (forward-line n)))
      (forward-line -1)
      (goto-column column))))
(defun transpose-lines-up (&optional (n 1))
  (interactive "*p")
  (transpose-lines-down (- n)))

(global-set-key #\M-S-Down 'transpose-lines-down)
(global-set-key #\M-S-Up 'transpose-lines-up)

commentary

 カーソルのある行を上下に移動します。ここではM-S-DownM-S-Upに割り当てています。
 同様の機能はデフォルトでもC-x C-t(transpose-lines)があるんですが、これだと実行後に元いた行の1つ下に下がってしまい、連続実行には向きません。ここにあげたものは、移動と同時にカーソルを上下に(つまりもともとカーソルがあったテキストの部分に)移動してくれるので、連続して上下に移動させることができます。
 なお、ここでいう「行」は論理行です。

テキスト挿入

Yank Selectメニュー
 →Written by Suda and Hie

siteinit.l(追加)
(add-hook '*init-app-menus-hook*
      #'(lambda ()
          (defvar *your-app-popup-menu* nil)
          (setq *your-app-popup-menu* (create-popup-menu nil))
          (defun yank-select ()
        (interactive)
        (while (get-menu-position *your-app-popup-menu* 'yank-select)
          (delete-menu *your-app-popup-menu* 'yank-select))
        (continue-pre-selection)
        (dotimes (arg (length *kill-ring*))
          (let ((string (car (ed::current-kill arg t))))
            (add-menu-item *your-app-popup-menu* 'yank-select
                   (if (< (length string) 40)
                       string
                       (substring string 0 40))
                       #'(lambda ()
                       (interactive)
                       (insert string)))))
                       (track-popup-menu *your-app-popup-menu*))
                       (global-set-key #\M-y 'yank-select)))

commentary

 削除バッファの内容をポップアップメニューで表示し、選択したものをカーソル位置に挿入します。クリップボード拡張ソフトみたいな感じです(xyzzy上でしか使えませんが)。ここではM-yに割り当てています。
 なお、元々M-yにはyank-popが割り当てられています。これはC-yを実行した直後に実行することで「yankしたテキストをそれ以前に削除したテキストと入れ替える」という機能です。C-yの後にM-yを連続して押すと、以前削除したテキストが次々と入れ替わって表示されます。ただ、このyank-selectも同じようなことをより便利に実現できるので、上書きしています。場合によっては空いているC-M-yなどに割り当ててもいいでしょう。
削除バッファの数の変更

補完にポップアップ
 →Witten by YMTZ

siteinit.l(追加)
(require "dabbrev")
(global-set-key #\C-\; 'dabbrev-popup)
(setq *popup-completion-list-default* :always)
(setq *minibuffer-popup-completion-list* :never)

commentary

 補完リストを表示して、選択たものを入力カーソル位置に入力します。このリストは現在編集中のバッファから検索される他、Lispの関数も補完してくれます。ここではC-;に当てています。

リージョン・セレクションををタグで囲む

siteinit.l
(defun quote-region-by-tag (&optional (quotetag ""))
  (interactive "*sTag: ") ; s => 文字入力を指示する。
    ; 入力された文字列は quotetag に割り当てられる。
    (setq starttag (string-trim "<>" quotetag))
  (setq endtag (substitute-string starttag " .*" ""))
  (case (get-selection-type)
    ((1 2)
     (exchange-region-and-selection)))
  (let ((begin (mark))
        (end (point)))
    (when (> begin end)
      (let ((tmp begin))
        (setq begin end
              end tmp)))
    (save-excursion
      (goto-char end)
      (insert "</" endtag ">")
      (goto-char begin)
      (insert "<" starttag ">"))))
(global-set-key #\C-t 'quote-region-by-tag)

commentary

 選択部分(なければリージョン)を指定したタグで囲みます。実行するとミニバッファで「Tag:」と入力を求められるので、ここで開始タグを入力します。
 形式は、<P>のように通常のタグの他、Pのように<>で囲んでないものも自動で処理します。また、<P Class="">P Class=""のように属性をつけていても大丈夫です。まあ、<で始まってなければ<>で囲んで、最初の半角スペースまでをタグとして取り出してるってだけなんですが。
 xyzzyでタグ打ってる人の数 →に書き込んだのを同スレの374氏に修正していただき、さらにリージョン/セレクションの変換も使わせていただいてます(よってこれもsiteinit.lに加えておかないと、関数が見つかりませんってエラーが出ます。使わない場合は、「(case」〜「exchange-region-and-selection)))」までを削除してください)。

その他

リージョン/セレクションの変換
 →Written by Han

siteinit.l(追加)
(defun exchange-region-and-selection ()
  "リージョンと選択範囲をトグルで変換"
  (interactive)
  (let (start end)
  (case (get-selection-type)
  ((1 2)
  (setq start (selection-mark))
  (setq end   (selection-point))
  (if (> start end)
  (rotatef start end))
  (stop-selection)
  (set-mark start)
  (goto-char end))
  (3
  (error "矩形選択はリージョンに変換できません"))
  (t
  (if (mark t)
  (progn (setq start (mark))
  (setq end   (point))
  (if (> start end)
  (rotatef start end))
  (start-selection 2 t start)
  (goto-char end))
  (error "マークがないので選択範囲に変換できません"))))))
  (global-set-key #\M-r 'exchange-region-and-selection)

commentary

 リージョンを使う場合、マーク位置が細かくは分からないので(マーク行は設定で表示できますが)、どこにマークしたか分からなくなることがあります。この関数を実行すると、リージョンと範囲選択が交互に変換されます。
 ここではM-rに設定しています。セレクションになった時点でC-cC-xがコピー・切り取りになるので、Win型<のキーバインドに設定している場合はこれらに設定するのはやめておきましょう。/P>

 なお、単にマーク位置を調べたいなら、C-x C-xでマークとカーソル位置を入れ替えるといいです。2度実行すればマーク位置・カーソル位置ともに元に戻ります。

▲トップページに戻る▲

テキスト移動

ソート

行移動

テキスト挿入

yank-select

補完popup

タグで囲む

その他

リージョン・セレクション変換