smartparens icon indicating copy to clipboard operation
smartparens copied to clipboard

suggestion to add words of warning about cperl-mode to the wiki/documentation

Open c-alpha opened this issue 2 years ago • 4 comments

cperl-mode is quite proactive about doing things automatically for you. It thus can, and often does, conflict with smartparens. I am thus proposing to add a few words of warning to the wiki and documentation about these possible interferences.

Thus, if when typing { in a Perl file, you get {}}, it's time to "tame cpel-mode". Here is the configuration I ended up using:

(use-package cperl-mode
  :init
  ;; cperl-mode is preferred to perl-mode
  ;; "Brevity is the soul of wit" <foo at acm.org>
  (defalias 'perl-mode 'cperl-mode)
  ;; un-bind the various parentheses as balancing is ensured by
  ;; smartparens, and these bindings would interfere
  :bind (:map cperl-mode-map
              ("{" . nil)
              ("[" . nil)
              ("(" . nil)
              ("}" . nil)
              ("]" . nil)
              (")" . nil))
  :custom
  (cperl-hairy t)
  (cperl-electric-parens nil "don't interfere with smartparens")
  (cperl-highlight-variables-indiscriminately t "highlight scalar variables, too"))

When you see similar "doubling-up issues" with other characters, check cperl-mode-map whether there are any further key bindings you might want to remove. Also see #323.

Hope this helps.

c-alpha avatar Jul 15 '22 13:07 c-alpha

ping?

c-alpha avatar Jan 11 '23 16:01 c-alpha

latex-mode does the same and there are mechanisms in smartparens to deal with this so that it "just works". I'll triage it and it will be fixed at some point.

Fuco1 avatar Jan 18 '23 19:01 Fuco1

Cool, many thanks for acting on this, @Fuco1 ! ❤️ 👍

c-alpha avatar Jan 19 '23 15:01 c-alpha

If helpful, here's the entirety of what I used to get satisfactory behavior.

(with-eval-after-load 'cperl-mode
  (setq cperl-invalid-face nil
	cperl-indent-parens-as-block t
	cperl-close-paren-offset (- cperl-indent-level)
        cperl-font-lock t
        cperl-electric-lbrace-space nil
        cperl-electric-parens nil
        cperl-electric-linefeed t
        cperl-electric-keywords t
        cperl-info-on-command-no-prompt t
        cperl-clobber-lisp-bindings t
        cperl-lazy-help-time 5)

  (define-key cperl-mode-map "{" nil)

  (with-eval-after-load 'smartparens
    (defun my-sp-cperl-indent (id action context)
      (cond ((eq context 'comment)
             (cperl-indent-for-comment))
            ((eq context 'code)
             (if (eq action 'wrap)
                 (cperl-indent-region
                  (sp-get sp-last-wrapped-region :beg)
                  (sp-get sp-last-wrapped-region :end))
               (cperl-indent-line)))))

    (sp-local-pair 'cperl-mode "{" nil :post-handlers '(:add my-sp-cperl-indent))))

Of particular interest is not enabling cperl-hairy and instead enable the specific features. Still, even without cperl-electric-parens, { gets bound so it needs to be unbound.

I'm not really certain what cperl-indent-for-comment does as nothing seems to change with comment indenting, but that is my preference.

At any rate, I get the correct number of braces/parens, and everything is indented nicely as I edit.

titanofold avatar Jun 28 '23 16:06 titanofold

I added a page to the wiki with link back to this issue.

Fuco1 avatar Mar 23 '24 13:03 Fuco1