その他いろいろ

Last modified: "2019/01/02 17:49:36"

Table of contents


知っていると便利な辺り

ファンクションキーのカスタマイズ

F1 で info を起動するようにする。

キーバインドを変更する。

(global-set-key #\F1 'ed::info)

ラベルを変更する。

(set-function-bar-label #\F1 "info")

設定されているキーを無効に

(undefine-key *kamail-folder-map* #\g)

前に実行した関数をもう一度

ESC p (repeat-complex-command) する。 C-p とか ↑ で履歴をさかのぼったり、 C-n とか ↓ で履歴をさかくだったりできる。


ナローイングとワイディング

バッファの指定領域のみ表示する。というか、他の領域を見えにくくしてそこへ移動できなくする。 バッファ全体に対して行われる処理を、指定領域に対してだけ行うことができる。 ワイディングは、ナローイングした状態から通常の状態に戻す。 Emacs を使ってた人ならあたりまえな機能かもしれないけど、そうでない人には、聞きなれないものと思う。

リージョンをナローイング --- C-x n
ワイディング --- C-x w


指定行に飛ぶ

メニューからする場合は、「検索(S)」→「指定行(J)」、キー操作で行いたい場合は、 ESC g (goto-line) 。


C-SPC に別の機能を割り当てる

set-mark-command は、C-@ でするので、C-SPC に別の機能を割り当てたいという場合は、 こんな感じ。xyzzy Part7 491 を参考に。

(set-extended-key-translate-table exkey-C-space #\F14)
(global-set-key #\F14 'dabbrev-expand)
    

以下、xyzzy Part7 491 よりそのまま引用。

ファンクションキーは F24 まであって Ctrl, Alt, Shift と組み合わせることが可能。 exkey-* は M-x apropos [RET] exkey と打てば何が定義されてるか見られる。

exkey- に指定できるあたりは、 Toy さんのぺーじ に詳しい説明がある。

ちなみに F20 を使うと、 outline-tree のキーバンド設定例をそのまま使っている場合に、olt:olt-node-action が潰れてしまうので要注意。


セレクション用キーマップの作成

セレクション用のキーマップを作成する。winkey.l を使ってる人は必要なし。
2ch 上の OHKUBO さんより。

(unless (keymapp selection-keymap)
  (setq-default selection-keymap (make-sparse-keymap)))

いろいろ

バッファ全体の改行以外の文字数

より。

(defun count-buffer-char ()
  (interactive)
  (save-excursion
        (goto-char (point-min))
        (count-matches ".")))

改行以外の文字数(セレクション対応)

セレクションがあればセレクション内の、なければバッファ全体の改行以外の文字数をカウントする。

(defun count-buffer-char ()
(interactive)
(if (get-selection-type)
    ;selection があれば narrowing して実行
  (selection-start-end (start end)
    (narrow-to-region start end)
    (goto-char (point-min))
    (count-matches ".")
    (selection-end-of-buffer)
    (widen))
  ;selection がなければそのまま実行
  (save-excursion
         (goto-char (point-min))
         (count-matches "."))))

カーソル位置からの文字数と段落数

[xyzzy:07780](竹内 輝昭さん)より。カーソル位置からバッファ末尾までの文字数と段落数を数える。

(defun count-char-from-point ()
  (interactive)
  (save-excursion
    (let ((p1 (point))
          (p2 (point-max)))
      (setq parcnt
            (- (progn (goto-char p2) (current-line-number))
               (progn (goto-char p1) (current-line-number))))
      (message "~d paragraphs, ~d characters."
               parcnt (- p2 p1 parcnt)))))

switch-to-buffer のフレーム版。補完つき。

[xyzzy:08160](亀井さん)より。

(defun switch-pseudo-frame (name)
  (interactive (list (completing-read "Frame: "
                                      (mapcar #'ed::pseudo-frame-name
                                              ed::*pseudo-frame-list*)
                                      :must-match t)))
  (select-pseudo-frame (or (find-pseudo-frame name)
                           (error "~aはありません" name))))

フレーム移動

xyzzy Part6 832 より。

;; 前のフレーム
(global-set-key #\S-C-F24 'previous-pseudo-frame)
(set-extended-key-translate-table exkey-S-C-tab #\S-C-F24)

;; 次のフレーム
(global-set-key #\C-F24 'next-pseudo-frame)
(set-extended-key-translate-table exkey-C-tab #\C-F24)

マシン毎に処理を分岐

(defun my-machine-check ()
  (interactive)
  (let ((x (machine-name)))
    (cond ((string= x "ouchi")
               (message "いえ"))
          ((string= x "kaisya")
               (message "かいしゃ"))
          (t "default")
          )))

改行、タブの表示に使う文字

より。

(setq-default display-newline-char #\downwards_arrow_with_tip_leftwards)
(setq-default display-first-tab-char #\rightwards_arrow_to_bar)
(setq-default display-rest-tab-char nil)

シフトキーを押しながら移動で範囲選択

xyzzy Part7 58-61 より。

(require "wip/winapi")
(c:define-dll-entry c:short GetKeyState (c:int) "user32")

(global-set-key #\C-b 'my-backward-char)
(defun my-backward-char ()
  (interactive)
  (if (or (minusp (GetKeyState 16))
          (minusp (GetKeyState 160)))
      (selection-backward-char)
    (backward-char)))

(global-set-key #\C-p 'my-previous-virtual-line)
(defun my-previous-virtual-line ()
  (interactive)
  (if (or (minusp (GetKeyState 16))
          (minusp (GetKeyState 160)))
      (selection-previous-virtual-line)
    (previous-virtual-line)))

(global-set-key #\C-f 'my-forward-char)
(defun my-forward-char ()
  (interactive)
  (if (or (minusp (GetKeyState 16))
          (minusp (GetKeyState 160)))
      (selection-forward-char)
    (forward-char)))

(global-set-key #\C-n 'my-next-virtual-line)
(defun my-next-virtual-line ()
  (interactive)
  (if (or (minusp (GetKeyState 16))
          (minusp (GetKeyState 160)))
      (selection-next-virtual-line)
    (next-virtual-line)))

ヘルプ検索

HTML Help を検索するには、変数 *html-help-path* にヘルプファイルのパスをセットし、 show-html-help を実行すると、キャレット位置の単語を検索してくれる。 以下では、ruby のヘルプを引いてみた (C-F1) 。

(defun ruby-show-html-help ()
  (interactive)
  (let ((*html-help-path* "C:/usr/local/ruby/rubymanjp.chm"))
    (show-html-help)))
(define-key *ruby-mode-map* #\C-F1 'ruby-show-html-help)

同じく Windows Help (?) を検索するには、変数 *winhelp-path* にヘルプファイルのパスをセットし、 show-winhelp を実行するとできるみたい。

(defun delphi-show-winhelp ()
  (interactive)
  (let ((*winhelp-path* "C:/Program Files/Borland/Delphi6/Help/delphi6.hlp"))
    (show-winhelp)))

xyzzy 起動時にファイルを指定して diff

xyzzy Part7 304(正体は OHKUBO さんらしい)より。 バッチファイルとかから xyzzycli.exe -f diff-command-line %1 %2 とかして使う。 SendTo に入れておいて、Explorer からつかっても便利。

(defun diff-command-line ()
  (require "diff")
  (let ((new-file (pop si:*command-line-args*))
        (old-file (pop si:*command-line-args*)))
    (diff new-file old-file)))

si:*command-line-args* は、xyzzy 起動時の引数をリストとしてもっているらしい。


数値を文字列に変換するマクロ

xyzzy Part7 277 より。

(defmacro int2str (int)
  `(format nil "~A" ,int))

終了時に確認ダイアログを表示

xyzzy Part7 477, 480 より。

(defun query-kill-xyzzy (&optional noquestion)
  (interactive)
  (when (and (not noquestion)
             (yes-or-no-p "本当に xyzzy を終了しますか?"))
    (kill-xyzzy)))
(add-hook 'ed::*query-kill-xyzzy-hook* 'query-kill-xyzzy)

C-x C-c 実行時のみ確認させる場合は、add-hook を無効にして以下を追加する。

(define-key ctl-x-map #\C-c 'query-kill-xyzzy)

論理ドライブの取得

xyzzy Part8 024 より。

(defun get-logical-drives()
  (unless (fboundp 'GetLogicalDrives)
    (c:define-dll-entry winapi:LONG GetLogicalDrives nil "kernel32"))
  (let ((drives nil)
        (offset 25)
        (drive-bits (GetLogicalDrives)))
    (while (>= offset 0)
      (if (logbitp offset drive-bits)
          (setf drives (cons (concat (string (code-char (+ 65 offset))) ":/")
                             drives)))
      (setf offset (1- offset)))
    drives))

ポイントをレジスタに記憶&記憶したポイントに移動

C-SPC で現在位置を記憶し、C-` で記憶した位置に戻る。 普通にマークするだけのときは C-@ を使っている。 私が、毎日使っているものの一つ。
[xyzzy:08134](加藤木さん)より。ここでは、レジスタ p を使用している。

;; ポイントをレジスタ(p)に記憶
(defun set-mark-and-point-to-register-p ()
  (interactive)
  (set-mark-command)
  (point-to-register #\p))
(set-extended-key-translate-table exkey-C-space #\F14)
(global-set-key #\F14 'set-mark-and-point-to-register-p)

;; 記憶したポインタ(p)に移動
(defun jump-to-register-p ()
  (interactive)
  (jump-to-register #\p))
(global-set-key #\C-\` 'jump-to-register-p)

xyzzy をもう一個たち上げて eval

指定した式を、別プロセスで xyzzy を起動し評価する。 すでに別の xyzzy が在ればそいつを使う。xyzzy Part8 034 より。 interactive に呼んでみた。

(defun other-xyzzy-and-eval (sexp)
  (interactive "ssexp: ")
  (let ((callcmd "xyzzy.exe"))
    (if (>= (count-xyzzy-instance) 2)
        (progn (setq callcmd "xyzzycli.exe")
          (next-xyzzy-window)) )
    (call-process (concat callcmd " -e\"" sexp "\"")
                  :exec-directory (si:system-root) :wait nil)))

マークダイヤログにマークを追加

S-C-Space でマークダイヤログ (mark-dialog-box) にマークを追加する。

(set-extended-key-translate-table exkey-S-C-space #\F15)
(global-set-key #\F15 #'(lambda () (interactive) (global-mark-add)))

Emacs 風スクロール

[xyzzy:07240](KAMEI Tetsuya さん)より。scroll-down するには,こんなでよいのかな。

です。scroll-up は C-M-. に,scroll-downは C-M-, に割り当ててみた。

;; Emacs 風 scroll-up
(defun scroll-up (&optional (arg -1))
  (interactive "p")
  (let ((c (goal-column)))
    (save-excursion
      (scroll-window arg))
    (unless (pos-visible-in-window-p (point))
      (forward-virtual-line arg))
    (goto-virtual-column c)
    (set-goal-column c))
  t)
(global-set-key #\C-M-. 'scroll-up)

;; Emacs 風 scroll-down
(defun scroll-down ()
  (interactive)
  (scroll-up 1))
(global-set-key #\C-M-\, 'scroll-down)