Bash 스크립트 편집 파일 이름을 변수에 지정하고 싶습니다.emacs + comint-dynamic-complete-filename after '='
예. inputfile = foo.txt
std. settings '='다음에 공백을 먼저 삽입하지 않으면 파일 이름을 완성 할 수 없습니다.
이 문제가 해결 되었습니까?
Bash 스크립트 편집 파일 이름을 변수에 지정하고 싶습니다.emacs + comint-dynamic-complete-filename after '='
예. inputfile = foo.txt
std. settings '='다음에 공백을 먼저 삽입하지 않으면 파일 이름을 완성 할 수 없습니다.
이 문제가 해결 되었습니까?
우선, 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에서 약간 다르게 보일 것입니다).
희망이 있습니다.
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)