2011-12-08 4 views
1

다음은 dabbrev-expand를 확장하여 하위 문자열 확장을 지원하는 것입니다. 아는 한 예상대로 작동합니다. 그러나 심볼 내 확장을 mdabbrev과 비슷한 방식으로 지원하면 기호 문자 및 대소 문자 조정 지원 측면에서 불완전한 것으로 나타났습니다. 그러나 dabbrev-substring-search에 대한 pattern 인수는 점 이전의 패턴 일 뿐이지 만 내부 확장을 위해서는 점 다음에 패턴이 필요합니다. hippie/dabbrev-expand에서이 패턴을 사용할 수없는 이유는 무엇입니까?자리 표시 Word/Symbol Dabbrev 확장

(defun dabbrev-substring-search (pattern &optional reverse limit syntax-context) 
    "Expand dabbrev substring. See: 
http://www.emacswiki.org/cgi-bin/wiki/HippieExpand#toc5" 
    (let ((result()) 
     (regpat (cond ((not hippie-epxand-dabbrev-as-symbol) 
         (concat (regexp-quote pattern) W*)) 
         ;; ((eq (char-syntax (aref pattern 0)) ?_) 
         ;; (concat (regexp-quote pattern) 
         ;;   "\\(\\sw\\|\\s_\\)*")) 
         (t 
         (concat "\\(?:" 
           Y< 
           "\\(" "\\(?:\\sw\\|\\s_\\)+" "\\)" 
           "\\(" (regexp-quote pattern) "\\)" 
           "\\(" "\\(?:\\sw\\|\\s_\\)*" "\\)" 
           Y> 
           "\\)" 

           "\\|" 

           "\\(?:" 
           Y< 
           "\\(" "\\(?:\\sw\\|\\s_\\)*" "\\)" 
           "\\(" (regexp-quote pattern) "\\)" 
           "\\(" "\\(?:\\sw\\|\\s_\\)+" "\\)" 
           Y> 
           "\\)" 

           ))))) 
    (while (and (not result) 
       (if reverse 
        (re-search-backward regpat limit t) 
        (re-search-forward regpat limit t))) 
     (setq result (buffer-substring-no-properties (save-excursion 
                (goto-char (match-beginning 0)) 
                ;;(skip-syntax-backward "w_") 
                (point)) 
                (match-end 0))) 

     (if (he-string-member result he-tried-table t) 
      (setq result nil)))  ; ignore if bad prefix or already in table 

    (when nil 
     (when result 
     (let* ((p (point)) 
       (end3 (match-end 3)) 
       (beg2 (match-end 2)) 
       (end2 (match-end 2)) 
       (dummy (message "%s %s %s" end3 beg2 end2)) 
       (beg (- end3 beg2))  ;begin offset from point 
       (end (- end3 end2)))  ;end offset from point 
      (setq dabbrev-substring-match-region (cons beg end)) 
      (hictx-generic (- p beg) (- p end) nil 'match 3)))) 

    result)) 
;; Use: (dabbrev-substring-search "he") 

(defun try-expand-dabbrev-substring-visible (old) 
    "Like `try-expand-dabbrev' but for visible part of buffer." 
    (interactive "P") 
    (let ((old-fun (symbol-function 'he-dabbrev-search))) 
    (fset 'he-dabbrev-search (symbol-function 'dabbrev-substring-search)) 
    (unwind-protect (try-expand-dabbrev-visible old) 
     (fset 'he-dabbrev-search old-fun)))) 

(defun try-expand-dabbrev-substring (old) 
    "Like `try-expand-dabbrev' but for substring match." 
    (interactive "P") 
    (let ((old-fun (symbol-function 'he-dabbrev-search))) 
    (fset 'he-dabbrev-search (symbol-function 'dabbrev-substring-search)) 
    (unwind-protect (try-expand-dabbrev old) 
     (fset 'he-dabbrev-search old-fun)))) 

(defun try-expand-dabbrev-substring-all-buffers (old) 
    "Like `try-expand-dabbrev-all-buffers' but for substring match." 
    (interactive "P") 
    (let ((old-fun (symbol-function 'he-dabbrev-search))) 
    (fset 'he-dabbrev-search (symbol-function 'dabbrev-substring-search)) 
    (unwind-protect (try-expand-dabbrev-all-buffers old) 
     (fset 'he-dabbrev-search old-fun)))) 

이 수도 있고 도움이되지 않을 수도 있습니다

(setq hippie-expand-try-functions-list 
     (append 
     '(
      try-expand-dabbrev-substring-visible 
      try-expand-dabbrev-substring 
      try-expand-dabbrev-substring-all-buffers))) 

답변

0

사용 예를 들어 활성화된다. 보통의 dabbrev처럼, 그것은 포인트 이전의 텍스트와 함께 작동하지만, 후보 매칭은 접두어 외에 substring, regexp 또는 fuzzy (다양한 종류) 일 수 있습니다. Icicles - Dynamic Abbreviation