1

我有一些这样的文字:

qwerty\tberty 
merty\tserty 

我想抓住制表符和行尾之间的文本berty。然后显示它工作到缓冲区的末尾并在那里插入文本。

但是这段代码不起作用。有什么想法为什么不呢?

(defun do-test ()
  "tester"
  (interactive)
  (goto-char (point-min))
  (if (search-forward "qwerty" nil t)
     (delete-char 1) ;;delete tab
     (setq myStr (buffer-substring point end-of-line)) ;add text to variable
     ;goto end of buffer and insert text as demonstration it works
     (goto-char (point-max))
     (insert(myStr))
  )
)

编辑:

抱歉剪切和粘贴错误。本来应该:

(如果(向前搜索“qwerty”nil t)

4

2 回答 2

3

您的代码中存在许多问题:

  1. if接受第一个参数,如果测试是肯定的,则执行该参数;所有剩余的参数都以其他方式执行(就像else大多数命令式语言中的和子句一样)。您可以将所有表达式分组到一个progn表单中,也可以使用该when表单,它采用任意数量的表达式来评估条件是否为真,并且没有else子句。

  2. pointline-end-position是函数,这意味着您必须调用它们才能获取值:例如(point).

  3. 另一方面,myStr是一个变量,这意味着你可以直接插入它的值(你不能像函数一样调用它)

  4. 如果要保持原始缓冲区不变,则应将点向前移动 1 个字符,而不是删除 TAB。这可以使用forward-char命令来完成。

考虑到所有这些,这是您的函数的修改版本。另外,我将“选项名称”更改为“qwerty”以匹配您的示例。

(defun do-test ()
  "tester"
  (interactive)
  (goto-char (point-min))
  (when (search-forward "qwerty" nil t)
      (forward-char 1) ;;skip tab
      ;store text in variable `myStr'
      (setq myStr (buffer-substring (point) (line-end-position)))
      ;goto end of buffer and insert text as demonstration it works
      (goto-char (point-max))
      (insert myStr)))

请注意,使用正则表达式可能是实现目标的更好方法:

(defun do-test ()
  (interactive)
  (goto-char (point-min))
  (when (re-search-forward "qwerty\t\\(.*\\)")
    (goto-char (point-max))
    (insert (match-string 1))))
于 2013-04-12T14:43:53.433 回答
2

除了@Francesco 的回答,我认为逻辑非常脆弱,它会影响编辑器的全局状态。您可能会考虑将解析提取到纯函数中,如下所示:

(defun extract-matches (str)
  "Extract the last tab-separated value of each line in STR."
  (mapcar (lambda (s) (car (last (split-string s "\t"))))
          (remove-if-not (lambda (s) (string-match-p "\t" s))
                         (split-string str "\n"))))

(defun extract-eol-tsv ()
  "For each line in the buffer, extract the last tab-delimited
phrase and insert it at the end of the buffer."
  (interactive)
  (save-excursion
    (goto-char (point-max))
    (dolist (m (extract-matches (buffer-string))) 
      (insert (format "%s\n" m)))

使用纯函数有助于保持有趣的逻辑可测试 - 现在,您可以验证 finnicky 解析内容是否有效,而无需修改缓冲区。

于 2013-04-12T15:22:23.903 回答