redguardtoo / mastering-emacs-in-one-year-guide

Be great at emacs in one year
6.35k stars 898 forks source link

my company-jstag dose't work in web-mode and others #162

Open zhyuanyuan opened 3 years ago

zhyuanyuan commented 3 years ago

老师你好: 很高兴学习你的课程,按你视频上所讲。我也实现了一个版本:代码如下: company-jstags.el

(require 'my-js-keywords)
;; prefix: 输入的信息

;; 该方法用过滤符合条件的正则

(defun my/get-input-format-regexp (prefix)
  (let* ((string-lists (s-split "" (string-trim prefix)))
         (format-str (mapconcat 'identity string-lists ".*")))
    (format "^%s" (substring format-str 2))))

(defun my/formaterCircle (prefix)
  (let* ((string-lists (s-split "\\." (string-trim prefix)))
         (len (length string-lists)))
(= len 1)
        (format "%s" (mapconcat 'identity string-lists " "))
      (format "%s" (mapconcat 'identity (nthcdr (- (length string-lists) 1) string-lists) " ")))))

(defun company-jstags-candidates (prefix)
  ;;(setq prefix (my/formaterCircle prefix))
  (message "prefix is %s" prefix)
  (let* (rlt)
    (dolist (item my-js-keywords)
      (when (string-match (my/get-input-format-regexp prefix) item)
        (push item rlt)))
    rlt))

(defun company-jstags (command &optional arg &rest ignored)
  "`company-mode' completion backend for GNU Global."
  (interactive (list 'interactive))
  (cl-case command
    (interactive (company-begin-backend 'company-jstags))
    (prefix (company-grab-symbol))
    (candidates (company-jstags-candidates arg))))

;;;###autoload
(defun my-add-jstags-to-company-backends ()
  "Add ispell to the last of `company-backends'."
  (setq company-backends
        (add-to-list 'company-backends 'company-jstags t)))

(provide 'company-jstags)

​;; my-js-keywords.el 文件如下

(setq my-js-keywords
      '(
        "window"
        "document"
        "localStorage"
        "onclick" "onblur" "onfocus" "@focus" "beforeCreate"
        ))

(provide 'my-js-keywords)

然后我在web-mode 中调用

(use-package web-mode
  :init
  (progn
    (setq web-mode-enable-auto-indentation t)
    (setq web-mode-enable-auto-pairing t)
    (sp-with-modes '(web-mode)
      (sp-local-pair "%" "%"
                     :unless '(sp-in-string-p)
                     :post-handlers '(((lambda (&rest _ignored)
                                         (just-one-space)
                                         (save-excursion (insert " ")))
                                       "SPC" "=" "#")))
      (sp-local-tag "%" "<% "  " %>")
      (sp-local-tag "=" "<%= " " %>")
      (sp-local-tag "#" "<%# " " %>")))
  :config
  (progn
    (add-hook 'web-mode-hook
              (lambda ()
                (unless (featurep 'company-jstags) ;; 这里调用的
                  (require 'company-jstags)
                  (my-add-jstags-to-company-backends))))
    (web-mode-set-content-type "jsx")
    (web-mode-set-engine "vue"))
  :mode
  (("\\.nvue$" . web-mode)
   ("\\.xml$" . web-mode)
   ("\\.vue$" . web-mode)
   ("\\.tsx$" . web-mode)
   ("\\.jsx$" . web-mode))
  :bind (:map web-mode-map
              ("C-c h" . web-mode-fold-or-unfold)))

用的是mac系统,emacs 27.2版本:

company-backends is a variable defined in ‘company.el’.
Its value is
(company-tide company-bbdb company-semantic company-cmake company-capf company-clang company-files
              (company-dabbrev-code company-gtags company-ctags company-keywords)
              company-oddmuse company-dabbrev company-jstags)
Original value was 
(company-bbdb company-semantic company-cmake company-capf company-clang company-files
              (company-dabbrev-code company-gtags company-etags company-keywords)
              company-oddmuse company-dabbrev)

希望老师给点解答。谢谢

redguardtoo commented 3 years ago

company-backends 是只要最前面的backend匹配搜索关键字返回了结果,后面的backend 就不调用了。这是默认语法。所以你需要把company-jstags放在最前面而不是最后面。

还有其他的一些语法。(company-dabbrev-code company-gtags company-ctags company-keywords)部分表示括号中的所有backend都会查询并返回他们的共同结果。

这个变量的文档值得好好看一下。可以参考我的emacs.d中是如何使用company-backends。

company-mode是emacs的大杀器,别的编辑器和IDE中你是不会有机会混用各种backend(包括你自己写的backend)。很多教程只教一些基本设置是浪费了其潜力。

另外在mode hook中设置变量company-backends,可以考虑用setq-local取代setq. 前者对变量的修改只在当前buffer生效。

zhyuanyuan commented 3 years ago

老师你好。这会我又发现个新问题,就是提示内容有里面有重复的代码提示。如下图所示: 这里上传不了图片,我在51cto上有图片