使用Emacs replace regexp保留制表位到制表位止动块

使用Emacs replace regexp保留制表位到制表位止动块,emacs,Emacs,我有一个非常大的文本文件,有将近20列。不幸的是,生成该文件的程序没有正确地处理以-10开头的列(它只正确地处理总共有5个字符的数据,而不是6个字符)。基本上,我的结局是这样的: -10.072-10.179-10.2190.002 我希望它看起来像: -10.072 -10.179 -10.219 0.002 并且几乎可以通过以下方式实现: M-xreplace regexpRET-10\..RET\&TAB RET 然而,当我使用TAB时,它只替换为一个空格而不是

我有一个非常大的文本文件,有将近20列。不幸的是,生成该文件的程序没有正确地处理以-10开头的列(它只正确地处理总共有5个字符的数据,而不是6个字符)。基本上,我的结局是这样的:

-10.072-10.179-10.2190.002
我希望它看起来像:

-10.072     -10.179     -10.219     0.002
并且几乎可以通过以下方式实现:

M-x
replace regexp
RET
-10\..
RET
\&
TAB RET


然而,当我使用TAB时,它只替换为一个空格而不是TAB,理想情况下是一个TAB-to-TAB-stop。如果我在文件中手动转到其中一种情况并键入TAB,它会正确地执行一个TAB-to-TAB-stop以将数据与正确的列对齐。如何在replace regexp中保留tab to stop功能?

搜索和替换当然应该插入一个选项卡。当然,标签的外观大小可能会有所不同,这是我能想到的它看起来是一个空间的唯一原因。您可以使用
空白模式
使差异更加明显

至于
制表符到制表符的停止
,这是一个动态函数,而不是一种特殊的制表符,因此不能通过搜索和替换1来完成。我建议改为使用键盘宏,以获得与手动键入相同的动态行为

  • F3
  • M-C-s
    -10..
    RET
  • M-x
    tab-to-tab-stop
    RET
  • F4
或者可能只是:F3M-C-s
-10..
RETTABF4

然后,您可以运行宏,直到使用C-0F4失败为止

(如果您只想在缓冲区的一部分上运行它,只需先缩小到相关区域即可。)

1不完全正确,因为Emacs允许您将任意elisp作为替换模式的一部分进行评估;但这不仅仅是调用tab-to-tab-stop函数的情况,因此宏实际上要简单得多