在Emacs for Javascript中的单独行上包装链式方法调用

时间:2014-04-10 04:53:55

标签: javascript emacs

我没有成功地弄清楚如何在Emacs中包装每个方法调用。例如,如果我有这个:

someObject.a()B()C();

我真的想要这个:

someObject.a()
          .b()
          .c();

这在Emacs中可行吗?我已经看到了Eclipse所涵盖的相同主题,但我在Emacs中找不到任何内容。

2 个答案:

答案 0 :(得分:0)

我想到的第一个解决方案是搜索和替换。我提出了一个解决方案,但它现在缺少正确的缩进。

手动,拨打M-%(或M-x query-replace)并要求将).替换为)^Q^J.(诀窍在于:在提示中插入换行符,输入{ {1}}然后C-q)。

如果我们将它包装到一个可调用函数:

C-j

它适用于当前行。 但正如我所说,我正在寻找如何正确缩进的东西。

ps:elisp帮助:http://wikemacs.org/index.php/Emacs_Lisp_Cheat_Sheet#Positions& http://ergoemacs.org/emacs/elisp_basics.html& http://wikemacs.org/index.php/Emacs_Lisp_Cookbook

答案 1 :(得分:0)

您想要的缩进不是js2-mode中的默认缩进。

此函数将堆叠调用链并根据您的模式缩进:

(defun javascript-chain-stack ()
  (interactive)
  (beginning-of-line)
  (if (looking-at ".*?\\sw+\\.\\sw+(.*;$")
      (let* ((str (match-string-no-properties 0))
             (beg (match-beginning 0))
             (end (match-end 0))
             (strs (split-string str "\\." t))
             (rstr (concat (car strs)
                           (mapconcat
                            (lambda (x) (concat "." x))
                            (cdr strs) "\n"))))
        (delete-region beg end)
        (insert rstr)
        (indent-region beg (+ beg (length rstr))))
    (error "Couldn't match JavaScript chain call")))

这将是结果(在我的缩进设置中):

someObject.a()
  .b()
  .c();

可以从线上的任何地方调用该函数。

相关问题