Emacs 如何定义传递参数时重复自身的函数

Emacs 如何定义传递参数时重复自身的函数,emacs,elisp,Emacs,Elisp,有没有一种简单的方法来定义一个传递参数时会重复自身的函数 例如,我定义了以下函数 (defun swap-sign () (interactive) (search-forward-regexp "[+-]") (if (equal (match-string 0) "-") (replace-match "+") (replace-match "-")) ) 我想呼叫C-u交换号四次 我试过了 (defun swap-sign (&optional

有没有一种简单的方法来定义一个传递参数时会重复自身的函数

例如,我定义了以下函数

(defun swap-sign ()
  (interactive)
  (search-forward-regexp "[+-]")
  (if (equal (match-string 0) "-")
      (replace-match "+")
    (replace-match "-"))
  )
我想呼叫
C-u交换号
四次

我试过了

(defun swap-sign (&optional num)
  (interactive)
  (let ((counter 0)
 (num (if num (string-to-number num) 0)))
    (while (<= counter num)
      (search-forward-regexp "[+-]")
      (if (equal (match-string 0) "-")
   (replace-match "+")
 (replace-match "-"))           
      (setq counter (1+ counter)))))
(取消交换符号(&可选num)
(互动)
(让((计数器0)
(num(如果num(字符串到num)0)))
(而(
有关更多详细信息,请参阅交互式
特殊表单的文档: C-h f
interactive
RET

有关更多详细信息,请参阅交互式特殊表单的文档:
C-h f
interactive
RET.

您需要告诉emacs期望并传入参数,方法是添加一个“p”作为interactive的参数规范(
M-x apropos interactive
以获取文档)在这里,我对您的代码进行了最小的更改以使其正常工作-但是,请注意,您不需要let/while来执行迭代,并且arg也不需要是可选的

(defun swap-sign (&optional num)
  (interactive "p")
  (let ((counter 1))
    (while (<= counter num)
      (search-forward-regexp "[+-]")
      (if (equal (match-string 0) "-")
      (replace-match "+")
    (replace-match "-"))           
      (setq counter (1+ counter)))))
(取消交换符号(&可选num)
(交互式“p”)
(让((柜台1))

(while(您需要通过添加一个“p”作为交互式(
M-x apropos interactive
获取文档)的参数规范,告诉emacs期望并传入参数)在这里,我对您的代码进行了最小的更改以使其正常工作-但是,请注意,您不需要let/while来执行迭代,并且arg也不需要是可选的

(defun swap-sign (&optional num)
  (interactive "p")
  (let ((counter 1))
    (while (<= counter num)
      (search-forward-regexp "[+-]")
      (if (equal (match-string 0) "-")
      (replace-match "+")
    (replace-match "-"))           
      (setq counter (1+ counter)))))
(取消交换符号(&可选num)
(交互式“p”)
(让((柜台1))

(而(这仅仅是为了更改符号。您是否可以确定num是否为奇数并更改一次?每次调用
交换符号
都会将光标指向匹配后的第一个字符。因此调用它四次应该交换四个符号。我是在
1231.196+760.489+213.553+122.165-24.633
这样的字符串上调用它的,是不是o更改符号。您是否可以确定num是否为奇数并更改一次?每次调用
swap sign
都会将光标指向匹配后的第一个字符。因此,调用四次应该交换四个符号。我在字符串上调用它,如
1231.196+760.489+213.553+122.165-24.633
非常漂亮。非常感谢。很好。非常感谢。感谢您向我展示了如何用最小的更改修复代码。感谢您向我展示了如何用最小的更改修复代码。