web-mode auto-pairing 无效

尝试用 web-mode,engine用的django,已经设置为auto pair,但是每次输入 {{ 或者 {% 并没有触发 auto-pair,不知道大家有没有碰到过这个问题。怀疑可能是 evil 造成的,但是也没有证据。

image

另外,注意到每次输入花括号都会在minibuffer回显以下内容:

可以尝试下awesome-pair

两个花括号这种是模板语法,应该是 web-mode 内置不支持的,看是不是少启用了某些 minor-mode,这些 minor-mode 估计提供了支持

Search failed 看,应该是某个(例如 paredit 之类的?)扩展导致补全过程中断。

最好把 backtrace 打出来。

Search failed 信息出自 smartparens:

嗯嗯,抽空尝试一下

web-mode支持的,不然不会有那个变量。而且我在原贴中提到我已经将engine切到django,django模板的语法高亮都没问题的。

是的,确实是 smartparens,把它停用后web mode auto-pairing的问题依旧,看来并不是用smartparens的功能实现的。

我试了只加载 evilweb-modeelectric-pair-mode 没问题。

{{ 可以补全(其实是 { 单独补全了两次)。

{% 只能得到 {%}(想要补全 % 得自己实现)。

⋊> emacsq.sh \
    -P web-mode,evil \
    -M electric-pair-mode \
    -batch \
    --eval '(progn
              (switch-to-buffer "*.html")
              (web-mode)
              (evil-mode 1)
              (evil-insert-state)
              (execute-kbd-macro (kbd "{{"))
              (goto-char (point-max))
              (insert "\n")
              (execute-kbd-macro (kbd "{%"))
              (message "%s" (buffer-string)))'

Package cl is deprecated
{{}}
{%}

:link: GitHub - twlz0ne/emacsq-sh: Helper script to run `emacs -Q`

1 个赞

wow,这个脚本用来快速尝试elisp代码不错,不懂的地方是第一句:switch-to-buffer不会报错吗?这个buffer在哪里创建的?

switch-to-buffer 会按需自动创建 buffer。

1 个赞

我尝试把你贴出来的命令修改了一下,加了elpa dir,但是不工作,找不到 web-mode

./emacsq.sh \
    -P web-mode,evil \
    -M electric-pair-mode \
    -ed ~/.emacs.d/epla/27.2/develop \
    -batch \
    --eval '(progn
              (switch-to-buffer "*.html")
              (web-mode)
              (evil-mode 1)
              (evil-insert-state)
              (execute-kbd-macro (kbd "{{"))
              (goto-char (point-max))
              (insert "\n")
              (execute-kbd-macro (kbd "{%"))
              (message "%s" (buffer-string)))'

加一行 -ud ~/.emacs.d/epla/27.2 \ 试试,脚本可能有点 bug。

─λ ./emacsq.sh \
            -P web-mode,evil \
            -M electric-pair-mode \
            -ud ~/.emacs.d/epla/27.2 \
            -ed ~/.emacs.d/epla/27.2/develop \
            -batch \
            --eval '(progn
                  (switch-to-buffer "*.html")
                  (web-mode)
                  (evil-mode 1)
                  (evil-insert-state)
                  (execute-kbd-macro (kbd "{{"))
                  (goto-char (point-max))
                  (insert "\n")
                  (execute-kbd-macro (kbd "{%"))
                  (message "%s" (buffer-string)))'
Cannot open load file: 没有那个文件或目录, web-mode

不行

这就有点奇怪了,确定 develop 底下的目录结构对吗?

我这里目录结构是这样的,例如要测试放在备份目录下的 ivy:

⋊> ls ~/.emacs.d/27.1/
elpa    elpa.bak

⋊> ls ~/.emacs.d/27.1/elpa.bak/
archives    gnupg    ivy-20210202.1423 ...

⋊> emacsq.sh \
    -ed ~/.emacs.d/27.1/elpa.bak \
    -P ivy --batch --eval "(princ (functionp 'ivy-mode))"
t

应该是没错

╰─λ ls ~/.emacs.d/elpa/27.2/develop/ | grep web-mode
web-mode-20210131.1758

load-path 打印出来看看:

                           (package-initialize)
+                          (print load-path)
                           (unless (string-empty-p \"${opt_load_pkgs}\")

我也遇到同样的问题,用web-mode写django模板不能自动补全{%,最后直接用猫哥的awesome-pair,再另外加个%的补全

(add-to-list 'load-path "~/emacs-plugin/awesome-pair") ; add awesome-pair to your load-path
(require 'awesome-pair)
(dolist (hook (list
               'c-mode-common-hook
               'c-mode-hook
               'c++-mode-hook
               'java-mode-hook
               'haskell-mode-hook
               'emacs-lisp-mode-hook
               'lisp-interaction-mode-hook
               'lisp-mode-hook
               'maxima-mode-hook
               'ielm-mode-hook
               'sh-mode-hook
               'makefile-gmake-mode-hook
               'php-mode-hook
               'python-mode-hook
               'js-mode-hook
               'go-mode-hook
               'qml-mode-hook
               'jade-mode-hook
               'css-mode-hook
               'ruby-mode-hook
               'coffee-mode-hook
               'rust-mode-hook
               'qmake-mode-hook
               'lua-mode-hook
               'swift-mode-hook
               'minibuffer-inactive-mode-hook
	       'web-mode-hook
               ))
  (add-hook hook '(lambda () (awesome-pair-mode 1))))
(define-key awesome-pair-mode-map (kbd "(") 'awesome-pair-open-round)
(define-key awesome-pair-mode-map (kbd "[") 'awesome-pair-open-bracket)
(define-key awesome-pair-mode-map (kbd "{") 'awesome-pair-open-curly)
(define-key awesome-pair-mode-map (kbd ")") 'awesome-pair-close-round)
(define-key awesome-pair-mode-map (kbd "]") 'awesome-pair-close-bracket)
(define-key awesome-pair-mode-map (kbd "}") 'awesome-pair-close-curly)
(define-key awesome-pair-mode-map (kbd "=") 'awesome-pair-equal)

;; (define-key awesome-pair-mode-map (kbd "%") 'awesome-pair-match-paren)
(define-key awesome-pair-mode-map (kbd "\"") 'awesome-pair-double-quote)

;; (define-key awesome-pair-mode-map (kbd "SPC") 'awesome-pair-space)
;; (define-key awesome-pair-mode-map (kbd "RET") 'awesome-pair-newline)

(define-key awesome-pair-mode-map (kbd "C-S-d") 'awesome-pair-backward-delete)
(define-key awesome-pair-mode-map (kbd "C-d") 'awesome-pair-forward-delete)
(define-key awesome-pair-mode-map (kbd "C-k") 'awesome-pair-kill)

(define-key awesome-pair-mode-map (kbd "M-\"") 'awesome-pair-wrap-double-quote)
(define-key awesome-pair-mode-map (kbd "M-[") 'awesome-pair-wrap-bracket)
(define-key awesome-pair-mode-map (kbd "M-{") 'awesome-pair-wrap-curly)
(define-key awesome-pair-mode-map (kbd "M-(") 'awesome-pair-wrap-round)
(define-key awesome-pair-mode-map (kbd "M-)") 'awesome-pair-unwrap)

(define-key awesome-pair-mode-map (kbd "M-p") 'awesome-pair-jump-right)
(define-key awesome-pair-mode-map (kbd "M-n") 'awesome-pair-jump-left)
;; (define-key awesome-pair-mode-map (kbd "M-:") 'awesome-pair-jump-out-pair-and-newline)

;; custom tag
(defun awesome-pair-open-percent ()
  (interactive)
  (cond
   ((derived-mode-p 'web-mode)
    (insert "%%")
    (backward-char))
   (t
    (insert "%")
    )
   ))
(defun awesome-pair-single-quote ()
  (interactive)
  (cond
   ((derived-mode-p 'emacs-lisp-mode)
    (insert "'"))
   (t
    (insert "''")
    (backward-char)
    )
   ))

(define-key awesome-pair-mode-map (kbd "%") 'awesome-pair-open-percent)
(define-key awesome-pair-mode-map (kbd "'") 'awesome-pair-single-quote)

用fingertip吧,融合了最新的treesit技术。

上次用了下fingertip,但是启用treesit之后各种出问题就回到awesome-pair了。 具体问题忘了,不知道是不是和windows有关,想着反正awesome-pair目前也能满足需求就懒得折腾了

web-mode 使用 django 模版时要加空格, 输入 {% + 空格 才能自动补全,web-mode的主要问题是和默认的electric-pair-mode冲突,如果要补全只能修改默认的模版

(add-to-list 'web-mode-engines-auto-pairs '("django" . (("{{ " . " }")
                                                        ("{% " . " %")
                                                        ("{%-" . " | %")
                                                        ("{%=" . " | %")
                                                        ("{{-" . " | }")
                                                        ("{{{" . " | }}")
                                                        ("{# " . " #")
                                                        ("<% " . " %>"))))
1 个赞

我在写C++代码时也遇到这个问题。怎么解决呢?