2016-11-23 4 views
2

Bash 스크립트 편집 파일 이름을 변수에 지정하고 싶습니다.emacs + comint-dynamic-complete-filename after '='

예. inputfile = foo.txt

std. settings '='다음에 공백을 먼저 삽입하지 않으면 파일 이름을 완성 할 수 없습니다.

이 문제가 해결 되었습니까?

답변

1

우선, comint-dynamic-complete은 Emacs 24.1 이후로 사용되지 않습니다. 대체 기능은 completion-at-point입니다.

이제 쉘 스크립트 버퍼에서 completion-at-point이 실제로 무엇을하는지 살펴보기 시작하면 궁극적으로는 결국 comint로 끝날 것입니다. 특히, 함수 comint--match-partial-filename은 설명 된 동작에 대한 설명이 유망 해 보입니다.

올바르게 읽으면 "POSIX 계열 시스템"에서 "="이 파일 이름의 유효한 부분으로 간주됩니다 (변수 comint-file-name-chars 참조). 따라서 완료 메커니즘은 "inputfile =/..."파일명을 완성하려고 시도하고 있습니다.이 파일명은 분명히 찾을 수 없습니다.

파일 이름에 "="을 사용하지 않으면 (또는 작업 완료가 다른 단점보다 중요하지 않은 경우) 셸 스크립트 모드 후크에서 (setq comint-file-name-chars "[]~/[email protected]:_.$#%,{}-")과 같은 것을 수행 할 수 있습니다. POSIX 시스템에서는 Windows에서 약간 다르게 보일 것입니다).

희망이 있습니다.

1

bash-completion은 Windows가 아닌 것으로 가정 할 수 있습니다. sh-mode에서 약간의 수정이 필요합니다. comint 함수를 사용하여 현재 완료 후보를 결정하기 때문입니다.

파일 이름을 완성하는 것 외에도 커맨드 라인 스위치와 같은 멋진 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)