リージョンやバッファにソートをかけます。実際には、filter-region
やfilter-buffer
を使って、リージョンやバッファにsort
という外部コマンドを実行しています。M-x filter-regionやM-x filter-bufferの後にsortと入力しても同様の効果が得られます。
(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)
カーソルのある行を上下に移動します。ここではM-S-Down、M-S-Upに割り当てています。
同様の機能はデフォルトでもC-x C-t(transpose-lines
)があるんですが、これだと実行後に元いた行の1つ下に下がってしまい、連続実行には向きません。ここにあげたものは、移動と同時にカーソルを上下に(つまりもともとカーソルがあったテキストの部分に)移動してくれるので、連続して上下に移動させることができます。
なお、ここでいう「行」は論理行です。
(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)))
削除バッファの内容をポップアップメニューで表示し、選択したものをカーソル位置に挿入します。クリップボード拡張ソフトみたいな感じです(xyzzy上でしか使えませんが)。ここではM-yに割り当てています。
なお、元々M-yにはyank-pop
が割り当てられています。これはC-yを実行した直後に実行することで「yank
したテキストをそれ以前に削除したテキストと入れ替える」という機能です。C-yの後にM-yを連続して押すと、以前削除したテキストが次々と入れ替わって表示されます。ただ、このyank-select
も同じようなことをより便利に実現できるので、上書きしています。場合によっては空いているC-M-yなどに割り当ててもいいでしょう。
→削除バッファの数の変更
(require "dabbrev") (global-set-key #\C-\; 'dabbrev-popup) (setq *popup-completion-list-default* :always) (setq *minibuffer-popup-completion-list* :never)
補完リストを表示して、選択たものを入力カーソル位置に入力します。このリストは現在編集中のバッファから検索される他、Lispの関数も補完してくれます。ここではC-;に当てています。
(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)
選択部分(なければリージョン)を指定したタグで囲みます。実行するとミニバッファで「Tag:」と入力を求められるので、ここで開始タグを入力します。
形式は、<P>
のように通常のタグの他、P
のように<>で囲んでないものも自動で処理します。また、<P Class="">
やP Class=""
のように属性をつけていても大丈夫です。まあ、<で始まってなければ<>で囲んで、最初の半角スペースまでをタグとして取り出してるってだけなんですが。
xyzzyでタグ打ってる人の数 →に書き込んだのを同スレの374氏に修正していただき、さらにリージョン/セレクションの変換も使わせていただいてます(よってこれもsiteinit.lに加えておかないと、関数が見つかりませんってエラーが出ます。使わない場合は、「(case
」〜「exchange-region-and-selection)))
」までを削除してください)。
(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)