| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
テキストを入力する際,何度も同じ単語を入力するのは面倒なものです.面倒なだけでな く,毎回入力をしているとどうしてもタイプミスをしてしまいます.
そこで, Meadow (Emacs) には長い単語でも簡単に入力できる機能が備わっています.
この章では,そのような機能を紹介します.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
頻繁に入力する語の略称を自分で指定することができます.略称を指定することで,,長 い文字でも,簡単に入力できるようになります.
(emacs) Abbrevs と (elisp) Abbrevs が参考になります.
プログラムや文章の作成していると,同じ単語を何度も入力することが頻繁にあります. Emacs程度の短い単語ならともかく,もう少し長くなると入力は面倒になってきます.頻 繁に入力となると,スペルミスの可能性も高くなります.
abbrev (略語展開)とはあらかじめ設定しておいた略名を展開してくれる機能のことです. 例えば 「address」 を自分の住所に変換するといったことが可能になります.
標準機能ですので,利用できます.また,下記で説明するキーバインドや略称の保存機能 も有効になっています.
Meadow に標準で付属しています.
以下を .emacs に追加します
;; 保存先を指定する (setq abbrev-file-name "~/.abbrev_defs") ;; 略称展開のキーバインドを指定する (define-key esc-map " " 'expand-abbrev) ;; M-SPC ;; 起動時に保存した略称を読み込む (quietly-read-abbrev-file) ;; 略称を保存する (setq save-abbrevs t) |
略称展開の使い方は,まず略語を登録し,その後,その略語を入力して展開となります.
では,略語の登録の前にその基礎から説明していきます.
略称展開というのは,「msと入力してMicrosoftと展開」ということを実現する機能です. 「mailで自分のメールアドレスを展開」という使い方もあるでしょう.
何を何に展開するか,それは自分で自由に選択できます.
でも,その略称は常に使わなければなりませんか?
違いますよね. メールを書く時.Cなどのプログラムを書く時.普通のテキストを書く時.
もちろん共通で使う略語もあるでしょうが,特定のテキストでしか使わない略称もあるの ではないでしょうか.
Emacsの略称展開は,こうした要望に答えるために,2つの登録先が用意されています.
1つはすべてのテキストで利用できる略称.もう一つは,登録したモードでしか利用でき ない略称です.
では,順に説明していきましょう.
最初に,設定したモードでしか利用できない略称の登録方法を説明します.
例えば,Microsoftの略称を設定するとしましょう.
カーソルを単語の後ろへ持っていきます.そして,C-x a + と入力します.する と,ミニバッファに
Mode abbrev for "Microsoft":
と表示されますので,ここで「ms」のように略称を入力してRETを押します.これ で,略称の設定完了です.
ただし,この時登録される語はカーソル直前の単語になります.そのため,特に日本語で は,意図していない部分の略称設定になってしまいます.
そこで,リージョンで指定した範囲の略称を登録することができます.方法は,リージョ ンで略称を登録したい範囲を選択し,C-u 0 C-x a +と入力します.すると,リージョ ン内の言葉に対する略称を登録することができます.この時,改行があっても登録できま す.
次にどのモードでも利用できる略称設定方法を説明します.基本的な操作方法は,モード 固有の略称と同じですが,入力するキーだけが異なります.
どのモードでも利用できる略称を設定するには,C-x a g と入力します.リージョ ン内の文字の登録はC-u 0 C-x a gです.
略称を入力して,C-x a 'と入力します.すると,略称が展開されます.C-x a 'はちょっと入力が面倒ですから,上記の設定をしておきましょう.これなら, M-SPC で展開できますので,簡単に略称展開することができます.
しかし,略称展開するたびに M-SPC を入力するのも面倒です.
英語であれば通常はスペースや記号で区切られているわけですから,スペースを入力した 時に展開できると便利です.
そのような動作を実現するのが abbrev-mode です.M-x abbrev-mode で abbrev-mode にすると,略語の後に SPC を押すだけで展開できます.
ただし,「 name@」 のようにメールアドレスを入力しようとしても展開されてしまうと いうデメリットもあります.日本語ではあまり便利に感じないように思います.
上記のように設定しれあれば,設定した略語は abbrev-file-name で設定したファイルに 保管されます.
保存された略称の編集は M-x edit-abbrevs で行うことができます. M-x edit-abbrevs を実行すると
(vc-annotate-mode-abbrev-table) (vc-dired-mode-abbrev-table) (php-mode-abbrev-table) "while" 0 "while" c-electric-continued-statement "else" 0 "else" c-electric-continued-statement (global-abbrev-table) "def" 9 "defun" "ms" 0 "Microsoft"
のように登録された略称が表示されます.各モード毎の略称とどのモードでも利用できる 略称(グローバル(global)の略称)が表示されます.
この表示で,一番左の列が略称,2番目が略称を展開した回数,3番目が展開される文字に なります.この略称と展開される文字を直接編集すると,略称や展開される文字を変更す ることができます.変更が終わったら,C-c C-c として保存すると,その変更が適 用されます.
34.1.1 abbrev 関連の設定・標準付属の Elisp (2007/11/18) 34.1.2 abbrev を拡張する非標準の Elisp (2007/11/18)
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
Meadow に標準で付属している Elisp や外部の Elisp を導入しなくても有効な abbrev に 関連した設定を紹介します.
34.1.1.1 勝手に abbrev を展開しないようにする (2007/11/18) 34.1.1.2 abbrev を拡張する ― expand (2007/11/18) 34.1.1.3 abbrev を利用して自動的に大文字に変換 (2007/11/18)
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
name@ のようにアルファベットの後に記号やスペースを入力すると, その前までを略語 と認識し展開されます.これは不要なことの方が多いので,設定で無効にします.
abbrev-modeではスペースや @ など,単語の区切りと考えられる位置で,自動的に略称展 開を行います.しかし,「 name@zzz.com 」と入力しようとして,「 name@ 」と入力し たら,「名前@ 」と abbrev が展開されてしまったりして,面倒なことがあります.意図 しない時にされると,非常にいらいらするものです.
スペースや記号を入力した時に自動で展開する機能を無効にできます.
設定しています.日本語入力だと不便だと思うことが多いので...
この機能は変数 abbrev-mode の値が t になっていると,有効になります.このため,無 効にするためには, abbrev-mode を nil に設定します.ただし,単に,
(setq-default abbrev-mode nil) |
としても,モードによっては上書きされてしまい,無効にはなってくれません.そのため, モード毎にフックを利用して設定する必要があります.
Meadow 全体でこの機能を無効にするためには,例えば,以下のようにします.
(add-hook 'pre-command-hook
(lambda ()
(setq abbrev-mode nil)))
|
これで,自動で展開されることはなくなります.もちろん通常通り,M-SPC などで 明示的に展開する際には abbrev を使うことができます.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
abbrev は非常に便利です.しかし, defa に
(defadvice (around act) "" )
という略語を割り当てても,コメントの時でも展開されてしまい,使い勝手がよくありま せん.
しかも,展開後,カーソルが最後の「) 」の後に行ってしまいます.そのため,展開後に カーソルを適当な位置へ移動する必要があり,面倒です.
いくつかの略語を追加してくれます.例えば,上の例は「 defa 」の略語展開です.しか も,カーソルは展開後に defadvice の後へ移動してくれます.
さらに,これらの略語はコメント文では展開されません.
設定していません
標準で附属しています.
以下を.emacs に追加します.
(require 'expand) |
ただし,これだけではあまり意味がありません.サンプルとして,
が用意されていますので,*scratch*に
(expand-add-abbrevs c-mode-abbrev-table
expand-c-sample-expand-list)
(expand-add-abbrevs lisp-interaction-mode-abbrev-table
expand-sample-lisp-mode-expand-list)
(expand-add-abbrevs emacs-lisp-mode-abbrev-table
expand-sample-lisp-mode-expand-list)
(expand-add-abbrevs lisp-mode-abbrev-table
expand-sample-lisp-mode-expand-list)
(expand-add-abbrevs cperl-mode-abbrev-table
expand-sample-perl-mode-expand-list)
のように書き,必要な行の最後でC-jとします.ただし,今までにそれぞれのモード略語を作ったこ とがないとエラーになりますので,必要な行のみにしてください.
これで,いくつかの略語が追加されます.例えば,
*scratch*で「 defa 」と書き,M-x expand-abbrev と入力すると,
(defadvice (around act) "" )
と展開され,カーソルは「 defadvice 」の後に移動します.
さらに,C-x a n を入力すると,カーソルは次の編集箇所へ移動します.C-x a p で一つ前の編集箇所に戻ります.
「 defu 」の略語は
(defconst expand-sample-lisp-mode-expand-list (list (list "defu" (concat "(defun ()\n" " \"\"\n" " (interactive)\n" " (let* (\n" " )\n" " \n" " ))") (list 8 11 16 32 43 59)) |
となっています.最初の「 defu 」の部分が略語,「 concat 」の中が展開される部分に なります.これを実際に展開してみると,
(defun _ () "" (interactive) (let* ( ) ))
となります.水色の部分はカーソルのある位置です.最初の「 (」から 8 文字目にあた ります.
続いて,C-x a nとしてみてください.そうすると,今度はピンクの位置へ移動し ます.これが, 11 文字目になります.さらに,C-x a nを入力すると, 16 , 32 , 43 , 59 文字目へと移動します.
つまり,「 defu 」の定義にあった数字はカーソルを移動する場所を表しているのです.
後は,自分の好きな略語とカーソル位置を作成し,
(setq my-lisp-mode-expand-list
(list
(list
"defu"
(concat
"(defun ()\n"
" \"\"\n"
" (interactive)\n"
" (let* (\n"
" )\n"
" \n"
" ))")
(list 8 11 16 32 43 59))
))
|
のように,適当な変数に設定 (*scratch*にコピーして,C-j) し,
(expand-add-abbrevs lisp-mode-abbrev-table my-lisp-mode-expand-list) |
を評価して, abbrev に追加しておきます.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
文の始めなどの文字を小文字で入力しても,大文字に変換することができます.
英語を書く場合,普通,文の最初の文字は大文字で始めます.また, I や Emacs などは 文の途中であっても大文字で書くのが普通です.
文の頭の文字などを小文字で書いても,自動的に大文字に変換してくれます.
設定していません.
必ず text-mode で abbrev-mode をオンにしておきます. 具体的には
(add-hook 'text-mode-hook
(function (lambda () (abbrev-mode 1))))
|
のように..emacsで設定しておきます.
また,34.1.1.1 勝手に abbrev を展開しないようにする (2007/11/18) の設定があると,上記の設定を追加しても,すぐにオフになっ てしまいます.そのため,34.1.1.1 勝手に abbrev を展開しないようにする (2007/11/18) で紹介した設定は消しておく必要がありま す.
以下を.emacs に追加します.
(define-abbrev text-mode-abbrev-table "emacs" "Emacs") (define-abbrev text-mode-abbrev-table "i" "I" #'abbrev-not-at-stop) (define-abbrev text-mode-abbrev-table "i'm" "I'm") ; ... egocentric (defun maybe-capitalize-bos () "If point is at the end of the first word in a sentence, capitalize it." (if (= (point) (save-excursion (backward-sentence) (forward-word 1) (point))) (capitalize-word -1))) ;; Capitalize words at beginning of sentence. (add-hook 'text-mode-hook (lambda () (make-local-hook 'pre-abbrev-expand-hook) (add-hook 'pre-abbrev-expand-hook 'maybe-capitalize-bos nil t))) (defun abbrev-not-at-stop () ; avoid `i.e.' -> `I.e.' "Unexpand abbrev if it was just expanded by a full stop. Intended as an abbrev hook function." (if (eq ?. last-command-char) (unexpand-abbrev))) |
普通に文章を打つと,文章の頭の文字などを大文字に変換してくれます.
やっぱり abbrev ってのは英語入力には便利なんですね.日本語入力だとそれほどでもな いんですけどね.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
abbrev 関連でインストールが必要な Elisp を紹介します.
34.1.2.1 abbrev を補完入力 ― abbrev-complete (2007/11/18) 34.1.2.2 abbrev の一覧をモードでソート ― abbrev-sort (2007/11/18) 34.1.2.3 大文字が混じる文字を学習 ― StudlyCaps (2007/11/18)
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
abbrev-mode は便利な機能なんですが,使いにくいです.なぜなら,対応する言葉をすべ て入力する必要があるからです.
例えば自分の住所を address に定義したら address とすべて入力しなければいけません. それは面倒だからといって add などと略したりすると,add という略語で登録したこと を忘れてしまい,結局展開できなくなってしまいます.
何も入力しないで, abbrev を展開しようとすると,
Click <mouse-2> on a completion to select it. In this buffer, type RET to select the completion near point. Possible completions are: adress -> 住所 asahi -> 朝日新聞 defa -> (defadvice (around act)^J ""^J ^J defc -> (defconst nil^J "") defm -> (defmacro ()^J ""^J (` ^J )) defs -> (defsubst ()^J ""^J (interactive)^J defu -> (defun ()^J ""^J (interactive)^J defv -> (defvar nil^J "")
のように補完候補が出力されます.これで,どんな略語があって,どう展開されるかがす ぐに分かります.
また,一文字入力した後で, abbrev を連続的に展開していくと,
a M-SPC 住所 M-SPC ← address の abbrev 朝日新聞 M-SPC ← asahi の abbrev abbrev M-SPC ← a の dabbrev abbrev-complete-completion M-SPC ← a の dabbrev
という風に展開できます. abbrev の候補がなくなれば, dabbrev で展開してくれます.
利用できます.
abbrev-complete.el をダウ ンロードして,ロードパスの通ったところへコピーします.
以下を.emacs に追加します.
(load "abbrev-complete")
|
基本的には普通にM-x expand-abbrevを行うだけです.
適当な文字の後に \ をつけておくと,
a\ M-SPC 住所 M-SPC ← address の abbrev 朝日新聞 M-SPC ← asahi の abbrev a\ M-SPC 住所 M-SPC ← address の abbrev
という風に, abbrev の候補だけを繰り返すことができます.
さらに, a- という風に - で終わると
a- M-SPC abbrev M-SPC ← a の dabbrev abbrev-complete-completion M-SPC ← a の dabbrev
という風に dabbrev だけを繰り返すこともできます.
t なら, hippie-expand を利用した展開ができる.
ただし, hippie にも abbrev や dabbrev を利用した展開があるので,
(setq abbrev-complete-use-hippie t)
(setq hippie-expand-try-functions-list
'(try-complete-file-name-partially
try-complete-file-name
try-expand-list
try-expand-line
try-complete-lisp-symbol-partially
try-complete-lisp-symbol))
|
のように abbrev や dabbrev を利用した展開をしないようにしておく方がい い.
'always なら,補完候補が 1 つでも別ウィンドウに表示する (デフォルト) .
'view なら,直前がスペースなどの時のみ別ウィンドウに表示
nil なら一切表示しない
仮りに def , dired , dabbrev という単語が abbrev に登録されていたとする.この 変数が nil なら d M-x expand-abbrev とすると, def , dired , dabbrev が 別ウィンドウに一覧表示される.
abbrev-complete-completion が t なら,一覧表示され,さらに, abbrev が 展開される.さらに,M-x expand-abbrev をすると, 次の候補である dired が展開される.
ここで指定した文字を最後に加えると, abbrev の候補だけを繰り返し展開す る.
例えば
abbrev-co M-SPC
のように, abbrev-complete-not-abbrev-completion-seg で指定した文字が 1 単語前に あると abbrev を行わない.
abbrev はこの場合 co をもとに展開するので,展開してくれてもあまりうれしくないた め,展開しないようにしました.
abb- M-SPC
のように,指定した文字を最後につけると abbrev は行わずに, abb の dabbrev のみを 行う.
普通,リージョンを選択した状態で abbrev を展開すると,リージョンは消される (デフォ ルト) .
しかし,これが「 t 」だと,リージョンを選択した状態で abbrev を展開しようとすると, リージョン内のテキストを別バッファにコピーします.
そこで,C-c C-cとすると,略語を追加できます.別バッファにコピーしてくれる ので,略語に追加する前に編集することもできます.
C-c C-qでキャンセルになります.
abbrev-complete の更新履歴
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
M-x edit-abbrevs とすると, abbrev の定義一覧が表示されます.それぞれモード 毎にまとめられているのですが,モードの並び方はばらばらで探しにくいものです.
M-x edit-abbrevs での順番を global を一番最初にして,それ以外はモード名を アルファベット順に並び換えてくれます.
利用できません.
abbrev-sort.el をダウンロード し,ロードパスの通ったところへ置きます.
以下を.emacs に追加します.
(require 'abbrev-sort) |
まず,M-x abbrev-sort-mode とします.すると,ソートしてくれるモードになりま す.
この状態で,M-x edit-abbrevs とすると,出力がソートされて出力されます.
起動時からオンにするためには,以下を .emacs に追加します.
(abbrev-sort-mode 1) |
expand.el を使っているとエラーになります.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
StudlyCaps のように大文字が複数混じる文字を abbrev に登録し,入力ミスを防ぎます.
「 YaTeX 」のように一単語に複数の大文字が混じった単語があります.このような単語は, 好みで大文字にしているわけではなく,大文字であることに意味があります.
しかし,大文字を入力するためには Shift を利用する必要があり,結構面倒なもの です.
バッファから文字を読み取り,大文字混じりの文字を読み取り abbrev に登録してくれます.
利用できません.
StudlyCaps.el をダウン ロードしロードパスの通ったところへ置きます.
.emacs に以下を追加します.
(require 'StudlyCaps) |
適当なファイルを読み込み,M-x StudlyCaps-mode とします.すると,このモード になります.
で,その上で M-x StudlyCaps-scan-buffer とするとバッファから「大文字 1 文 字 + 小文字 1 文字以上 + 大文字 1 文字 + 大文字か小文字」という文字列を探し,こ の単語を abbrev に登録します.
例えば「 YaTeX 」なら「 yatex 」の abbrev として登録されます.このため, abbrev-mode がオンならば,「yatex SPC」で「 YaTeX 」と入力できるのです.
しかし,「 XEmacs 」のように大文字が複数あっても,最初の大文字の直後に小文字がない と登録されません.
どういう単語を登録するかは,
(setq StudlyCaps-regexp "\\b[A-Z][-_a-z]*[A-Z][-_A-Za-z]*")
|
の正規表現を設定することで,変更できます.
また,リアルタイムで登録するわけではありませんので,例えば .emacs で以下のように 設定しておきます.
(global-set-key [f6] 'StudlyCaps-add-word-at-point) |
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
数文字入力して,この機能を使うと,バッファにある文字から,入力した文字で始まる単 語に展開してくれます.
abbrevは確かに便利ですけど,これには登録が必要になります.しかし,展開するために, 毎回登録するのも面倒なものです.
また,あるテキストを編集する時にはよく出てくるけど,他の時には使わないなんてこと もありますね.こういう単語をすべて一律で登録すると,abbrevの使い勝手が悪化します.
現在開いているバッファから単語を検索して展開してくれます.
標準機能ですので,利用できます.
Meadowの標準機能です.
特に設定する必要はありません.
abbrev よりも,さらに便利な機能が dabbrev (動的略語展開) です.
これは今開いているバッファの中から補完できる候補を探して補完してくれます. 例えば chapter を一度入力したことがあって, もう一度入力したくなったとします.そんなとき は, cha M-/ と入力すると cha で始まる単語をバッファから探して補完してくれま す.M-/ を何度か入力すると次々と「cha」で始まる候補を探して展開してくれます.
さらに,C-M-/ で補完入力も可能です.例えば cha C-M-/ とすると, cha で始まる単語を別ウィンドウに一覧表示してくれます.
そのままでは日本語ではうまく動きません.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
日本語でも快適な動的略語展開を利用できます.
dabbrev はとても便利な機能です.
でも,日本語を入力して,dabbrev のコマンドを実行すると,漢字との区切りなどをうま く認識してくれません.
日本語を入力して動的略語展開を実行しても,それなりの結果が得られます.
設定していますので,普通に dabbrev (動的略語展開) を実行するだけです.
dabbrev は非常に便利ですが,日本語で使おうとすると単語を切り分けることができず, まともに使うことができません.
そこで, dabbrev-ja という Elisp が便利です.これを使うと,日本語でもある程度切 り分けることができるようになります.
まず dabbrev-ja.el をダ ウンロードし,ロードパスの通ったところへ置きます.そして,以下を.emacs に追加しま す.
(load "dabbrev-ja")
|
これで,普通に dabbrev を行うと日本語でも便利に使うことができます.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
dabbrev は現在バッファなどから自動的に補完してくれてとても便利な機能ですが,どこ から補完されたのか分かりません.そこで,このElispを使うと,どこから補完されたの か明示してくれます.
dabbrev はとても便利な機能ですが,どこから補完されたのかよく分かりません.
どこから補完されたのか分かりやすくなります.
設定済みです.
http://namazu.org/%7Etsuchiya/elisp/#dabbrev-highlight にある dabbrev-highlight.el をロードパスの通ったところに置きます.
以下を .emacs に追加します.
(require 'dabbrev-highlight) |
普通に dabbrev を実行すると,補完元を強調表示してくれます.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
dabbrev で補完候補を探すファイルを読み込ませる方法.
dabbrev での補完用に適当なファイルを読み込んでおくと,望み通りの補完ができる可能 性が高くなります.しかし,普通に読むと C-x b でのバッファ移動時に邪魔になっ てしまいます.
バッファ名が 「 *filename*」という風に最初がスペースになります.これだと, C-x b などの候補にならないため,普段は邪魔になりません.
以下を.emacs に追加します.
(setq filename-for-abbrev '("~/TAGS" "~/list.txt")) ;;(defun find-file-for-abbrev () (progn (let ((list filename-for-abbrev) filename buf cbuf) (setq cbuf (current-buffer)) (while list (setq filename (car list)) (setq list (cdr list)) (if (get-buffer filename) () (progn (setq buf (find-file-noselect filename)) (set-buffer buf) (rename-buffer (concat " *" (file-name-nondirectory filename) "*") t)))) (set-buffer cbuf))) |
Meadow を起動して,普通に dabbrev を実行するだけです.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
dabbrev は非常に便利な機能です.
しかし, Elisp を開いて,ドキュメントを開いて, 2 ちゃんねるを見てということをしてい ると,探して欲しくないバッファまで dabbrev が文字を探しにいってしまいます.
dabbrev では
dabbrev-ignored-buffer-names '("*Messages*" "*Buffer List*") dabbrev-ignored-buffer-regexps nil |
の 2 つの変数により,検索対象となるバッファが決定されます.両方とも,対象としない バッファを設定できます.しかし, 2 ちゃんねるに書く時は 2 ちゃんねるのバッファだけを 対象としたいというようなことはできません.
そこで,この設定を使うと, 2 ちゃんねるに書く時は 2 ちゃんねるのバッファ, Elisp なら Elisp のバッファだけから探すようにできます.
以下を.emacs に追加します.
(defvar *dabbrev-buffer-name-inclusion-list* '()) (defvar *dabbrev-buffer-name-exclusion-list* '()) (defun dabbrev-buffer-in-list-p (buffer-name buffer-name-regexps) (cond ((null buffer-name-regexps) nil) ((string-match (car buffer-name-regexps) buffer-name) t) (t (dabbrev-buffer-in-list-p buffer-name (cdr buffer-name-regexps))))) (defun dabbrev-filter-buffers (buffer-list) (let ((dabbrev-buffers nil)) (while buffer-list (if (and (dabbrev-buffer-in-list-p (buffer-name (car buffer-list)) *dabbrev-buffer-name-inclusion-list*) (not (dabbrev-buffer-in-list-p (buffer-name (car buffer-list)) *dabbrev-buffer-name-exclusion-list*))) () (setq dabbrev-buffers (cons (buffer-name (car buffer-list)) dabbrev-buffers))) (setq buffer-list (cdr buffer-list))) dabbrev-buffers)) (setq dabbrev-my-ignored-case '( ;; buffer-name include exclude ("scratch" ("texi") ("navi2ch" "gnus")) ("el" ("el") ()) ("texi" ("texi") ()) ("navi2ch" ("navi2ch") ()) ("." ("^[^ ]+") ()) ;; Default )) (defadvice dabbrev-expand (around dabbrev-ignored-buffer activate) "" (if (or (eq last-command 'abbrev-expand) (eq last-command 'dabbrev-expand)) () (let ((alist dabbrev-my-ignored-case) (case-fold-search t) (command nil) (name (buffer-name (current-buffer)))) (while (and (not command) alist) (if (string-match (car (car alist)) name) (setq command (car (car alist)))) (setq alist (cdr alist))) (setq *dabbrev-buffer-name-inclusion-list* (nth 1 (assoc command dabbrev-my-ignored-case))) (setq *dabbrev-buffer-name-exclusion-list* (nth 2 (assoc command dabbrev-my-ignored-case))) (setq dabbrev-ignored-buffer-names (dabbrev-filter-buffers (buffer-list))) )) ad-do-it ) |
これで, dabbrev を実行すると,現在のバッファ名に応じて適当なバッファだけから検索 してくれます.
バッファ名と検索対象のバッファは dabbrev-my-ignored-case で設定します.
(setq dabbrev-my-ignored-case
'(
;; buffer-name include exclude
("scratch" ("texi") ("navi2ch" "gnus"))
;; バッファ名に scratch という文字を含んでいれば
;; texi をバッファ名に含むバッファのみを補完対象とし,
;; navi2ch や gnus をバッファ名に含むバッファは補完対象としない
))
|
ちなみに上から順番に探していきますんで,設定時には注意してください.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
dabbrevの補完第一候補をToolTipで表示します.一種の予測入力のように利用できます.
Meadow Memo Wiki への 書き込みから.
dabbrev は非常に便利なのですが,補完される文字は予測できません.
数文字入力して,少し待つと補完できる文字がToolTipで表示されます.表示されるのは dabbrevで補完できる文字の最初の候補です.
候補が表示されている状態でTABを入力すると,補完できます.
使用していませんので,自分でインストールをする必要があります.
http://gnufans.net/~deego/emacspub/lisp-mine/dabbrev-hover/ から dabbrev-hover.el をダウンロードします.そして,これをロードパスの通ったところへ 置きます.
以下を .emacs に追加します.
(require 'dabbrev-hover) (dabbrev-hover-install t t) ;; TABで補完決定&補完選択 |
英数字を数文字入力して少し待ちます.補完できる時にはToolTip に候補が表示されます. その候補でよければ,TABを押します.すると,補完できます.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
ここでは、各種の文字を補完するような Elisp を紹介します。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
Meadow に標準で付属するようになったので,とりあえず使ってみました.
よく使うのだけ入れておくと便利になるのかもしれない.そうすると,「 Meadow ML <URL:http://www.ysnb.net/meadow/> を見てください」とかが簡単に書けるわけだ.
といっても,登録が面倒なので,結局は, google で調べてしまう訳ですが...
;;; quickurl.el -- insert an URL based on text at point in buffer
登録された URL を簡単に入力することができます.
不要です.設定もいりません.
M-x quickurl-add-urlで URL を登録します.登録するのは,必須項目が Word (名前) と URL で,必須でない項目が Comment (メモ) になります.登録すると,~/.quickurls に情 報が保存されます.M-x quickurl-add-urlで登録しなくても,~/.quickurls を直 接編集することもできます.
登録後,その Word (名前) を書き,M-x quickurlとすると,
GNU <URL:http://www.gnu.org/>
のように URL を記入してくれます.
機能は以下の通り.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
シェルスクリプトやプログラムなどでファイルのパスが書きたい時に便利なものです.ま たパスだけでなく,状況に応じて dabbrev などを行ってくれます.
ac-modeよりダウンロードできます.これを ロードパスの通ったところへ置き,以下を.emacs へ追加します.
(load "ac-mode")
|
M-x ac-modeでオン.TABで補完です.補完は自動的に書式を判断し,通常は インデント,パスらしきものがあればパスの補完をしてくれます.さらに, dabbrev に よる単語補完も行ってくれます.
常時オンにして,補完後カーソルの位置を最後に移動させるために,以下のように設定し ています.
(setq ac-mode-exception '(dired-mode hex-mode)) (add-hook 'find-file-hooks 'ac-mode-without-exception) (setq ac-mode-goto-end-of-word t) |
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
Meadow には abbrev や dabbrev ,さらに, emacs-lisp-mode や lisp-interaction-mode での関数名の補完などの補完方法が用意されています.しかし, これらはすべて操作方法が異なり不便です,
そこで, hippie-exp というものが Meadow に標準で附属しています.これは, abbrev な どの補完方法を順番に行い,補完してくれます.
使い方は簡単で,適当な文字を入力して M-x hippie-expandとするだけです.
補完方法は
(defcustom hippie-expand-try-functions-list '(try-complete-file-name-partially try-complete-file-name try-expand-all-abbrevs try-expand-list try-expand-line try-expand-dabbrev try-expand-dabbrev-all-buffers try-expand-dabbrev-from-kill try-complete-lisp-symbol-partially try-complete-lisp-symbol)) |
のように定義されていますので,必要に応じて setq で変更しておくといいでしょう.
普段使うのであれば,以下のようにしてキーバインドを割り当てておきます,
(define-key esc-map " " 'expand-abbrev) ;; M-SPC |
ただし,補完方法が増えるということは,それだけ補完候補が増えることになるので,あ る程度入力しておいてから,補完するようにしないと,却って不便になってしまいます.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
dabbrrev のような補完を行う.さらに,補完が完了したものはファイルに保存される.
abbrev や dabbrev , hippie-expand の他に, Meadow には completion という補完が あります. completion の先頭行から引用すると,「 dynamic word-completion code 」 というものです.
要は単語を dabbrev のように拾って補完してくれる Elisp です. dabbrev との違いは, 補完したものをファイルに保存してくれる点です.そのため,よく補完するものに関して は,補完のためにファイルを読み込まなくても,うまく補完できるようになります.
Meadow に付属しています.
以下を.emacs に追加します.
(dynamic-completion-mode) |
ALT+RET で補完することができます.ただし,最低でも 3 文字入力していないと 補完できません.
また,モードによっては ALT+RET は別の機能が割り当てられているので,必要な らキーバインドを変えた方がいいでしょう.関数名は「 complete 」です.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
文字を入力すると,その単語を記録し,次回入力時には即座に補完してくれます.また, 同じアルファベットから始まる単語では入力頻度の高い順に補完されます.
;; This program is free software; you can redistribute it and/or modify
と入力した後で,「 p 」と入力すると,
p[rogram]
と表示されます.ここで,TAB を入力すると補完できますし,別の単語を入力する こともできます.
また,この後で何度か「 prefix 」と入力していると,「 pr 」に対する補完候補が 「 program 」から「 prefix 」に変わります.
pabbrev.el をダウンロー ドし,ロードパスの通ったところへ置きます.
以下を.emacs に追加します.
(require 'pabbrev) |
M-x pabbrev-mode でオンにし,文字を入力します.すると入力した文字を記録し, 補完できるようになります.ただし, pabbrev を利用できるのは M-x pabbrev-mode を行ったバッファのみになります.
すべてのバッファで pabbrev を使うには M-x global-pabbrev-mode とします.
また,いちいち文字を入力しなくても,M-x pabbrev-scavenge-buffer や M-x pabbrev-scavenge-region でバッファ全体やリージョンの文字を記憶させるこ とができます.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
文字を入力すると,補完できる単語が表示されます.その中から選択すると,その単語を 入力できます.
abbrev で補完はできますが,次の候補が何かはわかりません.
文字を入力すると,自動的に補完候補を表示してくれます.
設定していません.
auto-complete.elからダ ウンロードしてロードパスの通ったところへ置きます.
以下を,.emacs に追加します.
(require 'auto-complete) (global-auto-complete-mode t) ;; Maybe default-enable-multibyte-characters is t by default (setq default-enable-multibyte-characters t)
文字を入力すると,下の図のように,自動的に補完候補が表示されます.
TAB を入力すると,次の候補が順番に選択され,RET を入力すると,今の候 補が入力されます.候補の選択はカーソルキーでもできます.
| [ << ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |