Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
zhyuanyuan opened this issue May 13, 2021 · 2 comments
Open

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

zhyuanyuan opened this issue May 13, 2021 · 2 comments

Comments

@zhyuanyuan
Copy link

zhyuanyuan commented May 13, 2021

老师你好:
很高兴学习你的课程,按你视频上所讲。我也实现了一个版本:代码如下:
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
Copy link
Owner

redguardtoo commented May 14, 2021

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
Copy link
Author

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants