Emacs を次のように動作させたい:
自動ポップアップ
auto-complete
メニューを許可:(setq ac-auto-show-menu 0.8) (setq ac-delay 0.1)
C-n/p/を使用して、ポップアップ メニューの候補M-n/pを選択します。
auto-complete
(define-key ac-menu-map (kbd "M-n") 'ac-next) (define-key ac-menu-map (kbd "M-p") 'ac-previous)
候補者を選ぶとき
無効化TAB/S-TABポップアップ メニューの選択:
(define-key ac-menu-map (kbd "<tab>") nil) (define-key ac-menu-map (kbd "<S-tab>") nil)
を押して、改行Enterを挿入せずに候補を選択します。
;; ???
候補が略語の場合は、候補Enterのみを選択する必要があります。
;; ???
... を押すSpaceと、Emacs は略語を自動展開します。
候補がdabbrevの場合、候補を押すM-\とトリガーされ
dabbrev-expand
ます。TAB/を押しC-iて の候補を展開し
yasnippet
ます。(setq yas-trigger-key "TAB")
設定したのですが、 を押してもトリガーが伸びませんTAB。
を押しTABて、フィールド内でスニペット トリガーを展開します。
(setq yas-triggers-in-field t)
を押すC-jと次のフィールドにジャンプします:
(setq yas-next-field-key '("<tab>")) ;; or "C-j"
いくつかの説明
TABEmacs には 2 つの があります。
(kbd "TAB")
/(\t, [9])
(kbd "<tab>")
/([tab])
モードが好きでバインドしたい場合yasnippet
、auto-complete
それらTABのトリガーキーは元のタブコマンドと同じでなければなりません。Emacs は にバインドindent-for-tab-command
するので(kbd "TAB")
、それをトリガー キーとして使用することをお勧めします。デフォルトでそれにバインドされ、同様にトリガーするyasnippet
ように設定するのは簡単です:auto-complete
TAB
;; trigger using TAB and disable auto-start
(custom-set-variables
'(ac-trigger-key "TAB")
'(ac-auto-start nil)
'(ac-use-menu-map t))
ただし、一部のモード ( ruby-mode
、markdown-mode
、org-mode
など) では、コマンドは にバインドされ
(kbd "<tab>")
ます。実際のタブ キーが入力されると、バインドされている関数の(kbd "<tab>)
優先度が高くなるためyasnippet
、 とauto-complete
は呼び出されません。これは、キー バインドを移動することで簡単に修正できます。
(defun iy-tab-noconflict ()
(let ((command (key-binding [tab]))) ; remember command
(local-unset-key [tab]) ; unset from (kbd "<tab>")
(local-set-key (kbd "TAB") command))) ; re-bind to (kbd "TAB")
(add-hook 'ruby-mode-hook 'iy-ac-tab-noconflict)
(add-hook 'markdown-mode-hook 'iy-ac-tab-noconflict)
(add-hook 'org-mode-hook 'iy-ac-tab-noconflict)
私のセットアップ
パッケージャーマネージャー経由でダウンロードyasnippet
しました。Ubuntu 12.04 と Emacs 24.3.50.1 を使用しています。auto-complete
el-get
まとめ
auto-complete
この問題が少し長いことは承知していますが、実際にとを使用するのが難しくなっていますyasnippet
。基本的なキー バインディングがスムーズに機能しない場合、ワークフローがかなり遅くなります。インターネットで同様の質問をいくつか見つけたので、多くの人が同様の問題を抱えていると思います(ただし、私のものとまったく同じものはありません)。
上記のように、関連する設定のいくつかは既に知っています。(しかし、どこかで間違っていると思われる場合は、教えてください。)設定方法がまだわからないこともあります(???
)。これらの設定をすべて連携させる方法はないのでしょうか? その場合はお知らせください。それ以外の場合は、これらの設定が互いに干渉しないようにしてください。
この質問に対する答えが得られたら、これらの設定をすべて自動的に初期化する Emacs 拡張機能を作成したいと考えています。
ご協力いただきありがとうございます!