7

私はhaxeプログラミング言語のemacsでのオートコンプリートの実装に取り​​組んでいます。

提示したい自動補完のリストを取得する方法はすでに理解しています。リストの形式は次のとおりです。

'((name1 type1 desc1)
  (name2 type2 desc2) ...

カーソル位置の後に「name1type1」の形式のテキスト(オートコンプリートモードなど)と、ミニバッファーで現在選択されている項目の説明を含むユーザーリストに表示したい。ユーザーは、オートコンプリートモードのように、完了を選択するか、あきらめることができるはずです。

ユーザーが何かを選択するときは、name1をカーソル位置に挿入する必要があります。

これを行うための最良/最も簡単な方法は何ですか?これを行うための標準的なemacsの方法はありますか、それとも自分で何かをコーディングする必要がありますか?

編集:バッファに基づいてオートコンプリート候補のリストを取得する関数があります。今、私はそれをオートコンプリートモードに統合する方法に苦労しています。get-completesは重い操作なので、カーソルが「。」にある場合にのみトリガーしたいと思います。キャラクター。

これが私が持っているコードです。

(defun get-completes-from-haxe (hxml-file file pos)
  (let* ((completion-buffer (get-buffer-create "*haxe-completions*"))
         (cmd (concat "cd " (file-name-directory hxml-file)  "; haxe " hxml-file " --display " file "@" (number-to-string pos))))
    (ignore-errors
      (shell-command cmd completion-buffer)
      (let ((clist (xml-parse-region 1 (buffer-size completion-buffer) completion-buffer))
            (completes nil))
        (dolist (s (cddar clist))
          (when (listp s)
            (let* ((item (cdr s))
                   (name (cdaar item))
                   (type (car (cddadr item)))
                   (desc (cdddr item)))
              (setf completes (cons name completes)))))
        completes))))

(defun file-find-upwards (buffer file-name)
  ;; Chase links in the source file and search in the dir where it  points.
  (setq dir-name (or (and (buffer-file-name buffer)
                          (file-name-directory (file-chase-links
                                                (buffer-file-name buffer))))
                     default-directory))
  ;; Chase links before visiting the file.  This makes it easier to
  ;; use a single file for several related directories.
  (setq dir-name (file-chase-links dir-name))
  (setq dir-name (expand-file-name dir-name))
  ;; Move up in the dir hierarchy till we find a change log file.
  (let ((file1 (concat dir-name file-name))
        parent-dir)
    (while (and (not (file-exists-p file1))
                (progn (setq parent-dir
                             (file-name-directory
                              (directory-file-name
                               (file-name-directory file1))))
                       ;; Give up if we are already at the root dir.
                       (not (string= (file-name-directory file1)
                                     parent-dir))))
      ;; Move up to the parent dir and try again.
      (setq file1 (expand-file-name file-name parent-dir)))
    ;; If we found the file in a parent dir, use that.  Otherwise,
    ;; return nil
    (if (or (get-file-buffer file1) (file-exists-p file1))
        file1
      nil)))


(defun get-candidate-list (buffer pos)
  (get-completes-from-haxe 
   (file-find-upwards buffer "compile.hxml") 
   (buffer-file-name buffer) 
   pos))
4

5 に答える 5

7

優れたパッケージAutoCompleteをお勧めします:http ://www.emacswiki.org/emacs/AutoComplete

オートコンプリートのカスタムソースを定義することができ、それはかなり簡単に思えます。

于 2009-07-17T17:10:36.573 に答える
3

なぜホイールを作り直し続けるのですか?会社モードはいくつかの言語をサポートしています

于 2009-08-14T14:19:16.740 に答える
1

idoパッケージには、「ido-completing-read」と呼ばれる便利な完了機能があります。たとえば、リストを行ごとに表示するための簡単な調整を次に示します。

(defun x-ido-completing-read
  (prompt choices &optional predicate require-match initial-input hist def)
  (let* ((indent (concat "\n" (make-string (length prompt) ? )))
         (ido-decorations
         `("" "" ,indent ,(concat indent "...")
           "[" "]" " [No match]" " [Matched]" " [Not readable]" " [Too big]")))
    (ido-completing-read prompt choices predicate require-match initial-input hist def)))
于 2009-07-21T04:41:56.903 に答える
1

ido.elからのido-completing-readは、それを行う別の方法です。

この機能の便利な機能は、正規表現を使用して候補を除外でき、この機能のオンとオフをオンザフライで切り替えることができることです。詳細については、ido.elを参照してください。

于 2009-07-19T20:31:26.677 に答える
1

グーグルコードから入手可能なyasnippetコード内で、彼らはJaeyounChungによる'dropdown-list.el'を使用して、その時点で使用できる可能性のあるスニペットを表示します。これにより、カーソル位置にポップアップ(ツールチップのような)メニューが表示され、矢印キーで選択して入力するか、番号で選択できます。

http://www.emacswiki.org/emacs/dropdown-list.el

于 2009-07-23T03:33:24.883 に答える