3

gettext()Eclipseで実行されているPyDevエディターでリテラル文字列への呼び出しを追加する簡単な方法はありますか?つまり、Pythonファイル内の任意のリテラルにカーソルを置くと、キーを1回押すだけで'string'これを変換したいと思います。_('string')マクロなどを使ってそのような関数を追加できますか?

4

3 に答える 3

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を確認し、独自のバージョンを使用して必要なテキストを取得する方法を確認できます)。

于 2012-07-16T15:26:55.203 に答える
0

これは、Fabioからのヒントを使用して作成できた小さなPyDevスクリプトです。Ctrl + 2、tを押すと、カーソル位置のリテラル文字列がgettext呼び出しで囲まれます。期待どおりにJavaAPIを使用しているかどうかはわかりませんが、機能します。改善のアイデアがあればコメントしてください。

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)
于 2012-07-18T15:21:01.780 に答える
0

Vrapperを使用した別のソリューションは次のとおりです。

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

これは一重引用符で囲まれた文字列でのみ機能し、二重引用符または複数行の文字列を使用する場合は認識されないことに注意してください。

于 2012-07-18T17:12:30.287 に答える