comint-mode に基づいて、派生モードを作成しています。このモードはコマンドライン プログラム (GRASS gis) へのインターフェイスであり、comint モード補完はプログラムに対して機能します。を介して、プログラムへの引数を完了するためのサポートを追加しようとしていcompletion-at-point-functions
ます。おもちゃの例は次のとおりです。
(setq my-commands
'(("ls"
("my-completion-1")
("my-completion-2"))
("mv"
("my-completion-3")
("my-completion-4"))))
(defun my-completion-at-point ()
(interactive)
(let ((pt (point)) ;; collect point
start end)
(save-excursion ;; collect the program name
(comint-bol)
(re-search-forward "\\(\\S +\\)\\s ?"))
(if (and (>= pt (match-beginning 1))
(<= pt (match-end 1)))
() ;; if we're still entering the command, pass completion on to
;; comint-completion-at-point by returning nil
(let ((command (match-string-no-properties 1)))
(when (member* command my-commands :test 'string= :key 'car)
;; If the command is one of my-commands, use the associated completions
(goto-char pt)
(re-search-backward "\\S *")
(setq start (point))
(re-search-forward "\\S *")
(setq end (point))
(list start end (cdr (assoc command my-commands)) :exclusive 'no))))))
(push 'my-completion-at-point completion-at-point-functions)
これはほとんど機能します。プログラム名の正常な補完が得られます。ただし、ls
コマンドラインで入力した場合、タブを押すと挿入さmy-completion-
れ、2 つのオプションが提供されません。タブをもう一度押すmy-completion-
と、2 回目の挿入が行われるので、ls my-completion-mycompletion-
.
私の実際のコードには、複数行のコマンドをチェックするための数行が含まれていますが、完了コードは変更されていません。このバージョンのコードでは、プログラム名の 1 つで始まる行でタブを押しますmy-commands
。コマンドを完了するために使用できる引数のリストが表示されますが、バッファには何も挿入されず、リストは引数の最初の数文字を入力して絞り込まれないようにします。
マニュアルを読みましたが、関数の正しい書き方がわかりませんcompletion-at-point
。私が見逃しているアイデアはありますか?
を簡単に見ましたpcomplete
が、 は「ドキュメント」をよく理解しておらず、何の進展もありませんでした。