2011-09-08 64 views
6

1)在从我的GUI编辑器调整到EMACS的过程中,我似乎无法找到一种明确的方式为大多数编辑者执行相对简单的任务:Find and替换文本中的整个单词(非子字符串)并查找完全匹配。 M-x replace-string查找子字符串以及整个单词。有没有这样的正则表达式?在Emacs中查找并替换整个单词(不是子串)

2)另外,有没有一种方法来匹配确切的字符串?例如,如果我想用每个字母的确切大小写替换myClaSs,我需要做什么?现在,replace-string匹配myclass和myCLasS。正如我udnerstand只有案件中的第一个字母匹配。我假设一些正则表达式也照顾这一点。

3)是否有选项可以进行环绕搜索?或者我将不得不决定是否执行C-s(向前)或C-r(向后)

回答

7

使用字边界锚:\bfoo\b只匹配foo而不是foobar

然后,正则表达式通常区分大小写。在大多数口味中,您可以通过将(?I)(?-i)添加到您的正则表达式中明确地区分大小写。但我不确定Emacs正则表达式是否可以做到这一点。

我不知道你的第三个问题。抱歉。

+0

'M- <''执行开始-的-buffer' – ceving

+1

此外,'开始-的-buffer'推指向本地标记环,等做搜索/替换命令。因此,在完成替换之后,可以使用“C-u SPC”(将弹出本地标记环)两次返回到您开始的位置。 – phils

1

首先,你能不能请把多个问题在将来独立的问题?这使得其他人更容易帮助您,并为将来有相同问题的其他用户从过去的答案中获得帮助。

  1. 请参阅@添的回答

  2. 请参见C-h k M-%和了解情况匹配

  3. 最后一场比赛会提示你,你在结束后做C-s的部分,击中C-s再次将从头开始包装。通过点击C-h i然后点击* Emacs阅读文档然后打g Repeat Isearch RET,第二到最后一段。

+0

M-%与“!”一起工作良好修改器不会停止在每场比赛。我仍然在学习emacs语法,并希望知道如何为命令请求前缀/可选参数。在这种情况下,M-%的DELIMITED参数。 (第三个参数DELIMITED(如果为交互式,则为前缀arg),如果非零,表示仅替换 包围字边界的匹配。) – octi

+0

这听起来像是另一个问题。 :-)我不清楚你在这里问什么。打开另一个问题并在那里阐述。 –

+0

那么问题是如何在调用M-%时将DELIMITED设置为非零。但我确实打开了另一个问题。谢谢您的帮助! – octi

1

对于问题2,如果搜索字符串全部小写,那么默认情况下,emacs会执行不区分大小写的搜索。您可以强制它通过将case-fold-search设置为零来执行区分大小写的搜索。你可以把它放在你的.emacs文件中:(setq case-fold-search nil)

6

所有其他答案提供的信息可以用来让Emacs做你想做的事。但你也可以推出自己的查找/替换功能,做你想做的,像这样:

(defun search-replace-ala-octi (tosearch toreplace) 
    (interactive "sSearch for word: \nsReplace with: ") 
    (save-excursion 
    (goto-char (point-min)) 
    (let ((case-fold-search nil) 
      (count 0)) 
     (while (re-search-forward (concat "\\b" tosearch "\\b") nil t) 
     (setq count (1+ count)) 
     (replace-match toreplace 'fixedcase 'literal)) 
     (message "Replaced %s match(es)" count)))) 

并将其绑定到任何你想要的关键...

+2

我越想学习EMACS,就越意识到我必须学习LISP。 – octi

+0

@octi大部分获得Emacs做你想做的只是学习Emacs - 这恰好是lisp。人们想要的95%只是定制已经存在的钩子/变量。其他5%可以在这里询问。 –

1

关于问题1(全词搜索) 在遇到字符_时,@Tim的回答中的\b无法正常工作。看来foo\b可以在Emacs中匹配foo_bar(当然它不能在Perl中匹配)。

+1

这一切都取决于缓冲区的语法表(在大多数情况下由主模式设置)。如果'_'不是语法表中的单词组成字符,那么'\ b'可能匹配它的任何一侧,就像你的例子。请注意,在Emacs正则表达式中,您可以分别将*符号*的开头或结尾与'\ _ <' and '\_>'匹配('_'几乎肯定是perl模式中的符号组成部分)。 – phils

相关问题