如何在emacs中完成这项工作?

时间:2012-10-11 02:55:26

标签: emacs

原始字符串是这样的:

  # chrom,name,strand,txStart

结果应如下所示:

 # $1: chrom
 # $2: name
 # $3: strand
 # $4: txStart

有没有人想过快速的方法呢?

2 个答案:

答案 0 :(得分:6)

很多方法。

您可以使用搜索并替换在替换中使用\#计数器。这是从零开始的,因此您需要在前面添加虚拟替换以消耗零,或者使用elisp替换表达式\,(1+ \#)

您可以使用键盘宏,并插入一个计数器,其中 Cx Ck TAB < f3> 。您可以在开始录制时通过提供前缀参数来播种该计数器。

在Emacs 24上,您可以使用自定义格式字符串对标记区域的行进行编号,其中 Cu Cx r N < / kbd>,因此您的格式字符串可以是# $%1d:

答案 1 :(得分:1)

评估以下代码并在输入行上执行foo函数。

(require 'cl)

(defun foo ()
  (interactive)
  (let* ((str (buffer-substring-no-properties
               (line-beginning-position) (line-end-position)))
         (words-str (and (string-match "# \\(.+\\)$" str)
                         (match-string 1 str)))
         (buf (get-buffer-create "*tmp*")))
    (unless words-str
      (error "Line should be '# word1,word2,...'"))
    (with-current-buffer buf
      (erase-buffer)
      (loop with index = 1
            for word in (split-string words-str ",")
            do
            (progn
              (insert (format "# $%d: %s\n" index word))
              (incf index)))
      (pop-to-buffer buf))))