Top / アイデア集
最新の10件を表示しています。 コメントページを参照 思いついたことを思いつくままに書くところ。他に書くほどでもない小ネタやアイデアの断片など、自由に書いてください。
アイデア集から派生したもの
ee をアウトラインエディタにできないかなぁM-x ee-outlineをしたところ。 左が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-structuretexinfo-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のバッファ切り替え時に、デフォルトのバッファ切り替えの ただし、Aの Windowにあるバッファは、必ず Bの Windowのバッファリストにあること。 用途は、Aの Windowでは、C++ソースの編集をしているときに急にWindowをわけて 近い環境としては、ファイルの自動読み込みを有効にした、Meadowを2つ立ち上げた感じ。 あると、結構便利だと思うんですけどね。作る時間が・・・ 最新の30件を表示しています。 コメントページを参照 バッファ端での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をとって (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でデバッグするといったことをしています。 お試し 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 '(("\\(.*\\)" (1 my-face-u append)) ("\\(.*\\)" (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 でも使えるので、結 構好きになったのですが、 リンク を、 リンク にしてくれる Elisp って知りませんか?→ html-mode がそれに対応。`sgml-tags-invisible' まぁすぐ作れそうですけど。 UndoとRedoUndoにはリージョンを選択していれば、その部分の変更だけをUndoする機能があります。 しかし、Redoを使うと、この機能が死んでしまう。それは、Undoを再定義しているから。かといって、単純にUndoを新しいものに置き換えてもうまくいかない。 何とかならないかなぁ。。。 コピーした範囲と、マーク→カーソル間をEDiffちょっとした関数を比較するときに便利。 実装してみました。あらかじめ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))) このままでは、とっても使いにくいです。どなたか。。。 ーーーー
(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 を全部評価してしまいます.
ヘルプから関数を辿るときに, 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) ))
文字コードを変換する時に、文中に設定された文字コードも一緒に変更Emacsではファイルの先頭もしくは文末にモードや文字コードの指定が出来ます。 そのコードがあるのに気づかずに、文字コードを変換する(M-x set-buffer-file-coding-system)と、見た目上は、正常にバッファの文字コードは変換されます。ただ、その後セーブして、ファイルを開きなおすとファイル内にある文字コード指定が優先され、ファイルが文字化けして開かれることがあります。 新しく書き直しました. 新しい設定はローカル変数の文字コードの指定を変更に 書きましたのでそちらを参照してください. 大きな変更点は次の通りです.
それ以外にも, コードを大分整理しました. 初版だと, ローカル変数の範囲の 切り分けが甘いので, 例えば文字コード名が書かれていない場合などの想定し ていないケースでは無関係な部分を削除してしまう可能性があります. 初版を 使ってくださっている人は変更して下さい. 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 minibufferでは、縦の解像度が高いモニターの場合、カーソル位置とminibufferの位置の目線の移動が馬鹿にならないこともあります。そういう場合には便利かと・・・
類似パッケージdabbrev-hover.el というよく似たものが、公開されています。 (配布元ホームページ) これは、キー入力中に補完可能な1つの候補をToolTip?に動的に表示してくれます。 選択できればもっと便利なんでしょうが、動的表示だと重くなるのでやるとなると、選択開始キーが必要でしょうね。 ただ、IMEからの入力などには対応しておらず、ToolTip?はでないみたい(;_;) (require 'dabbrev-hover) (dabbrev-hover-install t t) ;; TABで補完決定&補完選択 追伸:0.2devで確認すると、TABを押すとミニバッファでの選択機能がついていますね。後は、インラインか・・・eigo... (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ジャンプで再現してほしい
TAGジャンプのリスト表示GLOBALのように同名の定義をTAGSファイルから探して一覧を出し、選択すればジャンプするようにならないでしょうか? 2010-08-08 (R) 解決 TAGジャンプの機能をGLOBALで再現
入力補完機能にも使えるようにしたい
GTAGSファイル中の複数ファイルに対して置換M-x tags-query-replaceの再現 mode-infoにて「C-u M-.」を実行できるようにしてほしいこの機能が無いと「M-.」の機能をtagジャンプにおきかえれないので。 モードラインにバッファで開いているファイルのタイムスタンプ(修正された日付)を表示する現在時刻を表示するものはありますが、そのファイルのタイムスタンプを表示するものはありません。このようなelispは、ありませんか? 作りました。
file-time-stamp.el
.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 をゴニョれば良いのかと思うんですが、時間が無くて中身を見ること もままなりませぬ。 |