有没有快速的方法在PyDev中添加gettext()调用字符串?

时间:2012-07-11 09:44:12

标签: eclipse pydev gettext

是否有一种快速方法可以在Eclipse下运行的PyDev编辑器中向文字字符串添加gettext()调用?即当我将光标放在Python文件中的任何文字'string'上时,我想通过一个按键将其转换为_('string')。我可以使用宏或类似的东西来添加这些功能吗?

3 个答案:

答案 0 :(得分:1)

应该可以通过PyDev中的一些简单的Python脚本来实现。

请看一下:http://pydev.org/manual_articles_scripting.html(您可以使用https://github.com/aptana/Pydev/blob/master/plugins/org.python.pydev.jython/jysrc/pyedit_import_to_string.py作为示例。)

对于文本选择,可以在以下位置找到PySelection实现:https://github.com/aptana/Pydev/blob/master/plugins/org.python.pydev.core/src/org/python/pydev/core/docutils/PySelection.java(因此,您可以看到getSelectedText如何使用您自己的版本来获取所需的文本)。

答案 1 :(得分:0)

这是一个小的PyDev脚本,我能够使用Fabio提供的提示创建。如果按Ctrl + 2,t则光标位置的文字字符串将被gettext调用包围。我不确定我是否按预期使用Java API,但它对我有用。如果您有改进的想法,请发表评论。

if cmd == 'onCreateActions':
    from org.eclipse.jface.action import Action
    from org.python.pydev.core import IPythonPartitions
    from org.python.pydev.core.docutils import ParsingUtils, PySelection

    class AddGettext(Action):
        """Add gettext call around literal string at cursor position."""

        GETTEXT = '_'

        def run(self):
            sel = PySelection(editor)
            doc = sel.getDoc()
            pos = sel.getAbsoluteCursorOffset()
            ctype = ParsingUtils.getContentType(doc, pos)
            if ctype == IPythonPartitions.PY_SINGLELINE_STRING1:
                char, multi = "'", False
            elif ctype == IPythonPartitions.PY_SINGLELINE_STRING2:
                char, multi = '"', False
            elif ctype == IPythonPartitions.PY_MULTILINE_STRING1:
                char, multi = "'", True
            elif ctype == IPythonPartitions.PY_MULTILINE_STRING2:
                char, multi = '"', True
            else:
                char = None
            if char:
                par = ParsingUtils.create(doc)
                if multi:
                    start = par.findPreviousMulti(pos, char)
                    end = par.findNextMulti(pos, char)
                else:
                    start = par.findPreviousSingle(pos, char)
                    end = par.findNextSingle(pos, char)
                doc.replace(end + 1, 0, ')')
                doc.replace(start, 0, self.GETTEXT + '(')

    ACTIVATION_STRING = 't'
    WAIT_FOR_ENTER = False

    editor.addOfflineActionListener(
        ACTIVATION_STRING, AddGettext(), 'Add gettext call', WAIT_FOR_ENTER)

答案 2 :(得分:0)

以下是使用Vrapper的另一种解决方案:

  :map gt ca'_(<esc>pa)<esc>

请注意,这仅适用于单引号字符串,当您使用双引号或多行字符串时,它无法识别。