Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add doom-snippets for python-base-mode #49

Merged
merged 1 commit into from
Feb 16, 2024
Merged

Conversation

MArpogaus
Copy link
Contributor

I have asked GPT-4 to convert the doom-snippets for python-mode to tempo.
This is the result.

These snippets have been converted semi-automatically with the help of GPT-4 using gptel with the following prompt:

:PROPERTIES:
:GPTEL_MODEL: gpt-4
:GPTEL_BACKEND: ChatGPT
:GPTEL_SYSTEM: You are a large language model and a careful programmer. Provide code and only code as output without any additional text, prompt or note. :GPTEL_BOUNDS: ((11612 . 15019))
:END:

* I want to convert emacs yasnipptes to tempo template format.

The templates are defined in a Lisp data file configured by ~tempel-path~. Lisp data files are files containing Lisp s-expressions (see ~lisp-data-mode~). By default the file =~/.config/emacs/templates= is used. The templates are grouped by major mode with an optional ~:when~ condition. Each template is a list in the concise form of the Emacs Tempo syntax. The first element of each list is the name of the template. Behind the name, the Tempo syntax elements follow.

In addition, each template may specify a =:pre= and/or =:post= key with a FORM that is evaluated before the template is expanded or after it is finalized, respectively. The =:post= form is evaluated in the lexical scope of the template, which means that it can access the template's named fields.

* Template syntax

All the Tempo syntax elements are fully supported. The syntax elements are described in detail in the docstring of ~tempo-define-template~ in tempo.el:

Signature
(tempo-define-template NAME ELEMENTS &optional TAG DOCUMENTATION TAGLIST)

Documentation
Define a template.

This function creates a template variable tempo-template-NAME and an interactive function tempo-template-NAME that inserts the template at the point.  The created function is returned.

NAME is a string that contains the name of the template, ELEMENTS is a list of elements in the template, TAG is the tag used for completion, DOCUMENTATION is the documentation string for the insertion command created, and TAGLIST (a symbol) is the tag list that TAG (if provided) should be added to.  If TAGLIST is nil and TAG is non-nil, TAG is added to tempo-tags.  If TAG already corresponds to a template in the tag list, modify the list so that TAG now corresponds to the newly defined template.

The elements in ELEMENTS can be of several types:

 - A string: It is sent to the hooks in tempo-insert-string-functions, and the result is inserted.
 - The symbol p: This position is saved in tempo-marks.
 - The symbol r: If tempo-insert is called with ON-REGION non-nil the current region is placed here.  Otherwise it works like p.
 - (p PROMPT <NAME> <NOINSERT>): If tempo-interactive is non-nil, the user is prompted in the minibuffer with PROMPT for a string to be inserted.  If the optional parameter NAME is non-nil, the text is saved for later insertion with the s tag.  If there already is something saved under NAME that value is used instead and no prompting is made.  If NOINSERT is provided and non-nil, nothing is inserted, but text is still saved when a NAME is provided.  For clarity, the symbol noinsert should be used as argument.
 - (P PROMPT <NAME> <NOINSERT>): Works just like the previous tag, but forces tempo-interactive to be true.
 - (r PROMPT <NAME> <NOINSERT>): Like the previous tag, but if tempo-interactive is nil and tempo-insert is called with ON-REGION non-nil, the current region is placed here.  This usually happens when you call the template function with a prefix argument.
 - (s NAME): Inserts text previously read with the (p ..) construct. Finds the insertion saved under NAME and inserts it.  Acts like p if tempo-interactive is nil.
 - &: If there is only whitespace between the line start and point, nothing happens.  Otherwise a newline is inserted.
 - %: If there is only whitespace between point and end of line, nothing happens.  Otherwise a newline is inserted.
 - n: Inserts a newline.
 - >: The line is indented using indent-according-to-mode.  Note that you often should place this item after the text you want on the line.
 - r>: Like r, but it also indents the region.
 - (r> PROMPT <NAME> <NOINSERT>): Like (r ...), but is also indents the region.
 - n>: Inserts a newline and indents line.
 - o: Like % but leaves the point before the newline.
 - nil: It is ignored.
 - Anything else: Each function in tempo-user-elements is called with it as argument until one of them returns non-nil, and the result is inserted.  If all of them return nil, it is evaluated and the result is treated as an element to be inserted.  One additional tag is useful for these cases.  If an expression returns a list (l foo bar), the elements after l will be inserted according to the usual rules.  This makes it possible to return several elements from one expression.

* Summary of Template Syntax

- "string" Inserts a string literal.
- ~p~ Inserts an unnamed placeholder field.
- ~n~ Inserts a newline.
- ~>~ Indents with ~indent-according-to-mode~.
- ~r~ Inserts the current region. If no region is active, quits the containing template when jumped to.
- ~r>~ Acts like ~r~, but indent region.
- ~n>~ Inserts a newline and indents.
- ~&~ Insert newline unless there is only whitespace between line start and point.
- ~%~ Insert newline unless there is only whitespace between point and line end.
- ~o~ Like ~%~ but leaves the point before newline.
- ~(s NAME)~ Inserts a named field.
- ~(p PROMPT <NAME> <NOINSERT>)~ Insert an optionally named field with a prompt. The ~PROMPT~ is displayed directly in the buffer as default value. If ~NOINSERT~ is non-nil, no field is inserted. Then the minibuffer is used for prompting and the value is bound to ~NAME~.
- ~(r PROMPT <NAME> <NOINSERT>)~ Insert region or act like ~(p ...)~.
- ~(r> PROMPT <NAME> <NOINSERT>)~ Act like ~(r ...)~, but indent region.

Furthermore Tempel supports syntax extensions:

- ~(p FORM <NAME> <NOINSERT>)~ Like ~p~ described above, but ~FORM~ is evaluated.
- ~(FORM ...)~ Other Lisp forms are evaluated. Named fields are lexically bound.
- ~q~ Quits the containing template when jumped to.

Use caution with templates which execute arbitrary code!

* Tempel Template examples

  ;; ~/.config/emacs/templates

  fundamental-mode ;; Available everywhere

  (today (format-time-string "%Y-%m-%d"))

  prog-mode

  (fixme (if (derived-mode-p 'emacs-lisp-mode) ";; " comment-start) "FIXME ") (todo (if (derived-mode-p 'emacs-lisp-mode) ";; " comment-start) "TODO ") (bug (if (derived-mode-p 'emacs-lisp-mode) ";; " comment-start) "BUG ") (hack (if (derived-mode-p 'emacs-lisp-mode) ";; " comment-start) "HACK ")

  latex-mode

  (abstract "\\begin{abstract}\n" r> n> "\\end{abstract}") (align "\\begin{align}\n" r> n> "\\end{align}") (alignn "\\begin{align*}\n" r> n> "\\end{align*}") (gather "\\begin{gather}\n" r> n> "\\end{gather}") (gatherr "\\begin{gather*}\n" r> n> "\\end{gather*}") (appendix "\\begin{appendix}\n" r> n> "\\end{appendix}") (begin "\\begin{" (s env) "}" r> n> "\\end{" (s env) "}") (center "\\begin{center}\n" r> n> "\\end{center}") (displaymath "\\begin{displaymath}\n" r> n> "\\end{displaymath}") (document "\\begin{document}\n" r> n> "\\end{document}") (enumerate "\\begin{enumerate}\n\\item " r> n> "\\end{enumerate}") (equation "\\begin{equation}" r> n> "\\end{equation}") (flushleft "\\begin{flushleft}" r> n> "\\end{flushleft}") (flushright "\\begin{flushright}" r> n> "\\end{flushright}") (frac "\\frac{" p "}{" q "}") (fussypar "\\begin{fussypar}" r> n> "\\end{fussypar}") (itemize "\\begin{itemize}\n\\item " r> n> "\\end{itemize}") (letter "\\begin{letter}\n" r> n> "\\end{letter}") (math "\\begin{math}\n" r> n> "\\end{math}") (minipage "\\begin{minipage}[t]{0.5\linewidth}\n" r> n> "\\end{minipage}") (quotation "\\begin{quotation}\n" r> n> "\\end{quotation}") (quote "\\begin{quote}\n" r> n> "\\end{quote}") (sloppypar "\\begin{sloppypar}\n" r> n> "\\end{sloppypar}") (theindex "\\begin{theindex}\n" r> n> "\\end{theindex}") (trivlist "\\begin{trivlist}\n" r> n> "\\end{trivlist}") (verbatim "\\begin{verbatim}\n" r> n> "\\end{verbatim}") (verbatimm "\\begin{verbatim*}\n" r> n> "\\end{verbatim*}")

* These are the current doom snipptes for python-mode in the yasippet format.

def __contains__(self, el):
    $0# -*- mode: snippet -*-
def __enter__(self):
    $0

    return self# -*- mode: snippet -*-
def __exit__(self, type, value, traceback):
    $0# -*- mode: snippet -*-
def __len__(self):
    $0# -*- mode: snippet -*-
def __new__(mcs, name, bases, dict):
    $0
    return type.__new__(mcs, name, bases, dict)
__all__ = [
        $0
]# -*- mode: snippet -*-
parser.add_argument('-$1', '--$2',
                    $0)
parser.add_argument('${1:varname}', $0)# -*- mode: snippet -*- assert $0# -*- mode: snippet -*-
self.assertEqual($1, $2)# -*- mode: snippet -*-
self.assertFalse($0)# -*- mode: snippet -*-
self.assertIn(${1:member}, ${2:container})# -*- mode: snippet -*- self.assertNotEqual($1, $2)# -*- mode: snippet -*- assertRaises(${1:Exception}, ${2:fun})# -*- mode: snippet -*- with self.assertRaises(${1:Exception}):
     $0
self.assertTrue($0)# -*- mode: snippet -*-
from celery.contrib import rdb; rdb.set_trace()# -*- mode: snippet -*- class ${1:Name}($2):
    $0# -*- mode: snippet -*-
@classmethod
def ${1:method_name}(cls, $1):
    $0# -*- mode: snippet -*-
def ${1:decorator}(func):
    $2
    def _$1(*args, **kwargs):
        $3
        ret = func(*args, **kwargs)
        $4
        return ret

    return _$1# -*- mode: snippet -*-
def ${1:func_name}($2):
    ${3:`(or % "pass")`}# -*- mode: snippet -*-
def ${1:method_name}(self${2:, $3}):
    ${4:`(or % "pass")`}# -*- mode: snippet -*-
"""$0
"""# -*- mode: snippet -*-
>>> ${1:function calls}
${2:desired output}
$0# -*- mode: snippet -*-
def __eq__(self, other):
    return self.$1 == other.$1# -*- mode: snippet -*-
for ${1:var} in ${2:collection}:
    ${3:`(or % "pass")`}# -*- mode: snippet -*-
from ${1:lib} import ${2:funs}# -*- mode: snippet -*- def ${1:name}($2):
    \"\"\"$3
    ${2:$(python-args-to-docstring)}
    \"\"\"
    $0# -*- mode: snippet -*-
if ${1:cond}:
    ${2:`(or % "pass")`}# -*- mode: snippet -*-
if $1:
    ${2:`(or % "pass")`}
else:
    $0# -*- mode: snippet -*-
if __name__ == '__main__':
    ${1:`(or % "pass")`}# -*- mode: snippet -*-
import ${1:lib}${2: as ${3:alias}}
$0# -*- mode: snippet -*-
def __init__(self${1:, args}):
    $0# -*- mode: snippet -*-
def __init__(self$1):
    \"\"\"$2
    ${1:$(python-args-to-docstring)}
    \"\"\"
    $0# -*- mode: snippet -*-
import code; code.interact(local=locals())# -*- mode: snippet; require-final-newline: nil -*- import ipdb; ipdb.set_trace()# -*- mode: snippet -*- def __iter__(self):
    return ${1:iter($2)}# -*- mode: snippet -*-
lambda ${1:x}: $0# -*- mode: snippet -*-
[${1:x} for $1 in ${2:list}]# -*- mode: snippet -*- logger = logging.getLogger(__name__)# -*- mode: snippet -*- logger = logging.getLogger("${1:name}")
logger.setLevel(logging.${2:level})
def main():
    $0# -*- mode: snippet -*-
__metaclass__ = type# -*- mode: snippet -*-
def ${1:method_name}(self${2:, $3}):
    $0
def ${1:name}(self$2):
    \"\"\"$3
    ${2:$(python-args-to-docstring)}
    \"\"\"
    `%`$0# -*- mode: snippet -*-
raise NotImplementedError# -*- mode: snippet -*-
import numpy as np
$0# -*- mode: snippet -*-
def parse_arguments():
    parser = argparse.ArgumentParser(description='$1')
    $0
    return parser.parse_args()# -*- mode: snippet -*-
parser = argparse.ArgumentParser(description='$1') $0# -*- mode: snippet -*-
pass# -*- mode: snippet -*-
print($0)# -*- mode: snippet -*-
def ${1:foo}():
   doc = """${2:Doc string}"""
   def fget(self):
       return self._$1

   def fset(self, value):
       self._$1 = value

   def fdel(self):
       del self._$1
   return locals()
$1 = property(**$1())

$0
${1:regexp} = re.compile(r"${2:expr}")
$0# -*- mode: snippet -*-
def __repr__(self):
    $0# -*- mode: snippet -*-
return $0# -*- mode: snippet -*-

def main():
   pass

if __name__ == '__main__':
   main()
self.$0# -*- mode: snippet -*-
self# -*- mode: snippet -*-
self.$1 = $1# -*- mode: snippet -*-
${1:var}.setdefault(${2:key}, []).append(${3:value})# -*- mode: snippet -*- from setuptools import setup

package = '${1:name}'
version = '${2:0.1}'

setup(name=package,
      version=version,
      description="${3:description}",
      url='${4:url}'$0)
$0# -*- mode: snippet -*-
sys.getsizeof($0)# -*- mode: snippet -*-
@staticmethod
def ${1:method_name}($1):
    $0# -*- mode: snippet -*-
def __str__(self):
    $0# -*- mode: snippet -*-
super(${1:Class}, self).${2:function}(${3:args})# -*- mode: snippet -*- class Test${1:toTest}(${2:unittest.TestCase}):
      $0
import unittest
${1:from ${2:test_file} import *}

$0

if __name__ == '__main__':
    unittest.main()# -*- mode: snippet -*-
import pdb; pdb.set_trace()# -*- mode: snippet -*- try:
    ${1:`(or % "pass")`}
except ${2:Exception}:
    $0# -*- mode: snippet -*-
try:
    $1
except $2:
    $3
else:
    $0# -*- mode: snippet -*-
def __unicode__(self):
    $0# -*- mode: snippet -*-
while ${1:True}:
      $0# -*- mode: snippet -*-
with ${1:expr}${2: as ${3:alias}}:
     $0# -*- mode: snippet -*-
from __future__ import with_statement%

Please convert all the given yasnipptes to the new tempel format described above. Avoid using "\n" for new lines, just use =n= symbol as described above. Remember to use a lips symbol to define the template name, instead of a string. So (templ_name ...) instead of ("templ_name").

These snippets have been converted semi-automatically with the help of GPT-4 using the following prompt:

:PROPERTIES:
:GPTEL_MODEL: gpt-4
:GPTEL_BACKEND: ChatGPT
:GPTEL_SYSTEM: You are a large language model and a careful programmer. Provide code and only code as output without any additional text, prompt or note.
:GPTEL_BOUNDS: ((11612 . 15019))
:END:

* I want to convert emacs yasnipptes to tempo template format.

The templates are defined in a Lisp data file configured by ~tempel-path~. Lisp
data files are files containing Lisp s-expressions (see ~lisp-data-mode~). By
default the file =~/.config/emacs/templates= is used. The templates are grouped by
major mode with an optional ~:when~ condition. Each template is a list in the
concise form of the Emacs Tempo syntax. The first element of each list is the
name of the template. Behind the name, the Tempo syntax elements follow.

In addition, each template may specify a =:pre= and/or =:post= key with a FORM that is
evaluated before the template is expanded or after it is finalized, respectively. The
=:post= form is evaluated in the lexical scope of the template, which means that it can
access the template's named fields.

* Template syntax

All the Tempo syntax elements are fully supported. The syntax elements are
described in detail in the docstring of ~tempo-define-template~ in tempo.el:

Signature
(tempo-define-template NAME ELEMENTS &optional TAG DOCUMENTATION TAGLIST)

Documentation
Define a template.

This function creates a template variable tempo-template-NAME and an
interactive function tempo-template-NAME that inserts the template
at the point.  The created function is returned.

NAME is a string that contains the name of the template, ELEMENTS is a
list of elements in the template, TAG is the tag used for completion,
DOCUMENTATION is the documentation string for the insertion command
created, and TAGLIST (a symbol) is the tag list that TAG (if provided)
should be added to.  If TAGLIST is nil and TAG is non-nil, TAG is
added to tempo-tags.  If TAG already corresponds to a template in
the tag list, modify the list so that TAG now corresponds to the newly
defined template.

The elements in ELEMENTS can be of several types:

 - A string: It is sent to the hooks in tempo-insert-string-functions,
   and the result is inserted.
 - The symbol p: This position is saved in tempo-marks.
 - The symbol r: If tempo-insert is called with ON-REGION non-nil
   the current region is placed here.  Otherwise it works like p.
 - (p PROMPT <NAME> <NOINSERT>): If tempo-interactive is non-nil, the
   user is prompted in the minibuffer with PROMPT for a string to be
   inserted.  If the optional parameter NAME is non-nil, the text is
   saved for later insertion with the s tag.  If there already is
   something saved under NAME that value is used instead and no
   prompting is made.  If NOINSERT is provided and non-nil, nothing is
   inserted, but text is still saved when a NAME is provided.  For
   clarity, the symbol noinsert should be used as argument.
 - (P PROMPT <NAME> <NOINSERT>): Works just like the previous tag, but
   forces tempo-interactive to be true.
 - (r PROMPT <NAME> <NOINSERT>): Like the previous tag, but if
   tempo-interactive is nil and tempo-insert is called with
   ON-REGION non-nil, the current region is placed here.  This usually
   happens when you call the template function with a prefix argument.
 - (s NAME): Inserts text previously read with the (p ..) construct.
   Finds the insertion saved under NAME and inserts it.  Acts like p
   if tempo-interactive is nil.
 - &: If there is only whitespace between the line start and point,
   nothing happens.  Otherwise a newline is inserted.
 - %: If there is only whitespace between point and end of line,
   nothing happens.  Otherwise a newline is inserted.
 - n: Inserts a newline.
 - >: The line is indented using indent-according-to-mode.  Note
   that you often should place this item after the text you want on
   the line.
 - r>: Like r, but it also indents the region.
 - (r> PROMPT <NAME> <NOINSERT>): Like (r ...), but is also indents
   the region.
 - n>: Inserts a newline and indents line.
 - o: Like % but leaves the point before the newline.
 - nil: It is ignored.
 - Anything else: Each function in tempo-user-elements is called
   with it as argument until one of them returns non-nil, and the
   result is inserted.  If all of them return nil, it is evaluated and
   the result is treated as an element to be inserted.  One additional
   tag is useful for these cases.  If an expression returns a list (l
   foo bar), the elements after l will be inserted according to the
   usual rules.  This makes it possible to return several elements
   from one expression.

* Summary of Template Syntax

- "string" Inserts a string literal.
- ~p~ Inserts an unnamed placeholder field.
- ~n~ Inserts a newline.
- ~>~ Indents with ~indent-according-to-mode~.
- ~r~ Inserts the current region.
  If no region is active, quits the containing template when jumped to.
- ~r>~ Acts like ~r~, but indent region.
- ~n>~ Inserts a newline and indents.
- ~&~ Insert newline unless there is only whitespace between line start and point.
- ~%~ Insert newline unless there is only whitespace between point and line end.
- ~o~ Like ~%~ but leaves the point before newline.
- ~(s NAME)~ Inserts a named field.
- ~(p PROMPT <NAME> <NOINSERT>)~ Insert an optionally named field with a prompt.
  The ~PROMPT~ is displayed directly in the buffer as default value. If ~NOINSERT~
  is non-nil, no field is inserted. Then the minibuffer is used for prompting
  and the value is bound to ~NAME~.
- ~(r PROMPT <NAME> <NOINSERT>)~ Insert region or act like ~(p ...)~.
- ~(r> PROMPT <NAME> <NOINSERT>)~ Act like ~(r ...)~, but indent region.

Furthermore Tempel supports syntax extensions:

- ~(p FORM <NAME> <NOINSERT>)~ Like ~p~ described above, but ~FORM~ is evaluated.
- ~(FORM ...)~ Other Lisp forms are evaluated. Named fields are lexically bound.
- ~q~ Quits the containing template when jumped to.

Use caution with templates which execute arbitrary code!

* Tempel Template examples

  ;; ~/.config/emacs/templates

  fundamental-mode ;; Available everywhere

  (today (format-time-string "%Y-%m-%d"))

  prog-mode

  (fixme (if (derived-mode-p 'emacs-lisp-mode) ";; " comment-start) "FIXME ")
  (todo (if (derived-mode-p 'emacs-lisp-mode) ";; " comment-start) "TODO ")
  (bug (if (derived-mode-p 'emacs-lisp-mode) ";; " comment-start) "BUG ")
  (hack (if (derived-mode-p 'emacs-lisp-mode) ";; " comment-start) "HACK ")

  latex-mode

  (abstract "\\begin{abstract}\n" r> n> "\\end{abstract}")
  (align "\\begin{align}\n" r> n> "\\end{align}")
  (alignn "\\begin{align*}\n" r> n> "\\end{align*}")
  (gather "\\begin{gather}\n" r> n> "\\end{gather}")
  (gatherr "\\begin{gather*}\n" r> n> "\\end{gather*}")
  (appendix "\\begin{appendix}\n" r> n> "\\end{appendix}")
  (begin "\\begin{" (s env) "}" r> n> "\\end{" (s env) "}")
  (center "\\begin{center}\n" r> n> "\\end{center}")
  (displaymath "\\begin{displaymath}\n" r> n> "\\end{displaymath}")
  (document "\\begin{document}\n" r> n> "\\end{document}")
  (enumerate "\\begin{enumerate}\n\\item " r> n> "\\end{enumerate}")
  (equation "\\begin{equation}" r> n> "\\end{equation}")
  (flushleft "\\begin{flushleft}" r> n> "\\end{flushleft}")
  (flushright "\\begin{flushright}" r> n> "\\end{flushright}")
  (frac "\\frac{" p "}{" q "}")
  (fussypar "\\begin{fussypar}" r> n> "\\end{fussypar}")
  (itemize "\\begin{itemize}\n\\item " r> n> "\\end{itemize}")
  (letter "\\begin{letter}\n" r> n> "\\end{letter}")
  (math "\\begin{math}\n" r> n> "\\end{math}")
  (minipage "\\begin{minipage}[t]{0.5\linewidth}\n" r> n> "\\end{minipage}")
  (quotation "\\begin{quotation}\n" r> n> "\\end{quotation}")
  (quote "\\begin{quote}\n" r> n> "\\end{quote}")
  (sloppypar "\\begin{sloppypar}\n" r> n> "\\end{sloppypar}")
  (theindex "\\begin{theindex}\n" r> n> "\\end{theindex}")
  (trivlist "\\begin{trivlist}\n" r> n> "\\end{trivlist}")
  (verbatim "\\begin{verbatim}\n" r> n> "\\end{verbatim}")
  (verbatimm "\\begin{verbatim*}\n" r> n> "\\end{verbatim*}")

* These are the current doom snipptes for python-mode in the yasippet format.

def __contains__(self, el):
    $0# -*- mode: snippet -*-
def __enter__(self):
    $0

    return self# -*- mode: snippet -*-
def __exit__(self, type, value, traceback):
    $0# -*- mode: snippet -*-
def __len__(self):
    $0# -*- mode: snippet -*-
def __new__(mcs, name, bases, dict):
    $0
    return type.__new__(mcs, name, bases, dict)
__all__ = [
        $0
]# -*- mode: snippet -*-
parser.add_argument('-$1', '--$2',
                    $0)
parser.add_argument('${1:varname}', $0)# -*- mode: snippet -*-
assert $0# -*- mode: snippet -*-
self.assertEqual($1, $2)# -*- mode: snippet -*-
self.assertFalse($0)# -*- mode: snippet -*-
self.assertIn(${1:member}, ${2:container})# -*- mode: snippet -*-
self.assertNotEqual($1, $2)# -*- mode: snippet -*-
assertRaises(${1:Exception}, ${2:fun})# -*- mode: snippet -*-
with self.assertRaises(${1:Exception}):
     $0
self.assertTrue($0)# -*- mode: snippet -*-
from celery.contrib import rdb; rdb.set_trace()# -*- mode: snippet -*-
class ${1:Name}($2):
    $0# -*- mode: snippet -*-
@classmethod
def ${1:method_name}(cls, $1):
    $0# -*- mode: snippet -*-
def ${1:decorator}(func):
    $2
    def _$1(*args, **kwargs):
        $3
        ret = func(*args, **kwargs)
        $4
        return ret

    return _$1# -*- mode: snippet -*-
def ${1:func_name}($2):
    ${3:`(or % "pass")`}# -*- mode: snippet -*-
def ${1:method_name}(self${2:, $3}):
    ${4:`(or % "pass")`}# -*- mode: snippet -*-
"""$0
"""# -*- mode: snippet -*-
>>> ${1:function calls}
${2:desired output}
$0# -*- mode: snippet -*-
def __eq__(self, other):
    return self.$1 == other.$1# -*- mode: snippet -*-
for ${1:var} in ${2:collection}:
    ${3:`(or % "pass")`}# -*- mode: snippet -*-
from ${1:lib} import ${2:funs}# -*- mode: snippet -*-
def ${1:name}($2):
    \"\"\"$3
    ${2:$(python-args-to-docstring)}
    \"\"\"
    $0# -*- mode: snippet -*-
if ${1:cond}:
    ${2:`(or % "pass")`}# -*- mode: snippet -*-
if $1:
    ${2:`(or % "pass")`}
else:
    $0# -*- mode: snippet -*-
if __name__ == '__main__':
    ${1:`(or % "pass")`}# -*- mode: snippet -*-
import ${1:lib}${2: as ${3:alias}}
$0# -*- mode: snippet -*-
def __init__(self${1:, args}):
    $0# -*- mode: snippet -*-
def __init__(self$1):
    \"\"\"$2
    ${1:$(python-args-to-docstring)}
    \"\"\"
    $0# -*- mode: snippet -*-
import code; code.interact(local=locals())# -*- mode: snippet; require-final-newline: nil -*-
import ipdb; ipdb.set_trace()# -*- mode: snippet -*-
def __iter__(self):
    return ${1:iter($2)}# -*- mode: snippet -*-
lambda ${1:x}: $0# -*- mode: snippet -*-
[${1:x} for $1 in ${2:list}]# -*- mode: snippet -*-
logger = logging.getLogger(__name__)# -*- mode: snippet -*-
logger = logging.getLogger("${1:name}")
logger.setLevel(logging.${2:level})
def main():
    $0# -*- mode: snippet -*-
__metaclass__ = type# -*- mode: snippet -*-
def ${1:method_name}(self${2:, $3}):
    $0
def ${1:name}(self$2):
    \"\"\"$3
    ${2:$(python-args-to-docstring)}
    \"\"\"
    `%`$0# -*- mode: snippet -*-
raise NotImplementedError# -*- mode: snippet -*-
import numpy as np
$0# -*- mode: snippet -*-
def parse_arguments():
    parser = argparse.ArgumentParser(description='$1')
    $0
    return parser.parse_args()# -*- mode: snippet -*-
parser = argparse.ArgumentParser(description='$1')
$0# -*- mode: snippet -*-
pass# -*- mode: snippet -*-
print($0)# -*- mode: snippet -*-
def ${1:foo}():
   doc = """${2:Doc string}"""
   def fget(self):
       return self._$1

   def fset(self, value):
       self._$1 = value

   def fdel(self):
       del self._$1
   return locals()
$1 = property(**$1())

$0
${1:regexp} = re.compile(r"${2:expr}")
$0# -*- mode: snippet -*-
def __repr__(self):
    $0# -*- mode: snippet -*-
return $0# -*- mode: snippet -*-

def main():
   pass

if __name__ == '__main__':
   main()
self.$0# -*- mode: snippet -*-
self# -*- mode: snippet -*-
self.$1 = $1# -*- mode: snippet -*-
${1:var}.setdefault(${2:key}, []).append(${3:value})# -*- mode: snippet -*-
from setuptools import setup

package = '${1:name}'
version = '${2:0.1}'

setup(name=package,
      version=version,
      description="${3:description}",
      url='${4:url}'$0)
$0# -*- mode: snippet -*-
sys.getsizeof($0)# -*- mode: snippet -*-
@staticmethod
def ${1:method_name}($1):
    $0# -*- mode: snippet -*-
def __str__(self):
    $0# -*- mode: snippet -*-
super(${1:Class}, self).${2:function}(${3:args})# -*- mode: snippet -*-
class Test${1:toTest}(${2:unittest.TestCase}):
      $0
import unittest
${1:from ${2:test_file} import *}

$0

if __name__ == '__main__':
    unittest.main()# -*- mode: snippet -*-
import pdb; pdb.set_trace()# -*- mode: snippet -*-
try:
    ${1:`(or % "pass")`}
except ${2:Exception}:
    $0# -*- mode: snippet -*-
try:
    $1
except $2:
    $3
else:
    $0# -*- mode: snippet -*-
def __unicode__(self):
    $0# -*- mode: snippet -*-
while ${1:True}:
      $0# -*- mode: snippet -*-
with ${1:expr}${2: as ${3:alias}}:
     $0# -*- mode: snippet -*-
from __future__ import with_statement%

Please convert all the given yasnipptes to the new tempel format described above.
Avoid using "\n" for new lines, just use =n= symbol as described above.
Remember to use a lips symbol to define the template name, instead of a string.
So (templ_name ...) instead of ("templ_name").
@Crandel Crandel merged commit 6248e22 into Crandel:main Feb 16, 2024
3 checks passed
alexforsale pushed a commit to alexforsale/tempel-collection that referenced this pull request Aug 6, 2024
These snippets have been converted semi-automatically with the help of GPT-4 using the following prompt:

:PROPERTIES:
:GPTEL_MODEL: gpt-4
:GPTEL_BACKEND: ChatGPT
:GPTEL_SYSTEM: You are a large language model and a careful programmer. Provide code and only code as output without any additional text, prompt or note.
:GPTEL_BOUNDS: ((11612 . 15019))
:END:

* I want to convert emacs yasnipptes to tempo template format.

The templates are defined in a Lisp data file configured by ~tempel-path~. Lisp
data files are files containing Lisp s-expressions (see ~lisp-data-mode~). By
default the file =~/.config/emacs/templates= is used. The templates are grouped by
major mode with an optional ~:when~ condition. Each template is a list in the
concise form of the Emacs Tempo syntax. The first element of each list is the
name of the template. Behind the name, the Tempo syntax elements follow.

In addition, each template may specify a =:pre= and/or =:post= key with a FORM that is
evaluated before the template is expanded or after it is finalized, respectively. The
=:post= form is evaluated in the lexical scope of the template, which means that it can
access the template's named fields.

* Template syntax

All the Tempo syntax elements are fully supported. The syntax elements are
described in detail in the docstring of ~tempo-define-template~ in tempo.el:

Signature
(tempo-define-template NAME ELEMENTS &optional TAG DOCUMENTATION TAGLIST)

Documentation
Define a template.

This function creates a template variable tempo-template-NAME and an
interactive function tempo-template-NAME that inserts the template
at the point.  The created function is returned.

NAME is a string that contains the name of the template, ELEMENTS is a
list of elements in the template, TAG is the tag used for completion,
DOCUMENTATION is the documentation string for the insertion command
created, and TAGLIST (a symbol) is the tag list that TAG (if provided)
should be added to.  If TAGLIST is nil and TAG is non-nil, TAG is
added to tempo-tags.  If TAG already corresponds to a template in
the tag list, modify the list so that TAG now corresponds to the newly
defined template.

The elements in ELEMENTS can be of several types:

 - A string: It is sent to the hooks in tempo-insert-string-functions,
   and the result is inserted.
 - The symbol p: This position is saved in tempo-marks.
 - The symbol r: If tempo-insert is called with ON-REGION non-nil
   the current region is placed here.  Otherwise it works like p.
 - (p PROMPT <NAME> <NOINSERT>): If tempo-interactive is non-nil, the
   user is prompted in the minibuffer with PROMPT for a string to be
   inserted.  If the optional parameter NAME is non-nil, the text is
   saved for later insertion with the s tag.  If there already is
   something saved under NAME that value is used instead and no
   prompting is made.  If NOINSERT is provided and non-nil, nothing is
   inserted, but text is still saved when a NAME is provided.  For
   clarity, the symbol noinsert should be used as argument.
 - (P PROMPT <NAME> <NOINSERT>): Works just like the previous tag, but
   forces tempo-interactive to be true.
 - (r PROMPT <NAME> <NOINSERT>): Like the previous tag, but if
   tempo-interactive is nil and tempo-insert is called with
   ON-REGION non-nil, the current region is placed here.  This usually
   happens when you call the template function with a prefix argument.
 - (s NAME): Inserts text previously read with the (p ..) construct.
   Finds the insertion saved under NAME and inserts it.  Acts like p
   if tempo-interactive is nil.
 - &: If there is only whitespace between the line start and point,
   nothing happens.  Otherwise a newline is inserted.
 - %: If there is only whitespace between point and end of line,
   nothing happens.  Otherwise a newline is inserted.
 - n: Inserts a newline.
 - >: The line is indented using indent-according-to-mode.  Note
   that you often should place this item after the text you want on
   the line.
 - r>: Like r, but it also indents the region.
 - (r> PROMPT <NAME> <NOINSERT>): Like (r ...), but is also indents
   the region.
 - n>: Inserts a newline and indents line.
 - o: Like % but leaves the point before the newline.
 - nil: It is ignored.
 - Anything else: Each function in tempo-user-elements is called
   with it as argument until one of them returns non-nil, and the
   result is inserted.  If all of them return nil, it is evaluated and
   the result is treated as an element to be inserted.  One additional
   tag is useful for these cases.  If an expression returns a list (l
   foo bar), the elements after l will be inserted according to the
   usual rules.  This makes it possible to return several elements
   from one expression.

* Summary of Template Syntax

- "string" Inserts a string literal.
- ~p~ Inserts an unnamed placeholder field.
- ~n~ Inserts a newline.
- ~>~ Indents with ~indent-according-to-mode~.
- ~r~ Inserts the current region.
  If no region is active, quits the containing template when jumped to.
- ~r>~ Acts like ~r~, but indent region.
- ~n>~ Inserts a newline and indents.
- ~&~ Insert newline unless there is only whitespace between line start and point.
- ~%~ Insert newline unless there is only whitespace between point and line end.
- ~o~ Like ~%~ but leaves the point before newline.
- ~(s NAME)~ Inserts a named field.
- ~(p PROMPT <NAME> <NOINSERT>)~ Insert an optionally named field with a prompt.
  The ~PROMPT~ is displayed directly in the buffer as default value. If ~NOINSERT~
  is non-nil, no field is inserted. Then the minibuffer is used for prompting
  and the value is bound to ~NAME~.
- ~(r PROMPT <NAME> <NOINSERT>)~ Insert region or act like ~(p ...)~.
- ~(r> PROMPT <NAME> <NOINSERT>)~ Act like ~(r ...)~, but indent region.

Furthermore Tempel supports syntax extensions:

- ~(p FORM <NAME> <NOINSERT>)~ Like ~p~ described above, but ~FORM~ is evaluated.
- ~(FORM ...)~ Other Lisp forms are evaluated. Named fields are lexically bound.
- ~q~ Quits the containing template when jumped to.

Use caution with templates which execute arbitrary code!

* Tempel Template examples

  ;; ~/.config/emacs/templates

  fundamental-mode ;; Available everywhere

  (today (format-time-string "%Y-%m-%d"))

  prog-mode

  (fixme (if (derived-mode-p 'emacs-lisp-mode) ";; " comment-start) "FIXME ")
  (todo (if (derived-mode-p 'emacs-lisp-mode) ";; " comment-start) "TODO ")
  (bug (if (derived-mode-p 'emacs-lisp-mode) ";; " comment-start) "BUG ")
  (hack (if (derived-mode-p 'emacs-lisp-mode) ";; " comment-start) "HACK ")

  latex-mode

  (abstract "\\begin{abstract}\n" r> n> "\\end{abstract}")
  (align "\\begin{align}\n" r> n> "\\end{align}")
  (alignn "\\begin{align*}\n" r> n> "\\end{align*}")
  (gather "\\begin{gather}\n" r> n> "\\end{gather}")
  (gatherr "\\begin{gather*}\n" r> n> "\\end{gather*}")
  (appendix "\\begin{appendix}\n" r> n> "\\end{appendix}")
  (begin "\\begin{" (s env) "}" r> n> "\\end{" (s env) "}")
  (center "\\begin{center}\n" r> n> "\\end{center}")
  (displaymath "\\begin{displaymath}\n" r> n> "\\end{displaymath}")
  (document "\\begin{document}\n" r> n> "\\end{document}")
  (enumerate "\\begin{enumerate}\n\\item " r> n> "\\end{enumerate}")
  (equation "\\begin{equation}" r> n> "\\end{equation}")
  (flushleft "\\begin{flushleft}" r> n> "\\end{flushleft}")
  (flushright "\\begin{flushright}" r> n> "\\end{flushright}")
  (frac "\\frac{" p "}{" q "}")
  (fussypar "\\begin{fussypar}" r> n> "\\end{fussypar}")
  (itemize "\\begin{itemize}\n\\item " r> n> "\\end{itemize}")
  (letter "\\begin{letter}\n" r> n> "\\end{letter}")
  (math "\\begin{math}\n" r> n> "\\end{math}")
  (minipage "\\begin{minipage}[t]{0.5\linewidth}\n" r> n> "\\end{minipage}")
  (quotation "\\begin{quotation}\n" r> n> "\\end{quotation}")
  (quote "\\begin{quote}\n" r> n> "\\end{quote}")
  (sloppypar "\\begin{sloppypar}\n" r> n> "\\end{sloppypar}")
  (theindex "\\begin{theindex}\n" r> n> "\\end{theindex}")
  (trivlist "\\begin{trivlist}\n" r> n> "\\end{trivlist}")
  (verbatim "\\begin{verbatim}\n" r> n> "\\end{verbatim}")
  (verbatimm "\\begin{verbatim*}\n" r> n> "\\end{verbatim*}")

* These are the current doom snipptes for python-mode in the yasippet format.

def __contains__(self, el):
    $0# -*- mode: snippet -*-
def __enter__(self):
    $0

    return self# -*- mode: snippet -*-
def __exit__(self, type, value, traceback):
    $0# -*- mode: snippet -*-
def __len__(self):
    $0# -*- mode: snippet -*-
def __new__(mcs, name, bases, dict):
    $0
    return type.__new__(mcs, name, bases, dict)
__all__ = [
        $0
]# -*- mode: snippet -*-
parser.add_argument('-$1', '--$2',
                    $0)
parser.add_argument('${1:varname}', $0)# -*- mode: snippet -*-
assert $0# -*- mode: snippet -*-
self.assertEqual($1, $2)# -*- mode: snippet -*-
self.assertFalse($0)# -*- mode: snippet -*-
self.assertIn(${1:member}, ${2:container})# -*- mode: snippet -*-
self.assertNotEqual($1, $2)# -*- mode: snippet -*-
assertRaises(${1:Exception}, ${2:fun})# -*- mode: snippet -*-
with self.assertRaises(${1:Exception}):
     $0
self.assertTrue($0)# -*- mode: snippet -*-
from celery.contrib import rdb; rdb.set_trace()# -*- mode: snippet -*-
class ${1:Name}($2):
    $0# -*- mode: snippet -*-
@classmethod
def ${1:method_name}(cls, $1):
    $0# -*- mode: snippet -*-
def ${1:decorator}(func):
    $2
    def _$1(*args, **kwargs):
        $3
        ret = func(*args, **kwargs)
        $4
        return ret

    return _$1# -*- mode: snippet -*-
def ${1:func_name}($2):
    ${3:`(or % "pass")`}# -*- mode: snippet -*-
def ${1:method_name}(self${2:, $3}):
    ${4:`(or % "pass")`}# -*- mode: snippet -*-
"""$0
"""# -*- mode: snippet -*-
>>> ${1:function calls}
${2:desired output}
$0# -*- mode: snippet -*-
def __eq__(self, other):
    return self.$1 == other.$1# -*- mode: snippet -*-
for ${1:var} in ${2:collection}:
    ${3:`(or % "pass")`}# -*- mode: snippet -*-
from ${1:lib} import ${2:funs}# -*- mode: snippet -*-
def ${1:name}($2):
    \"\"\"$3
    ${2:$(python-args-to-docstring)}
    \"\"\"
    $0# -*- mode: snippet -*-
if ${1:cond}:
    ${2:`(or % "pass")`}# -*- mode: snippet -*-
if $1:
    ${2:`(or % "pass")`}
else:
    $0# -*- mode: snippet -*-
if __name__ == '__main__':
    ${1:`(or % "pass")`}# -*- mode: snippet -*-
import ${1:lib}${2: as ${3:alias}}
$0# -*- mode: snippet -*-
def __init__(self${1:, args}):
    $0# -*- mode: snippet -*-
def __init__(self$1):
    \"\"\"$2
    ${1:$(python-args-to-docstring)}
    \"\"\"
    $0# -*- mode: snippet -*-
import code; code.interact(local=locals())# -*- mode: snippet; require-final-newline: nil -*-
import ipdb; ipdb.set_trace()# -*- mode: snippet -*-
def __iter__(self):
    return ${1:iter($2)}# -*- mode: snippet -*-
lambda ${1:x}: $0# -*- mode: snippet -*-
[${1:x} for $1 in ${2:list}]# -*- mode: snippet -*-
logger = logging.getLogger(__name__)# -*- mode: snippet -*-
logger = logging.getLogger("${1:name}")
logger.setLevel(logging.${2:level})
def main():
    $0# -*- mode: snippet -*-
__metaclass__ = type# -*- mode: snippet -*-
def ${1:method_name}(self${2:, $3}):
    $0
def ${1:name}(self$2):
    \"\"\"$3
    ${2:$(python-args-to-docstring)}
    \"\"\"
    `%`$0# -*- mode: snippet -*-
raise NotImplementedError# -*- mode: snippet -*-
import numpy as np
$0# -*- mode: snippet -*-
def parse_arguments():
    parser = argparse.ArgumentParser(description='$1')
    $0
    return parser.parse_args()# -*- mode: snippet -*-
parser = argparse.ArgumentParser(description='$1')
$0# -*- mode: snippet -*-
pass# -*- mode: snippet -*-
print($0)# -*- mode: snippet -*-
def ${1:foo}():
   doc = """${2:Doc string}"""
   def fget(self):
       return self._$1

   def fset(self, value):
       self._$1 = value

   def fdel(self):
       del self._$1
   return locals()
$1 = property(**$1())

$0
${1:regexp} = re.compile(r"${2:expr}")
$0# -*- mode: snippet -*-
def __repr__(self):
    $0# -*- mode: snippet -*-
return $0# -*- mode: snippet -*-

def main():
   pass

if __name__ == '__main__':
   main()
self.$0# -*- mode: snippet -*-
self# -*- mode: snippet -*-
self.$1 = $1# -*- mode: snippet -*-
${1:var}.setdefault(${2:key}, []).append(${3:value})# -*- mode: snippet -*-
from setuptools import setup

package = '${1:name}'
version = '${2:0.1}'

setup(name=package,
      version=version,
      description="${3:description}",
      url='${4:url}'$0)
$0# -*- mode: snippet -*-
sys.getsizeof($0)# -*- mode: snippet -*-
@staticmethod
def ${1:method_name}($1):
    $0# -*- mode: snippet -*-
def __str__(self):
    $0# -*- mode: snippet -*-
super(${1:Class}, self).${2:function}(${3:args})# -*- mode: snippet -*-
class Test${1:toTest}(${2:unittest.TestCase}):
      $0
import unittest
${1:from ${2:test_file} import *}

$0

if __name__ == '__main__':
    unittest.main()# -*- mode: snippet -*-
import pdb; pdb.set_trace()# -*- mode: snippet -*-
try:
    ${1:`(or % "pass")`}
except ${2:Exception}:
    $0# -*- mode: snippet -*-
try:
    $1
except $2:
    $3
else:
    $0# -*- mode: snippet -*-
def __unicode__(self):
    $0# -*- mode: snippet -*-
while ${1:True}:
      $0# -*- mode: snippet -*-
with ${1:expr}${2: as ${3:alias}}:
     $0# -*- mode: snippet -*-
from __future__ import with_statement%

Please convert all the given yasnipptes to the new tempel format described above.
Avoid using "\n" for new lines, just use =n= symbol as described above.
Remember to use a lips symbol to define the template name, instead of a string.
So (templ_name ...) instead of ("templ_name").
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants