1

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"
      
    • を使用してスニペット内でスニペットを展開するにはどうすればよいyasnippetですか?


いくつかの説明

TABEmacs には 2 つの があります。

  • (kbd "TAB")/(\t, [9])
  • (kbd "<tab>")/([tab])

モードが好きでバインドしたい場合yasnippetauto-completeそれらTABのトリガーキーは元のタブコマンドと同じでなければなりません。Emacs は にバインドindent-for-tab-commandするので(kbd "TAB")、それをトリガー キーとして使用することをお勧めします。デフォルトでそれにバインドされ、同様にトリガーするyasnippetように設定するのは簡単です:auto-completeTAB

;; trigger using TAB and disable auto-start
(custom-set-variables
 '(ac-trigger-key "TAB")
 '(ac-auto-start nil)
 '(ac-use-menu-map t))

ただし、一部のモード ( ruby-modemarkdown-modeorg-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-completeel-get

まとめ

auto-completeこの問題が少し長いことは承知していますが、実際にとを使用するのが難しくなっていますyasnippet。基本的なキー バインディングがスムーズに機能しない場合、ワークフローがかなり遅くなります。インターネットで同様の質問をいくつか見つけたので、多くの人が同様の問題を抱えていると思います(ただし、私のものとまったく同じものはありません)。

上記のように、関連する設定のいくつかは既に知っています。(しかし、どこかで間違っていると思われる場合は、教えてください。)設定方法がまだわからないこともあります(???)。これらの設定をすべて連携させる方法はないのでしょうか? その場合はお知らせください。それ以外の場合は、これらの設定が互いに干渉しないようにしてください。

この質問に対する答えが得られたら、これらの設定をすべて自動的に初期化する Emacs 拡張機能を作成したいと考えています。

ご協力いただきありがとうございます!

4

2 に答える 2

0

RETor<return>を function にバインドしますac-expand。これは、候補者を選択するためのものです。

于 2013-11-11T10:06:22.003 に答える