2016-11-23 3 views
2

Bashスクリプトの編集変数にファイル名を割り当てたいと思います。emacs + comint-dynamic-complete-filename after '='

など。 inputfile = foo.txt

std。設定 '='の後にスペースを挿入することなくファイル名を完成させることはできません。

これに解決策はありますか?

答えて

1

まず、comint-dynamic-completeは、Emacs 24.1以降では廃止されました。置換機能はcompletion-at-pointです。

ここで、completion-at-pointが実際にシェルスクリプトバッファ内で何をしているのか分かり始めたら、結局はコイントに終わるでしょう。特に、関数comint--match-partial-filenameは、記述した動作の説明が有望です。

これを正しく読めば、少なくともPOSIXのようなシステムでは、 "="がファイル名の有効な部分と見なされるという問題があります(変数comint-file-name-charsを参照)。ですから、完了メカニズムはファイル名 "inputfile =/..."を完成させようとしていますが、それは明らかに見つけられません。

ファイル名に "="を使用しない場合(または作業の補完が他の面よりも重要であることはまれにしかありません)、シェルスクリプトモードのフックで(setq comint-file-name-chars "[]~/[email protected]:_.$#%,{}-")のようにすることをお勧めしますPOSIXシステムでは、Windowsでは若干異なって見えます)。

希望に役立ちます。

1

bash-completionは、あなたがウィンドウではないと仮定して使用できます。 sh-modeで動作するにはわずかな修正が必要です。コミット関数を使用して現在の補完候補を決定するためです。

ファイル名を入力するだけでなく、コマンドラインスイッチなどのすべての素晴らしいreadlineの完了を与えるため、私はこれが好きです。companyを使用した設定例ですが、あなたが本当に必要とするのは、修正済み補完点関数を追加することだけです。

;; required packages: company bash-completion 
(eval-when-compile 
    (require cl-lib)) 

;; locally redefine comint-line-beginning-position so bash-completion 
;; can work in sh-mode 
(defun sh-bash-completion() 
    (cl-letf (((symbol-function 'comint-line-beginning-position) 
      #'(lambda() 
       (save-excursion 
        (sh-beginning-of-command) 
        (point))))) 
    (let ((syntax (syntax-ppss))) 
     (and (not (or (nth 3 syntax) 
        (nth 4 syntax))) 
      (bash-completion-dynamic-complete))))) 

;; put this in your sh-mode hook 
(defun sh-completion-setup() 
    ;; add capf function 
    (add-hook 'completion-at-point-functions 
      'sh-bash-completion nil 'local) 
    (company-mode) 
    (make-local-variable 'company-backends) 
    ;; use company completion-at-point 
    (delq 'company-capf company-backends) 
    (cl-pushnew 'company-capf company-backends) 
    (setq-local company-transformers 
       '(company-sort-by-backend-importance))) 

(add-hook 'sh-mode-hook 'sh-completion-setup)