2

我有很多 php/html 文件,其中包含许多应该使用 gettext 国际化的字符串。因此,我必须浏览每个文件,找出“消息”字符串并将每个文件替换为

<?= _("<my string>") ?>

我使用 vim 并想设置一个快捷方式(地图)以在插入模式下轻松完成(CtrlR例如)。

你知道如何实现吗?

4

4 回答 4

3

我会使用 Tim Pope 的美妙环绕声插件来实现这一点。

将以下内容添加到您的~/.vim/after/ftplugin/php.vim文件中:

let b:surround_{char2nr('_')} = "<?= _(\"\r\") ?>"

现在您可以通过视觉模式选择一些然后环绕。例如vitS_ ,如果您处于插入模式,您可以通过包围文本<c-s>_,您的光标将插入双引号之间。

作为奖励,如果您想删除周围环境<?= _("<text here>") ?>并只离开<text here>,您也可以将以下内容添加到您~/.vim/after/ftplugin/php.vim的:

nmap <buffer> <silent> ds_ ds<dt(%df?[(xds"

Tim Pope 有很多很棒的插件,我强烈建议你看看其中的一些。

如需更多帮助,请参阅:

:h surround
:h surround-customizing
:h after-directory
:h curly-braces-names
:h b:var
于 2012-08-04T03:01:09.773 回答
1

如果您想手动包围此字符串并且如果您的消息不包含",那么您可以(在将光标放在消息内的某个位置之后)执行以下操作一次:

qaf"a)<Esc>2F"i_(<Esc>q

(按真正的转义键<Esc>)然后,将光标放在下一条消息上后,重复此操作

@a

(如果您不喜欢a,请在此处和上方之后将其替换为另一个拉丁小写字母q)。如果您仍然想要映射:

:nnoremap <C-r> f"a)<Esc>2F"i_(<Esc>

. 这一次<Esc>是字面意思,,,,,<Esc>

首先是使用宏,它们非常方便,因为定义映射更容易输入。根据 'viminfo' 选项,它们甚至可以跨 vim 会话保存,但你不应该真正依赖它,所以如果你想要持久的东西,请使用将它放在 vimrc 中的映射。

更新:如果你没有<? "message" ?>我假设的,而是得到了<tag>message</tag>,你可以执行以下操作:

:nnoremap <C-r> f<i") ?><Esc>F>a<? _("<Esc>

. 请注意,此时间消息不应包含<or >

于 2012-08-03T16:03:43.587 回答
1

我的猜测是您希望原始消息实际上是_()函数的输入,不是吗?

我能想到的最好的事情就是使用。如果我这样做,我可能会做一些事情,比如记录一个宏 @1 用于单字“消息”(需要替换),@2 用于两字消息,@3 用于 3 等等。然后我可以浏览或搜索文档并@1在任何单字消息的开头键入,例如one 将其替换为<?= _("one") ?>. 我会在消息上使用@2,比如two words将其转换为<?= _("two words") />等等。

创建/记录单字消息的宏,@1,键入这些键,最好在单字消息的开头:

q1i<?= _("<Esc>eli") ?><Esc>q

q 1 i < ? = Space _ ( " Esc e l i " ) Space ? > Esc q

可以非常相似地创建更多单词的宏,只需e为更多单词添加额外的 s。所以对于@2,输入:

q1i<?= _("<Esc>eeli") ?><Esc>q

q 1 i < ? = Space _ ( " Esc e e l i " ) Space ? > Esc q

对于非常长的消息,我可能会使用打开和关闭宏。打开的将放在<?= _("我有光标的任何地方,而关闭的将放在") ?>我有光标的任何地方。

于 2012-08-03T16:16:08.460 回答
0

正则表达式

Vim 非常有能力轻松处理此类任务。如果没有前后的例子,很难给你一个精确的解决方案,但我会做一个假设的例子来展示 vim 的一些功能。假设您想更改<span>标签内的任何文本以由 PHP 函数执行。我可能有一个像这样的跨度标签:

<span>I need this text and all other span tags run through PHP!</span>

完成工作的最简单方法可能是使用正则表达式。例如:

:%s/<span>\([^<]*\)<\/span>/<?= _("\1") ?>/g

这会找到文档中的所有 span 标签并适当地替换它们。您甚至可以在多个文件上运行它(请参阅 参考资料:help bufdo)。然而,对于一些人来说,正则表达式一开始可能很困难,而且许多人还没有花时间去学习它。另一个选项可能如下所示:

CTRL-R

/<span><cr>f>lct<<?= _("<C-r>"") ?><esc>

一步步

/<span><cr>- 搜索开放跨度标签

f>l- 将光标移动到开始跨度标记之后的字符

ct<- 更改文本直到下一个<字符

<?= _("<C-r>"") ?>- 放入我们想要的。(<C-r>"正如您所提到的)将放入我们未命名的寄存器的内容",在这种情况下是我们ct<在一分钟前执行的文本。

<esc>- 返回正常模式

宏这个

这对于用作宏可能很有用。如果是这样,只需在其周围使用宏执行完全相同的操作...

qq/<span><cr>f>lct<<?= _("<C-r>"") ?><esc>q

现在您可以对下一个标签执行@q相同的操作。<span>用过@q一次还可以用@@甚至100@q做100次。

于 2012-08-03T20:17:52.993 回答