Top / アイデア集

MeadowMemo

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

  • 誰が書き足してもよいのでしょうか? -- R? 2003-10-17 (金) 18:00:42
    • どうぞ。他のとこに追加するほどでもないネタを適当に書いてください。 -- 松下 2003-10-17 (金) 18:57:44
  • eeをアウトラインエディタにするにはmake-indirect-bufferを使えば簡単に出来そうな気がします。が、やる気はおきませんが^^ -- 丸山 2003-10-17 (金) 20:54:43
  • enriched-mode を切り替えるというのを追加しました。C-c C-l でソースと切り替えるということを実装しようとして、断念しました。 -- 丸山 2003-10-17 (金) 22:10:27
    • enrichはemacs19では使えないし、emacs21でも大して使いやすくなってないので、開発断念したものです。 -- 丸山 2003-10-17 (金) 22:12:06
  • emacs Wikiで見つけたここを見るとVC.NET操作の件が出来るようですね。しかしPerlインストールしなきゃ… -- R? 2003-10-27 (月) 23:57:41
  • それ使ってvisual c++ debuggerを操作できますね。それともしVCとEmacsをインテグレートするにはVisEmacs?とかが有名ですね。インストールが少々めんどうだけど。 -- Hoshi? 2003-10-28 (火) 13:34:56
  • なんかね、MeadowからSendkeysするようなのがあればVC++でもDelphiでもVBAとかでも操作できるんではと思って探してるんですが、ないっすね。かなしいっす、なんかね。 -- 2004-02-19 (木) 20:48:13
    • VisualStudio.NETとMeadowの連携にてWSHを使ってSendKey?してVC++を操作しております。AppActivate?で目的のWindowにフォーカスしてやれば、後はキーを送るだけなのでWindowsアプリとの連携は十分出来るでしょう。 -- R? 2004-02-20 (金) 00:20:42
  • TAGSファイルの更新は gtags だったらいい感じでできますよ。ただファイル指定での更新ができないくてそれなりに遅いんで、自分は10回セーブごとにとかやってますが。 -- taiki? 2004-12-12 (日) 12:53:50
  • ImageMagic? 使ってファイル名一覧から画像を見るのに v で表示 q で一覧に戻りという動作になりませんかね? -- こなみ? 2005-08-31 (水) 10:12:52
  • spamを削除 -- taku? 2006-08-06 (日) 23:24:52
  • buffer-listをファイルの種類順に並べるモノって作れないですかね?正規表現で拡張子部分のみを取得して並び替えることが出来ると・・・ -- ∞すずらん∞? 2007-01-21 (日) 17:00:35
    • ibufferにはメジャーモードで並び換えというのはあるから、これを真似ればできそう。 -- 松下 2007-11-16 (金) 20:53:31
お名前:

思いついたことを思いつくままに書くところ。他に書くほどでもない小ネタやアイデアの断片など、自由に書いてください。

アイデア集から派生したもの

ee をアウトラインエディタにできないかなぁ

M-x ee-outlineをしたところ。

ee.png

左がeeで右が本文。eeの方は折畳みができるけど、本文とは連動していない。eeで項目の追加や移動などもできない。

項目の追加/変更/移動、階層の変更ぐらいができると、アウトラインエディタに近付くのにな。

keyboard-quit で連続実行する種類のコマンドの結果を元に戻す

http://www-tsujii.is.s.u-tokyo.ac.jp/~yoshinag/tips/elisp_tips.html#yankundo

自分好みに設定すると便利そう。貼り付けたけど、やっぱりやめたという時にC-gで消せるのは便利だなぁ。

(defvar my-dabv-marker nil)
(defadvice dabv-expand-by-category (before my-mark activate)
  (unless (eq last-command 'dabbrev-expand)
    (setq my-dabbrev-marker (point))))

;; kill-ring-yank-pointer の backup 用の変数
(defvar my-kill-ring-yank-pointer-backup nil)
;; yank するときには kill-ring-pointer の位置を覚えておく
(defadvice yank (before my-kill-ring-yank-pointer-backup activate)
  (setq my-kill-ring-yank-pointer-backup kill-ring-yank-pointer))

(defun my-keyboard-quit ()
    "Wrapped keyboard-quit for yank(-pop)/dabbrev-expand/undo.
This command executes keyboard-quit, it deletes the inserted text when
the last-command is yank(-pop) or dabbrev-expand, recovers
kill-ring-yank-pointer when yank(-pop), and repeats redo as possible."
  (interactive)
  (setq test pc-bufsw::start-buf-list)
  (cond ((eq last-command 'yank)
         (let ((inhibit-read-only t))
           (delete-region (point) (mark t)))
         ;; yank/yank-pop したテキストを消す
         (setq kill-ring-yank-pointer my-kill-ring-yank-pointer-backup)
         ;; kill-ring-yank-pointer の位置を yank 前に戻す
         )
        ((eq last-command 'dabbrev-expand)
         ;; dabbrev-expand したテキストを消す
           (delete-region (point) my-dabbrev-marker))
        ((and (featurep 'redo) (eq last-command 'undo))
         ;; undo している最中なら redo できるだけする
         (let ((flg t))
           (while flg
             (condition-case err
                 (redo 1)
               (error
                (setq flg nil)
               )))))
        ((or (eq last-command 'my-bury-buffer)
             (eq last-command 'my-grub-buffer))
         ;; バッファを循環中なら最初のバッファに戻る
         (switch-to-buffer (car my-visible-blst)))
        )
  (keyboard-quit))

(global-set-key "\C-g" 'my-keyboard-quit)

moccur版 texinfo-show-structure

texinfo-show-structureはtexinfo編集中にoccurを呼び出し、

  2:@chapter テキストの補完入力 ― abbrev ,定型句
 24:    @section 定型句の登録 ― abbrev-mode
 80:        @subsection abbrev を補完入力 ― abbrev-complete
321:        @subsection 勝手に abbrev を展開しないようにする

のように表示してくれる。しかし、これはoccur。普段よく使うのはmoccur。

ということで、適当に同じ動作をするものをでっちあげてみた。M-x moccur-outlineで動作する。

いかにも、アウトライン一般で動きますという関数名だがtexinfoでしか動かない。。。

(defadvice moccur-mode
  (before moccur-outline)
  (goto-char (point-max))
  (let (level)
    (while (re-search-backward "^ *[0-9]* @\\(\\sw+\\)" nil 0)
      (goto-char (1- (match-beginning 1)))
      (setq level (or (cadr (assoc (match-string 1) texinfo-section-list)) 2))
      (indent-to-column (+ (current-column) (* 4 (- level 2))))
      (beginning-of-line))))

(defun moccur-outline ()
  (interactive)
  (moccur-setup)
  (ad-activate-regexp 'moccur-outline)
  (let ((buffers (list (current-buffer)))
        (moccur-use-migemo nil)
        (moccur-split-word nil))

    (setq regexp outline-regexp)
    (moccur-search regexp t buffers))
  (ad-deactivate-regexp 'moccur-outline))

enriched-mode を切り替え。

enriched-mode の表示とソースを切り替える(未完、Emacs20.7で作成)。だ れか続きを開発してみませんか?

(global-set-key "\C-c\C-l" 'format-encode-buffer-switch)
(defun format-encode-buffer-switch (arg)
  "Switch enriched-mode. This function must be used under the
condition: `font-lock-mode' off.

If `font-lock-mode' on,
1: M-x format-encode-buffer RET text/enriched RET
2: M-x font-lock-mode
3: Then use this command.

Note:
Once you put on `font-lock-mode' ,then enriched properties are lost."
  (interactive "P")
  (if font-lock-mode
      (error "Turn off font-lock-mode. (M-x font-lock-mode)"))
  (if enriched-mode
;;;enrich テキスト以外だと void だと起こられる。
      (progn (enriched-mode nil) (format-encode-buffer 'text/enriched) 
	      (message "encoded"))
    (font-lock-mode t) (font-lock-mode nil)
    (set-text-properties (point-min) (point-max) nil)
    (format-decode-buffer) (enriched-mode t);turn on
    (message "decoded")
    ))

Window(Frame)毎のバッファを開いた履歴を保持するモード

iswitchbを改変して、C-x bのバッファ切り替え時に、デフォルトのバッファ切り替えの
順番がWindow(Frame)毎に、変わってほしい。

ただし、Aの Windowにあるバッファは、必ず Bの Windowのバッファリストにあること。
つまり、buffer-list は、現状のままひとつのみ。
Aの Windowで新規に開いたバッファは、Aのバッファリストの先頭にくるが
Bの Windowのバッファリストでは最後に登録されるようにする。
バッファの削除も、A,Bともの同じバッファリストを削除する。

用途は、Aの Windowでは、C++ソースの編集をしているときに急にWindowをわけて
BのWindowで ELisp編集をはじめたとする。その Elispの編集のあとに、
また Aの Windowに戻った場合、それまでに並んでいたバッファリストに
Elispファイル等が最近開いたファイルの履歴に入ってしまう。
(作業途中でNavi2chを立ち上げたときにも有効だと思う)

近い環境としては、ファイルの自動読み込みを有効にした、Meadowを2つ立ち上げた感じ。
ただし、バッファの中身は共通化できるのと、Window毎に設定ができるのがこのモードの利点。
(さらに、バッファを開いた履歴以外の環境も共有できるのも利点)

あると、結構便利だと思うんですけどね。作る時間が・・・

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

  • むしろbuffer-listにadviceするのかな。現在のバッファの拡張子やモードに応じて、返すリストの順番を変えてやると。 -- 松下 2003-10-21 (火) 19:54:32
  • 希望は「1バッファの拡張子やモードに応じて」ではなくて、WindowやFrame単位に履歴を持ちたいんですよね。同じモードでも複数履歴を持ちたいことがあるんで・・・ -- R? 2003-10-21 (火) 20:47:36
  • 巷にある、タブブラウザなんかの動きを想定はしているんですけどね。「戻る」とかで戻る履歴が近いんですが、違うところはバッファリストは同じであるほうがエディタとしては便利だというところかな。 -- R? 2003-10-21 (火) 20:59:52
    • なるほど。やっと理解しました。で、どっかで見た気がするなぁと思ったら、flobl.elがありました。ただ、iswitchとはうまく動作しなかったり、C-x C-bの順番は変わらなかったりといまいちなんですけどね。 -- 松下 2003-10-28 (火) 18:11:31
      • フレーム単位でも出来れば御の字なんですが、今度ためしてみます。 -- R? 2003-10-28 (火) 22:15:52
      • 試しました。こいつです。足りない部分はあるものの、まずはiswitchとの連携さえ出来ればと思うのですが、なんとかならないですかね? -- R? 2003-10-29 (水) 16:19:30
  • spamを削除 -- taku 2006-08-06 (日) 23:25:16
お名前:

バッファ端でのkill-line

バッファの最後でC-kをしてもメッセージが出るだけで削除はできない。ま、あたり前の挙動なんですが、一行前に移動して削除してくれたらうれしいな、と思って書いたもの。

(defadvice kill-line
  (around beg-of-line-before-kill-line activate)
  (save-restriction
    (widen)
    (if (= (point) (point-max))
        (if (= (point) (line-beginning-position))
            (progn (previous-line 1) (recenter))
          (beginning-of-line)))
    ad-do-it))

ファイルをセーブするたびにTAGSファイルを更新

TAGSファイルは、Cなんかでは非常に便利なんですが
プログラムを組んでいる途中では、更新するのをついつい忘れがち。

それで、ファイルをセーブするたびにそのファイルのTAGSをとって
更新しようと考え、下記のものを作った。
(常に最新のTAGSで作業したかった)

(defvar etags-mode nil)
(defvar etags-file ".")

;; マイナーモードに設定
(defun etags-mode (&optional arg)
  "Toggle etags-mode."
  (interactive "P")

  (let (map)
    (and (setq etags-mode
	      (if (null arg)
		  (not etags-mode)
		(> (prefix-numeric-value arg) 0)))
	 (or (assq 'etags-mode minor-mode-alist)
	     (setq minor-mode-alist
		   (cons '(etags-mode " etags")
			 minor-mode-alist)))
	 )))

(defun etags-check-buffer()
  "Type '\\[etags-file-chk]': the current line's file check etags."
  (interactive)
  (let ((fname (buffer-file-name)))
;    (call-process "etags.exe" nil 0 nil "-a " "-o " etags-file fname)
	(shell-command
	 (concat "etags.exe -a -l c++ -o " etags-file " " fname))
    (message "etags-checked %s" fname)))

;;; C/C++モードの時だけ上の関数を実行する
(defun etags-file-chk()
  "Type '\\[etags-file-chk]': the current file check time stamp."
  (interactive)
  (if (and (eq etags-mode t) (or (eq major-mode 'c++-mode) (eq major-mode 'c-mode)))
      (etags-check-buffer)))

;;; セーブした後に実行する
(add-hook 'after-save-hook 'etags-file-chk)

上記を読み込み下記を設定すれば有効になる。 (先にプロジェクト全体のTAGSをd:\work\TAGSに作っておくこと)

(setq etags-mode t)
(setq etags-file "d:\work\TAGS") ;;タグファイルの位置

しかしながら、Meadow付属の「etags -a」の挙動が、想定していた 「既存のTAGSの該当部分の置き換え」ではなく単に「既存のTAGSに 追加する」という動作であったため、断念した・・・ なんとかならないものかなぁと。

Meadowで開いているファイルのカーソル位置に、Break Pointをつけたい。

Meadowでソースを書いてVisual Studio.NETでデバッグするといったことをしています。
エラー部分の修正で.NETをからMeadowを呼び出すのは出来るのですが、Break Pointをつけるときは、.NETで該当ファイルを探し該当行を探すということをしなくてはいけません。


以上の案件は、解決しました。 VisualStudio.NETとMeadowの連携にまとめておりますので、そちらをご覧になってください。

お試し font-lock で遊ぶ。

(defun my-font (arg) 
  "Usage: (my-font '((hoge) (hige)))"
  (interactive "p")
  (if (not (boundp 'my-font-old))
      (setq my-font-old font-lock-keywords))
  (setq font-lock-keywords
	 (append font-lock-keywords arg))
  ;;(font-lock-fontify-buffer)
  (message "defined"))
(defun my-font-old ()  (interactive "p")
  (if (not (boundp 'my-font-old))
      (message "not defined")
    (setq font-lock-keywords my-font-old)
    (makunbound 'my-font-old)))
(defface my-face-u '((t (:underline t))) nil)
(defface my-face-f-r '((t (:foreground "red"))) nil)
(defface my-face-b-r '((t (:background "red"))) nil)

これを全部評価して、

(my-font '(("<U>\\(.*\\)</U>" (1 my-face-u append))
           ("<FONT COLOR=\"red\">\\(.*\\)</FONT>" (1 my-face-f-r))))

これを評価して、色のつき方を見て楽しむElisp。ちゃんと考えて無いですが、

(global-font-lock-mode t)
(setq font-lock-support-mode 'jit-lock-mode)  ;Just In Time
(setq font-lock-maximum-decoration t)

この僕の設定なら、書いているそばから色づけしてくれます。おすすめは以下。

(my-font '(("^\\(____[_]*\\)\n" (1 my-face-f-r append) (0 my-face-u append))))

これで文頭から _ が四つ以上続くと、 HR 的なラインがかけます。(Meadow-1.15 では)

(my-font '(("^\\([|]\\)[^\t\n]*\t\\([|]\\)" 
			   (1 my-face-b-r append) (2 my-face-b-r append))
           ("^[|][^\t\n]*\t[^\t\n]*\t\\([|]\\)" 
			   (1 my-face-b-r append))
           ("^[|][^\t\n]*\t[^\t\n]*\t[^\t\n]*\t\\([|]\\)" 
			   (1 my-face-b-r append))
           ("^\\(|||[|]+\n\\)" 
			   (1 my-face-b-r append))))

これで下のようなやつを、TABLE チックに色づけしてくれます。この例は"TAB (C-q C-iで入力)" + "|"に反応します。 my-face-b-f も設定すると、よい、か?

||||
|hoge	|hage	|hige
|foge	|fage	|fige
||||

いろいろやったのち、 font-lock-add-keywords でくっつけるという仕組みで す。(これはInfoを参照)

(my-font-old)

このコマンドで、設定を元に戻してくれます。 font-lock-fontity-block を 使うと動的に変えてくれます。これは TABLE モードを作ろうとして断念した 時のごみです。 font-lock の正規表現はあまり例がないので、Info みながら 試行錯誤すると時間を つぶせます。 つぶれます。

HTML でタグを綺麗に表示。

emacs-wiki.el では C-c C-l で、 invisible 属性を使って、綺麗に表示して くれます。この invisible 属性って、 mule for win32 でも使えるので、結 構好きになったのですが、

<a href="htt....">リンク</a>

を、

リンク

にしてくれる Elisp って知りませんか?→ html-mode がそれに対応。`sgml-tags-invisible'

まぁすぐ作れそうですけど。

UndoとRedo

Undoにはリージョンを選択していれば、その部分の変更だけをUndoする機能があります。

しかし、Redoを使うと、この機能が死んでしまう。それは、Undoを再定義しているから。かといって、単純にUndoを新しいものに置き換えてもうまくいかない。

何とかならないかなぁ。。。

コピーした範囲と、マーク→カーソル間をEDiff

ちょっとした関数を比較するときに便利。
現状EDiffでは、Buffer、file同士でないと比較できない。
ViVi?ではあるらしい・・・

実装してみました。あらかじめM-wでコピーしてから、リージョンを選択し、M-x ediff-with-copy とすると、コピーした範囲とリージョン間のEdiff を行うことができます。

M-x ediff-with-copy実行時にはバッファを2つ作りますので、比較後には kill してください。本当は元バッファをそのまま使いたかったのですが、よく分からなかったので、とりあえず別バッファにコピーする形で作ってあります。[松下]

;; バッファを準備するための関数
(defun ediff-with-copy-setup-buffer (buffer str)
  (set-buffer buffer)
  (setq buffer-read-only nil)
  (buffer-disable-undo)
  (erase-buffer)
  (insert (concat str "\n"))
  (setq buffer-read-only t)
  (set-buffer-modified-p nil))

(defun ediff-with-copy (beg end)
  (interactive "r")
  (let* ((buf (current-buffer))
         (copy-buf
          (get-buffer-create
           (concat "*copy "
                   (buffer-name buf)
                   "*")))
         (region-buf
          (get-buffer-create
           (concat "*region "
                   (buffer-name buf)
                   "*")))
         (str (buffer-substring-no-properties
               beg end))
         )
    ;; copy した内容を準備する
    (ediff-with-copy-setup-buffer copy-buf (car kill-ring))

    ;; リージョン間の内容を準備
    (ediff-with-copy-setup-buffer region-buf str)

    ;; ediff を実行
    (ediff-buffers copy-buf region-buf)))

このままでは、とっても使いにくいです。どなたか。。。

ーーーー

  • おお、すばやい対応感服いたします。ただ、思っていたものとチョッと違いました。
    よく似たものとして、M-x ediff-regions-linewise があります。これはAのバッファのリージョンとBというバッファのリージョンをナローイングして比較します。ただ、私の想定している、1つのバッファ内にある同じような2つの関数を比較する場合などには使えません。そこで、松下さんが作ってくださったediff-with-copyですが、残念なことに比較はできるのですが更新(マージ)が出来ません。比較対照のリージョンのほうに更新した場合、元のバッファを更新し、また、もう一つの比較対照のコピー部分を更新した場合は、kill-regionに更新されたものを入れてもらえれば使いやすいかと思います。(R)

多分そうだろうなとは思いつつ、とりあえずで投げてしまいました。更新を何とかできないかなと思いながらも、アイデアが出ず。。。

  • ediff-regions-linewise で同じバッファを比較できるみたいです。やりかたは buffer-A と buffer-B に同じバッファを指定するだけです。マージもできるようです。最初に範囲を2箇所選択される方が使いやすいとは思うんですがひとまず放置です。以下の関数を定義しておくと少し便利かもしれません。[菅原]
(defun ediff-regions-linewise-same-buffer (buffer &optional startup-hooks)
  (interactive "bSelect buffer: ")
  (ediff-regions-linewise buffer buffer startup-hooks))

find-file の代わりに view-file で開く

.emacs で設定を追加している時に, 関数がどのように定義してあるか調べる ために ffap などで開くことがあります. その際に, できれば view-file で 開いて欲しいな, という事で バイナリファイルを開く を参考に作ってみました.

ファイルが読み取り専用で my-view-file-extensions-when-read-only に指定 した拡張子のファイル, または my-view-file-directory で指定したディレク トリにあるファイルだと, find-file の代わりに view-file で開きます.

 (defvar my-view-file-extensions-when-read-only '()
   "ファイルが書込み禁止の場合, find-file の代わりに view-file で開くファ
 イルの拡張子を (\"el\") のようにリストで指定する. 但し, 全て小文字で指
 定する.")
 
 (defvar my-view-file-directory '()
   "find-file の代わりに view-file で開く対象となるディレクトリを
  (\"/usr/share/man/\") のようにリストで指定する.")
 
 (defadvice find-file
   (around find-file-switch-to-view-file (file &optional wild) activate)
   (if (or (and (not (file-writable-p file))
                (member (downcase (file-name-extension file))
                        my-view-file-extensions-when-read-only))
           ;; 指定したディレクトリにあるかを調べる
           (member (file-name-directory file) my-view-file-directory)
           ;; ひとつ下のディレクトリも調べる
           ;;(member (file-name-directory (directory-file-name (file-name-directory file)))
           ;;        my-view-file-directory)
           )
       (view-file file)
     ad-do-it))

さらに深いディレクトリにも対応させる

上の関数だと, 指定したディレクトリ直下(と, もうひとつ下のディレクトリ) のファイルにしか対応できません. my-view-file-directory よりも深いディ レクトリ全てに対応させる場合は,

           ;; 指定したディレクトリにあるかを調べる
           (member (file-name-directory file) my-view-file-directory)
           ;; ひとつ下のディレクトリも調べる
           ;;(member (file-name-directory (directory-file-name (file-name-directory file)))
           ;;        my-view-file-directory)

の部分を

           (not
            (catch 'flag
              (mapcar '(lambda (dir)
                         (if (string-match (concat "^" dir) file)
                             (throw 'flag nil))) my-view-file-directory)))

または

           (member nil
                   (mapcar '(lambda (dir) (not (string-match (concat "^" dir) file)))
                           my-view-file-directory))

とします.

上の方は危険な事をしているかもしれませんが, list が長いときに途中で終 わります. 下はすっきりとしていますが, list を全部評価してしまいます.

  • いちおう、返事の形で全文残します。編集して短くしてください>もとのやつを書いた人。
  • もとのやつを書いた人です. 素早いフォロー, ありがとうございます. 期待 していた通りの動作をしてくれるようになりました(一番下の設定を使わせて 頂きました). 文章に手を加えてしまいましたが, 編集はこんな感じでよろしいでしょうか?
  • 返事を書いた人です。編集して頂きありがとうございます。僕が directory-file-name の位置を間違って書いていたみたいなので変更しておきました。p.s. この関数、本当は ~ と * の処理をするべきかも知れませんね。
  • もとのやつを書いた人です. 上では書きませんでしたが, この関数には別の 目的もありました. help-follow でファイルを開くと, view-file と同じ動作 になるようにしたかったのです. (view-read-only を t にすれば, 読み取り 専用のファイルは view-mode で開くのに)なぜ view-file にこだわったかと 言うと, view-file で開くとq(view-quit) でバッファが閉じるのに対して, view-mode を実行する場合はバッファが閉じないのが嫌だったもので... た だ, help-follow は find-file を使わないみたいなので, 別の方法で実装し てみました. また View-kill-and-leave の存在と, 「これを使えばバッファ も消せる!!」という事に気付きました(C にバインドされているのに...). こ の辺の設定を下に載せておきます. お目汚し & 長文失礼 m(_ _)m

ヘルプから関数を辿るときに, view-mode で開く

関数や変数を調べる時に, describe-function や describe-variable は便利 ですが, 関数や変数の定義へジャンプ(help-follow)すると, 該当するファイ ルをそのまま開いてしまい, ちょっと不便です. またファイルを誤って編集し てしまう危険もあります(特に, Windows 環境で administrator 権限を持つ場 合).

そこで help-follow でジャンプすると, 読み込み専用にして view-mode にす るようにしました. ただしファイルが現在開かれているか, customize にとぶ 時は, 従来と同じ動作です.

 (defadvice help-follow
   (around help-follow-read-only-and-view-mode activate)
   (let ((before-buffer-list (mapcar (function buffer-name) (buffer-list))))
     ad-do-it
     (when (and (not (member (buffer-name) before-buffer-list))
                (eq (string-match "^*Customize Option:" (buffer-name)) nil))
       (setq buffer-read-only t)
       (view-mode t))))

上の設定で開いたファイルで q(View-quit) すると, view-mode を解除したバッ ファが残ります. バッファが残るのは邪魔なので, help-follow から開いた場 合(とバッファが読み取り専用の場合)は, q でバッファも削除します. こちらは お好みで. (追加)バッファ名によっても, バッファを消せるようにしました.

 (add-hook 'view-mode-hook
           '(lambda ()
              (defun my-view-quit-select ()
                (interactive)
                (if (and (eq view-old-buffer-read-only nil)
                         (not (member (buffer-name) '("*Help*" "*Colors*" "*Faces*"))))
                    (View-quit)
                  (View-kill-and-leave)
                  ))
              (define-key view-mode-map "q" 'my-view-quit-select)
              ))

おぉ、おもしろい。つい文字を入力してしまって、*.elの方が新しいよと警告されてしまう私にはいいかも。

文字コードを変換する時に、文中に設定された文字コードも一緒に変更

Emacsではファイルの先頭もしくは文末にモードや文字コードの指定が出来ます。

そのコードがあるのに気づかずに、文字コードを変換する(M-x set-buffer-file-coding-system)と、見た目上は、正常にバッファの文字コードは変換されます。ただ、その後セーブして、ファイルを開きなおすとファイル内にある文字コード指定が優先され、ファイルが文字化けして開かれることがあります。

そこで、文字コード変換時についでに、このコード指定の部分も変更したコーディングに変更してくれるelispを望みます。


新しく書き直しました. 新しい設定はローカル変数の文字コードの指定を変更に 書きましたのでそちらを参照してください.

大きな変更点は次の通りです.

  • ファイルの先頭行以外に書かれたローカル変数に対応した(ファイル先頭行 以外にも指定できると知らなかったもので).
  • ローカル変数での文字コード名を指定している範囲を調べる機能を my-coding-region に分離した.
  • 改行コードを除いた文字コード名を挿入できるようにした.

それ以外にも, コードを大分整理しました. 初版だと, ローカル変数の範囲の 切り分けが甘いので, 例えば文字コード名が書かれていない場合などの想定し ていないケースでは無関係な部分を削除してしまう可能性があります. 初版を 使ってくださっている人は変更して下さい.

XEmacsのGUIパッケージの移植

GUIに関してはXEmacsの方が進んでいます。これは、パッケージにあるアイコンの数を数えてもわかります。ediffにしても、smileyにしてもXEmacsのほうがGUI化されていたり、表示できる顔も多いです。

Emacsは、CUIでは最高レベルにあるのですがもうチョッとGUI化したほうが素人でも入ってきやすいかなと、思います。ま、現状お手軽なXEmacsからの移植が、一番簡単かなぁと思いまして。しかし、ここでやるべき事じゃないのかもしれませんが21.4になろうとしているのに一向にXEmacsのものを吸収する気配もないので案を出しました。

minibufferではなく、IMEの漢字選択のように別windowでの選択

http://yamaguch.sytes.net/~tora/java/jde.html
上記、JDEで行っいるメソッドの補完のように、dabbrevやiswichbの選択も同じようにするのも一興かと。

minibufferでは、縦の解像度が高いモニターの場合、カーソル位置とminibufferの位置の目線の移動が馬鹿にならないこともあります。そういう場合には便利かと・・・

最近はSKKの変換もその方法でできるようになったようです.

類似パッケージ

dabbrev-hover.el というよく似たものが、公開されています。 (配布元ホームページ

これは、キー入力中に補完可能な1つの候補をToolTip?に動的に表示してくれます。
入力と補完結果が同時に見え、予測入力っぽくていい感じです。

選択できればもっと便利なんでしょうが、動的表示だと重くなるのでやるとなると、選択開始キーが必要でしょうね。
まだまだバージョンアップしそうなので楽しみなパッケージです。

ただ、IMEからの入力などには対応しておらず、ToolTip?はでないみたい(;_;)
.emacs設定はこんな感じ。バンバン、キーボード入力する人にはいいかも。

(require 'dabbrev-hover)
(dabbrev-hover-install t t)  ;; TABで補完決定&補完選択

追伸:0.2devで確認すると、TABを押すとミニバッファでの選択機能がついていますね。後は、インラインか・・・eigo...
追伸2:このパッケージを入れると、スクロールが半画面ごとになります。1行スクロール設定していても・・・。なぜだろう?
→設定済みMeadowに設定されている下記のスクロール設定を入れると、ちゃんと一行スクロールするようになった。快適!!

(setq comint-scroll-show-maximum-output t
     scroll-conservatively 100
     scroll-margin 0
     scroll-step 1)

便利なのに設定済みMeadowにも入れればいいのになぁ。

モードラインの自動変更

長いモードラインはなかなか全体を見ることができません.

ということで,一定時間ごとに表示を切り替えてしまう方法.

(defvar mode-line-format-backup mode-line-format)
(defvar mode-line-format-mode 1)
(defun auto-mode-line ()
  (cond
   ((= 1 mode-line-format-mode)
    (setq mode-line-format
          '(#("   " 0 3
              (help-echo
               "mouse-1: select window, mouse-2: delete others, mouse-3: delete ..."))
            global-mode-string
            #("   %[(" 0 6
              (help-echo
               "mouse-1: select window, mouse-2: delete others, mouse-3: delete ..."))
            (:eval
             (mode-line-mode-name))
            mode-line-process minor-mode-alist
            #("%n" 0 2
              (help-echo "mouse-2: widen" local-map
                         (keymap
                          (mode-line keymap
                                     (mouse-2 . mode-line-widen)))))
            #(")%]--")))
    (setq mode-line-format-mode 2))
   
   ((= 2 mode-line-format-mode)
    (setq mode-line-format
          '((which-func-mode
             ("" which-func-format
              #("--" 0 2
                (help-echo
                 "mouse-1: select window, mouse-2: delete others, mouse-3: delete ..."))))
            (line-number-mode
             (#("L%l" 0 3
                (help-echo
                 "mouse-1: select window, mouse-2: delete others, mouse-3: delete ..."))
              #("--" 0 2
                (help-echo
                 "mouse-1: select window, mouse-2: delete others, mouse-3: delete ..."))))
            (column-number-mode
             (#("C%c" 0 3
                (help-echo
                 "mouse-1: select window, mouse-2: delete others, mouse-3: delete ..."))
              #("--" 0 2
                (help-echo
                 "mouse-1: select window, mouse-2: delete others, mouse-3: delete ..."))))
            (-3 .
                #("%p" 0 2
                  (help-echo
                   "mouse-1: select window, mouse-2: delete others, mouse-3: delete ...")))
            #("-%-" 0 3
              (help-echo
               "mouse-1: select window, mouse-2: delete others, mouse-3: delete ...")))
          )
    (setq mode-line-format-mode 3))
   
   ((= 3 mode-line-format-mode)
    (setq mode-line-format mode-line-format-backup)
    (setq mode-line-format-mode 1))))

;;(run-at-time "1sec" 0.1 'auto-mode-line)
(run-with-idle-timer 0.5 t 'auto-mode-line)

GLOBALの機能と同等のものをTAGジャンプで再現してほしい

  • 問題点:GLOBALが導入できない環境がある
    実行ファイルを挿入できない。TAGSとGTAGSの両方を持つにはサイズがでかいなど。
    TAGSファイルを読み込んでいると動的補完が効いたりEmacsになじみやすい点。
    etagsは、GLOBALに比べ、少々ファイルが更新して行数が増えてずれても追従してくれる点。

TAGジャンプのリスト表示

GLOBALのように同名の定義をTAGSファイルから探して一覧を出し、選択すればジャンプするようにならないでしょうか?
(TAGSファイルがでかい場合は遅そうですが・・・)
C++の開発をしていると同名メソッドへのジャンプが標準のTAGジャンプではしづらいので。

2010-08-08 (R) 解決
上記は、次のetags-select.elを導入することで解決しました。
http://www.emacswiki.org/emacs/EtagsSelect
GLOBALは、会社では最新環境が導入できず、現在使っているものも不安定なのでetags-select.elを現状メインで使っています。

TAGジャンプの機能をGLOBALで再現

  • 問題点:GLOBALを導入できる環境の場合、GLOBALのみで完結したい
    TAGSファイルとGTAGSファイルの両方を毎回作りたくないので。

入力補完機能にも使えるようにしたい

  • 動的補完(dabbrev系,dabbrev-hoverとかの連携)
  • ファイル名入力補完(find-file,filecache,ffapと組み合わせて便利に)
    プロジェクトが変わるたびにfilecacheのリストを追加したくない。
    起動も遅くなるし、GLOBALなら速くなりそう。

GTAGSファイル中の複数ファイルに対して置換

M-x tags-query-replaceの再現
GTAGSファイル中のそれぞれのファイルについてquery-replace-regexpを実行したいです。
(リファクタリング用)

mode-infoにて「C-u M-.」を実行できるようにしてほしい

この機能が無いと「M-.」の機能をtagジャンプにおきかえれないので。
(複数同じ定義があった場合次の定義に行きにくい(標準操作から変えないといけない))

モードラインにバッファで開いているファイルのタイムスタンプ(修正された日付)を表示する

現在時刻を表示するものはありますが、そのファイルのタイムスタンプを表示するものはありません。このようなelispは、ありませんか?

作りました。

.emacsには、下記の設定をすれば使えます。

(require 'file-time-stamp) ;; ++
(add-hook 'c-mode-common-hook 'file-time-stamp-mode)

バッファを変更した時刻を表示するbuffer-time-stamp.elを改変して作りました。

ssh や rlogin した shell buffer で、コマンド/ファイル名の補完を remote のもので行なう

なんて elisp パッケージはありませんかね。 comint をゴニョれば良いのかと思うんですが、時間が無くて中身を見ること もままなりませぬ。


添付ファイル: filefile-time-stamp.el 2037件 [詳細]
fileee.png 1845件 [詳細]

リロード   新規 編集 凍結 差分 添付 複製 改名   トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS
Last-modified: Sun, 08 Aug 2010 12:08:44 JST (2605d)