我有很多 php/html 文件,其中包含许多应该使用 gettext 国际化的字符串。因此,我必须浏览每个文件,找出“消息”字符串并将每个文件替换为
<?= _("<my string>") ?>
我使用 vim 并想设置一个快捷方式(地图)以在插入模式下轻松完成(CtrlR例如)。
你知道如何实现吗?
我有很多 php/html 文件,其中包含许多应该使用 gettext 国际化的字符串。因此,我必须浏览每个文件,找出“消息”字符串并将每个文件替换为
<?= _("<my string>") ?>
我使用 vim 并想设置一个快捷方式(地图)以在插入模式下轻松完成(CtrlR例如)。
你知道如何实现吗?
我会使用 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
如果您想手动包围此字符串并且如果您的消息不包含"
,那么您可以(在将光标放在消息内的某个位置之后)执行以下操作一次:
qaf"a)<Esc>2F"i_(<Esc>q
(按真正的转义键<Esc>
)然后,将光标放在下一条消息上后,重复此操作
@a
(如果您不喜欢a
,请在此处和上方之后将其替换为另一个拉丁小写字母q
)。如果您仍然想要映射:
:nnoremap <C-r> f"a)<Esc>2F"i_(<Esc>
. 这一次<Esc>
是字面意思,,,,,<
。E
s
c
>
首先是使用宏,它们非常方便,因为定义映射更容易输入。根据 'viminfo' 选项,它们甚至可以跨 vim 会话保存,但你不应该真正依赖它,所以如果你想要持久的东西,请使用将它放在 vimrc 中的映射。
更新:如果你没有<? "message" ?>
我假设的,而是得到了<tag>message</tag>
,你可以执行以下操作:
:nnoremap <C-r> f<i") ?><Esc>F>a<? _("<Esc>
. 请注意,此时间消息不应包含<
or >
。
我的猜测是您希望原始消息实际上是_()
函数的输入,不是吗?
我能想到的最好的事情就是使用宏。如果我这样做,我可能会做一些事情,比如记录一个宏 @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
对于非常长的消息,我可能会使用打开和关闭宏。打开的将放在<?= _("
我有光标的任何地方,而关闭的将放在") ?>
我有光标的任何地方。
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
)。然而,对于一些人来说,正则表达式一开始可能很困难,而且许多人还没有花时间去学习它。另一个选项可能如下所示:
/<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次。